fix(client): restore retail interaction parity
All checks were successful
CI / linux-portable (push) Successful in 3m27s
CI / windows-gate (push) Successful in 6m42s
CI / release (push) Successful in 2m12s

Harden keyboard and camera routing, inventory and vendor interactions, chat/emotes, relog portal flow, and paperdoll rendering. Add retail research, connected gate coverage, and release-gate validation.
This commit is contained in:
Erik 2026-08-26 20:45:11 +02:00
parent 0c699240e0
commit f6fe0f2a4f
151 changed files with 10162 additions and 1211 deletions

View file

@ -1156,6 +1156,28 @@ public class CharacterStatControllerTests
Assert.Equal(RetailUiStateIds.Open, Assert.IsAssignableFrom<IUiDatStateful>(child).ActiveRetailStateId));
}
[Fact]
public void ProgrammaticShowTab_UsesTheSameAuthoredStateAsAKeyboardAction()
{
ImportedLayout layout = FixtureLoader.LoadCharacter();
var attributes = Assert.IsType<UiText>(
layout.FindElement(CharacterStatController.TabAttribId));
var skills = Assert.IsType<UiText>(
layout.FindElement(CharacterStatController.TabSkillsId));
CharacterStatController.Binding binding = CharacterStatController.Bind(
layout,
SampleData.SampleCharacter,
spriteResolve: id => (id, 16, 16));
binding.ShowTab(CharacterStatController.CharacterStatTab.Skills);
Assert.Equal(
CharacterStatController.CharacterStatTab.Skills,
binding.CurrentTab());
Assert.Equal(RetailUiStateIds.Closed, attributes.ActiveRetailStateId);
Assert.Equal(RetailUiStateIds.Open, skills.ActiveRetailStateId);
}
/// <summary>
/// CT3 (2026-08-24): unlike Attributes/Skills (which share ONE mounted
/// page and only rebind its content), the Titles page (0x10000539) is a
@ -1267,7 +1289,7 @@ public class CharacterStatControllerTests
CharacterSheet sheet = SampleData.SampleCharacter();
Action refresh = CharacterStatController.Bind(layout, () => sheet,
spriteResolve: id => (id, 16, 16));
spriteResolve: id => (id, 16, 16)).Refresh;
ClickTab(layout, left: 92f);
var untrained = sheet.Skills.First(