Started to set things up so that the boss fight UI can load enemies and configs out of the components setup.

master
Zed A. Shaw 10 months ago
parent 033358749f
commit b3b8cbbeee
  1. 2
      assets/enemies.json
  2. 5
      boss_fight_ui.cpp
  3. 1
      boss_fight_ui.hpp
  4. 8
      components.cpp
  5. 13
      components.hpp

@ -78,7 +78,7 @@
{"_type": "EnemyConfig", "hearing_distance": 3}, {"_type": "EnemyConfig", "hearing_distance": 3},
{"_type": "Animation", "easing": 2, "ease_rate": 0.2, "scale": 0.1, "simple": true, "frames": 10, "speed": 1.0}, {"_type": "Animation", "easing": 2, "ease_rate": 0.2, "scale": 0.1, "simple": true, "frames": 10, "speed": 1.0},
{"_type": "Sprite", "name": "rat_king"}, {"_type": "Sprite", "name": "rat_king"},
{"_type": "Sound", "attack": "Medium_Rat", "death": "Creature_Death_1"} {"_type": "Sound", "attack": "Sword_Hit_2", "death": "Creature_Death_1"}
] ]
}, },
"SPIDER_GIANT_HAIRY": { "SPIDER_GIANT_HAIRY": {

@ -32,6 +32,9 @@ namespace gui {
} }
void BossFightUI::init() { void BossFightUI::init() {
auto& config = $level.world->get_the<components::GameConfig>();
$sounds = components::get<components::Sound>(config.enemies["RAT_KING"]);
$status.world().set_the<Background>({$status.$parser}); $status.world().set_the<Background>({$status.$parser});
for(auto& [name, cell] : $status.cells()) { for(auto& [name, cell] : $status.cells()) {
@ -65,7 +68,7 @@ namespace gui {
$boss_image.sprite->setScale({scale, scale}); $boss_image.sprite->setScale({scale, scale});
if(scale > 1.0) { if(scale > 1.0) {
if(!sound::playing("Sword_Hit_2")) sound::play("Sword_Hit_2"); if(!sound::playing($sounds.attack)) sound::play($sounds.attack);
$boss_image.sprite->setColor({255,255,255}); $boss_image.sprite->setColor({255,255,255});
} }

@ -21,6 +21,7 @@ namespace gui {
sf::Clock $clock; sf::Clock $clock;
int $boss_hp = 10; int $boss_hp = 10;
bool $boss_hit = false; bool $boss_hit = false;
components::Sound $sounds;
GameLevel $level; GameLevel $level;
guecs::UI $status; guecs::UI $status;
guecs::UI $overlay; guecs::UI $overlay;

@ -3,14 +3,6 @@
#include "easings.hpp" #include "easings.hpp"
namespace components { namespace components {
ENROLL_COMPONENT(Position, location.x, location.y);
ENROLL_COMPONENT(EnemyConfig, hearing_distance);
ENROLL_COMPONENT(Motion, dx, dy, random);
ENROLL_COMPONENT(Combat, hp, max_hp, damage, dead);
ENROLL_COMPONENT(Device, config, events);
ENROLL_COMPONENT(Animation, scale, simple, frames, speed, easing, ease_rate);
ENROLL_COMPONENT(Sound, attack, death);
void configure_entity(const ComponentMap& component_map, DinkyECS::World& world, DinkyECS::Entity ent, json& data) { void configure_entity(const ComponentMap& component_map, DinkyECS::World& world, DinkyECS::Entity ent, json& data) {
for (auto &i : data) { for (auto &i : data) {
dbc::check(i.contains("_type") && i["_type"].is_string(), fmt::format("component has no _type: {}", data.dump())); dbc::check(i.contains("_type") && i["_type"].is_string(), fmt::format("component has no _type: {}", data.dump()));

@ -116,14 +116,19 @@ namespace components {
template <typename T> struct NameOf; template <typename T> struct NameOf;
// these need to be here if you're using components::convert outside of components.cpp
ENROLL_COMPONENT(Tile, display, foreground, background); ENROLL_COMPONENT(Tile, display, foreground, background);
ENROLL_COMPONENT(Sprite, name); ENROLL_COMPONENT(Sprite, name);
ENROLL_COMPONENT(Curative, hp); ENROLL_COMPONENT(Curative, hp);
ENROLL_COMPONENT(LightSource, strength, radius); ENROLL_COMPONENT(LightSource, strength, radius);
ENROLL_COMPONENT(Weapon, damage); ENROLL_COMPONENT(Weapon, damage);
ENROLL_COMPONENT(Loot, amount); ENROLL_COMPONENT(Loot, amount);
ENROLL_COMPONENT(Position, location.x, location.y);
ENROLL_COMPONENT(EnemyConfig, hearing_distance);
ENROLL_COMPONENT(Motion, dx, dy, random);
ENROLL_COMPONENT(Combat, hp, max_hp, damage, dead);
ENROLL_COMPONENT(Device, config, events);
ENROLL_COMPONENT(Animation, scale, simple, frames, speed, easing, ease_rate);
ENROLL_COMPONENT(Sound, attack, death);
using ReflFuncSignature = std::function<void(DinkyECS::World& world, DinkyECS::Entity ent, nlohmann::json &j)>; using ReflFuncSignature = std::function<void(DinkyECS::World& world, DinkyECS::Entity ent, nlohmann::json &j)>;
using ComponentMap = std::unordered_map<std::string, ReflFuncSignature>; using ComponentMap = std::unordered_map<std::string, ReflFuncSignature>;
@ -140,9 +145,7 @@ namespace components {
template<typename COMPONENT> COMPONENT get(nlohmann::json &data) { template<typename COMPONENT> COMPONENT get(nlohmann::json &data) {
for (auto &i : data["components"]) { for (auto &i : data["components"]) {
if(i["_type"] == NameOf<COMPONENT>::name) { if(i["_type"] == NameOf<COMPONENT>::name) {
COMPONENT result; return convert<COMPONENT>(i);
from_json(i, result);
return result;
} }
} }