acdream/tools
Erik 7e75be23d1
Some checks failed
CI / linux-portable (push) Failing after 3m15s
CI / windows-gate (push) Successful in 6m19s
CI / release (push) Has been skipped
fix(ui): effects list stayed pinned at its authored height in a taller window
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>
2026-08-20 21:00:16 +02:00
..
A8CellAudit build: make release restore reproducible 2026-08-18 10:29:00 +02:00
cdb docs(physics): #347 premise revision — retail may alternate too; ftp:edge ratio is the discriminator 2026-08-07 13:42:14 +02:00
cdb-scripts fix(motion): full queue reset on locomotion-cycle direct transitions 2026-05-03 17:00:55 +02:00
diag-logs diag(motion): instrumentation for remote walk↔run leg-cycle bug (Commit A) 2026-05-03 20:38:47 +02:00
dump-keymap build: make release restore reproducible 2026-08-18 10:29:00 +02:00
ghidra_project feat(core): port decompiled AC client physics — CollisionPrimitives + PhysicsBody 2026-04-12 23:54:51 +02:00
IconForge fix(IconForge): point the texture path at the real dump directory 2026-08-20 14:43:37 +02:00
InspectCoatTex docs(issues): #37 — Investigation 2 narrows bug to SubPalette coverage gaps 2026-05-05 14:45:50 +02:00
jsonl test(phys): A6.P5 fixture — 3 ticks from live door-stuck capture 2026-05-25 12:43:51 +02:00
LayoutDump fix(ui): effects list stayed pinned at its authored height in a taller window 2026-08-20 21:00:16 +02:00
MosswartArt feat: mosswart client icon and Asheron's Call-inspired launcher icon 2026-08-20 14:42:10 +02:00
pdb-extract fix(chat): Campaign CH user-gate round 2 -- portal notice rerouted to SpewBox, verbatim /help extraction, jump-in-air evidence 2026-08-10 08:40:24 +02:00
PesChainAudit build: make release restore reproducible 2026-08-18 10:29:00 +02:00
ProjectileVfxAudit build: make release restore reproducible 2026-08-18 10:29:00 +02:00
RainMeshProbe build: make release restore reproducible 2026-08-18 10:29:00 +02:00
RetailTimeProbe build: make release restore reproducible 2026-08-18 10:29:00 +02:00
SetupInspect build: make release restore reproducible 2026-08-18 10:29:00 +02:00
ShaderCompiler build: make release restore reproducible 2026-08-18 10:29:00 +02:00
SkyObjectInspect build: make release restore reproducible 2026-08-18 10:29:00 +02:00
SpellDump feat: regen buffs, wand aura, spellbook assess, indicator press flash 2026-08-20 20:38:28 +02:00
StarsProbe build: make release restore reproducible 2026-08-18 10:29:00 +02:00
TextureDump build: make release restore reproducible 2026-08-18 10:29:00 +02:00
WeatherEnumerator build: make release restore reproducible 2026-08-18 10:29:00 +02:00
WeatherSetupProbe build: make release restore reproducible 2026-08-18 10:29:00 +02:00
analyze_265_steep_slope_capture.py test(physics): #265 mining tool + real-trajectory replay harness for the steep-slope response family 2026-07-30 17:55:49 +02:00
analyze_269_slope_stop_capture.py fix(physics): port retail slope landing stop 2026-07-31 09:10:53 +02:00
analyze_resolve_capture.py tools+plan(#182): resolve-capture histogram classifier + verbatim player-physics rebuild plan 2026-07-07 13:37:15 +02:00
audit-test-inventory.ps1 test: audit helper-mediated source reads 2026-08-18 14:18:00 +02:00
CampaignLaProcessCorrelation.ps1 fix(launcher): harden LA11 gate evidence 2026-08-15 01:45:15 +02:00
capture-campaign-la-session-process.ps1 fix(launcher): harden LA11 gate evidence 2026-08-15 01:45:15 +02:00
compile-shaders.ps1 ci(render): make V9's first CI run green on both operating systems 2026-07-28 21:52:53 +02:00
connected-dense-town.route.txt fix(diag): bind stationary samples to route checkpoints 2026-07-24 12:54:57 +02:00
connected-r6-soak.route.txt fix(diag): bind stationary samples to route checkpoints 2026-07-24 12:54:57 +02:00
connected-world-lifecycle.route.txt test(runtime): add connected lifecycle gate 2026-07-20 22:39:34 +02:00
connected-world-reconnect.route.txt test(runtime): add connected lifecycle gate 2026-07-20 22:39:34 +02:00
decompile_acclient.py research: decompile acclient.exe terrain/physics via Ghidra headless 2026-04-12 23:18:27 +02:00
decompile_full.py research: full acclient.exe decompilation — 22,225 functions, 688K lines 2026-04-12 23:25:51 +02:00
DecompileTargets.java research: decompile acclient.exe terrain/physics via Ghidra headless 2026-04-12 23:18:27 +02:00
ghidra_decompile.py research: decompile acclient.exe terrain/physics via Ghidra headless 2026-04-12 23:18:27 +02:00
new-campaign-la-update-fixture.ps1 fix(launcher): harden LA11 gate evidence 2026-08-15 01:45:15 +02:00
publish-bin.ps1 ci: put the launcher's update pointer in a release, and delete the dist branch 2026-08-19 14:40:41 +02:00
README.md build: make release restore reproducible 2026-08-18 10:29:00 +02:00
run-blank-world-ab-probe.ps1 docs(render): the occlusion-query verdict on the V4c blank world, and the options 2026-07-28 01:44:34 +02:00
run-blank-world-surface-probe.ps1 test(render): add blank-world attribution apparatus and a post-world GL sample 2026-07-28 00:08:10 +02:00
run-campaign-la-preflight.ps1 fix(launcher): harden Campaign LA11 gate evidence 2026-08-15 01:08:41 +02:00
run-connected-loss-gate.ps1 docs(net): N5 accepted - Opus review PASS; loss gate strengthened per review 2026-07-29 16:40:55 +02:00
run-connected-r6-soak.ps1 feat(streaming): shadow-publish flat collision assets 2026-07-25 16:38:54 +02:00
run-connected-world-lifecycle-gate.ps1 feat(net): N5 - loss observability, lossy decorator, the connected loss gate 2026-07-29 16:26:06 +02:00
run-offline-pixel-gate.ps1 feat(render): Vulkan campaign V11 step 4 — retire GL from CI and gate scripts 2026-07-29 03:06:45 +02:00
run-offline-vulkan-capture.ps1 feat(render): Vulkan campaign V11 step 4 — retire GL from CI and gate scripts 2026-07-29 03:06:45 +02:00
run-portal-churn-soak.ps1 feat(render): Vulkan campaign V11 step 4 — retire GL from CI and gate scripts 2026-07-29 03:06:45 +02:00
run-release-gate.ps1 test: introduce Lane=Timing for load-sensitive tests, and stop chasing them individually 2026-08-19 15:29:10 +02:00
run-repeat-connected-gate.ps1 feat(render): Vulkan campaign V11 step 4 — retire GL from CI and gate scripts 2026-07-29 03:06:45 +02:00
test-campaign-la-gate-helpers.ps1 fix(launcher): harden LA11 gate evidence 2026-08-15 01:45:15 +02:00
test-campaign-la-script-safety.ps1 fix(launcher): harden LA11 gate evidence 2026-08-15 01:45:15 +02:00
test-campaign-la-session-status.ps1 fix(launcher): harden LA11 gate evidence 2026-08-15 01:45:15 +02:00
update-package-locks.ps1 build: make release restore reproducible 2026-08-18 10:29:00 +02:00
verify_un2_fmul.py UN-2 RESOLVED: GetMaxSpeed x4 is byte-verified retail; doc-comment was the misread 2026-06-12 13:17:50 +02:00

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.