feat(ui): AD-109 — arm the login wormhole at the char-select Enter click
USER-DIRECTED deviation from retail (register row AD-109, same commit): retail presents the empty pre-player gameplay screen — black behind the retained UI — from the Enter click (CPlayerSystem::LogOnCharacter @0x0055F890 -> CM_Login::SendNotice_BeginEnterWorld @0x006AD810, UI mode 0x10000008) until CreatePlayer raises SmartBox::teleport_in_progress @0x00451C20 and gmSmartBoxUI::UseTime @0x004D6EAB begins TAS_TUNNEL. The user prefers the tunnel to cover that whole wait. - ILocalPlayerTeleportNetworkSink.ArmLoginTunnel: begins the login wormhole presentation at the Enter click, consuming the sequencer's begin-edge events SYNCHRONOUSLY (the Enter command blocks the update thread for the whole ServerReady round trip, so a deferred first tick would leave exactly the black window this deviation removes). The enter cue plays at the click: retail's own rule is cue-at-animation- begin (Sound_UI_EnterPortal @0x004D638E, unconditional inside BeginTeleportAnimation), and the animation begin moved to the click. - Armed pre-reveal pump: tunnel animates across the round trip (worldReady pinned false, sequencer holds in Tunnel); the hold clock accumulates from the click. - Adoption: the Runtime login reveal ADOPTS the running presentation (no re-Begin, no second cue); rejected EnterWorld (lifecycle back to AwaitingSelection) disarms and retires the tunnel. - Wired at the ONE host edge every entry route shares: ILiveSessionLifecycleHost.ApplySelectedCharacter (direct connect, roster Enter, enter-after-create) via LiveSessionSelectionBindings.ArmLoginTunnel (default no-op keeps headless and every existing construction site unchanged). - ILocalPlayerLoginLifecycleSource: typed seam (not a stored delegate — the frame-phase owner delegate-field guard) projecting the Runtime character-selection lifecycle for the disarm edge. - Frame contract update: [login-frames] over a login is tunnel -> world from the click — no void, and no black between click and world. Tests: 4 new armed-tunnel tests (arm/adopt/disarm/frame-shape); App suite live-DAT 5516 passed / 3 skipped (baseline 5512/3 + 4 new). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
fdc4fd496d
commit
2bc81480d4
10 changed files with 437 additions and 13 deletions
|
|
@ -15,9 +15,14 @@ internal static class RenderPresentationDiagnostics
|
|||
/// classification for the login wormhole edges. When set, every completed
|
||||
/// render frame is classified by WHAT PRESENTED — <c>world</c> /
|
||||
/// <c>tunnel</c> / <c>black</c> / <c>void</c> — and a <c>[login-frames]</c>
|
||||
/// line is written on every classification transition. The gate contract
|
||||
/// is retail's: the sequence over a login must contain NO <c>void</c>
|
||||
/// entry on either edge (black → tunnel → world, each swap atomic).
|
||||
/// line is written on every classification transition. The gate contract:
|
||||
/// the sequence over a login must contain NO <c>void</c> entry on either
|
||||
/// edge, and — since the enter-click round's click-armed tunnel
|
||||
/// (registered deviation from retail's pre-CreatePlayer black) — no
|
||||
/// <c>black</c> entry between the Enter click and the world either: the
|
||||
/// sequence from the click is tunnel → world, each swap atomic.
|
||||
/// (<c>black</c> remains legal BEFORE the click — it is the
|
||||
/// character-select screen's own backdrop.)
|
||||
/// Not a user setting; not in <c>RuntimeOptions</c>; not persisted.
|
||||
/// </summary>
|
||||
public static bool ProbeLoginFrames { get; } =
|
||||
|
|
|
|||
|
|
@ -160,8 +160,18 @@ internal sealed class LocalPlayerTeleportRenderStateSource
|
|||
/// backdrop had no retail counterpart and presented as the gate's
|
||||
/// entry-edge VOID (2026-08-17). Both flags flip on the update thread
|
||||
/// (the login activation tick flips ChaseModeEverEntered AND makes the
|
||||
/// tunnel visible before the next render), so the black → tunnel → world
|
||||
/// tunnel visible before the next render), so the cover → tunnel → world
|
||||
/// sequence swaps atomically per frame.
|
||||
///
|
||||
/// <para>
|
||||
/// Enter-click round (2026-08-17): with the click-armed login tunnel
|
||||
/// (registered user-directed deviation — see
|
||||
/// <c>ILocalPlayerTeleportNetworkSink.ArmLoginTunnel</c>) the tunnel
|
||||
/// scene becomes visible AT the Enter click, so retail's bare-black
|
||||
/// CreatePlayer window normally never presents; the second arm remains
|
||||
/// the char-select backdrop and the fallback for any unarmed pre-world
|
||||
/// frame.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
public bool IsPortalViewportVisible =>
|
||||
_teleport.IsPortalViewportVisible || _login.IsWaitingForLogin;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue