From e30c18fbdf5ba00bd1163be13816647a3d2e2859 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Wed, 15 Jan 2025 23:43:25 -0500 Subject: [PATCH] Fixed up the idea for having dynamic callbacks on devices. Might become the new way to do stuff but not sure. --- assets/devices.json | 8 ++++++-- components.cpp | 50 +++++++++++++++++++++++++++++++++++++++++++++ components.hpp | 44 ++++++++++++++------------------------- events.hpp | 4 ---- meson.build | 1 + systems.cpp | 6 ++---- 6 files changed, 74 insertions(+), 39 deletions(-) create mode 100644 components.cpp diff --git a/assets/devices.json b/assets/devices.json index 0c4c0f5..57de267 100644 --- a/assets/devices.json +++ b/assets/devices.json @@ -8,7 +8,9 @@ "inventory_count": 0, "components": [ {"type": "Tile", "config": {"chr": "\u2ac5"}}, - {"type": "Device", "config": {"active": true}} + {"type": "Device", + "config": {}, "actions": ["StairsDown"] + } ] }, "STAIRS_UP": { @@ -20,7 +22,9 @@ "inventory_count": 0, "components": [ {"type": "Tile", "config": {"chr": "\u2259"}}, - {"type": "Device", "config": {"active": true}} + {"type": "Device", + "config": {}, "actions": ["StairsUp"] + } ] } } diff --git a/components.cpp b/components.cpp new file mode 100644 index 0000000..60efbc3 --- /dev/null +++ b/components.cpp @@ -0,0 +1,50 @@ +#include "components.hpp" + +namespace components { + void StairsDown(json &, DinkyECS::World &) { + fmt::println("GOING DOWN!"); + } + + void StairsUp(json &, DinkyECS::World &) { + fmt::println("GOING UP!"); + } + + void configure(DinkyECS::World &world, DinkyECS::Entity entity, json& entity_data) { + for(auto &comp : entity_data["components"]) { + json& config = comp["config"]; + + 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, .actions={}}; + + for(auto name : comp["actions"]) { + if(name == "StairsUp") { + device.actions.push_back(StairsUp); + } else if(name == "StairsDown") { + device.actions.push_back(StairsUp); + } + } + + world.set(entity, device); + } else { + dbc::sentinel(fmt::format("ITEM COMPONENT TYPE MISSING: {}", + std::string(comp["type"]))); + } + } + } +} diff --git a/components.hpp b/components.hpp index 6b41ff0..9d766bd 100644 --- a/components.hpp +++ b/components.hpp @@ -6,10 +6,23 @@ #include "config.hpp" namespace components { + typedef std::function Action; + struct Device { - bool active = 0; + json config; + std::vector actions; + + void hit(DinkyECS::World &world) { + for(auto& action : actions) { + action(config, world); + } + } }; + void StairsDown(json &data, DinkyECS::World &world); + void StairsUp(json &data, DinkyECS::World &world); + void DummyDeviceAction(json &data, DinkyECS::World &world); + struct Player { DinkyECS::Entity entity; DEFINE_SERIALIZABLE(Player, entity); @@ -62,32 +75,5 @@ namespace components { int hp = 10; }; - inline void configure(DinkyECS::World &world, DinkyECS::Entity entity, json& entity_data) { - for(auto &comp : entity_data["components"]) { - json& config = comp["config"]; - - 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") { - world.set(entity, {config["active"]}); - } else { - dbc::sentinel(fmt::format("ITEM COMPONENT TYPE MISSING: {}", - std::string(comp["type"]))); - } - } - } + void configure(DinkyECS::World &world, DinkyECS::Entity entity, json& entity_data); } diff --git a/events.hpp b/events.hpp index 032025e..0c022ea 100644 --- a/events.hpp +++ b/events.hpp @@ -9,8 +9,4 @@ namespace Events { int player_did; int enemy_did; }; - - struct Death { - int placeholder = 0; - }; } diff --git a/meson.build b/meson.build index 6880666..ec495e7 100644 --- a/meson.build +++ b/meson.build @@ -37,6 +37,7 @@ source=[ 'lights.cpp', 'worldbuilder.cpp', 'inventory.cpp', + 'components.cpp', ] runtests = executable('runtests', diff --git a/systems.cpp b/systems.cpp index ef42f28..ea1f93a 100644 --- a/systems.cpp +++ b/systems.cpp @@ -217,8 +217,6 @@ void System::pickup(DinkyECS::World &world, DinkyECS::Entity actor, DinkyECS::En void System::device(DinkyECS::World &world, DinkyECS::Entity actor, DinkyECS::Entity item) { auto& device = world.get(item); - if(device.active) { - println("entity {} INTERACTED WITH DEVICE {}", actor, item); - device.active = false; - } + println("entity {} INTERACTED WITH DEVICE {}", actor, item); + device.hit(world); }