docs(CT): CT1 fix round — sealed RowHighlightSprite verdict, verified resize mechanism, strengthened pins
Applies the Opus dual-lens review corrections to CT1's DAT ground-truth research (docs/research/2026-08-24-campaign-ct-dat-ground-truth.md): - Window constraints (BLOCKER): replaced the "likely a hardcoded ResizeTo/SetMinSize" guess with the verified mechanism — UIElement::ResizeTo clamps only via element attributes 0x3C-0x3F, nothing writes them at runtime, and retail resizes the SHARED gmPanelUI host (LayoutDesc 0x2100006E, slot 0x1000018E) rather than 0x2100002E's own content root. Flags the unresolved 300x600-vs-300x362 size tension for CT3/CT6 and marks the host elements NOT PROBED by CT1. - RowHighlightSprite upgraded from a flagged hedge to a SEALED VERDICT: the stat row's selected-state media is 0x06000F93 (gmAttributeUI::UpdateSelection -> InfoRegion::SetState on template 0x10000248), not 0x06001397 (which is legitimately the spellbook row's separate selected-overlay mechanism). Falsifies the matching comment in CharacterStatController.cs and dated-corrects the older 2026-06-26 doc at the spot that originated the wrong sprite id. - Replaced the "18px gutter + 7px = 25px" derived story with the bare authored rectangles (the numbers don't compose cleanly: 300-281=19, and the 282px row overlaps the 281px scrollbar band by 1px) — CT5 must implement the authored numbers directly, never a derived listWidth-18 formula. - Plan doc: corrected the UpdateButtons ghost rule (no selection -> Ghosted, not "ghosts when selected == current") and added the AddTitleToList row-write contract for CT3. - Pins: CharacterPanelLiveDatTests now honors ACDREAM_DAT_DIR first (matching InstalledDatFactAttribute and its sibling live-DAT test classes), hoists five vacuous bare-foreach assertions to counted .ToList() pins, and adds the stat ListBox + scrollbar rect pins that CT5/CT6 depend on. - Doc hygiene: marked several probe-session observations (header geometry "identical" claim, 0x06004CC2 characterization, the master-map/category-map dump) as unpinned inference vs. committed fact, corrected the 0x1000052D "throwaway container" mislabel, and stated the header table's parent-relative coordinate frame. - Recorded the CT5 gold this round found: InfoRegion::InfoRegion's icon-DID lookup (a third GetDIDByEnum consumer, category 0x10000002) and gmSkillUI::RebuildSkillList's section-header order confirmation, plus the RowHeight=22-vs-authored-20 divergence for attribute rows. Verified: ACDREAM_RUN_INSTALLED_DAT_TESTS=1 CharacterPanelLiveDatTests filter 9/9 green; hermetic App suite filter (CI's Lane exclusion list) 6111/6111 green. No production code changed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
d3877f1c0e
commit
e264d8392f
4 changed files with 297 additions and 65 deletions
|
|
@ -40,10 +40,19 @@ land; every deviation a slice introduces adds its row in the same commit.
|
|||
`AddTitleToList @0x0049A840` resolves the display string via
|
||||
`CharacterTitleTable::GetCharacterTitleFromID` (DAT title-string
|
||||
table — CT2 locates the DID) and inserts SORTED
|
||||
(`FindSortedInsertPosition @0x0049A760`).
|
||||
- `UpdateButtons @0x0049A500`: the display button GHOSTS (state 0xd)
|
||||
when the selected row's title id == `mDisplayTitle`; Normal (1)
|
||||
otherwise. Selection change (msg 4/0x43) re-runs it.
|
||||
(`FindSortedInsertPosition @0x0049A760`). It writes the resolved title
|
||||
text into row child `0x10000537` and stamps the row's id via
|
||||
`SetAttribute_Enum(row, 0x1000008E, titleId)`, inserting the row via
|
||||
`AddItemFromTemplateList(listBox, 0, insertPos)` — CT3 mirrors this
|
||||
exact write shape when populating `0x10000532`.
|
||||
- **CORRECTED (CT1 fix round 2026-08-24):** `UpdateButtons @0x0049A500`
|
||||
— the display button is **GHOSTED (state 0xd) UNLESS a row is
|
||||
SELECTED whose title id differs from the current display title; no
|
||||
selection → Ghosted.** (Not "ghosts when selected == current" — that
|
||||
phrasing had the no-selection case backwards.) Verbatim mechanism:
|
||||
a no-match selection falls through to index `0xFFFFFFFF` →
|
||||
`GetItem` returns null → `SetState(0xd)`. Selection change
|
||||
(msg 4/0x43) re-runs it.
|
||||
- Clicking `0x10000535` sends
|
||||
`CM_Social::Event_SetDisplayCharacterTitle(titleId)`
|
||||
(`ListenToElementMessage @0x0049A6D0`).
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue