Kelsidavis-WoWee/include/game
Paul b4989dc11f feat(animation): decompose AnimationController into FSM-based architecture
Replace the 2,200-line monolithic AnimationController (goto-driven,
single class, untestable) with a composed FSM architecture per
refactor.md.

New subsystem (src/rendering/animation/ — 16 headers, 10 sources):
- CharacterAnimator: FSM composer implementing ICharacterAnimator
- LocomotionFSM: idle/walk/run/sprint/jump/swim/strafe
- CombatFSM: melee/ranged/spell cast/stun/hit reaction/charge
- ActivityFSM: emote/loot/sit-down/sitting/sit-up
- MountFSM: idle/run/flight/taxi/fidget/rear-up (per-instance RNG)
- AnimCapabilitySet + AnimCapabilityProbe: probe once at model load,
  eliminate per-frame hasAnimation() linear search
- AnimationManager: registry of CharacterAnimator by GUID
- EmoteRegistry: DBC-backed emote command → animId singleton
- FootstepDriver, SfxStateDriver: extracted from AnimationController

animation_ids.hpp/.cpp moved to animation/ subdirectory (452 named
constants); all include paths updated.

AnimationController retained as thin adapter (~400 LOC): collects
FrameInput, delegates to CharacterAnimator, applies AnimOutput.

Priority order: Mount > Stun > HitReaction > Spell > Charge >
Melee/Ranged > CombatIdle > Emote > Loot > Sit > Locomotion.
STAY_IN_STATE policy when all FSMs return valid=false.

Bugs fixed:
- Remove static mt19937 in mount fidget (shared state across all
  mounted units) — replaced with per-instance seeded RNG
- Remove goto from mounted animation branch (skipped init)
- Remove per-frame hasAnimation() calls (now one probe at load)
- Fix VK_INDEX_TYPE_UINT16 → UINT32 in shadow pass

Tests (4 new suites, all ASAN+UBSan clean):
- test_locomotion_fsm: 167 assertions
- test_combat_fsm: 125 cases
- test_activity_fsm: 112 cases
- test_anim_capability: 56 cases

docs/ANIMATION_SYSTEM.md added (architecture reference).
2026-04-05 12:27:35 +03:00
..
character.hpp Add body type selection for nonbinary characters and reduce preview rotation sensitivity 2026-02-09 17:56:04 -08:00
chat_handler.hpp refactor(game): split GameHandler into domain handlers 2026-03-28 09:42:37 +03:00
combat_handler.hpp fix: env damage alias overwrote handler that preserved damage type 2026-03-29 18:20:51 -07:00
entity.hpp feat(animation): 452 named constants, 30-phase character animation state machine 2026-04-04 23:02:53 +03:00
entity_controller.hpp feat(animation): 452 named constants, 30-phase character animation state machine 2026-04-04 23:02:53 +03:00
expansion_profile.hpp Unify asset system: one asset set, always high-res 2026-02-15 04:18:34 -08:00
game_handler.hpp feat(animation): decompose AnimationController into FSM-based architecture 2026-04-05 12:27:35 +03:00
game_services.hpp chore(renderer): extract AnimationController and remove audio pass-throughs 2026-04-02 13:06:31 +03:00
game_utils.hpp refactor: consolidate buildItemLink into game_utils.hpp 2026-03-29 17:57:05 -07:00
group_defines.hpp Handle SMSG_PARTY_MEMBER_STATS to show group health out of visual range 2026-02-26 10:25:55 -08:00
handler_types.hpp feat(animation): decompose AnimationController into FSM-based architecture 2026-04-05 12:27:35 +03:00
inventory.hpp feat(animation): 452 named constants, 30-phase character animation state machine 2026-04-04 23:02:53 +03:00
inventory_handler.hpp fix(auction): resolve item GUID with fallback and gate packet format 2026-04-03 18:46:49 -07:00
movement_handler.hpp refactor: name memory/taxi constants, add camera jitter why-comment 2026-03-30 15:07:55 -07:00
opcode_aliases_generated.inc refactor: derive turtle opcodes from classic 2026-03-15 02:55:05 -07:00
opcode_enum_generated.inc Opcode registry: move to generated canonical+alias pipeline 2026-02-20 03:02:31 -08:00
opcode_names_generated.inc Opcode registry: move to generated canonical+alias pipeline 2026-02-20 03:02:31 -08:00
opcode_table.hpp refactor: derive turtle opcodes from classic 2026-03-15 02:55:05 -07:00
opcodes.hpp Add multi-expansion support with data-driven protocol layer 2026-02-12 22:56:36 -08:00
packet_parsers.hpp fix: mail money uint64, other-player cape textures, zone toast dedup, TCP_NODELAY 2026-03-27 17:20:31 -07:00
player.hpp Initial commit: wowee native WoW 3.3.5a client 2026-02-02 13:03:22 -08:00
quest_handler.hpp fix: gossip banker sent CMSG_BANKER_ACTIVATE twice; deduplicate quest icons 2026-03-29 18:53:30 -07:00
social_handler.hpp fix: delegate all 113 stale GameHandler getters to domain handlers 2026-03-28 12:18:14 -07:00
spell_defines.hpp feat(animation): 452 named constants, 30-phase character animation state machine 2026-04-04 23:02:53 +03:00
spell_handler.hpp refactor: extract findOnUseSpellId helper, add warden hash comment 2026-03-30 13:56:45 -07:00
transport_manager.hpp fix: transport elapsed time lost millisecond precision after ~4.5 hours 2026-03-29 20:14:45 -07:00
update_field_table.hpp feat(animation): 452 named constants, 30-phase character animation state machine 2026-04-04 23:02:53 +03:00
warden_crypto.hpp Fix Warden module loading pipeline and HASH_REQUEST response 2026-02-14 19:20:32 -08:00
warden_emulator.hpp feat: implement Warden API binding / IAT patching for module imports 2026-03-30 22:38:05 -07:00
warden_handler.hpp refactor(game): split GameHandler into domain handlers 2026-03-28 09:42:37 +03:00
warden_memory.hpp fix: correct sync Warden MODULE check returning 0x01 instead of 0x00 2026-03-17 07:19:37 -07:00
warden_module.hpp fix: replace placeholder Warden RSA modulus with real Blizzard key 2026-03-30 22:50:47 -07:00
world.hpp Initial commit: wowee native WoW 3.3.5a client 2026-02-02 13:03:22 -08:00
world_packets.hpp fix(auction): resolve item GUID with fallback and gate packet format 2026-04-03 18:46:49 -07:00
zone_manager.hpp Enrich zone music from AreaTable/ZoneMusic/SoundEntries DBC chain 2026-03-09 16:04:52 -07:00