-- ============================================================================
-- 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 },
        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,
        },
        models = {
            19598,  -- Draenei female (current default)
            -- Male Draenei shaman
            21265,  -- Farseer Javad (shaman trainer, Five Thunders mail)
            71623,  -- Farseer Nobundo (TWW, Broken Draenei)
            17600,  -- Farseer Nobundo (TBC original)
            56859,  -- Vindicator Nobundo (WoD)
            -- Vindicators / plate
            58494,  -- Vindicator Maraad
            63504,  -- Vindicator Boros
            63505,  -- Vindicator Kuros
            92848,  -- Draenei Vindicator (TWW HD)
            116601, -- Devout Vindicator (Midnight)
            119568, -- Exarch Menelaous (Midnight)
            -- Lightforged
            76336,  -- Lightforged Draenei Male
            -- Female shaman alternatives
            36894,  -- Elementalist Janai (Earthen Ring)
            106212, -- Earthcaller Yevaa (Earthen Ring)
        },
    },
    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,
        },
        models = {
            -- Classic squirrel (squirrel2.m2)
            64016, 26532, 42334, 42744, 90842, 65590,
            -- Ardenweald (squirrelardenweald.m2)
            98457, 98458, 98459, 98460,
        },
    },
    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 },
        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,
        },
        models = {
            -- Named Gazlowe
            20016,  -- Trade Prince Gazlowe (default)
            90805,  -- Trade Prince Gazlowe (BfA/SL)
            81449,  -- Gazlowe (Dazar'alor)
            138836, -- Monte Gazlowe (Harandar, Midnight)
            -- Other named goblins
            75730,  -- Jastor Gallywix (top hat, trade prince)
            30098,  -- Hobart Grapplehammer (engineer goggles)
            120388, -- Marin Noggenfogger (Steamwheedle trade prince)
            122751, -- Sprocketmonger Lockenstock (Undermine raid)
            82611,  -- Mogul Razdunk (MOTHERLODE boss)
            -- Generic archetypes
            109660, -- Goblin Engineer (Valdrakken, DF)
            109662, -- Goblin Engineer variant
            125523, -- Goblin Laborer (Undermine)
            125954, -- Goblin Bruiser (Undermine)
            37716,  -- Goblin Civilian (Undermine)
            -- Old model (low poly): 7052
        },
    },
    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
        quoteDBKey = "dash",
        -- Probed from displayID 43031 (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, 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
        quoteDBKey = "vexia",
        -- Probed from displayID 4162 (2026-04-05)
        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,
            SpellCastOmni=53, BattleRoar=54,
        },
        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,
        },
        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,
        },
        models = {
            -- Old parrot.m2 omitted (bad models): 20995, 41295, 5505, 36006, 45321, 20998, 36150, 36153, 36148, 9554, 6189
            -- Giant parrot (giantparrot.m2)
            80412, 80413, 80414, 124174, 82338,
        },
    },
}
