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,
"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"]
}
]
}
}

@ -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"
namespace components {
typedef std::function<void(json &config, DinkyECS::World &world)> Action;
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 {
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<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"])));
}
}
}
void configure(DinkyECS::World &world, DinkyECS::Entity entity, json& entity_data);
}

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

@ -37,6 +37,7 @@ source=[
'lights.cpp',
'worldbuilder.cpp',
'inventory.cpp',
'components.cpp',
]
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) {
auto& device = world.get<Device>(item);
if(device.active) {
println("entity {} INTERACTED WITH DEVICE {}", actor, item);
device.active = false;
}
println("entity {} INTERACTED WITH DEVICE {}", actor, item);
device.hit(world);
}