TamaTac & SfxEngine + Sprite tools (#24)

This commit is contained in:
Shadowtrance
2026-02-14 06:26:23 +10:00
committed by GitHub
parent 9ba1d460bd
commit 0b22f67a82
56 changed files with 8282 additions and 0 deletions
+187
View File
@@ -0,0 +1,187 @@
/**
* @file PetStats.h
* @brief Data structures for TamaTac pet state
*/
#pragma once
#include <cstdint>
// Pet actions
enum class PetAction {
Feed,
Play,
Medicine,
Sleep,
Clean,
Pet // Tap-to-pet: small happiness boost
};
// Life stages (evolution)
enum class LifeStage {
Egg, // 0-1 hour
Baby, // 1-8 hours
Teen, // 8-24 hours
Adult, // 24-72 hours
Elder, // 72+ hours
Ghost // Dead
};
// Pet personality (affects stat decay rates)
enum class Personality : uint8_t {
Energetic = 0, // -1 energy decay, +1 hunger decay
Lazy = 1, // +1 energy decay, -1 happiness decay
Glutton = 2, // +1 hunger decay, +1 cleanliness decay
Cheerful = 3, // -1 happiness decay, +1 energy decay
Hardy = 4 // -1 health_neglect decay, +1 hunger decay
};
// Day/night cycle (derived from ageSeconds, not stored)
enum class DayPhase : uint8_t { Day = 0, Night = 1 };
// Random events (transient, not saved)
enum class RandomEvent : uint8_t {
None = 0,
FoundTreat, // +15 hunger
MadeFriend, // +15 happiness
CaughtCold, // becomes sick, -10 health
GotMuddy, // -20 cleanliness
HadNap, // +15 energy
SunnyDay // +10 happiness (day only)
};
// Animation states (for sprites)
enum class AnimState {
Idle,
Happy,
Sad,
Sleeping,
Eating,
Playing,
Sick,
Dead
};
// Pet statistics and state
struct PetStats {
// Primary stats (0-100 range)
uint8_t hunger; // 100 = full, 0 = starving
uint8_t happiness; // 100 = very happy, 0 = depressed
uint8_t health; // 100 = healthy, 0 = dead
uint8_t energy; // 100 = energized, 0 = exhausted
// Secondary stats
uint8_t cleanliness; // 100 = clean, 0 = filthy
uint8_t poopCount; // Number of poops that need cleaning
// Age tracking
uint32_t ageSeconds; // Total age in seconds
uint16_t ageHours; // Age in hours (for evolution) - supports up to ~7.5 years
// Longevity (for high scores)
uint32_t lifespan; // Total seconds alive (resets on death)
// State flags
bool isSick; // True when health < 20
bool isAsleep; // True during sleep action
bool isDead; // True when health reaches 0
// Current state
LifeStage stage;
AnimState currentAnim;
Personality personality;
RandomEvent lastEvent; // Transient — not saved/loaded
// Timestamps
uint32_t lastUpdateTime; // Last stat update (millis)
uint32_t lastFeedTime; // Last time fed (millis)
uint32_t lastPlayTime; // Last time played (millis)
// Initialize with default values
PetStats() :
hunger(80),
happiness(70),
health(100),
energy(90),
cleanliness(100),
poopCount(0),
ageSeconds(0),
ageHours(0),
lifespan(0),
isSick(false),
isAsleep(false),
isDead(false),
stage(LifeStage::Egg),
currentAnim(AnimState::Idle),
personality(Personality::Energetic),
lastEvent(RandomEvent::None),
lastUpdateTime(0),
lastFeedTime(0),
lastPlayTime(0)
{}
};
// Enum-to-string helpers (shared across views)
inline const char* lifeStageToString(LifeStage stage) {
switch (stage) {
case LifeStage::Egg: return "Egg";
case LifeStage::Baby: return "Baby";
case LifeStage::Teen: return "Teen";
case LifeStage::Adult: return "Adult";
case LifeStage::Elder: return "Elder";
case LifeStage::Ghost: return "Ghost";
default: return "Unknown";
}
}
inline const char* personalityToString(Personality p) {
switch (p) {
case Personality::Energetic: return "Energetic";
case Personality::Lazy: return "Lazy";
case Personality::Glutton: return "Glutton";
case Personality::Cheerful: return "Cheerful";
case Personality::Hardy: return "Hardy";
default: return "Unknown";
}
}
// Stat thresholds
namespace PetThresholds {
constexpr uint8_t STAT_MAX = 100;
constexpr uint8_t STAT_MIN = 0;
constexpr uint8_t HUNGRY_THRESHOLD = 30;
constexpr uint8_t UNHAPPY_THRESHOLD = 30;
constexpr uint8_t SICK_THRESHOLD = 20;
constexpr uint8_t TIRED_THRESHOLD = 20;
constexpr uint8_t DIRTY_THRESHOLD = 30;
}
// Decay rates (per 30-second tick)
namespace DecayRates {
constexpr uint8_t HUNGER_DECAY = 2; // Hungry every ~15 minutes
constexpr uint8_t HAPPINESS_DECAY = 1; // Bored every ~30 minutes
constexpr uint8_t ENERGY_DECAY = 2; // Tired every ~15 minutes
constexpr uint8_t HEALTH_DECAY_NEGLECT = 1; // When hungry or unhappy
constexpr uint32_t TICK_INTERVAL_SEC = 30; // Decay rates are calibrated for this interval
}
// Action effects
namespace ActionEffects {
constexpr uint8_t FEED_HUNGER_GAIN = 30;
constexpr uint8_t FEED_HAPPINESS_LOSS = 5; // Boring to just eat
constexpr uint8_t FEED_POOP_CHANCE = 40; // 40% chance to poop
constexpr uint8_t PLAY_HAPPINESS_GAIN = 25;
constexpr uint8_t PLAY_ENERGY_LOSS = 10;
constexpr uint8_t PLAY_HUNGER_LOSS = 5;
constexpr uint8_t MEDICINE_HEALTH_GAIN = 30;
constexpr uint8_t MEDICINE_HEALTH_BOOST = 5; // When not sick
constexpr uint8_t SLEEP_ENERGY_GAIN = 50;
constexpr uint8_t SLEEP_HAPPINESS_LOSS = 10; // Boring to sleep
constexpr uint32_t SLEEP_DURATION_MS = 5000; // 5 seconds sleep animation
constexpr uint8_t PET_HAPPINESS_GAIN = 5;
}