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:
Erik 2026-08-16 17:20:08 +02:00
parent 7d6a7898f6
commit 7f6e93033f
4 changed files with 143 additions and 1 deletions

View file

@ -433,6 +433,30 @@ public sealed class CharacterCreationUiControllerTests
JoinedText(environment.SkillInfoText()));
}
/// <summary>
/// R3-3 (Campaign CC gate round 1 re-test 2): the info-box title and
/// description panes' own AUTHORED boxes overlap by 75px (live-DAT-
/// measured, see <see cref="CharacterCreationSkillsPage"/>'s
/// constructor comment for the full geometry + decomp citation) —
/// retail avoids the visual collision via vertical justification, not
/// disjoint rects. Pins that the page forces both panes to Top so the
/// title sits near ITS box's own top and the description sits near
/// its own, instead of both clustering toward the middle of their
/// overlapping boxes under the shared (currently wrong, ISSUES #410)
/// Center default.
/// </summary>
[Fact]
public void SkillsPage_InfoBoxPanes_ForceTopVerticalJustify_ToAvoidTitleDescriptionOverlap()
{
using var environment = new EnvironmentHarness();
environment.Controller.Open();
environment.Runtime.SelectHeritageDirect(AluvianId);
environment.TabButton(CharacterCreationUiController.SkillsTabElementId).OnClick!();
Assert.Equal(VJustify.Top, environment.SkillInfoTitle().VerticalJustify);
Assert.Equal(VJustify.Top, environment.SkillInfoText().VerticalJustify);
}
/// <summary>R2-4a: retail re-selects the row after an arrow click too
/// (<c>ListenToElementMessage @0x004814c0</c>'s own
/// <c>SetSelectedItem(...,1)</c> call following