From 0add3b29ae510447e7d6ed361ef09755b1633089 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Mon, 16 Mar 2026 12:53:10 -0400 Subject: [PATCH] Now have doors that you can walk though. No open/close animation yet. --- assets/config.json | 5 +++++ assets/map_tiles.json | 6 ++++++ assets/textures/door_plain.png | Bin 0 -> 36193 bytes assets/tiles.json | 8 ++++++++ src/algos/maze.hpp | 4 ++-- src/game/map.cpp | 5 ++--- src/game/map.hpp | 1 + src/game/worldbuilder.cpp | 15 +++++++++++++++ src/game/worldbuilder.hpp | 1 + src/graphics/raycaster.cpp | 1 + 10 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 assets/textures/door_plain.png diff --git a/assets/config.json b/assets/config.json index 9356487..df06df3 100644 --- a/assets/config.json +++ b/assets/config.json @@ -231,6 +231,11 @@ "frame_width": 256, "frame_height": 256 }, + "door_plain": + {"path": "assets/sprites/door_plain.png", + "frame_width": 256, + "frame_height": 256 + }, "dead_body_lootable": {"path": "assets/sprites/dead_body_lootable.png", "frame_width": 256, diff --git a/assets/map_tiles.json b/assets/map_tiles.json index a0e2623..af61b68 100644 --- a/assets/map_tiles.json +++ b/assets/map_tiles.json @@ -136,5 +136,11 @@ "display": 1218, "x": 128, "y": 128 + }, + { + "centered": true, + "display": 1087, + "x": 128, + "y": 128 } ] diff --git a/assets/textures/door_plain.png b/assets/textures/door_plain.png new file mode 100644 index 0000000000000000000000000000000000000000..62a717bc25582f72f8f957d15bfe1cd6bbc3e8ff GIT binary patch literal 36193 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 literal 0 HcmV?d00001 diff --git a/assets/tiles.json b/assets/tiles.json index c45d559..5a443c4 100644 --- a/assets/tiles.json +++ b/assets/tiles.json @@ -65,5 +65,13 @@ "foreground": "color:BAD", "background": "color:BAD", "id": 8 + }, + "door_plain": { + "texture": "assets/textures/door_plain.png", + "display": 1087, + "light": 0, + "foreground": "tiles/fg:wall_plain", + "background": "tiles/bg:wall_plain", + "id": 9 } } diff --git a/src/algos/maze.hpp b/src/algos/maze.hpp index d8c17d3..39bc41f 100644 --- a/src/algos/maze.hpp +++ b/src/algos/maze.hpp @@ -11,16 +11,16 @@ namespace maze { size_t $height = 0; Matrix& $walls; std::vector& $rooms; + std::unordered_map& $doors; std::vector& $dead_ends; std::unordered_map $ends_map; Room $no_rooms_region{0,0,0,0}; // BUG: instead of bool map it to the room? - std::unordered_map $doors; Pathing $pathing; Builder(Map& map) : $width(map.$width), $height(map.$height), $walls(map.$walls), - $rooms(map.$rooms), $dead_ends(map.$dead_ends), $pathing{$width, $height} + $rooms(map.$rooms), $doors(map.$doors), $dead_ends(map.$dead_ends), $pathing{$width, $height} { dbc::check($width % 2 == 1, "map width not an ODD number (perimter dead ends bug)"); dbc::check($height % 2 == 1, "map height not an ODD number (perimter dead ends bug)"); diff --git a/src/game/map.cpp b/src/game/map.cpp index 97c500f..9970a3e 100644 --- a/src/game/map.cpp +++ b/src/game/map.cpp @@ -62,7 +62,7 @@ bool Map::place_entity(size_t room_index, Point &out) { } bool Map::iswall(size_t x, size_t y) { - return $walls[y][x] == WALL_VALUE; + return !$doors.contains({x, y}) && $walls[y][x] == WALL_VALUE; } void Map::dump(int show_x, int show_y) { @@ -71,8 +71,7 @@ void Map::dump(int show_x, int show_y) { } bool Map::can_move(Point move_to) { - return inmap(move_to.x, move_to.y) && - !iswall(move_to.x, move_to.y); + return inmap(move_to.x, move_to.y) && !iswall(move_to.x, move_to.y); } Point Map::map_to_camera(const Point &loc, const Point &cam_orig) { diff --git a/src/game/map.hpp b/src/game/map.hpp index 9428785..d988bd7 100644 --- a/src/game/map.hpp +++ b/src/game/map.hpp @@ -55,6 +55,7 @@ public: Pathing $paths; std::vector $rooms; std::vector $dead_ends; + std::unordered_map $doors; Map(size_t width, size_t height); diff --git a/src/game/worldbuilder.cpp b/src/game/worldbuilder.cpp index 2691831..e8a5cdd 100644 --- a/src/game/worldbuilder.cpp +++ b/src/game/worldbuilder.cpp @@ -163,11 +163,25 @@ void WorldBuilder::randomize_entities(DinkyECS::World &world, GameConfig &config } for(auto& at : $map.$dead_ends) { + if($map.$doors.contains(at)) continue; auto& entity_data = random_entity_data(config, gen_config); configure_entity_in_map(world, entity_data, at); } } +void WorldBuilder::place_doors(DinkyECS::World& world, GameConfig& config) { + auto& device_config = config.devices.json(); + auto entity_data = device_config["DOOR_PLAIN"]; + auto& tiles = $map.tiles(); + + size_t door_id = textures::get_id("door_plain"); + + for(auto [door_at, _] : $map.$doors) { + $map.$walls[door_at.y][door_at.x] = WALL_VALUE; + tiles[door_at.y][door_at.x] = door_id; + } +} + void WorldBuilder::place_stairs(DinkyECS::World& world, GameConfig& config) { auto& device_config = config.devices.json(); auto entity_data = device_config["STAIRS_DOWN"]; @@ -233,6 +247,7 @@ void WorldBuilder::place_entities(DinkyECS::World &world) { dbc::check(player_pos.location.x != 0 && player_pos.location.y != 0, "failed to place the player correctly"); + place_doors(world, config); randomize_entities(world, config); place_stairs(world, config); } diff --git a/src/game/worldbuilder.hpp b/src/game/worldbuilder.hpp index 891c05a..ff767da 100644 --- a/src/game/worldbuilder.hpp +++ b/src/game/worldbuilder.hpp @@ -26,6 +26,7 @@ class WorldBuilder { void generate(DinkyECS::World &world); void randomize_entities(DinkyECS::World &world, components::GameConfig &config); void place_stairs(DinkyECS::World& world, components::GameConfig& config); + void place_doors(DinkyECS::World& world, components::GameConfig& config); void configure_starting_items(DinkyECS::World &world); void stylize_rooms(); }; diff --git a/src/graphics/raycaster.cpp b/src/graphics/raycaster.cpp index 4b1bea5..0956a09 100644 --- a/src/graphics/raycaster.cpp +++ b/src/graphics/raycaster.cpp @@ -312,6 +312,7 @@ void Raycaster::cast_rays() { int draw_end = line_height / 2 + $height / 2 + $pitch; if(draw_end >= $height) draw_end = $height - 1; + // BUG: I thought I got rid of this auto texture = textures::get_surface($tiles[map_y][map_x]); // calculate value of wall_x