Adds complete rewrite of lua scripts

Lua scripts now build an in memory structure of all the rooms and their
contents before loading this data into the game. This enables better
possibilities to prevent monsters from spawning in bad places. Monsters
can now also spawn in coridoor rooms.
This commit is contained in:
Linus Probert 2018-07-31 14:25:29 +02:00
parent 18e70221fa
commit b3b8208b11
4 changed files with 314 additions and 216 deletions

View File

@ -17,7 +17,7 @@ local function matrix_coverage (matrix)
local cov = 0 local cov = 0
for i=1,10 do for i=1,10 do
for j=1,10 do for j=1,10 do
if matrix[i][j].active then cov = cov + 1 end if matrix[i][j] then cov = cov + 1 end
end end
end end
return cov return cov
@ -36,7 +36,7 @@ local function generate_path ()
for i=1,10 do for i=1,10 do
map_matrix[i] = {} map_matrix[i] = {}
for j=1,10 do for j=1,10 do
map_matrix[i][j] = room_builder.create_room() map_matrix[i][j] = nil
end end
end end
@ -47,7 +47,10 @@ local function generate_path ()
local direction = 0 local direction = 0
local lastDirection = 0 local lastDirection = 0
local coridoor_count = 0 local coridoor_count = 0
local coverage = 10 local coverage = 9 + CURRENT_LEVEL
-- Create the first room
map_matrix[cx][cy] = room_builder.create_empty_room()
while matrix_coverage(map_matrix) < coverage do while matrix_coverage(map_matrix) < coverage do
local direction = random(4) local direction = random(4)
@ -60,8 +63,6 @@ local function generate_path ()
direction = random(4) direction = random(4)
end end
map_matrix[cx][cy].active = true
if coridoor_count < coverage/3 then if coridoor_count < coverage/3 then
if random(3) == 1 and (cx > 1 or cy > 1) then if random(3) == 1 and (cx > 1 or cy > 1) then
map_matrix[cx][cy].type = "coridoor" map_matrix[cx][cy].type = "coridoor"
@ -69,49 +70,56 @@ local function generate_path ()
end end
end end
valid_direction = false
if direction == UP and cy > 1 then -- UP if direction == UP and cy > 1 then -- UP
table.insert(map_matrix[cx][cy].exits, direction) room_builder.add_exit(map_matrix[cx][cy], direction)
map_matrix[cx][cy].path_dir = direction map_matrix[cx][cy].path_dir = direction
cy = cy - 1; cy = cy - 1
table.insert(map_matrix[cx][cy].exits, reverse_direction(direction)) valid_direction = true
elseif direction == LEFT and cx > 1 then -- LEFT elseif direction == LEFT and cx > 1 then -- LEFT
table.insert(map_matrix[cx][cy].exits, direction) room_builder.add_exit(map_matrix[cx][cy], direction)
map_matrix[cx][cy].path_dir = direction map_matrix[cx][cy].path_dir = direction
cx = cx - 1; cx = cx - 1
table.insert(map_matrix[cx][cy].exits, reverse_direction(direction)) valid_direction = true
elseif direction == RIGHT and cx < 10 then -- RIGHT elseif direction == RIGHT and cx < 10 then -- RIGHT
table.insert(map_matrix[cx][cy].exits, direction) room_builder.add_exit(map_matrix[cx][cy], direction)
map_matrix[cx][cy].path_dir = direction map_matrix[cx][cy].path_dir = direction
cx = cx + 1; cx = cx + 1
table.insert(map_matrix[cx][cy].exits, reverse_direction(direction)) valid_direction = true
elseif direction == DOWN and cy < 10 then -- DOWN elseif direction == DOWN and cy < 10 then -- DOWN
table.insert(map_matrix[cx][cy].exits, direction) room_builder.add_exit(map_matrix[cx][cy], direction)
map_matrix[cx][cy].path_dir = direction map_matrix[cx][cy].path_dir = direction
cy = cy + 1; cy = cy + 1
table.insert(map_matrix[cx][cy].exits, reverse_direction(direction)) valid_direction = true
end
-- Create the next room and add the reverse exit
-- if a valid direction was found
if valid_direction then
if not map_matrix[cx][cy] then
map_matrix[cx][cy] = room_builder.create_empty_room()
end
room_builder.add_exit(map_matrix[cx][cy], reverse_direction(direction))
end end
lastDirection = direction lastDirection = direction
end end
-- Last room rules -- Last room rules
map_matrix[cx][cy].active = true
map_matrix[cx][cy].goal = true map_matrix[cx][cy].goal = true
map_matrix[cx][cy].type = "room" map_matrix[cx][cy].type = "room"
return map_matrix; -- Build all the rooms
end
local function print_matrix(matrix)
for i=1,10 do for i=1,10 do
for j=1,10 do for j=1,10 do
if not map_matrix[j][i].goal then room = map_matrix[i][j]
io.write(map_matrix[j][i].path_dir .. " ") if room then
else room_builder.build_room(room)
io.write("G ") monster_gen.add_monsters_to_room(room, i-1, j-1)
end end
end end
io.write("\n")
end end
return map_matrix;
end end
-- END FUNCTIONS -- END FUNCTIONS
@ -126,14 +134,10 @@ local map_matrix = generate_path()
for i=1,10 do for i=1,10 do
for j=1,10 do for j=1,10 do
local room = map_matrix[i][j] local room = map_matrix[i][j]
if room.active then if room then
set_current_room(map, i-1, j-1); set_current_room(map, i-1, j-1);
if room.type == "room" then room_builder.load_room(map, room)
room_builder.build_square_room(map, room) monster_gen.load_monsters(map, room.monsters)
monster_gen.add_monster_to_room(map, i-1, j-1);
elseif room.type == "coridoor" then
room_builder.build_coridoor_room(map, room)
end
end end
end end
end end

View File

@ -61,23 +61,23 @@ local function load_decor_textures()
table.insert(floorDecor, { td0, td1, 48, 13 * 16, false, false }) table.insert(floorDecor, { td0, td1, 48, 13 * 16, false, false })
-- Urns -- Urns
table.insert(floorDecor, { td0, td1, 0 * 16, 48, true, false }) --table.insert(floorDecor, { td0, td1, 0 * 16, 48, true, false })
table.insert(floorDecor, { td0, td1, 1 * 16, 48, true, false }) --table.insert(floorDecor, { td0, td1, 1 * 16, 48, true, false })
table.insert(floorDecor, { td0, td1, 2 * 16, 48, true, false }) --table.insert(floorDecor, { td0, td1, 2 * 16, 48, true, false })
table.insert(floorDecor, { td0, td1, 3 * 16, 48, true, false }) --table.insert(floorDecor, { td0, td1, 3 * 16, 48, true, false })
table.insert(floorDecor, { td0, td1, 4 * 16, 48, true, false }) --table.insert(floorDecor, { td0, td1, 4 * 16, 48, true, false })
table.insert(floorDecor, { td0, td1, 5 * 16, 48, true, false }) --table.insert(floorDecor, { td0, td1, 5 * 16, 48, true, false })
table.insert(floorDecor, { td0, td1, 6 * 16, 48, false, false }) --table.insert(floorDecor, { td0, td1, 6 * 16, 48, false, false })
table.insert(floorDecor, { td0, td1, 7 * 16, 48, false, false }) --table.insert(floorDecor, { td0, td1, 7 * 16, 48, false, false })
-- Racks -- Racks
table.insert(floorDecor, { td0, td1, 0 * 16, 11 * 16, true, false }) --table.insert(floorDecor, { td0, td1, 0 * 16, 11 * 16, true, false })
table.insert(floorDecor, { td0, td1, 1 * 16, 11 * 16, true, false }) --table.insert(floorDecor, { td0, td1, 1 * 16, 11 * 16, true, false })
table.insert(floorDecor, { td0, td1, 2 * 16, 11 * 16, true, false }) --table.insert(floorDecor, { td0, td1, 2 * 16, 11 * 16, true, false })
table.insert(floorDecor, { td0, td1, 3 * 16, 11 * 16, true, false }) --table.insert(floorDecor, { td0, td1, 3 * 16, 11 * 16, true, false })
table.insert(floorDecor, { td0, td1, 4 * 16, 11 * 16, true, false }) --table.insert(floorDecor, { td0, td1, 4 * 16, 11 * 16, true, false })
table.insert(floorDecor, { td0, td1, 5 * 16, 11 * 16, true, false }) --table.insert(floorDecor, { td0, td1, 5 * 16, 11 * 16, true, false })
table.insert(floorDecor, { td0, td1, 6 * 16, 11 * 16, true, false }) --table.insert(floorDecor, { td0, td1, 6 * 16, 11 * 16, true, false })
-- Headstones -- Headstones
table.insert(floorDecor, { td0, td1, 0 * 16, 17 * 16, true, false }) table.insert(floorDecor, { td0, td1, 0 * 16, 17 * 16, true, false })
@ -117,6 +117,20 @@ local function load_special_tiles()
special.level_exit = { tt, -1, 16, 16, false, true, true } special.level_exit = { tt, -1, 16, 16, false, true, true }
end end
local function print_room(room)
print("ROOM:")
for j=0, 11 do
for i=0, 15 do
if room.tiles[i][j] then
io.write("o ")
else
io.write(". ")
end
end
print("")
end
end
local function repack(data) local function repack(data)
return { return {
textureIndex0 = data[1], textureIndex0 = data[1],
@ -138,22 +152,31 @@ local function check_add_decoration(map, x, y, data)
return true return true
end end
local function check_add_tile(map, x, y, data) local function add_random_decor_to_room(room)
if tile_occupied(map, x, y) then
return false
end
add_tile(map, x, y, repack(data))
return true
end
local function add_random_decor_to_room(map)
local decor_count = random(4) - 1 local decor_count = random(4) - 1
for i=1,decor_count do for i=1,decor_count do
check_add_decoration(map, random(11)+1, random(8)+1, floorDecor[random(#floorDecor)]) x = random(11) + 1
y = random(8) + 1
if not room.decor[x][y] then
room.decor[x][y] = floorDecor[random(#floorDecor)]
end
end
if random(2) == 1 then
room.decor[4][3] = lightDecor.candle2
end
if random(2) == 1 then
room.decor[11][3] = lightDecor.candle2
end
if random(2) == 1 then
room.decor[4][9] = lightDecor.candle2
end
if random(2) == 1 then
room.decor[11][9] = lightDecor.candle2
end end
end end
local function add_pits_to_room(map) local function add_pits_to_room(room)
if CURRENT_LEVEL < 2 then if CURRENT_LEVEL < 2 then
return return
@ -171,7 +194,6 @@ local function add_pits_to_room(map)
end end
end end
local matrix = {} local matrix = {}
for i=0, #cleanData-1 do for i=0, #cleanData-1 do
local c = cleanData:sub(i, i) local c = cleanData:sub(i, i)
@ -191,207 +213,175 @@ local function add_pits_to_room(map)
matrix = matrix[random(#matrix)] matrix = matrix[random(#matrix)]
for i=2,13 do for i=2,13 do
for j=2,10 do for j=2,10 do
if not tile_occupied(map, (i), (j)) and matrix[i][j] then if matrix[i][j] then
room.decor[i][j] = nil
if not matrix[i-1][j-1] and not matrix[i+1][j-1] and matrix[i-1][j] and matrix[i+1][j] and matrix[i][j-1] then if not matrix[i-1][j-1] and not matrix[i+1][j-1] and matrix[i-1][j] and matrix[i+1][j] and matrix[i][j-1] then
add_tile(map, i, j, repack(pits.innermid)) room.tiles[i][j] = pits.innermid
elseif not matrix[i-1][j-1] and matrix[i-1][j] and matrix[i][j-1] then elseif not matrix[i-1][j-1] and matrix[i-1][j] and matrix[i][j-1] then
add_tile(map, i, j, repack(pits.innerleft)) room.tiles[i][j] = pits.innerleft
elseif not matrix[i+1][j-1] and matrix[i+1][j] and matrix[i][j-1] then elseif not matrix[i+1][j-1] and matrix[i+1][j] and matrix[i][j-1] then
add_tile(map, i, j, repack(pits.innerright)) room.tiles[i][j] = pits.innerright
elseif not matrix[i-1][j] and not matrix[i][j-1] and not matrix[i+1][j] then elseif not matrix[i-1][j] and not matrix[i][j-1] and not matrix[i+1][j] then
add_tile(map, i, j, repack(pits.topcrevice)) room.tiles[i][j] = pits.topcrevice
elseif not matrix[i-1][j] and not matrix[i+1][j] then elseif not matrix[i-1][j] and not matrix[i+1][j] then
add_tile(map, i, j, repack(pits.bottomcrevice)) room.tiles[i][j] = pits.bottomcrevice
elseif not matrix[i-1][j] and not matrix[i][j-1] then elseif not matrix[i-1][j] and not matrix[i][j-1] then
add_tile(map, i, j, repack(pits.topleft)) room.tiles[i][j] = pits.topleft
elseif not matrix[i+1][j] and not matrix[i][j-1] then elseif not matrix[i+1][j] and not matrix[i][j-1] then
add_tile(map, i, j, repack(pits.topright)) room.tiles[i][j] = pits.topright
elseif not matrix[i-1][j] then elseif not matrix[i-1][j] then
add_tile(map, i, j, repack(pits.left)) room.tiles[i][j] = pits.left
elseif not matrix[i+1][j] then elseif not matrix[i+1][j] then
add_tile(map, i, j, repack(pits.right)) room.tiles[i][j] = pits.right
elseif not matrix[i][j-1] then elseif not matrix[i][j-1] then
add_tile(map, i, j, repack(pits.top)) room.tiles[i][j] = pits.top
else else
add_tile(map, i, j, repack(pits.center)) room.tiles[i][j] = pits.center
end end
end end
end end
end end
end end
local function add_tiles_to_room (map) local function add_tiles_to_room (room)
for i=0,15 do for i=0,15 do
for j=0,11 do for j=0,11 do
if (i >= 1 and i <= 14 and j >= 1 and j <= 10) then if (i >= 1 and i <= 14 and j >= 1 and j <= 10) then
if (i == 1 and j == 1) then if (i == 1 and j == 1) then
add_tile(map, i, j, repack(floor.topleft)) room.tiles[i][j] = floor.topleft
elseif (i == 14 and j == 1) then elseif (i == 14 and j == 1) then
add_tile(map, i, j, repack(floor.topright)) room.tiles[i][j] = floor.topright
elseif (i == 1 and j == 10) then elseif (i == 1 and j == 10) then
add_tile(map, i, j, repack(floor.bottomleft)) room.tiles[i][j] = floor.bottomleft
elseif (i == 14 and j == 10) then elseif (i == 14 and j == 10) then
add_tile(map, i, j, repack(floor.bottomright)) room.tiles[i][j] = floor.bottomright
elseif (i == 1) then elseif (i == 1) then
add_tile(map, i, j, repack(floor.left)) room.tiles[i][j] = floor.left
elseif (i == 14) then elseif (i == 14) then
add_tile(map, i, j, repack(floor.right)) room.tiles[i][j] = floor.right
elseif (j == 1) then elseif (j == 1) then
add_tile(map, i, j, repack(floor.top)) room.tiles[i][j] = floor.top
elseif (j == 10) then elseif (j == 10) then
add_tile(map, i, j, repack(floor.bottom)) room.tiles[i][j] = floor.bottom
else else
add_tile(map, i, j, repack(floor.center)) room.tiles[i][j] = floor.center
end end
end end
end end
end end
add_random_decor_to_room(map)
add_pits_to_room(map)
end end
local function add_walls_to_room (map) local function add_walls_to_room (room)
for i=0,15 do for i=0,15 do
for j=0,11 do for j=0,11 do
if (i == 0 and j == 0) then if (i == 0 and j == 0) then
add_tile(map, i, j, repack(wall.topleft)) room.tiles[i][j] = wall.topleft
elseif (i == 15 and j == 0) then elseif (i == 15 and j == 0) then
add_tile(map, i, j, repack(wall.topright)) room.tiles[i][j] = wall.topright
elseif (i == 0 and j == 11) then elseif (i == 0 and j == 11) then
add_tile(map, i, j, repack(wall.bottomleft)) room.tiles[i][j] = wall.bottomleft
elseif (i == 15 and j == 11) then elseif (i == 15 and j == 11) then
add_tile(map, i, j, repack(wall.bottomright)) room.tiles[i][j] = wall.bottomright
elseif (i == 0 or i == 15) then elseif (i == 0 or i == 15) then
add_tile(map, i, j, repack(wall.vertical)) room.tiles[i][j] = wall.vertical
elseif (j == 0 or j == 11) then elseif (j == 0 or j == 11) then
add_tile(map, i, j, repack(wall.horizontal)) room.tiles[i][j] = wall.horizontal
end end
end end
end end
if random(2) == 1 then
check_add_decoration(map, 4, 3, lightDecor.candle2)
end
if random(2) == 1 then
check_add_decoration(map, 11, 3, lightDecor.candle2)
end
if random(2) == 1 then
check_add_decoration(map, 4, 9, lightDecor.candle2)
end
if random(2) == 1 then
check_add_decoration(map, 11, 9, lightDecor.candle2)
end
end end
local function add_exit(map, direction) local function build_vert_center_coridoor(room, offset)
if direction > 4 then return end for i=0,4 do
room.tiles[6][offset+i] = wall.vertical
if direction == UP then room.tiles[7][offset+i] = floor.center
add_tile(map, 6, 0, repack(wall.bottomright)) room.tiles[8][offset+i] = floor.center
add_tile(map, 7, 0, repack(floor.singleleft)) room.tiles[9][offset+i] = wall.vertical
add_tile(map, 8, 0, repack(floor.singleright))
add_tile(map, 9, 0, repack(wall.bottomleft))
elseif direction == LEFT then
add_tile(map, 0, 4, repack(wall.bottomright))
add_tile(map, 0, 5, repack(floor.singletop))
add_tile(map, 0, 6, repack(floor.singlebottom))
add_tile(map, 0, 7, repack(wall.topright))
elseif direction == RIGHT then
add_tile(map, 15, 4, repack(wall.bottomleft))
add_tile(map, 15, 5, repack(floor.singletop))
add_tile(map, 15, 6, repack(floor.singlebottom))
add_tile(map, 15, 7, repack(wall.topleft))
elseif direction == DOWN then
add_tile(map, 6, 11, repack(wall.topright))
add_tile(map, 7, 11, repack(floor.singleleft))
add_tile(map, 8, 11, repack(floor.singleright))
add_tile(map, 9, 11, repack(wall.topleft))
end
end
local function add_level_exit(map)
success = false
while not success do
x = random(14)
y = random(10)
success = check_add_tile(map, x, y, special.level_exit)
end
end
local function build_vert_center_coridoor(map, offset)
for j=0,4 do
add_tile(map, 6, offset+j, repack(wall.vertical));
add_tile(map, 7, offset+j, repack(floor.center));
add_tile(map, 8, offset+j, repack(floor.center));
add_tile(map, 9, offset+j, repack(wall.vertical));
end end
if random(2) == 1 then if random(2) == 1 then
add_decoration(map, 6, offset + 2, repack(lightDecor.candle1)) room.decor[6][offset+2] = lightDecor.candle1
end end
if random(2) == 1 then if random(2) == 1 then
add_decoration(map, 9, offset + 2, repack(lightDecor.candle1)) room.decor[6][offset+2] = lightDecor.candle1
end end
end end
local function build_horiz_center_coridoor(map, offset) local function build_horiz_center_coridoor(room, offset)
info("Building horizontal corrdior: " .. offset)
for i=0,6 do for i=0,6 do
add_tile(map, offset+i, 4, repack(wall.horizontal)); room.tiles[offset+i][4] = wall.horizontal
add_tile(map, offset+i, 5, repack(floor.center)); room.tiles[offset+i][5] = floor.center
add_tile(map, offset+i, 6, repack(floor.center)); room.tiles[offset+i][6] = floor.center
add_tile(map, offset+i, 7, repack(wall.horizontal)); room.tiles[offset+i][7] = wall.horizontal
end end
if random(2) == 1 then if random(2) == 1 then
check_add_decoration(map, offset+3, 4, lightDecor.candle1) room.decor[offset+3][4] = lightDecor.candle1
end end
if random(2) == 1 then if random(2) == 1 then
check_add_decoration(map, offset+3, 7, lightDecor.candle1) room.decor[offset+3][7] = lightDecor.candle1
end end
end end
local function build_center_corner_walls(map, exits) local function build_center_corner_walls(room, exits)
if exits.down then if exits.down then
if exits.left then if exits.left then
add_tile(map, 6, 7, repack(wall.topright)) room.tiles[6][7] = wall.topright
end end
if exits.right then if exits.right then
add_tile(map, 9, 7, repack(wall.topleft)) room.tiles[9][7] = wall.topleft
end end
else else
if not exits.left then if not exits.left then
add_tile(map, 6, 7, repack(wall.bottomleft)) room.tiles[6][7] = wall.bottomleft
end end
if not exits.right then if not exits.right then
add_tile(map, 9, 7, repack(wall.bottomright)) room.tiles[9][7] = wall.bottomright
end end
end end
if exits.up then if exits.up then
if exits.left then if exits.left then
add_tile(map, 6, 4, repack(wall.bottomright)) room.tiles[6][4] = wall.bottomright
end end
if exits.right then if exits.right then
add_tile(map, 9, 4, repack(wall.bottomleft)) room.tiles[9][4] = wall.bottomleft
end end
else else
if not exits.left then if not exits.left then
add_tile(map, 6, 4, repack(wall.topleft)) room.tiles[6][4] = wall.topleft
end end
if not exits.right then if not exits.right then
add_tile(map, 9, 4, repack(wall.topright)) room.tiles[9][4] = wall.topright
end end
end end
end end
local module = {} local function add_exits_to_room(room)
for _,direction in ipairs(room.exits) do
function module.add_full_lighting(map) if direction == UP then
check_add_decoration(map, 4, 3, lightDecor.candle2) room.tiles[6][0] = wall.bottomright
check_add_decoration(map, 11, 3, lightDecor.candle2) room.tiles[7][0] = floor.singleleft
check_add_decoration(map, 4, 9, lightDecor.candle2) room.tiles[8][0] = floor.singleright
check_add_decoration(map, 11, 9, lightDecor.candle2) room.tiles[9][0] = wall.bottomleft
elseif direction == LEFT then
room.tiles[0][4] = wall.bottomright
room.tiles[0][5] = floor.singletop
room.tiles[0][6] = floor.singlebottom
room.tiles[0][7] = wall.topright
elseif direction == RIGHT then
room.tiles[15][4] = wall.bottomleft
room.tiles[15][5] = floor.singletop
room.tiles[15][6] = floor.singlebottom
room.tiles[15][7] = wall.topleft
elseif direction == DOWN then
room.tiles[6][11] = wall.topright
room.tiles[7][11] = floor.singleleft
room.tiles[8][11] = floor.singleright
room.tiles[9][11] = wall.topleft
end
end
end end
function module.build_coridoor_room(map, room) local function build_coridoor_room(room)
local exits = { local exits = {
up = false, up = false,
down = false, down = false,
@ -408,51 +398,126 @@ function module.build_coridoor_room(map, room)
end end
-- Fill the center -- Fill the center
add_tile(map, 6, 5, repack(wall.vertical)) room.tiles[6][5] = wall.vertical
add_tile(map, 6, 6, repack(wall.vertical)) room.tiles[6][6] = wall.vertical
add_tile(map, 7, 4, repack(wall.horizontal)) room.tiles[7][4] = wall.horizontal
add_tile(map, 7, 5, repack(floor.center)) room.tiles[7][5] = floor.center
add_tile(map, 7, 6, repack(floor.center)) room.tiles[7][6] = floor.center
add_tile(map, 7, 7, repack(wall.horizontal)) room.tiles[7][7] = wall.horizontal
add_tile(map, 8, 4, repack(wall.horizontal)) room.tiles[8][4] = wall.horizontal
add_tile(map, 8, 5, repack(floor.center)) room.tiles[8][5] = floor.center
add_tile(map, 8, 6, repack(floor.center)) room.tiles[8][6] = floor.center
add_tile(map, 8, 7, repack(wall.horizontal)) room.tiles[8][7] = wall.horizontal
add_tile(map, 9, 5, repack(wall.vertical)) room.tiles[9][5] = wall.vertical
add_tile(map, 9, 6, repack(wall.vertical)) room.tiles[9][6] = wall.vertical
-- Build the coridoors -- Build the coridoors
if exits.down then build_vert_center_coridoor(map, 7) end if exits.down then build_vert_center_coridoor(room, 7) end
if exits.up then build_vert_center_coridoor(map, 0) end if exits.up then build_vert_center_coridoor(room, 0) end
if exits.left then build_horiz_center_coridoor(map, 0) end if exits.left then build_horiz_center_coridoor(room, 0) end
if exits.right then build_horiz_center_coridoor(map, 9) end if exits.right then build_horiz_center_coridoor(room, 9) end
build_center_corner_walls(map, exits) build_center_corner_walls(room, exits)
end end
function module.create_room () local function add_level_exit(room)
return { success = false
exits = {}, while not success do
active = false, x = random(14)
goal = false, y = random(10)
path_dir = 0, if not room.decor[x][y] then
type = "room" success = true
} room.tiles[x][y] = special.level_exit
end
function module.build_square_room(map, room)
add_tiles_to_room(map);
add_walls_to_room(map);
for exit=1, #room.exits do
add_exit(map, room.exits[exit]);
end end
end
end
local function build_normal_room(room)
add_tiles_to_room(room)
add_random_decor_to_room(room)
add_walls_to_room(room)
add_exits_to_room(room)
add_pits_to_room(room)
if room.goal then if room.goal then
add_level_exit(map); add_level_exit(room)
end end
if CURRENT_LEVEL > 3 and random(10) == 1 then if CURRENT_LEVEL > 3 and random(10) == 1 then
directions = { "LEFT", "RIGHT", "UP", "DOWN" } directions = { "LEFT", "RIGHT", "UP", "DOWN" }
set_modifier(map, "WINDY", directions[random(#directions)]); room.modifier.type = "WINDY"
room.modifier.arg = directions[random(#directions)]
end
return room
end
local module = {}
function module.add_exit(room, direction)
if direction > 4 then
return
end
table.insert(room.exits, direction)
end
function module.add_full_lighting(room)
room.decor[4][3] = lightDecor.candle2
room.decor[11][3] = lightDecor.candle2
room.decor[4][9] = lightDecor.candle2
room.decor[11][9] = lightDecor.candle2
end
function module.create_empty_room()
room = {
exits = {},
active = false,
goal = false,
path_dir = 0,
type = "room",
tiles = {},
decor = {},
modifier = {
type = nil,
arg = nil
},
monsters = {}
}
for i=0,15 do
room.tiles[i] = {}
room.decor[i] = {}
room.monsters[i] = {}
for j=0,11 do
room.tiles[i][j] = nil
room.decor[i][j] = nil
room.monsters[i][j] = nil
end
end
return room
end
function module.build_room(room)
if room.type == "coridoor" then
build_coridoor_room(room)
else
build_normal_room(room)
end
end
function module.load_room(map, room)
for i=0, 15 do
for j=0, 11 do
if room.tiles[i][j] then
add_tile(map, i, j, repack(room.tiles[i][j]))
end
if room.decor[i][j] then
add_decoration(map, i, j, repack(room.decor[i][j]))
end
end
end
if room.modifier.type then
set_modifier(map, room.modifier.type, room.modifier.arg)
end end
end end

View File

@ -4,9 +4,11 @@ local monster_gen = require "monstergen"
map = create_map(CURRENT_LEVEL) -- 'map' needs to be global map = create_map(CURRENT_LEVEL) -- 'map' needs to be global
room_builder.load_textures(map) room_builder.load_textures(map)
local room = room_builder.create_room()
set_current_room(map, 0, 0) set_current_room(map, 0, 0)
room_builder.build_square_room(map, room) local room = room_builder.create_empty_room()
monster_gen.add_monster_to_room(map, 0, 0); room_builder.build_room(room)
room_builder.add_full_lighting(map); room_builder.add_full_lighting(room)
monster_gen.add_monsters_to_room(room, 0, 0)
room_builder.load_room(map, room)
monster_gen.load_monsters(map, room.monsters)

View File

@ -264,15 +264,42 @@ if random(100) == 1 then
enemies = concat(enemies, platino); enemies = concat(enemies, platino);
end end
function module.add_monster_to_room(map, roomx, roomy) function module.add_monsters_to_room(room, roomx, roomy)
local count = random(3) local count = random(3)
if (CURRENT_LEVEL > 3) then if (CURRENT_LEVEL > 3) then
count = random(4) count = random(4)
end end
for i=0,count do local i = 0
local x = (roomx * 512) + (random(13) + 1) * 32 while i < count do
local y = (roomy * 384) + (random(9) + 1) * 32 local rx = random(13) + 1
add_monster(map, x, y, repack(enemies[random(#enemies)])); local ry = random(9) + 1
if not room.decor[rx][ry]
and not room.monsters[rx][ry]
and (room.tiles[rx][ry]
and not room.tiles[rx][ry][5]
and not room.tiles[rx][ry][8])
then
local x = (roomx * 512) + rx * 32
local y = (roomy * 384) + ry * 32
room.monsters[rx][ry] = {
x,
y,
enemies[random(#enemies)]
}
i = i + 1
end
end
end
function module.load_monsters(map, monsters)
for i=0,15 do
for j=0,11 do
monster = monsters[i][j]
if monster then
add_monster(map, monster[1], monster[2], repack(monster[3]))
end
end
end end
end end