fix(ui): gate — no void frames around the login wormhole; vitals icons centered
The login tunnel now covers from the first world-facing frame (the sky-void backdrop can never present pre-tunnel) and holds through an atomic tunnel-to-world swap at reveal completion — the void is structurally unreachable on both edges, pinned by frame-sequence tests across WorldSceneRenderer/WorldRevealCoordinator/LocalPlayerTeleport- Controller/RuntimeWorldTransitState. Vitals detail icons draw at their authored centered offsets in both stacked and side-by-side layouts. Implemented and live-probed by the fix agent; finalized by the lead after the agent parked post-verification (gates re-run green: App 5512/3, Runtime 1747/0). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
2f8c046aba
commit
fdc4fd496d
17 changed files with 649 additions and 66 deletions
|
|
@ -649,6 +649,64 @@ public sealed class RuntimeWorldTransitState
|
|||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The LOGIN half of the materialization/simulation edge. Retail's
|
||||
/// <c>SmartBox::UseTime @ 0x00455410</c> <c>blocking_for_cells</c> branch
|
||||
/// resumes <c>CObjectMaint</c>/<c>CPhysics</c> the moment destination
|
||||
/// cells stop blocking — while the tunnel is still in front, and
|
||||
/// IDENTICALLY for the initial login and an F751 teleport (retail has one
|
||||
/// <c>teleport_in_progress</c> flow). The portal route rides
|
||||
/// <see cref="AcknowledgePortalMaterialized"/> at its Place edge; the
|
||||
/// login route has no Place (the first-entry conductor already committed
|
||||
/// the canonical placement), so this acknowledges the same simulation
|
||||
/// release at the login pump's tunnel-hold-end edge. Without it the world
|
||||
/// stayed unavailable until <see cref="Complete"/> — the WorldFadeIn
|
||||
/// second presented an empty (void) world frame instead of retail's
|
||||
/// world-under-warp (2026-08-17 gate).
|
||||
/// </summary>
|
||||
public bool AcknowledgeLoginMaterialized(long generation)
|
||||
{
|
||||
if (generation == 0
|
||||
|| generation != _snapshot.Generation
|
||||
|| _snapshot.Kind != RuntimePortalKind.Login)
|
||||
{
|
||||
LogRejected(
|
||||
"materialized-login-mismatch",
|
||||
$"generation={generation} kind={_snapshot.Kind}");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ValidateActive(
|
||||
generation,
|
||||
_snapshot.DestinationCell,
|
||||
"materialized"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (_snapshot.Materialized)
|
||||
return false;
|
||||
if (!_snapshot.Readiness.IsReady)
|
||||
{
|
||||
FailInvariant("materialized-before-ready", null);
|
||||
return false;
|
||||
}
|
||||
|
||||
// PortalMaterializationCount deliberately unchanged: it counts
|
||||
// Kind == Portal materializations only, exactly like the portal
|
||||
// acknowledgement's own conditional increment.
|
||||
_snapshot = _snapshot with
|
||||
{
|
||||
Materialized = true,
|
||||
WorldSimulationAvailable = true,
|
||||
};
|
||||
RequireHostStage(
|
||||
generation,
|
||||
RuntimeWorldHostAcknowledgementStage
|
||||
.SimulationReleaseProjected);
|
||||
Log("materialized", _snapshot);
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool AcknowledgeWorldViewportVisible(long generation)
|
||||
{
|
||||
if (!ValidateGeneration(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue