#include "game/entities/concrete/dust.hpp" #include #include #include "game/entities/entity_factory.hpp" namespace { // Llig una animació opcional del bloc `animations` del YAML, amb // valors per defecte segurs (1 frame, fps=1, sense loop). Si la // clau no existeix, retornem una animació "ja completada" — així, // un Dust spawnejat amb una variant inexistent al YAML mor al // pròxim frame sense petar. auto buildAnim(const fkyaml::node& yaml, const std::string& key) -> AnimationComponent { std::vector frames = {0}; float fps = 1.0F; bool loop = false; if (yaml.contains("animations") && yaml["animations"].contains(key)) { const auto& anim = yaml["animations"][key]; if (anim.contains("frames")) { frames.clear(); for (const auto& f : anim["frames"]) { // cppcheck-suppress useStlAlgorithm frames.push_back(f.get_value()); } if (frames.empty()) { frames.push_back(0); } } if (anim.contains("fps")) { fps = anim["fps"].get_value(); } if (anim.contains("loop")) { loop = anim["loop"].get_value(); } } return {frames, fps, loop}; } } // namespace Dust::Dust(const fkyaml::node& yaml) : anim_jump_(buildAnim(yaml, "jump")), anim_land_(buildAnim(yaml, "land")) { name_ = yaml.contains("name") ? yaml["name"].get_value() : std::string("dust"); collides_ = false; interactable_ = false; // Per defecte JUMP; el spawner pot canviar-la abans del primer tick. anim_ = anim_jump_; } void Dust::setVariant(Variant v) { anim_ = (v == Variant::JUMP) ? anim_jump_ : anim_land_; if (anim_.has_value()) { anim_->reset(); } } void Dust::update(float delta_time) { Entity::update(delta_time); if (anim_.has_value() && anim_->completed()) { markDead(); } } REGISTER_ENTITY("dust", Dust)