feat(animation): 452 named constants, 30-phase character animation state machine

Add animation_ids.hpp/cpp with all 452 WoW animation ID constants (anim::STAND,
anim::RUN, anim::FIRE_BOW, ... anim::FLY_BACKWARDS, etc.), nameFromId() O(1)
lookup, and flyVariant() compact 218-element ground→FLY_* resolver.

Expand AnimationController into a full state machine with 20+ named states:
spell cast (directed→omni→cast fallback chain, instant one-shot release),
hit reactions (WOUND/CRIT/DODGE/BLOCK/SHIELD_BLOCK), stun, wounded idle,
stealth animation substitution, loot, fishing channel, sit/sleep/kneel
down→loop→up transitions, sheathe/unsheathe combat enter/exit, ranged weapons
(BOW/GUN/CROSSBOW/THROWN with reload states), game object OPEN/CLOSE/DESTROY,
vehicle enter/exit, mount flight directionals (FLY_LEFT/RIGHT/UP/DOWN/BACKWARDS),
emote state variants, off-hand/pierce/dual-wield alternation, NPC
birth/spawn/drown/rise, sprint aura override, totem idle, NPC greeting/farewell.

Add spell_defines.hpp with SpellEffect (~45 constants) and SpellMissInfo
(12 constants) namespaces; replace all magic numbers in spell_handler.cpp.

Add GAMEOBJECT_BYTES_1 to update field table (all 4 expansion JSONs) and wire
GameObjectStateCallback. Add DBC cross-validation on world entry.

Expand tools/_ANIM_NAMES from ~35 to 452 entries in m2_viewer.py and
asset_pipeline_gui.py. Add tests/test_animation_ids.cpp.

Bug fixes included:
- Stand state 1 was animating READY_2H(27) — fixed to SITTING(97)
- Spell casts ended freeze-frame — add one-shot release animation
- NPC 2H swing probe chain missing ATTACK_2H_LOOSE (polearm/staff)
- Chair sits (states 2/4/5/6) incorrectly played floor-sit transition
- STOP(3) used for all spell casts — replaced with model-aware chain
This commit is contained in:
Paul 2026-04-04 23:02:53 +03:00
parent d54e262048
commit e58f9b4b40
59 changed files with 3903 additions and 483 deletions

View file

@ -538,15 +538,196 @@ class M2Parser:
# ---------------------------------------------------------------------------
_ANIM_NAMES: dict[int, str] = {
0: "Stand", 1: "Death", 2: "Spell", 3: "Stop", 4: "Walk", 5: "Run",
6: "Dead", 7: "Rise", 8: "StandWound", 9: "CombatWound", 10: "CombatCritical",
11: "ShuffleLeft", 12: "ShuffleRight", 13: "Walkbackwards", 14: "Stun",
15: "HandsClosed", 16: "AttackUnarmed", 17: "Attack1H", 18: "Attack2H",
24: "ShieldBlock", 25: "ReadyUnarmed", 26: "Ready1H",
27: "Ready2H", 34: "NPCWelcome", 35: "NPCGoodbye",
37: "JumpStart", 38: "Jump", 39: "JumpEnd", 40: "Fall",
41: "SwimIdle", 42: "Swim", 60: "SpellChannelDirected",
69: "CombatAbility", 138: "Fly", 157: "EmoteTalk", 185: "FlyIdle",
# ── Classic (Vanilla WoW 1.x) — IDs 0145 ──
0: "STAND", 1: "DEATH", 2: "SPELL", 3: "STOP", 4: "WALK", 5: "RUN",
6: "DEAD", 7: "RISE", 8: "STAND_WOUND", 9: "COMBAT_WOUND",
10: "COMBAT_CRITICAL", 11: "SHUFFLE_LEFT", 12: "SHUFFLE_RIGHT",
13: "WALK_BACKWARDS", 14: "STUN", 15: "HANDS_CLOSED",
16: "ATTACK_UNARMED", 17: "ATTACK_1H", 18: "ATTACK_2H",
19: "ATTACK_2H_LOOSE", 20: "PARRY_UNARMED", 21: "PARRY_1H",
22: "PARRY_2H", 23: "PARRY_2H_LOOSE", 24: "SHIELD_BLOCK",
25: "READY_UNARMED", 26: "READY_1H", 27: "READY_2H",
28: "READY_2H_LOOSE", 29: "READY_BOW", 30: "DODGE",
31: "SPELL_PRECAST", 32: "SPELL_CAST", 33: "SPELL_CAST_AREA",
34: "NPC_WELCOME", 35: "NPC_GOODBYE", 36: "BLOCK",
37: "JUMP_START", 38: "JUMP", 39: "JUMP_END", 40: "FALL",
41: "SWIM_IDLE", 42: "SWIM", 43: "SWIM_LEFT", 44: "SWIM_RIGHT",
45: "SWIM_BACKWARDS", 46: "ATTACK_BOW", 47: "FIRE_BOW",
48: "READY_RIFLE", 49: "ATTACK_RIFLE", 50: "LOOT",
51: "READY_SPELL_DIRECTED", 52: "READY_SPELL_OMNI",
53: "SPELL_CAST_DIRECTED", 54: "SPELL_CAST_OMNI", 55: "BATTLE_ROAR",
56: "READY_ABILITY", 57: "SPECIAL_1H", 58: "SPECIAL_2H",
59: "SHIELD_BASH", 60: "EMOTE_TALK", 61: "EMOTE_EAT",
62: "EMOTE_WORK", 63: "EMOTE_USE_STANDING", 64: "EMOTE_EXCLAMATION",
65: "EMOTE_QUESTION", 66: "EMOTE_BOW", 67: "EMOTE_WAVE",
68: "EMOTE_CHEER", 69: "EMOTE_DANCE", 70: "EMOTE_LAUGH",
71: "EMOTE_SLEEP", 72: "EMOTE_SIT_GROUND", 73: "EMOTE_RUDE",
74: "EMOTE_ROAR", 75: "EMOTE_KNEEL", 76: "EMOTE_KISS",
77: "EMOTE_CRY", 78: "EMOTE_CHICKEN", 79: "EMOTE_BEG",
80: "EMOTE_APPLAUD", 81: "EMOTE_SHOUT", 82: "EMOTE_FLEX",
83: "EMOTE_SHY", 84: "EMOTE_POINT", 85: "ATTACK_1H_PIERCE",
86: "ATTACK_2H_LOOSE_PIERCE", 87: "ATTACK_OFF", 88: "ATTACK_OFF_PIERCE",
89: "SHEATHE", 90: "HIP_SHEATHE", 91: "MOUNT",
92: "RUN_RIGHT", 93: "RUN_LEFT", 94: "MOUNT_SPECIAL", 95: "KICK",
96: "SIT_GROUND_DOWN", 97: "SITTING", 98: "SIT_GROUND_UP",
99: "SLEEP_DOWN", 100: "SLEEP", 101: "SLEEP_UP",
102: "SIT_CHAIR_LOW", 103: "SIT_CHAIR_MED", 104: "SIT_CHAIR_HIGH",
105: "LOAD_BOW", 106: "LOAD_RIFLE", 107: "ATTACK_THROWN",
108: "READY_THROWN", 109: "HOLD_BOW", 110: "HOLD_RIFLE",
111: "HOLD_THROWN", 112: "LOAD_THROWN", 113: "EMOTE_SALUTE",
114: "KNEEL_START", 115: "KNEEL_LOOP", 116: "KNEEL_END",
117: "ATTACK_UNARMED_OFF", 118: "SPECIAL_UNARMED",
119: "STEALTH_WALK", 120: "STEALTH_STAND", 121: "KNOCKDOWN",
122: "EATING_LOOP", 123: "USE_STANDING_LOOP",
124: "CHANNEL_CAST_DIRECTED", 125: "CHANNEL_CAST_OMNI",
126: "WHIRLWIND", 127: "BIRTH", 128: "USE_STANDING_START",
129: "USE_STANDING_END", 130: "CREATURE_SPECIAL", 131: "DROWN",
132: "DROWNED", 133: "FISHING_CAST", 134: "FISHING_LOOP", 135: "FLY",
136: "EMOTE_WORK_NO_SHEATHE", 137: "EMOTE_STUN_NO_SHEATHE",
138: "EMOTE_USE_STANDING_NO_SHEATHE", 139: "SPELL_SLEEP_DOWN",
140: "SPELL_KNEEL_START", 141: "SPELL_KNEEL_LOOP",
142: "SPELL_KNEEL_END", 143: "SPRINT", 144: "IN_FLIGHT", 145: "SPAWN",
# ── The Burning Crusade (TBC 2.x) — IDs 146199 ──
146: "CLOSE", 147: "CLOSED", 148: "OPEN", 149: "DESTROY",
150: "DESTROYED", 151: "UNSHEATHE", 152: "SHEATHE_ALT",
153: "ATTACK_UNARMED_NO_SHEATHE", 154: "STEALTH_RUN",
155: "READY_CROSSBOW", 156: "ATTACK_CROSSBOW",
157: "EMOTE_TALK_EXCLAMATION", 158: "FLY_IDLE", 159: "FLY_FORWARD",
160: "FLY_BACKWARDS", 161: "FLY_LEFT", 162: "FLY_RIGHT",
163: "FLY_UP", 164: "FLY_DOWN", 165: "FLY_LAND_START",
166: "FLY_LAND_RUN", 167: "FLY_LAND_END",
168: "EMOTE_TALK_QUESTION", 169: "EMOTE_READ",
170: "EMOTE_SHIELDBLOCK", 171: "EMOTE_CHOP", 172: "EMOTE_HOLDRIFLE",
173: "EMOTE_HOLDBOW", 174: "EMOTE_HOLDTHROWN",
175: "CUSTOM_SPELL_02", 176: "CUSTOM_SPELL_03", 177: "CUSTOM_SPELL_04",
178: "CUSTOM_SPELL_05", 179: "CUSTOM_SPELL_06", 180: "CUSTOM_SPELL_07",
181: "CUSTOM_SPELL_08", 182: "CUSTOM_SPELL_09", 183: "CUSTOM_SPELL_10",
184: "EMOTE_STATE_DANCE",
# ── Wrath of the Lich King (WotLK 3.x) — IDs 185+ ──
185: "FLY_STAND", 186: "EMOTE_STATE_LAUGH", 187: "EMOTE_STATE_POINT",
188: "EMOTE_STATE_EAT", 189: "EMOTE_STATE_WORK",
190: "EMOTE_STATE_SIT_GROUND", 191: "EMOTE_STATE_HOLD_BOW",
192: "EMOTE_STATE_HOLD_RIFLE", 193: "EMOTE_STATE_HOLD_THROWN",
194: "FLY_COMBAT_WOUND", 195: "FLY_COMBAT_CRITICAL", 196: "RECLINED",
197: "EMOTE_STATE_ROAR", 198: "EMOTE_USE_STANDING_LOOP_2",
199: "EMOTE_STATE_APPLAUD", 200: "READY_FIST",
201: "SPELL_CHANNEL_DIRECTED_OMNI", 202: "SPECIAL_ATTACK_1H_OFF",
203: "ATTACK_FIST_1H", 204: "ATTACK_FIST_1H_OFF",
205: "PARRY_FIST_1H", 206: "READY_FIST_1H",
207: "EMOTE_STATE_READ_AND_TALK", 208: "EMOTE_STATE_WORK_NO_SHEATHE",
209: "FLY_RUN", 210: "EMOTE_STATE_KNEEL_2",
211: "EMOTE_STATE_SPELL_KNEEL", 212: "EMOTE_STATE_USE_STANDING",
213: "EMOTE_STATE_STUN", 214: "EMOTE_STATE_STUN_NO_SHEATHE",
215: "EMOTE_TRAIN", 216: "EMOTE_DEAD",
217: "EMOTE_STATE_DANCE_ONCE", 218: "FLY_DEATH",
219: "FLY_STAND_WOUND", 220: "FLY_SHUFFLE_LEFT",
221: "FLY_SHUFFLE_RIGHT", 222: "FLY_WALK_BACKWARDS",
223: "FLY_STUN", 224: "FLY_HANDS_CLOSED", 225: "FLY_ATTACK_UNARMED",
226: "FLY_ATTACK_1H", 227: "FLY_ATTACK_2H",
228: "FLY_ATTACK_2H_LOOSE", 229: "FLY_SPELL", 230: "FLY_STOP",
231: "FLY_WALK", 232: "FLY_DEAD", 233: "FLY_RISE", 234: "FLY_RUN_2",
235: "FLY_FALL", 236: "FLY_SWIM_IDLE", 237: "FLY_SWIM",
238: "FLY_SWIM_LEFT", 239: "FLY_SWIM_RIGHT",
240: "FLY_SWIM_BACKWARDS", 241: "FLY_ATTACK_BOW",
242: "FLY_FIRE_BOW", 243: "FLY_READY_RIFLE",
244: "FLY_ATTACK_RIFLE", 245: "TOTEM_SMALL", 246: "TOTEM_MEDIUM",
247: "TOTEM_LARGE", 248: "FLY_LOOT",
249: "FLY_READY_SPELL_DIRECTED", 250: "FLY_READY_SPELL_OMNI",
251: "FLY_SPELL_CAST_DIRECTED", 252: "FLY_SPELL_CAST_OMNI",
253: "FLY_BATTLE_ROAR", 254: "FLY_READY_ABILITY",
255: "FLY_SPECIAL_1H", 256: "FLY_SPECIAL_2H",
257: "FLY_SHIELD_BASH", 258: "FLY_EMOTE_TALK", 259: "FLY_EMOTE_EAT",
260: "FLY_EMOTE_WORK", 261: "FLY_EMOTE_USE_STANDING",
262: "FLY_EMOTE_BOW", 263: "FLY_EMOTE_WAVE", 264: "FLY_EMOTE_CHEER",
265: "FLY_EMOTE_DANCE", 266: "FLY_EMOTE_LAUGH",
267: "FLY_EMOTE_SLEEP", 268: "FLY_EMOTE_SIT_GROUND",
269: "FLY_EMOTE_RUDE", 270: "FLY_EMOTE_ROAR",
271: "FLY_EMOTE_KNEEL", 272: "FLY_EMOTE_KISS", 273: "FLY_EMOTE_CRY",
274: "FLY_EMOTE_CHICKEN", 275: "FLY_EMOTE_BEG",
276: "FLY_EMOTE_APPLAUD", 277: "FLY_EMOTE_SHOUT",
278: "FLY_EMOTE_FLEX", 279: "FLY_EMOTE_SHY", 280: "FLY_EMOTE_POINT",
281: "FLY_ATTACK_1H_PIERCE", 282: "FLY_ATTACK_2H_LOOSE_PIERCE",
283: "FLY_ATTACK_OFF", 284: "FLY_ATTACK_OFF_PIERCE",
285: "FLY_SHEATHE", 286: "FLY_HIP_SHEATHE", 287: "FLY_MOUNT",
288: "FLY_RUN_RIGHT", 289: "FLY_RUN_LEFT",
290: "FLY_MOUNT_SPECIAL", 291: "FLY_KICK",
292: "FLY_SIT_GROUND_DOWN", 293: "FLY_SITTING",
294: "FLY_SIT_GROUND_UP", 295: "FLY_SLEEP_DOWN", 296: "FLY_SLEEP",
297: "FLY_SLEEP_UP", 298: "FLY_SIT_CHAIR_LOW",
299: "FLY_SIT_CHAIR_MED", 300: "FLY_SIT_CHAIR_HIGH",
301: "FLY_LOAD_BOW", 302: "FLY_LOAD_RIFLE",
303: "FLY_ATTACK_THROWN", 304: "FLY_READY_THROWN",
305: "FLY_HOLD_BOW", 306: "FLY_HOLD_RIFLE", 307: "FLY_HOLD_THROWN",
308: "FLY_LOAD_THROWN", 309: "FLY_EMOTE_SALUTE",
310: "FLY_KNEEL_START", 311: "FLY_KNEEL_LOOP", 312: "FLY_KNEEL_END",
313: "FLY_ATTACK_UNARMED_OFF", 314: "FLY_SPECIAL_UNARMED",
315: "FLY_STEALTH_WALK", 316: "FLY_STEALTH_STAND",
317: "FLY_KNOCKDOWN", 318: "FLY_EATING_LOOP",
319: "FLY_USE_STANDING_LOOP", 320: "FLY_CHANNEL_CAST_DIRECTED",
321: "FLY_CHANNEL_CAST_OMNI", 322: "FLY_WHIRLWIND",
323: "FLY_BIRTH", 324: "FLY_USE_STANDING_START",
325: "FLY_USE_STANDING_END", 326: "FLY_CREATURE_SPECIAL",
327: "FLY_DROWN", 328: "FLY_DROWNED", 329: "FLY_FISHING_CAST",
330: "FLY_FISHING_LOOP", 331: "FLY_FLY",
332: "FLY_EMOTE_WORK_NO_SHEATHE", 333: "FLY_EMOTE_STUN_NO_SHEATHE",
334: "FLY_EMOTE_USE_STANDING_NO_SHEATHE",
335: "FLY_SPELL_SLEEP_DOWN", 336: "FLY_SPELL_KNEEL_START",
337: "FLY_SPELL_KNEEL_LOOP", 338: "FLY_SPELL_KNEEL_END",
339: "FLY_SPRINT", 340: "FLY_IN_FLIGHT", 341: "FLY_SPAWN",
342: "FLY_CLOSE", 343: "FLY_CLOSED", 344: "FLY_OPEN",
345: "FLY_DESTROY", 346: "FLY_DESTROYED", 347: "FLY_UNSHEATHE",
348: "FLY_SHEATHE_ALT", 349: "FLY_ATTACK_UNARMED_NO_SHEATHE",
350: "FLY_STEALTH_RUN", 351: "FLY_READY_CROSSBOW",
352: "FLY_ATTACK_CROSSBOW", 353: "FLY_EMOTE_TALK_EXCLAMATION",
354: "FLY_EMOTE_TALK_QUESTION", 355: "FLY_EMOTE_READ",
356: "EMOTE_HOLD_CROSSBOW", 357: "FLY_EMOTE_HOLD_BOW",
358: "FLY_EMOTE_HOLD_RIFLE", 359: "FLY_EMOTE_HOLD_THROWN",
360: "FLY_EMOTE_HOLD_CROSSBOW", 361: "FLY_CUSTOM_SPELL_02",
362: "FLY_CUSTOM_SPELL_03", 363: "FLY_CUSTOM_SPELL_04",
364: "FLY_CUSTOM_SPELL_05", 365: "FLY_CUSTOM_SPELL_06",
366: "FLY_CUSTOM_SPELL_07", 367: "FLY_CUSTOM_SPELL_08",
368: "FLY_CUSTOM_SPELL_09", 369: "FLY_CUSTOM_SPELL_10",
370: "FLY_EMOTE_STATE_DANCE", 371: "EMOTE_EAT_NO_SHEATHE",
372: "MOUNT_RUN_RIGHT", 373: "MOUNT_RUN_LEFT",
374: "MOUNT_WALK_BACKWARDS", 375: "MOUNT_SWIM_IDLE",
376: "MOUNT_SWIM", 377: "MOUNT_SWIM_LEFT", 378: "MOUNT_SWIM_RIGHT",
379: "MOUNT_SWIM_BACKWARDS", 380: "MOUNT_FLIGHT_IDLE",
381: "MOUNT_FLIGHT_FORWARD", 382: "MOUNT_FLIGHT_BACKWARDS",
383: "MOUNT_FLIGHT_LEFT", 384: "MOUNT_FLIGHT_RIGHT",
385: "MOUNT_FLIGHT_UP", 386: "MOUNT_FLIGHT_DOWN",
387: "MOUNT_FLIGHT_LAND_START", 388: "MOUNT_FLIGHT_LAND_RUN",
389: "MOUNT_FLIGHT_LAND_END", 390: "FLY_EMOTE_STATE_LAUGH",
391: "FLY_EMOTE_STATE_POINT", 392: "FLY_EMOTE_STATE_EAT",
393: "FLY_EMOTE_STATE_WORK", 394: "FLY_EMOTE_STATE_SIT_GROUND",
395: "FLY_EMOTE_STATE_HOLD_BOW", 396: "FLY_EMOTE_STATE_HOLD_RIFLE",
397: "FLY_EMOTE_STATE_HOLD_THROWN", 398: "FLY_EMOTE_STATE_ROAR",
399: "FLY_RECLINED", 400: "EMOTE_TRAIN_2", 401: "EMOTE_DEAD_2",
402: "FLY_EMOTE_USE_STANDING_LOOP_2", 403: "FLY_EMOTE_STATE_APPLAUD",
404: "FLY_READY_FIST", 405: "FLY_SPELL_CHANNEL_DIRECTED_OMNI",
406: "FLY_SPECIAL_ATTACK_1H_OFF", 407: "FLY_ATTACK_FIST_1H",
408: "FLY_ATTACK_FIST_1H_OFF", 409: "FLY_PARRY_FIST_1H",
410: "FLY_READY_FIST_1H", 411: "FLY_EMOTE_STATE_READ_AND_TALK",
412: "FLY_EMOTE_STATE_WORK_NO_SHEATHE",
413: "FLY_EMOTE_STATE_KNEEL_2", 414: "FLY_EMOTE_STATE_SPELL_KNEEL",
415: "FLY_EMOTE_STATE_USE_STANDING", 416: "FLY_EMOTE_STATE_STUN",
417: "FLY_EMOTE_STATE_STUN_NO_SHEATHE", 418: "FLY_EMOTE_TRAIN",
419: "FLY_EMOTE_DEAD", 420: "FLY_EMOTE_STATE_DANCE_ONCE",
421: "FLY_EMOTE_EAT_NO_SHEATHE", 422: "FLY_MOUNT_RUN_RIGHT",
423: "FLY_MOUNT_RUN_LEFT", 424: "FLY_MOUNT_WALK_BACKWARDS",
425: "FLY_MOUNT_SWIM_IDLE", 426: "FLY_MOUNT_SWIM",
427: "FLY_MOUNT_SWIM_LEFT", 428: "FLY_MOUNT_SWIM_RIGHT",
429: "FLY_MOUNT_SWIM_BACKWARDS", 430: "FLY_MOUNT_FLIGHT_IDLE",
431: "FLY_MOUNT_FLIGHT_FORWARD", 432: "FLY_MOUNT_FLIGHT_BACKWARDS",
433: "FLY_MOUNT_FLIGHT_LEFT", 434: "FLY_MOUNT_FLIGHT_RIGHT",
435: "FLY_MOUNT_FLIGHT_UP", 436: "FLY_MOUNT_FLIGHT_DOWN",
437: "FLY_MOUNT_FLIGHT_LAND_START", 438: "FLY_MOUNT_FLIGHT_LAND_RUN",
439: "FLY_MOUNT_FLIGHT_LAND_END", 440: "FLY_TOTEM_SMALL",
441: "FLY_TOTEM_MEDIUM", 442: "FLY_TOTEM_LARGE",
443: "FLY_EMOTE_HOLD_CROSSBOW_2", 444: "VEHICLE_GRAB",
445: "VEHICLE_THROW", 446: "FLY_VEHICLE_GRAB",
447: "FLY_VEHICLE_THROW", 448: "GUILD_CHAMPION_1",
449: "GUILD_CHAMPION_2", 450: "FLY_GUILD_CHAMPION_1",
451: "FLY_GUILD_CHAMPION_2",
}