The Mega Snivy Update
Some checks failed
Build / Build Game (push) Has been cancelled

This commit is contained in:
2026-02-28 21:48:00 -05:00
parent 8b2edd1359
commit 17f3348e94
163 changed files with 8725 additions and 13281 deletions

113
src/entity/actor.hpp Normal file
View File

@@ -0,0 +1,113 @@
#pragma once
#include <unordered_set>
#include "../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<float> time{};
Function function{nullptr};
FrameOptional frameBase{};
std::optional<float> timeStart{};
float cycles{};
Override() = default;
Override(int, Anm2::Type, Mode, FrameOptional = {}, std::optional<float> = 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<int> playedTriggers{};
std::vector<Override> 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();
};
}