Merge campaign-cc-batch-f: Batch F — skills selection, scrollbar, cost text, arrow states

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-16 14:19:01 +02:00
commit 0ecd332fb1
5 changed files with 615 additions and 33 deletions

View file

@ -267,6 +267,36 @@ by construction (`SetBackdrop` throws if called without a reserved slot,
and the entity-list-assembly helper `BuildDrawEntities` degrades to
exactly the main entity whenever no backdrop is configured/set).
**Batch F (Skills page completion — R2-4 + review F1/F2) is CODE-COMPLETE
2026-08-16, pending the user's visual gate.** Four of R2-4's five
sub-items are fixed; R2-4b (the four-bucket sorted model) is NOT — see the
AP-213 register row for the exact missing data channel this batch's
investigation pinned down (`SkillBase.MinLevel`, confirmed present in the
installed dat but not threaded through `ChargenOptions`/
`CharacterCreationRuntimeBindings`). **Fixed:** R2-4a (row selection — a
row click, or an arrow click matching retail's own post-Increase/
DecreaseSkillLevel re-select, highlights the row and writes the info
panes' TITLE — name + score — and a level-gated bonus line; the
description/formula halves stay unported for the SAME missing-data reason
as R2-4b, documented on `CharacterCreationSkillsPage.RefreshInfoBox`'s own
doc rather than a new register row since no file outside the page's own
scope was needed to identify it); R2-4c (the listbox's own authored
scrollbar link, live-DAT-CONFIRMED at `0x100003F8` — exactly this batch's
own "+1 from the listbox" hypothesis — wired to the listbox's `Scroll`
model, the ordinary page-level linkage every other `UiTemplateListBox`
owner uses); review F1 (the Untrained-down/Specialized-up literal `"0"`
cost text the prior port rendered blank, and the exact per-branch 999-blank
gate — up-cost only, never down-cost); review F2 (the
`pSkillUpButton`/`pSkillDownButton` Ghosted/Enabled state pair, gated on
credits and a re-derived `bUntrainable`/`bUnspecializable` — the row's own
effective cost being nonzero — using cost data the page already resolves,
no new channel needed). Fixture + one live-DAT test this round (no
graphical client launch); App suite live-DAT env went from 5321/3 to
5328/3 (+7, zero regressions — one pre-existing baseline flake, the
streaming "injected dungeon enqueue failure" test, is a known standalone-
pass-only flake unrelated to this batch and did not reproduce on the full
post-fix run), Runtime 1735/0 unchanged.
User ran the six-page chargen flow live (build `1.0.2-cc.e`, RDP session,
windowed). Screenshots: retail Heritage, acdream Heritage, retail
Profession. The user's side-by-side retail reports are AXIOMS