fix(chargen): Campaign CC gate round 1 re-test 3 — R4-1..R4-4
Four visual residuals from the lead's own live-client captures of 1.0.2-cc.m, all root-caused via decomp + live-DAT evidence: - R4-1: Skills credits value overlapped mid-caption again. Root cause was a missing UiLayoutPolicy raw-edge reflow on UiButton's value-child rect (the child is base-inherited across four sibling buttons of differing widths, so its baked-in OriginalParentWidth diverges from the actual 231px-wide Skills credits button) plus an HJustify.Right value child mapped to Center instead of a real far-edge Right. - R4-2: the single-sprite scrollbar thumb tiled (GL_REPEAT) instead of drawing once — DrawTiled was reused for a small fixed marker graphic whose native size is far smaller than the track-proportional thumb rect. New DrawThumbMarker draws exactly one native-size instance. - R4-3: the skills info-box formula line clipped past the surrounding gold frame's own authored bottom edge (the pane's own raw box is 20px taller than the frame that visually contains it) — clamp the pane's Height to the frame's bottom (register AD-105, since retail's ShowSkillsText has no code relationship to the frame to cite). - R4-4: the Appearance help text started mid-sentence — the box was never touched by its page controller, so it kept UiText's chat-style PreserveEndOnLayout=true default; the scroll model's wasAtEnd check is vacuously true on its first-ever overflow transition, pinning the first render to the bottom. Set PreserveEndOnLayout=false (a static top-oriented report, not a transcript) and wired the box's own nested authored scrollbar, never wired before. App suite live-DAT env 5372/3 -> 5379/3 (+7, zero regressions). Runtime 1735/0 unchanged. Full solution 14585/4 skips/1 failure (the documented Core.Net NakEmission full-solution-only flake, confirmed standalone-pass). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
28704db4bf
commit
e6acb800cc
11 changed files with 678 additions and 12 deletions
|
|
@ -341,8 +341,46 @@ internal sealed class CharacterCreationSkillsPage : IDisposable
|
|||
infoTitle.VerticalJustify = VJustify.Top;
|
||||
if (_infoText is { } infoText)
|
||||
infoText.VerticalJustify = VJustify.Top;
|
||||
|
||||
// R4-3 (Campaign CC gate round 1 re-test 3): the description pane's
|
||||
// own raw box (0x100003fc, Y=460 H=100 -> bottom Y=560, live-DAT-
|
||||
// measured) extends 20px PAST the bottom of the gold decorative
|
||||
// frame that visually contains BOTH info panes (0x100003fa, Y=430
|
||||
// H=110 -> bottom Y=540, the SAME GF-12 corner/edge sprite family
|
||||
// Batch C un-consumed — 0x100002de-e3/0x100000e8/0xea). Retail's own
|
||||
// ShowSkillsText @0x00481250 has NO code relationship between the
|
||||
// text panes and this frame (SetText only; no clip/size handoff),
|
||||
// and the frame's 8 children carry no dat property linking them to
|
||||
// 0x100003fc either — so the frame's own geometry is the only
|
||||
// authored ground truth for "the visible box," and this port's
|
||||
// multi-line clip (UiText.DrawText's own PushClip(0,0,Width,Height))
|
||||
// was using the WRONG (larger, unbounded) Height, letting a long
|
||||
// skill's formula line draw into blank page space below the frame's
|
||||
// own border instead of being contained by it. Clamped to the
|
||||
// frame's own bottom edge (never grows it — additive, defensive if a
|
||||
// future dat re-extract makes the frame taller than the pane).
|
||||
// Scoped exactly like the VJustify.Top correction above: this is
|
||||
// NOT the client-wide "does a text pane's clip account for a
|
||||
// sibling decorative frame" mechanism (no evidence any other pane in
|
||||
// this codebase has the SAME independently-authored-taller-than-its-
|
||||
// frame shape), so a general import-time fix is unwarranted here.
|
||||
if (_infoText is { } clampedInfoText
|
||||
&& UiElement.FindDescendant(pageRoot, InfoBoxFrameElementId) is { } frame)
|
||||
{
|
||||
float frameBottom = frame.Top + frame.Height;
|
||||
float paneBottom = clampedInfoText.Top + clampedInfoText.Height;
|
||||
if (frameBottom < paneBottom)
|
||||
clampedInfoText.Height = frameBottom - clampedInfoText.Top;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The gold decorative frame (Type 12, 8 sprite children — the SAME
|
||||
/// GF-12 corner/edge family) that visually contains BOTH info panes
|
||||
/// (<c>0x100003fb</c>/<c>0x100003fc</c>) — see the R4-3 clamp above.
|
||||
/// </summary>
|
||||
private const uint InfoBoxFrameElementId = 0x100003FAu;
|
||||
|
||||
internal void Refresh(
|
||||
IRuntimeCharacterCreationView view,
|
||||
RuntimeCharacterCreationSnapshot snapshot)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue