The "Beneficial Spells in Effect" window rendered its rows only in the top 249px and painted the rest of the list as empty black background, with a scrollbar thumb sized for a viewport far smaller than the visible one. It did not depend on window size, and the last visible row was sliced mid-height -- a clip boundary, not a missing row. Root cause is the #412 class again. The authored list element (0x10000123) is a UiTemplateListBox, not a UiItemList, so EffectsUiController creates the item list itself and attaches it as a child with fill anchors. That baseline is captured lazily on the child's first ApplyAnchor -- which lands AFTER the host has already been resized to the restored window height in the same frame. The capture then measures a bottom margin of (hostH - 249) and ComputeAnchoredRect preserves it forever: h = hostH - (hostH - 249) = 249, at every subsequent size. Rows past 249px fail LayoutCells' cull test and never draw. Capturing the baseline at creation, while the list's extent still exactly equals the host's, makes the margins (0,0,0,0) so it tracks the host from then on. Identical fix and reason to UiTemplateListBox's own viewport seed. The spellbook's component list is built by the same pattern and had the same latent defect; it is fixed alongside. Why it shipped: every existing test in EffectsUiControllerTests supplies a synthetic UiItemList as the list element, so `host is UiItemList` is true and the controller uses it directly -- the create-and-attach branch that actually runs against real dat was never exercised. The new test binds the real fixture, which builds the real UiTemplateListBox. Neutralising the fix makes it fail with the exact production numbers (expected 547, actual 249). Measured, not guessed. tools/LayoutDump grew --resize, which reproduces retail's raw-edge policy (UIElement::UpdateForParentSizeChange @ 0x00462640) offline, and it ruled out the authored geometry, the import, the layout policy and the window frame in turn -- all four are faithful. The 4px gap between the scrollbar and the window's inner edge is likewise authored: the user confirmed retail shows the same gap, so it is deliberately left alone. Solution builds clean; 14,465 tests pass on the standard hermetic lane filter, 0 failures. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| A8CellAudit | ||
| cdb | ||
| cdb-scripts | ||
| diag-logs | ||
| dump-keymap | ||
| ghidra_project | ||
| IconForge | ||
| InspectCoatTex | ||
| jsonl | ||
| LayoutDump | ||
| MosswartArt | ||
| pdb-extract | ||
| PesChainAudit | ||
| ProjectileVfxAudit | ||
| RainMeshProbe | ||
| RetailTimeProbe | ||
| SetupInspect | ||
| ShaderCompiler | ||
| SkyObjectInspect | ||
| SpellDump | ||
| StarsProbe | ||
| TextureDump | ||
| WeatherEnumerator | ||
| WeatherSetupProbe | ||
| analyze_265_steep_slope_capture.py | ||
| analyze_269_slope_stop_capture.py | ||
| analyze_resolve_capture.py | ||
| audit-test-inventory.ps1 | ||
| CampaignLaProcessCorrelation.ps1 | ||
| capture-campaign-la-session-process.ps1 | ||
| compile-shaders.ps1 | ||
| connected-dense-town.route.txt | ||
| connected-r6-soak.route.txt | ||
| connected-world-lifecycle.route.txt | ||
| connected-world-reconnect.route.txt | ||
| decompile_acclient.py | ||
| decompile_full.py | ||
| DecompileTargets.java | ||
| ghidra_decompile.py | ||
| new-campaign-la-update-fixture.ps1 | ||
| publish-bin.ps1 | ||
| README.md | ||
| run-blank-world-ab-probe.ps1 | ||
| run-blank-world-surface-probe.ps1 | ||
| run-campaign-la-preflight.ps1 | ||
| run-connected-loss-gate.ps1 | ||
| run-connected-r6-soak.ps1 | ||
| run-connected-world-lifecycle-gate.ps1 | ||
| run-offline-pixel-gate.ps1 | ||
| run-offline-vulkan-capture.ps1 | ||
| run-portal-churn-soak.ps1 | ||
| run-release-gate.ps1 | ||
| run-repeat-connected-gate.ps1 | ||
| test-campaign-la-gate-helpers.ps1 | ||
| test-campaign-la-script-safety.ps1 | ||
| test-campaign-la-session-status.ps1 | ||
| update-package-locks.ps1 | ||
| verify_un2_fmul.py | ||
Maintained .NET tools
Every .csproj under tools/ is part of AcDream.slnx. The complete Release
gate restores and builds these tools, so a missing personal checkout or an API
change cannot leave a tracked tool silently broken. They are diagnostic/manual
programs: the gate builds them but does not run data-dependent investigations.
| Tool | Purpose | Runtime prerequisite |
|---|---|---|
A8CellAudit |
Inspect landblock, EnvCell, portal, and collision topology. | Installed AC DAT files / the arguments documented by the program. |
dump-keymap |
Extract the retail master input maps and decoded actions. | Installed client_portal.dat. |
PesChainAudit |
Walk weather PES call chains and particle emitters. | Installed AC DAT files. |
ProjectileVfxAudit |
Audit projectile physics-script and particle-emitter VFX mappings. | Installed AC DAT files. |
RainMeshProbe |
Inspect rain surfaces, polygon sidedness, and generated mesh counts. | Installed AC DAT files. |
RetailTimeProbe |
Read retail time-of-day and sky state for comparison. | Windows, a running retail client, and process-read access. |
SetupInspect |
Dump Setup parts, placement poses, and animation frames. | Installed AC DAT files and a Setup ID. |
ShaderCompiler |
Compile the Vulkan GLSL shader set to committed SPIR-V. | Source and output directory arguments. |
SkyObjectInspect |
Inspect Dereth sky/day-group objects and texture data. | Installed AC DAT files. |
StarsProbe |
Audit sky-object geometry, UV ranges, and surfaces. | Installed AC DAT files. |
TextureDump |
Dump render-surface statistics and texture images. | Installed AC DAT files. |
WeatherEnumerator |
Enumerate weather sky objects and their bounds. | Installed AC DAT files. |
WeatherSetupProbe |
Inspect the parts and surfaces of weather Setups. | Installed AC DAT files. |
Build the complete maintained graph with:
dotnet restore AcDream.slnx --locked-mode --force-evaluate
dotnet build AcDream.slnx -c Release --no-restore
Use pwsh ./tools/run-release-gate.ps1 for the authoritative bounded gate.
Package versions and lock-file maintenance are documented in
docs/release-gate.md.