VoidstormGamba

Your gold, your luck — challenge players to high-stakes rolls across unique game modes

File Details

v1.1.0

  • R
  • Mar 2, 2026
  • 6.38 MB
  • 11
  • 12.0.1
  • Retail

File Name

VoidstormGamba-v1.1.0.zip

Supported Versions

  • 12.0.1

VoidstormGamba

v1.1.0 (2026-03-02)

Full Changelog

  • fix: GAME_RESULTS handler signatures in Social modules, nil guard in MirrorUpdateTurn
    ChallengeSystem, GuildLeague, and SpectatorMode all used (event, data)
    instead of (results, game) for GAME_RESULTS handlers, making them
    silently non-functional. SpectatorMode also listened for a non-existent
    GAME_STATE_UPDATE event instead of GAME_STATE_CHANGED.
    Added nil guard on game.deathroll in MirrorUpdateTurn for robustness.
  • feat: cross-realm support, whisper fallback, UI fixes, stats top-10
    Cross-realm:
    • Class color communication via addon messages
    • Class cache fallback in PlayerRow, CelebrationPopup, WinnerOverlay
    • Self-class detection via UnitClass("player") for host
      Whisper fallback:
    • Non-party players receive addon messages via whisper
    • Suppress SendChatMessage to PARTY/RAID when not in group
    • Guard in GameEngine, PokerComm, Tournament
      UI:
    • Invite button sends on click (not just Enter)
    • Player-Realm placeholder in invite input
    • Help menu info buttons with detailed section popups
    • Feed hidden by default, stray character fix, scrollbar cleanup
    • Simple mode host roll/leave button overlap fix
    • Stats tab record cards open top-10 leaderboard detail view
      Fixes:
    • SHA256 bit.ror fallback for all WoW versions
    • Lua function ordering fix in Comm.lua (NeedsWhisperFallback)
    • Side bets, history tab, mode-specific fixes
  • feat: add economy, social, and spectator modules
    Integrates bet limits, audit logging, anti-cheat detection,
    guild leagues, 1v1 challenges, spectator mode, and their UI
    panels. Adds OnComm callback system for module comm routing.
  • fix: prevent blank Active Game tab after game creation
    • Wrap Build() in pcall so errors surface in chat instead of being
      silently swallowed by WoW's C_Timer error handler
    • Manage feedPanel visibility in UpdateState (show only when a game
      is active)
    • Add delayed UpdateState calls after tab transitions and game
      creation to handle crossfade animation timing
      Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • feat: unlock Settings tab during games, lock Create Game instead
    • Settings tab is no longer disabled during active games/tournaments
    • Create Game tab is now disabled instead (prevents creating while
      game is in progress)
    • Active Game tab label turns gold when a game is ongoing, resets
      to white on session end (in addition to existing status dots)
      Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • feat: add event feed to ActiveGameTab (host window)
    Adds an always-visible collapsible event feed panel at the bottom of
    the host's advanced game window, matching the compact window's feed.
    Shows join/leave, rolls (with deathroll max), eliminations, and game
    results. Buttons re-anchor to feedPanel:TOP so they move when the
    feed expands. Feed persists after session end, clears on new game.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • fix: keep event feed visible after session ends, clear on new game
    Moved ClearFeed() from SESSION_END to GAME_CREATED so players can
    review roll results and outcomes after a game finishes. Feed is
    cleared when the next game is created instead.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • fix: prevent duplicate ROLL_RECORDED on mirrors and anchor buttons above feed panel
    1. GameEngine.MirrorRecordRoll now guards against already-rolled players,
      preventing a second ROLL_RECORDED fire when both CHAT_MSG_SYSTEM and
      ROLL_UPDATE arrive for the same roll.
    2. CompactGameWindow: re-anchor rollBtn, joinBtn, leaveBtn, historyBtn
      to feedPanel:TOP instead of fixed offsets from frame bottom. Buttons
      now automatically move up when feed panel expands, preventing overlap.
      Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • fix: guard nil mode stats fields and add missing modes to StatsTab popup
    ShowPlayerPopup crashed on goldWon/goldLost/wins/losses being nil for
    mode entries that exist with games > 0. Added nil guards with fallback
    to 0. Also added Blackjack and Double or Nothing to per-mode breakdown.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • fix: remove Bindings.xml from .toc to prevent double-load warning
    WoW auto-loads Bindings.xml from addon directories. Listing it in
    the .toc caused a second parse as regular UI XML, where the <Binding>
    element's 'name' attribute is unrecognized.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • fix: use shared animation helpers and correct keybind roll range
    • Replace inline resultBox._fadeIn and resultMedallion._popAnim with
      Anim.CreateFadeIn and Anim.CreateMedallionPop in both ActiveGameTab
      and CompactGameWindow
    • Fix Keybinds.lua to use Engine.GetExpectedRollRange() instead of
      non-existent g.rollMin/g.rollMax fields
      Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • fix: hoist countdownThump to file scope for event handler access
    The variable was declared local inside Build() but referenced from
    a file-level COUNTDOWN_TICK event handler, causing the countdown
    pulse animation to silently never fire.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • fix: cache crossfade AnimationGroups and reorder .toc for EmoteData
    • Fix animation group leak in SwitchTab by caching fadeOut/fadeIn
      AnimationGroups on the frame instead of creating new ones each call
    • Move EmoteData.lua before EmoteSystem.lua in .toc to eliminate
      fragile load-order dependency
    • Include user's SettingsTab changes (remove unused Row Density
      dropdown, add Tab Crossfade checkbox)
      Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • fix: add Tab Crossfade checkbox and remove unused Row Density dropdown
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • feat: add semantic color-coded status dots to tab strip
    Extend CreateTab with SetDotColor for dynamic dot colors. Add
    GAME_STATE_CHANGED and TOURNAMENT_STATE_CHANGED handlers that show
    gold dots when it's your turn, green for active games, cyan for
    tournament states.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • feat: always-visible event feed in compact game window
    Move feed panel inside the frame as a 60px bottom section (expandable
    to 150px). Remove old title bar toggle. Persist expand state.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • feat: always-visible event feed in compact game window
    Move the event feed panel from a hidden overlay below the frame to an
    always-visible section at the bottom inside the frame. Increase frame
    height from 300 to 360 to accommodate the feed. Add expand/collapse
    toggle (60px collapsed, 150px expanded) with persistent state. Remove
    the old feed toggle button from the title bar and the feedVisible guard.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • feat: auto-register widget frames for theme hot-swap
    Add Theme.Register calls to CreatePanel, CreateInnerPanel, CreateButton,
    CreateEditBox, and CreateDropdown so Theme.Apply() re-applies colors
    instantly without ReloadUI.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • feat: adaptive player row density (normal/compact/auto)
    Add PlayerRow.GetDensityConfig() for adaptive row sizing and
    a Row Density dropdown in the Display settings section.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • feat: theme hot-swap without ReloadUI via Theme.Set and Theme.Apply
    Add frame registry (Theme.Register), Theme.Apply for propagating theme
    changes to registered frames, and Theme.Set for switching themes
    in-place. Replace the "Reload UI" button in SettingsTab with a direct
    call to Theme.Set so theme changes take effect immediately.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • feat: add collapsible sections to Settings tab
    Add Layout.CollapsibleSection widget and integrate it into SettingsTab.
    Each settings section (Gameplay, Payments, Chat, Display, Data & Debug,
    Sound) now has a clickable header that toggles section visibility.
    Collapse state is persisted in VSG.db.settings.collapsedSections.
    Key fixes over the prior incomplete attempt:
    • VStack parented to sec (not body) so Row children hide correctly
    • HintLbl now parents font strings to the row frame, not content
    • SetCollapsed call fixed (was passing nil as value)
    • Sections default to expanded
      Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • refactor: remove animation backward-compat comment from Widgets.lua
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • refactor: convert remaining SettingsTab sections to use MakeSection helper
    Convert DISPLAY, DATA & DEBUG, and SOUND sections to use the
    MakeSection/Finalize pattern, matching GAMEPLAY, PAYMENTS, and
    CHAT & NOTIFICATIONS which were already converted.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • refactor: fix Layout.VStack gap assignments in SettingsTab
    Move gap values to the correct elements (the element that follows the
    gap, not the one that precedes it), add trailing spacer rows between
    sections, and add optional gapBefore parameter to MakeCheckbox helper.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • refactor: remove Widgets.lua backward-compat aliases, fix last consumer
    All animation consumers now use VSG.Animations directly.
    CelebrationPopup.lua was the last holdout using W.CreateSpriteAnimation.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • refactor: use Layout.VStack in SettingsTab for section-based layout
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • refactor: use Layout.VStack in CreateGameTab for dynamic positioning
    Replace manual y-cursor tracking with VStack layout manager. Each
    logical row is wrapped in a container frame added to the stack.
    ApplyModeSelection calls stack:Recalculate() so the action area
    repositions automatically when the poker options panel shows/hides.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • refactor: rewrite CompactGameWindow to use shared PlayerRow, EmoteSystem, Animations, GuidePanel
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • refactor: rewrite ActiveGameTab to use shared PlayerRow, EmoteSystem, Animations, GuidePanel
    Replace ~540 lines of inline code with calls to the shared modules
    extracted in Phase 1:
    • PlayerRow pool replaces local GetRow, FindRowByName, SetActiveGlow,
      ClearActiveGlow, GetClassColor, GetWinStreak, ShowPlayerTooltip
    • EmoteSystem replaces inline emote picker, bubble pool, and cooldown
    • GuidePanel replaces inline guide panel construction and ShowGuide
    • Animations module replaces W.AttachWinGlow, W.AttachLoseFlash,
      W.ShakeFrame, W.CreateSpriteAnimation, and local AnimateRollReveal
      All host-specific logic (kick/select/lobby mode, lottery %, autoContinue,
      invite, result box, session history) is preserved unchanged.
      Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • feat: extract guide panel into shared UI/GuidePanel.lua
    Shared button, panel, and show logic for both ActiveGameTab and
    CompactGameWindow guide overlays.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • feat: extract player row management into shared UI/PlayerRow.lua
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • feat: extract emote system into shared UI/EmoteSystem.lua
    Factory-pattern module supporting multiple independent instances
    (one per window). Each instance owns its own picker grid, bubble
    pool, button, and cooldown state.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • Add UI/Layout.lua with VStack and HStack layout helpers
    Introduces vertical and horizontal layout containers that replace
    manual y-cursor positioning (y = y - CTL_H - ROW_GAP) used throughout
    the UI code. Both containers skip hidden children, support per-item
    gap/size overrides, and honour a _forceLayout flag.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • Extract animation helpers from Widgets.lua into new UI/Animations.lua module
    Move 6 animation functions (AttachPulse, ShakeFrame, AttachWinGlow,
    AttachLoseFlash, CreateActionBubble, CreateSpriteAnimation) from
    Widgets.lua into a dedicated Animations module (VSG.Animations).
    Add 4 new shared animation factories extracted from inline code in
    ActiveGameTab.lua and CompactGameWindow.lua: AnimateRollReveal,
    CreateRollFlash, CreateFadeIn, and CreateMedallionPop.
    Backward-compat aliases in Widgets.lua ensure existing callers
    (W.AttachPulse, etc.) continue to work without changes.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • Add Blackjack and Double or Nothing modes, bounty UI, side bet display, and settings reorganization
    New modes: Blackjack (hit/stand/bust mechanics) and Double or Nothing (risk-reward
    escalation). UI: bounty % dropdown for Elimination mode, lottery ticket win-chance
    percentages in player rows, spectator label shows side bet count and details in tooltip,
    preset dropdown simplified (removed color dots, ASCII arrows). Settings tab fully
    reorganized with Gameplay section first, streamlined Visual/Chat sections. Achievement
    unlock sound added to all sound packs.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • Add security hardening, bounty system, side bets, SHA256 signing, and tournament draw handling
    Security: reject ROLL_FWD forgeries, validate TOURNAMENT_JOIN/CANCEL senders, require
    pending invite for GAME_INVITE_ACCEPT with 120s expiry, prevent duplicate OE picks.
    Engine: elimination bounty system (configurable % of buy-in to eliminator with ledger
    tracking), Blackjack/DoubleOrNothing mode constants, nil guard on results.summary.
    Infrastructure: SHA256 HMAC signing (replaces djb2), SideBets module, Poker DC detection
    via FindUnitForName. Tournament: draw rematches up to 3x with coin-flip tiebreaker.
    Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
  • Fix locale-dependent trade detection, ForceEnd return value bug, number formatting, and nil guard
  • Add achievements system, data backup/restore, streak badges, and big win celebration
    • Add 24 achievements with toast notifications and stats tab display
    • Add full data backup (JSON export) and restore (JSON import) in settings
    • Add streak badges (3W/3L) to compact game window player rows
    • Add big win celebration popup for wins >= 5,000g
    • Add BIG_WIN sound event to all sound packs
  • Add slash commands, preset management, history filters, and whisper invites
    • Expand /vsg slash commands: start, begin, stop, stats, mute, preset, presets, invite, history, refresh, debug, reset, help
    • Improve preset UI: reorder, rename, mode-colored dots, 20 max
    • Add minimap right-click preset quick-launch menu
    • Add date range filter to history tab (Today/This Week/This Month)
    • Add whisper-based game invite system with accept/decline popup
    • Add invite button to active game tab for hosts
  • new: changes to poker