fix(chargen): Campaign CC gate round 1 re-test 2 — R3-3 skills info-box VerticalJustify
The info-box title (0x100003fb, Y=435 H=100) and description (0x100003fc, Y=460 H=100) panes' own authored boxes overlap by 75px, live-DAT-measured — retail relies on vertical justification, not disjoint rects, to keep them visually separate. Neither pane authors dat property 0x15, so both fall to this port's shared unauthored-VJustify default (currently Center). Byte-traced retail's real ctor default (UIElement_Text::UIElement_Text @0x004685ff, m_eVerticalJustification = 4) against UIElement_Text:: CalcJustification @0x00467260's actual enum semantics (1=Center, 3-or-5= the far edge/Bottom, anything else INCLUDING the ctor's own default of 4 = the near edge/Top): the correct unauthored default is Top, not Center — a genuine client-wide enum-mapping bug in this port. Under Top both panes render near their own box's top edge (25px apart, no collision); under Center both cluster toward the middle of their overlapping boxes. Scoped fix: CharacterCreationSkillsPage force-sets VerticalJustify=Top on both panes directly, rather than fixing the shared mapping/default — that bug is client-wide and could regress already-shipped FROZEN surfaces (vitals, chat, main game UI, Options) that may rely on the current Center default. The shared fix is filed as ISSUES #410 / register AD-104 for its own dedicated investigation + regression sweep. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
7d6a7898f6
commit
7f6e93033f
4 changed files with 143 additions and 1 deletions
|
|
@ -305,6 +305,42 @@ internal sealed class CharacterCreationSkillsPage : IDisposable
|
|||
_credits = UiElement.FindDescendant(pageRoot, 0x100003F9u) as UiButton;
|
||||
_infoTitle = UiElement.FindDescendant(pageRoot, 0x100003FBu) as UiText;
|
||||
_infoText = UiElement.FindDescendant(pageRoot, 0x100003FCu) as UiText;
|
||||
|
||||
// R3-3 (Campaign CC gate round 1 re-test 2): the title
|
||||
// (0x100003fb, Y=435, Height=100) and description (0x100003fc,
|
||||
// Y=460, Height=100) panes' own AUTHORED boxes overlap by 75px
|
||||
// (live-DAT-measured) — retail relies on vertical JUSTIFICATION,
|
||||
// not disjoint rects, to keep the two visually separate. Neither
|
||||
// element authors dat property 0x15 (live-DAT-probe-confirmed
|
||||
// absent on both), so both fall to whatever the unauthored default
|
||||
// resolves to. Byte-traced against retail's own
|
||||
// UIElement_Text::UIElement_Text ctor @0x004685ff
|
||||
// (this->m_eVerticalJustification = 4) cross-referenced with
|
||||
// UIElement_Text::CalcJustification @0x00467260 (the ACTUAL
|
||||
// enum semantics: ecx_5==1 -> Center, ecx_5==3||5 -> the FAR edge
|
||||
// (Bottom), any other value including the ctor's own default of 4
|
||||
// -> edi=0, the NEAR edge, i.e. Top): the correct unauthored
|
||||
// default is TOP, not Center. This port's shared
|
||||
// ElementReader/DatWidgetFactory VJustify mapping and field
|
||||
// default both currently resolve an absent 0x15 to Center — a
|
||||
// client-wide mismatch with real retail semantics that is NOT
|
||||
// fixed here (filed as ISSUES.md #410; the blast radius spans
|
||||
// every already-shipped DAT-imported UiText that relies on the
|
||||
// CURRENT Center default, so a global remap needs its own
|
||||
// dedicated investigation + regression sweep, not a bundled
|
||||
// fix inside this page). Scoped correction: force these two
|
||||
// specific panes to the value retail's ctor actually resolves
|
||||
// to. Under Top justification the title (OneLine, ~1 line) sits
|
||||
// near its box's own top (global Y~435) and the description
|
||||
// (multi-line, honoring the SAME justification via
|
||||
// ConfigureDatState's _honorDatVerticalJustification) starts near
|
||||
// ITS box's own top (global Y~460) — the two boxes' TOP edges are
|
||||
// 25px apart, so short/typical content no longer collides even
|
||||
// though the boxes' full 100px extents still overlap on paper.
|
||||
if (_infoTitle is { } infoTitle)
|
||||
infoTitle.VerticalJustify = VJustify.Top;
|
||||
if (_infoText is { } infoText)
|
||||
infoText.VerticalJustify = VJustify.Top;
|
||||
}
|
||||
|
||||
internal void Refresh(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue