promotional bannermobile promotional banner

AldorTax

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

File Details

v0.9.0

  • R
  • May 3, 2026
  • 57.85 KB
  • 14
  • 11.1.0+3
  • MoP Classic + 3

File Name

AldorTax-v0.9.0.zip

Supported Versions

  • 11.1.0
  • 5.5.0
  • 2.5.5
  • 1.15.8

tag e8512d3eeaae82233eb4a09b76d4c601334c7958 v0.9.0
Author:    Magnus Vikan <dizzi90@gmail.com>
Date:    Sun May 3 20:29:40 2026 +0200

Release v0.9.0: SSC support, sync-UI hardening

SSC (Serpentshrine Cavern elevator):
- epochOffset calibrated from PTR first-sync click (n=1, ~±2s precision;
  refine with live data over time)
- Ghost-entry suppression — running back as a spirit doesn't surface the
  timer (unhelpful and visually noisy during corpse runs)
- Auto-hide 70s after live entry — players are usually mid-fight or
  positioning, not waiting for the elevator

Sync UI hardening:
- Fix bar/barBg/overlay geometry leak when transitioning dual-lift
  (TB/Great Lift/Tram) → single-lift (Aldor/SSC). The dual SetCompact
  branch never touches the local barW upvalue, so subsequent single-lift
  visits used stale compact-width geometry inside a full-width frame
- SetClampedToScreen prevents the timer frame from being dragged
  entirely off-screen with no recovery short of editing SavedVariables

Internal:
- UpdateSyncUIVisibility extracted as the single source of truth for
  show/hide/compact decisions, replacing two near-duplicate decision
  trees. Sets up Phase 3 (separate Fall/Arrival frames) cleanly.
- Test coverage: 35 passing (was 28). Adds SSC ghost/timeout paths and
  the dual→single lift transition regression.

commit e35db9793b26b86ca8c9b091302770cf02c33957
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Sun May 3 20:29:13 2026 +0200

    Release v0.9.0: SSC support, sync-UI hardening

    - SSC: epoch-anchored auto-sync (calibrated from PTR), ghost-entry
      suppression, 70s auto-hide on live entry
    - Sync UI: fix bar geometry leak on dual→single lift transition;
      SetClampedToScreen prevents the frame from being dragged off-screen
    - Refactor: visibility state machine extracted from duplicated
      ZONE_CHANGED / OnUpdate decision trees
    - Tests: 35 passing, +7 since v0.8.1 (SSC paths + lift transition)

    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit af5568ca7e1810fc2cfa2cdf6e0346391e810678
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Sun May 3 20:28:50 2026 +0200

    UI reform Phase 2: extract sync-UI visibility state machine

    The show/hide/compact decision tree was duplicated in ZONE_CHANGED and
    the OnUpdate proximity tick — 17 lines twice, with subtly different
    defensive guards in each. Extract UpdateSyncUIVisibility(liftID) as the
    single source of truth.

    The new function also tracks configuredLiftID so ReconfigureLift only
    fires when the lift actually changed, instead of every proximity tick.

    Behaviour preserved (ZONE_CHANGED still owns SSC ghost/hideAfter state
    transitions); the duplicated `if syncUI.SetCompact then` nil-guard is
    removed since BuildSyncUI always returns a configured frame. All 35
    tests still pass.

    Sets up Phase 3 (split AldorTaxSyncUI into FallUI and ArrivalUI):
    the routing decision will live in this single function.

    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 2922f1b7aff244d766f1224dd77709af33f85a14
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Sun May 3 20:27:44 2026 +0200

    Fix sync-UI bar geometry leak on lift transition; clamp frame to screen

    Two visual fixes for the BuildSyncUI frame:

    1) bar/barBg/overlay state-leak on dual→single lift transition.
       ReconfigureLift's single-lift else-branch positioned segments using
       the local barW upvalue without resetting it. The dual-lift SetCompact
       branch never touches barW, so a sequence of Aldor→compact→TB-lift→
       expand→Aldor left the outer frame at full width but the inner bar at
       compact width, with segments overflowing. The else-branch now resets
       bar/barBg/overlay geometry from isCompact before laying out segments.

    2) Frame could be dragged entirely off-screen with no recovery short of
       editing SavedVariables. SetClampedToScreen(true) prevents this.

    Test 16 walks the failing transition sequence and asserts barBg width
    recovers — verified to fail (got 284, expected 464) without the fix.

    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 2e3ca26b1a7986edcbf9e40c713d3c780ce25577
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Sun May 3 20:26:39 2026 +0200

    Calibrate SSC epochOffset from PTR first-sync click

    n=1 BOTTOM-segment click on Classic Era PTR (2026-05-02) yields
    epochOffset = 13.265s on the 43.333s cycle. Inherent precision is
    ~±2s from GetServerTime() integer-second floor; the addon's own
    RecordTimingSample value is used (computed in the same coordinate
    system as runtime ApplyEpochAnchor, so internally consistent).

    The TransportAnimation epoch is data-driven (DB2 file 183407), so
    the value should transfer from PTR to live within click-noise. Refine
    with multi-click circular-mean once live data is available.

    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 9f5c585377dff4ab9cea67ad2930c98b90553788
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Sun May 3 20:26:10 2026 +0200

    SSC UI: suppress on ghost entry, auto-hide after 70s on live entry

    Two pre-launch quality fixes for the new SSC overlay:
    - Entering SSC as a ghost (spirit healer run-back) keeps the UI hidden
      for the entire visit; players running back don't need a sync timer.
    - Live entry shows the UI for hideAfterEntry=70s, then suppresses it for
      the rest of the visit. The OnUpdate timer expiry path stays defensive
      even if a stale syncUI is shown.

    Driven by sscUIHideAt + sscSuppressed locals; flags reset on zone-out so
    the next entry starts clean. Tests 14 and 15 cover both paths.

    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 7e61b39102673635e294c5b445a9729aacacc329
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Sat May 2 14:37:55 2026 +0200

    UI reform Phase 1: rename p->syncUI and ambiguous locals in BuildSyncUI

    Prepares for Phase 2 (state machine extraction). No logic changes.

    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit 112f2b84d48f5901677592edee5e7439296cfcce
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Sat May 2 14:34:13 2026 +0200

    SSC pre-launch readiness: nil-guard audit + test coverage

    Verified single-platform code path for SSC; added 4 test cases covering
    zone activation, phase computation, sync receive, and multi-lift isolation.
    Annotated missing epochOffset in lift def.

    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

commit dd41897d8ba18ffd4d41884a5ea320c1c04e8ae8
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Thu Apr 30 16:00:23 2026 +0200

    Calibrate deepruntram timing from DB2 TransportAnimation keyframes

    TransportIDs 176080-176085 (6 carts) show cycle=143333ms, transit=58633ms,
    dwell=13033/13034ms. Previous values (cycleTime=143.0, fallTime=58.5,
    dwell=13.0) accumulated ~0.333s/cycle phase drift, equal to a full cycle
    after ~12h, which explained the apparent epochOffset divergence in the
    two recorded first-sync events (7.642 on 2026-04-20 vs 49.142 on 2026-04-23).

    On the corrected 143.333s cycle, both rows converge to epoch=84.758s
    (diff 0.885s, well within human click latency), confirming the cycle
    correction and adding a stable epochOffset for auto-prediction.

commit a82b80c30ae32325c688ec5e8877b887c3fa9e57
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Thu Apr 30 13:15:58 2026 +0200

    Fix GetPhaseColor to use def.segColors instead of hardcoded Aldor palette

    Vertical bar cursors for TB Lift, Stormspire, and Great Lift were shown
    in Aldor's red/blue/yellow/green despite each lift having its own segColors.
    GetPhaseColor accepted def but ignored def.segColors; now indexes into it.

commit 5d15c5bd699d5a080bfc4d1ac445505be05fd032
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Thu Apr 30 13:13:33 2026 +0200

    Recalibrate tblift epochOffset from syncLog first-sync observations

    Current value (25.5) produced ~13-14s first-zone-entry errors on a 30s cycle.
    First-sync observed epoch offsets at the "South arrives" label across two
    consecutive sessions are 13.5 (2026-04-22) and 11.6 (2026-04-23, 76 min
    later). Their circular mean (~12.54) replaces the prior estimate that was
    calibrated from insufficient samples. Within-session corrections after this
    anchor remain bounded.

    Cycle structure (fall 9.5 + waitBottom 5.5 + rise 9.5 + waitTop 5.5 = 30.0)
    unchanged.

commit 052e4bbd2b9c99a21598feed014cc19505a0f41c
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Mon Apr 27 11:11:23 2026 +0200

    Park UI transitions test as post-Phase-4 spec

    The frames it asserts against (AldorTaxFallUI / AldorTaxArrivalUI) don't
    exist yet — they're produced by Phases 3–4 of the UI reform. Rename to
    spec_* and skip-stub so it's tracked but doesn't fail the suite. Restore
    when Phase 4 lands.

commit 052e4bbd2b9c99a21598feed014cc19505a0f41c
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Mon Apr 27 11:11:23 2026 +0200

    Park UI transitions test as post-Phase-4 spec

    The frames it asserts against (AldorTaxFallUI / AldorTaxArrivalUI) don't
    exist yet — they're produced by Phases 3–4 of the UI reform. Rename to
    spec_* and skip-stub so it's tracked but doesn't fail the suite. Restore
    when Phase 4 lands.

commit d4a81171418f13b4fcc205cee75f7d57137c2e26
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Mon Apr 27 11:10:13 2026 +0200

    Sync README/TOC supported-transport list, add test mock stubs, ignore data/

    - README + TOC: list Stormspire, TB Lift, SSC; replace "AldorTaxSync"
      mention with General/Guild (post-v0.8.0).
    - wow_api_mock: stubs for SetClampedToScreen, GetPlayerFacing,
      UIDropDownMenu_* — needed by code paths the addon already uses.
    - .gitignore: data/ (DB2 exports + plots), .mcp.json (local).

commit 08537a029fd89989e437a45f18107129f706e381
Author: Magnus Vikan <dizzi90@gmail.com>
Date:   Mon Apr 27 11:09:36 2026 +0200

    Revert "Recalibrate serverTimeOffset periodically to prevent phase drift"

    This reverts 12ab172. The recalibration was aimed at GetTime drift, but
    the syncLog signature in WTF AldorTax.lua shows correction magnitudes
    that scale with gap-since-last-sync per lift (sub-second after a 6 s gap;
    ~41 s after a 3-day gap), not with session uptime — the pattern of
    cycle de-phasing across server restarts, not local-clock drift.
    Recalibrating GetTime cannot fix that.

commit 12ab1726adff3064fd402a50a76f30cc1932deba
Author: Magnus <dizzi90@gmail.com>
Date:   Sat Apr 25 11:08:07 2026 +0000

    Recalibrate serverTimeOffset periodically to prevent phase drift

    The serverTimeOffset was calibrated only once at login, after which the
    OnUpdate handler self-detached. Over a long session the local frame
    clock (GetTime) drifts relative to the server clock by tens of
    milliseconds per hour on typical machines, so the lift timer's predicted
    state slowly desynchronizes from the in-world animation even though the
    underlying cycle is exactly 25.000s.

    Refactor the calibration into CalibrateServerTimeOffset() and call it
    both at login and every 5 minutes via a timer frame. A firstCalibration
    guard protects realTimeOffset (only meaningful once) and the saved-sync
    restore (must not stomp in-memory lastSync values updated since login)
    from running again on subsequent recalibrations.

commit 12ab1726adff3064fd402a50a76f30cc1932deba
Author: Magnus <dizzi90@gmail.com>
Date:   Sat Apr 25 11:08:07 2026 +0000

    Recalibrate serverTimeOffset periodically to prevent phase drift

    The serverTimeOffset was calibrated only once at login, after which the
    OnUpdate handler self-detached. Over a long session the local frame
    clock (GetTime) drifts relative to the server clock by tens of
    milliseconds per hour on typical machines, so the lift timer's predicted
    state slowly desynchronizes from the in-world animation even though the
    underlying cycle is exactly 25.000s.

    Refactor the calibration into CalibrateServerTimeOffset() and call it
    both at login and every 5 minutes via a timer frame. A firstCalibration
    guard protects realTimeOffset (only meaningful once) and the saved-sync
    restore (must not stomp in-memory lastSync values updated since login)
    from running again on subsequent recalibrations.