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

@ -169,6 +169,38 @@ public sealed class RetailActionMapReaderTests
Assert.Empty(row.DefaultBindings);
}
[Fact]
public void Read_PreservesRetailInputMapConflictPolicy()
{
var actionMap = new ActionMap
{
InputMaps = new Dictionary<uint, Dictionary<uint, ActionMapValue>>(),
ConflictingMaps = new Dictionary<uint, InputsConflictsValue>
{
[0x10000003u] = new InputsConflictsValue
{
InputMap = 0x10000003u,
ConflictingInputMaps = new List<uint>
{
0x10000003u,
0x10000002u,
},
},
},
};
var dats = new FakeDatObjectSource();
dats.Add(RetailActionMapIds.ActionMapId, actionMap);
RetailActionMapSnapshot snapshot = Assert.IsType<RetailActionMapSnapshot>(
RetailActionMapReader.Read(dats));
Assert.True(snapshot.InputMapsConflict(0x10000003u, 0x10000003u));
Assert.True(snapshot.InputMapsConflict(0x10000003u, 0x10000002u));
Assert.False(snapshot.InputMapsConflict(0x10000003u, 0x10000004u));
Assert.True(snapshot.InputMapsConflict(0xDEADBEEFu, 0xDEADBEEFu));
Assert.False(snapshot.InputMapsConflict(0xDEADBEEFu, 0x10000003u));
}
[Fact]
public void RetailInputMapHeaders_HasAllNineteenByteVerifiedEntries()
{
@ -245,5 +277,12 @@ public sealed class RetailActionMapReader_LiveDatTests
Assert.Equal(2, moveForward.DefaultBindings.Count);
Assert.Contains(moveForward.DefaultBindings, c => c.Scan == 0x11u); // DIK_W
Assert.Contains(moveForward.DefaultBindings, c => c.Scan == 0xC8u); // DIK_UPARROW
// The authored combat modes intentionally share the five attack/aim
// keys. Retail's conflict table keeps those mode-local contexts apart;
// Configure Keyboard must not erase one mode while editing another.
Assert.False(snapshot.InputMapsConflict(0x10000003u, 0x10000004u));
Assert.False(snapshot.InputMapsConflict(0x10000003u, 0x10000005u));
Assert.False(snapshot.InputMapsConflict(0x10000004u, 0x10000005u));
}
}