Super Swing Timer

Super Swing Timer tracks white-hit swing timers across main hand, off hand, and ranged attacks. It is tuned for Classic/TBC mechanics such as next-melee-attack abilities, dual-wield desync, parry haste, extra-attack suppression, haste rescaling, and more

File Details

SuperSwingTimer v0.1.7

  • R
  • Jul 6, 2026
  • 188.78 KB
  • 190
  • 2.5.5+1
  • Classic + 1

File Name

SuperSwingTimer v0.1.7.zip

Supported Versions

  • 2.5.5
  • 1.15.8

v0.1.7 - 2026-07-05

  • WoWUnit test suite added: 9 test groups, 34 in-game unit tests via WoWUnit addon (## OptionalDeps: WoWUnit). Tests cover constants integrity, aura parsing (both Classic + TBC API shapes), GetDebuffStackOffset math, Hunter Serpent Sting detection (by name + ID, caster filtering), MigrateDB chain (v1→v54), dispatch nil-guards, helpful aura parsing, and Flurry buff info — all runnable in-game with pass/fail UI. Internal functions exported on ns._Test only when WoWUnit is present — zero overhead otherwise.

  • Expanded to 18 groups, 73 tests: Added CLEU event simulation (SWING_DAMAGE MH/OH/enemy, SWING_MISSED, DODGE path), timer state machine validation, cross-class debuff detection (Deep Wounds, Flame Shock, Mangle, Rupture, Seal of Vengeance, Sunder Armor), hunter cast spell detection, nil-stress tests, config toggle safety, Paladin seal family lookup, and buff icon tracking. Tests now assert duration, caster, and spellId values — not just existence.

  • GetHarmfulAuraData API shape detection fixed: The variable mapping was off-by-one for Classic 1.15.x+ / TBC Anniversary 2.5.5 UnitAura which added an icon texture field at position 3. All 24 callers across all classes were silently returning the wrong caster value (a number instead of "player"), breaking every caster == "player" debuff filter. Fixed with explicit shape detection (type(pos3) == "string" → icon present).

  • GetDebuffStackOffset sign inversion fixed: Was tracking maxBarTop (bars below reference bar), should track minBarTop (bars above reference bar). Caused buff icons to overlap debuff duration bars by ~6px. Also added visibility-bitmask cache to prevent one-frame bounce from WoW's deferred SetPoint layout.

  • Buff icon border fixed: Was a full-face black (0, 0, 0, 0.65) overlay covering the entire icon, causing permanent dimming. Replaced with 4 separate 1px edge strips (top/bottom/left/right) matching the existing debuff bar glow border pattern.

  • Buff icon duration text moved above icon: Changed from SetPoint("TOP", icon, "TOP", 0, -1) (overlapping icon top) to SetPoint("BOTTOM", icon, "TOP", 0, 2) (sits above icon with 2px gap).

  • Buff icon gap increased: From 6px to 8px above highest debuff bar and above anchor bar.

  • Concussion Shot color: Changed from dark blue (0.10, 0.15, 0.60) to grey (0.55, 0.55, 0.55) for better visibility.

  • Serpent Sting color: Brightened from forest green (0.05, 0.55, 0.20) to bright serpent green (0.10, 0.85, 0.15).

  • Tests now deferred to PLAYER_ENTERING_WORLD: Test registration waits until all addons (including WoWUnit) are loaded, avoiding load-order race conditions. Added /ssttest slash command for manual trigger. Chat-confirmed on registration.

  • Show Advanced toggle (Phase 6): New "Show Advanced" toggle at top of panel (right side, below Minimal Mode) with descriptive label. When enabled, reveals fine-tuning controls across all sections: texture layer selectors (MH/OH, Spark, Weave, Spell Icon), spark dimensions and alpha, Indicator Glow Mode, bar background/border settings, and weave spark dimensions/alpha. Controlled by SuperSwingTimerDB.showAdvanced (defaults false). Each advanced row tagged with isAdvanced = true — hidden automatically when toggle is off. Migration fill-in added for existing users.

  • Per-section Reset buttons (Phase 4): Each collapsible section header (Appearance, Shaman Weave Assist, Combat & Timer Behavior, Shaman Weave Spells) now has a small red "Reset" button on the right side. Clicking resets only that section's DB keys to defaults and updates all controls (sliders, texture rows, color swatches) without affecting other sections. Reset button has hover highlighting and an OnMouseDown handler that prevents the click from also toggling section collapse. Reset callbacks defined after all controls exist for safe variable access.

  • Texture preview chips (Phase 7): Browser-mode texture path rows (Spark Texture, Cast Breakpoint Spark Texture) now show a small 24×16 inline thumbnail preview of the current texture, bordered with a subtle UI-Tooltip-Border edge frame. The preview chip updates live when the texture changes. PathBox width adjusted by 20px to accommodate the chip and its border.

  • Keyboard navigation audit (Phase 9): Section headers now register OnKeyDown for Enter/Space to toggle collapse. Quick Controls tab buttons also handle Enter/Space for keyboard activation. All other controls (checkboxes via UICheckButtonTemplate, sliders via OptionsSliderTemplate, buttons via UIPanelButtonTemplate, edit boxes via InputBoxTemplate) already handle keyboard input natively through their Blizzard widget templates.

  • setResetCallback helper: New method on section headers allows deferred assignment of reset callbacks after all controls are created. Reset buttons are created eagerly in CreateSectionHeader with an OnMouseDown consumer to prevent collapse-toggle propagation.

  • Minimal Mode moved to top area: The "Minimal Mode" toggle was moved from the Combat & Timer Behavior section to the top of the panel, right below the Global Scale slider. It sits on the right side with a descriptive label on the left explaining what it does ("Hide non-essential overlays for a cleaner combat view"). The rest of the panel sections shift down to accommodate it.

  • Tabbed Quick Controls: The Quick Controls section now has 3 tabs: Visibility (toggles only, single column), Colors (swatches only, 2-column grid), and Class (combined view for class-specific settings). Tab buttons with gold active state sit below the section header. Switching tabs preserves scroll position and collapses/expands correctly with the section header.

  • Search bar added: New "Search settings..." EditBox at the bottom of the /sst panel (always visible below the scroll frame). Filters all section rows in real-time — matching rows stay at full opacity, non-matching rows dim to 25% alpha. Press Escape to clear. Every toggle, slider, color swatch, dropdown, texture row, action button, and description text is searchable. Case-insensitive, matches any portion of the label.

  • Global Scale slider added: Master scale control (0.5x–3.0x) at the very top of /sst panel. Proportionally scales all bars, icons, sparks, borders, and fonts relative to their base (default) size. Individual sliders still fine-tune each dimension; the global scale multiplier applies on top. Gold label with descriptive subtitle. Implemented across 4 files with fresh-install, migration, reset-defaults, and panel-refresh wiring.

  • OnUpdate hook infrastructure created: Replaced the fragile 9-link chain-overwriting pattern with ns.RegisterOnUpdateHook() via new SuperSwingTimer_Hooks.lua. All 9 ClassMods chains converted to hooks — Paladin (3), Warrior (1), Shaman (1), Druid (2), Hunter (1), Rogue (1). Core render path registered as hook #1 via CoreRenderHook. Test Bars hook inserts at position 1 for pre-render priority. The Duplicate field OnUpdate errors are eliminated. Each hook is now independent — a failure in one cannot break others.

  • Config panel UX improvements — Phase 1+2: Section help texts added to all collapsible sections (Appearance, Shaman Weave Assist, Combat & Timer Behavior, Weave Families) with descriptive subtitles. CreateSlider/CreateCompactSlider now accept custom tooltipText. CreateCycleRow now accepts custom tooltip text. 20+ sliders and cycle rows got descriptive tooltips (Bar Width, Bar Height, Cast Spark Width/Height, Spark Alpha/Width/Height, Bar Border Size, Background Alpha, Indicator Glow Mode, and all class-specific size sliders). CreateHelpButton function added for future [?] help buttons on complex concepts. Quick Controls column labels updated from "Visibility"/"Key Colors" to "Visibility (show/hide bars)"/"Colors (bar/swatch tint)".

  • Color swatch labels in Quick Controls: Swatch buttons now display text labels directly on the colored surface (e.g. "MH Color") with OUTLINE font. Labels auto-invert for readability.

  • Enterprise UX blueprint: Full redesign documented in AUDIT.md with 9 implementation phases based on research of WeakAuras, Details!, Plater, and Blizzard Interface Options patterns. Covers search bar, tabbed Quick Controls, section help text, per-section reset, progressive disclosure, texture previews, profile system, and keyboard navigation.

  • Config panel walkthrough in README: Added annotated ASCII layout diagram and section-by-section guide.

  • LDoc docstrings added: 20+ core public functions now documented with --- @param / --- @return / @usage / @see across Constants.lua, State.lua, Weaving.lua, UI.lua, Config.lua, ClassMods.lua, and Hooks.lua. Critical engine functions (ns.GetAlignedTime, ns.GetSpellInfo, ns.HandleCLEU, ns.StartSwing, ns.ApplyParryHaste, etc.) now have full enterprise-grade documentation.

  • Hunter bar globals fixed: 8 hunter trap/debuff bar globals (serpentStingBar through frostTrapBar) added to .luarc.json diagnostics globals. These are closure-local upvalues in SetupHunter() that the linter cannot trace through nested closures — same approach the old .luacheckrc used. get_errors will clear after window reload.

  • Deep quality audit completed: AUDIT.md created with 10-section scoring (overall 7.2/10), competitive analysis, file metrics, and checkbox-based roadmap to 10/10 covering critical fixes, UX overhaul, testing infrastructure, file splitting, and enterprise-grade documentation.

  • Codebase conventions established: Phase 7 enterprise-grade Lua docstring standard defined in AGENTS.md and AUDIT.md — all new code and refactored files must use --- @param / --- @return LDoc-style comments. Module-level headers required for each file describing role and dependency order.

  • Roadmap made actionable: AUDIT.md roadmap converted to checkbox format with 7 phases. Phase 1 items (OnUpdate chain fix, Hunter globals) marked <input disabled="disabled" type="checkbox" checked="checked" />. Phase 2 item A (Global Scale) marked <input disabled="disabled" type="checkbox" checked="checked" />.

  • GetCurrentTime() shims removed: 5 identical GetCurrentTime() shims across all files replaced with direct ns.GetAlignedTime(). Eliminates duplicated clock-domain wrappers. GetTime/GetTimePreciseSec rawgets removed from files where they were only used by the shim.

  • Fresh-install block replaced with DeepCopyDefaults: 155-line inline table literal replaced with DeepCopyDefaults(ns.DB_DEFAULTS). Eliminates drift risk — adding a new default to Constants.lua now automatically applies to fresh installs.

  • Font path constant: ns.FONT_PATH = "Fonts\\FRIZQT__.TTF" defined in Constants.lua. 39 hardcoded FRIZQT paths replaced in ClassMods.lua.

  • Config panel UX improvements: Comprehensive help blurb, section headers renamed ("General Behavior" → "Combat & Timer Behavior", "Weave Families" → "Shaman Weave Spells"), 7 missing tooltips added to Quick Toggles.

  • LDoc docstrings added: 6 core public functions (ns.StartSwing, ns.HandleCLEU, ns.RefreshLatencyCache, ns.ApplyBarSize, ns.ApplyVisibility, ns.InitBars).

  • CI pipeline: .github/workflows/luac.yml — auto-runs luac -p on push/PR.

  • QA checklist: docs/QA.md — step-by-step manual smoke-test checklist.

  • Migration test harness: test_migrations.lua — 37 tests for DeepCopyDefaults correctness.

  • DB schema: v54 (unchanged — no migration needed for these changes)

  • Quality gates: luac -p passes on all 9 files