#pragma once #include "dinkyecs.hpp" #include "combat.hpp" #include "inventory.hpp" #include "tser.hpp" #include "config.hpp" namespace components { struct Player { DinkyECS::Entity entity; DEFINE_SERIALIZABLE(Player, entity); }; struct Position { Point location; DEFINE_SERIALIZABLE(Position, location); }; struct Motion { int dx; int dy; bool random=false; DEFINE_SERIALIZABLE(Motion, dx, dy); }; struct Loot { int amount; DEFINE_SERIALIZABLE(Loot, amount); }; struct Tile { std::string chr; DEFINE_SERIALIZABLE(Tile, chr); }; struct GameConfig { Config game; Config enemies; Config items; Config tiles; }; struct EnemyConfig { int hearing_distance = 10; }; struct Debug { bool PATHS=false; bool LIGHT=false; }; struct Weapon { int damage = 0; }; struct Curative { 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(entity, {config["damage"]}); } else if(comp["type"] == "LightSource") { world.set(entity, {config["strength"], config["radius"]}); } else if(comp["type"] == "Loot") { world.set(entity, {config["amount"]}); } else if(comp["type"] == "Tile") { world.set(entity, {config["chr"]}); } else if(comp["type"] == "EnemyConfig") { world.set(entity, {config["hearing_distance"]}); } else if(comp["type"] == "Combat") { world.set(entity, {config["hp"], config["damage"]}); } else if(comp["type"] == "Curative") { world.set(entity, {config["hp"]}); } else if(comp["type"] == "Motion") { world.set(entity, {config["dx"], config["dy"], config["random"]}); } else { dbc::sentinel(fmt::format("ITEM COMPONENT TYPE MISSING: {}", std::string(comp["type"]))); } } } }