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:
parent
d2162910f6
commit
e30c18fbdf
6 changed files with 74 additions and 39 deletions
|
@ -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"]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
50
components.cpp
Normal file
50
components.cpp
Normal file
|
@ -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.active = false;
|
device.hit(world);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue