## [Unreleased]

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

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