fix(D.2b): do NOT register Type 3 -> UiField (review fix for Task 6)
Task 6 registered Type 3 -> UiField globally, which broke acdream's Type-3 dat elements: in these layouts Type 3 is sprite-bearing CHROME (the 8-piece bevel corners, e.g. vitals 0x10000633 -> sprite 0x060074C3) and the transcript/input CONTAINER panels — NOT editable fields. UiField draws no dat sprite, so the vitals bevel corners would render empty; the regression was masked by weakening VitalsTree_ChromeCornerHasExpectedSprite (UiDatElement+sprite -> UiField+exists). Retail Type 3 IS UIElement_Field, but retail draws those chrome elements as inert media-bearing Fields, which our UiDatElement reproduces pixel-for-pixel without a spurious focus/edit affordance. The one true editable field — the chat input 0x10000016 — resolves to Type 12 and is controller-placed as a UiField (Variant B, kept). So Type 3 stays on the generic fallback; register it as UiField only when a window carries a factory-built editable Type-3 field (and UiField grows a background-media draw + an opt-in editable flag then). Restored the chrome-corner conformance test (asserts UiDatElement + sprite, an early warning if Type 3 is ever wrongly routed to UiField). Kept the good Task-6 work: UiField rename + the Variant-B input wiring (stray Type-12 placeholder removed). Full suite: 404 passed, 2 skipped, 0 failed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
e059a3f6ef
commit
ee2e0fafa0
3 changed files with 35 additions and 18 deletions
|
|
@ -49,15 +49,25 @@ public static class DatWidgetFactory
|
|||
public static UiElement? Create(ElementInfo info,
|
||||
Func<uint, (uint, int, int)> resolve, UiDatFont? datFont)
|
||||
{
|
||||
// Retail Type 3 = UIElement_Field (reg :126190), but in acdream's CURRENT layouts
|
||||
// (vitals 0x2100006C / chat 0x21000006) Type-3 elements are sprite-bearing chrome +
|
||||
// containers (the 8-piece bevel corners/edges, the transcript/input panels), NOT
|
||||
// editable fields — retail draws those as inert media-bearing Fields, which our
|
||||
// UiDatElement reproduces pixel-for-pixel (and without the spurious focus/edit
|
||||
// affordance a UiField would add). The one true editable field, the chat input
|
||||
// (0x10000016), resolves to Type 12 and is controller-placed as a UiField. So Type 3
|
||||
// stays on the generic fallback here; register it as UiField only when a window
|
||||
// actually carries a factory-built editable Type-3 field (and UiField grows a
|
||||
// background-media draw + an opt-in editable flag at that point). UiField (the widget)
|
||||
// still ships — it just isn't wired into the factory switch yet.
|
||||
UiElement e = info.Type switch
|
||||
{
|
||||
1 => new UiButton(info, resolve), // UIElement_Button (reg :125828)
|
||||
3 => new UiField(), // UIElement_Field (reg :126190)
|
||||
6 => new UiMenu(), // UIElement_Menu (reg :120163)
|
||||
7 => BuildMeter(info, resolve, datFont), // UIElement_Meter
|
||||
11 => new UiScrollbar(), // UIElement_Scrollbar (reg :124137)
|
||||
12 => BuildText(info, resolve), // UIElement_Text (reg :115655)
|
||||
_ => new UiDatElement(info, resolve), // generic fallback for all other types
|
||||
_ => new UiDatElement(info, resolve), // generic fallback (incl. Type 3 chrome/containers)
|
||||
};
|
||||
|
||||
// Propagate position + size (pixel-exact from the dat).
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue