File Details
v1.1.0
- R
- Jun 5, 2026
- 374.48 KB
- 16
- 11.1.0+3
- MoP Classic + 3
File Name
AldorTax-v1.1.0.zip
Supported Versions
- 11.1.0
- 5.5.0
- 2.5.5
- 1.15.8
tag a7067c2b173560826ff323d99ac5d1fd44a59651 v1.1.0
Author: Magnus Vikan <dizzi90@gmail.com>
Date: Sat Jun 6 01:56:41 2026 +0200
v1.1.0 - Step 5b: single-form lifts cut over to the LiftBar widget
commit 6bd43ea1218d7179c8a795678c46a857abb917a1
Author: Magnus Vikan <dizzi90@gmail.com>
Date: Sat Jun 6 01:56:22 2026 +0200
Step 5b cutover: route single-form lifts to the LiftBar widget (v1.1.0)
Single-form lifts (Aldor, Stormspire, SSC) now render on the new LiftBar
widget instead of the legacy monolithic syncUI; dual (TB/Great Lift) and
horizontal (Deeprun Tram) stay on legacy for now. Gated behind
USE_NEW_LIFTBAR so the whole cutover reverts with one flag.
- SurfaceFor(liftID): normalized adapter (LiftBar or legacy syncUI) so the
visibility state machine is written once against either; bridges the
SetCompact/SetMode and ReconfigureLift/ReconfigureTransport naming and
replicates legacy SetCompact idempotent re-layout via liftBarMode.
- UpdateSyncUIVisibility hides both surfaces on lift change so a
single-to-dual crossing cannot leave two bars on screen.
- Cursor tick, warnFrame coupling, zone-leave and SSC hide-after-entry
all updated to drive LiftBar for single lifts.
- LiftBar.Init wired at PLAYER_LOGIN; UpdateCursor guards against the
pre-Init OnUpdate window.
- Tests: mock fires PLAYER_LOGIN to match in-game ordering; SSC UI tests
assert against AldorTaxLiftBar; Test 16 force-builds legacy syncUI.
- Add Icon.blp (referenced by TOC IconTexture).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
commit a15ac3abf73d585ff6dd3778337416cc37b18f16
Author: Magnus Vikan <dizzi90@gmail.com>
Date: Sat Jun 6 01:56:20 2026 +0200
WidgetRouter: rename transport "kind" to "form"; add TransportForm(def)
"Form" is the addon-neutral word for rendering geometry (single/dual/
horizontal), decoupled from any transport name. Adds TransportForm(def)
so callers compose (def -> form) then (form, proximity -> widget).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
commit 546e2c0f438a909cc936f9adc5cab4fa14013720
Author: Magnus Vikan <dizzi90@gmail.com>
Date: Wed Jun 3 00:26:14 2026 +0200
Step 5b-2: build DualLiftBar widget (single-clock model)
Standalone vertical two-cursor widget for dual-platform lifts (Great Lift,
TB Lift), faithful replica of the monolith's MakeVBar/LayoutDual rendering.
Loads but not yet wired into the cutover — nothing calls .Show() yet.
- TransportCycle: salvage LiftHeight (ex-GetLiftHeight) and SecondaryDef
(ex-SecDef) as pure functions; DualLiftBar delegates to them.
- Single-clock model (Magnus's call): both cursors driven by one lastSync
via SecondaryPhase offset; no lastSync2. Secondary-bar clicks calibrate
the shared clock through ResolveClick.
- ResolveClick: pure 4-quartile click resolution (TOP/FALL/RISE/BOTTOM),
fixing a wow-addon-ui-designer review finding (draft only had 2 zones).
- Tests: LiftHeight/SecondaryDef in test_transport_cycle;
SecondaryPhase/ResolveClick in test_widget_data_access. Suite green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
commit 13a767c5e0c58f622240f1370cf7ff84d1480fc8
Author: Magnus Vikan <dizzi90@gmail.com>
Date: Thu May 28 23:42:17 2026 +0200
Step 5b-1: track widget drafts, migrate to NS.LIFTS data model
The LiftBar / LightCountdown / TramUI drafts referenced a def.segments
shape that doesn't exist in the live data — defs live in NS.LIFTS with
flat fields (fallTime, waitAtBottom, ...) + segColors. Migrate all three
to read via TransportCycle helpers and def.segColors, drop the duplicate
LiftBar.SegmentLayout, fix def.dualPlatform -> def.dualLift, expose
TramUI.TramCarPos / TramCarDir on the module table for testing.
TOC loads the three widgets after AldorTax.lua. They are tracked but
unused — nothing calls .Show() yet. The SecDef + FallUI_* cutover lands
in a follow-up savepoint once DualLiftBar exists and the router wires up.
New test suite test_widget_data_access.lua (17 assertions) pins the pure
surface against real LIFTS defs. All 89 assertions across the 6 suites
pass.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
commit fce3ac2860537763f467a917038110c0ec6ec446
Author: Magnus Vikan <dizzi90@gmail.com>
Date: Thu May 28 23:27:59 2026 +0200
WidgetRouter: split duallift out as its own kind
Dual vertical lifts (Great Lift, TB Lift) are structurally distinct
enough from single lifts — two cursors, two stacked segment bars,
half-cycle or explicit-dualOffset relationship — that they get their
own widget (DualLiftBar) rather than being a mode of LiftBar.
Caller's def → kind mapping (no code change needed yet; documented
in WidgetRouter.lua header):
def.horizontal → 'tram'
def.dualLift → 'duallift'
otherwise → 'lift'
Dispatch table grows from 6 cells to 9; 'other' proximity still
collapses to LightCountdown for all three kinds.
136/136 passing (35 + 15 + 9 + 5 + 35 + 37).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
commit 5d33eff907a2f43ca7c5c72228f4447b48c7e368
Author: Magnus Vikan <dizzi90@gmail.com>
Date: Wed May 27 15:42:51 2026 +0200
Step 5b prep: salvage pure-function widget math (no UI cutover yet)
Salvages the algorithms inside the working-tree drafts (LiftBar.lua,
LightCountdown.lua) without depending on them. The drafts assume a
def.segments array that doesn't exist in the current monolith;
TransportCycle is the bridge, so the salvaged functions live there
instead of in widget-specific modules.
TransportCycle.lua gains:
SecondsToNextBoundary(def, phase) → ttb to next segment start, wraps
cleanly through cycle. Same algorithm as the LightCountdown draft's
FormatCountdown body, minus the string formatting.
SegmentLayout(barWidth, def) → {{x,w}, ...} proportional pixel rects
for a bar of barWidth. Same algorithm as the LiftBar draft's
SegmentLayout — reads via SegmentDurations rather than def.segments.
WidgetRouter.lua (new, tiny) exposes:
NS.DispatchWidget(kind, proximity) → 'LiftBar' | 'LightCountdown'
| 'TramUI'. 12-cell table with sensible fallbacks for nil/unknown
inputs. Pure; no state.
Both added to AldorTax.toc *before* AldorTax.lua so sibling modules
can read them at load. AldorTax.lua itself doesn't yet consume the
new functions — Step 5b proper (replacing SecDef + FallUI_* with
LiftBar/LightCountdown/TramUI frame code) is the next session's
scope, with /reload gates between widget extractions.
tests/test_widget_math.lua adds 34 assertions covering layout
proportions, boundary wrap, and the dispatch table including
fallbacks for unknown kinds. Old draft test_phase5_ui.lua (which
asserted against the never-built def.segments model and a
LightCountdown.FormatCountdown signature we're not pursuing) is
removed; it was untracked so nothing is lost from history.
133/133 passing across all 6 suites (35 + 15 + 9 + 5 + 35 + 34).
In-game baseline unchanged. The working-tree drafts (LiftBar.lua,
LightCountdown.lua, TramUI.lua) remain untracked as reference
material for Step 5b's UI cutover.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
commit 52194e55a632a0721bf6171bf225709c26dc16aa
Author: Magnus Vikan <dizzi90@gmail.com>
Date: Wed May 27 15:39:55 2026 +0200
Step 5a: TransportCycle.lua + NS.LIFTS / NS.TransportCycle exposure
Prerequisite for the Step 5 widget consolidation. The Phase 5 drafts in
the working tree (LiftBar / LightCountdown / TramUI) were authored
against a 'segments[]' array model that assumed Step 2 of the
architecture plan (Transports.lua + segment-array restructure) had
landed. It hadn't — the monolith still uses flat fields fallTime /
waitAtBottom / riseTime / waitAtTop, and there is no Transports.lua.
Rather than re-do Step 2 with a structural rename (Step 1: lift →
transport) and a new data table, TransportCycle.lua bridges the legacy
flat-field model to a uniform segment view. Pure functions only:
SegmentDurations(def) → { fall, bottom, rise, top }
SegmentLabels(def) → { 'FALL','BOTTOM','RISE','TOP' } or def.phaseNames
SegmentStarts(def) → { 0, fall, fall+bottom, fall+bottom+rise }
SegmentIndexAt(def, phase) → 1..4 with same boundary semantics as
GetLiftHeight / GetPhaseColor in the monolith
Phase(def, syncTime, now) → (now - syncTime) % cycleTime
AldorTax.lua now exposes NS.LIFTS (post client-version filtering, so
greatlift removal is visible to consumers) and consumes
NS.TransportCycle. Nothing inside AldorTax.lua calls TransportCycle
yet — the bridge is built but unused. Step 5b will rewire the widget
layer (LiftBar / LightCountdown / TramUI) against it.
tests/test_transport_cycle.lua adds 33 assertions covering durations,
starts, label override, index boundaries, and phase wrap; added to
tests/run_all.lua.
99/99 passing across all 5 suites (35 + 15 + 9 + 5 + 35).
In-game baseline still f9e35e1 (v1.0.2). This commit changes no
observable behaviour — it only adds exposed surface.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
commit c371b05c99c0ac9a40cb25604b922b9d20a34150
Author: Magnus Vikan <dizzi90@gmail.com>
Date: Wed May 27 15:22:31 2026 +0200
Step 4: track extracted Wire.lua and SyncBus.lua modules
The previous commit (1a68f47) updated AldorTax.toc to load Wire.lua
and SyncBus.lua, and refactored AldorTax.lua to consume them via
NS.Wire / NS.SyncBus — but the module files themselves were still
untracked, so that commit is broken in isolation. This commit adds
them so the tree is self-consistent again.
Wire.lua — pure codec for S/D addon-message frames (encode + parse).
v6/v5/v4/v3 share one parse path; v6 is byte-identical
to v5, only flags fixed BroadcastSync srvPhase math.
SyncBus.lua — transport layer: channel selection, send, post-zone
cooldown, sender trust/blocklist, inbound dispatch via
registered onSync / onDeath / isKnownTransport handlers.
test_sync.lua already exercises Wire.EncodeSync directly through the
shared NS table loaded by test_harness.LoadAddon, so the green-bar
contract is unchanged: 64/64 still passing.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
commit 1a68f476e4c4f1fdf33af5898725b9b8d278a806
Author: Magnus Vikan <dizzi90@gmail.com>
Date: Wed May 27 15:20:37 2026 +0200
WT savepoint: SSC 70s auto-suppress + test harness for run_all
- AldorTax.lua: hideAfterEntry=70 on SSC transport def; sscEnteredAt local
+ OnUpdate timer sets sscSuppressed=true after 70s inside the SSC
subzone. Covered by test_features.lua Test 14.
- tests/run_all.lua: new entry point that runs all 4 suites as
subprocesses and exits 0/1. Used as the savepoint command:
savepoint -f lua -- lua tests/run_all.lua
- tests/wow_api_mock.lua: added wipe() (was crashing test 13).
- tests/*: assorted test updates to match the SSC suppression contract
and the run_all entry point.
64/64 passing across all suites. In-game baseline still f9e35e1
(v1.0.2); no behaviour-surface change beyond the SSC timeout.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>