diff --git a/assets/Sounds/FX/door_open.wav b/assets/Sounds/FX/door_open.wav new file mode 100644 index 0000000..de4d838 Binary files /dev/null and b/assets/Sounds/FX/door_open.wav differ diff --git a/data/layoutparser.lua b/data/layoutparser.lua index a9e5247..c15540d 100644 --- a/data/layoutparser.lua +++ b/data/layoutparser.lua @@ -3,7 +3,9 @@ local pits = {} local walls = {} local fences = {} local lights = {} +local doors = {} local walldecor = {} +local chest local function readLayoutFile(file) local layoutfile = read_file(file) @@ -139,6 +141,15 @@ local function setPitTile(room, matrix, i, j) end end +local function getDoor(matrix, i, j, topDoor, leftDoor) + local above, below, left, right, above_left, above_right, below_left, below_right = getTileStateFor(matrix, i, j, { "#", "\"", "/"}); + if above and below then + return leftDoor + else + return topDoor + end +end + local module = {} function module.load_textures(map, wall_xoffset, wall_yoffset) local t_pit0 = add_texture(map, "Objects/Pit0.png") @@ -147,6 +158,8 @@ function module.load_textures(map, wall_xoffset, wall_yoffset) local t_fence = add_texture(map, "Objects/Fence.png") local t_decor0 = add_texture(map, "Objects/Decor0.png") local t_decor1 = add_texture(map, "Objects/Decor1.png") + local t_door0 = add_texture(map, "Objects/Door0.png") + local t_door1 = add_texture(map, "Objects/Door1.png") local yo = (random(5) + random(3)) * (16 * 2) pits = { @@ -198,11 +211,27 @@ function module.load_textures(map, wall_xoffset, wall_yoffset) bottom_t = { t_fence, nil, 64, yo + 32, true }, } + doors = { + door_top_nolock = { t_door0, t_door1, 0, 0, true }, + door_left_nolock = { t_door0, t_door1, 16, 0, true }, + door_top_silverlock = { t_door0, t_door1, 32, 0, true }, + door_left_silverlock = { t_door0, t_door1, 48, 0, true }, + door_top_goldlock = { t_door0, t_door1, 64, 0, true }, + door_left_goldlock = { t_door0, t_door1, 80, 0, true }, + gate_top_nolock = { t_door0, t_door1, 0, 32, true }, + gate_left_nolock = { t_door0, t_door1, 16, 32, true }, + gate_top_silverlock = { t_door0, t_door1, 32, 32, true }, + gate_left_silverlock = { t_door0, t_door1, 48, 32, true }, + gate_top_goldlock = { t_door0, t_door1, 64, 32, true }, + gate_left_goldlock = { t_door0, t_door1, 80, 32, true }, + } + lights = { candle0 = { t_decor0, t_decor1, 3 * 16, 8 * 16, true, true }, candle1 = { t_decor0, t_decor1, 1 * 16, 8 * 16, true, true }, candle2 = { t_decor0, t_decor1, 5 * 16, 8 * 16, true, false }, } + walldecor = { topleft = { { t_decor0, nil, 2 * 16, 2 * 16, false }, @@ -261,6 +290,8 @@ function module.load_textures(map, wall_xoffset, wall_yoffset) { t_decor0, nil, 5 * 16, 2 * 16, false }, }, } + + chest = { "Items/Chest0.png", "Items/Chest1.png", 16, 0} end function createJumbleLayout(matrix) @@ -299,12 +330,12 @@ function draw_layout_to_room(room, matrix, roomx, roomy) if matrix[i][j] == "p" then setPitTile(room, matrix, i, j); elseif matrix[i][j] == "#" then - setBlockTile(room, matrix, i, j, walls, {"#", "\"", "/"}, false) + setBlockTile(room, matrix, i, j, walls, {"#", "\"", "/", "d", "g"}, false) elseif matrix[i][j] == "\"" then - setBlockTile(room, matrix, i, j, walls, {"#", "\"", "/"}, false) + setBlockTile(room, matrix, i, j, walls, {"#", "\"", "/", "d", "g"}, false) room.decor[i][j] = lights.candle1 elseif matrix[i][j] == "/" then - setBlockTile(room, matrix, i, j, walls, {"#", "\"", "/"}, false) + setBlockTile(room, matrix, i, j, walls, {"#", "\"", "/", "d", "g"}, false) if random(2) == 1 then room.decor[i][j] = lights.candle1 else @@ -316,6 +347,12 @@ function draw_layout_to_room(room, matrix, roomx, roomy) create_shop_artifact(map, (roomx*512) + i*32, (roomy * 384) + j*32) elseif matrix[i][j] == "l" then room.decor[i][j] = lights.candle0 + elseif matrix[i][j] == "c" then + room.chests[i][j] = chest + elseif matrix[i][j] == "d" then + room.doors[i][j] = getDoor(matrix, i, j, doors.door_top_nolock, doors.door_left_nolock) + elseif matrix[i][j] == "g" then + room.doors[i][j] = getDoor(matrix, i, j, doors.gate_top_nolock, doors.gate_left_nolock) end end end @@ -331,7 +368,7 @@ function pickALayout(matrix) end function module.add_walls_to_room(room) - if random(3) ~= 1 then + if random(2) == 1 then return false end @@ -354,4 +391,10 @@ function module.add_shop_layout(room, roomx, roomy) return true end +function module.add_locked_room_layout(room, roomx, roomy) + local matrix = readLayoutFile("lockedroomlayouts.dat") + draw_layout_to_room(room, matrix[random(#matrix)], roomx, roomy) + return true +end + return module diff --git a/data/lockedroomlayouts.dat b/data/lockedroomlayouts.dat new file mode 100644 index 0000000..d084058 --- /dev/null +++ b/data/lockedroomlayouts.dat @@ -0,0 +1,12 @@ +++++++++++++++++ +++++++++++++++++ +++"#####d####"++ +++#-c--c--c--#++ +++#----------#++ +++#-c--c--c--#++ +++d----------d++ +++#-c--c--c--#++ +++#----------#++ +++"#####d####"++ +++++++++++++++++ +++++++++++++++++ \ No newline at end of file diff --git a/data/maproombuilder.lua b/data/maproombuilder.lua index cc1ad01..3e64f40 100644 --- a/data/maproombuilder.lua +++ b/data/maproombuilder.lua @@ -398,6 +398,14 @@ local function build_shop_room(room, roomx, roomy) return room end +local function build_locked_room(room, roomx, roomy) + add_tiles_to_room(room, false) + add_walls_to_room(room) + add_exits_to_room(room) + layoutparser.add_locked_room_layout(room, roomx, roomy) + return room +end + local function build_normal_room(room) local crumbling = (CURRENT_LEVEL > 3 or QUICK_MODE) and random(8) == 1 local pitsAdded = false; @@ -503,6 +511,7 @@ function module.build_room(room, roomx, roomy) build_shop_room(room, roomx, roomy) else build_normal_room(room) + --build_locked_room(room, roomx, roomy) end end diff --git a/data/walllayouts.dat b/data/walllayouts.dat index 27f7855..aa8cc0e 100644 --- a/data/walllayouts.dat +++ b/data/walllayouts.dat @@ -14,9 +14,9 @@ ++++++++++++++++ ++++++++++++++++ ++#--#-#-#-#-#++ -++------------++ +++---c--------++ ++/-#-#-#-#--/++ -++------------++ +++-------c----++ ++/--#-#-#-#-/++ ++------------++ ++--#-#-#-#---++ @@ -30,7 +30,7 @@ ++#----------#++ ++#-/#######-#++ ++--#------#-#++ -++--#--------#++ +++--d--cc--d-#++ ++#-/#######-#++ ++#----------#++ ++############++ @@ -40,12 +40,12 @@ ++++++++++++++++ ++++++++++++++++ ++/#--------#/++ -++##-ffffff-##++ +++##-ffffdf-##++ +++---f--c-f---++ ++---f----f---++ -++--------f---++ -++--------f---++ +++---f-c--f---++ ++---f----f---++ -++##-ffffff-##++ +++##-fdffff-##++ ++/#--------#/++ ++++++++++++++++ ++++++++++++++++ @@ -53,12 +53,38 @@ ++++++++++++++++ ++++++++++++++++ ++/#ffffffff#/++ -++##--------##++ -++------------++ +++#----------#++ ++---######---++ +++---d----#---++ +++---#-cc-d---++ ++---######---++ -++------------++ -++##--------##++ +++#----------#++ ++/#ffffffff#/++ ++++++++++++++++ ++++++++++++++++ + +++++++++++++++++ +++++++++++++++++ +++/##########/++ +++d-----d----d++ +++#c----#---c#++ +++############++ +++#----#-----#++ +++#-c--d--c--#++ +++d----#-----d++ +++/##########/++ +++++++++++++++++ +++++++++++++++++ + +++++++++++++++++ +++++++++++++++++ +++/####-#####/++ +++#--c#-#c---#++ +++d---#-#----d++ +++#####-######++ +++------------++ +++#####-######++ +++d--c#-#c---d++ +++/####-#####/++ +++++++++++++++++ +++++++++++++++++ \ No newline at end of file diff --git a/src/map.c b/src/map.c index f89839c..4f48093 100644 --- a/src/map.c +++ b/src/map.c @@ -149,6 +149,7 @@ map_add_door(Map *map, Position *tile_pos, MapTile *tile) Room *room = map->rooms[cr->x][cr->y]; switch_tile(map, tile_pos, tile, &room->doors[tile_pos->x][tile_pos->y]); tile->door = true; + tile->sprite->texture_index = 0; tile->sprite->animate = false; } diff --git a/src/map_lua.c b/src/map_lua.c index 76b5cac..3a88392 100644 --- a/src/map_lua.c +++ b/src/map_lua.c @@ -271,12 +271,14 @@ l_add_tile(lua_State *L) return 0; } +static int l_add_wall(lua_State *L) { extract_tile_data(L, &map_add_wall); return 0; } +static int l_add_door(lua_State *L) { extract_tile_data(L, &map_add_door); diff --git a/src/mixer.c b/src/mixer.c index 769f486..d4b951c 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -88,6 +88,7 @@ load_effects(void) effects[FADE_IN] = load_effect("Sounds/FX/fade_in.wav"); effects[FADE_OUT] = load_effect("Sounds/FX/fade_out.wav"); effects[BURST] = load_effect("Sounds/FX/burst.wav"); + effects[DOOR_OPEN] = load_effect("Sounds/FX/door_open.wav"); } void diff --git a/src/mixer.h b/src/mixer.h index b95f726..7de162e 100644 --- a/src/mixer.h +++ b/src/mixer.h @@ -64,6 +64,7 @@ typedef enum Fx_t { FADE_IN, FADE_OUT, BURST, + DOOR_OPEN, LAST_EFFECT } Fx; diff --git a/src/player.c b/src/player.c index 7dafd5c..78b37fe 100644 --- a/src/player.c +++ b/src/player.c @@ -239,6 +239,10 @@ has_collided(Player *player, RoomMatrix *matrix, Vector2d direction) gamecontroller_rumble(0.30f, 100); if (space->monster) { on_monster_collision(player, space->monster, matrix, direction); + } else if (space->door) { + mixer_play_effect(DOOR_OPEN); + space->door->sprite->texture_index = 1; + space->door->collider = false; } else { mixer_play_effect(BONK); camera_shake(direction, 100);