feat(ui): Campaign OP slice OP5 — the Chat tab

Binds LayoutDesc 0x2100005C through OP2's template-list mechanism and
OP3's per-page OptionPage model: the General Options header + two
DualHash-linked opacity sliders (Option_DefaultOpacity_Property
0x10000080 / Option_ActiveOpacity_Property 0x10000081, live-apply on
drag through RetailWindowOpacityController, defaults read from the
installed DAT's DBProperties collection at DID 0x78000001 via
ChatOptionsDatDefaults), and the five per-window text-filter blocks
(main window 12 rows minus Gameplay, four floaties 13 rows each — the
byte-verified authored order cross-checked against the raw
gmChatOptionsUI::InitOptions/AddCheckboxBitfield64Option pseudo-C, not
just the research doc's own table) writing AcDream.Core.Chat.
ChatWindowState directly, the same state CH6's chat windows already
read.

AP-195 retired: ported both halves left open at the OP2 re-review —
the ALL-set LED media swap (new UiButton.FaceFileOverride, driven by
the block-level P0x10000082/P0x10000083 sprites now threaded through
ElementInfo/DatWidgetFactory) and the CreateChildren self-sizing tail
(UiCheckboxBitfield64.Height grows with its stacked row content; the
enclosing ListBox reflows around the block's FINAL height via the new
UiTemplateListBox.AddPrebuiltRow, reusing the ListBox's own stacking
rather than a third stacking path). AP-187 broadened to cover the main
window's own filter (previously only the four floaties) and the new
live-editing write path.

The main chat window's filter (retail window id 8, ChatWindowState id
0) gains its own settings.json persistence (ChatSettings.
ChatWindowMainFilter) alongside the pre-existing floaty 1-4 fields;
opacity persistence is now wired on every live slider change, not only
through the old dev-scaffold Settings panel.

Fixture regeneration (ACDREAM_REGENERATE_UI_FIXTURES=1) picked up the
new ElementInfo.LedCheckedSprite/LedUncheckedSprite fields across all
19 committed layout fixtures — purely additive, confirmed against the
live installed DAT (0x10000520's own 0x82/0x83 properties resolve to
0x06004D17/0x06004D19 exactly as AP-195 documented).

Conformance: FilterRows/FilterBlocks pinned against the byte-verified
authored order and ChatWindowState's own default constants; the AP-195
LED swap and self-sizing behavior; the DAT opacity-default extraction
against the live installed DAT; live filter/opacity writes reaching
ChatWindowState/RetailWindowOpacityController; OnShown re-seed and
Reset/Defaults ghosting per the OP4 binding-pattern discipline.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-11 06:25:59 +02:00
parent 4798302226
commit e71e5a9614
52 changed files with 4540 additions and 40 deletions

View file

@ -623,6 +623,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -705,6 +707,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1124,6 +1128,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1206,6 +1212,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1288,6 +1296,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1380,6 +1390,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1462,6 +1474,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1544,6 +1558,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1626,6 +1642,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1708,6 +1726,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1831,6 +1851,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1895,6 +1917,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2018,6 +2042,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2112,6 +2138,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3311,11 +3339,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435474
},
{
@ -3741,6 +3773,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3840,6 +3874,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3939,11 +3975,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4160,6 +4200,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4376,16 +4418,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4509,6 +4557,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4603,6 +4653,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4726,6 +4778,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5469,11 +5523,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6525,6 +6583,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6588,11 +6648,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6961,11 +7025,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7060,6 +7128,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7479,6 +7549,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7898,6 +7970,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7980,10 +8054,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}