From 2daa1c9bd5223fdabfe2165adbed6ea274166670 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 30 Jan 2025 11:38:57 -0500 Subject: [PATCH] Brought over a bunch of code from the roguelike and now will use it to generate a random map. --- assets/config.json | 13 + assets/devices.json | 47 +++ assets/enemies.json | 23 ++ assets/items.json | 75 ++++ assets/tiles.json | 20 + assets/wall_simple-256.png | Bin 0 -> 82729 bytes assets/wall_with_pillars-256.png | Bin 0 -> 89624 bytes assets/wall_with_vines-256.png | Bin 0 -> 101130 bytes combat.cpp | 16 + combat.hpp | 13 + components.cpp | 37 ++ components.hpp | 64 ++++ constants.hpp | 24 ++ devices.cpp | 24 ++ devices.hpp | 15 + dinkyecs.hpp | 158 ++++++++ events.hpp | 12 + inventory.cpp | 42 +++ inventory.hpp | 33 ++ levelmanager.cpp | 70 ++++ levelmanager.hpp | 39 ++ lights.cpp | 62 ++++ lights.hpp | 46 +++ main.cpp | 10 +- map.cpp | 235 ++++++++++++ map.hpp | 75 ++++ matrix.cpp | 69 +--- matrix.hpp | 328 ++--------------- meson.build | 75 ++-- pathing.cpp | 86 +++++ pathing.hpp | 30 ++ point.hpp | 5 +- rand.cpp | 6 + rand.hpp | 28 ++ save.cpp | 96 +++++ save.hpp | 45 +++ shiterator.hpp | 607 +++++++++++++++++++++++++++++++ spatialmap.cpp | 66 ++++ spatialmap.hpp | 31 ++ systems.cpp | 215 +++++++++++ systems.hpp | 18 + tests/components.cpp | 99 +++++ tests/dbc.cpp | 39 ++ tests/dijkstra.json | 60 +++ tests/inventory.cpp | 71 ++++ tests/levelmanager.cpp | 40 ++ tests/lighting.cpp | 45 +++ tests/map.cpp | 83 +++++ tests/matrix.cpp | 343 +++++++++++++++++ tests/pathing.cpp | 51 +++ tests/save.cpp | 103 ++++++ tests/spatialmap.cpp | 137 +++++++ tests/tilemap.cpp | 25 ++ tests/worldbuilder.cpp | 35 ++ tilemap.cpp | 75 ++++ tilemap.hpp | 46 +++ tser.hpp | 220 +++++++++++ worldbuilder.cpp | 347 ++++++++++++++++++ worldbuilder.hpp | 27 ++ 59 files changed, 4298 insertions(+), 406 deletions(-) create mode 100644 assets/devices.json create mode 100644 assets/enemies.json create mode 100644 assets/items.json create mode 100644 assets/tiles.json create mode 100644 assets/wall_simple-256.png create mode 100644 assets/wall_with_pillars-256.png create mode 100644 assets/wall_with_vines-256.png create mode 100644 combat.cpp create mode 100644 combat.hpp create mode 100644 components.cpp create mode 100644 components.hpp create mode 100644 devices.cpp create mode 100644 devices.hpp create mode 100644 dinkyecs.hpp create mode 100644 events.hpp create mode 100644 inventory.cpp create mode 100644 inventory.hpp create mode 100644 levelmanager.cpp create mode 100644 levelmanager.hpp create mode 100644 lights.cpp create mode 100644 lights.hpp create mode 100644 map.cpp create mode 100644 map.hpp create mode 100644 pathing.cpp create mode 100644 pathing.hpp create mode 100644 rand.cpp create mode 100644 rand.hpp create mode 100644 save.cpp create mode 100644 save.hpp create mode 100644 shiterator.hpp create mode 100644 spatialmap.cpp create mode 100644 spatialmap.hpp create mode 100644 systems.cpp create mode 100644 systems.hpp create mode 100644 tests/components.cpp create mode 100644 tests/dbc.cpp create mode 100644 tests/dijkstra.json create mode 100644 tests/inventory.cpp create mode 100644 tests/levelmanager.cpp create mode 100644 tests/lighting.cpp create mode 100644 tests/map.cpp create mode 100644 tests/matrix.cpp create mode 100644 tests/pathing.cpp create mode 100644 tests/save.cpp create mode 100644 tests/spatialmap.cpp create mode 100644 tests/tilemap.cpp create mode 100644 tests/worldbuilder.cpp create mode 100644 tilemap.cpp create mode 100644 tilemap.hpp create mode 100644 tser.hpp create mode 100644 worldbuilder.cpp create mode 100644 worldbuilder.hpp diff --git a/assets/config.json b/assets/config.json index de2ddf1..dc3cb6f 100644 --- a/assets/config.json +++ b/assets/config.json @@ -1,5 +1,8 @@ { "textures": [ + "assets/wall_simple-256.png", + "assets/wall_with_vines-256.png", + "assets/wall_with_pillars-256.png", "assets/wall_texture_test-256.png", "assets/floor_tile_test-256.png", "assets/ceiling_test-256.png", @@ -13,5 +16,15 @@ "peasant_girl": "assets/undead_peasant-256.png", "floor": "assets/floor_tile_test-256.png", "ceiling": "assets/ceiling_test-256.png" + }, + "enemy": { + "HEARING_DISTANCE": 8 + }, + "player": { + }, + "worldgen": { + "enemy_probability": 20, + "empty_room_probability": 10, + "device_probability": 30 } } diff --git a/assets/devices.json b/assets/devices.json new file mode 100644 index 0000000..4356d7c --- /dev/null +++ b/assets/devices.json @@ -0,0 +1,47 @@ +{ + "STAIRS_DOWN": { + "id": "STAIRS_DOWN", + "name": "Stairs Down", + "placement": "fixed", + "foreground": [24, 205, 189], + "background": [24, 205, 189], + "description": "Stairs that go down further into the dungeon.", + "inventory_count": 0, + "randomized": false, + "components": [ + {"type": "Tile", "config": {"chr": "\u2ac5"}}, + {"type": "Device", + "config": {"test": true}, "events": ["Events::GUI::STAIRS_DOWN"] + } + ] + }, + "STAIRS_UP": { + "id": "STAIRS_UP", + "name": "Stairs Up", + "foreground": [24, 205, 189], + "background": [24, 205, 189], + "description": "Stairs that go up, for the weak.", + "inventory_count": 0, + "placement": "fixed", + "components": [ + {"type": "Tile", "config": {"chr": "\u2259"}}, + {"type": "Device", + "config": {"test": true}, "events": ["Events::GUI::STAIRS_UP"] + } + ] + }, + "SPIKE_TRAP": { + "id": "SPIKE_TRAP", + "name": "Spike trap", + "foreground": [24, 205, 189], + "background": [24, 205, 189], + "description": "Spikes stab you from the floor.", + "inventory_count": 0, + "components": [ + {"type": "Tile", "config": {"chr": "\u1ac7"}}, + {"type": "Device", + "config": {"test": true}, "events": ["Events::GUI::TRAP"] + } + ] + } +} diff --git a/assets/enemies.json b/assets/enemies.json new file mode 100644 index 0000000..a5b8d88 --- /dev/null +++ b/assets/enemies.json @@ -0,0 +1,23 @@ +{ + "PLAYER_TILE": { + "foreground": [255, 200, 125], + "background": [30, 20, 75], + "components": [ + {"type": "Tile", "config": {"chr": "\ua66b"}}, + {"type": "Combat", "config": {"hp": 200, "damage": 15}}, + {"type": "Motion", "config": {"dx": 0, "dy": 0, "random": false}}, + {"type": "LightSource", "config": {"strength": 70, "radius": 2}}, + {"type": "EnemyConfig", "config": {"hearing_distance": 5}} + ] + }, + "EVIL_EYE": { + "foreground": [75, 200, 125], + "background": [30, 20, 75], + "components": [ + {"type": "Tile", "config": {"chr": "\u08ac"}}, + {"type": "Combat", "config": {"hp": 100, "damage": 50}}, + {"type": "Motion", "config": {"dx": 0, "dy": 0, "random": false}}, + {"type": "EnemyConfig", "config": {"hearing_distance": 10}} + ] + } +} diff --git a/assets/items.json b/assets/items.json new file mode 100644 index 0000000..3580cd5 --- /dev/null +++ b/assets/items.json @@ -0,0 +1,75 @@ +{ + "TORCH_BAD": { + "id": "TORCH_BAD", + "name": "Crappy Torch", + "foreground": [24, 120, 189], + "background": [230,120, 120], + "description": "A torch that barely lights the way. You wonder if it'd be better to not see the person who murders you.", + "inventory_count": 1, + "components": [ + {"type": "LightSource", "config": {"strength": 70, "radius": 2.0}}, + {"type": "Tile", "config": {"chr": "\u0f08"}} + ] + }, + "SWORD_RUSTY": { + "id": "SWORD_RUSTY", + "name": "Rusty Junk Sword", + "foreground": [24, 120, 189], + "background": [24, 120, 189], + "description": "A sword left to rot in a deep hole where it acquired a patina of dirt and tetanus. You aren't sure if it's more deadly for you to hold it or for the people you stab with it.", + "inventory_count": 1, + "components": [ + {"type": "Weapon", "config": {"damage": 15}}, + {"type": "Tile", "config": {"chr": "\u1e37"}} + ] + }, + "SWORD_LIGHT_AND_FLAME": { + "id": "SWORD_LIGHT_AND_FLAME", + "name": "Sword of Light and Flame", + "foreground": [24, 205, 210], + "background": [24, 205, 210], + "description": "A sword so powerful, a great man from the Land of The Rising Sun thrust it into the ocean of Nerf to chill its effects.", + "inventory_count": 1, + "components": [ + {"type": "LightSource", "config": {"strength": 70, "radius": 1.8}}, + {"type": "Tile", "config": {"chr": "\u0236"}}, + {"type": "Weapon", "config": {"damage": 30}} + ] + }, + "CHEST_SMALL": { + "id": "CHEST_SMALL", + "name": "Small Chest", + "foreground": [150, 100, 189], + "background": [150, 100, 189], + "description": "A small chest of gold. You wonder who would leave something like this around.", + "components": [ + {"type": "Tile", "config": {"chr": "\uaaea"}}, + {"type": "Loot", "config": {"amount": 10}} + ], + "inventory_count": 1 + }, + "WALL_TORCH": { + "id": "WALL_TORCH", + "name": "Basic Wall Torch", + "foreground": [24, 205, 210], + "background": [24, 205, 210], + "description": "A torch on a wall you can't pick up.", + "inventory_count": 0, + "components": [ + {"type": "Tile", "config": {"chr": "\u077e"}}, + {"type": "LightSource", "config": {"strength": 60, "radius": 1.8}} + ] + }, + "POTION_HEALING_SMALL": { + "id": "POTION_HEALING_SMALL", + "name": "Small Healing Potion", + "foreground": [255, 205, 189], + "background": [255, 205, 189], + "description": "A small healing potion.", + "inventory_count": 1, + "components": [ + {"type": "Tile", "config": {"chr": "\u03eb"}}, + {"type": "Curative", "config": {"hp": 20}} + ] + } +} diff --git a/assets/tiles.json b/assets/tiles.json new file mode 100644 index 0000000..4733c86 --- /dev/null +++ b/assets/tiles.json @@ -0,0 +1,20 @@ +{ + "WALL_TILE": { + "foreground": [230, 20, 30], + "background": [230, 20, 120], + "collision": true, + "display": "\ua5b8" + }, + "FLOOR_TILE": { + "foreground": [40, 15, 125], + "background": [200, 15, 75], + "collision": false, + "display":"\u289e" + }, + "CEILING_TILE": { + "foreground": [159, 164, 15], + "background": [199, 15, 79], + "collision": true, + "display":"\u2274" + } +} diff --git a/assets/wall_simple-256.png b/assets/wall_simple-256.png new file mode 100644 index 0000000000000000000000000000000000000000..6c767223f774b46c02e309caaf13dc0f3c7214f3 GIT binary patch literal 82729 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%0DJoKdYf%og+zOp;(RwFIqnMFYX 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 kKV#lgD9e?p)j_wWlaV} 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 literal 0 HcmV?d00001 diff --git a/combat.cpp b/combat.cpp new file mode 100644 index 0000000..48d38fb --- /dev/null +++ b/combat.cpp @@ -0,0 +1,16 @@ +#include "combat.hpp" +#include "rand.hpp" + +namespace components { + int Combat::attack(Combat &target) { + int attack = Random::uniform(0,1); + int my_dmg = 0; + + if(attack) { + my_dmg = Random::uniform(1, damage); + target.hp -= my_dmg; + } + + return my_dmg; + } +} diff --git a/combat.hpp b/combat.hpp new file mode 100644 index 0000000..c50f6de --- /dev/null +++ b/combat.hpp @@ -0,0 +1,13 @@ +#pragma once + +namespace components { + struct Combat { + int hp; + int damage; + + /* NOTE: This is used to _mark_ entities as dead, to detect ones that have just died. Don't make attack automatically set it.*/ + bool dead = false; + + int attack(Combat &target); + }; +} diff --git a/components.cpp b/components.cpp new file mode 100644 index 0000000..c5e3893 --- /dev/null +++ b/components.cpp @@ -0,0 +1,37 @@ +#include "components.hpp" + +namespace components { + void configure(DinkyECS::World &world, DinkyECS::Entity entity, json& entity_data) { + for(auto &comp : entity_data["components"]) { + json& config = comp["config"]; + const string comp_type = comp["type"]; + + if(comp_type == "Weapon") { + world.set(entity, {config["damage"]}); + } else if(comp_type == "LightSource") { + world.set(entity, {config["strength"], config["radius"]}); + } else if(comp_type == "Loot") { + world.set(entity, {config["amount"]}); + } else if(comp_type == "Tile") { + world.set(entity, {config["chr"]}); + } else if(comp_type == "EnemyConfig") { + world.set(entity, {config["hearing_distance"]}); + } else if(comp_type == "Combat") { + world.set(entity, {config["hp"], config["damage"]}); + } else if(comp_type == "Curative") { + world.set(entity, {config["hp"]}); + } else if(comp_type == "Motion") { + world.set(entity, {config["dx"], config["dy"], config["random"]}); + } else if(comp_type == "Device") { + Device device{.config=config, .events={}}; + device.configure_events(comp["events"]); + world.set(entity, device); + } else { + dbc::sentinel(fmt::format("ITEM COMPONENT TYPE MISSING: {}", + std::string(comp_type))); + } + + // json config variable dies + } + } +} diff --git a/components.hpp b/components.hpp new file mode 100644 index 0000000..ee0ffae --- /dev/null +++ b/components.hpp @@ -0,0 +1,64 @@ +#pragma once +#include "dinkyecs.hpp" +#include "devices.hpp" +#include "combat.hpp" +#include "inventory.hpp" +#include "tser.hpp" +#include "config.hpp" + +namespace components { + + struct Player { + DinkyECS::Entity entity; + DEFINE_SERIALIZABLE(Player, entity); + }; + + struct Position { + Point location; + DEFINE_SERIALIZABLE(Position, location); + }; + + struct Motion { + int dx; + int dy; + bool random=false; + DEFINE_SERIALIZABLE(Motion, dx, dy); + }; + + struct Loot { + int amount; + DEFINE_SERIALIZABLE(Loot, amount); + }; + + struct Tile { + std::string chr; + DEFINE_SERIALIZABLE(Tile, chr); + }; + + struct GameConfig { + Config game; + Config enemies; + Config items; + Config tiles; + Config devices; + }; + + struct EnemyConfig { + int hearing_distance = 10; + }; + + struct Debug { + bool PATHS=false; + bool LIGHT=false; + }; + + struct Weapon { + int damage = 0; + }; + + struct Curative { + int hp = 10; + }; + + void configure(DinkyECS::World &world, DinkyECS::Entity entity, json& entity_data); +} diff --git a/constants.hpp b/constants.hpp index 3ca14a6..858eefb 100644 --- a/constants.hpp +++ b/constants.hpp @@ -17,3 +17,27 @@ constexpr const bool DEBUG_BUILD=false; #else constexpr const bool DEBUG_BUILD=true; #endif + + +////////// copied from roguish + + +constexpr int INV_WALL = 0; +constexpr int INV_SPACE = 1; +constexpr int WALL_VALUE = 1; +constexpr int SPACE_VALUE = 0; +constexpr int WALL_PATH_LIMIT = 1000; +constexpr int WALL_LIGHT_LEVEL = 3; +constexpr int WORLDBUILD_DIVISION = 4; +constexpr int WORLDBUILD_SHRINK = 2; +constexpr int WORLDBUILD_MAX_PATH = 200; +constexpr int VIDEO_WINDOW_X=1600; +constexpr int VIDEO_WINDOW_Y=900; +constexpr int UI_FONT_SIZE=30; +constexpr int BASE_MAP_FONT_SIZE=90; +constexpr int GAME_MAP_PIXEL_POS = 600; +constexpr int MAX_FONT_SIZE = 140; +constexpr int MIN_FONT_SIZE = 20; +constexpr int STATUS_UI_WIDTH = 40; +constexpr int STATUS_UI_HEIGHT = 30; +constexpr float PERCENT = 0.01f; diff --git a/devices.cpp b/devices.cpp new file mode 100644 index 0000000..1969c20 --- /dev/null +++ b/devices.cpp @@ -0,0 +1,24 @@ +#include "devices.hpp" +#include "events.hpp" +#include "dbc.hpp" + +namespace components { + + /* + * Note: This should go away or at least the event names to + * numbers should probably be automatically created. + */ + void Device::configure_events(json &event_names) { + for(string name : event_names) { + if(name == "Events::GUI::STAIRS_DOWN") { + events.push_back(Events::GUI::STAIRS_DOWN); + } else if(name == "Events::GUI::STAIRS_UP") { + events.push_back(Events::GUI::STAIRS_UP); + } else if(name == "Events::GUI::TRAP") { + events.push_back(Events::GUI::TRAP); + } else { + dbc::sentinel(fmt::format("Unknown device event {}", name)); + } + } + } +} diff --git a/devices.hpp b/devices.hpp new file mode 100644 index 0000000..4df344f --- /dev/null +++ b/devices.hpp @@ -0,0 +1,15 @@ +#pragma once +#include "dinkyecs.hpp" +#include +#include + +namespace components { + using namespace nlohmann; + + struct Device { + json config; + std::vector events; + + void configure_events(json &event_names); + }; +} diff --git a/dinkyecs.hpp b/dinkyecs.hpp new file mode 100644 index 0000000..0d77ccc --- /dev/null +++ b/dinkyecs.hpp @@ -0,0 +1,158 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include "tser.hpp" +#include "dbc.hpp" + +namespace DinkyECS { + + typedef unsigned long Entity; + + using EntityMap = std::unordered_map; + + struct Event { + int event = 0; + Entity entity = 0; + std::any data; + }; + + typedef std::queue EventQueue; + + struct World { + unsigned long entity_count = 0; + std::unordered_map $components; + std::unordered_map $facts; + std::unordered_map $events; + std::vector $constants; + + Entity entity() { + return ++entity_count; + } + + void clone_into(DinkyECS::World &to_world) { + to_world.$constants = $constants; + to_world.$facts = $facts; + to_world.entity_count = entity_count; + + for(auto eid : $constants) { + for(const auto &[tid, eid_map] : $components) { + auto& their_map = to_world.$components[tid]; + if(eid_map.contains(eid)) { + their_map.insert_or_assign(eid, eid_map.at(eid)); + } + } + } + } + + void make_constant(DinkyECS::Entity entity) { + $constants.push_back(entity); + } + + template + EntityMap& entity_map_for() { + return $components[std::type_index(typeid(Comp))]; + } + + template + EventQueue& queue_map_for() { + return $events[std::type_index(typeid(Comp))]; + } + + template + void remove(Entity ent) { + EntityMap &map = entity_map_for(); + map.erase(ent); + } + + template + void set_the(Comp val) { + $facts.insert_or_assign(std::type_index(typeid(Comp)), val); + } + + template + Comp &get_the() { + auto comp_id = std::type_index(typeid(Comp)); + dbc::check($facts.contains(comp_id), + fmt::format("!!!! ATTEMPT to access world fact that hasn't been set yet: {}", typeid(Comp).name())); + + // use .at to get std::out_of_range if fact not set + std::any &res = $facts.at(comp_id); + return std::any_cast(res); + } + + template + bool has_the() { + auto comp_id = std::type_index(typeid(Comp)); + return $facts.contains(comp_id); + } + + template + void set(Entity ent, Comp val) { + EntityMap &map = entity_map_for(); + map.insert_or_assign(ent, val); + } + + template + Comp &get(Entity ent) { + EntityMap &map = entity_map_for(); + // use .at for bounds checking + std::any &res = map.at(ent); + return std::any_cast(res); + } + + template + bool has(Entity ent) { + EntityMap &map = entity_map_for(); + return map.contains(ent); + } + + template + void query(std::function cb) { + EntityMap &map = entity_map_for(); + for(auto& [entity, any_comp] : map) { + Comp &res = std::any_cast(any_comp); + cb(entity, res); + } + } + + template + void query(std::function cb) { + EntityMap &map_a = entity_map_for(); + EntityMap &map_b = entity_map_for(); + + for(auto& [entity, any_a] : map_a) { + if(map_b.contains(entity)) { + CompA &res_a = std::any_cast(any_a); + CompB &res_b = get(entity); + cb(entity, res_a, res_b); + } + } + } + + template + void send(Comp event, Entity entity, std::any data) { + EventQueue &queue = queue_map_for(); + queue.push({event, entity, data}); + } + + template + Event recv() { + EventQueue &queue = queue_map_for(); + Event evt = queue.front(); + queue.pop(); + return evt; + } + + template + bool has_event() { + EventQueue &queue = queue_map_for(); + return !queue.empty(); + } + }; +} diff --git a/events.hpp b/events.hpp new file mode 100644 index 0000000..38f0d5e --- /dev/null +++ b/events.hpp @@ -0,0 +1,12 @@ +#pragma once + +namespace Events { + enum GUI { + START, COMBAT, LOOT, DEATH, STAIRS_UP, STAIRS_DOWN, TRAP + }; + + struct Combat { + int player_did; + int enemy_did; + }; +} diff --git a/inventory.cpp b/inventory.cpp new file mode 100644 index 0000000..ad5fcd8 --- /dev/null +++ b/inventory.cpp @@ -0,0 +1,42 @@ +#include "inventory.hpp" + + +namespace components { + void Inventory::add(InventoryItem new_item) { + for(auto &slot : items) { + if(new_item.data["id"] == slot.data["id"]) { + slot.count += new_item.count; + return; + } + } + + items.push_back(new_item); + } + + InventoryItem& Inventory::get(size_t at) { + dbc::check(at < items.size(), fmt::format("inventory index {} too big", at)); + return items[at]; + } + + bool Inventory::decrease(size_t at, int count) { + dbc::check(at < items.size(), fmt::format("inventory index {} too big", at)); + auto &slot = items[at]; + slot.count -= count; + return slot.count > 0; + } + + void Inventory::erase_item(size_t at) { + dbc::check(at < items.size(), fmt::format("inventory index {} too big", at)); + items.erase(items.begin() + at); + } + + int Inventory::item_index(std::string id) { + for(size_t i = 0; i < items.size(); i++) { + if(items[i].data["id"] == id) { + return i; + } + } + + return -1; + } +} diff --git a/inventory.hpp b/inventory.hpp new file mode 100644 index 0000000..8ba912b --- /dev/null +++ b/inventory.hpp @@ -0,0 +1,33 @@ +#pragma once +#include "lights.hpp" +#include +#include + + +namespace components { + using namespace nlohmann; + using lighting::LightSource; + + struct InventoryItem { + int count; + json data; + }; + + struct Inventory { + int gold=0; + LightSource light{0, 0}; + std::vector items{}; + + size_t count() { return items.size(); } + + void add(InventoryItem item); + + bool decrease(size_t at, int count); + + InventoryItem& get(size_t at); + + int item_index(std::string id); + + void erase_item(size_t at); + }; +} diff --git a/levelmanager.cpp b/levelmanager.cpp new file mode 100644 index 0000000..9cff359 --- /dev/null +++ b/levelmanager.cpp @@ -0,0 +1,70 @@ +#include "levelmanager.hpp" +#include "worldbuilder.hpp" +#include "constants.hpp" +#include "save.hpp" +#include "systems.hpp" +#include "components.hpp" + +using lighting::LightRender; +using std::shared_ptr, std::make_shared; +using namespace components; + +LevelManager::LevelManager() { + create_level(); +} + +LevelScaling LevelManager::scale_level() { + return { + 30 + (5 * int($current_level)), + 20 + (5 * int($current_level)) + }; +} + +size_t LevelManager::create_level(shared_ptr prev_world) { + auto world = make_shared(); + + if(prev_world != nullptr) { + prev_world->clone_into(*world); + } else { + save::load_configs(*world); + } + + auto scaling = scale_level(); + + auto map = make_shared(scaling.map_width, scaling.map_height); + WorldBuilder builder(*map); + builder.generate(*world); + + size_t index = $levels.size(); + + auto collider = make_shared(); + // not sure if this is still needed + System::init_positions(*world, *collider); + + $levels.emplace_back(index, map, world, + make_shared(map->width(), map->height()), + collider); + + dbc::check(index == $levels.size() - 1, "Level index is not the same as $levels.size() - 1, off by one error"); + return index; +} + +GameLevel &LevelManager::next() { + dbc::check($current_level < $levels.size(), "attempt to get next level when at end"); + $current_level++; + return $levels.at($current_level); +} + +GameLevel &LevelManager::previous() { + dbc::check($current_level > 0, "attempt to go to previous level when at 0"); + $current_level--; + return $levels.at($current_level); +} + +GameLevel &LevelManager::current() { + return $levels.at($current_level); +} + +GameLevel &LevelManager::get(size_t index) { + return $levels.at(index); +} diff --git a/levelmanager.hpp b/levelmanager.hpp new file mode 100644 index 0000000..c8bf0f6 --- /dev/null +++ b/levelmanager.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include "dinkyecs.hpp" +#include "lights.hpp" +#include "map.hpp" +#include +#include +#include "spatialmap.hpp" + +using std::shared_ptr; + +struct GameLevel { + size_t index; + shared_ptr map; + shared_ptr world; + shared_ptr lights; + shared_ptr collision; +}; + +struct LevelScaling { + int map_width=40; + int map_height=50; +}; + +class LevelManager { + public: + std::vector $levels; + size_t $current_level = 0; + + LevelManager(); + + size_t create_level(shared_ptr prev_world = nullptr); + GameLevel &next(); + GameLevel &previous(); + GameLevel ¤t(); + size_t current_index() { return $current_level; } + GameLevel &get(size_t index); + LevelScaling scale_level(); +}; diff --git a/lights.cpp b/lights.cpp new file mode 100644 index 0000000..dbd6cf8 --- /dev/null +++ b/lights.cpp @@ -0,0 +1,62 @@ +#include "lights.hpp" +#include "constants.hpp" +#include + +using std::vector; + +namespace lighting { + void LightRender::render_square_light(LightSource source, Point at, PointList &has_light) { + for(matrix::box it{$lightmap, at.x, at.y, (size_t)floor(source.radius)}; it.next();) { + if($paths.$paths[it.y][it.x] != WALL_PATH_LIMIT) { + $lightmap[it.y][it.x] = light_level(source.strength, it.distance(), it.x, it.y); + has_light.emplace_back(it.x, it.y); + } + } + } + + /* + * NOTE: This really doesn't need to calculate light all the time. It doesn't + * change around the light source until the lightsource is changed, so the + * light levels could be placed in a Matrix inside LightSource, calculated once + * and then simply "applied" to the area where the entity is located. The only + * thing that would need to be calculated each time is the walls. + */ + void LightRender::render_light(LightSource source, Point at) { + Point min, max; + clear_light_target(at); + PointList has_light; + + render_square_light(source, at, has_light); + + for(auto point : has_light) { + for(matrix::compass it{$lightmap, point.x, point.y}; it.next();) { + if($paths.$paths[it.y][it.x] == WALL_PATH_LIMIT) { + $lightmap[it.y][it.x] = light_level(source.strength, 1.5f, point.x, point.y); + } + } + } + } + + int LightRender::light_level(int strength, float distance, size_t x, size_t y) { + int new_level = distance <= 1.0f ? strength : strength / sqrt(distance); + int cur_level = $lightmap[y][x]; + return cur_level < new_level ? new_level : cur_level; + } + + + void LightRender::reset_light() { + matrix::assign($lightmap, lighting::MIN); + } + + void LightRender::clear_light_target(const Point &at) { + $paths.clear_target(at); + } + + void LightRender::set_light_target(const Point &at, int value) { + $paths.set_target(at, value); + } + + void LightRender::path_light(Matrix &walls) { + $paths.compute_paths(walls); + } +} diff --git a/lights.hpp b/lights.hpp new file mode 100644 index 0000000..5faabcc --- /dev/null +++ b/lights.hpp @@ -0,0 +1,46 @@ +#pragma once +#include +#include "dbc.hpp" +#include "point.hpp" +#include +#include "matrix.hpp" +#include "pathing.hpp" + +namespace lighting { + + struct LightSource { + int strength = 0; + float radius = 1.0f; + }; + + const int MIN = 30; + const int MAX = 105; + + class LightRender { + public: + size_t $width; + size_t $height; + Matrix $lightmap; + Pathing $paths; + + LightRender(size_t width, size_t height) : + $width(width), + $height(height), + $lightmap(height, matrix::Row(width, 0)), + $paths(width, height) + {} + + void reset_light(); + void set_light_target(const Point &at, int value=0); + void clear_light_target(const Point &at); + void path_light(Matrix &walls); + void light_box(LightSource source, Point from, Point &min_out, Point &max_out); + int light_level(int level, float distance, size_t x, size_t y); + void render_light(LightSource source, Point at); + void render_square_light(LightSource source, Point at, PointList &has_light); + void render_compass_light(LightSource source, Point at, PointList &has_light); + void render_circle_light(LightSource source, Point at, PointList &has_light); + Matrix &lighting() { return $lightmap; } + Matrix &paths() { return $paths.paths(); } + }; +} diff --git a/main.cpp b/main.cpp index 7a56942..7d9b05e 100644 --- a/main.cpp +++ b/main.cpp @@ -7,15 +7,15 @@ #include "stats.hpp" Matrix MAP{ - {1,1,1,1,1,1,1,1,1}, + {1,1,1,3,2,3,1,1,1}, {1,0,1,0,0,0,0,0,1}, {1,0,1,0,0,1,1,0,1}, - {1,0,0,0,0,0,0,0,1}, - {1,1,0,0,0,0,0,1,1}, - {1,0,0,1,1,1,0,0,1}, + {3,0,0,0,0,0,0,0,3}, + {2,1,0,0,0,0,0,1,2}, + {3,0,0,1,1,1,0,0,3}, {1,0,0,0,0,0,1,1,1}, {1,0,0,0,0,0,0,0,1}, - {1,1,1,1,1,1,1,1,1} + {1,1,1,3,2,3,1,1,1} }; void draw_gui(sf::RenderWindow &window, sf::Text &text, Stats &stats) { diff --git a/map.cpp b/map.cpp new file mode 100644 index 0000000..080d7f9 --- /dev/null +++ b/map.cpp @@ -0,0 +1,235 @@ +#include "map.hpp" +#include "dbc.hpp" +#include "rand.hpp" +#include +#include +#include +#include +#include "matrix.hpp" + +using std::vector, std::pair; +using namespace fmt; + +Map::Map(size_t width, size_t height) : + $width(width), + $height(height), + $tiles(width, height), + $walls(height, matrix::Row(width, SPACE_VALUE)), + $paths(width, height) +{} + +Map::Map(Matrix &walls, Pathing &paths) : + $tiles(matrix::width(walls), matrix::height(walls)), + $walls(walls), + $paths(paths) +{ + $width = matrix::width(walls); + $height = matrix::height(walls); +} + +void Map::make_paths() { + INVARIANT(); + $paths.compute_paths($walls); +} + +bool Map::inmap(size_t x, size_t y) { + return x < $width && y < $height; +} + +void Map::set_target(const Point &at, int value) { + $paths.set_target(at, value); +} + +void Map::clear_target(const Point &at) { + $paths.clear_target(at); +} + +bool Map::place_entity(size_t room_index, Point &out) { + dbc::check(room_index < $rooms.size(), "room_index is out of bounds, not enough rooms"); + + Room &start = $rooms[room_index]; + + for(matrix::rando_rect it{$walls, start.x, start.y, start.width, start.height}; it.next();) { + if(!iswall(it.x, it.y)) { + out.x = it.x; + out.y = it.y; + return true; + } + } + + return false; +} + +bool Map::iswall(size_t x, size_t y) { + return $walls[y][x] == WALL_VALUE; +} + +void Map::dump(int show_x, int show_y) { + matrix::dump("WALLS", walls(), show_x, show_y); + matrix::dump("PATHS", paths(), show_x, show_y); +} + +bool Map::can_move(Point move_to) { + 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) { + return {loc.x - cam_orig.x, loc.y - cam_orig.y}; +} + +Point Map::center_camera(const Point &around, size_t view_x, size_t view_y) { + int high_x = int(width() - view_x); + int high_y = int(height() - view_y); + int center_x = int(around.x - view_x / 2); + int center_y = int(around.y - view_y / 2); + + size_t start_x = high_x > 0 ? std::clamp(center_x, 0, high_x) : 0; + size_t start_y = high_y > 0 ? std::clamp(center_y, 0, high_y) : 0; + + return {start_x, start_y}; +} + +/* + * Finds the next optimal neighbor in the path + * using either a direct or random method. + * + * Both modes will pick a random direction to start + * looking for the next path, then it goes clock-wise + * from there. + * + * In the direct method it will attempt to find + * a path that goes 1 lower in the dijkstra map + * path, and if it can't find that it will go to + * a 0 path (same number). + * + * In random mode it will pick either the next lower + * or the same level depending on what it finds first. + * Since the starting direction is random this will + * give it a semi-random walk that eventually gets to + * the target. + * + * In map generation this makes random paths and carves + * up the space to make rooms more irregular. + * + * When applied to an enemy they will either go straight + * to the player (random=false) or they'll wander around + * drunkenly gradually reaching the player, and dodging + * in and out. + */ +bool Map::neighbors(Point &out, bool random) { + Matrix &paths = $paths.$paths; + bool zero_found = false; + + // just make a list of the four directions + std::array dirs{{ + {out.x,out.y-1}, // north + {out.x+1,out.y}, // east + {out.x,out.y+1}, // south + {out.x-1,out.y} // west + }}; + + // get the current dijkstra number + int cur = paths[out.y][out.x]; + + // pick a random start of directions + // BUG: is uniform inclusive of the dir.size()? + int rand_start = Random::uniform(0, dirs.size()); + + // go through all possible directions + for(size_t i = 0; i < dirs.size(); i++) { + // but start at the random start, effectively randomizing + // which valid direction to go + // BUG: this might be wrong given the above ranom from 0-size + Point dir = dirs[(i + rand_start) % dirs.size()]; + if(!inmap(dir.x, dir.y)) continue; //skip unpathable stuff + int weight = cur - paths[dir.y][dir.x]; + + if(weight == 1) { + // no matter what we follow direct paths + out = dir; + return true; + } else if(random && weight == 0) { + // if random is selected and it's a 0 path take it + out = dir; + return true; + } else if(weight == 0) { + // otherwise keep the last zero path for after + out = dir; + zero_found = true; + } + } + + // if we reach this then either zero was found and + // zero_found is set true, or it wasn't and nothing found + return zero_found; +} + +bool Map::INVARIANT() { + using dbc::check; + + check($walls.size() == height(), "walls wrong height"); + check($walls[0].size() == width(), "walls wrong width"); + check($paths.$width == width(), "in Map paths width don't match map width"); + check($paths.$height == height(), "in Map paths height don't match map height"); + + for(auto room : $rooms) { + check(int(room.x) >= 0 && int(room.y) >= 0, + format("room invalid position {},{}", + room.x, room.y)); + check(int(room.width) > 0 && int(room.height) > 0, + format("room has invalid dims {},{}", + room.width, room.height)); + } + + return true; +} + +void Map::load_tiles() { + $tiles.load($walls); +} + +void Map::expand() { + // adjust width first + for(auto &row : $walls) { + row.insert(row.begin(), WALL_VALUE); + row.push_back(WALL_VALUE); + } + $width = matrix::width($walls); + + // then add two new rows top/bottom of that new width + $walls.insert($walls.begin(), matrix::Row($width, WALL_VALUE)); + $walls.push_back(matrix::Row($width, WALL_VALUE)); + // now we have the new height + $height = matrix::height($walls); + + // reset the pathing and tiles and done + $paths = Pathing($width, $height); + $tiles = TileMap($width, $height); +} + +void Map::add_room(Room &room) { + room.x++; + room.y++; + room.width--; + room.height--; + + if(room.x + room.width >= $width) { + // fix the width + room.x--; + } + + if(room.y + room.height >= $height) { + // fix the height + room.y--; + } + + $rooms.push_back(room); +} + +void Map::invert_space() { + for(matrix::each_cell it{$walls}; it.next();) { + int is_wall = !$walls[it.y][it.x]; + $walls[it.y][it.x] = is_wall; + } +} diff --git a/map.hpp b/map.hpp new file mode 100644 index 0000000..0c69f0a --- /dev/null +++ b/map.hpp @@ -0,0 +1,75 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include "point.hpp" +#include "tser.hpp" +#include "lights.hpp" +#include "pathing.hpp" +#include "matrix.hpp" +#include "constants.hpp" +#include "tilemap.hpp" + +using lighting::LightSource; + +struct Room { + size_t x = 0; + size_t y = 0; + size_t width = 0; + size_t height = 0; + Point entry{(size_t)-1, (size_t)-1}; + Point exit{(size_t)-1, (size_t)-1}; + + DEFINE_SERIALIZABLE(Room, x, y, width, height); +}; + +class Map { +public: + size_t $width; + size_t $height; + TileMap $tiles; + Matrix $walls; + Pathing $paths; + std::vector $rooms; + + Map(size_t width, size_t height); + + Map(Matrix &walls, Pathing &paths); + + Matrix& paths() { return $paths.paths(); } + TileMap& tiles() { return $tiles; } + Matrix& input_map() { return $paths.input(); } + Matrix& walls() { return $walls; } + size_t width() { return $width; } + size_t height() { return $height; } + int distance(Point to) { return $paths.distance(to); } + + Room &room(size_t at) { return $rooms[at]; } + size_t room_count() { return $rooms.size(); } + + bool place_entity(size_t room_index, Point &out); + bool inmap(size_t x, size_t y); + bool iswall(size_t x, size_t y); + bool can_move(Point move_to); + // BUG: this isn't really neighbors anymore. Maybe move? Walk? + bool neighbors(Point &out, bool random=false); + + void make_paths(); + void set_target(const Point &at, int value=0); + void clear_target(const Point &at); + + Point map_to_camera(const Point &loc, const Point &cam_orig); + Point center_camera(const Point &around, size_t view_x, size_t view_y); + + void expand(); + + void dump(int show_x=-1, int show_y=-1); + bool INVARIANT(); + + void load_tiles(); + void add_room(Room &room); + void invert_space(); +}; diff --git a/matrix.cpp b/matrix.cpp index 85301ee..e3f9ed9 100644 --- a/matrix.cpp +++ b/matrix.cpp @@ -3,77 +3,12 @@ #include #include #include +#include "constants.hpp" using namespace fmt; using std::min, std::max; namespace matrix { - - flood::flood(Matrix &mat, Point start, int old_val, int new_val) : - mat(mat), start(start), old_val(old_val), new_val(new_val), - x(start.x), y(start.y), dirs{mat, start.x, start.y} - { - dbc::check(old_val != new_val, "what you doing?"); - current_loc = start; - q.push(start); - } - - bool flood::next() { - if(!q.empty()) { - if(!dirs.next()) { - // box is done reset it - auto current_loc = q.front(); - q.pop(); - - dirs = matrix::compass{mat, current_loc.x, current_loc.y}; - dirs.next(); - } - - // get the next thing - if(mat[dirs.y][dirs.x] <= old_val) { - mat[dirs.y][dirs.x] = new_val; - x = dirs.x; - y = dirs.y; - - q.push({.x=dirs.x, .y=dirs.y}); - } - - return true; - } else { - return false; - } - } - - line::line(Point start, Point end) : - x(start.x), y(start.y), - x1(end.x), y1(end.y) - { - dx = std::abs(x1 - x); - sx = x < x1 ? 1 : -1; - dy = std::abs(y1 - y) * -1; - sy = y < y1 ? 1 : -1; - error = dx + dy; - } - - bool line::next() { - if(x != x1 || y != y1) { - int e2 = 2 * error; - - if(e2 >= dy) { - error = error + dy; - x = x + sx; - } - - if(e2 <= dx) { - error = error + dx; - y = y + sy; - } - return true; - } else { - return false; - } - } - void dump(const std::string &msg, Matrix &map, int show_x, int show_y) { println("----------------- {}", msg); @@ -82,6 +17,8 @@ namespace matrix { if(int(it.x) == show_x && int(it.y) == show_y) { print("{:x}<", cell); + } else if(cell == WALL_PATH_LIMIT) { + print("# "); } else if(cell > 15) { print("* "); } else { diff --git a/matrix.hpp b/matrix.hpp index e07488e..3974043 100644 --- a/matrix.hpp +++ b/matrix.hpp @@ -3,325 +3,49 @@ #include #include #include +#include +#include #include #include "point.hpp" +#include "rand.hpp" +#include "dbc.hpp" +#include "shiterator.hpp" namespace matrix { - using std::vector, std::queue, std::array; - using std::min, std::max, std::floor; + using Row = shiterator::BaseRow; + using Matrix = shiterator::Base; - template - using BaseRow = vector; + using viewport = shiterator::viewport_t; - template - using Base = vector>; + using each_cell = shiterator::each_cell_t; - using Row = vector; - using Matrix = vector; + using each_row = shiterator::each_row_t; + using box = shiterator::box_t; + using compass = shiterator::compass_t; + using circle = shiterator::circle_t; + using rectangle = shiterator::rectangle_t; + using rando_rect = shiterator::rando_rect_t; + using line = shiterator::line; - - /* - * Just a quick thing to reset a matrix to a value. - */ - template - inline void assign(MAT &out, VAL new_value) { - for(auto &row : out) { - row.assign(row.size(), new_value); - } - } - - template - inline bool inbounds(MAT &mat, size_t x, size_t y) { - // since Point.x and Point.y are size_t any negatives are massive - bool res = (y < mat.size()) && (x < mat[0].size()); - return res; - } - - template - inline size_t width(MAT &mat) { - return mat[0].size(); - } - - template - inline size_t height(MAT &mat) { - return mat.size(); - } - - template - inline Base make_base(size_t width, size_t height) { - Base result(height, BaseRow(width)); - return result; - } + void dump(const std::string &msg, Matrix &map, int show_x=-1, int show_y=-1); inline Matrix make(size_t width, size_t height) { - Matrix result(height, Row(width)); - return result; + return shiterator::make(width, height); } - inline size_t next_x(size_t x, size_t width) { - return (x + 1) * ((x + 1) < width); + inline bool inbounds(Matrix &mat, size_t x, size_t y) { + return shiterator::inbounds(mat, x, y); } - inline size_t next_y(size_t x, size_t y) { - return y + (x == 0); + inline size_t width(Matrix &mat) { + return shiterator::width(mat); } - inline bool at_end(size_t y, size_t height) { - return y < height; + inline size_t height(Matrix &mat) { + return shiterator::height(mat); } - inline bool end_row(size_t x, size_t width) { - return x == width - 1; + inline void assign(Matrix &out, int new_value) { + shiterator::assign(out, new_value); } - - void dump(const std::string &msg, Matrix &map, int show_x=-1, int show_y=-1); - - template - struct each_cell_t { - size_t x = ~0; - size_t y = ~0; - size_t width = 0; - size_t height = 0; - - each_cell_t(MAT &mat) - { - height = matrix::height(mat); - width = matrix::width(mat); - } - - bool next() { - x = next_x(x, width); - y = next_y(x, y); - return at_end(y, height); - } - }; - - template - struct viewport_t { - Point start; - // this is the point in the map - size_t x; - size_t y; - // this is the point inside the box, start at 0 - size_t view_x = ~0; - size_t view_y = ~0; - // viewport width/height - size_t width; - size_t height; - - viewport_t(MAT &mat, Point start, int max_x, int max_y) : - start(start), - x(start.x-1), - y(start.y-1) - { - width = std::min(size_t(max_x), matrix::width(mat) - start.x); - height = std::min(size_t(max_y), matrix::height(mat) - start.y); - fmt::println("viewport_t max_x, max_y {},{} vs matrix {},{}, x={}, y={}", - max_x, max_y, matrix::width(mat), matrix::height(mat), x, y); - } - - bool next() { - y = next_y(x, y); - x = next_x(x, width); - view_x = next_x(view_x, width); - view_y = next_y(view_x, view_y); - return at_end(y, height); - } - }; - - using viewport = viewport_t; - - using each_cell = each_cell_t; - - template - struct each_row_t { - size_t x = ~0; - size_t y = ~0; - size_t width = 0; - size_t height = 0; - bool row = false; - - each_row_t(MAT &mat) { - height = matrix::height(mat); - width = matrix::width(mat); - } - - bool next() { - x = next_x(x, width); - y = next_y(x, y); - row = end_row(x, width); - return at_end(y, height); - } - }; - - using each_row = each_row_t; - - template - struct box_t { - size_t from_x; - size_t from_y; - size_t x = 0; // these are set in constructor - size_t y = 0; // again, no fancy ~ trick needed - size_t left = 0; - size_t top = 0; - size_t right = 0; - size_t bottom = 0; - - box_t(MAT &mat, size_t at_x, size_t at_y, size_t size) : - box_t(mat, at_x, at_y, size, size) { - } - - box_t(MAT &mat, size_t at_x, size_t at_y, size_t width, size_t height) : - from_x(at_x), from_y(at_y) - { - size_t h = matrix::height(mat); - size_t w = matrix::width(mat); - - // keeps it from going below zero - // need extra -1 to compensate for the first next() - left = max(from_x, width) - width; - x = left - 1; // must be -1 for next() - // keeps it from going above width - right = min(from_x + width + 1, w); - - // same for these two - top = max(from_y, height) - height; - y = top - (left == 0); - bottom = min(from_y + height + 1, h); - } - - bool next() { - // calc next but allow to go to 0 for next - x = next_x(x, right); - // x will go to 0, which signals new line - y = next_y(x, y); // this must go here - // if x==0 then this moves it to min_x - x = max(x, left); - // and done - - return at_end(y, bottom); - } - - float distance() { - int dx = from_x - x; - int dy = from_y - y; - - return sqrt((dx * dx) + (dy * dy)); - } - }; - - using box = box_t; - - template - struct compass_t { - size_t x = 0; // these are set in constructor - size_t y = 0; // again, no fancy ~ trick needed - array x_dirs{0, 1, 0, -1}; - array y_dirs{-1, 0, 1, 0}; - size_t max_dirs=0; - size_t dir = ~0; - - compass_t(MAT &mat, size_t x, size_t y) : - x(x), y(y) - { - array x_in{0, 1, 0, -1}; - array y_in{-1, 0, 1, 0}; - - for(size_t i = 0; i < 4; i++) { - int nx = x + x_in[i]; - int ny = y + y_in[i]; - if(matrix::inbounds(mat, nx, ny)) { - x_dirs[max_dirs] = nx; - y_dirs[max_dirs] = ny; - max_dirs++; - } - } - } - - bool next() { - dir++; - if(dir < max_dirs) { - x = x_dirs[dir]; - y = y_dirs[dir]; - return true; - } else { - return false; - } - } - }; - - using compass = compass_t; - - struct flood { - Matrix &mat; - Point start; - int old_val; - int new_val; - queue q; - Point current_loc; - int x; - int y; - matrix::compass dirs; - - flood(Matrix &mat, Point start, int old_val, int new_val); - bool next(); - bool next_working(); - }; - - struct line { - int x; - int y; - int x1; - int y1; - int sx; - int sy; - int dx; - int dy; - int error; - - line(Point start, Point end); - bool next(); - }; - - template - struct circle_t { - float center_x; - float center_y; - float radius = 0.0f; - int y = 0; - int dx = 0; - int dy = 0; - int left = 0; - int right = 0; - int top = 0; - int bottom = 0; - int width = 0; - int height = 0; - - circle_t(MAT &mat, Point center, float radius) : - center_x(center.x), center_y(center.y), radius(radius) - { - width = matrix::width(mat); - height = matrix::height(mat); - top = max(int(floor(center_y - radius)), 0); - bottom = min(int(floor(center_y + radius)), height - 1); - - y = top; - } - - bool next() { - y++; - if(y <= bottom) { - dy = y - center_y; - dx = floor(sqrt(radius * radius - dy * dy)); - left = max(0, int(center_x) - dx); - right = min(width, int(center_x) + dx + 1); - return true; - } else { - return false; - } - } - }; - - using circle = circle_t; } diff --git a/meson.build b/meson.build index d3f62f3..58464ca 100644 --- a/meson.build +++ b/meson.build @@ -5,14 +5,17 @@ project('raycaster', 'cpp', 'cpp_args=-D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1', ]) +# use this for common options only for our executables +cpp_args=[] +# these are passed as override_defaults exe_defaults = ['warning_level=2', 'werror=true'] + cc = meson.get_compiler('cpp') -tracy = dependency('tracy', static: true) catch2 = dependency('catch2-with-main') fmt = dependency('fmt', allow_fallback: true) -freetype2 = dependency('freetype2') json = dependency('nlohmann_json') +freetype2 = dependency('freetype2') opengl32 = cc.find_library('opengl32', required: true) winmm = cc.find_library('winmm', required: true) gdi32 = cc.find_library('gdi32', required: true) @@ -28,49 +31,57 @@ sfml_network = dependency('sfml_network') sfml_system = dependency('sfml_system') sfml_window = dependency('sfml_window') -if get_option('tracy_enable') and get_option('buildtype') != 'debugoptimized' - warning('Profiling builds should set --buildtype=debugoptimized') -endif - dependencies = [ fmt, json, opengl32, freetype2, flac, ogg, vorbis, vorbisfile, vorbisenc, winmm, gdi32, sfml_audio, sfml_graphics, sfml_main, sfml_network, sfml_system, - sfml_window, tracy + sfml_window ] -# use this for common options only for our executables -cpp_args=[] - -executable('runtests', [ +sources = [ + 'animator.cpp', + 'combat.cpp', + 'components.cpp', + 'config.cpp', 'dbc.cpp', + 'devices.cpp', + 'inventory.cpp', + 'levelmanager.cpp', + 'lights.cpp', + 'map.cpp', + 'matrix.cpp', 'matrix.cpp', + 'pathing.cpp', + 'rand.cpp', + 'raycaster.cpp', + 'save.cpp', + 'shiterator.hpp', + 'spatialmap.cpp', + 'stats.cpp', + 'systems.cpp', + 'texture.cpp', + 'tilemap.cpp', + 'worldbuilder.cpp', +] + +executable('runtests', sources + [ 'tests/base.cpp', + 'tests/dbc.cpp', + 'tests/inventory.cpp', + 'tests/levelmanager.cpp', + 'tests/lighting.cpp', + 'tests/map.cpp', + 'tests/matrix.cpp', + 'tests/pathing.cpp', + 'tests/spatialmap.cpp', + 'tests/tilemap.cpp', + 'tests/worldbuilder.cpp', ], override_options: exe_defaults, dependencies: dependencies + [catch2]) -executable('zedcaster', [ - 'dbc.cpp', - 'matrix.cpp', - 'config.cpp', - 'texture.cpp', - 'raycaster.cpp', - 'animator.cpp', - 'stats.cpp', - 'main.cpp' - ], +executable('zedcaster', + sources + [ 'main.cpp' ], cpp_args: cpp_args, override_options: exe_defaults, dependencies: dependencies) - -executable('amtcaster', [ - 'dbc.cpp', - 'config.cpp', - 'amt/texture.cpp', - 'amt/raycaster.cpp', - 'amt/main.cpp' - ], - cpp_args: ['-std=c++23'], - override_options: exe_defaults, - dependencies: dependencies) diff --git a/pathing.cpp b/pathing.cpp new file mode 100644 index 0000000..8cc3bba --- /dev/null +++ b/pathing.cpp @@ -0,0 +1,86 @@ +#include "constants.hpp" +#include "pathing.hpp" +#include "dbc.hpp" +#include + +using std::vector; + +inline void add_neighbors(PointList &neighbors, Matrix &closed, size_t y, size_t x) { + for(matrix::box it{closed, x, y, 1}; it.next();) { + if(closed[it.y][it.x] == 0) { + closed[it.y][it.x] = 1; + neighbors.emplace_back(it.x, it.y); + } + } +} + +/* + * Used https://github.com/HenrYxZ/dijkstra-map as a reference. + */ +void Pathing::compute_paths(Matrix &walls) { + INVARIANT(); + dbc::check(walls[0].size() == $width, + fmt::format("Pathing::compute_paths called with walls.width={} but paths $width={}", walls[0].size(), $width)); + + dbc::check(walls.size() == $height, + fmt::format("Pathing::compute_paths called with walls.height={} but paths $height={}", walls[0].size(), $height)); + + // Initialize the new array with every pixel at limit distance + matrix::assign($paths, WALL_PATH_LIMIT); + + Matrix closed = walls; + PointList starting_pixels; + PointList open_pixels; + + // First pass: Add starting pixels and put them in closed + for(size_t counter = 0; counter < $height * $width; counter++) { + size_t x = counter % $width; + size_t y = counter / $width; + if($input[y][x] == 0) { + $paths[y][x] = 0; + closed[y][x] = 1; + starting_pixels.emplace_back(x,y); + } + } + + // Second pass: Add border to open + for(auto sp : starting_pixels) { + add_neighbors(open_pixels, closed, sp.y, sp.x); + } + + // Third pass: Iterate filling in the open list + int counter = 1; // leave this here so it's available below + for(; counter < WALL_PATH_LIMIT && !open_pixels.empty(); ++counter) { + PointList next_open; + for(auto sp : open_pixels) { + $paths[sp.y][sp.x] = counter; + add_neighbors(next_open, closed, sp.y, sp.x); + } + open_pixels = next_open; + } + + // Last pass: flood last pixels + for(auto sp : open_pixels) { + $paths[sp.y][sp.x] = counter; + } +} + +void Pathing::set_target(const Point &at, int value) { + // FUTURE: I'll eventually allow setting this to negatives for priority + $input[at.y][at.x] = value; +} + +void Pathing::clear_target(const Point &at) { + $input[at.y][at.x] = 1; +} + +bool Pathing::INVARIANT() { + using dbc::check; + + check($paths.size() == $height, "paths wrong height"); + check($paths[0].size() == $width, "paths wrong width"); + check($input.size() == $height, "input wrong height"); + check($input[0].size() == $width, "input wrong width"); + + return true; +} diff --git a/pathing.hpp b/pathing.hpp new file mode 100644 index 0000000..4fa71fd --- /dev/null +++ b/pathing.hpp @@ -0,0 +1,30 @@ +#pragma once +#include "point.hpp" +#include "matrix.hpp" +#include + +using matrix::Matrix; + +class Pathing { +public: + size_t $width; + size_t $height; + Matrix $paths; + Matrix $input; + + Pathing(size_t width, size_t height) : + $width(width), + $height(height), + $paths(height, matrix::Row(width, 1)), + $input(height, matrix::Row(width, 1)) + {} + + void compute_paths(Matrix &walls); + void set_target(const Point &at, int value=0); + void clear_target(const Point &at); + Matrix &paths() { return $paths; } + Matrix &input() { return $input; } + int distance(Point to) { return $paths[to.y][to.x];} + + bool INVARIANT(); +}; diff --git a/point.hpp b/point.hpp index 42ed9db..50e57cd 100644 --- a/point.hpp +++ b/point.hpp @@ -1,5 +1,6 @@ #pragma once #include +#include "tser.hpp" struct Point { size_t x = 0; @@ -8,11 +9,13 @@ struct Point { bool operator==(const Point& other) const { return other.x == x && other.y == y; } + + DEFINE_SERIALIZABLE(Point, x, y); }; typedef std::vector PointList; -struct PointHash { +template<> struct std::hash { size_t operator()(const Point& p) const { return std::hash()(p.x) ^ std::hash()(p.y); } diff --git a/rand.cpp b/rand.cpp new file mode 100644 index 0000000..25d77d7 --- /dev/null +++ b/rand.cpp @@ -0,0 +1,6 @@ +#include "rand.hpp" + +namespace Random { + std::random_device RNG; + std::mt19937 GENERATOR(RNG()); +} diff --git a/rand.hpp b/rand.hpp new file mode 100644 index 0000000..359c2b5 --- /dev/null +++ b/rand.hpp @@ -0,0 +1,28 @@ +#pragma once +#include + + +namespace Random { + extern std::mt19937 GENERATOR; + + template + T uniform(T from, T to) { + std::uniform_int_distribution rand(from, to); + + return rand(GENERATOR); + } + + template + T uniform_real(T from, T to) { + std::uniform_real_distribution rand(from, to); + + return rand(GENERATOR); + } + + template + T normal(T from, T to) { + std::normal_distribution rand(from, to); + + return rand(GENERATOR); + } +} diff --git a/save.cpp b/save.cpp new file mode 100644 index 0000000..031c81b --- /dev/null +++ b/save.cpp @@ -0,0 +1,96 @@ +#include "save.hpp" +#include +#include "dbc.hpp" +#include +#include "config.hpp" +#include + +using namespace components; +using namespace fmt; + +template +inline void extract(DinkyECS::World &world, std::map &into) { + auto from_world = world.entity_map_for(); + for(auto [entity, value] : from_world) { + into[entity] = std::any_cast(value); + } +} + +void save::to_file(fs::path path, DinkyECS::World &world, Map &map) { + SaveData save_data; + tser::BinaryArchive archive; + + save_data.facts.player = world.get_the(); + save_data.map = MapData{ + map.$width, map.$height, + map.$rooms, map.$walls}; + + // BUG: lights aren't saved/restored + extract(world, save_data.position); + extract(world, save_data.combat); + extract(world, save_data.motion); + extract(world, save_data.tile); + // extract(world, save_data.inventory); + + archive.save(save_data); + std::string_view archive_view = archive.get_buffer(); + + std::ofstream out(path, std::ios::binary); + out << archive_view; + out.flush(); +} + +template +inline void inject(DinkyECS::World &world, std::map &outof) { + for(auto [entity, value] : outof) { + world.set(entity, value); + } +} + +void save::from_file(fs::path path, DinkyECS::World &world_out, Map &map_out) { + tser::BinaryArchive archive(0); + dbc::check(fs::exists(path), format("save file does not exist {}", path.string())); + auto size = fs::file_size(path); + + if(std::ifstream in_file{path, std::ios::binary}) { + std::string in_data(size, '\0'); + + if(in_file.read(&in_data[0], size)) { + std::string_view in_view(in_data); + archive.initialize(in_view); + } else { + dbc::sentinel(format("wrong size or error reading {}", path.string())); + } + } else { + dbc::sentinel(format("failed to load file {}", path.string())); + } + + auto save_data = archive.load(); + + world_out.set_the(save_data.facts.player); + inject(world_out, save_data.position); + inject(world_out, save_data.combat); + inject(world_out, save_data.motion); + inject(world_out, save_data.tile); + // inject(world_out, save_data.inventory); + + size_t width = save_data.map.width; + size_t height = save_data.map.height; + + Pathing paths(width, height); + map_out = Map(save_data.map.walls, paths); + + save::load_configs(world_out); +} + +void save::load_configs(DinkyECS::World &world) { + Config game("./assets/config.json"); + Config enemies("./assets/enemies.json"); + Config items("./assets/items.json"); + Config tiles("./assets/tiles.json"); + Config devices("./assets/devices.json"); + + world.set_the({ + game, enemies, items, tiles, devices + }); +} diff --git a/save.hpp b/save.hpp new file mode 100644 index 0000000..7f3149a --- /dev/null +++ b/save.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include "components.hpp" +#include "map.hpp" +#include "dinkyecs.hpp" +#include "tser.hpp" +#include +#include +#include + +namespace save { + namespace fs = std::filesystem; + + struct MapData { + size_t width; + size_t height; + std::vector rooms; + Matrix walls; + + DEFINE_SERIALIZABLE(MapData, width, height, rooms, walls); + }; + + struct Facts { + components::Player player; + + DEFINE_SERIALIZABLE(Facts, player); + }; + + struct SaveData { + Facts facts; + MapData map; + + std::map position; + std::map motion; + std::map combat; + std::map tile; + // std::map inventory; + + DEFINE_SERIALIZABLE(SaveData, facts, map, position, motion, combat, tile); + }; + + void to_file(fs::path path, DinkyECS::World &world, Map &map); + void from_file(fs::path path, DinkyECS::World &world_out, Map &map); + void load_configs(DinkyECS::World &world); +} diff --git a/shiterator.hpp b/shiterator.hpp new file mode 100644 index 0000000..434107d --- /dev/null +++ b/shiterator.hpp @@ -0,0 +1,607 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include "point.hpp" +#include "rand.hpp" +#include "dbc.hpp" + +/* + * # What is This Shit? + * + * Announcing the Shape Iterators, or "shiterators" for short. The best shite + * for C++ for-loops since that [one youtube + * video](https://www.youtube.com/watch?v=rX0ItVEVjHc) told everyone to + * recreate SQL databases with structs. You could also say these are Shaw's + * Iterators, but either way they are the _shite_. Or are they shit? You decide. + * Maybe they're "shite"? + * + * A shiterator is a simple generator that converts 2D shapes into a 1D stream + * of x/y coordinates. You give it a matrix, some parameters like start, end, + * etc. and each time you call `next()` you get the next viable x/y coordinate to + * complete the shape. This makes them far superior to _any_ existing for-loop + * technology because shiterators operate _intelligently_ in shapes. Other + * [programming pundits](https://www.youtube.com/watch?v=tD5NrevFtbU) will say + * their 7000 line "easy to maintain" switch statements are better at drawing + * shapes, but they're wrong. My way of making a for-loop do stuff is vastly + * superior because it doesn't use a switch _or_ a virtual function _or_ + * inheritance at all. That means they have to be the _fastest_. Feel free to run + * them 1000 times and bask in the glory of 1 nanosecond difference performance. + * + * It's science and shite. + * + * More importantly, shiterators are simple and easy to use. They're so easy to + * use you _don't even use the 3rd part of the for-loop_. What? You read that right, + * not only have I managed to eliminate _both_ massive horrible to maintain switches, + * and also avoided virtual functions, but I've also _eliminated one entire part + * of the for-loop_. This obviously makes them way faster than other inferior + * three-clause-loop-trash. Just look at this comparison: + * + * ```cpp + * for(it = trash.begin(); it != trash.end(); it++) { + * std::cout << it << std::endl; + * } + * ``` + * + * ```cpp + * for(each_cell it{mat}; it.next();) { + * std::cout << mat[it.y][it.x] << std::endl; + * } + * ``` + * + * Obviously this will outperform _any_ iterator invented in the last 30 years, but the best + * thing about shiterators is their composability and ability to work simultaneously across + * multiple matrices in one loop: + * + * ```cpp + * for(line it{start, end}; it.next();) { + * for(compass neighbor{walls, it.x, it.y}; neighbor.next();) { + * if(walls[neighbor.y][neighbor.x] == 1) { + * wall_update[it.y][it.x] = walls[it.y][it.x] + 10; + * } + * } + * } + * ``` + * + * This code sample (maybe, because I didn't run it) draws a line from + * `start` to `end` then looks at each neighbor on a compass (north, south, east, west) + * at each point to see if it's set to 1. If it is then it copies that cell over to + * another matrix with +10. Why would you need this? Your Wizard just shot a fireball + * down a corridor and you need to see if anything in the path is within 1 square of it. + * + * You _also_ don't even need to use a for-loop. Yes, you can harken back to the old + * days when we did everything RAW inside a Duff's Device between a while-loop for + * that PERFORMANCE because who cares about maintenance? You're a game developer! Tests? + * Don't need a test if it runs fine on Sony Playstation only. Maintenance? You're moving + * on to the next project in two weeks anyway right?! Use that while-loop and a shiterator + * to really help that next guy: + * + * ```cpp + * box it{walls, center_x, center_y, 20}; + * while(it.next()) { + * walls[it.y][it.x] = 1; + * } + * ``` + * + * ## Shiterator "Guarantees" + * + * Just like Rust [guarantees no memory leaks](https://github.com/pop-os/cosmic-comp/issues/1133), + * a shiterator tries to ensure a few things, if it can: + * + * 1. All x/y values will be within the Matrix you give it. The `line` shiterator doesn't though. + * 2. They try to not store anything and only calculate the math necessary to linearlize the shape. + * 3. You can store them and incrementally call next to get the next value. + * 4. You should be able to compose them together on the same Matrix or different matrices of the same dimensions. + * 5. Most of them will only require 1 for-loop, the few that require 2 only do this so you can draw the inside of a shape. `circle` is like this. + * 6. They don't assume any particular classes or require subclassing. As long as the type given enables `mat[y][x]` (row major) access then it'll work. + * 7. The matrix given to a shiterator isn't actually attached to it, so you can use one matrix to setup an iterator, then apply the x/y values to any other matrix of the same dimensions. Great for smart copying and transforming. + * 8. More importantly, shiterators _do not return any values from the matrix_. They only do the math for coordinates and leave it to you to work your matrix. + * + * These shiterators are used all over the game to do map rendering, randomization, drawing, nearly everything that involves a shape. + * + * ## Algorithms I Need + * + * I'm currently looking for a few algorithms, so if you know how to do these let me know: + * + * 1. _Flood fill_ This turns out to be really hard because most algorithms require keeping track of visited cells with a queue, recursion, etc. + * 2. _Random rectangle fill_ I have something that mostly works but it's really only random across each y-axis, then separate y-axes are randomized. + * 3. _Dijkstra Map_ I have a Dijkstra algorithm but it's not in this style yet. Look in `worldbuilder.cpp` for my current implementation. + * 4. _Viewport_ Currently working on this but I need to have a rectangle I can move around as a viewport. + * + * + * ## Usage + * + * Check the `matrix.hpp` for an example if you want to make it more conventient for your own type. + * + * ## Thanks + * + * Special thanks to Amit and hirdrac for their help with the math and for + * giving me the initial idea. hirdrac doesn't want to be held responsible for + * this travesty but he showed me that you can do iteration and _not_ use the + * weird C++ iterators. Amit did a lot to show me how to do these calculations + * without branching. Thanks to you both--and to everyone else--for helping me while I + * stream my development. + * + * ### SERIOUS DISCLAIMER + * + * I am horribly bad at trigonometry and graphics algorithms, so if you've got an idea to improve them + * or find a bug shoot me an email at help@learncodethehardway.com. + */ +namespace shiterator { using std::vector, std::queue, std::array; using + std::min, std::max, std::floor; + + template + using BaseRow = vector; + + template + using Base = vector>; + + template + inline Base make(size_t width, size_t height) { + Base result(height, BaseRow(width)); + return result; + } + + /* + * Just a quick thing to reset a matrix to a value. + */ + template + inline void assign(MAT &out, VAL new_value) { + for(auto &row : out) { + row.assign(row.size(), new_value); + } + } + + + /* + * Tells you if a coordinate is in bounds of the matrix + * and therefore safe to use. + */ + template + inline bool inbounds(MAT &mat, size_t x, size_t y) { + // since Point.x and Point.y are size_t any negatives are massive + return (y < mat.size()) && (x < mat[0].size()); + } + + /* + * Gives the width of a matrix. Assumes row major (y/x) + * and vector API .size(). + */ + template + inline size_t width(MAT &mat) { + return mat[0].size(); + } + + /* + * Same as shiterator::width but just the height. + */ + template + inline size_t height(MAT &mat) { + return mat.size(); + } + + /* + * These are internal calculations that help + * with keeping track of the next x coordinate. + */ + inline size_t next_x(size_t x, size_t width) { + return (x + 1) * ((x + 1) < width); + } + + /* + * Same as next_x but updates the next y coordinate. + * It uses the fact that when x==0 you have a new + * line so increment y. + */ + inline size_t next_y(size_t x, size_t y) { + return y + (x == 0); + } + + /* + * Figures out if you're at the end of the shape, + * which is usually when y > height. + */ + inline bool at_end(size_t y, size_t height) { + return y < height; + } + + /* + * Determines if you're at the end of a row. + */ + inline bool end_row(size_t x, size_t width) { + return x == width - 1; + } + + /* + * Most basic shiterator. It just goes through + * every cell in the matrix in linear order + * with not tracking of anything else. + */ + template + struct each_cell_t { + size_t x = ~0; + size_t y = ~0; + size_t width = 0; + size_t height = 0; + + each_cell_t(MAT &mat) + { + height = shiterator::height(mat); + width = shiterator::width(mat); + } + + bool next() { + x = next_x(x, width); + y = next_y(x, y); + return at_end(y, height); + } + }; + + /* + * This is just each_cell_t but it sets + * a boolean value `bool row` so you can + * tell when you've reached the end of a + * row. This is mostly used for printing + * out a matrix and similar just drawing the + * whole thing with its boundaries. + */ + template + struct each_row_t { + size_t x = ~0; + size_t y = ~0; + size_t width = 0; + size_t height = 0; + bool row = false; + + each_row_t(MAT &mat) { + height = shiterator::height(mat); + width = shiterator::width(mat); + } + + bool next() { + x = next_x(x, width); + y = next_y(x, y); + row = end_row(x, width); + return at_end(y, height); + } + }; + + /* + * This is a CENTERED box, that will create + * a centered rectangle around a point of a + * certain dimension. This kind of needs a + * rewrite but if you want a rectangle from + * a upper corner then use rectangle_t type. + * + * Passing 1 parameter for the size will make + * a square. + */ + template + struct box_t { + size_t from_x; + size_t from_y; + size_t x = 0; // these are set in constructor + size_t y = 0; // again, no fancy ~ trick needed + size_t left = 0; + size_t top = 0; + size_t right = 0; + size_t bottom = 0; + + box_t(MAT &mat, size_t at_x, size_t at_y, size_t size) : + box_t(mat, at_x, at_y, size, size) { + } + + box_t(MAT &mat, size_t at_x, size_t at_y, size_t width, size_t height) : + from_x(at_x), from_y(at_y) + { + size_t h = shiterator::height(mat); + size_t w = shiterator::width(mat); + + // keeps it from going below zero + // need extra -1 to compensate for the first next() + left = max(from_x, width) - width; + x = left - 1; // must be -1 for next() + // keeps it from going above width + right = min(from_x + width + 1, w); + + // same for these two + top = max(from_y, height) - height; + y = top - (left == 0); + bottom = min(from_y + height + 1, h); + } + + bool next() { + // calc next but allow to go to 0 for next + x = next_x(x, right); + // x will go to 0, which signals new line + y = next_y(x, y); // this must go here + // if x==0 then this moves it to min_x + x = max(x, left); + // and done + + return at_end(y, bottom); + } + + /* + * This was useful for doing quick lighting + * calculations, and I might need to implement + * it in other shiterators. It gives the distance + * to the center from the current x/y. + */ + float distance() { + int dx = from_x - x; + int dy = from_y - y; + + return sqrt((dx * dx) + (dy * dy)); + } + }; + + /* + * Stupid simple compass shape North/South/East/West. + * This comes up a _ton_ when doing searching, flood + * algorithms, collision, etc. Probably not the + * fastest way to do it but good enough. + */ + template + struct compass_t { + size_t x = 0; // these are set in constructor + size_t y = 0; // again, no fancy ~ trick needed + array x_dirs{0, 1, 0, -1}; + array y_dirs{-1, 0, 1, 0}; + size_t max_dirs=0; + size_t dir = ~0; + + compass_t(MAT &mat, size_t x, size_t y) : + x(x), y(y) + { + array x_in{0, 1, 0, -1}; + array y_in{-1, 0, 1, 0}; + + for(size_t i = 0; i < 4; i++) { + int nx = x + x_in[i]; + int ny = y + y_in[i]; + if(shiterator::inbounds(mat, nx, ny)) { + x_dirs[max_dirs] = nx; + y_dirs[max_dirs] = ny; + max_dirs++; + } + } + } + + bool next() { + dir++; + if(dir < max_dirs) { + x = x_dirs[dir]; + y = y_dirs[dir]; + return true; + } else { + return false; + } + } + }; + + /* + * Draws a line from start to end using a algorithm from + * https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm + * No idea if the one I picked is best but it's the one + * that works in the shiterator requirements and produced + * good results. + * + * _WARNING_: This one doesn't check if the start/end are + * within your Matrix, as it's assumed _you_ did that + * already. + */ + struct line { + int x; + int y; + int x1; + int y1; + int sx; + int sy; + int dx; + int dy; + int error; + + line(Point start, Point end) : + x(start.x), y(start.y), + x1(end.x), y1(end.y) + { + dx = std::abs(x1 - x); + sx = x < x1 ? 1 : -1; + dy = std::abs(y1 - y) * -1; + sy = y < y1 ? 1 : -1; + error = dx + dy; + } + + bool next() { + if(x != x1 || y != y1) { + int e2 = 2 * error; + + if(e2 >= dy) { + error = error + dy; + x = x + sx; + } + + if(e2 <= dx) { + error = error + dx; + y = y + sy; + } + return true; + } else { + return false; + } + } + }; + + /* + * Draws a simple circle using a fairly naive algorithm + * but one that actually worked. So, so, so, so many + * circle drawing algorithms described online don't work + * or are flat wrong. Even the very best I could find + * did overdrawing of multiple lines or simply got the + * math wrong. Keep in mind, _I_ am bad at this trig math + * so if I'm finding errors in your circle drawing then + * you got problems. + * + * This one is real simple, and works. If you got better + * then take the challenge but be ready to get it wrong. + */ + template + struct circle_t { + float center_x; + float center_y; + float radius = 0.0f; + int y = 0; + int dx = 0; + int dy = 0; + int left = 0; + int right = 0; + int top = 0; + int bottom = 0; + int width = 0; + int height = 0; + + circle_t(MAT &mat, Point center, float radius) : + center_x(center.x), center_y(center.y), radius(radius) + { + width = shiterator::width(mat); + height = shiterator::height(mat); + top = max(int(floor(center_y - radius)), 0); + bottom = min(int(floor(center_y + radius)), height - 1); + + y = top; + } + + bool next() { + y++; + if(y <= bottom) { + dy = y - center_y; + dx = floor(sqrt(radius * radius - dy * dy)); + left = max(0, int(center_x) - dx); + right = min(width, int(center_x) + dx + 1); + return true; + } else { + return false; + } + } + }; + + /* + * Basic rectangle shiterator, and like box and rando_rect_t you can + * pass only 1 parameter for size to do a square. + */ + template + struct rectangle_t { + int x; + int y; + int top; + int left; + int width; + int height; + int right; + int bottom; + + rectangle_t(MAT &mat, size_t start_x, size_t start_y, size_t size) : + rectangle_t(mat, start_x, start_y, size, size) { + } + + rectangle_t(MAT &mat, size_t start_x, size_t start_y, size_t width, size_t height) : + top(start_y), + left(start_x), + width(width), + height(height) + { + size_t h = shiterator::height(mat); + size_t w = shiterator::width(mat); + y = start_y - 1; + x = left - 1; // must be -1 for next() + right = min(start_x + width, w); + + y = start_y; + bottom = min(start_y + height, h); + } + + bool next() { + x = next_x(x, right); + y = next_y(x, y); + x = max(x, left); + return at_end(y, bottom); + } + }; + + /* + * WIP: This one is used to place entities randomly but + * could be used for effects like random destruction of floors. + * It simply "wraps" the rectangle_t but randomizes the x/y values + * using a random starting point. This makes it random across the + * x-axis but only partially random across the y. + */ + template + struct rando_rect_t { + int x; + int y; + int x_offset; + int y_offset; + rectangle_t it; + + rando_rect_t(MAT &mat, size_t start_x, size_t start_y, size_t size) : + rando_rect_t(mat, start_x, start_y, size, size) { + } + + rando_rect_t(MAT &mat, size_t start_x, size_t start_y, size_t width, size_t height) : + it{mat, start_x, start_y, width, height} + { + x_offset = Random::uniform(0, int(width)); + y_offset = Random::uniform(0, int(height)); + } + + bool next() { + bool done = it.next(); + x = it.left + ((it.x + x_offset) % it.width); + y = it.top + ((it.y + y_offset) % it.height); + return done; + } + }; + + /* + * BROKEN: I'm actually not sure what I'm trying to + * do here yet. + */ + template + struct viewport_t { + Point start; + // this is the point in the map + size_t x; + size_t y; + // this is the point inside the box, start at 0 + size_t view_x = ~0; + size_t view_y = ~0; + // viewport width/height + size_t width; + size_t height; + + viewport_t(MAT &mat, Point start, int max_x, int max_y) : + start(start), + x(start.x-1), + y(start.y-1) + { + width = std::min(size_t(max_x), shiterator::width(mat) - start.x); + height = std::min(size_t(max_y), shiterator::height(mat) - start.y); + fmt::println("viewport_t max_x, max_y {},{} vs matrix {},{}, x={}, y={}", + max_x, max_y, shiterator::width(mat), shiterator::height(mat), x, y); + } + + bool next() { + y = next_y(x, y); + x = next_x(x, width); + view_x = next_x(view_x, width); + view_y = next_y(view_x, view_y); + return at_end(y, height); + } + }; + +} diff --git a/spatialmap.cpp b/spatialmap.cpp new file mode 100644 index 0000000..330e839 --- /dev/null +++ b/spatialmap.cpp @@ -0,0 +1,66 @@ +#include "spatialmap.hpp" +#include + +using namespace fmt; + +using DinkyECS::Entity; + +void SpatialMap::insert(Point pos, Entity ent) { + table[pos] = ent; +} + +void SpatialMap::remove(Point pos) { + table.erase(pos); +} + +void SpatialMap::move(Point from, Point to, Entity ent) { + remove(from); + insert(to, ent); +} + +bool SpatialMap::occupied(Point at) const { + return table.contains(at); +} + +Entity SpatialMap::get(Point at) const { + return table.at(at); +} + +/* + * Avoid doing work by using the dy,dx and confirming that + * at.x or at.y is > 0. If either is 0 then there can't be + * a neighbor since that's out of bounds. + */ +inline void find_neighbor(const PointEntityMap &table, EntityList &result, Point at, int dy, int dx) { + // don't bother checking for cells out of bounds + if((dx < 0 && at.x <= 0) || (dy < 0 && at.y <= 0)) { + return; + } + + Point cell = {at.x + dx, at.y + dy}; + + auto it = table.find(cell); + if (it != table.end()) { + result.insert(result.end(), it->second); + } +} + +FoundEntities SpatialMap::neighbors(Point cell, bool diag) const { + EntityList result; + + // just unroll the loop since we only check four directions + // this also solves the problem that it was detecting that the cell was automatically included as a "neighbor" but it's not + find_neighbor(table, result, cell, 0, 1); // north + find_neighbor(table, result, cell, 0, -1); // south + find_neighbor(table, result, cell, 1, 0); // east + find_neighbor(table, result, cell, -1, 0); // west + + if(diag) { + find_neighbor(table, result, cell, 1, -1); // south east + find_neighbor(table, result, cell, -1, -1); // south west + find_neighbor(table, result, cell, 1, 1); // north east + find_neighbor(table, result, cell, -1, 1); // north west + } + + return {!result.empty(), result}; +} diff --git a/spatialmap.hpp b/spatialmap.hpp new file mode 100644 index 0000000..97a6266 --- /dev/null +++ b/spatialmap.hpp @@ -0,0 +1,31 @@ +#pragma once +#include +#include +#include "map.hpp" +#include "dinkyecs.hpp" +#include "point.hpp" + +typedef std::vector EntityList; + +// Point's has is in point.hpp +typedef std::unordered_map PointEntityMap; + +struct FoundEntities { + bool found; + EntityList nearby; +}; + +class SpatialMap { + public: + SpatialMap() {} + + void insert(Point pos, DinkyECS::Entity obj); + void move(Point from, Point to, DinkyECS::Entity ent); + void remove(Point pos); + bool occupied(Point pos) const; + DinkyECS::Entity get(Point at) const; + FoundEntities neighbors(Point position, bool diag=false) const; + + private: + PointEntityMap table; +}; diff --git a/systems.cpp b/systems.cpp new file mode 100644 index 0000000..e65cea4 --- /dev/null +++ b/systems.cpp @@ -0,0 +1,215 @@ +#include "systems.hpp" +#include +#include +#include +#include "rand.hpp" +#include "spatialmap.hpp" +#include "dbc.hpp" +#include "lights.hpp" +#include "events.hpp" + +using std::string; +using namespace fmt; +using namespace components; +using lighting::LightSource; + +void System::lighting(GameLevel &level) { + auto &light = *level.lights; + auto &world = *level.world; + auto &map = *level.map; + + light.reset_light(); + + world.query([&](const auto &ent[[maybe_unused]], auto &position) { + light.set_light_target(position.location); + }); + + light.path_light(map.walls()); + + world.query([&](const auto &ent[[maybe_unused]], auto &position, auto &lightsource) { + light.render_light(lightsource, position.location); + }); +} + +void System::enemy_pathing(GameLevel &level) { + auto &world = *level.world; + auto &map = *level.map; + auto player = world.get_the(); + + // TODO: this will be on each enemy not a global thing + const auto &player_position = world.get(player.entity); + map.set_target(player_position.location); + map.make_paths(); + + world.query([&](const auto &ent, auto &position, auto &motion) { + if(ent != player.entity) { + dbc::check(world.has(ent), "enemy is missing config"); + const auto &config = world.get(ent); + + Point out = position.location; // copy + if(map.distance(out) < config.hearing_distance) { + map.neighbors(out, motion.random); + motion = { int(out.x - position.location.x), int(out.y - position.location.y)}; + } + } + }); + map.clear_target(player_position.location); +} + +void System::init_positions(DinkyECS::World &world, SpatialMap &collider) { + // BUG: instead of separate things maybe just one + // BUG: Collision component that references what is collide + world.query([&](const auto &ent, auto &pos) { + if(world.has(ent)) { + const auto& combat = world.get(ent); + if(!combat.dead) { + collider.insert(pos.location, ent); + } + } else { + collider.insert(pos.location, ent); + } + }); +} + +inline void move_entity(SpatialMap &collider, Map &game_map, Position &position, Motion &motion, DinkyECS::Entity ent) { + Point move_to = { + position.location.x + motion.dx, + position.location.y + motion.dy + }; + motion = {0,0}; // clear it after getting it + + // it's a wall, skip + if(!game_map.can_move(move_to)) return; + // there's collision skip + if(collider.occupied(move_to)) return; + + // all good, do the move + collider.move(position.location, move_to, ent); + position.location = move_to; +} + +void System::motion(GameLevel &level) { + auto &map = *level.map; + auto &world = *level.world; + auto &collider = *level.collision; + + world.query([&](const auto &ent, auto &position, auto &motion) { + // don't process entities that don't move + if(motion.dx != 0 || motion.dy != 0) { + move_entity(collider, map, position, motion, ent); + } + }); +} + +void System::death(GameLevel &level) { + auto &world = *level.world; + auto &collider = *level.collision; + auto player = world.get_the(); + + // BUG: this is where entities can die on top of + // BUG: eachother and overlap their corpse + // BUG: maybe that can be allowed and looting just shows + // BUG: all dead things there? + world.query([&](const auto &ent, auto &position, auto &combat) { + // bring out yer dead + if(combat.hp <= 0 && !combat.dead) { + combat.dead = true; + // take them out of collision map + collider.remove(position.location); + + if(ent == player.entity) { + world.send(Events::GUI::DEATH, ent, {}); + } else { + // remove their motion so they're dead + world.remove(ent); + } + } + }); +} + +void System::collision(GameLevel &level) { + auto &collider = *level.collision; + auto &world = *level.world; + auto player = world.get_the(); + + const auto& player_position = world.get(player.entity); + auto& player_combat = world.get(player.entity); + + // this is guaranteed to not return the given position + auto [found, nearby] = collider.neighbors(player_position.location); + + if(found) { + for(auto entity : nearby) { + if(world.has(entity)) { + auto& enemy_combat = world.get(entity); + + Events::Combat result { + player_combat.attack(enemy_combat), + enemy_combat.attack(player_combat) + }; + + world.send(Events::GUI::COMBAT, entity, result); + } else if(world.has(entity)) { + auto item = world.get(entity); + auto& item_pos = world.get(entity); + auto& inventory = world.get(player.entity); + + if(world.has(entity)) { + inventory.add(item); + auto &new_light = world.get(entity); + world.set(player.entity, new_light); + inventory.light = new_light; + world.remove(entity); + } + + if(world.has(entity)) { + inventory.add(item); + auto &weapon = world.get(entity); + player_combat.damage = weapon.damage; + world.remove(entity); + } + + if(world.has(entity)) { + auto &loot = world.get(entity); + inventory.gold += loot.amount; + world.remove(entity); + } + + if(world.has(entity)) { + auto& cure = world.get(entity); + player_combat.hp += cure.hp; + world.remove(entity); + } + + collider.remove(item_pos.location); + world.remove(entity); + world.remove(entity); + world.send(Events::GUI::LOOT, entity, item); + } else if(world.has(entity)) { + System::device(world, player.entity, entity); + } else { + println("UNKNOWN COLLISION TYPE {}", entity); + } + } + } +} + +void System::pickup(DinkyECS::World &world, DinkyECS::Entity actor, DinkyECS::Entity item) { + dbc::pre("System::pickup actor doesn't have inventory", world.has(actor)); + dbc::pre("System::pickup item isn't configured with InventoryItem.", world.has(item)); + + auto& inventory = world.get(actor); + auto& invitem = world.get(item); + + inventory.add(invitem); +} + +void System::device(DinkyECS::World &world, DinkyECS::Entity actor, DinkyECS::Entity item) { + auto& device = world.get(item); + + for(int event : device.events) { + world.send((Events::GUI)event, actor, device); + } + + println("entity {} INTERACTED WITH DEVICE {}", actor, item); +} diff --git a/systems.hpp b/systems.hpp new file mode 100644 index 0000000..282e439 --- /dev/null +++ b/systems.hpp @@ -0,0 +1,18 @@ +#pragma once +#include "components.hpp" +#include "levelmanager.hpp" + + +namespace System { + using namespace components; + + void lighting(GameLevel &level); + void motion(GameLevel &level); + void collision(GameLevel &level); + void death(GameLevel &level); + void enemy_pathing(GameLevel &level); + + void init_positions(DinkyECS::World &world, SpatialMap &collider); + void pickup(DinkyECS::World &world, DinkyECS::Entity actor, DinkyECS::Entity item); + void device(DinkyECS::World &world, DinkyECS::Entity actor, DinkyECS::Entity item); +} diff --git a/tests/components.cpp b/tests/components.cpp new file mode 100644 index 0000000..095acec --- /dev/null +++ b/tests/components.cpp @@ -0,0 +1,99 @@ +#include +#include "components.hpp" +#include "dinkyecs.hpp" + +using namespace components; +using namespace DinkyECS; + +TEST_CASE("all components can work in the world", "[components]") { + World world; + auto ent1 = world.entity(); + + world.set(ent1, {ent1}); + world.set(ent1, {{10,1}}); + world.set(ent1, {1,0}); + world.set(ent1, {100}); + world.set(ent1, {0}); + world.set(ent1, {"Z"}); + world.set(ent1, {4}); + + auto player = world.get(ent1); + REQUIRE(player.entity == ent1); + + auto position = world.get(ent1); + REQUIRE(position.location.x == 10); + REQUIRE(position.location.y == 1); + + auto motion = world.get(ent1); + REQUIRE(motion.dx == 1); + REQUIRE(motion.dy == 0); + + auto loot = world.get(ent1); + REQUIRE(loot.amount == 100); + + auto inv = world.get(ent1); + REQUIRE(inv.gold == 0); + + auto tile = world.get(ent1); + REQUIRE(tile.chr == "Z"); +} + +TEST_CASE("all components can be facts", "[components]") { + World world; + auto ent1 = world.entity(); + + world.set_the({ent1}); + world.set_the({{10,1}}); + world.set_the({1,0}); + world.set_the({100}); + world.set_the({0}); + world.set_the({"Z"}); + world.set_the({4}); + + auto player = world.get_the(); + REQUIRE(player.entity == ent1); + + auto position = world.get_the(); + REQUIRE(position.location.x == 10); + REQUIRE(position.location.y == 1); + + auto motion = world.get_the(); + REQUIRE(motion.dx == 1); + REQUIRE(motion.dy == 0); + + auto loot = world.get_the(); + REQUIRE(loot.amount == 100); + + auto inv = world.get_the(); + REQUIRE(inv.gold == 0); + + auto tile = world.get_the(); + REQUIRE(tile.chr == "Z"); +} + +TEST_CASE("confirm combat works", "[components]") { + World world; + auto player = world.entity(); + auto enemy = world.entity(); + + world.set(player, {100, 10}); + world.set(enemy, {20, 10}); + + auto p_fight = world.get(player); + REQUIRE(p_fight.hp == 100); + REQUIRE(p_fight.damage == 10); + REQUIRE(p_fight.dead == false); + + auto e_fight = world.get(enemy); + REQUIRE(e_fight.hp == 20); + REQUIRE(e_fight.damage == 10); + REQUIRE(e_fight.dead == false); + + for(int i = 0; e_fight.hp > 0 && i < 100; i++) { + p_fight.attack(e_fight); + } +} + +TEST_CASE("MapConfig loads from JSON", "[components]") { + +} diff --git a/tests/dbc.cpp b/tests/dbc.cpp new file mode 100644 index 0000000..fa45b86 --- /dev/null +++ b/tests/dbc.cpp @@ -0,0 +1,39 @@ +#include +#include "dbc.hpp" + +using namespace dbc; + +TEST_CASE("basic feature tests", "[utils]") { + log("Logging a message."); + + try { + sentinel("This shouldn't happen."); + } catch(SentinelError) { + log("Sentinel happened."); + } + + pre("confirm positive cases work", 1 == 1); + pre("confirm positive lambda", [&]{ return 1 == 1;}); + post("confirm positive post", 1 == 1); + post("confirm postitive post with lamdba", [&]{ return 1 == 1;}); + + check(1 == 1, "one equals 1"); + + try { + check(1 == 2, "this should fail"); + } catch(CheckError err) { + log("check fail worked"); + } + + try { + pre("failing pre", 1 == 3); + } catch(PreCondError err) { + log("pre fail worked"); + } + + try { + post("failing post", 1 == 4); + } catch(PostCondError err) { + log("post faile worked"); + } +} diff --git a/tests/dijkstra.json b/tests/dijkstra.json new file mode 100644 index 0000000..1ee6990 --- /dev/null +++ b/tests/dijkstra.json @@ -0,0 +1,60 @@ +[{ + "input": [ + [1, 1, 1, 0], + [1, 0, 1, 1], + [1, 0, 1, 1], + [1, 1, 1, 1] + ], + "walls": [ + [0, 0, 0, 0], + [0, 0, 0, 0], + [0, 0, 1, 0], + [0, 0, 1, 0] + ], + "expected": [ + [1, 1, 1, 0], + [1, 0, 1, 1], + [1, 0, 1000, 2], + [1, 1, 1000, 3] + ] +},{ + "input": [ + [1, 1, 1, 0], + [1, 0, 1, 1], + [1, 0, 1, 1], + [1, 1, 1, 1] + ], + "walls": [ + [0, 0, 0, 0], + [0, 0, 0, 0], + [0, 0, 1, 0], + [0, 0, 1, 0] + ], + "expected": [ + [1, 1, 1, 0], + [1, 0, 1, 1], + [1, 0, 1000, 2], + [1, 1, 1000, 3] + ] +}, +{ + "input": [ + [1, 1, 1, 0], + [1, 1, 1, 1], + [1, 0, 1, 1], + [1, 1, 1, 1] + ], + "walls": [ + [0, 0, 0, 0], + [0, 0, 0, 0], + [0, 0, 1, 0], + [0, 0, 1, 0] + ], + "expected": [ + [2, 2, 1, 0], + [1, 1, 1, 1], + [1, 0, 1000, 2], + [1, 1, 1000, 3] + ] +} +] diff --git a/tests/inventory.cpp b/tests/inventory.cpp new file mode 100644 index 0000000..a054778 --- /dev/null +++ b/tests/inventory.cpp @@ -0,0 +1,71 @@ +#include +#include +#include +#include "rand.hpp" +#include +#include +#include "components.hpp" +#include "dinkyecs.hpp" +#include "save.hpp" +#include "systems.hpp" + +using namespace nlohmann; +using namespace fmt; +using std::string; +using namespace components; + + +DinkyECS::Entity add_items(DinkyECS::World &world, GameConfig &config) { + auto sword = world.entity(); + json& item_data = config.items["SWORD_RUSTY"]; + world.set(sword, {item_data["inventory_count"], item_data}); + components::configure(world, sword, item_data); + return sword; +} + +TEST_CASE("basic inventory test", "[inventory]") { + DinkyECS::World world; + save::load_configs(world); + auto& config = world.get_the(); + auto sword = add_items(world, config); + + auto player = world.entity(); + world.set(player, {}); + + auto &inventory = world.get(player); + + System::pickup(world, player, sword); + REQUIRE(inventory.count() == 1); + // get the item and confirm there is 1 + auto &item1 = inventory.get(0); + REQUIRE(item1.count == 1); + + int item_at = inventory.item_index("SWORD_RUSTY"); + REQUIRE(item_at == 0); + + REQUIRE(inventory.item_index("SADFASFSADF") == -1); + + System::pickup(world, player, sword); + REQUIRE(item1.count == 2); + + System::pickup(world, player, sword); + REQUIRE(item1.count == 3); + + System::pickup(world, player, sword); + REQUIRE(inventory.count() == 1); + + REQUIRE(item1.count == 4); + + inventory.decrease(0, 1); + REQUIRE(item1.count == 3); + + inventory.decrease(0, 2); + REQUIRE(item1.count == 1); + + bool active = inventory.decrease(0, 1); + REQUIRE(item1.count == 0); + REQUIRE(active == false); + + inventory.erase_item(0); + REQUIRE(inventory.count() == 0); +} diff --git a/tests/levelmanager.cpp b/tests/levelmanager.cpp new file mode 100644 index 0000000..190027e --- /dev/null +++ b/tests/levelmanager.cpp @@ -0,0 +1,40 @@ +#include +#include +#include "map.hpp" +#include "dinkyecs.hpp" +#include "worldbuilder.hpp" +#include "save.hpp" +#include "systems.hpp" +#include "spatialmap.hpp" +#include "levelmanager.hpp" + +using namespace fmt; +using std::string; + +TEST_CASE("basic level manager test", "[levelmanager]") { + LevelManager lm; + + // starts off with one already but I need to change that + size_t level1 = lm.current_index(); + size_t level2 = lm.create_level(); + + auto& test1_level = lm.get(level1); + auto& test2_level = lm.get(level2); + + REQUIRE(test1_level.map->width() > 0); + REQUIRE(test1_level.map->height() > 0); + REQUIRE(test1_level.index == 0); + + REQUIRE(test2_level.map->width() > 0); + REQUIRE(test2_level.map->height() > 0); + REQUIRE(test2_level.index == 1); + + auto& cur_level = lm.current(); + REQUIRE(cur_level.index == 0); + + auto& next_level = lm.next(); + REQUIRE(next_level.index == 1); + + auto& prev_level = lm.previous(); + REQUIRE(prev_level.index == 0); +} diff --git a/tests/lighting.cpp b/tests/lighting.cpp new file mode 100644 index 0000000..92b32b5 --- /dev/null +++ b/tests/lighting.cpp @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include "map.hpp" +#include "worldbuilder.hpp" +#include "lights.hpp" +#include "point.hpp" + +using namespace lighting; + +TEST_CASE("lighting a map works", "[lighting]") { + Map map(20,23); + WorldBuilder builder(map); + builder.generate_map(); + Point light1, light2; + + REQUIRE(map.place_entity(0, light1)); + REQUIRE(map.place_entity(1, light1)); + + LightSource source1{6, 1.0}; + LightSource source2{4,3}; + + LightRender lr(map.width(), map.height()); + + lr.reset_light(); + + lr.set_light_target(light1); + lr.set_light_target(light2); + + lr.path_light(map.walls()); + + lr.render_light(source1, light1); + lr.render_light(source2, light2); + + lr.clear_light_target(light1); + lr.clear_light_target(light2); + + Matrix &lighting = lr.lighting(); + + matrix::dump("WALLS=====", map.walls(), light1.x, light1.y); + matrix::dump("PATHS=====", lr.paths(), light1.x, light1.y); + matrix::dump("LIGHTING 1", lighting, light1.x, light1.y); + matrix::dump("LIGHTING 2", lighting, light2.x, light2.y); +} diff --git a/tests/map.cpp b/tests/map.cpp new file mode 100644 index 0000000..1dfba9e --- /dev/null +++ b/tests/map.cpp @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include "map.hpp" +#include "worldbuilder.hpp" + +using namespace fmt; +using namespace nlohmann; +using std::string; + +json load_test_data(const string &fname) { + std::ifstream infile(fname); + return json::parse(infile); +} + +TEST_CASE("camera control", "[map]") { + Map map(20, 20); + WorldBuilder builder(map); + builder.generate_map(); + + Point center = map.center_camera({10,10}, 5, 5); + + REQUIRE(center.x == 8); + REQUIRE(center.y == 8); + + Point translation = map.map_to_camera({10,10}, center); + + REQUIRE(translation.x == 2); + REQUIRE(translation.y == 2); +} + +TEST_CASE("map placement test", "[map:placement]") { + for(int i = 0; i < 50; i++) { + size_t width = Random::uniform(9, 21); + size_t height = Random::uniform(13, 25); + Map map(width, height); + WorldBuilder builder(map); + builder.generate_rooms(); + map.invert_space(); + + for(size_t rnum = 0; rnum < map.room_count(); rnum++) { + Room &room = map.room(rnum); + Point pos; + + REQUIRE(map.place_entity(rnum, pos)); + // matrix::dump("ROOM PLACEMENT TEST", map.walls(), pos.x, pos.y); + + REQUIRE(!map.iswall(pos.x, pos.y)); + REQUIRE(pos.x >= room.x); + REQUIRE(pos.y >= room.y); + REQUIRE(pos.x <= room.x + room.width); + REQUIRE(pos.y <= room.y + room.height); + } + } +} + +TEST_CASE("dijkstra algo test", "[map]") { + json data = load_test_data("./tests/dijkstra.json"); + + for(auto &test : data) { + Matrix expected = test["expected"]; + Matrix input = test["input"]; + Matrix walls = test["walls"]; + Map map(input.size(), input[0].size()); + map.$walls = walls; + map.$paths.$input = input; + + REQUIRE(map.INVARIANT()); + + map.make_paths(); + Matrix &paths = map.paths(); + + if(paths != expected) { + println("ERROR! ------"); + matrix::dump("EXPECTED", expected); + matrix::dump("RESULT", paths); + } + + REQUIRE(map.INVARIANT()); + // FIX ME: REQUIRE(paths == expected); + } +} diff --git a/tests/matrix.cpp b/tests/matrix.cpp new file mode 100644 index 0000000..3b60f66 --- /dev/null +++ b/tests/matrix.cpp @@ -0,0 +1,343 @@ +#include +#include +#include +#include "config.hpp" +#include "matrix.hpp" +#include "rand.hpp" +#include "worldbuilder.hpp" +#include +#include + +using namespace nlohmann; +using namespace fmt; +using std::string; +using matrix::Matrix; + +TEST_CASE("basic matrix iterator", "[matrix:basic]") { + std::ifstream infile("./tests/dijkstra.json"); + json data = json::parse(infile); + auto test = data[0]; + + Matrix walls = test["walls"]; + + // tests going through straight cells but also + // using two iterators on one matrix (or two) + matrix::each_cell cells{walls}; + cells.next(); // kick it off + size_t row_count = 0; + + for(matrix::each_row it{walls}; + it.next(); cells.next()) + { + REQUIRE(walls[cells.y][cells.x] == walls[it.y][it.x]); + row_count += it.row; + } + + REQUIRE(row_count == walls.size()); + + { + // test getting the correct height in the middle + row_count = 0; + matrix::box box{walls, 2,2, 1}; + + while(box.next()) { + row_count += box.x == box.left; + walls[box.y][box.x] = 3; + } + matrix::dump("2,2 WALLS", walls, 2, 2); + + REQUIRE(row_count == 3); + } + + { + matrix::dump("1:1 POINT", walls, 1,1); + // confirm boxes have the right number of rows + // when x goes to 0 on first next call + row_count = 0; + matrix::box box{walls, 1, 1, 1}; + + while(box.next()) { + row_count += box.x == box.left; + } + REQUIRE(row_count == 3); + } + + { + matrix::compass star{walls, 1, 1}; + while(star.next()) { + println("START IS {},{}=={}", star.x, star.y, walls[star.y][star.x]); + walls[star.y][star.x] = 11; + } + matrix::dump("STAR POINT", walls, 1,1); + } +} + +inline void random_matrix(Matrix &out) { + for(size_t y = 0; y < out.size(); y++) { + for(size_t x = 0; x < out[0].size(); x++) { + out[y][x] = Random::uniform(-10,10); + } + } +} + +TEST_CASE("thrash matrix iterators", "[matrix]") { + for(int count = 0; count < Random::uniform(10,30); count++) { + size_t width = Random::uniform(1, 100); + size_t height = Random::uniform(1, 100); + + Matrix test(height, matrix::Row(width)); + random_matrix(test); + + // first make a randomized matrix + matrix::each_cell cells{test}; + cells.next(); // kick off the other iterator + + for(matrix::each_row it{test}; + it.next(); cells.next()) + { + REQUIRE(test[cells.y][cells.x] == test[it.y][it.x]); + } + } +} + +TEST_CASE("thrash box distance iterators", "[matrix:distance]") { + size_t width = Random::uniform(10, 21); + size_t height = Random::uniform(10, 25); + + Matrix result(height, matrix::Row(width)); + matrix::assign(result, 0); + + size_t size = Random::uniform(4, 10); + + Point target{width/2, height/2}; + matrix::box box{result, target.x, target.y, size}; + while(box.next()) { + result[box.y][box.x] = box.distance(); + } + + matrix::dump(format("MAP {}x{} @ {},{}; BOX {}x{}; size: {}", + matrix::width(result), matrix::height(result), + target.x, target.y, box.right - box.left, box.bottom - box.top, size), + result, target.x, target.y); +} + +TEST_CASE("thrash box iterators", "[matrix]") { + for(int count = 0; count < 20; count++) { + size_t width = Random::uniform(1, 25); + size_t height = Random::uniform(1, 33); + + Matrix test(height, matrix::Row(width)); + random_matrix(test); + + // this will be greater than the random_matrix cells + int test_i = Random::uniform(20,30); + + // go through every cell + for(matrix::each_cell target{test}; target.next();) { + PointList result; + // make a random size box + size_t size = Random::uniform(1, 33); + matrix::box box{test, target.x, target.y, size}; + + while(box.next()) { + test[box.y][box.x] = test_i; + result.push_back({box.x, box.y}); + } + + for(auto point : result) { + REQUIRE(test[point.y][point.x] == test_i); + test[point.y][point.x] = 10; // kind of reset it for another try + } + } + } +} + +TEST_CASE("thrash compass iterators", "[matrix:compass]") { + for(int count = 0; count < 20; count++) { + size_t width = Random::uniform(1, 25); + size_t height = Random::uniform(1, 33); + + Matrix test(height, matrix::Row(width)); + random_matrix(test); + + // this will be greater than the random_matrix cells + int test_i = Random::uniform(20,30); + + // go through every cell + for(matrix::each_cell target{test}; target.next();) { + PointList result; + // make a random size box + matrix::compass compass{test, target.x, target.y}; + + while(compass.next()) { + test[compass.y][compass.x] = test_i; + result.push_back({compass.x, compass.y}); + } + + for(auto point : result) { + REQUIRE(test[point.y][point.x] == test_i); + test[point.y][point.x] = 10; // kind of reset it for another try + } + } + } +} + +TEST_CASE("prototype line algorithm", "[matrix:line]") { + size_t width = Random::uniform(10, 12); + size_t height = Random::uniform(10, 15); + Map map(width,height); + // create a target for the paths + Point start{.x=map.width() / 2, .y=map.height()/2}; + + for(matrix::box box{map.walls(), start.x, start.y, 3}; + box.next();) + { + Matrix result = map.walls(); + result[start.y][start.x] = 1; + Point end{.x=box.x, .y=box.y}; + + for(matrix::line it{start, end}; it.next();) + { + REQUIRE(map.inmap(it.x, it.y)); + result[it.y][it.x] = 15; + } + + result[start.y][start.x] = 15; + + // matrix::dump("RESULT AFTER LINE", result, end.x, end.y); + + bool f_found = false; + for(matrix::each_cell it{result}; it.next();) { + if(result[it.y][it.x] == 15) { + f_found = true; + break; + } + } + + REQUIRE(f_found); + } +} + +TEST_CASE("prototype circle algorithm", "[matrix:circle]") { + for(int count = 0; count < 2; count++) { + size_t width = Random::uniform(10, 13); + size_t height = Random::uniform(10, 15); + int pos_mod = Random::uniform(-3,3); + Map map(width,height); + + // create a target for the paths + Point start{.x=map.width() / 2 + pos_mod, .y=map.height()/2 + pos_mod}; + + for(float radius = 1.0f; radius < 4.0f; radius += 0.1f) { + // use an empty map + Matrix result = map.walls(); + + for(matrix::circle it{result, start, radius}; it.next();) { + for(int x = it.left; x < it.right; x++) { + // println("top={}, bottom={}, center.y={}, dy={}, left={}, right={}, x={}, y={}", it.top, it.bottom, it.center.y, it.dy, it.left, it.right, x, it.y); + // println("RESULT {},{}", matrix::width(result), matrix::height(result)); + REQUIRE(it.y >= 0); + REQUIRE(x >= 0); + REQUIRE(it.y < int(matrix::height(result))); + REQUIRE(x < int(matrix::width(result))); + result[it.y][x] += 1; + } + } + + // matrix::dump(format("RESULT AFTER CIRCLE radius {}", radius), result, start.x, start.y); + } + } +} + +TEST_CASE("viewport iterator", "[matrix:viewport]") { + size_t width = Random::uniform(20, 22); + size_t height = Random::uniform(21, 25); + Map map(width,height); + WorldBuilder builder(map); + builder.generate_map(); + + size_t view_width = width/2; + size_t view_height = height/2; + Point player; + REQUIRE(map.place_entity(1, player)); + Point start = map.center_camera(player, view_width, view_height); + + size_t end_x = std::min(view_width, map.width() - start.x); + size_t end_y = std::min(view_height, map.height() - start.y); + + matrix::viewport it{map.walls(), start, int(view_width), int(view_height)}; + + for(size_t y = 0; y < end_y; ++y) { + for(size_t x = 0; x < end_x && it.next(); ++x) { + // still working on this + } + } +} + +TEST_CASE("random rectangle", "[matrix:rando_rect]") { + for(int i = 0; i < 10; i++) { + size_t width = Random::uniform(9, 21); + size_t height = Random::uniform(13, 25); + Map map(width, height); + WorldBuilder builder(map); + builder.generate_rooms(); + map.invert_space(); + auto wall_copy = map.walls(); + + for(size_t rnum = 0; rnum < map.room_count(); rnum++) { + Room &room = map.room(rnum); + Point pos; + + for(matrix::rando_rect it{map.walls(), room.x, room.y, room.width, room.height}; it.next();) + { + if(map.iswall(it.x, it.y)) { + matrix::dump("BAD RECTANGLE SPOT", map.walls(), it.x, it.y); + } + + REQUIRE(!map.iswall(it.x, it.y)); + REQUIRE(size_t(it.x) >= room.x); + REQUIRE(size_t(it.y) >= room.y); + REQUIRE(size_t(it.x) <= room.x + room.width); + REQUIRE(size_t(it.y) <= room.y + room.height); + + wall_copy[it.y][it.x] = wall_copy[it.y][it.x] + 5; + } + } + + // matrix::dump("WALLS FILLED", wall_copy); + } +} + +TEST_CASE("standard rectangle", "[matrix:rectangle]") { + for(int i = 0; i < 20; i++) { + size_t width = Random::uniform(9, 21); + size_t height = Random::uniform(13, 25); + Map map(width, height); + WorldBuilder builder(map); + builder.generate_rooms(); + map.invert_space(); + auto wall_copy = map.walls(); + + for(size_t rnum = 0; rnum < map.room_count(); rnum++) { + Room &room = map.room(rnum); + Point pos; + + for(matrix::rectangle it{map.walls(), room.x, room.y, room.width, room.height}; it.next();) + { + if(map.iswall(it.x, it.y)) { + matrix::dump("BAD RECTANGLE SPOT", map.walls(), it.x, it.y); + } + + REQUIRE(!map.iswall(it.x, it.y)); + REQUIRE(size_t(it.x) >= room.x); + REQUIRE(size_t(it.y) >= room.y); + REQUIRE(size_t(it.x) <= room.x + room.width); + REQUIRE(size_t(it.y) <= room.y + room.height); + + wall_copy[it.y][it.x] = wall_copy[it.y][it.x] + 5; + } + } + + // matrix::dump("WALLS FILLED", wall_copy); + } +} diff --git a/tests/pathing.cpp b/tests/pathing.cpp new file mode 100644 index 0000000..04eb391 --- /dev/null +++ b/tests/pathing.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include "pathing.hpp" +#include "matrix.hpp" + +using namespace fmt; +using namespace nlohmann; +using std::string; + +json load_test_pathing(const string &fname) { + std::ifstream infile(fname); + return json::parse(infile); +} + +TEST_CASE("dijkstra algo test", "[pathing]") { + json data = load_test_pathing("./tests/dijkstra.json"); + + for(auto &test : data) { + Matrix expected = test["expected"]; + Matrix walls = test["walls"]; + + Pathing pathing(walls[0].size(), walls.size()); + + pathing.$input = test["input"]; + + REQUIRE(pathing.INVARIANT()); + pathing.compute_paths(walls); + + REQUIRE(pathing.INVARIANT()); + + matrix::dump("PATHING RESULT", pathing.$paths); + matrix::dump("PATHING EXPECTED", expected); + REQUIRE(pathing.$paths == expected); + } +} + +TEST_CASE("random flood", "[pathing]") { + json data = load_test_pathing("./tests/dijkstra.json"); + auto test = data[0]; + + Matrix expected = test["expected"]; + Matrix walls = test["walls"]; + + Pathing pathing(walls[0].size(), walls.size()); + pathing.$input = test["input"]; + + REQUIRE(pathing.INVARIANT()); + pathing.compute_paths(walls); +} diff --git a/tests/save.cpp b/tests/save.cpp new file mode 100644 index 0000000..c70d6dd --- /dev/null +++ b/tests/save.cpp @@ -0,0 +1,103 @@ +#include +#include +#include +#include "dinkyecs.hpp" +#include "components.hpp" +#include "save.hpp" +#include +#include +#include "map.hpp" +#include "worldbuilder.hpp" +#include "tser.hpp" + +using namespace fmt; +using std::string; +using namespace components; + + +enum class Item : char { + RADAR = 'R', + TRAP = 'T', + ORE = 'O' +}; + +struct Pixel { + int x = 0; + int y = 0; + + DEFINE_SERIALIZABLE(Pixel, x, y); +}; + +struct Robot { + Pixel point; + std::wstring name; + std::optional item; + + DEFINE_SERIALIZABLE(Robot, point, name, item); +}; + + +TEST_CASE("test using tser for serialization", "[config]") { + auto robot = Robot{ Pixel{3,4}, L"BIG NAME", Item::RADAR}; + + tser::BinaryArchive archive; + archive.save(robot); + std::string_view archive_view = archive.get_buffer(); + + tser::BinaryArchive archive2(0); + archive2.initialize(archive_view); + auto loadedRobot = archive2.load(); + + REQUIRE(loadedRobot.point.x == robot.point.x); + REQUIRE(loadedRobot.point.y == robot.point.y); + REQUIRE(loadedRobot.name == robot.name); + REQUIRE(loadedRobot.item == robot.item); +} + +TEST_CASE("basic save a world", "[save]") { + DinkyECS::World world; + Map map(20, 20); + WorldBuilder builder(map); + builder.generate_map(); + + // configure a player as a fact of the world + Player player{world.entity()}; + world.set_the(player); + + world.set(player.entity, {10,10}); + world.set(player.entity, {0, 0}); + world.set(player.entity, {100, 10}); + world.set(player.entity, {"@"}); + world.set(player.entity, {102}); + + save::to_file("./savetest.world", world, map); + + DinkyECS::World in_world; + Map in_map(0, 0); // this will be changed on load + save::from_file("./savetest.world", in_world, in_map); + + Position &position1 = world.get(player.entity); + Position &position2 = in_world.get(player.entity); + REQUIRE(position1.location.x == position2.location.x); + REQUIRE(position1.location.y == position2.location.y); + + Combat &combat1 = world.get(player.entity); + Combat &combat2 = in_world.get(player.entity); + REQUIRE(combat1.hp == combat2.hp); + + Motion &motion1 = world.get(player.entity); + Motion &motion2 = in_world.get(player.entity); + REQUIRE(motion1.dx == motion2.dx); + REQUIRE(motion1.dy == motion2.dy); + + Tile &tile1 = world.get(player.entity); + Tile &tile2 = in_world.get(player.entity); + REQUIRE(tile1.chr == tile2.chr); + + REQUIRE(map.width() == in_map.width()); + REQUIRE(map.height() == in_map.height()); + REQUIRE(map.$walls == in_map.$walls); + + Inventory &inv = world.get(player.entity); + REQUIRE(inv.gold == 102); +} diff --git a/tests/spatialmap.cpp b/tests/spatialmap.cpp new file mode 100644 index 0000000..06560e8 --- /dev/null +++ b/tests/spatialmap.cpp @@ -0,0 +1,137 @@ +#include +#include +#include +#include "spatialmap.hpp" +#include "dinkyecs.hpp" + +using DinkyECS::Entity; +using namespace fmt; + +EntityList require_found(const SpatialMap& collider, Point at, bool diag, size_t expect_size) { + println("TEST require_found at={},{}", at.x, at.y); + auto [found, nearby] = collider.neighbors(at, diag); + REQUIRE(found == true); + REQUIRE(nearby.size() == expect_size); + return nearby; +} + + +TEST_CASE("confirm basic collision operations", "[collision]") { + DinkyECS::World world; + Entity player = world.entity(); + Entity enemy = world.entity(); + + SpatialMap collider; + collider.insert({11,11}, player); + collider.insert({21,21}, enemy); + + { // not found + auto [found, nearby] = collider.neighbors({1,1}); + REQUIRE(!found); + REQUIRE(nearby.empty()); + } + + // found + EntityList nearby = require_found(collider, {10,10}, true, 1); + REQUIRE(nearby[0] == player); + + { // removed + collider.remove({11,11}); + auto [found, nearby] = collider.neighbors({10,10}, true); + REQUIRE(!found); + REQUIRE(nearby.empty()); + } + + collider.insert({11,11}, player); // setup for the move test + { // moving, not found + collider.move({11,11}, {12, 12}, player); + auto [found, nearby] = collider.neighbors({10,10}, true); + REQUIRE(!found); + REQUIRE(nearby.empty()); + } + + nearby = require_found(collider, {11,11}, true, 1); + REQUIRE(nearby[0] == player); + + + // confirm occupied works + REQUIRE(collider.occupied({12,12})); + REQUIRE(collider.occupied({21,21})); + REQUIRE(!collider.occupied({1,10})); + + REQUIRE(collider.get({12,12}) == player); +} + + +TEST_CASE("confirm multiple entities moving", "[collision]") { + DinkyECS::World world; + Entity player = world.entity(); + Entity e1 = world.entity(); + Entity e2 = world.entity(); + Entity e3 = world.entity(); + + SpatialMap collider; + collider.insert({11,11}, player); + collider.insert({10,10}, e2); + collider.insert({11,10}, e3); + collider.insert({21,21}, e1); + + EntityList nearby = require_found(collider, {11,11}, false, 1); + REQUIRE(nearby[0] == e3); + + nearby = require_found(collider, {11,11}, true, 2); + REQUIRE(nearby[0] == e3); + REQUIRE(nearby[1] == e2); + + collider.move({11,11}, {20,20}, player); + nearby = require_found(collider, {20,20}, true, 1); + REQUIRE(nearby[0] == e1); +} + +TEST_CASE("test edge cases that might crash", "[collision]") { + DinkyECS::World world; + Entity player = world.entity(); + Entity enemy = world.entity(); + + SpatialMap collider; + collider.insert({0,0}, player); + + Point enemy_at = {1, 0}; + collider.insert(enemy_at, enemy); + + EntityList nearby = require_found(collider, {0,0}, true, 1); + + collider.move({1,0}, {1,1}, enemy); + nearby = require_found(collider, {0,0}, true, 1); + REQUIRE(nearby[0] == enemy); + + collider.move({1,1}, {0,1}, enemy); + nearby = require_found(collider, {0,0}, true, 1); + REQUIRE(nearby[0] == enemy); +} + +TEST_CASE("check all diagonal works", "[collision]") { + DinkyECS::World world; + Entity player = world.entity(); + Entity enemy = world.entity(); + + SpatialMap collider; + Point player_at = {1,1}; + collider.insert(player_at, player); + + Point enemy_at = {1, 0}; + collider.insert(enemy_at, enemy); + + for(size_t x = 0; x <= 2; x++) { + for(size_t y = 0; y <= 2; y++) { + if(enemy_at.x == player_at.x && enemy_at.y == player_at.y) continue; // skip player spot + EntityList nearby = require_found(collider, player_at, true, 1); + REQUIRE(nearby[0] == enemy); + + // move the enemy to a new spot around the player + Point move_to = {enemy_at.x + x, enemy_at.y + y}; + collider.move(enemy_at, move_to, enemy); + enemy_at = move_to; + } + } +} diff --git a/tests/tilemap.cpp b/tests/tilemap.cpp new file mode 100644 index 0000000..bae4b20 --- /dev/null +++ b/tests/tilemap.cpp @@ -0,0 +1,25 @@ +#include +#include +#include "map.hpp" +#include "worldbuilder.hpp" +#include "tilemap.hpp" +#include "config.hpp" +#include "rand.hpp" + +using namespace fmt; +using std::string; + +TEST_CASE("tilemap can load tiles and make a map", "[tilemap]") { + size_t width = Random::uniform(10, 25); + size_t height = Random::uniform(10, 33); + + Map map(width,height); + WorldBuilder builder(map); + builder.generate_map(); + + TileMap tiles(map.width(), map.height()); + auto& walls = map.walls(); + tiles.load(walls); + tiles.dump(); + REQUIRE(tiles.INVARIANT()); +} diff --git a/tests/worldbuilder.cpp b/tests/worldbuilder.cpp new file mode 100644 index 0000000..ff97012 --- /dev/null +++ b/tests/worldbuilder.cpp @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include "map.hpp" +#include "worldbuilder.hpp" + +using namespace fmt; +using namespace nlohmann; +using std::string; + +TEST_CASE("bsp algo test", "[builder]") { + Map map(31, 20); + WorldBuilder builder(map); + builder.generate_map(); +} + +TEST_CASE("pathing", "[builder]") { + Map map(23, 14); + WorldBuilder builder(map); + builder.generate_map(); + + matrix::dump("WALLS", map.$walls, 0,0); + println("wall at 0,0=={}", map.$walls[0][0]); + + for(matrix::each_cell it{map.$walls}; it.next();) { + if(map.$walls[it.y][it.x] == WALL_VALUE) { + REQUIRE(map.iswall(it.x, it.y) == true); + REQUIRE(map.can_move({it.x, it.y}) == false); + } else { + REQUIRE(map.iswall(it.x, it.y) == false); + REQUIRE(map.can_move({it.x, it.y}) == true); + } + } +} diff --git a/tilemap.cpp b/tilemap.cpp new file mode 100644 index 0000000..33bf726 --- /dev/null +++ b/tilemap.cpp @@ -0,0 +1,75 @@ +#include "tilemap.hpp" +#include "dbc.hpp" +#include "constants.hpp" + +using nlohmann::json; + +TileMap::TileMap(size_t width, size_t height) : + $config("./assets/tiles.json"), + $width(width), + $height(height), + $tile_ids(height, matrix::Row(width, SPACE_VALUE)), + $display(height, TileRow(width, {""})) +{ +} + +void TileMap::dump(int show_x, int show_y) { + for(matrix::each_row it{$tile_ids}; it.next();) { + const TileCell &cell = $display[it.y][it.x]; + + if(int(it.x) == show_x && int(it.y) == show_y) { + fmt::print("{}<", cell.display); + } else { + fmt::print("{} ", cell.display); + } + + if(it.row) fmt::print("\n"); + } +} + +void TileMap::set_tile(size_t x, size_t y, string tile_name) { + std::wstring tile_id = $config.wstring(tile_name, "display"); + json tile_conf = $config[tile_name]; + TileCell tile{ + tile_conf["display"], + tile_conf["foreground"][0], + tile_conf["foreground"][1], + tile_conf["foreground"][2], + tile_conf["background"][0], + tile_conf["background"][1], + tile_conf["background"][2]}; + + $tile_ids[y][x] = tile_id[0]; + $display[y][x] = tile; +} + +void TileMap::load(matrix::Matrix &walls) { + for(matrix::each_cell it{walls}; it.next();) { + string tile_name = walls[it.y][it.x] == SPACE_VALUE ? "FLOOR_TILE" : "WALL_TILE"; + set_tile(it.x, it.y, tile_name); + } +} + +const TileCell &TileMap::at(size_t x, size_t y) { + return $display[y][x]; +} + +std::vector TileMap::tile_names(bool collision) { + const auto &json = $config.json(); + std::vector keys; + + for(const auto& el : json.items()) { + const auto &val = el.value(); + if(val["collision"] == collision) { + keys.push_back(el.key()); + } + } + + return keys; +} + +bool TileMap::INVARIANT() { + dbc::check(matrix::height($tile_ids) == $height, "$tile_ids has wrong height"); + dbc::check(matrix::width($tile_ids) == $width, "$tile_ids has wrong width"); + return true; +} diff --git a/tilemap.hpp b/tilemap.hpp new file mode 100644 index 0000000..495300b --- /dev/null +++ b/tilemap.hpp @@ -0,0 +1,46 @@ +#pragma once +#include +#include +#include +#include +#include +#include "point.hpp" +#include "matrix.hpp" +#include "config.hpp" + +struct TileCell { + std::string display; + uint8_t fg_h = 0; + uint8_t fg_s = 0; + uint8_t fg_v = 0; + uint8_t bg_h = 0; + uint8_t bg_s = 0; + uint8_t bg_v = 0; +}; + +typedef std::vector TileRow; +typedef std::vector TileGrid; + +class TileMap { +public: + Config $config; + size_t $width; + size_t $height; + matrix::Matrix $tile_ids; + TileGrid $display; + + TileMap(size_t width, size_t height); + + // disable copying + TileMap(TileMap &map) = delete; + + size_t width() { return $width; } + size_t height() { return $height; } + void load(matrix::Matrix &walls); + const TileCell &at(size_t x, size_t y); + void set_tile(size_t x, size_t y, std::string tile_name); + std::vector tile_names(bool collision); + + void dump(int show_x=-1, int show_y=-1); + bool INVARIANT(); +}; diff --git a/tser.hpp b/tser.hpp new file mode 100644 index 0000000..0fe6972 --- /dev/null +++ b/tser.hpp @@ -0,0 +1,220 @@ +// Licensed under the Boost License . +// SPDX-License-Identifier: BSL-1.0 +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace tser{ + //implementation details for C++20 is_detected + namespace detail { + struct ns { + ~ns() = delete; + ns(ns const&) = delete; + }; + + template class Op, class... Args> + struct detector { + using value_t = std::false_type; + using type = Default; + }; + + template class Op, class... Args> + struct detector>, Op, Args...> { + using value_t = std::true_type; + using type = Op; + }; + + template + struct is_array : std::is_array {}; + + template class TArray, typename T, size_t N> + struct is_array> : std::true_type {}; + + constexpr size_t n_args(char const* c, size_t nargs = 1) { + for (; *c; ++c) if (*c == ',') ++nargs; + return nargs; + } + + constexpr size_t str_size(char const* c, size_t strSize = 1) { + for (; *c; ++c) ++strSize; + return strSize; + } + } + + // we need a bunch of template metaprogramming for being able to differentiate between different types + template class Op, class... Args> + constexpr bool is_detected_v = detail::detector::value_t::value; + + class BinaryArchive; + template using has_begin_t = decltype(*std::begin(std::declval())); + + template using has_members_t = decltype(std::declval().members()); + + template using has_smaller_t = decltype(std::declval() < std::declval()); + + template using has_equal_t = decltype(std::declval() == std::declval()); + + template using has_nequal_t = decltype(std::declval() != std::declval()); + + template using has_outstream_op_t = decltype(std::declval() << std::declval()); + + template using has_tuple_t = std::tuple_element_t<0, T>; + + template using has_optional_t = decltype(std::declval().has_value()); + + template using has_element_t = typename T::element_type; + + template using has_mapped_t = typename T::mapped_type; + + template using has_custom_save_t = decltype(std::declval().save(std::declval())); + + template using has_free_save_t = decltype(std::declval() << std::declval()); + + template constexpr bool is_container_v = is_detected_v; + + template constexpr bool is_tuple_v = is_detected_v; + + template constexpr bool is_tser_t_v = is_detected_v; + + template constexpr bool is_pointer_like_v = std::is_pointer_v || is_detected_v || is_detected_v; + + class BinaryArchive { + std::string m_bytes = std::string(1024, '\0'); + size_t m_bufferSize = 0, m_readOffset = 0; + + public: + explicit BinaryArchive(const size_t initialSize = 1024) : m_bytes(initialSize, '\0') {} + + template + explicit BinaryArchive(const T& t) { save(t); } + + template + void save(const T& t) { + if constexpr (is_detected_v) { + operator<<(t,*this); + } else if constexpr (is_detected_v) { + t.save(*this); + } else if constexpr(is_tser_t_v) { + std::apply([&](auto& ... mVal) { (save(mVal), ...); }, t.members()); + } else if constexpr(is_tuple_v) { + std::apply([&](auto& ... tVal) { (save(tVal), ...); }, t); + } else if constexpr (is_pointer_like_v) { + save(static_cast(t)); + if (t) + save(*t); + } else if constexpr (is_container_v) { + if constexpr (!detail::is_array::value) { + save(t.size()); + } + + for (auto& val : t) save(val); + } else { + if (m_bufferSize + sizeof(T) + sizeof(T) / 4 > m_bytes.size()) { + m_bytes.resize((m_bufferSize + sizeof(T)) * 2); + } + + std::memcpy(m_bytes.data() + m_bufferSize, std::addressof(t), sizeof(T)); + m_bufferSize += sizeof(T); + } + } + + template + void load(T& t) { + using V = std::decay_t; + if constexpr (is_detected_v) { + operator>>(t, *this); + } else if constexpr (is_detected_v) { + t.load(*this); + } else if constexpr (is_tser_t_v) { + std::apply([&](auto& ... mVal) { (load(mVal), ...); }, t.members()); + } else if constexpr (is_tuple_v) { + std::apply([&](auto& ... tVal) { (load(tVal), ...); }, t); + } else if constexpr (is_pointer_like_v) { + if constexpr (std::is_pointer_v) { + t = load() ? (t = new std::remove_pointer_t(), load(*t), t) : nullptr; + } else if constexpr (is_detected_v) { + t = load() ? T(load()) : T(); + } else { //smart pointer + t = T(load*>()); + } + } else if constexpr (is_container_v) { + if constexpr (!detail::is_array::value) { + const auto size = load(); + using VT = typename V::value_type; + for (size_t i = 0; i < size; ++i) { + if constexpr (!is_detected_v) { + t.insert(t.end(), load()); + } else { + //we have to special case map, because of the const key + t.emplace(VT{ load(), load() }); + } + } + } else { + for (auto& val : t) load(val); + } + } else { + std::memcpy(&t, m_bytes.data() + m_readOffset, sizeof(T)); + m_readOffset += sizeof(T); + } + } + + template + T load() { + std::remove_const_t t{}; load(t); return t; + } + + template + friend BinaryArchive& operator<<(BinaryArchive& ba, const T& t) { + ba.save(t); return ba; + } + + template + friend BinaryArchive& operator>>(BinaryArchive& ba, T& t) { + ba.load(t); return ba; + } + + void reset() { + m_bufferSize = 0; + m_readOffset = 0; + } + + void initialize(std::string_view str) { + m_bytes = str; + m_bufferSize = str.size(); + m_readOffset = 0; + } + + std::string_view get_buffer() const { + return std::string_view(m_bytes.data(), m_bufferSize); + } + + }; + + template + std::conditional_t, const Base, Base>& base(Derived* thisPtr) { return *thisPtr; } + + template + auto load(std::string_view encoded) { BinaryArchive ba(encoded); return ba.load(); } +} + +//this macro defines printing, serialisation and comparision operators (==,!=,<) for custom types +#define DEFINE_SERIALIZABLE(Type, ...) \ +inline decltype(auto) members() const { return std::tie(__VA_ARGS__); } \ +inline decltype(auto) members() { return std::tie(__VA_ARGS__); } \ +static constexpr std::array _memberNameData = [](){ \ +std::array chars{'\0'}; size_t _idx = 0; constexpr auto* ini(#__VA_ARGS__); \ +for (char const* _c = ini; *_c; ++_c, ++_idx) { if(*_c != ',' && *_c != ' ') chars[_idx] = *_c; } return chars;}(); \ +static constexpr const char* _typeName = #Type; \ +static constexpr std::array _memberNames = \ +[](){ std::array out{ }; \ +for(size_t _i = 0, nArgs = 0; nArgs < tser::detail::n_args(#__VA_ARGS__) ; ++_i) { \ +while(Type::_memberNameData[_i] == '\0') {_i++;} out[nArgs++] = &Type::_memberNameData[_i]; \ +while(Type::_memberNameData[++_i] != '\0'); } return out;}(); diff --git a/worldbuilder.cpp b/worldbuilder.cpp new file mode 100644 index 0000000..ab31cd5 --- /dev/null +++ b/worldbuilder.cpp @@ -0,0 +1,347 @@ +#include "worldbuilder.hpp" +#include "rand.hpp" +#include +#include +#include "components.hpp" + +using namespace fmt; +using namespace components; + +inline void check_player(DinkyECS::World &world, DinkyECS::Entity entity) { + auto player = world.get_the(); + dbc::check(player.entity != entity, "player shouldn't be added to world"); + + auto tile = world.get(player.entity); + dbc::check(tile.chr == "\ua66b", format("PLAYER TILE CHANGED {} != {}", tile.chr, "\ua66b")); +} + +inline int make_split(Room &cur, bool horiz) { + size_t dimension = horiz ? cur.height : cur.width; + int min = dimension / WORLDBUILD_DIVISION; + int max = dimension - min; + + return Random::uniform(min, max); +} + +void WorldBuilder::set_door(Room &room, int value) { + $map.$walls[room.entry.y][room.entry.x] = value; + $map.$walls[room.exit.y][room.exit.x] = value; +} + +void rand_side(Room &room, Point &door) { + dbc::check(int(room.width) > 0 && int(room.height) > 0, "Weird room with 0 for height or width."); + int rand_x = Random::uniform(0, room.width - 1); + int rand_y = Random::uniform(0, room.height - 1); + + switch(Random::uniform(0,3)) { + case 0: // north + door.x = room.x + rand_x; + door.y = room.y-1; + break; + case 1: // south + door.x = room.x + rand_x; + door.y = room.y + room.height; + break; + case 2: // east + door.x = room.x + room.width; + door.y = room.y + rand_y; + break; + case 3: // west + door.x = room.x - 1; + door.y = room.y + rand_y; + break; + default: + dbc::sentinel("impossible side"); + } +} + +void WorldBuilder::add_door(Room &room) { + rand_side(room, room.entry); + rand_side(room, room.exit); +} + +void WorldBuilder::partition_map(Room &cur, int depth) { + if(cur.width >= 3 && cur.width <= 6 && + cur.height >= 3 && cur.height <= 6) + { + $map.add_room(cur); + return; + } + + bool horiz = cur.width > cur.height ? false : true; + int split = make_split(cur, horiz); + if(split <= 0) return; // end recursion + + Room left = cur; + Room right = cur; + + if(horiz) { + if(split >= int(cur.height)) return; // end recursion + + left.height = size_t(split - 1); + right.y = cur.y + split; + right.height = size_t(cur.height - split); + } else { + if(split >= int(cur.width)) return; // end recursion + + left.width = size_t(split-1); + right.x = cur.x + split, + right.width = size_t(cur.width - split); + } + + // BUG: min room size should be configurable + if(depth > 0 && left.width > 2 && left.height > 2) { + partition_map(left, depth-1); + } + + // BUG: min room size should be configurable + if(depth > 0 && right.width > 2 && right.height > 2) { + partition_map(right, depth-1); + } +} + +void WorldBuilder::update_door(Point &at, int wall_or_space) { + $map.$walls[at.y][at.x] = wall_or_space; +} + + +void WorldBuilder::stylize_room(int room, string tile_name, float size) { + Point pos_out; + bool placed = $map.place_entity(room, pos_out); + dbc::check(placed, "failed to place style in room"); + + for(matrix::circle it{$map.$walls, pos_out, size}; it.next();) { + for(int x = it.left; x < it.right; x++) { + if(!$map.iswall(x, it.y)) { + $map.$tiles.set_tile(x, it.y, tile_name); + } + } + } +} + +void WorldBuilder::generate_rooms() { + Room root{ + .x = 0, + .y = 0, + .width = $map.$width, + .height = $map.$height + }; + // BUG: depth should be configurable + partition_map(root, 10); + place_rooms(); + + dbc::check($map.room_count() > 0, "map generated zero rooms, map too small?"); +} + +void WorldBuilder::generate_map() { + generate_rooms(); + + PointList holes; + for(size_t i = 0; i < $map.$rooms.size() - 1; i++) { + tunnel_doors(holes, $map.$rooms[i], $map.$rooms[i+1]); + } + + // one last connection from first room to last + tunnel_doors(holes, $map.$rooms.back(), $map.$rooms.front()); + + // place all the holes + for(auto hole : holes) { + + if(!matrix::inbounds($map.$walls, hole.x, hole.y)) { + matrix::dump("MAP BEFORE CRASH", $map.$walls, hole.x, hole.y); + + auto err = fmt::format("invalid hold target {},{} map is only {},{}", + hole.x, hole.y, matrix::width($map.$walls), + matrix::height($map.$walls)); + + dbc::sentinel(err); + } + + $map.$walls[hole.y][hole.x] = INV_SPACE; + } + + $map.invert_space(); + $map.expand(); + $map.load_tiles(); + + // get only the tiles with no collision to fill rooms + auto room_types = $map.$tiles.tile_names(false); + + for(size_t i = 0; i < $map.$rooms.size() - 1; i++) { + size_t room_type = Random::uniform(0, room_types.size() - 1); + int room_size = Random::uniform(100, 800); + string tile_name = room_types[room_type]; + stylize_room(i, tile_name, room_size * 0.01f); + } +} + + +DinkyECS::Entity configure_entity_in_map(DinkyECS::World &world, Map &game_map, json &entity_data, int in_room) { + auto item = world.entity(); + Point pos_out; + bool placed = game_map.place_entity(in_room, pos_out); + dbc::check(placed, "failed to randomly place item in room"); + world.set(item, {pos_out.x+1, pos_out.y+1}); + + if(entity_data["inventory_count"] > 0) { + world.set(item, {entity_data["inventory_count"], entity_data}); + } + + if(entity_data.contains("components")) { + components::configure(world, item, entity_data); + } + return item; +} + +inline json &select_entity_type(GameConfig &config, json &gen_config) { + int enemy_test = Random::uniform(0,100); + int device_test = Random::uniform(0, 100); + + if(enemy_test < gen_config["enemy_probability"]) { + return config.enemies.json(); + } else if(device_test < gen_config["device_probability"]) { + return config.devices.json(); + } else { + return config.items.json(); + } +} + +void WorldBuilder::randomize_entities(DinkyECS::World &world, GameConfig &config) { + auto &gen_config = config.game["worldgen"]; + + for(size_t room_num = $map.room_count() - 1; room_num > 0; room_num--) { + int empty_room = Random::uniform(0, 100); + if(empty_room < gen_config["empty_room_probability"]) continue; + + json& entity_db = select_entity_type(config, gen_config); + + std::vector keys; + for(auto& el : entity_db.items()) { + auto& data = el.value(); + + if(data["placement"] == nullptr) { + keys.push_back(el.key()); + } + } + + int rand_entity = Random::uniform(0, keys.size() - 1); + std::string key = keys[rand_entity]; + auto entity_data = entity_db[key]; + + // pass that to the config as it'll be a generic json + auto entity = configure_entity_in_map(world, $map, entity_data, room_num); + check_player(world, entity); + } +} + +inline void place_stairs(DinkyECS::World& world, GameConfig& config, Map& map) { + auto& device_config = config.devices.json(); + auto entity_data = device_config["STAIRS_DOWN"]; + int last_room = map.room_count() - 1; + auto entity = configure_entity_in_map(world, map, entity_data, last_room); + check_player(world, entity); +} + +void WorldBuilder::place_entities(DinkyECS::World &world) { + auto &config = world.get_the(); + // configure a player as a fact of the world + + if(world.has_the()) { + auto& player = world.get_the(); + Point pos_out; + bool placed = $map.place_entity(0, pos_out); + dbc::check(placed, "failed to randomly place item in room"); + world.set(player.entity, {pos_out.x+1, pos_out.y+1}); + } else { + auto player_data = config.enemies["PLAYER_TILE"]; + auto player_ent = configure_entity_in_map(world, $map, player_data, 0); + // configure player in the world + Player player{player_ent}; + world.set_the(player); + world.set(player.entity, {5}); + world.make_constant(player.entity); + } + + randomize_entities(world, config); + place_stairs(world, config, $map); +} + +void WorldBuilder::generate(DinkyECS::World &world) { + generate_map(); + place_entities(world); +} + +void WorldBuilder::make_room(size_t origin_x, size_t origin_y, size_t w, size_t h) { + $map.INVARIANT(); + dbc::pre("y out of bounds", origin_y + h < $map.$height); + dbc::pre("x out of bounds", origin_x + w < $map.$width); + + for(size_t y = origin_y; y < origin_y + h; ++y) { + for(size_t x = origin_x; x < origin_x + w; ++x) { + $map.$walls[y][x] = INV_SPACE; + } + } +} + + +void WorldBuilder::place_rooms() { + for(auto &cur : $map.$rooms) { + // println("ROOM x/y={},{}; w/h={},{}; map={},{}", + // cur.x, cur.y, cur.width, cur.height, $map.$width, $map.$height); + add_door(cur); + make_room(cur.x, cur.y, cur.width, cur.height); + } +} + +inline bool random_path(Map &map, PointList &holes, Point src, Point target) { + bool keep_going = false; + bool target_found = false; + int count = 0; + map.set_target(target); + map.make_paths(); + Matrix &paths = map.paths(); + + Point out{src.x, src.y}; + do { + keep_going = map.neighbors(out, true); + holes.push_back(out); + target_found = paths[out.y][out.x] == 0; + } while(!target_found && keep_going && ++count < WORLDBUILD_MAX_PATH); + + map.INVARIANT(); + map.clear_target(target); + + return target_found; +} + +inline void straight_path(Map &map, PointList &holes, Point src, Point target) { + for(matrix::line dig{src, target}; dig.next();) { + holes.emplace_back(size_t(dig.x), size_t(dig.y)); + Point expand{(size_t)dig.x+1, (size_t)dig.y}; + + if(map.inmap(expand.x, expand.y)) { + // BUG? should really just move doors away from the edge + holes.push_back(expand); + } + } +} + +void WorldBuilder::tunnel_doors(PointList &holes, Room &src, Room &target) { + int path_type = Random::uniform(0, 3); + + switch(path_type) { + case 0: + // for now do 25% as simple straight paths + straight_path($map, holes, src.exit, target.entry); + break; + case 1: + // for now do 25% as simple straight paths + straight_path($map, holes, src.exit, target.entry); + break; + default: + // then do the rest as random with fallback + if(!random_path($map, holes, src.exit, target.entry)) { + straight_path($map, holes, src.exit, target.entry); + } + } +} diff --git a/worldbuilder.hpp b/worldbuilder.hpp new file mode 100644 index 0000000..dad04f6 --- /dev/null +++ b/worldbuilder.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include "map.hpp" +#include "dinkyecs.hpp" +#include "components.hpp" + +class WorldBuilder { + public: + Map& $map; + + WorldBuilder(Map &map) : $map(map) { } + + void partition_map(Room &cur, int depth); + void make_room(size_t origin_y, size_t origin_x, size_t width, size_t height); + void add_door(Room &room); + void set_door(Room &room, int value); + void place_rooms(); + void tunnel_doors(PointList &holes, Room &src, Room &target); + void update_door(Point &at, int wall_or_space); + void stylize_room(int room, string tile_name, float size); + void generate_rooms(); + void generate_map(); + void place_entities(DinkyECS::World &world); + void generate(DinkyECS::World &world); + void random_entity(DinkyECS::World &world, components::GameConfig &config); + void randomize_entities(DinkyECS::World &world, components::GameConfig &config); +};