fix(ui): restore effect detail scrolling

Reflow selected Helpful/Harmful spell descriptions through the retained retail text shaper, bind their authored 0x10000127 information scrollbar independently from the list scrollbar, and allow display-only text to consume wheel scrolling without becoming selectable.

Format Vitae recovery experience through retail's grouped integer presentation. Release build succeeds and all 5,832 tests pass with five intentional skips.

Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-17 13:28:18 +02:00
parent 16c21e299c
commit 82789eea88
9 changed files with 117 additions and 18 deletions

View file

@ -568,7 +568,9 @@ positive root 0x1000011F (inherits 0x10000122)
negative root 0x10000121 (inherits 0x10000122)
shared effects template 0x10000122
effect list 0x10000123
effect-list scrollbar 0x10000124
information text 0x10000126
information scrollbar 0x10000127
effect row template 0x10000128 (300 x 32)
row icon / name / duration 0x10000129 / 0x1000012A / 0x1000012B
effect UI type property 0x1000000C
@ -624,6 +626,13 @@ an active token stores its spell ID, so every layer of that spell highlights
together and shows the shared name/description; clicking either layer again
clears the selection.
`gmEffectsUI::UpdateSelection @ 0x004B7F90` concatenates spell name, a blank
line, and spell description, then passes that one literal to
`UIElement_Text::SetText`. The text element reflows the literal to its authored
280-pixel information width. LayoutDesc `0x2100001B` supplies a separate
scrollbar `0x10000127` for that 78-pixel-high information text; it does not
reuse the effect-list scrollbar `0x10000124`.
`InfoRegion::InfoRegion @ 0x004F1450` creates each row with
`UIElement_ListBox::AddItemFromTemplateList(template 0)`. In installed retail
data the icon is x=0 width 32, name is x=37 width 188, and duration is x=225

View file

@ -25,6 +25,11 @@ The skills paragraph is not optional. It explains that health, stamina, mana,
and skills are reduced by the same percentage and warns about penalties above
15 percent.
Every integer above is inserted with `StringInfo::AddVariable_Int`. Its
`LInt_StringInfoData::ToString @ 0x0042F7E0` calls `NumToString` with grouping
enabled, so recovery XP is rendered with the client language's thousands
separator (for English, `61,000,000`, never `61000000`).
## Character Information
`gmCharacterInfoUI::Update @ 0x004BA790` clears `m_pMainText`, appends six