Whatever The Fuck Man

This commit is contained in:
shweet committed 2026-07-04 00:15:26 -04:00
1 parent ce77175162
commit 2efed2a443
162 files changed
+13119 -7417

No files matched your search

+251
View File
@@ -0,0 +1,251 @@
#pragma once
#include <unordered_set>
#include "render/canvas.hpp"
#include "resource/character.hpp"
#include "util/measurement.hpp"
namespace game
{
enum EntityType
{
ACTOR,
CHARACTER,
CURSOR,
AUTOCURSOR,
ITEM,
PARTICLE
};
class Entity
{
public:
using Anm2 = resource::xml::Anm2;
using FrameOptional = Anm2::FrameOptional;
static constexpr auto UPDATE_RATE = 60.0f;
static constexpr auto DIGESTION_MAX = 100.0f;
enum Mode
{
PLAY,
PLAY_FORCE,
SET,
};
enum State
{
STOPPED,
PLAYING
};
enum class Transition
{
NOW,
AFTER_CURRENT,
IF_IDLE
};
enum class Interrupt
{
IF_ALLOWED,
ALWAYS,
NEVER
};
enum CursorState
{
DEFAULT,
HOVER,
ACTION
};
enum SpritesheetType
{
NORMAL,
ALTERNATE
};
class Override
{
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 AnimationRequest
{
std::string animation{};
std::string appendID{};
int index{-1};
float time{};
float speedMultiplier{1.0f};
Mode mode{PLAY};
Transition transition{Transition::NOW};
Interrupt interrupt{Interrupt::IF_ALLOWED};
inline bool empty() const { return animation.empty() && index == -1; };
};
EntityType entityType{ACTOR};
int fps{30};
std::map<int, Anm2::Spritesheet> spritesheets{};
std::map<int, Anm2::Layer> layers{};
std::map<int, Anm2::Null> nulls{};
std::map<int, Anm2::Event> events{};
std::map<int, Anm2::Sound> sounds{};
std::unordered_map<std::string, int> layerMap{};
std::unordered_map<std::string, int> nullMap{};
std::unordered_map<std::string, int> eventMap{};
std::string defaultAnimation{};
int defaultAnimationID{-1};
std::vector<Anm2::Animation> animations{};
std::unordered_map<std::string, int> animationMap{};
std::unordered_map<int, std::string> animationMapReverse{};
std::unordered_set<std::string> invalidAnimations{};
std::string path{};
bool isValid{};
Anm2::Flags flags{};
State state{STOPPED};
Mode mode{PLAY};
glm::vec2 position{};
float time{};
bool isShowNulls{};
bool isVisible{true};
int animationIndex{-1};
int playedEventID{-1};
float startTime{};
float speedMultiplier{};
AnimationRequest pendingAnimation{};
AnimationRequest currentAnimation{};
AnimationRequest nextAnimation{};
std::unordered_set<int> playedTriggers{};
std::vector<Override> overrides{};
resource::xml::Character data;
float weight{};
int stage{0};
float calories{};
float capacity{};
float digestionProgress{};
float digestionRate{0.05f};
int digestionTimer{};
bool isDigesting{};
bool isJustDigested{};
float eatSpeed{1.0f};
float totalCaloriesConsumed{};
int totalFoodItemsEaten{};
int talkOverrideID{};
float talkTimer{};
bool isTalking{};
std::vector<int> animationTalkDurations{};
int blinkOverrideID{};
float blinkTimer{};
bool isBlinking{};
std::vector<int> animationBlinkDurations{};
bool isStageUp{};
bool isStageUpDuring{};
bool isJustStageUp{};
bool isJustStageFinal{};
SpritesheetType spritesheetType{};
std::map<int, Override> interactAreaOverrides{};
std::unordered_map<int, int> expandAreaOverrideLayerIDs{};
std::unordered_map<int, int> expandAreaOverrideNullIDs{};
CursorState cursorState{DEFAULT};
int interactTypeID{-1};
std::optional<glm::vec2> positionOverride{};
bool isToBeDeleted{};
bool isRemoveOnAnimationEnd{};
bool isHeld{};
int schemaID{};
int rotationOverrideID{};
int durability{};
glm::vec2 velocity{};
float angularVelocity{};
float phase{};
float magnetTime{};
bool isCollected{};
bool isMagnetized{};
Entity() = default;
Entity(const Entity&);
Entity(Entity&&) noexcept;
Entity& operator=(const Entity&);
Entity& operator=(Entity&&) noexcept;
Entity(resource::xml::Anm2, glm::vec2 position = {}, Mode = PLAY, float time = 0.0f, int animationIndex = -1);
Entity(resource::xml::Character&, glm::ivec2);
Entity(resource::xml::Anm2, glm::ivec2 position, int id, int durability = 0, int animationIndex = -1,
glm::vec2 velocity = {}, float rotation = 0.0f);
bool is_playing(const std::string& name = {});
glm::vec4 null_frame_rect(int = -1, int animationIndex = -1, float time = -1.0f);
glm::vec4 rect();
int animation_index_get(const std::string&);
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(AnimationRequest);
bool is_animation_request() const;
bool is_animation_finished();
void render(resource::Shader& textureShader, resource::Shader& rectShader, Canvas&);
float weight_get(util::measurement::System = util::measurement::METRIC);
float digestion_rate_get();
float capacity_percent_get() const;
float max_capacity() const;
bool is_over_capacity() const;
bool is_max_capacity() const;
int stage_get() const;
int stage_from_weight_get(float weight) const;
int stage_max_get() const;
int stage_count_get() const;
float stage_progress_get();
float stage_threshold_get(int stage = -1, util::measurement::System = util::measurement::METRIC) const;
float stage_threshold_next_get(util::measurement::System = util::measurement::METRIC) const;
void expand_areas_apply();
void spritesheet_set(SpritesheetType);
std::string idle_animation_get() const;
std::string animation_append_id_get() const;
void update();
private:
void anm2_set(const resource::xml::Anm2&);
void animation_start(int, const AnimationRequest&);
bool animation_request_apply(AnimationRequest&);
void pending_animation_apply();
void animation_update();
void character_values_clamp();
void character_update();
};
}