## [Unreleased]

Version 1.10.1 (2026-06-20)
--------------------------------------------------------------------------------

CHANGED:
- Updated the addon logo.

Version 1.10.0 (2026-06-19)
--------------------------------------------------------------------------------

ADDED:
- Vamoose's Companion now appears in the minimap's Addon Compartment drawer.
  Click the entry to open settings.

CHANGED:
- Dash and Vexia's quotes were reworked across every event category to sit more
  firmly in their own voices. Vexia leans flirtatious and theatrical, with the
  innuendo aimed at the situation rather than at you; Dash is the vain charmer
  who makes everything about himself, trading on charm and taste rather than
  gold.

Version 1.9.0 (2026-06-12)
--------------------------------------------------------------------------------

ADDED:
- Two new companions: Dash, The Rakish Charmer (smooth, confident, sees
  innuendo in absolutely everything) and Vexia, The Winking Temptress
  (theatrical, conspiratorial, delights in making everything sound
  scandalous). Both ship with full quote coverage -- 1,230 lines each
  across every event category the other companions react to, including
  housing endeavors, home presence, Mythic+, pet battles, gear condition,
  and the four bond-milestone quotes. Dash uses the full humanoid
  animation set; Vexia uses the sayaad rig's native set, including three
  sayaad-only poses for greetings, celebrations, and idle fidgets.
- Speech toasts now grow vertically for long quotes instead of cutting
  them off mid-sentence -- the bond-milestone quotes render in full.

FIXED:
- Hardened against Midnight "secret value" crashes in protected contexts
  (Mythic+, raid encounters, PvP, delves, and notably your own house
  interior): portrait state evaluation, mounted/swimming/flying detection,
  gold tracking, durability tracking, and auto-summon checks now all detect
  and skip secret API returns instead of erroring. Fixes the reported
  "attempt to compare local 'speed' (a secret number value)" error.
- Mythic+ completion quotes: the keystone level, duration, and on-time status
  were always 0/false (the completion event carries no data on retail) --
  they now come from the proper completion API, so level- and timing-aware
  M+ quotes fire correctly.
- Portrait animation no longer gets stuck in a neutral stand pose when a
  state change (combat, death, etc.) lands while the companion model is
  still loading; the squirrel mascot's idle animation now also applies
  reliably on slow model loads.
- Pet selector: the list is now virtualized (instant open even with 1000+
  pets), the popup no longer leaks frames on every open, and the quote
  History tab uses the same modern scrolling.
- /vc mood: swatch hex color is now rounded correctly (was one shade off).
- Vexia's portrait animations corrected from an in-game animation probe: the
  sayaad model family has its own compact animation set (the same on every
  variant from classic to modern), so she now uses it directly with her
  demon-archetype reaction mapping. The rig's spellcast pose is excluded --
  it's a half-animation that froze her mid-gesture. Dash's full humanoid
  set was confirmed correct by the same probe.
- Dash and Vexia's speech-toast models now render at the same size as the
  other companions (they were missing camera tuning and showed at 2x).
- Settings: the per-companion TTS and sound icons in the sidebar now update
  immediately when the global TTS toggle changes; the Pepe and Language
  tabs no longer show stale values after settings change elsewhere; and
  /vc reset now refreshes an open settings panel instead of showing
  pre-reset values.
- Settings: Pet Summon and the three gear-condition events (wearing down /
  broken / repaired) now have checkboxes on the Events tab -- they were
  always on with no way to disable them.
- Settings: clicking gaps inside the pet selector popup no longer dismisses
  it, and the summoned-pet pin at the top of the list no longer flickers
  while typing in the search box.
- Settings: long companion descriptions no longer overlap the bond bar on
  the companion page.
- Auto-summon: linking a different pet while mounted or flying now takes
  effect after you dismount (previously the change was silently dropped),
  and disabling auto-summon via a settings reset now dismisses the pet.

Version 1.8.1 (June 2026)
--------------------------------------------------------------------------------

- Updated for WoW 12.0.7. Dropped 12.0.1 from the supported game versions.

Version 1.8.0 (2026-05-30)
--------------------------------------------------------------------------------

ADDED:
- Housing presence reactions: the companion now reacts to being in your OWN
  neighborhood, on your plot, and inside your house -- a greeting when you
  arrive in each tier (a warmer "welcome home" the first time per session,
  lighter on re-entry) plus context-flavored idle chatter while you linger.
  ~650 new lines across all five shipped companions (250 Scurry; 100 each for
  Vamoose, Gazlowe, Patches, Murgle). Own-home only -- stays quiet when
  visiting a neighbor. New "Housing Presence" toggle under Settings > Events >
  Daily Life. Test in-game with /vc test home [enter_house|idle_house|...].
  House level-ups and neighborhood initiatives are unchanged (initiatives
  remain VamoosesEndeavors' domain).
- Random speaker: a "Random speaker" toggle at the top of the companion picker
  in Settings. When on, each quote is spoken by a randomly chosen character
  instead of your selected companion; the named companions dim to show they're
  overridden. Turn it off to return to your chosen companion.

FIXED:
- Frame strata: the companion model preview (in Settings) and the model browser
  now raise above other open windows on click, fixing cases where the 3D model
  rendered behind or through other UI.

CHANGED:
- Murgle's spoken-line translations are shorter so they fit the quote bubble
  without overflowing.

Version 1.7.1 (2026-04-22)
--------------------------------------------------------------------------------

FIXED:
- Secret-value taint crash in VC_ActivitySense idle timer. After today's
  Blizzard patch tightened secret-value handling, the pre-guard
  InCombatLockdown() check inside the 90s idle timer callback could itself
  come back secret-tainted, crashing before the secret-context guard ran.
  Removed the pre-guard combat check -- the instanced-combat branch of the
  secret-context guard below already covers it, and the rare case of firing
  an idle emit during world combat is harmless.
- /reload during M+, raid encounters, PvP, or instanced combat no longer
  taints ActivitySense's bootstrap pass. Wrapped the UnitIsDead/UnitIsGhost
  probe in the same secret-context guard used elsewhere in the module.

Version 1.7.0 (2026-04-20)
--------------------------------------------------------------------------------

ADDED:
- Durability awareness: companions react to gear wear via three new event
  types from a UPDATE_INVENTORY_DURABILITY collector with state-transition
  detection (fires once per crossing, debounced 0.5s). States: gear_degrading
  (min equipped piece drops below 30% and isn't broken), gear_broken (a new
  piece hits 0% durability), gear_repaired (everything returns to 100% from a
  damaged state). Five quotes per state for each companion, in-voice: Scurry
  (ALL CAPS panic), Vamoose (dry shaman), Gazlowe (profit spreadsheet),
  Patches (nautical), Murgle (deadpan nerglish).

CHANGED:
- Silenced "VC loaded" login chat message (shown only when debug mode is on)

FIXED:
- Pepe perch: self-heal when the UI is re-shown (housing editor, cinematics,
  pet battles etc hide UIParent which clears SVK overlays). Perch frame now
  reapplies the costume SVK on OnShow, so Pepe comes back automatically after
  any hide/show cycle.
- ActivitySense idle-timer: secret-value crash when dead in a raid (or M+,
  encounter, PvP). UnitIsAFK returns a "secret boolean" in those contexts;
  the boolean test at line 223 tainted the addon. Replaced with the same
  context guard VC_Portrait uses: skip the idle quote entirely in
  IsChallengeModeActive / IsEncounterInProgress / pvp|arena instance types,
  or party|raid while in combat. Outside those contexts, the AFK check runs
  normally. Per Reference/MIDNIGHT_SECRET_VALUES.md, the context guard is
  more reliable than pcall alone.

Version 1.6.0 (2026-04-16)
--------------------------------------------------------------------------------

ADDED:
- Activity Awareness: companions now react to daily-life player actions,
  not just milestones. New module VC_ActivitySense detects 13+ activities.
- Quote reactions for: eating, drinking, hearthing, flight paths, entering
  rest zones (cities/inns), rare spawn detection, and long idle (90s).
  875 new voice-specific quotes across all 5 companions.
- Portrait lighting effects (VC_AuraLighting): smooth lerp transitions
  tint the companion portrait based on player state:
  - Swimming: blue tint with desaturation
  - Low health: red pulse
  - Mounted: warm outdoor glow
  - Flying: cool sky blue
  - Dead: full greyscale (ghostly)
  - Rest zone: warm amber tavern glow
- Swimming animation split: SwimIdle when treading water, Swim when moving.
- New animation intents: EATING, HEARTHING, BORED, RELAXED, SWIMMING_MOVE
  added to all companion model groups.
- Lighting test tab in /vc models: ambient tint sliders, desaturation
  control, and preset buttons for tuning lighting effects.
- "Daily Life" event toggle group in Settings for enabling/disabling
  activity reactions (eating, drinking, hearthing, flightpath, restzone, idle).
- Rare spawn detection via VIGNETTE_MINIMAP_UPDATED with skipCooldown
  (time-sensitive, should always fire).
- State bootstrap on /reload: swimming, dead, resting, mounted, flying
  states are detected immediately on addon load.

CHANGED:
- Engine: added skipCooldown flag for time-sensitive events (rarespawn).
- Food/drink detection uses taint-safe GetPlayerAuraBySpellID with 12.x
  spell IDs (1269922, 1269918, 452389, 1269305).
- Low health detection uses 1s fast poll ticker instead of UNIT_HEALTH
  event (avoids secret number taint issues).
- Eating and drinking share a 90s refreshment cooldown to prevent
  double-fire on healer regen breaks.
- Idle quote skips if player is AFK.

--------------------------------------------------------------------------------

Version 1.5.0 (2026-04-14)
--------------------------------------------------------------------------------

ADDED:
- Companion sounds: Vamoose (Draenei female greetings), Scurry (3 squirrel
  variants with unique sounds), Gazlowe (classic + BfA goblin voice lines),
  Patches (full giant parrot sound set with wing flap). All extracted from
  WoW SoundKit DB2. Murgle's 12 murloc groups retain their existing sounds.
- Per-companion sound toggle: speaker icon in sidebar. Click to enable/disable
  sounds per companion. Defaults to off -- opt in per companion.
- Per-companion TTS toggle: TTS icon in sidebar above the speaker icon. Click
  to enable/disable text-to-speech per companion. Requires global TTS enabled.
  Defaults to off.
- TTS voice overrides per companion: Vamoose=Milena [ru-RU], Gazlowe=Grandpa
  [en-US], Murgle=Bubbles [en-US]. Other companions use the default TTS voice.
- Sound frequency gated by chattiness setting (globalCD 15-90s).
- Per-group intents system: all companions with modelGroups now have 16 explicit
  intents per group (IDLE through SLEEP + FIDGET), each mapping an animation
  slot and optional sound pool.

CHANGED:
- AnimDB behavior chains expanded with probed animations: CombatCritical, Stun,
  Attack1H, BattleRoar, Whirlwind, Talk, Work, Wave, Mount, and others added
  to humanoid, bird, and aquatic archetypes. Removed JumpStart from FALLING
  (broken 3-anim chain -- part of a start/jump/end sequence).
- Portrait sound resolver simplified: reads intents directly from modelGroups.
  No more INTENT_TO_SOUND/ANIM_TO_INTENT indirection.

FIXED:
- Achievement criteria collector used wrong API (GetAchievementInfo with a
  criteriaID instead of achievementID). Switched to CRITERIA_EARNED event
  which provides the correct achievementID.
- Legacy GetItemInfo() call in craft collector updated to C_Item.GetItemInfo().

Version 1.4.0 (2026-04-12)
--------------------------------------------------------------------------------

ADDED:
- Murgle companion: "The Devoted Tide-Watcher" — bewildered murloc who speaks
  only in nerglish with parenthetical translations. 80 hand-crafted quotes
  across 8 categories. Remaining categories auto-filled from Scurry quotes as
  pure nerglish at runtime. /vc murgle slash command for quick test output.
- Pepe perch: Decorative Pepe bird on the portrait frame. 19 costumes
  (Original through Tuskarr/Explorer/Dragon). SVK-based rendering with
  show/hide, scale, random costume, and hide-in-minimal options. Pepe tab
  in Settings with costume grid showing collected status.
- Locale: Portuguese (ptBR) translation of all 1,991 Scurry quotes. Locale
  system generalized from deDE-only to support any locale via lookup table.
- Locale review: Multi-locale review dialog with locale selector. Review rows
  now have 6 rejection reason buttons (Voice, Meaning, Phrasing, Cultural,
  Tone, Rewrite) plus green approve checkmark. Export includes reason labels.
  Filters: All, Unreviewed, Approved, Rejected.
- Model viewer: Murgle tab added with 27 curated murloc models. Card index
  numbers for curation. ID label font 9->12pt.
- NerglishGen v2: Rewrote nerglish generator with phoneme-level syllable
  assembly using the canonical m-r-g-l consonant set. Gemination,
  reduplication, 5 sentence templates, and canonical anchor words from the
  Traveler novels (~30% of output). Much greater variety than v1 corpus.
- UI: Added VC.UI:CreateSeparator() factory to Framework (theme-registered).

FIXED:
- Settings: Fixed open/close scale animation compounding — removed Scale
  animation that poisoned GetEffectiveScale() for AutoFitActor, causing
  sidebar preview models to shrink 5% on each toggle. Alpha fade retained.
- Settings: Locale review editor and export dialog now render above companion
  model cards (frame strata bumped from MEDIUM to DIALOG).
- Settings: Move Toast / Reset buttons no longer error if VC.Display is nil.
- Settings: Discord/BMaC link boxes no longer re-fire OnTextChanged from
  programmatic SetText (added userInput guard).
- Settings: Sidebar companion rows now have 1px gap to prevent border clipping
  between adjacent model card frames.

CHANGED:
- Gold quotes: Ignore gains under 10g (mob drops no longer trigger quotes).
  Base cooldown increased from 60s to 180s to reduce spam during questing.
- Murgle: Default model changed from baby murloc to colorful adult murloc
  (displayID 391). Removed invisible Azmerloth murloc (113533) from model list.
- Sidebar: Companion order is now explicit (Vamoose, Scurry, Gazlowe, Patches,
  Murgle) instead of alphabetical.
- Companion description: maxLines increased from 2 to 3 for longer text.
- /vc murgle: Now generates Scurry-length nerglish instead of oversized
  paragraphs. Picks a random Scurry quote for length calibration.
- AnimDB: Removed SwimIdle from MOUNTED behavior fallback.
- Settings: Extracted MakePage, CreateScaleSpinner, AddSep, AddDimHeader
  helpers. Removed redundant separator alpha assignments and dead locals.

Version 1.3.0 (2026-04-10)
--------------------------------------------------------------------------------

ADDED:
- Activity Muting: Mute companion in Dungeons & Delves, Raids, or PvP & Arena
  independently. Checkboxes in Display settings under "Mute In" section.
- Toast Duration: Adjustable display time for quote popups (2-15 seconds).
  Controls in Display settings. Epic/legendary quotes get +4s on top.

FIXED:
- Auto-Summon: Fixed linked pet disappearing shortly after summoning. Root cause:
  SummonPetByGUID is a toggle (same GUID = dismiss), and every SET_CONFIG dispatch
  (theme, portrait scale, toast, mute toggles) re-triggered TrySummon during the
  async animation window when GetSummonedPetGUID() returns nil — toggle-dismissing
  the pet. Fix: narrowed SET_CONFIG filter to only pet-relevant keys (autoSummon,
  activeCompanion), replaced UPDATE_SUMMONPETS_ACTION (fires on both summon AND
  dismiss, caused feedback loops) with PLAYER_MOUNT_DISPLAY_CHANGED for dismount
  recovery, added 1.5s re-entrant summon guard to prevent double-fire during the
  animation window.

CHANGED:
- Portrait: Replaced interaction state flags with duration-based oneshot model.
  Looting, crafting, interacting, and talking animations now play as brief
  reactions (3-5s) instead of looping forever until close events fire. Prevents
  permanently stuck animations from missed close events (house editor, DC at
  vendor, zone transition mid-craft). Crafting re-triggers on each item crafted.
  Separate timer track from quote animations to prevent collisions.

Version 1.2.0 (2026-04-09)
--------------------------------------------------------------------------------

ADDED:
- Toast Position: "Move Toast" mode in Display settings lets you drag the
  talking head popup to any screen position. Position persists across sessions.
  Reset button restores default TOP-CENTER placement. Preview shows accent
  border as drag affordance. Real quotes suppressed during move mode.
- Linked Battle Pet: Each companion can have a linked battle pet that
  auto-summons when that companion is selected. Section appears below the
  signature quote in the Companion tab. Pet selector popup with search and
  full collection browsing. Auto-resummon after loading screens, pet battles,
  and vehicle exits. Manual override detection (if you summon a different pet
  manually, VC won't fight it until the next companion switch).
- Auto-Summon settings: Global toggles in Display tab for auto-summon and
  auto-resummon behavior.

FIXED:
- Portrait: Fixed companion getting stuck in DISTRESSED (Cower) animation on
  flight paths. PLAYER_CONTROL_LOST fires on taxi, and the priority chain
  checked _controlLost before UnitOnTaxi, so DISTRESSED always won. Now
  checks UnitOnTaxi first so the companion shows FLYING on flight paths.
- Debug: Fixed side panel overlay not updating when animation state changes.
  UpdateDebugText was only called from manual anim cycling, not from
  SetPortraitAnimation.

================================================================================
Vamoose's Companion - Changelog
================================================================================

Version 1.1.1 (2026-04-08)
--------------------------------------------------------------------------------

FIXED:
- Portrait: Fixed crash in raids, M+, and PvP from Midnight secret boolean
  values. APIs like IsFlying, IsMounted, and UnitIsAFK return opaque values
  in protected contexts that crash on boolean test. Portrait now detects
  secret contexts and degrades to combat animation. Belt-and-suspenders
  pcall wrapper catches any cases the context guard misses.
- Collectors: Fixed UnitIsAFK boolean test leaking secret value outside pcall.
  The test is now inside the pcall closure so the error is caught properly.
- Collectors: Fixed UnitName potentially returning a secret string in instanced
  combat, causing string.find to crash on the loot message filter.

Version 1.1.0 (2026-04-07)

MODEL PIPELINE:
- Unified model loading pipeline following Blizzard's canonical pattern
  (destroy actor, fresh create, Hide -> Callback -> Load -> Show)
- Fixed model positioning bug on first load and companion/variant switching
- Fixed talking head model auto-fit (callback was being overwritten)
- Fixed portrait scale not applying to model on reload
- AutoFitActor now accounts for effective UI scale
- Portrait facing calculated upfront in opts (no post-callback overwrite)
- 5s login defer for clean ModelScene initialization

PORTRAIT FRAME STYLES:
- New Display setting: Classic / Ornate / Minimal
- Classic: Barbershop atlas frame (default)
- Ornate: Filigree portrait frame with parchment talking head and gold text
- Minimal: No frame, no bond pips, no mood wash
- Bond pips and mood bar adjust position per frame style
- Style persists across sessions

ORNATE TALKING HEAD:
- Custom toast frame at natural aspect ratio (600x255)
- Dark brown parchment text with warm shadow
- Larger model viewport with adjusted positioning
- NineSlice and drop shadow hidden in ornate/minimal modes

SETTINGS PANEL:
- Steampunk copper title texture replaces MORPHEUS font text
- Theme color swatches (VPP-style clickable chips with tooltip)
- New Info tab with Discord link, Buy Me a Coffee, and about text
- Forge-Background atlas on companion preview
- Sidebar simplified: name only (removed title, bond bar, mood)
- Sidebar preview cards: square, camera zoom for small creatures
- All fonts switched from Arial Narrow to Friz Quadrata
- Companion preview mood bar removed

THEME AWARENESS:
- 36+ new VC.Theme:Register() calls across Settings and Companion page
- New ThemeEngine skinners: DimText, AccentText, Separator
- Sidebar background, separators, labels all update on theme change
- Sidebar hover closures read scheme at call time (not build time)
- ColorblindSafe theme added (13 themes total)

QUOTE DATABASE:
- 75 rep "loss" quotes rewritten as "gain" (WoW has no rep decrease)

MODEL VARIANTS:
- Removed duplicate variants across all companions
- Removed toucan and mechanical parrot from Patches
- Patches portraitZ and toast scale tuned

Version 1.0.0 (2026-04-07)
--------------------------------------------------------------------------------

First public release.

COMPANIONS:
- 4 companions: Vamoose, Scurry, Gazlowe, Patches
- Each with a unique personality, chat color, theme accent, and 3D model
- Multiple model variants per companion with a browsable Model Viewer

REACTIVE QUOTE ENGINE:
- 30+ event types: boss kills, achievements, deaths, quests, gold, zones,
  level ups, housing milestones, M+ completions, pet battles, crafting,
  fishing, transmog, reputation, scenarios, and more
- 4-tier quote quality (common / uncommon / rare / epic / legendary)
- Weighted random selection with history deduplication
- Priority scoring and per-category cooldowns to prevent spam
- 4 chattiness levels (Minimal / Relaxed / Chatty / Maximum)
- Per-event-type toggles across 5 groups

TALKING HEAD DISPLAY:
- Cinematic popup with 3D companion model and typewriter text reveal
- Quality-tier visual effects (colored borders, sheen on epic/legendary)
- Click to dismiss or auto-hide after configurable duration
- Chat mode available as alternative (or both simultaneously)

ANIMATED PORTRAIT:
- Draggable portrait frame with live 3D companion model
- Context-aware animations: idle, walking, running, mounted, flying,
  swimming, combat, fishing, sleeping, AFK, and more
- Auto-facing toward screen center
- Bonding pips and mood ring on portrait border
- Scalable from 60% to 160%

BONDING SYSTEM:
- Rapport builds through gameplay (quests, boss kills, achievements, logins)
- 5 bond levels: Stranger, Acquaintance, Companion, Trusted, Soulbound
- Login streaks build rapport; absences apply gentle penalty
- Bond level-ups trigger special companion-specific quotes

MOOD TRACKING:
- Session mood influenced by gameplay (achievements boost, deaths lower)
- Visualized as color wash on portrait border

PORTRAIT FRAME STYLES:
- Classic: Barbershop atlas frame (default)
- Ornate: Filigree portrait frame with parchment talking head and gold text
- Minimal: No frame, no bond pips, no mood wash -- just the model
- Style applies to both portrait and talking head

SETTINGS PANEL:
- 4-tab layout: Companion, Display, Events, History
- Portrait Frame selector (Classic / Ornate / Minimal)
- Model variant browser with clickable grid
- Quote history with quality indicators and replay button
- Slipstream Dark theme

SLASH COMMANDS:
- /vc -- Show help
- /vc companion <name> -- Switch companion
- /vc mute / unmute -- Toggle muting
- /vc test [category] -- Fire test quote
- /vc status -- Show companion status

================================================================================
