Fixed up the idea for having dynamic callbacks on devices. Might become the new way to do stuff but not sure.

main
Zed A. Shaw 11 months ago
parent d2162910f6
commit e30c18fbdf
  1. 8
      assets/devices.json
  2. 50
      components.cpp
  3. 44
      components.hpp
  4. 4
      events.hpp
  5. 1
      meson.build
  6. 6
      systems.cpp

@ -8,7 +8,9 @@
"inventory_count": 0, "inventory_count": 0,
"components": [ "components": [
{"type": "Tile", "config": {"chr": "\u2ac5"}}, {"type": "Tile", "config": {"chr": "\u2ac5"}},
{"type": "Device", "config": {"active": true}} {"type": "Device",
"config": {}, "actions": ["StairsDown"]
}
] ]
}, },
"STAIRS_UP": { "STAIRS_UP": {
@ -20,7 +22,9 @@
"inventory_count": 0, "inventory_count": 0,
"components": [ "components": [
{"type": "Tile", "config": {"chr": "\u2259"}}, {"type": "Tile", "config": {"chr": "\u2259"}},
{"type": "Device", "config": {"active": true}} {"type": "Device",
"config": {}, "actions": ["StairsUp"]
}
] ]
} }
} }

@ -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<Weapon>(entity, {config["damage"]});
} else if(comp["type"] == "LightSource") {
world.set<LightSource>(entity, {config["strength"], config["radius"]});
} else if(comp["type"] == "Loot") {
world.set<Loot>(entity, {config["amount"]});
} else if(comp["type"] == "Tile") {
world.set<Tile>(entity, {config["chr"]});
} else if(comp["type"] == "EnemyConfig") {
world.set<EnemyConfig>(entity, {config["hearing_distance"]});
} else if(comp["type"] == "Combat") {
world.set<Combat>(entity, {config["hp"], config["damage"]});
} else if(comp["type"] == "Curative") {
world.set<Curative>(entity, {config["hp"]});
} else if(comp["type"] == "Motion") {
world.set<Motion>(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<Device>(entity, device);
} else {
dbc::sentinel(fmt::format("ITEM COMPONENT TYPE MISSING: {}",
std::string(comp["type"])));
}
}
}
}

@ -6,10 +6,23 @@
#include "config.hpp" #include "config.hpp"
namespace components { namespace components {
typedef std::function<void(json &config, DinkyECS::World &world)> Action;
struct Device { struct Device {
bool active = 0; json config;
std::vector<Action> 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 { struct Player {
DinkyECS::Entity entity; DinkyECS::Entity entity;
DEFINE_SERIALIZABLE(Player, entity); DEFINE_SERIALIZABLE(Player, entity);
@ -62,32 +75,5 @@ namespace components {
int hp = 10; int hp = 10;
}; };
inline void configure(DinkyECS::World &world, DinkyECS::Entity entity, json& entity_data) { 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<Weapon>(entity, {config["damage"]});
} else if(comp["type"] == "LightSource") {
world.set<LightSource>(entity, {config["strength"], config["radius"]});
} else if(comp["type"] == "Loot") {
world.set<Loot>(entity, {config["amount"]});
} else if(comp["type"] == "Tile") {
world.set<Tile>(entity, {config["chr"]});
} else if(comp["type"] == "EnemyConfig") {
world.set<EnemyConfig>(entity, {config["hearing_distance"]});
} else if(comp["type"] == "Combat") {
world.set<Combat>(entity, {config["hp"], config["damage"]});
} else if(comp["type"] == "Curative") {
world.set<Curative>(entity, {config["hp"]});
} else if(comp["type"] == "Motion") {
world.set<Motion>(entity, {config["dx"], config["dy"], config["random"]});
} else if(comp["type"] == "Device") {
world.set<Device>(entity, {config["active"]});
} else {
dbc::sentinel(fmt::format("ITEM COMPONENT TYPE MISSING: {}",
std::string(comp["type"])));
}
}
}
} }

@ -9,8 +9,4 @@ namespace Events {
int player_did; int player_did;
int enemy_did; int enemy_did;
}; };
struct Death {
int placeholder = 0;
};
} }

@ -37,6 +37,7 @@ source=[
'lights.cpp', 'lights.cpp',
'worldbuilder.cpp', 'worldbuilder.cpp',
'inventory.cpp', 'inventory.cpp',
'components.cpp',
] ]
runtests = executable('runtests', runtests = executable('runtests',

@ -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) { void System::device(DinkyECS::World &world, DinkyECS::Entity actor, DinkyECS::Entity item) {
auto& device = world.get<Device>(item); auto& device = world.get<Device>(item);
if(device.active) { println("entity {} INTERACTED WITH DEVICE {}", actor, item);
println("entity {} INTERACTED WITH DEVICE {}", actor, item); device.hit(world);
device.active = false;
}
} }