AldorTax

A method to share when the Aldor lift will leave to avoid falling to your death

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>