fix(chargen): Campaign CC gate round 1 re-test 2 — R3-4/R3-7 scrollbar thumb

Retail authors TWO distinct UIElement_Scrollbar thumb shapes.
DatWidgetFactory.BuildScrollbar's existing vertical-thumb detection was
built against chat's own scrollbar (0x10000012) — a 3-slice composite
where the thumb child carries no media of its own and three Type-3
grandchildren supply the top-cap/middle/bottom-cap sprites. The chargen
Skills listbox scrollbar (0x100003f8), Summary's OVERVIEW listbox
scrollbar (0x10000401), the Summary how-to box's scrollbar (0x100002e7),
and the shade slider (0x10000321) all instead author a SIMPLE
single-sprite thumb: the same structural child (Type 1, id 1, not the
inc/dec button) carries its OWN direct media and has ZERO children — the
3-slice-only search found nothing for this shape, so every Thumb*Sprite
stayed 0 regardless of overflow.

Fixed by falling back to the thumb's own DefaultImage when the slice
search finds nothing — additive; a thumb WITH real slice children (chat)
is unaffected. This one fix covers R3-4's three listbox thumbs, R3-7, and
— as a natural consequence of the same structural shape — the shade-slider
indicator half of R3-5(c); no separate fix was needed there.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-16 17:20:16 +02:00
parent 7f6e93033f
commit c9313edc63
2 changed files with 128 additions and 0 deletions

View file

@ -315,6 +315,31 @@ public static class DatWidgetFactory
if (slices.Length > 0) bar.ThumbTopSprite = DefaultImage(slices[0]);
if (slices.Length > 1) bar.ThumbSprite = DefaultImage(slices[1]);
if (slices.Length > 2) bar.ThumbBotSprite = DefaultImage(slices[^1]);
// R3-4/R3-7 (Campaign CC gate round 1 re-test 2): retail authors
// TWO distinct thumb shapes for UIElement_Scrollbar (Type 11) —
// chat's own scrollbar (0x10000012) is the 3-slice composite the
// block above was built against (the thumb CHILD carries no media
// of its own; three Type-3 grandchildren supply the top-cap/
// middle/bottom-cap sprites) — but the chargen Skills listbox
// (0x100003f8), Summary's OVERVIEW listbox (0x10000401), and the
// Summary how-to box (0x100002e7 under 0x10000404) all author a
// SIMPLE single-sprite thumb instead: the SAME structural child
// (Type 1, id 1, not the inc/dec button) carries its OWN direct
// Normal/Normal_rollover/Normal_pressed media and has ZERO
// children (live-DAT-probe-confirmed against all three — no
// slice grandchildren to find, so `slices` above is always
// empty for this shape and every Thumb*Sprite stayed 0,
// matching the reported "track+arrows render, no thumb"
// symptom). <see cref="UiScrollbar.OnDraw"/> already falls back
// to a single tiled `ThumbSprite` blit when the cap sprites are
// unset (`ThumbTopSprite != 0 && ThumbBotSprite != 0` gate), so
// the only missing piece is feeding it the thumb's OWN media
// when it has no slice children — additive: a thumb WITH real
// slice children (chat) is unaffected since `slices.Length == 0`
// is false for that shape.
if (slices.Length == 0)
bar.ThumbSprite = DefaultImage(thumb);
}
return bar;