fix(ui): Campaign AS gate fixes AS-GF1 — extras-list overflow ruled OUT as a code defect; paperdoll regression not isolated, probe added instead
Two owner-reported defects at the Campaign AS connected gate on the examination window (player targets): the animated paperdoll no longer renders at all, and a "reserved black rectangle" appears at the window's bottom with the character extras list clipped mid-row at default (310x400) window size. ROOT CAUSE — extras-list overflow (the "clipped mid-row" half of defect 2): NOT a code bug. AS3 (armor-level trio) and AS4 (society/allegiance/ configurable extras) grew the extras list past its DAT-authored 87px region (element 0x10000335) at the window's minimum size — a new hermetic regression test proves the worst-case combination (every AS3+AS4 addition at once) reaches 20 rows / 400px of content, a 4.6x overflow. But retail's own LayoutDesc authors NO scrollbar for this listbox either (ScrollbarElementId == 0, verified against both the committed fixture and a fresh tools/LayoutDump read of the live installed DAT — no drift), and the SAME test proves UiItemList's pre-existing, unmodified wheel-scroll handler (OnEvent's UiEventType.Scroll branch) already reveals every row on the next paint. A scrollbar-less, wheel-scrollable list clipped to its authored region until the user scrolls or resizes IS retail's own already-correctly- ported mechanism, not a regression — so no fix was made here. ROOT CAUSE — paperdoll / "black rectangle" (defect 1): NOT ISOLATED despite exhaustive investigation. Every file the Campaign AS diff touches (AppraisalUiController.cs, RetailUiRuntime.cs, CreatureAppraisalRows.cs, AllegianceRankTitleTable.cs, CharacterIdentityText.cs, CharacterSheetProvider.cs, InteractionRetainedUiComposition.cs, plus two unrelated mechanical PublicWeenieFlags-literal refactors) was reviewed in full against the pre-Campaign-AS baseline. The same worst-case regression test proves Apply/ApplyCreature/RebuildCreatureStats/BuildExtra never throw and always leave ActiveView == Character, CurrentObjectId != 0, and the viewport's full ancestor-visibility chain Visible == true — ruling out RetailCreatureAppraisalFrameView.TryGetVisibleTarget's first three gates. CreatureAppraisalPresentation.cs and LivePresentationComposition.cs (the entire render-time viewport pipeline) are byte-for-byte unchanged across the whole 974fe88a..87e98395 window. UiViewport.OnDraw draws NOTHING (not black) when its TextureSlot is unassigned, and the creaturePanel's own full-panel backdrop (0x10000141) is what would show through instead — the most likely explanation tying both defects to ONE underlying condition, but its exact trigger (TryGetVisibleTarget's CurrentObjectId check, or TrySynchronize's live-entity/mesh-availability check) lies in code nothing in Campaign AS touches, and could not be reproduced hermetically (needs a live entity + a live examine exchange). Filed #443 with the full investigation trail. Added a temporary, state-change-gated diagnostic probe (ACDREAM_PROBE_CREATURE_APPRAISAL_ VIEWPORT=1, CreatureAppraisalViewportDiagnostics) at both TryGetVisibleTarget and TrySynchronize so the next live repro pinpoints the exact failing reason instead of another guess. Per CLAUDE.md's "no workarounds without explicit approval" and the investigation mode's own escape hatch ("if you cannot root-cause, say what runtime evidence you need instead of shipping a guess"), no behavioral fix was shipped for defect 1. Tests: AcDream.App.Tests hermetic filter 6,337/0; full-solution hermetic suite 15,612/0 (all 14 projects green, including the known #442 flake, which did not trip this run). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
87e9839561
commit
65f6f5848a
5 changed files with 302 additions and 7 deletions
|
|
@ -181,6 +181,7 @@ fall back to `ACDREAM_DAT_DIR`.
|
|||
| `ACDREAM_ORBIT_DISTANCE_METERS` | `=<float>`, must be finite and `>0` | Diagnostic-only initial distance for the offline orbit camera, so deterministic renderer acceptance captures land inside a finite shadow reach. | Own doc comment: "used by deterministic renderer acceptance captures." Rejects non-finite/non-positive values silently (parses to `null`, camera default used). | `null` (unset) → normal camera default | `RuntimeOptions.InitialOrbitDistanceMeters` → `GameWindow.cs:1412` → offline orbit-camera composition |
|
||||
| `ACDREAM_ORBIT_PITCH_DEGREES` | `=<float>`, clamped `[-89, 89]` | Diagnostic-only initial orbit camera elevation. | Values outside `[-89,89]` or non-finite are silently rejected (→ `null`, default kept) rather than clamped. | `null` | `RuntimeOptions.InitialOrbitPitchDegrees` → `GameWindow.cs:1414` |
|
||||
| `ACDREAM_ORBIT_YAW_DEGREES` | `=<float>`, must be finite | Diagnostic-only initial orbit camera heading. | Non-finite values silently rejected (→ `null`). | `null` | `RuntimeOptions.InitialOrbitYawDegrees` → `GameWindow.cs:1413` |
|
||||
| `ACDREAM_PROBE_CREATURE_APPRAISAL_VIEWPORT` | `=1` | #443 temporary probe for the examination-window player-paperdoll regression: logs `[AS-GF1-PROBE] TryGetVisibleTarget: <reason>` and `[AS-GF1-PROBE] TrySynchronize: <reason>` on every REASON TRANSITION (not every frame), pinpointing which of the two private-viewport gates rejects the target | print-only, state-change-gated so cost stays near zero even left on for a whole session | off | `CreatureAppraisalViewportDiagnostics.Enabled` (`CreatureAppraisalViewportDiagnostics.cs`), consumed by `RetailCreatureAppraisalFrameView.TryGetVisibleTarget` and `RetailCreatureAppraisalCloneFactory.TrySynchronize` in `CreatureAppraisalPresentation.cs` |
|
||||
| `ACDREAM_PROBE_REVEAL_RADIUS` | `=<int>=1` (unparsable or `<1` → override absent; floor is 1, not 0) | #280 A/B measurement probe: forces the OUTDOOR reveal gate to use this landblock radius instead of the derived streaming window (near radius clamped to it), so a route can be measured with the pre-#280 behavior (`=1`, old `OutdoorNeighborhoodRadius`) vs. current | **Changes what gets revealed, not just measured** — genuinely resizes the reveal/visible window used by the live reveal gate. CLAUDE.md: "Leave it unset for any measurement or gate run — with it set you are measuring a different window than production." `=0` is rejected by the parser specifically because it would hang the very A/B route it exists to measure (`RequiredRenderRadius==0` fails `invalid-readiness-shape`). Not a user setting, not in Settings/RuntimeOptions, not persisted. | unset (derivation in charge, no override) | `StreamingDiagnostics.RevealRadiusOverride` (`StreamingDiagnostics.cs:25-27,76-80`), applied by `StreamingDiagnostics.ApplyRevealRadiusOverride` |
|
||||
| `ACDREAM_PROBE_WORLD_FRAME` | `=1` | gates one `[world-frame] agree` line per projected conversion in `DatLiveEntityProjectionMaterializer`, recording the world-frame center both `LiveWorldOriginState` (App) and Runtime's physics-state owner used (issue #283, "measurement only; it never gates placement") | print-only | off | `PhysicsDiagnostics.ProbeWorldFrameEnabled` |
|
||||
| `ACDREAM_SKY_PHASE_SECONDS` | `=<float>` (any finite value; negative accepted, taken mod 1 per axis) | Campaign V slice V7 instrument-determinism pin: freezes the sky's cloud-sheet UV scroll to a fixed elapsed-seconds value instead of wall-clock time, so two launches of a differential/offline gate agree about cloud position. | **Non-obvious dual effect**: this ONE var pins TWO independently-designed clocks that happen to share a name-adjacent purpose — the sky renderer's cloud scroll (`SkyRenderer.AnimationPhaseSecondsOverride`) AND, since Campaign VM slice VM6, the atmospheric post-process graph's foliage-wind clock (`_windClockSecondsOverride`). A gate that only knows about "sky clouds" and sets this to freeze them will *also* freeze foliage-wind evolution — deliberately snapped-to-target on the first advance per an A6 review fix, but still a second surface a naive reader wouldn't expect this var to touch. Distinct from `ACDREAM_DAY_GROUP`/`ACDREAM_WORLD_TIME`, which pin the OTHER sky clock (day group/sun angle) — retail's clouds drift independently of the calendar date by design. | `null` → wall-clock driven (every ordinary run) | `RuntimeOptions.SkyAnimationPhaseSeconds` → `SkyRenderer.cs:79,85` (cloud UV scroll) **and** `AtmosphericPostProcessGraph.cs:560,586,671` (foliage-wind clock) |
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue