fix(chat): Campaign CH user-gate round 2 -- portal notice rerouted to SpewBox, verbatim /help extraction, jump-in-air evidence
Item 2: retail's portal-space "In Portal Space..." notice is the SpewBox (ECM_UI::SendNotice_DisplayStringInfo(0x1A,...) -> AddTextToScroll(str, 0x1A, 1, 0), hardcoded to the SpewBox per the decomp), not a dedicated centered overlay. PortalWaitNoticeController and its lease are deleted; PortalTunnelPresentation's per-rotation-segment cadence now writes straight into RuntimeCommunicationState.AddText(ClientLocal) -- the SpewBox's own dedupe-at-index-0 handles the repetition exactly as retail's does. Register row AP-184 records the surface fix and the AP-178 scope extension. Items 4+5: /help text was partially fabricated -- the user caught the "/help death" meta-message. Generalized tools/pdb-extract/sweep_weenie_strings.py to decode narrow PStringBase<char> literals (the ClientCommunicationSystem::Help* family's shape) alongside its original UTF-16LE support, then swept every HelpXxxGroup function's exact byte extent against the PDB-paired acclient.exe. 4 of 7 group topics (death/status/text/allegiances) are now complete verbatim listings; the other 3 (channels/chatting/commands) keep an honest UNVERIFIED note citing HelpStupidChannelHack @0x0056f290 (a genuinely undecodable BN-mislabeled-fragment mechanism) instead of the old fabricated sentinel. 7 of ~35 channel one-liners are also now verbatim. ISSUES.md #364 tracks the remainder; RetailCommandHelpTableTests.cs pins every result byte-exact. Item 1: jump-in-air refusal still silent live is NOT reproduced and NOT speculatively fixed. Exhaustive static re-audit found the mechanism correct by construction (single-writer OnWalkable, exactly-once-per-frame Update()/Capture(), no interfering edge-history resets). A live headless repro (new jump-probe bot policy, real ACE connect) was blocked -- probeaccount2 has no character, and the graphical client already owned testaccount this session so the task's own fallback rule forbade using it. Two temporary probes are left behind ACDREAM_PROBE_JUMP=1 (blocked entirely in Headless by the existing multi-session static-state guard -- graphical-only for the next round). Item 3 confirmed fixed, no regression. Item 6 (resize: no diagonal cursors, cannot grow Y from bottom-right) folded into CH6a's existing scope. Full Release suite: 12,267 passed / 4 skipped / 0 failed (up from 12,221/4/0). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
a485425743
commit
c1f1582576
14 changed files with 788 additions and 254 deletions
|
|
@ -1061,25 +1061,30 @@ internal sealed class LivePresentationCompositionPhase
|
|||
?? throw new InvalidOperationException(
|
||||
"The graphics backend must publish a world pass scope.")),
|
||||
static value => value.Dispose());
|
||||
CompositionAcquisitionScope.CompositionAcquisitionLease<
|
||||
PortalWaitNoticeController>? portalWaitNoticeLease = null;
|
||||
if (interaction.RetainedUi is { } portalRetainedUi)
|
||||
{
|
||||
portalWaitNoticeLease = scope.Acquire(
|
||||
"portal wait notice",
|
||||
() => new PortalWaitNoticeController(
|
||||
portalRetainedUi.Host.Root),
|
||||
static value => value.Dispose());
|
||||
}
|
||||
Action<string?>? displayPortalWaitNotice =
|
||||
portalWaitNoticeLease is { } waitNoticeLease
|
||||
? waitNoticeLease.Resource.Set
|
||||
: null;
|
||||
// Campaign CH user-gate round 2, item 2: the user reported retail's
|
||||
// portal-space notice at the TOP of the screen in SMALL tell-yellow
|
||||
// text — the SpewBox — while the former PortalWaitNoticeController
|
||||
// rendered a big centered white/yellow overlay of its own. The
|
||||
// decomp confirms the user's report: gmSmartBoxUI::UseTime
|
||||
// @0x004D6E30 emits via ECM_UI::SendNotice_DisplayStringInfo(0x1A,
|
||||
// ...), which forwards to AddTextToScroll(str, 0x1A, 1, 0) — type
|
||||
// 0x1A is HARDCODED to the SpewBox
|
||||
// (docs/research/2026-08-09-chat-retail-interface-text.md
|
||||
// §1.1/§4.2), the SAME surface every other ClientLocal refusal uses
|
||||
// (PlayerMovementController.ReportJumpRefusal, etc.), not a
|
||||
// dedicated overlay. PortalWaitNoticeController is deleted along
|
||||
// with its lease; this delegate now writes straight into the
|
||||
// canonical AddText router every other on-screen interface-text
|
||||
// site already uses. Unlike the deleted controller, this has no
|
||||
// retained-UI dependency (Runtime state, not a UI element), so it
|
||||
// is always wired, not gated on interaction.RetainedUi.
|
||||
Action<string> displayPortalWaitNotice = text =>
|
||||
d.Runtime.CommunicationOwner.AddText(
|
||||
text,
|
||||
AcDream.Core.Chat.RetailLogTextType.ClientLocal);
|
||||
// Campaign CH slice CH2: the SpewBox is retail's OTHER on-screen
|
||||
// interface-text surface (research doc §1.1/§7.3/§7.4) — modeled
|
||||
// directly on the PortalWaitNoticeController lease immediately
|
||||
// above, wired into the same retained-UI host. Like the wait notice
|
||||
// in its no-tunnel arm, the transferred controller is reclaimed by
|
||||
// interface-text surface (research doc §1.1/§7.3/§7.4), wired into
|
||||
// the retained-UI host. The transferred controller is reclaimed by
|
||||
// the retained-UI root's own teardown (its Dispose only detaches
|
||||
// children from that root).
|
||||
CompositionAcquisitionScope.CompositionAcquisitionLease<
|
||||
|
|
@ -1120,8 +1125,7 @@ internal sealed class LivePresentationCompositionPhase
|
|||
portalDispatcher,
|
||||
foundation.SceneLighting!,
|
||||
foundation.MeshAdapter!,
|
||||
displayPortalWaitNotice,
|
||||
portalWaitNoticeLease?.Resource),
|
||||
displayPortalWaitNotice),
|
||||
static tunnel => tunnel.PrepareResources());
|
||||
}
|
||||
catch (Exception acquisitionFailure)
|
||||
|
|
@ -1304,7 +1308,6 @@ internal sealed class LivePresentationCompositionPhase
|
|||
clipFrameLease.Transfer();
|
||||
portalDepthLease.Transfer();
|
||||
portalTunnelLease?.Transfer();
|
||||
portalWaitNoticeLease?.Transfer();
|
||||
spewBoxLease?.Transfer();
|
||||
skyLease.Transfer();
|
||||
particleLease.Transfer();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue