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

This commit is contained in:
Zed A. Shaw 2025-01-15 23:43:25 -05:00
parent d2162910f6
commit e30c18fbdf
6 changed files with 74 additions and 39 deletions

View file

@ -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);
}