fix: complete retail parity stability pass
This commit is contained in:
parent
d3df4cb20a
commit
f7aa8e0eb7
131 changed files with 7765 additions and 1190 deletions
|
|
@ -17,6 +17,20 @@ public sealed class ClientCommandRequestsTests
|
|||
{ ClientCommandRequests.BuildClearFriends, ClientCommandRequests.ClearFriendsOpcode },
|
||||
{ ClientCommandRequests.BuildClearConsent, ClientCommandRequests.ClearConsentOpcode },
|
||||
{ ClientCommandRequests.BuildDisplayConsent, ClientCommandRequests.DisplayConsentOpcode },
|
||||
{ ClientCommandRequests.BuildQueryAllegianceName, 0x0030u },
|
||||
{ ClientCommandRequests.BuildClearAllegianceName, 0x0031u },
|
||||
{ ClientCommandRequests.BuildListAllegianceOfficerTitles, 0x003Du },
|
||||
{ ClientCommandRequests.BuildClearAllegianceOfficerTitles, 0x003Eu },
|
||||
{ ClientCommandRequests.BuildListAllegianceBans, 0x02A3u },
|
||||
{ ClientCommandRequests.BuildListAllegianceOfficers, 0x02A6u },
|
||||
{ ClientCommandRequests.BuildClearAllegianceOfficers, 0x02A7u },
|
||||
{ ClientCommandRequests.BuildQueryMotd, 0x0255u },
|
||||
{ ClientCommandRequests.BuildClearMotd, 0x0256u },
|
||||
{ ClientCommandRequests.BuildRemoveAllPermanentGuests, 0x025Eu },
|
||||
{ ClientCommandRequests.BuildAddAllStoragePermission, 0x025Cu },
|
||||
{ ClientCommandRequests.BuildRemoveAllStoragePermission, 0x024Cu },
|
||||
{ ClientCommandRequests.BuildRequestFullGuestList, 0x024Du },
|
||||
{ ClientCommandRequests.BuildBootEveryone, 0x025Fu },
|
||||
};
|
||||
|
||||
[Theory]
|
||||
|
|
@ -70,6 +84,15 @@ public sealed class ClientCommandRequestsTests
|
|||
{ ClientCommandRequests.BuildSoulEmote, ClientCommandRequests.SoulEmoteOpcode },
|
||||
{ ClientCommandRequests.BuildAddFriend, ClientCommandRequests.AddFriendOpcode },
|
||||
{ ClientCommandRequests.BuildRemoveConsent, ClientCommandRequests.RemoveConsentOpcode },
|
||||
{ ClientCommandRequests.BuildAddAllegianceBan, 0x02A1u },
|
||||
{ ClientCommandRequests.BuildRemoveAllegianceBan, 0x02A2u },
|
||||
{ ClientCommandRequests.BuildRemoveAllegianceOfficer, 0x02A5u },
|
||||
{ ClientCommandRequests.BuildSetAllegianceName, 0x0033u },
|
||||
{ ClientCommandRequests.BuildSetAllegianceApprovedVassal, 0x0040u },
|
||||
{ ClientCommandRequests.BuildSetMotd, 0x0254u },
|
||||
{ ClientCommandRequests.BuildAddPermanentGuest, 0x0245u },
|
||||
{ ClientCommandRequests.BuildRemovePermanentGuest, 0x0246u },
|
||||
{ ClientCommandRequests.BuildBootSpecificHouseGuest, 0x024Au },
|
||||
};
|
||||
|
||||
[Theory]
|
||||
|
|
@ -98,6 +121,94 @@ public sealed class ClientCommandRequestsTests
|
|||
Assert.Equal(1u, Read(body, 12));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(0x003Fu, 6u)]
|
||||
[InlineData(0x0042u, 5u)]
|
||||
public void AllegianceAction_PreservesRetailUInt32Payload(
|
||||
uint expectedOpcode,
|
||||
uint action)
|
||||
{
|
||||
byte[] body = expectedOpcode == 0x003Fu
|
||||
? ClientCommandRequests.BuildAllegianceLockAction(12u, action)
|
||||
: ClientCommandRequests.BuildAllegianceHouseAction(12u, action);
|
||||
|
||||
Assert.Equal(16, body.Length);
|
||||
Assert.Equal(expectedOpcode, Read(body, 8));
|
||||
Assert.Equal(action, Read(body, 12));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(0x0247u)]
|
||||
[InlineData(0x0266u)]
|
||||
[InlineData(0x0267u)]
|
||||
[InlineData(0x0268u)]
|
||||
public void HouseBooleanAction_UsesRetailOneOrZeroPayload(uint expectedOpcode)
|
||||
{
|
||||
byte[] enabled = expectedOpcode switch
|
||||
{
|
||||
0x0247u => ClientCommandRequests.BuildSetOpenHouseStatus(13u, true),
|
||||
0x0266u => ClientCommandRequests.BuildSetHooksVisibility(13u, true),
|
||||
0x0267u => ClientCommandRequests.BuildModifyAllegianceGuestPermission(13u, true),
|
||||
_ => ClientCommandRequests.BuildModifyAllegianceStoragePermission(13u, true),
|
||||
};
|
||||
|
||||
Assert.Equal(16, enabled.Length);
|
||||
Assert.Equal(expectedOpcode, Read(enabled, 8));
|
||||
Assert.Equal(1u, Read(enabled, 12));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AllegianceStringBooleanActions_PreserveStringThenUInt32Order()
|
||||
{
|
||||
byte[] boot = ClientCommandRequests.BuildBreakAllegianceBoot(
|
||||
14u, "Bjørn", accountBoot: true);
|
||||
byte[] gag = ClientCommandRequests.BuildAllegianceChatGag(
|
||||
15u, "Bjørn", enabled: false);
|
||||
byte[] storage = ClientCommandRequests.BuildChangeStoragePermission(
|
||||
16u, "Bjørn", enabled: true);
|
||||
|
||||
AssertStringThenUInt32(boot, 0x0277u, 1u);
|
||||
AssertStringThenUInt32(gag, 0x0041u, 0u);
|
||||
AssertStringThenUInt32(storage, 0x0249u, 1u);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SetAllegianceOfficer_PreservesNameThenLevelOrder()
|
||||
{
|
||||
byte[] body = ClientCommandRequests.BuildSetAllegianceOfficer(
|
||||
17u, "Bjørn", 3u);
|
||||
|
||||
AssertStringThenUInt32(body, 0x003Bu, 3u);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SetAllegianceOfficerTitle_PreservesLevelThenTitleOrder()
|
||||
{
|
||||
byte[] body = ClientCommandRequests.BuildSetAllegianceOfficerTitle(
|
||||
18u, 2u, "Marshal");
|
||||
|
||||
Assert.Equal(28, body.Length);
|
||||
Assert.Equal(0x003Cu, Read(body, 8));
|
||||
Assert.Equal(2u, Read(body, 12));
|
||||
Assert.Equal(7, BinaryPrimitives.ReadUInt16LittleEndian(body.AsSpan(16)));
|
||||
Assert.Equal("Marshal"u8.ToArray(), body[18..25]);
|
||||
Assert.Equal([0, 0, 0], body[25..28]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AllegianceChatBoot_PreservesTwoAlignedString16LFields()
|
||||
{
|
||||
byte[] body = ClientCommandRequests.BuildAllegianceChatBoot(
|
||||
19u, "Bob", "No.");
|
||||
|
||||
Assert.Equal(28, body.Length);
|
||||
Assert.Equal(0x02A0u, Read(body, 8));
|
||||
Assert.Equal(3, BinaryPrimitives.ReadUInt16LittleEndian(body.AsSpan(12)));
|
||||
Assert.Equal("Bob"u8.ToArray(), body[14..17]);
|
||||
Assert.Equal(3, BinaryPrimitives.ReadUInt16LittleEndian(body.AsSpan(20)));
|
||||
Assert.Equal("No."u8.ToArray(), body[22..25]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FriendAndGlobalSquelchIntegerActions_MatchRetailPayloads()
|
||||
{
|
||||
|
|
@ -191,4 +302,17 @@ public sealed class ClientCommandRequestsTests
|
|||
|
||||
private static uint Read(byte[] body, int offset) =>
|
||||
BinaryPrimitives.ReadUInt32LittleEndian(body.AsSpan(offset));
|
||||
|
||||
private static void AssertStringThenUInt32(
|
||||
byte[] body,
|
||||
uint expectedOpcode,
|
||||
uint expectedValue)
|
||||
{
|
||||
Assert.Equal(24, body.Length);
|
||||
Assert.Equal(expectedOpcode, Read(body, 8));
|
||||
Assert.Equal(5, BinaryPrimitives.ReadUInt16LittleEndian(body.AsSpan(12)));
|
||||
Assert.Equal([0x42, 0x6A, 0xF8, 0x72, 0x6E], body[14..19]);
|
||||
Assert.Equal(0, body[19]);
|
||||
Assert.Equal(expectedValue, Read(body, 20));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue