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 5 days 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;
}
} }

Loading…
Cancel
Save