-- ============================================================================
-- Vamoose's Companion - Companion Profiles
-- Data-driven companion definitions (engine is content-agnostic)
-- ============================================================================

-- Portrait + Talking Head: ModelScene with auto-normalization via bounding box projection
-- ModelScene axes: X = depth (toward/away from camera), Y = left/right, Z = up/down
-- Camera sits at +X looking back toward origin (yaw PI)
--
-- Portrait frame tuning:
--   portraitScale = auto-fit multiplier (smaller = smaller model in frame, default 0.5)
--   portraitY     = left/right offset (+Y = right, -Y = left)
--   portraitZ     = up/down offset (+Z = up, -Z = down)
--   portraitBaseFacing = base yaw (0 = facing camera, radians)
--
-- Talking head tuning:
--   talkingHeadCamera.scale  = auto-fit multiplier (same as portraitScale)
--   talkingHeadCamera.modelY = left/right offset
--   talkingHeadCamera.modelZ = up/down offset
--   talkingHeadCamera.facing = yaw (0 = facing camera)
--   talkingHeadCamera.modelX = depth offset (unused, reserved)

VC_CompanionProfiles = {
    vamoose = {
        key = "vamoose",
        name = "Vamoose",
        title = "The Wise Shaman",
        description = "Warm, grounded, occasionally profound, with dry humour that sneaks up on you",
        sigQuote = "\"The earth remembers every footstep. I remember every one of yours.\"",
        chatColor = "|cFFA0522D",
        themeColor = { r = 0.66, g = 0.44, b = 0.18 },
        ttsVoice = "Milena [ru-RU]",
        displayID = 36894, -- Elementalist Janai (Earthen Ring)
        talkingHeadCamera = { scale = 0.5, modelX = 0, modelY = -0.05, modelZ = -0.15, facing = 0.45 },
        quoteDBKey = "vamoose",
        -- Probed from displayID 36894 (2026-04-05)
        animations = {
            Stand=0, Death=1, Stop=3, Walk=4, Run=5,
            StandWound=8, CombatWound=9, CombatCritical=10,
            ShuffleLeft=11, ShuffleRight=12, WalkBack=13, Stun=14, HandsClosed=15,
            AttackUnarmed=16, Attack1H=17, Attack2H=18, Attack2HL=19,
            ParryUnarmed=20, Parry1H=21, Parry2H=22, Parry2HL=23, ShieldBlock=24,
            ReadyUnarmed=25, Ready1H=26, Ready2H=27, Ready2HL=28, ReadyBow=29, Dodge=30,
            JumpStart=37, Jump=38, JumpEnd=39, Fall=40,
            SwimIdle=41, Swim=42, SwimLeft=43, SwimRight=44, SwimBack=45,
            AttackBow=46, ReadyRifle=48, AttackRifle=49, Loot=50,
            ReadySpellDirected=51, ReadySpellOmni=52, SpellCastOmni=53, BattleRoar=54,
            ReadyCrossbow=55, ShootCrossbow=57,
            -- Modern AnimationData IDs (verified from wow.export AnimMapper.js)
            Talk=60, Eat=61, Work=62, Exclamation=64, Question=65,
            Bow=66, Wave=67, Cheer=68, Dance=69, Laugh=70,
            Kneel=75, Kiss=76, Cry=77, Chicken=78, Beg=79,
            Applaud=80, Shout=81, Flex=82, Shy=83, Point=84,
            SitGround=97, Sleep=100, Knockdown=110, Whirlwind=113,
            FlyBack=136, FlyLeft=137, FlyRight=138, Hover=193, Cower=225,
        },
        modelGroups = {
            { label = "Draenei",
              ids = { 19598, 21265, 71623, 17600, 56859, 58494, 63504, 63505, 92848, 116601, 119568, 76336, 36894, 106212 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, StandWound=8, CombatWound=9, Talk=60, Dance=69, Wave=67, Bow=66, Cheer=68, Laugh=70, Cry=77, Flex=82, Point=84, Cower=225 },
              intents = {
                  IDLE         = { anim = "Stand",       sound = { 557247, 557249, 557258, 557259, 557261, 557262, 557270 } },
                  FIDGET       = { anim = "Talk",        sound = { 557247, 557249, 557258, 557259, 557261, 557262, 557270 } }, -- SK 9758 Standard
                  TALKING      = { anim = "Talk",        sound = { 557229, 557232, 557233, 557238, 557241, 557244 } },         -- SK 9754 Noble
                  GREETING     = { anim = "Wave",        sound = { 557215, 557216, 557217, 557218 } },                         -- SK 9750 Military
                  CELEBRATING  = { anim = "Cheer",       sound = {} },
                  TRIUMPHANT   = { anim = "BattleRoar",  sound = {} },
                  EXCITED      = { anim = "Exclamation", sound = {} },
                  COMBAT_READY = { anim = "ReadyUnarmed", sound = {} },
                  DISTRESSED   = { anim = "Cower",       sound = {} },
                  MOURNING     = { anim = "Cry",         sound = {} },
                  DYING        = { anim = "Death",       sound = {} },
                  RUNNING      = { anim = "Run",         sound = {} },
                  MOUNTED      = { anim = "Run",         sound = {} },
                  SWIMMING      = { anim = "SwimIdle",    sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",        sound = {} },
                  FLYING       = { anim = "Hover",       sound = {} },
                  SLEEP        = { anim = "Sleep",       sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },  -- no Eat anim on draenei female
                  HEARTHING    = { anim = "Wave",         sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },  -- no Sleep in modelGroup anims
                  RELAXED      = { anim = "Stand",        sound = {} },
              },
            },
        },
        models = {},
    },
    scurry = {
        key = "scurry",
        name = "Scurry",
        title = "The Chaotic Cheerleader",
        description = "Excitable, easily distracted, endlessly enthusiastic",
        sigQuote = "\"I don't know where we're going but I know it's going to be AMAZING because you're the one going there!!\"",
        chatColor = "|cFF8B4513",
        themeColor = { r = 0.55, g = 0.27, b = 0.07 },
        displayID = 36620, -- Squirrel
        portraitBaseFacing = 0, -- ModelScene: 0 = facing camera
        portraitScale = 0.3, -- smaller in portrait frame
        portraitY = -0.03,
        portraitZ = -0.15,
        talkingHeadCamera = { scale = 0.4, modelX = 0, modelY = -0.05, modelZ = 0, facing = 0.8 },
        quoteDBKey = "scurry",
        -- Probed from displayID 64016 (2026-04-05)
        animations = {
            Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, AttackUnarmed=16, SwimIdle=41, Swim=42,
        },
        modelGroups = {
            { label = "Squirrel",
              ids = { 64016, 26532, 42334, 42744, 90842, 65590 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, AttackUnarmed=16, SwimIdle=41, Swim=42 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 595196, 595199, 595202, 595205, 595208, 595211, 595214, 595217, 595220, 595223 } },
                  FIDGET       = { anim = "AttackUnarmed", sound = { 595196, 595199, 595202, 595205, 595208, 595211, 595214, 595217, 595220, 595223 } }, -- SK 25348 Clickable
                  TALKING      = { anim = "Stand",        sound = {} },
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "Run",          sound = {} },
                  TRIUMPHANT   = { anim = "Run",          sound = {} },
                  EXCITED      = { anim = "Run",          sound = {} },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = { 595196, 595199, 595202, 595205, 595208, 595211, 595214, 595217, 595220, 595223 } },
                  DISTRESSED   = { anim = "CombatWound",  sound = { 560834 } }, -- SK 1474 Wound
                  MOURNING     = { anim = "CombatWound",  sound = {} },
                  DYING        = { anim = "Death",        sound = { 560835 } }, -- SK 1475 Death
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "Run",          sound = {} },
                  SLEEP        = { anim = "Death",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "Run",          sound = {} },
                  BORED        = { anim = "Death",        sound = {} },  -- Death = curled on side
                  RELAXED      = { anim = "Stand",        sound = {} },
              },
            },
            { label = "Flying Squirrel",
              ids = { 98457, 98459, 98460 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, AttackUnarmed=16 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 4629587, 4629589, 4629591, 4629593, 4629595 } },
                  FIDGET       = { anim = "AttackUnarmed", sound = { 4629587, 4629589, 4629591, 4629593, 4629595 } }, -- SK 201087 Chuff
                  TALKING      = { anim = "Stand",        sound = {} },
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "Run",          sound = {} },
                  TRIUMPHANT   = { anim = "Run",          sound = {} },
                  EXCITED      = { anim = "Run",          sound = {} },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = { 4630990, 4630992, 4630994, 4630996, 4630998 } }, -- SK 201138 Attack
                  DISTRESSED   = { anim = "CombatWound",  sound = { 4630970, 4630972, 4630974, 4630976, 4630978 } }, -- SK 201137 Wound
                  MOURNING     = { anim = "CombatWound",  sound = {} },
                  DYING        = { anim = "Death",        sound = { 4629597, 4629599, 4629601, 4629603, 4629605, 4629607 } }, -- SK 201085 Death
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "Stand",        sound = {} },
                  SWIMMING_MOVE = { anim = "Stand",        sound = {} },
                  FLYING       = { anim = "Run",          sound = {} },
                  SLEEP        = { anim = "Death",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "Run",          sound = {} },
                  BORED        = { anim = "Death",        sound = {} },  -- Death = curled on side
                  RELAXED      = { anim = "Stand",        sound = {} },
              },
            },
            { label = "Arcane Squirrel",
              ids = { 98458 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, AttackUnarmed=16 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 5549409, 5549411, 5549413, 5549415 } },
                  FIDGET       = { anim = "AttackUnarmed", sound = { 5549409, 5549411, 5549413, 5549415 } },         -- SK 241168 Idle
                  TALKING      = { anim = "Stand",        sound = { 5549387, 5549389, 5549391, 5549393, 5549395 } }, -- SK 241366 Chuff
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "Run",          sound = {} },
                  TRIUMPHANT   = { anim = "Run",          sound = {} },
                  EXCITED      = { anim = "Run",          sound = {} },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = { 5549377, 5549379, 5549381, 5549383, 5549385 } }, -- SK 241169 Attack
                  DISTRESSED   = { anim = "CombatWound",  sound = { 5549417, 5549419, 5549421, 5549423, 5549425 } }, -- SK 241165 Wound
                  MOURNING     = { anim = "CombatWound",  sound = {} },
                  DYING        = { anim = "Death",        sound = { 5549397, 5549399, 5549401, 5549403, 5549405, 5549407 } }, -- SK 241166 Death
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "Stand",        sound = {} },
                  SWIMMING_MOVE = { anim = "Stand",        sound = {} },
                  FLYING       = { anim = "Run",          sound = {} },
                  SLEEP        = { anim = "Death",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "Run",          sound = {} },
                  BORED        = { anim = "Death",        sound = {} },  -- Death = curled on side
                  RELAXED      = { anim = "Stand",        sound = {} },
              },
            },
        },
        models = {},
    },
    gazlowe = {
        key = "gazlowe",
        name = "Gazlowe",
        title = "The Entrepreneurial Hype Man",
        description = "Fast-talking, always seeing angles, genuinely impressed by profit",
        sigQuote = "\"Kid, I've backed a lot of ventures. You're the one I'd bet the whole treasury on.\"",
        chatColor = "|cFF00FF00",
        themeColor = { r = 0.0, g = 0.8, b = 0.0 },
        ttsVoice = "Grandpa [en-US]",
        displayID = 20016, -- Trade Prince Gazlowe
        portraitScale = 0.4,
        portraitZ = -0.1,
        talkingHeadCamera = { scale = 0.4, modelX = 0, modelY = -0.06, modelZ = -0.08, facing = 0.45 },
        quoteDBKey = "gazlowe",
        -- Probed from displayID 20016 (2026-04-05)
        animations = {
            Stand=0, Death=1, Stop=3, Walk=4, Run=5,
            StandWound=8, CombatWound=9, CombatCritical=10,
            ShuffleLeft=11, ShuffleRight=12, WalkBack=13, Stun=14, HandsClosed=15,
            AttackUnarmed=16, Attack1H=17, Attack2H=18, Attack2HL=19,
            ParryUnarmed=20, Parry1H=21, Parry2H=22, Parry2HL=23, ShieldBlock=24,
            ReadyUnarmed=25, Ready1H=26, Ready2H=27, Ready2HL=28, ReadyBow=29, Dodge=30,
            JumpStart=37, Jump=38, JumpEnd=39, Fall=40,
            SwimIdle=41, Swim=42, SwimLeft=43, SwimRight=44, SwimBack=45,
            AttackBow=46, ReadyRifle=48, AttackRifle=49, Loot=50,
            ReadySpellDirected=51, ReadySpellOmni=52, SpellCastOmni=53, BattleRoar=54,
            ReadyCrossbow=55, ShootCrossbow=57,
            -- Modern AnimationData IDs (verified from wow.export AnimMapper.js)
            Talk=60, Eat=61, Work=62, Exclamation=64, Question=65,
            Bow=66, Wave=67, Cheer=68, Dance=69, Laugh=70,
            Kneel=75, Kiss=76, Cry=77, Chicken=78, Beg=79,
            Applaud=80, Shout=81, Flex=82, Shy=83, Point=84,
            SitGround=97, Sleep=100, Knockdown=110, Whirlwind=113,
            FlyBack=136, FlyLeft=137, FlyRight=138, Hover=193, Cower=225,
        },
        modelGroups = {
            { label = "Goblin",
              ids = { 20016, 90805, 81449, 138836, 75730, 30098, 120388, 122751, 82611, 109660, 109662, 125523, 125954, 37716 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, StandWound=8, CombatWound=9, Talk=60, Dance=69, Wave=67, Cheer=68, Laugh=70, Flex=82, Point=84, Cower=225 },
              intents = {
                  IDLE         = { anim = "Stand",       sound = { 549672, 549673, 549675, 549676, 550773, 550778, 550781, 550785 } },
                  FIDGET       = { anim = "Talk",        sound = { 549672, 549673, 549675, 549676, 550773, 550778, 550781, 550785 } }, -- Gazlowe classic + gruff greetings
                  TALKING      = { anim = "Talk",        sound = { 2961768, 2961769, 2961770, 2961771 } }, -- Gazlowe BfA greetings
                  GREETING     = { anim = "Wave",        sound = { 549672, 549673, 549675, 549676, 2961768, 2961769, 2961770, 2961771 } }, -- all Gazlowe greetings
                  CELEBRATING  = { anim = "Cheer",       sound = { 1052993, 1052994, 1052995, 1052996, 1052997 } }, -- Gazlowe attack crit
                  TRIUMPHANT   = { anim = "BattleRoar",  sound = { 1052993, 1052994, 1052995, 1052996, 1052997 } },
                  EXCITED      = { anim = "Exclamation", sound = { 549672, 549673, 549675, 549676 } }, -- Gazlowe classic greetings
                  COMBAT_READY = { anim = "ReadyUnarmed", sound = { 1052983, 1052984, 1052985, 1052986, 1052987, 1052988, 1052989, 1052990, 1052991, 1052992 } }, -- Gazlowe attack
                  DISTRESSED   = { anim = "Cower",       sound = { 1053013, 1053014, 1053015, 1053016, 1053017 } }, -- Gazlowe wound crit
                  MOURNING     = { anim = "Cry",         sound = {} },
                  DYING        = { anim = "Death",       sound = { 1052998, 1052999, 1053000, 1053001, 1053002 } }, -- Gazlowe death
                  RUNNING      = { anim = "Run",         sound = {} },
                  MOUNTED      = { anim = "Run",         sound = {} },
                  SWIMMING      = { anim = "SwimIdle",    sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",        sound = {} },
                  FLYING       = { anim = "Hover",       sound = {} },
                  SLEEP        = { anim = "Sleep",       sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },  -- no Eat anim on goblin modelGroup
                  HEARTHING    = { anim = "Wave",         sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },  -- no Sleep/SitGround in modelGroup anims
                  RELAXED      = { anim = "Stand",        sound = {} },
              },
            },
        },
        models = {},
    },
    dash = {
        key = "dash",
        name = "Dash",
        title = "The Rakish Charmer",
        description = "Smooth, confident, sees innuendo in absolutely everything",
        chatColor = "|cFF8B0000",
        themeColor = { r = 0.55, g = 0.0, b = 0.0 },
        displayID = 43031, -- Blood Elf Male
        talkingHeadCamera = { scale = 0.5, modelX = 0, modelY = -0.05, modelZ = -0.15, facing = 0.45 }, -- parity with Vamoose; toast model is 2x without it
        quoteDBKey = "dash",
        -- Humanoid anim set shared with Vamoose (modern verified AnimationData
        -- IDs) -- replaces the stale 2026-04-05 probe that used old numbering.
        -- Validated by in-game probe 2026-06-12: 43031 supports all 76 slots.
        animations = {
            Stand=0, Death=1, Stop=3, Walk=4, Run=5,
            StandWound=8, CombatWound=9, CombatCritical=10,
            ShuffleLeft=11, ShuffleRight=12, WalkBack=13, Stun=14, HandsClosed=15,
            AttackUnarmed=16, Attack1H=17, Attack2H=18, Attack2HL=19,
            ParryUnarmed=20, Parry1H=21, Parry2H=22, Parry2HL=23, ShieldBlock=24,
            ReadyUnarmed=25, Ready1H=26, Ready2H=27, Ready2HL=28, ReadyBow=29, Dodge=30,
            JumpStart=37, Jump=38, JumpEnd=39, Fall=40,
            SwimIdle=41, Swim=42, SwimLeft=43, SwimRight=44, SwimBack=45,
            AttackBow=46, ReadyRifle=48, AttackRifle=49, Loot=50,
            ReadySpellDirected=51, ReadySpellOmni=52, SpellCastOmni=53, BattleRoar=54,
            ReadyCrossbow=55, ShootCrossbow=57,
            -- Modern AnimationData IDs (verified from wow.export AnimMapper.js)
            Talk=60, Eat=61, Work=62, Exclamation=64, Question=65,
            Bow=66, Wave=67, Cheer=68, Dance=69, Laugh=70,
            Kneel=75, Kiss=76, Cry=77, Chicken=78, Beg=79,
            Applaud=80, Shout=81, Flex=82, Shy=83, Point=84,
            SitGround=97, Sleep=100, Knockdown=110, Whirlwind=113,
            FlyBack=136, FlyLeft=137, FlyRight=138, Hover=193, Cower=225,
        },
        models = {
            -- Civilian / base
            43031, 43032, 43033, 43034,
            -- Named NPCs
            140873, -- Grand Magister Rommath (Midnight)
            137217, -- Halduron Brightwing (Midnight)
            123748, -- Archmage Aethas Sunreaver (modern)
            129719, -- Rommath (pre-Midnight)
            128345, -- Halduron (pre-Midnight)
            -- Midnight era
            138079, -- Spellbreaker
            138092, -- Eversong Farstrider
            136788, -- Phoenixfire Magister
            141313, -- Archmage Lan'dalock
            140154, -- Lord Antenorian
            -- Classic armored
            92675,  -- Farstrider Elite (ranger leathers)
            47721,  -- Dawnguard Bloodknight
            86750,  -- Blood Marquis (noble)
            46172,  -- Silvermoon Scholar
            79879,  -- High Priest of Silvermoon
            85901,  -- Sin'dorei Battlemage
        },
    },
    vexia = {
        key = "vexia",
        name = "Vexia",
        title = "The Winking Temptress",
        description = "Theatrical, conspiratorial, delights in making everything sound scandalous",
        chatColor = "|cFFDA70D6",
        themeColor = { r = 0.85, g = 0.44, b = 0.84 },
        displayID = 4162, -- Sayaad
        talkingHeadCamera = { scale = 0.5, modelX = 0, modelY = -0.05, modelZ = -0.15, facing = 0.45 }, -- parity with Vamoose; toast model is 2x without it
        quoteDBKey = "vexia",
        -- Probed from displayID 4162 (in-game probe 2026-06-12, modern IDs).
        -- The sayaad rig is NOT humanoid-animated: every candidate model
        -- (classic 4162 through Legion 77396/113718) supports only this set,
        -- so she keeps the demon archetype chains in VC_AnimDB.
        -- SpellCastOmni (54) deliberately omitted although the rig has it:
        -- it's a half-animation that freezes mid-cast on a portrait loop
        -- (owner call 2026-06-12) -- chains fall through to Stand instead.
        -- Flourish/Lean/Preen are sayaad-only sequences, unnamed in our
        -- AnimationData refs; eyeballed + approved in-game 2026-06-12.
        -- 131/132 rejected (face-away/floor poses).
        animations = {
            Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, CombatCritical=10,
            AttackUnarmed=16, ReadyUnarmed=25,
            SwimIdle=41, Swim=42, SwimLeft=43, SwimRight=44, SwimBack=45,
            Flourish=124, Lean=125, Preen=194,
        },
        models = {
            -- Classic succubus
            4162, 159, 2737, 75528, 128692, 140226,
            -- Modern sayaad (Legion+)
            77396, 77399, 113718,
            -- Incubus
            77400,
            -- Shivarra (6-armed)
            17543, 19587, 100519, 100520, 100521,
            64780, 64781,
        },
    },
    ember = {
        key = "ember",
        name = "Ember",
        title = "The Resilient Optimist",
        description = "Young, bright, sees every setback as a chance to rise again",
        chatColor = "|cFFFF4500",
        themeColor = { r = 1.0, g = 0.27, b = 0.0 },
        displayID = 23574, -- Phoenix Hatchling
        quoteDBKey = "ember",
        -- Probed from displayID 23574 (2026-04-05)
        animations = {
            Stand=0, Death=1, Walk=4, Run=5,
            StandWound=8, CombatWound=9, CombatCritical=10, WalkBack=13, Stun=14,
            AttackUnarmed=16, ReadyUnarmed=25,
            JumpStart=37, JumpEnd=39,
            SwimIdle=41, Swim=42, SwimLeft=43, SwimRight=44, SwimBack=45, Loot=50,
            Yes=62, Work=63,
            RunRight=92, RunLeft=93, MountSpecial=94, SitGround=97,
            Fly=135, FlyLeft=137, FlyRight=138, LootHold=188, Hover=193, FlyRun=234,
        },
        models = {
            -- Phoenix hatchling (phoenixpet.m2)
            23574, 53045,
            -- Dark phoenix
            37136, 45646,
            -- Full-size classic phoenix
            19682,
            -- Fire hawk
            38013,
            -- Modern DF phoenix (phoenix2.m2)
            100832, 100833, 102500,
            -- Phoenix pet (phoenix2pet.m2)
            106643,
        },
    },
    grimble = {
        key = "grimble",
        name = "Grimble",
        title = "The Morbidly Cheerful Academic",
        description = "Dry, intellectual, finds his own undead condition endlessly amusing",
        chatColor = "|cFF4682B4",
        themeColor = { r = 0.27, g = 0.51, b = 0.71 },
        displayID = 10971, -- Forsaken male
        quoteDBKey = "grimble",
        -- Probed from displayID 10971 (2026-04-05)
        animations = {
            Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, CombatCritical=10,
            HandsClosed=15, AttackUnarmed=16, Attack1H=17,
            ReadySpellDirected=51, ReadySpellOmni=52, SpellCastOmni=53, BattleRoar=54,
        },
        models = {
            10971,  -- Zombie (default)
            1831,   -- Forsaken Male generic
            25299,  -- Grand Apothecary Putress
            90372,  -- Master Apothecary Faranell (Midnight)
            121935, -- Forsaken Apothecary (TWW)
            30291,  -- Forsaken Soldier (armored)
            84456,  -- Forsaken Deathguard
            86219,  -- Nathanos Blightcaller
            47835,  -- Undead Male (WoD)
            19188,  -- Forsaken Commoner
        },
    },
    breezy = {
        key = "breezy",
        name = "Breezy",
        title = "The Zen Drifter",
        description = "Calm, floaty, everything is beautiful and interesting",
        chatColor = "|cFF87CEEB",
        themeColor = { r = 0.53, g = 0.81, b = 0.92 },
        displayID = 43876, -- Cloud Serpent
        quoteDBKey = "breezy",
        -- Probed from displayID 43876 (2026-04-05)
        animations = {
            Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, CombatCritical=10,
            ShuffleLeft=11, ShuffleRight=12, Stun=14, AttackUnarmed=16, ReadyUnarmed=25,
            SpellCast=32, SwimIdle=41, Swim=42,
            Fly=135, FlyLeft=137, Hover=193,
        },
        models = {
            -- Pet-scale cloud serpent
            43876, 43874, 43875, 44445, 74657, 111497, 45386,
            -- Thundering
            43865, 45661,
            -- NPC-scale
            91729, 92121,
            -- Celestial
            41285, 47676,
        },
    },
    torque = {
        key = "torque",
        name = "Torque",
        title = "The Data-Driven Enthusiast",
        description = "Analytical, excited by numbers, thrilled by every efficiency gain",
        chatColor = "|cFFC0C0C0",
        themeColor = { r = 0.75, g = 0.75, b = 0.75 },
        displayID = 62005, -- Mechagnome
        quoteDBKey = "torque",
        -- Probed from displayID 62005 (2026-04-05)
        animations = {
            Stand=0, Death=1, Stop=3, Walk=4, Run=5,
            StandWound=8, CombatWound=9, CombatCritical=10,
            ShuffleLeft=11, ShuffleRight=12, WalkBack=13, Stun=14, HandsClosed=15,
            AttackUnarmed=16, Attack1H=17, Attack2H=18, Attack2HL=19,
            ParryUnarmed=20, Parry1H=21, Parry2H=22, Parry2HL=23, ShieldBlock=24,
            ReadyUnarmed=25, Ready1H=26, Ready2H=27, Ready2HL=28, ReadyBow=29, Dodge=30,
            JumpStart=37, Jump=38, JumpEnd=39, Fall=40,
            SwimIdle=41, Swim=42, SwimLeft=43, SwimRight=44, SwimBack=45,
            AttackBow=46, AttackCrossbow=56, ReadyRifle=48, AttackRifle=49, Loot=50,
            ReadySpellDirected=51, ReadySpellOmni=52, SpellCastOmni=53, BattleRoar=54,
            ReadyCrossbow=55, ShootCrossbow=57,
            Talk=60, Eat=61, Yes=62, Work=63, No=64, Exclamation=65, Question=66,
            Bow=67, Wave=68, Dance=69, Cheer=70,
            Laugh=73, Kneel=74, Kiss=75, Cry=76, Chicken=77, Beg=78, Applaud=79,
            Shout=80, Flex=81, Shy=82, Point=83, Rude=84,
            ReadyThrown=91, SitGround=97, Sleep=110, Knockdown=111, Whirlwind=113,
            FlyBack=136, FlyRight=138, Hover=193, -- Cower=225 removed: probe 2026-06-12, not on rig 62005

        },
        models = {
            62005,  -- Clockwork Gnome (default)
            36211,  -- Clockwork pet (small)
            24103,  -- Fizzcrank Mechagnome
            90798,  -- Prince Erazmin
            91120,  -- King Mechagon
            91949,  -- Bondo Bigblock
            90851,  -- Mechagon Trooper
        },
    },
    patches = {
        key = "patches",
        name = "Patches",
        title = "The Loyal First Mate",
        description = "Salty sea-dog vocabulary, fiercely loyal, everything is a naval adventure",
        sigQuote = "\"Every captain needs a first mate who'd fly through a hurricane for them. You found yours, Cap'n.\"",
        chatColor = "|cFFFFD700",
        themeColor = { r = 1.0, g = 0.84, b = 0.0 },
        displayID = 80412, -- Giant Parrot (Red, modern model)
        portraitScale = 0.7,
        portraitZ = 0.5,
        talkingHeadCamera = { scale = 0.9, modelX = 0, modelY = 0, modelZ = 0, facing = 0.3 },
        quoteDBKey = "patches",
        -- Probed from displayID 80412 (2026-04-05)
        animations = {
            Stand=0, Death=1, Walk=4, Run=5,
            StandWound=8, CombatWound=9, CombatCritical=10,
            ShuffleLeft=11, ShuffleRight=12, WalkBack=13, Stun=14,
            AttackUnarmed=16, ReadyUnarmed=25,
            JumpStart=37, Jump=38, JumpEnd=39, Fall=40,
            SwimIdle=41, Swim=42, SwimLeft=43, SwimRight=44, SwimBack=45, Loot=50,
            ReadyCrossbow=55, Yes=62, Work=63,
            RunRight=92, RunLeft=93, MountSpecial=94, SitGround=97,
            Fly=135, FlyLeft=137, FlyRight=138, LootHold=188, Hover=193, FlyRun=234,
        },
        modelGroups = {
            { label = "Giant Parrot",
              ids = { 80412, 80413, 80414, 124174, 82338 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, StandWound=8, CombatWound=9, CombatCritical=10, AttackUnarmed=16, ReadyUnarmed=25, Loot=50, MountSpecial=94, SitGround=97, Fly=135, FlyLeft=137, FlyRight=138, LootHold=188, Hover=193, FlyRun=234 },
              intents = {
                  IDLE         = { anim = "SitGround",    sound = { 2148635, 2148636, 2148637, 2148638, 2148639, 2148640, 2148641, 2148642, 2148643 } },
                  FIDGET       = { anim = "ReadyUnarmed", sound = { 2148635, 2148636, 2148637, 2148638, 2148639, 2148640, 2148641, 2148642, 2148643 } }, -- SK 242766 Idle
                  TALKING      = { anim = "Stand",        sound = { 2148650, 2148651, 2148652, 2148653, 2148654, 2148655, 2148656, 2148657, 2148658, 2148659 } }, -- SK 116257 PreAggro
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "MountSpecial", sound = { 2148625, 2148626, 2148627, 2148628, 2148629 } }, -- SK 116261 BattleShout
                  TRIUMPHANT   = { anim = "MountSpecial", sound = { 2148602, 2148604, 2148605, 2148606, 2148607, 2148608, 2148609 } }, -- SK 116258 Aggro
                  EXCITED      = { anim = "MountSpecial", sound = { 2148644, 2148645, 2148646, 2148647, 2148648, 2148649 } }, -- SK 242753 MountSpecial
                  COMBAT_READY = { anim = "ReadyUnarmed", sound = { 2148610, 2148611, 2148612, 2148613, 2148614, 2148615, 2148616, 2148617, 2148618, 2148619 } }, -- SK 116242 Attack
                  DISTRESSED   = { anim = "Stun",          sound = { 2148665, 2148666, 2148667, 2148668, 2148669, 2148670, 2148671, 2148672, 2148673, 2148674 } }, -- SK 219033 Wound
                  MOURNING     = { anim = "SitGround",    sound = {} },
                  DYING        = { anim = "Death",        sound = { 2148630, 2148631, 2148632, 2148633, 2148634 } }, -- SK 284190 Death
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = { 1561447, 1561448, 1561449, 1561450, 1561451, 1561452, 1561453, 1561454, 1561455, 1561456 } }, -- SK 116259 WingFlap
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "Hover",        sound = { 1561447, 1561448, 1561449, 1561450, 1561451, 1561452, 1561453, 1561454, 1561455, 1561456 } },
                  SLEEP        = { anim = "SitGround",    sound = {} },
                  EATING       = { anim = "SitGround",    sound = {} },
                  HEARTHING    = { anim = "MountSpecial", sound = {} },
                  BORED        = { anim = "SitGround",    sound = {} },
                  RELAXED      = { anim = "SitGround",    sound = {} },
              },
            },
        },
        models = {},
    },
    murgle = {
        key = "murgle",
        name = "Murgle",
        title = "The Devoted Tide-Watcher",
        description = "Speaks only in nerglish, but the translations reveal a heart absurdly full of loyalty, wonder, and fish-based wisdom",
        sigQuote = "\"Mrrrggk flllurlog mmm murrgl. (The tide always comes back. So do you. That is my favourite fact about the world.)\"",
        ttsVoice = "Bubbles [en-US]",
        chatColor = "|cFF40E0D0",   -- turquoise
        themeColor = { r = 0.25, g = 0.88, b = 0.82 },
        displayID = 391,            -- Adult Murloc (murloc2.m2, colorful)
        portraitScale = 0.35,
        sidebarCamera = 4,          -- adult murloc is full-size, no zoom needed
        portraitZ = -0.1,
        talkingHeadCamera = { scale = 0.45, modelX = 0, modelY = -0.04, modelZ = -0.08, facing = 0.5 },
        quoteDBKey = "murgle",
        -- Animations for default displayID (391, adult murloc) -- used by AnimResolver/Portrait
        -- Probed in-game 2026-04-13
        animations = {
            Stand=0, Death=1, Walk=4, Run=5,
            CombatWound=9, CombatCritical=10, HandsClosed=15,
            AttackUnarmed=16, Attack1H=17, Attack2H=18,
            SpellCast=32, JumpStart=37, Jump=38, JumpEnd=39,
            SwimIdle=41, Swim=42, SwimLeft=43, SwimRight=44, SwimBack=45,
            ReadySpellDirected=51, ReadySpellOmni=52, SpellCastDirected=53, SpellCastOmni=54,
            Special1H=57, Special2H=58, Dance=69, Flex=82, Mount=91,
        },
        -- Model groups (probed 2026-04-13, sounds from Wowhead SoundKit DB2 + wow.export)
        -- Each group: ids, anims (for debug cycle), intents (intent -> { anim, sound = {FileDataIDs} })
        -- Sound gated by chattiness globalCD; IDLE plays on state transitions, FIDGET on idle ticker (~53s)
        modelGroups = {
            { label = "Baby Murloc",
              ids = { 15393, 15394, 15395, 15396, 74832 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, Stun=14, AttackUnarmed=16, SpellCast=32, SwimIdle=41, Swim=42, Dance=69, Cower=225 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 544712, 544713, 544715, 657586, 657588, 657590, 657592, 657594, 657596, 657598 } },
                  FIDGET       = { anim = "Dance",        sound = { 544712, 544713, 544715, 657586, 657588, 657590, 657592, 657594, 657596, 657598 } }, -- SK 8475 Clickables
                  TALKING      = { anim = "Stand",        sound = { 544712, 544713, 544715, 657586, 657588, 657590, 657592, 657594, 657596, 657598 } },
                  GREETING     = { anim = "Dance",        sound = {} },
                  CELEBRATING  = { anim = "Dance",        sound = { 657572 } },         -- SK 183691 BabyMurlocDance
                  TRIUMPHANT   = { anim = "Dance",        sound = { 657572 } },
                  EXCITED      = { anim = "Dance",        sound = { 544712, 544713, 544715, 657586, 657588, 657590, 657592, 657594, 657596, 657598 } },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = { 657574, 657576, 657578, 657580, 657582, 657584 } }, -- SK 33164
                  DISTRESSED   = { anim = "CombatWound",  sound = { 657606, 657608, 657610, 657612, 657614 } },         -- SK 33163
                  MOURNING     = { anim = "Cower",        sound = { 657606, 657608, 657610, 657612, 657614 } },
                  DYING        = { anim = "Death",        sound = { 657600, 657602, 657604 } },                         -- SK 33165
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Stand",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "Dance",        sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
            { label = "Baby Murloc Plated",
              ids = { 66172 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, StandWound=8, CombatWound=9, CombatCritical=10, HandsClosed=15, AttackUnarmed=16, SpellCast=32, SwimIdle=41, Swim=42 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 544712, 544713, 544715, 657586, 657588, 657590, 657592, 657594, 657596, 657598 } },
                  FIDGET       = { anim = "SpellCast",    sound = { 544712, 544713, 544715, 657586, 657588, 657590, 657592, 657594, 657596, 657598 } },
                  TALKING      = { anim = "Stand",        sound = { 544712, 544713, 544715, 657586, 657588, 657590, 657592, 657594, 657596, 657598 } },
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "SpellCast",    sound = {} },
                  TRIUMPHANT   = { anim = "SpellCast",    sound = {} },
                  EXCITED      = { anim = "SpellCast",    sound = {} },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = { 657574, 657576, 657578, 657580, 657582, 657584 } },
                  DISTRESSED   = { anim = "CombatWound",  sound = { 657606, 657608, 657610, 657612, 657614 } },
                  MOURNING     = { anim = "CombatWound",  sound = {} },
                  DYING        = { anim = "Death",        sound = { 657600, 657602, 657604 } },
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Stand",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "SpellCast",    sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
            { label = "Baby Murloc Ice/Bronze",
              ids = { 96259, 110488, 110489 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatCritical=10, AttackUnarmed=16, Attack1H=17, SwimIdle=41, Swim=42 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 6182374, 6182376, 6182378 } },
                  FIDGET       = { anim = "Stand",        sound = { 6182374, 6182376, 6182378 } },                     -- babymurlocice fidget
                  TALKING      = { anim = "Stand",        sound = {} },
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "Stand",        sound = {} },
                  TRIUMPHANT   = { anim = "Stand",        sound = {} },
                  EXCITED      = { anim = "Stand",        sound = {} },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = {} },
                  DISTRESSED   = { anim = "CombatCritical", sound = { 6182386, 6182388, 6182390, 6182392, 6182394 } },   -- babymurlocice wound
                  MOURNING     = { anim = "Stand",        sound = {} },
                  DYING        = { anim = "Death",        sound = {} },
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Stand",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "Stand",        sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
            { label = "Deathwing Baby Murloc",
              ids = { 109514 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, StandWound=8, CombatWound=9, CombatCritical=10, HandsClosed=15, AttackUnarmed=16, Attack1H=17, Attack2H=18, ReadyUnarmed=25, SpellCast=32, SwimIdle=41, Swim=42, Special1H=57, Special2H=58, Knockdown2=111, Cower=225 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 6182374, 6182376, 6182378 } },
                  FIDGET       = { anim = "SpellCast",    sound = { 6182374, 6182376, 6182378 } },                     -- babymurlocice fidget
                  TALKING      = { anim = "Stand",        sound = {} },
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "SpellCast",    sound = {} },
                  TRIUMPHANT   = { anim = "SpellCast",    sound = {} },
                  EXCITED      = { anim = "SpellCast",    sound = {} },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = { 3612013, 3612015, 3612017, 3612019, 3612021 } },   -- attackcritical
                  DISTRESSED   = { anim = "CombatWound",  sound = { 6182386, 6182388, 6182390, 6182392, 6182394 } },   -- babymurlocice wound
                  MOURNING     = { anim = "Cower",        sound = {} },
                  DYING        = { anim = "Death",        sound = {} },
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Stand",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "SpellCast",    sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
            { label = "Adult Murloc",
              ids = { 385, 391, 75693, 117059 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, CombatCritical=10, HandsClosed=15, AttackUnarmed=16, Attack1H=17, Attack2H=18, SpellCast=32, JumpStart=37, Jump=38, JumpEnd=39, SwimIdle=41, Swim=42, SwimLeft=43, SwimRight=44, SwimBack=45, ReadySpellDirected=51, ReadySpellOmni=52, SpellCastDirected=53, SpellCastOmni=54, Special1H=57, Special2H=58, Dance=69, Flex=82, Mount=91 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 555993, 556001, 556002 } },
                  FIDGET       = { anim = "Dance",        sound = { 555993, 556001, 556002 } },         -- SK 23615 Greeting
                  TALKING      = { anim = "Stand",        sound = { 555993, 556001, 556002 } },
                  GREETING     = { anim = "Dance",        sound = {} },
                  CELEBRATING  = { anim = "Dance",        sound = { 556000 } },                         -- SK 416 Aggro (MRGRLRL)
                  TRIUMPHANT   = { anim = "Dance",        sound = { 556000 } },
                  EXCITED      = { anim = "Dance",        sound = { 556000 } },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = { 555998 } },                         -- SK 1109 Alert
                  DISTRESSED   = { anim = "CombatWound",  sound = { 555994, 555996, 555999 } },         -- SK 418 Wound
                  MOURNING     = { anim = "CombatWound",  sound = { 556007 } },                         -- SK 419 WoundCrit
                  DYING        = { anim = "Death",        sound = { 555995 } },                         -- SK 85051 Death
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Mount",        sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Stand",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "SpellCastOmni", sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
            { label = "Deep Sea Murloc",
              ids = { 64548 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, StandWound=8, CombatWound=9, CombatCritical=10, Stun=14, HandsClosed=15, AttackUnarmed=16, Attack1H=17, Attack2H=18, ReadyUnarmed=25, SpellCast=32, SwimIdle=41, Swim=42, Special1H=57, Special2H=58, Knockdown2=111, Cower=225 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 556021, 556027, 556037, 556041, 556042, 556044, 556055, 556060, 556066 } },
                  FIDGET       = { anim = "SpellCast",    sound = { 556021, 556027, 556037, 556041, 556042, 556044, 556055, 556060, 556066 } }, -- SK 18075 PreAggro
                  TALKING      = { anim = "Stand",        sound = { 556021, 556027, 556037, 556041, 556042, 556044, 556055, 556060, 556066 } },
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "SpellCast",    sound = { 556008, 556009, 556014, 556019, 556026, 556028, 556032, 556043, 556063 } }, -- SK 166086 Aggro
                  TRIUMPHANT   = { anim = "SpellCast",    sound = { 556008, 556009, 556014, 556019, 556026, 556028, 556032, 556043, 556063 } },
                  EXCITED      = { anim = "SpellCast",    sound = { 556008, 556009, 556014, 556019, 556026, 556028, 556032, 556043, 556063 } },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = { 556018, 556020, 556022, 556030, 556034, 556035, 556038, 556052, 556056, 556059 } }, -- SK 166079 Attack
                  DISTRESSED   = { anim = "CombatWound",  sound = { 556010, 556023, 556036, 556040, 556046, 556049, 556053, 556058 } },         -- SK 166081 Wound
                  MOURNING     = { anim = "Cower",        sound = {} },
                  DYING        = { anim = "Death",        sound = { 556013, 556024, 556025, 556033, 556045, 556048, 556051, 556061, 556064, 556065 } }, -- SK 18073 Death
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Stand",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "SpellCast",    sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
            { label = "DH Murloc (Mischief)",
              ids = { 64589 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, StandWound=8, CombatWound=9, CombatCritical=10, HandsClosed=15, AttackUnarmed=16, SpellCast=32, SwimIdle=41, Swim=42, Flex=82, Mount=91 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 1266438, 1266439, 1266440, 1266441, 1266442, 1266443, 1266444, 1266445, 1266446, 1266447 } },
                  FIDGET       = { anim = "SpellCast",    sound = { 1266438, 1266439, 1266440, 1266441, 1266442, 1266443, 1266444, 1266445, 1266446, 1266447 } }, -- SK 53899
                  TALKING      = { anim = "Stand",        sound = {} },
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "SpellCast",    sound = {} },
                  TRIUMPHANT   = { anim = "SpellCast",    sound = {} },
                  EXCITED      = { anim = "SpellCast",    sound = {} },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = { 1266432, 1266433, 1266434, 1266435, 1266436, 1266437 } }, -- SK 53896
                  DISTRESSED   = { anim = "CombatWound",  sound = { 657606, 657608, 657610, 657612, 657614 } },                 -- SK 53877
                  MOURNING     = { anim = "CombatWound",  sound = {} },
                  DYING        = { anim = "Death",        sound = { 1266448, 1266449, 1266450 } },                             -- SK 53898
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Mount",        sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Stand",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "SpellCast",    sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
            { label = "Alliance / Horde Murloc",
              ids = { 73351, 73352 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatCritical=10, Attack1H=17, SwimIdle=41, Swim=42 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 555993, 556001, 556002 } },
                  FIDGET       = { anim = "Stand",        sound = { 555993, 556001, 556002 } },
                  TALKING      = { anim = "Stand",        sound = {} },
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "Stand",        sound = {} },
                  TRIUMPHANT   = { anim = "Stand",        sound = {} },
                  EXCITED      = { anim = "Stand",        sound = {} },
                  COMBAT_READY = { anim = "Attack1H",     sound = { 556003, 556004, 556005 } },
                  DISTRESSED   = { anim = "CombatCritical", sound = { 555994, 555996, 555999 } },
                  MOURNING     = { anim = "Stand",        sound = {} },
                  DYING        = { anim = "Death",        sound = { 555995 } },
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Stand",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "Stand",        sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
            { label = "Adult Murloc Variants", -- maria, shark, blue-black, bronze/ice adult
              ids = { 73161, 73461, 117058, 110490, 110491 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, CombatCritical=10, HandsClosed=15, AttackUnarmed=16, Attack1H=17, Attack2H=18, SpellCast=32, JumpStart=37, Jump=38, JumpEnd=39, SwimIdle=41, Swim=42, SwimLeft=43, SwimRight=44, SwimBack=45, ReadySpellDirected=51, ReadySpellOmni=52, SpellCastDirected=53, SpellCastOmni=54, Special1H=57, Special2H=58, Dance=69 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 555993, 556001, 556002 } },
                  FIDGET       = { anim = "Dance",        sound = { 555993, 556001, 556002 } },
                  TALKING      = { anim = "Stand",        sound = { 555993, 556001, 556002 } },
                  GREETING     = { anim = "Dance",        sound = {} },
                  CELEBRATING  = { anim = "Dance",        sound = { 556000 } },
                  TRIUMPHANT   = { anim = "Dance",        sound = { 556000 } },
                  EXCITED      = { anim = "Dance",        sound = { 556000 } },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = { 556003, 556004, 556005 } },
                  DISTRESSED   = { anim = "CombatWound",  sound = { 555994, 555996, 555999 } },
                  MOURNING     = { anim = "CombatWound",  sound = {} },
                  DYING        = { anim = "Death",        sound = { 555995 } },
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Stand",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "SpellCastOmni", sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
            { label = "Murloc Brute",
              ids = { 105017, 113798 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, StandWound=8, CombatWound=9, CombatCritical=10, ShuffleLeft=11, ShuffleRight=12, WalkBack=13, Stun=14, AttackUnarmed=16, ParryUnarmed=20, ReadyUnarmed=25, Dodge=30, JumpStart=37, Jump=38, JumpEnd=39, Fall=40, SwimIdle=41, Swim=42, SwimBack=45, ReadySpellDirected=51, ReadySpellOmni=52, SpellCastDirected=53, SpellCastOmni=54, BattleRoar=55, Talk=60, Work=62, Point=84, AttackOff=87 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 3612061, 3612063, 3612065, 3612067, 3612069, 3612071, 3612073, 3612075, 3612077, 3612079, 3612081, 3612083 } },
                  FIDGET       = { anim = "Stand",        sound = { 3612061, 3612063, 3612065, 3612067, 3612069, 3612071, 3612073, 3612075, 3612077, 3612079, 3612081, 3612083 } }, -- SK 273913 Idle
                  TALKING      = { anim = "Talk",         sound = { 3612061, 3612063, 3612065, 3612067, 3612069, 3612071, 3612073, 3612075, 3612077, 3612079, 3612081, 3612083 } },
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "Stand",        sound = { 3612043, 3612045, 3612047, 3612049 } },           -- SK 209692 BattleShout
                  TRIUMPHANT   = { anim = "BattleRoar",   sound = { 3612003, 3612005, 3612007, 3612009, 3612011 } },   -- SK 209691 Aggro
                  EXCITED      = { anim = "Stand",        sound = {} },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = { 3612023, 3612025, 3612027, 3612029, 3612031, 3612033, 3612035, 3612037, 3612039, 3612041 } }, -- SK 204902 Attack
                  DISTRESSED   = { anim = "CombatWound",  sound = { 3612123, 3612125, 3612127, 3612129, 3612131, 3612133, 3612135, 3612137 } }, -- SK 209688 Wound
                  MOURNING     = { anim = "CombatWound",  sound = {} },
                  DYING        = { anim = "Death",        sound = { 3612051, 3612053, 3612055, 3612057, 3612059 } },   -- SK 209690 Death
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Stand",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "SpellCastOmni", sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
            { label = "Murloc Costume",
              ids = { 69083 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, ShuffleLeft=11, ShuffleRight=12, WalkBack=13, HandsClosed=15, JumpStart=37, Jump=38, JumpEnd=39, Fall=40, SwimIdle=41, Swim=42, SwimLeft=43, SwimRight=44, SwimBack=45, Talk=60, Eat=61, Work=62, Exclamation=64, Question=65, Bow=66, Wave=67, Cheer=68, Dance=69, Laugh=70, Rude=73, Kneel=75, Kiss=76, Cry=77, Beg=79, Applaud=80, Flex=82, Point=84, Mount=91, SitGroundDown=96, SitGround=97, SitGroundUp=98, SleepDown=99, Sleep=100 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 555993, 556001, 556002 } },
                  FIDGET       = { anim = "Dance",        sound = { 555993, 556001, 556002 } },
                  TALKING      = { anim = "Talk",         sound = {} },
                  GREETING     = { anim = "Wave",         sound = {} },
                  CELEBRATING  = { anim = "Dance",        sound = {} },
                  TRIUMPHANT   = { anim = "Dance",        sound = {} },
                  EXCITED      = { anim = "Dance",        sound = {} },
                  COMBAT_READY = { anim = "Stand",        sound = {} },
                  DISTRESSED   = { anim = "Stand",        sound = {} },
                  MOURNING     = { anim = "Cry",          sound = {} },
                  DYING        = { anim = "Death",        sound = {} },
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Mount",        sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Sleep",        sound = {} },
                  EATING       = { anim = "Eat",          sound = {} },
                  HEARTHING    = { anim = "Wave",         sound = {} },
                  BORED        = { anim = "Sleep",        sound = {} },
                  RELAXED      = { anim = "SitGround",    sound = {} },
              },
            },
            { label = "Murloc Surrender",
              ids = { 119672 },
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatCritical=10, AttackUnarmed=16, Attack1H=17, SwimIdle=41, Swim=42 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = { 555993, 556001, 556002 } },
                  FIDGET       = { anim = "Stand",        sound = { 555993, 556001, 556002 } },
                  TALKING      = { anim = "Stand",        sound = {} },
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "Stand",        sound = {} },
                  TRIUMPHANT   = { anim = "Stand",        sound = {} },
                  EXCITED      = { anim = "Stand",        sound = {} },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = {} },
                  DISTRESSED   = { anim = "CombatCritical", sound = {} },
                  MOURNING     = { anim = "Stand",        sound = {} },
                  DYING        = { anim = "Death",        sound = {} },
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Stand",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "Stand",        sound = {} },
                  BORED        = { anim = "Stand",        sound = {} },
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
        },
        -- Flat list for ModelViewer/Settings compat (built below from modelGroups)
        models = {},
    },
    snorf = {
        key         = "snorf",
        name        = "Snorf",
        title       = "The Untroubled",
        description = "A capybara of ancient calm who finds everything -- including whatever just happened -- broadly acceptable",
        sigQuote    = "\"Whole lotta world out here, man. Snorf's just glad we're seein' this bit together.\"",
        chatColor   = "|cFFC4A882",   -- sandy tan (no other companion owns the warm-tan range)
        themeColor  = { r = 0.77, g = 0.66, b = 0.51 },
        displayID   = 144181,         -- model 11268, scale 1.0, standard brown (Kapara, one of Filo's beasts)
        sidebarDisplayID = 131631,    -- picker thumbnail uses the decorated Filo display (model 11268 renders untextured in the tiny preview scene)
        sidebarCamera    = 4,         -- pull camera back: Filo is the large body, and portraitScale 0.25 would otherwise zoom the picker in too far
        -- Camera: STARTING POINTS -- calibrate in-game (low, wide quadruped). See docs/kapara/01_model_animation.md section 7.
        portraitScale      = 0.25,
        portraitY          = 0.0,
        portraitZ          = -0.4,    -- posZ is pre-autofit (scale-swallowed): a large model needs ~3-4x a small one's value
        portraitBaseFacing = 0.4,
        talkingHeadCamera  = { scale = 0.35, modelX = 0, modelY = -0.05, modelZ = 0.05, facing = 0.5 },
        quoteDBKey  = "snorf",
        -- Probed in-game 2026-06-28 on the DEFAULT standard body (model 11268, displayID 144181):
        -- minimal critter set + Cower=225. NO Swim/Eat on this body. The larger Filo-form model
        -- 16293 (variants 131948-51) IS rich (Swim=42, Eat=61, Dance=69, Jump set) -- but a single
        -- `animations` table can only safely list the intersection across all 16 models, so the
        -- Filo-form's extras stay dormant until a modelGroups pass. See docs/kapara/01.
        animations = {
            Stand=0, Death=1, Walk=4, Run=5,
            CombatWound=9, AttackUnarmed=16, Cower=225,
        },
        -- modelGroups: the standard body (model 11268) and the larger Elder/Filo-form body (model
        -- 16293) have DIFFERENT probed anim sets, so they are split into groups -- same pattern as
        -- Scurry/Murgle. intents map behavior intents to each group's available anims. Sounds are
        -- empty for now (ships soundless like Dash/Vexia); fill from SoundKit research later
        -- (NPCSoundID 1794 standard; 3277 Elder = 542354/951286/951288/951290/951292/951294).
        modelGroups = {
            { label = "Kapara",
              ids = { 88761, 88762, 88763, 88764, 88765, 88766 },
              -- standard body (model 11268), 6 colors. Probed 2026-06-28: minimal critter set + Cower.
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, AttackUnarmed=16, Cower=225 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = {} },
                  FIDGET       = { anim = "AttackUnarmed", sound = {} },
                  TALKING      = { anim = "Stand",        sound = {} },
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "Run",          sound = {} },
                  TRIUMPHANT   = { anim = "Run",          sound = {} },
                  EXCITED      = { anim = "Run",          sound = {} },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = {} },
                  DISTRESSED   = { anim = "Cower",        sound = {} },
                  MOURNING     = { anim = "Cower",        sound = {} },
                  DYING        = { anim = "Death",        sound = {} },
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "Stand",        sound = {} },  -- no swim on standard body
                  SWIMMING_MOVE = { anim = "Run",          sound = {} },
                  FLYING       = { anim = "Run",          sound = {} },
                  SLEEP        = { anim = "Death",        sound = {} },  -- Death = curled on side
                  EATING       = { anim = "Stand",        sound = {} },  -- no eat on standard body
                  HEARTHING    = { anim = "Run",          sound = {} },
                  BORED        = { anim = "Death",        sound = {} },
                  RELAXED      = { anim = "Stand",        sound = {} },
              },
            },
            { label = "Kapara Pup",
              ids = { 125359, 125360, 125361, 125362, 125363, 125364 },
              -- same standard body (model 11268) at scale 0.6 -- identical anim set to Kapara.
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, AttackUnarmed=16, Cower=225 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = {} },
                  FIDGET       = { anim = "AttackUnarmed", sound = {} },
                  TALKING      = { anim = "Stand",        sound = {} },
                  GREETING     = { anim = "Stand",        sound = {} },
                  CELEBRATING  = { anim = "Run",          sound = {} },
                  TRIUMPHANT   = { anim = "Run",          sound = {} },
                  EXCITED      = { anim = "Run",          sound = {} },
                  COMBAT_READY = { anim = "AttackUnarmed", sound = {} },
                  DISTRESSED   = { anim = "Cower",        sound = {} },
                  MOURNING     = { anim = "Cower",        sound = {} },
                  DYING        = { anim = "Death",        sound = {} },
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Run",          sound = {} },
                  SWIMMING      = { anim = "Stand",        sound = {} },
                  SWIMMING_MOVE = { anim = "Run",          sound = {} },
                  FLYING       = { anim = "Run",          sound = {} },
                  SLEEP        = { anim = "Death",        sound = {} },
                  EATING       = { anim = "Stand",        sound = {} },
                  HEARTHING    = { anim = "Run",          sound = {} },
                  BORED        = { anim = "Death",        sound = {} },
                  RELAXED      = { anim = "Stand",        sound = {} },
              },
            },
            { label = "Elder Kapara",
              ids = { 131948, 131949, 131950, 131951 },
              -- large "Filo-form" body (model 16293), 4 colors. Probed 2026-06-28: rich set
              -- (Swim/Eat/Dance/Jump). NOTE: this body has NO Cower=225 -- uses Stun/CombatWound.
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, CombatCritical=10, Stun=14,
                        AttackUnarmed=16, ReadyUnarmed=25, JumpStart=37, Jump=38, JumpEnd=39, Fall=40,
                        SwimIdle=41, Swim=42, SwimBack=45, Eat=61, Dance=69, MountSpecial=94,
                        Graze=199, Howl=213, Trot=214 },  -- 199/213/214 ID'd in-game: graze / head-back howl / trot
              intents = {
                  IDLE         = { anim = "Stand",        sound = {} },
                  FIDGET       = { anim = "Graze",        sound = {} },  -- 199 idle grazing (signature capybara)
                  TALKING      = { anim = "Stand",        sound = {} },
                  GREETING     = { anim = "MountSpecial", sound = {} },  -- 94 friendly look-around
                  CELEBRATING  = { anim = "Dance",        sound = {} },  -- a dancing capybara
                  TRIUMPHANT   = { anim = "Howl",         sound = {} },  -- 213 head-back howl: the rare ferocity beat
                  EXCITED      = { anim = "Run",          sound = {} },
                  COMBAT_READY = { anim = "ReadyUnarmed", sound = {} },
                  DISTRESSED   = { anim = "Stun",         sound = {} },
                  MOURNING     = { anim = "CombatWound",  sound = {} },
                  DYING        = { anim = "Death",        sound = {} },
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Trot",         sound = {} },  -- 214 chill trot alongside the mount
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },  -- the capybara soaks
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },  -- floats; reads as hovering
                  SLEEP        = { anim = "Death",        sound = {} },
                  EATING       = { anim = "Eat",          sound = {} },  -- explicit eat for food events
                  HEARTHING    = { anim = "Run",          sound = {} },
                  BORED        = { anim = "Graze",        sound = {} },  -- 199 idle grazing
                  RELAXED      = { anim = "SwimIdle",     sound = {} },  -- soaking / chill in the water
              },
            },
            { label = "Filo",
              ids = { 131631 },
              scale = 1.3,  -- the headdress inflates the bbox; bump so his body matches the other bodies
              -- Filo himself (NPC 256170 / 248726, the Children's Loa): the DECORATED capybara --
              -- headdress, blue feathers, glowing eyes. Confirmed displayID 131631 (Wowhead model data).
              -- Its OWN decorated model 16578 (headdress baked into geometry, NOT 16293) -- but it
              -- shares the Elder body's anim set, confirmed by in-game probe. NOTE: this is the
              -- deity's own regalia display; VERIFY in-game that the regalia renders in ModelScene
              -- (attached helm/effects sometimes don't) -- if it shows plain, drop this group.
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, CombatCritical=10, Stun=14,
                        AttackUnarmed=16, ReadyUnarmed=25, JumpStart=37, Jump=38, JumpEnd=39, Fall=40,
                        SwimIdle=41, Swim=42, SwimBack=45, Eat=61, Dance=69, MountSpecial=94,
                        Graze=199, Howl=213, Trot=214 },  -- 199/213/214 ID'd in-game: graze / head-back howl / trot
              intents = {
                  IDLE         = { anim = "Stand",        sound = {} },
                  FIDGET       = { anim = "Graze",        sound = {} },  -- 199 idle grazing
                  TALKING      = { anim = "Stand",        sound = {} },
                  GREETING     = { anim = "MountSpecial", sound = {} },  -- 94 friendly look-around
                  CELEBRATING  = { anim = "Dance",        sound = {} },
                  TRIUMPHANT   = { anim = "Howl",         sound = {} },  -- 213 head-back howl
                  EXCITED      = { anim = "Run",          sound = {} },
                  COMBAT_READY = { anim = "ReadyUnarmed", sound = {} },
                  DISTRESSED   = { anim = "Stun",         sound = {} },
                  MOURNING     = { anim = "CombatWound",  sound = {} },
                  DYING        = { anim = "Death",        sound = {} },
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Trot",         sound = {} },  -- 214 chill trot
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Death",        sound = {} },
                  EATING       = { anim = "Eat",          sound = {} },
                  HEARTHING    = { anim = "Run",          sound = {} },
                  BORED        = { anim = "Graze",        sound = {} },  -- 199 idle grazing
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
            { label = "Fel Snooter",
              ids = { 130097, 130098, 130099, 130100 },
              -- Rustyroot/Duskytooth/Mustyfur/Scruffyhorn: fel-corrupted Mechagon capybaras with
              -- green/blue/purple flame tips. Probed in-game 2026-06-28: IDENTICAL anim layout to the
              -- large 16293 capybaras (graze 199 / howl 213 / trot 214 / look-around 94 all present),
              -- so it reuses the Elder wiring -- a fel-fire capybara that still grazes and soaks.
              anims = { Stand=0, Death=1, Walk=4, Run=5, CombatWound=9, CombatCritical=10, Stun=14,
                        AttackUnarmed=16, ReadyUnarmed=25, JumpStart=37, Jump=38, JumpEnd=39, Fall=40,
                        SwimIdle=41, Swim=42, SwimBack=45, Eat=61, Dance=69, MountSpecial=94,
                        Graze=199, Howl=213, Trot=214 },
              intents = {
                  IDLE         = { anim = "Stand",        sound = {} },
                  FIDGET       = { anim = "Graze",        sound = {} },  -- 199 idle grazing
                  TALKING      = { anim = "Stand",        sound = {} },
                  GREETING     = { anim = "MountSpecial", sound = {} },  -- 94 friendly look-around
                  CELEBRATING  = { anim = "Dance",        sound = {} },
                  TRIUMPHANT   = { anim = "Howl",         sound = {} },  -- 213 head-back howl
                  EXCITED      = { anim = "Run",          sound = {} },
                  COMBAT_READY = { anim = "ReadyUnarmed", sound = {} },
                  DISTRESSED   = { anim = "Stun",         sound = {} },
                  MOURNING     = { anim = "CombatWound",  sound = {} },
                  DYING        = { anim = "Death",        sound = {} },
                  RUNNING      = { anim = "Run",          sound = {} },
                  MOUNTED      = { anim = "Trot",         sound = {} },  -- 214 chill trot
                  SWIMMING      = { anim = "SwimIdle",     sound = {} },
                  SWIMMING_MOVE = { anim = "Swim",         sound = {} },
                  FLYING       = { anim = "SwimIdle",     sound = {} },
                  SLEEP        = { anim = "Death",        sound = {} },
                  EATING       = { anim = "Eat",          sound = {} },
                  HEARTHING    = { anim = "Run",          sound = {} },
                  BORED        = { anim = "Graze",        sound = {} },  -- 199 idle grazing
                  RELAXED      = { anim = "SwimIdle",     sound = {} },
              },
            },
        },
        -- Flat list for ModelViewer/Settings compat (built below from modelGroups)
        models = {},
    },
}

-- Build flat models list from modelGroups for companions that use grouped structure
for _, profile in pairs(VC_CompanionProfiles) do
    if profile.modelGroups and #profile.models == 0 then
        for _, group in ipairs(profile.modelGroups) do
            for _, id in ipairs(group.ids) do
                profile.models[#profile.models + 1] = id
            end
        end
    end
end
