#pragma once #include #include "../render/canvas.hpp" #include "../resource/xml/anm2.hpp" namespace game::entity { class Actor : public resource::xml::Anm2 { public: static constexpr auto TICK_RATE = 30.0f; enum Mode { PLAY, PLAY_FORCE, SET, }; enum State { STOPPED, PLAYING }; class Override { private: public: enum Mode { SET, ADD }; using Function = void (*)(Override&); int id{-1}; Anm2::Type type{Anm2::NONE}; Mode mode{SET}; FrameOptional frame{}; std::optional time{}; Function function{nullptr}; FrameOptional frameBase{}; std::optional timeStart{}; float cycles{}; Override() = default; Override(int, Anm2::Type, Mode, FrameOptional = {}, std::optional = std::nullopt, Function = nullptr, float = 0); }; struct QueuedPlay { std::string animation{}; float time{}; float speedMultiplier{1.0f}; Mode mode{PLAY}; bool isInterruptible{true}; bool isPlayAfterAnimation{false}; inline bool empty() { return animation.empty(); }; }; State state{STOPPED}; Mode mode{PLAY}; glm::vec2 position{}; float time{}; bool isShowNulls{}; int animationIndex{-1}; int playedEventID{-1}; float startTime{}; float speedMultiplier{}; QueuedPlay queuedPlay{}; QueuedPlay currentQueuedPlay{}; QueuedPlay nextQueuedPlay{}; std::unordered_set playedTriggers{}; std::vector overrides{}; Actor() = default; Actor(const Actor&); Actor(Actor&&) noexcept; Actor& operator=(const Actor&); Actor& operator=(Actor&&) noexcept; Actor(resource::xml::Anm2, glm::vec2 position = {}, Mode = PLAY, float time = 0.0f, int animationIndex = -1); bool is_playing(const std::string& name = {}); glm::vec4 null_frame_rect(int = -1); glm::vec4 rect(); int animation_index_get(const std::string&); int item_length(resource::xml::Anm2::Item*); resource::xml::Anm2::Animation* animation_get(const std::string&); resource::xml::Anm2::Animation* animation_get(int = -1); resource::xml::Anm2::Frame frame_generate(resource::xml::Anm2::Item&, float, resource::xml::Anm2::Type, int id = -1); resource::xml::Anm2::Item* item_get(resource::xml::Anm2::Type, int = -1, int = -1); void consume_played_event(); void play(const std::string& animation, Mode = PLAY, float time = 0.0f, float speedMultiplier = 1.0f); void play(int index, Mode = PLAY, float time = 0.0f, float speedMultiplier = 1.0f); void play_default_animation(Mode = PLAY, float = 0.0f, float = 1.0f); void queue_default_animation(); void queue_play(QueuedPlay); bool is_animation_finished(); void render(resource::Shader& textureShader, resource::Shader& rectShader, Canvas&); void tick(); }; }