more previously-undocumented client behaviors

This commit is contained in:
Martin Michelsen
2022-07-07 00:45:55 -07:00
parent 2394a330ff
commit 070db173dd
2 changed files with 22 additions and 9 deletions
+1
View File
@@ -20,6 +20,7 @@ Current known issues / missing features:
- Patches currently are platform-specific but not version-specific. This makes them quite a bit harder to write and use properly. - Patches currently are platform-specific but not version-specific. This makes them quite a bit harder to write and use properly.
- Find a way to silence audio in RunDOL.s. Some old DOLs don't reset audio systems at load time and it's annoying to hear the crash buzz when the GC hasn't actually crashed. - Find a way to silence audio in RunDOL.s. Some old DOLs don't reset audio systems at load time and it's annoying to hear the crash buzz when the GC hasn't actually crashed.
- Implement private and overflow lobbies. - Implement private and overflow lobbies.
- Enforce client-side size limits (e.g. for 60/62 commands) on the server side as well. (For 60/62 specifically, perhaps transform them to 6C/6D if needed.)
## Usage ## Usage
+21 -9
View File
@@ -555,7 +555,7 @@ struct S_ReconnectSplit_19 {
parray<uint8_t, 0xB0 - 0x23> unused2; parray<uint8_t, 0xB0 - 0x23> unused2;
}; };
// 1A: Large message box // 1A (S->C): Large message box
// On V3 (PSO GC), client will usually respond with a D6 command (see D6 for // On V3 (PSO GC), client will usually respond with a D6 command (see D6 for
// more information). // more information).
// Contents are plain text (char on DC/GC, char16_t on PC/BB). There must be at // Contents are plain text (char on DC/GC, char16_t on PC/BB). There must be at
@@ -566,8 +566,8 @@ struct S_ReconnectSplit_19 {
// The maximum length of the message is 0x400 bytes. This is the only difference // The maximum length of the message is 0x400 bytes. This is the only difference
// between this command and the D5 command. // between this command and the D5 command.
// 1B: Valid but ignored (PC/GC) // 1B (S->C): Valid but ignored (PC/GC)
// 1C: Valid but ignored (PC/GC) // 1C (S->C): Valid but ignored (PC/GC)
// 1D: Ping // 1D: Ping
// No arguments // No arguments
@@ -693,6 +693,8 @@ struct S_GuildCardSearchResult_BB_41 : S_GuildCardSearchResult<PSOCommandHeaderB
// 44 (S->C): Open file for download // 44 (S->C): Open file for download
// Used for downloading online quests. For download quests (to be saved to the // Used for downloading online quests. For download quests (to be saved to the
// memory card), use A6 instead. // memory card), use A6 instead.
// Unlike the A6 command, the client will react to a 44 command only if the
// filename ends in .bin or .dat.
struct S_OpenFile_PC_GC_44_A6 { struct S_OpenFile_PC_GC_44_A6 {
ptext<char, 0x20> name; ptext<char, 0x20> name;
@@ -1239,7 +1241,10 @@ struct C_LoginExtended_BB_9E {
// No arguments // No arguments
// 9F (C->S): Client config / security data response // 9F (C->S): Client config / security data response
// Format is ClientConfig on GC, or ClientConfigBB on BB // The data is opaque to the client, as described at the top of this file.
// If newserv ever sent a 9F command (it currently does not), the response
// format here would be ClientConfig (0x20 bytes) on GC, or ClientConfigBB (0x28
// bytes) on BB.
// A0 (C->S): Change ship // A0 (C->S): Change ship
// This structure is for documentation only; newserv ignores the arguments here. // This structure is for documentation only; newserv ignores the arguments here.
@@ -1300,15 +1305,21 @@ struct S_QuestMenuEntry_BB_A2_A4 {
// Same format as 1A/D5 command (plain text) // Same format as 1A/D5 command (plain text)
// A6: Open file for download // A6: Open file for download
// Used for download quests and GBA games.
// Same format as 44. // Same format as 44.
// Used for download quests and GBA games. The client will react to this command
// if the filename ends in .bin/.dat (download quests), .gba (GameBoy Advance
// games), and, curiously, .pvr (textures). To my knowledge, the .pvr handler in
// this command has never been used.
// For .bin files, the flags field should be zero. For .pvr files, the flags
// field should be 1. For .dat and .gba files, it seems the value in the flags
// field does not matter.
// A7: Write download file // A7: Write download file
// Same format as 13. // Same format as 13.
// A8: Invalid command // A8: Invalid command
// A9: Quest menu closed (canceled) // A9 (C->S): Quest menu closed (canceled)
// No arguments // No arguments
// This command is sent when the in-game quest menu (A2) is closed. When the // This command is sent when the in-game quest menu (A2) is closed. When the
// download quest menu is closed, either by downloading a quest or canceling, // download quest menu is closed, either by downloading a quest or canceling,
@@ -1333,7 +1344,8 @@ struct C_UpdateQuestStatistics_AA {
}; };
// AB (S->C): Confirm update quest statistics // AB (S->C): Confirm update quest statistics
// TODO: Does this command have a different meaning in Episode 3? // TODO: Does this command have a different meaning in Episode 3? Is it used at
// all there, or is the handler an undeleted vestige from Episodes 1&2?
struct S_ConfirmUpdateQuestStatistics_AB { struct S_ConfirmUpdateQuestStatistics_AB {
le_uint16_t unknown_a1; // 0 le_uint16_t unknown_a1; // 0
@@ -1356,7 +1368,7 @@ struct S_ConfirmUpdateQuestStatistics_AB {
// AE: Invalid command // AE: Invalid command
// AF: Invalid command // AF: Invalid command
// B0: Text message // B0 (S->C): Text message
// Same format as 01 command. // Same format as 01 command.
// The message appears as an overlay on the right side of the screen. The player // The message appears as an overlay on the right side of the screen. The player
// doesn't do anything to dismiss it; it will disappear after a few seconds. // doesn't do anything to dismiss it; it will disappear after a few seconds.
@@ -1933,7 +1945,7 @@ struct C_CardLobbyGame_GC_E4 {
le_uint16_t seat_number; le_uint16_t seat_number;
}; };
// Header flag = 2 // Header flag = table number
struct S_CardLobbyGame_GC_E4 { struct S_CardLobbyGame_GC_E4 {
struct Entry { struct Entry {
le_uint16_t present; // 1 = player present, 0 = no player le_uint16_t present; // 1 = player present, 0 = no player