update format notes from DC disassembly
This commit is contained in:
+53
-42
@@ -388,6 +388,10 @@ struct C_LegacyLogin_PC_V3_03 {
|
|||||||
// disconnected. If header.flag is nonzero, the client responds with an 04
|
// disconnected. If header.flag is nonzero, the client responds with an 04
|
||||||
// command. Curiously, it looks like even DCv1 doesn't use this command in its
|
// command. Curiously, it looks like even DCv1 doesn't use this command in its
|
||||||
// standard login sequence, so this may be a relic from very early development.
|
// standard login sequence, so this may be a relic from very early development.
|
||||||
|
// Even more curiously, DCv2 (and no other PSO version) has a behavior that
|
||||||
|
// appears to be some kind of anti-cheating mechanism: if any byte in the memory
|
||||||
|
// range 8C004000-8C007FFF is not zero, the handler for this command loops
|
||||||
|
// infinitely doing nothing.
|
||||||
// No other arguments
|
// No other arguments
|
||||||
|
|
||||||
// 03 (S->C): Start encryption (BB)
|
// 03 (S->C): Start encryption (BB)
|
||||||
@@ -514,6 +518,7 @@ struct C_Chat_06 {
|
|||||||
} __packed__;
|
} __packed__;
|
||||||
|
|
||||||
// 07 (S->C): Ship select menu
|
// 07 (S->C): Ship select menu
|
||||||
|
// Internally, PSO calls this RcvDirList.
|
||||||
|
|
||||||
// Command is a list of these; header.flag is the entry count. The first entry
|
// Command is a list of these; header.flag is the entry count. The first entry
|
||||||
// is not included in the count and does not appear on the client. The text of
|
// is not included in the count and does not appear on the client. The text of
|
||||||
@@ -583,10 +588,10 @@ struct C_MenuItemInfoRequest_09 {
|
|||||||
// 0E (S->C): Incomplete/legacy join game (non-BB)
|
// 0E (S->C): Incomplete/legacy join game (non-BB)
|
||||||
// header.flag = number of valid entries in lobby_data
|
// header.flag = number of valid entries in lobby_data
|
||||||
|
|
||||||
// DC NTE calls this command RcvStartGame. It appears to be a vestige of very
|
// Internally, PSO calls this command RcvStartGame. It appears to be a vestige
|
||||||
// early development; its second-phase handler is missing even in the earliest
|
// of very early development; its second-phase handler is missing even in the
|
||||||
// public prototype of PSO (DC NTE), and the command format is missing some
|
// earliest public prototype of PSO (DC NTE), and the command format is missing
|
||||||
// important information necessary to start a game on any version of PSO.
|
// some important information necessary to start a game on any version.
|
||||||
|
|
||||||
// There is a failure mode in the 0E command handler that causes the thread
|
// There is a failure mode in the 0E command handler that causes the thread
|
||||||
// receiving the command to loop infinitely doing nothing, effectively
|
// receiving the command to loop infinitely doing nothing, effectively
|
||||||
@@ -676,8 +681,8 @@ struct C_MenuSelection_PC_BB_10_Flag03 : C_MenuSelection_10_Flag03<char16_t> { }
|
|||||||
// corner (on V3/BB) or lower-right corner of the screen.
|
// corner (on V3/BB) or lower-right corner of the screen.
|
||||||
|
|
||||||
// 12 (S->C): Valid but ignored (all versions)
|
// 12 (S->C): Valid but ignored (all versions)
|
||||||
// In DC NTE, this command is named RcvBaner. This is possibly a misspelling of
|
// Internally, PSO calls this command RcvBaner. This is possibly a misspelling
|
||||||
// "banner", which could be an early version of the 1A/D5 (large message box)
|
// of "banner", which could be an early version of the 1A/D5 (large message box)
|
||||||
// commands, or of BB's 00EE (scrolling message) command; however, the existence
|
// commands, or of BB's 00EE (scrolling message) command; however, the existence
|
||||||
// of RcvBanerHead (16) seems to contradict this hypothesis since a text message
|
// of RcvBanerHead (16) seems to contradict this hypothesis since a text message
|
||||||
// would not require a header. Even on DC NTE, this command does nothing, so
|
// would not require a header. Even on DC NTE, this command does nothing, so
|
||||||
@@ -707,17 +712,17 @@ struct C_WriteFileConfirmation_V3_BB_13_A7 {
|
|||||||
} __packed__;
|
} __packed__;
|
||||||
|
|
||||||
// 14 (S->C): Valid but ignored (all versions)
|
// 14 (S->C): Valid but ignored (all versions)
|
||||||
// DC NTE calls this command RcvUpLoad, which seems like the logical opposite of
|
// Internally, PSO calls this command RcvUpLoad, which seems like the logical
|
||||||
// 13 (quest file download, named RcvDownLoad in DC NTE). However, even in DC
|
// opposite of 13 (quest file download, named RcvDownLoad internally). However,
|
||||||
// NTE, this command does nothing, so it must have been scrapped very early in
|
// even in DC NTE, this command does nothing, so it must have been scrapped very
|
||||||
// development.
|
// early in development.
|
||||||
|
|
||||||
// 15: Invalid command
|
// 15: Invalid command
|
||||||
|
|
||||||
// 16 (S->C): Valid but ignored (all versions)
|
// 16 (S->C): Valid but ignored (all versions)
|
||||||
// DC NTE calls this command RcvBanerHead. It's not clear what this means, but
|
// Internally, this command is named RcvBanerHead. It's not clear what this
|
||||||
// it's likely related to 12 in some way. Like 12, this command does nothing,
|
// means, but it's likely related to 12 in some way. Like 12, this command does
|
||||||
// even on DC NTE.
|
// nothing, even on DC NTE.
|
||||||
|
|
||||||
// 17 (S->C): Start encryption at login server (except on BB)
|
// 17 (S->C): Start encryption at login server (except on BB)
|
||||||
// Same format and usage as 02 command, but a different copyright string:
|
// Same format and usage as 02 command, but a different copyright string:
|
||||||
@@ -770,11 +775,11 @@ struct S_ReconnectSplit_19 {
|
|||||||
// between this command and the D5 command.
|
// between this command and the D5 command.
|
||||||
|
|
||||||
// 1B (S->C): Valid but ignored (all versions)
|
// 1B (S->C): Valid but ignored (all versions)
|
||||||
// This command is named RcvBattleData in DC NTE. It does nothing in all PSO
|
// Internally, this command is named RcvBattleData. It does nothing in all PSO
|
||||||
// versions.
|
// versions.
|
||||||
|
|
||||||
// 1C (S->C): Valid but ignored (all versions)
|
// 1C (S->C): Valid but ignored (all versions)
|
||||||
// This command is named RcvSystemFile in DC NTE. It does nothing in all PSO
|
// Internally, this command is named RcvSystemFile. It does nothing in all PSO
|
||||||
// versions.
|
// versions.
|
||||||
|
|
||||||
// 1D: Ping
|
// 1D: Ping
|
||||||
@@ -1027,9 +1032,9 @@ struct C_OpenFileConfirmation_44_A6 {
|
|||||||
// disp or inventory data. The clients in the game are responsible for sending
|
// disp or inventory data. The clients in the game are responsible for sending
|
||||||
// that data to each other during the join process with 60/62/6C/6D commands.
|
// that data to each other during the join process with 60/62/6C/6D commands.
|
||||||
|
|
||||||
// Curiously, this command is named RcvStartGame3 in DC NTE, while 0E is named
|
// Curiously, this command is named RcvStartGame3 internally, while 0E is named
|
||||||
// RcvStartGame. The string RcvStartGame2 appears in DC NTE, but it seems the
|
// RcvStartGame. The string RcvStartGame2 appears in the DC versions, but it
|
||||||
// relevant code was deleted - there are no references to the string.
|
// seems the relevant code was deleted - there are no references to the string.
|
||||||
|
|
||||||
// Header flag = entry count
|
// Header flag = entry count
|
||||||
template <typename LobbyDataT, typename DispDataT>
|
template <typename LobbyDataT, typename DispDataT>
|
||||||
@@ -1057,6 +1062,8 @@ struct S_JoinGame {
|
|||||||
uint8_t episode = 0;
|
uint8_t episode = 0;
|
||||||
// Similarly, PSO GC ignores the values in the following fields.
|
// Similarly, PSO GC ignores the values in the following fields.
|
||||||
uint8_t unused2 = 1; // Should be 1 for PSO PC?
|
uint8_t unused2 = 1; // Should be 1 for PSO PC?
|
||||||
|
// Note: Only BB uses this field; it's unused on all other versions (since
|
||||||
|
// only BB has solo mode).
|
||||||
uint8_t solo_mode = 0;
|
uint8_t solo_mode = 0;
|
||||||
uint8_t unused3 = 0;
|
uint8_t unused3 = 0;
|
||||||
} __packed__;
|
} __packed__;
|
||||||
@@ -1160,8 +1167,8 @@ struct S_LeaveLobby_66_69_Ep3_E9 {
|
|||||||
// This is sent to the joining player; the other players receive a 68 instead.
|
// This is sent to the joining player; the other players receive a 68 instead.
|
||||||
// Same format as 65 command, but used for lobbies instead of games.
|
// Same format as 65 command, but used for lobbies instead of games.
|
||||||
|
|
||||||
// Curiously, this command is named RcvStartLobby2 in DC NTE, but there is no
|
// Curiously, this command is named RcvStartLobby2 internally, but there is no
|
||||||
// command named RcvStartLobby. The string "RcvStartLobby" does appear in the
|
// command named RcvStartLobby. The string "RcvStartLobby" does appear in the DC
|
||||||
// game executable, but is not referenced anywhere.
|
// game executable, but is not referenced anywhere.
|
||||||
|
|
||||||
// 68 (S->C): Add player to lobby
|
// 68 (S->C): Add player to lobby
|
||||||
@@ -1205,14 +1212,14 @@ struct S_LeaveLobby_66_69_Ep3_E9 {
|
|||||||
// 7F: Invalid command
|
// 7F: Invalid command
|
||||||
|
|
||||||
// 80 (S->C): Valid but ignored (all versions)
|
// 80 (S->C): Valid but ignored (all versions)
|
||||||
// TODO: DC NTE calls this function RcvGenerateID and SndGenerateID, and
|
// TODO: This command is named RcvGenerateID and SndGenerateID, and PSO DC
|
||||||
// implements some logic for it. Trace this logic and figure out what it does,
|
// implements some logic for it. Trace this logic and figure out what it does,
|
||||||
// and document it here.
|
// and document it here.
|
||||||
|
|
||||||
struct S_Unknown_PC_V3_80 {
|
struct S_Unknown_PC_V3_80 {
|
||||||
le_uint32_t which = 0; // Expected to be in the range 00-0B... maybe client ID?
|
le_uint32_t client_id = 0;
|
||||||
le_uint32_t unknown_a1 = 0; // Could be player_tag
|
le_uint32_t player_tag = 0;
|
||||||
le_uint32_t unknown_a2 = 0; // Could be guild_card_number
|
le_uint32_t guild_card_number = 0;
|
||||||
} __packed__;
|
} __packed__;
|
||||||
|
|
||||||
// 81: Simple mail
|
// 81: Simple mail
|
||||||
@@ -1377,7 +1384,7 @@ struct C_LoginExtended_DCNTE_8B : C_Login_DCNTE_8B {
|
|||||||
|
|
||||||
// 8D (S->C): Request player data (DC NTE only)
|
// 8D (S->C): Request player data (DC NTE only)
|
||||||
// Behaves the same as 95 (S->C) on all other versions, but DC NTE crashes if it
|
// Behaves the same as 95 (S->C) on all other versions, but DC NTE crashes if it
|
||||||
// receives 95. This command is called RcvRecognition in the DC NTE source.
|
// receives 95.
|
||||||
|
|
||||||
// 8E: Ship select menu (DC NTE)
|
// 8E: Ship select menu (DC NTE)
|
||||||
// Behaves exactly the same as the A0 command (in both directions).
|
// Behaves exactly the same as the A0 command (in both directions).
|
||||||
@@ -1403,7 +1410,9 @@ struct C_LoginV1_DC_PC_V3_90 {
|
|||||||
// 91 (S->C): Start encryption at login server (legacy; non-BB only)
|
// 91 (S->C): Start encryption at login server (legacy; non-BB only)
|
||||||
// Same format and usage as 17 command, except the client will respond with a 90
|
// Same format and usage as 17 command, except the client will respond with a 90
|
||||||
// command. On versions that support it, this is strictly less useful than the
|
// command. On versions that support it, this is strictly less useful than the
|
||||||
// 17 command.
|
// 17 command. Curiously, this command appears to have been implemented after
|
||||||
|
// the 17 command since it's missing from the DC NTE version, but the 17 command
|
||||||
|
// is named RcvPsoRegistConnectV2 whereas 91 is simply RcvPsoRegistConnect.
|
||||||
|
|
||||||
// 92 (C->S): Register (DC)
|
// 92 (C->S): Register (DC)
|
||||||
|
|
||||||
@@ -1486,15 +1495,15 @@ struct C_Login_BB_93 {
|
|||||||
|
|
||||||
// 95 (S->C): Request player data
|
// 95 (S->C): Request player data
|
||||||
// No arguments
|
// No arguments
|
||||||
|
// Internally, PSO calls this command RcvRecognition.
|
||||||
// For some reason, some servers send high values in the header.flag field here.
|
// For some reason, some servers send high values in the header.flag field here.
|
||||||
// From what I can tell, that field appears to be completely unused by the
|
// The header.flag field is completely unused by the client, however - sending
|
||||||
// client - sending zero works just fine. The original Sega servers had some
|
// zero works just fine. The original Sega servers had some uninitialized memory
|
||||||
// uninitialized memory bugs, of which that may have been one, and other private
|
// bugs, of which that may have been one, and other private servers may have
|
||||||
// servers may have just duplicated Sega's behavior verbatim.
|
// just duplicated Sega's behavior verbatim.
|
||||||
// Client will respond with a 61 command.
|
// Client will respond with a 61 command.
|
||||||
|
|
||||||
// 96 (C->S): Character save information
|
// 96 (C->S): Character save information
|
||||||
// TODO: Check if this command exists on DC v1/v2.
|
|
||||||
|
|
||||||
struct C_CharSaveInfo_V3_BB_96 {
|
struct C_CharSaveInfo_V3_BB_96 {
|
||||||
// This field appears to be a checksum or random stamp of some sort; it seems
|
// This field appears to be a checksum or random stamp of some sort; it seems
|
||||||
@@ -1511,6 +1520,8 @@ struct C_CharSaveInfo_V3_BB_96 {
|
|||||||
|
|
||||||
// 97 (S->C): Save to memory card
|
// 97 (S->C): Save to memory card
|
||||||
// No arguments
|
// No arguments
|
||||||
|
// Internally, this command is called RcvSaveCountCheck, even though the counter
|
||||||
|
// in the 96 command (to which 97 is a reply) counts more events than saves.
|
||||||
// Sending this command with header.flag == 0 will show a message saying that
|
// Sending this command with header.flag == 0 will show a message saying that
|
||||||
// "character data was improperly saved", and will delete the character's items
|
// "character data was improperly saved", and will delete the character's items
|
||||||
// and challenge mode records. newserv (and all other unofficial servers) always
|
// and challenge mode records. newserv (and all other unofficial servers) always
|
||||||
@@ -1565,9 +1576,8 @@ struct C_Login_DC_PC_V3_9A {
|
|||||||
// 13 = servers under maintenance (118)
|
// 13 = servers under maintenance (118)
|
||||||
// Seems like most (all?) of the rest of the codes are "network error" (119).
|
// Seems like most (all?) of the rest of the codes are "network error" (119).
|
||||||
|
|
||||||
// 9B (S->C): Secondary server init (non-BB)
|
// 9B (S->C): Secondary server init (non-BB, non-DCv1)
|
||||||
// Behaves exactly the same as 17 (S->C).
|
// Behaves exactly the same as 17 (S->C).
|
||||||
// TODO: Check if this command exists on DC v1/v2.
|
|
||||||
|
|
||||||
// 9B (S->C): Secondary server init (BB)
|
// 9B (S->C): Secondary server init (BB)
|
||||||
// Format is the same as 03 (and the client uses the same encryption afterward).
|
// Format is the same as 03 (and the client uses the same encryption afterward).
|
||||||
@@ -1685,7 +1695,7 @@ struct C_LoginExtended_BB_9E {
|
|||||||
|
|
||||||
// 9F (S->C): Request client config / security data (V3/BB)
|
// 9F (S->C): Request client config / security data (V3/BB)
|
||||||
// This command is not valid on PSO GC Episodes 1&2 Trial Edition, nor any
|
// This command is not valid on PSO GC Episodes 1&2 Trial Edition, nor any
|
||||||
// pre-V3 PSO versions.
|
// pre-V3 PSO versions. Client will respond with a 9F command.
|
||||||
// No arguments
|
// No arguments
|
||||||
|
|
||||||
// 9F (C->S): Client config / security data response (V3/BB)
|
// 9F (C->S): Client config / security data response (V3/BB)
|
||||||
@@ -1831,6 +1841,7 @@ struct S_ConfirmUpdateQuestStatistics_V3_BB_AB {
|
|||||||
|
|
||||||
// B0 (S->C): Text message
|
// B0 (S->C): Text message
|
||||||
// Same format as 01 command.
|
// Same format as 01 command.
|
||||||
|
// Internally, PSO calls this command RcvEmergencyCall.
|
||||||
// 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.
|
||||||
// TODO: Check if this command exists on DC v1/v2.
|
// TODO: Check if this command exists on DC v1/v2.
|
||||||
@@ -1848,7 +1859,7 @@ struct S_ConfirmUpdateQuestStatistics_V3_BB_AB {
|
|||||||
// For example, some servers send this command every time a client joins a game.
|
// For example, some servers send this command every time a client joins a game.
|
||||||
// Client will respond with a 99 command.
|
// Client will respond with a 99 command.
|
||||||
|
|
||||||
// B2 (S->C): Execute code and/or checksum memory
|
// B2 (S->C): Execute code and/or checksum memory (DCv2 and all later versions)
|
||||||
// Client will respond with a B3 command with the same header.flag value as was
|
// Client will respond with a B3 command with the same header.flag value as was
|
||||||
// sent in the B2.
|
// sent in the B2.
|
||||||
// On PSO PC, the code section (if included in the B2 command) is parsed and
|
// On PSO PC, the code section (if included in the B2 command) is parsed and
|
||||||
@@ -2083,11 +2094,11 @@ struct S_TournamentMatchInformation_GC_Ep3_BB {
|
|||||||
// BE: Invalid command
|
// BE: Invalid command
|
||||||
// BF: Invalid command
|
// BF: Invalid command
|
||||||
|
|
||||||
// C0 (C->S): Request choice search options
|
// C0 (C->S): Request choice search options (DCv2 and later versions)
|
||||||
// No arguments
|
// No arguments
|
||||||
// Server should respond with a C0 command (described below).
|
// Server should respond with a C0 command (described below).
|
||||||
|
|
||||||
// C0 (S->C): Choice search options
|
// C0 (S->C): Choice search options (DCv2 and later versions)
|
||||||
|
|
||||||
// Command is a list of these; header.flag is the entry count (incl. top-level).
|
// Command is a list of these; header.flag is the entry count (incl. top-level).
|
||||||
template <typename ItemIDT, typename CharT>
|
template <typename ItemIDT, typename CharT>
|
||||||
@@ -2115,7 +2126,7 @@ struct S_ChoiceSearchEntry_PC_BB_C0 : S_ChoiceSearchEntry<le_uint16_t, char16_t>
|
|||||||
// 22 00 02 00 "HUnewearl"
|
// 22 00 02 00 "HUnewearl"
|
||||||
// etc.
|
// etc.
|
||||||
|
|
||||||
// C1 (C->S): Create game
|
// C1 (C->S): Create game (DCv2 and later versions)
|
||||||
|
|
||||||
template <typename CharT>
|
template <typename CharT>
|
||||||
struct C_CreateGame {
|
struct C_CreateGame {
|
||||||
@@ -2143,18 +2154,18 @@ struct C_CreateGame_BB_C1 : C_CreateGame<char16_t> {
|
|||||||
parray<uint8_t, 3> unused2;
|
parray<uint8_t, 3> unused2;
|
||||||
} __packed__;
|
} __packed__;
|
||||||
|
|
||||||
// C2 (C->S): Set choice search parameters
|
// C2 (C->S): Set choice search parameters (DCv2 and later versions)
|
||||||
// Server does not respond.
|
// Server does not respond.
|
||||||
// The ChoiceSearchConfig structure is defined in Player.hh.
|
// The ChoiceSearchConfig structure is defined in Player.hh.
|
||||||
|
|
||||||
struct C_ChoiceSearchSelections_DC_C2_C3 : ChoiceSearchConfig<le_uint32_t> { } __packed__;
|
struct C_ChoiceSearchSelections_DC_C2_C3 : ChoiceSearchConfig<le_uint32_t> { } __packed__;
|
||||||
struct C_ChoiceSearchSelections_PC_V3_BB_C2_C3 : ChoiceSearchConfig<le_uint16_t> { } __packed__;
|
struct C_ChoiceSearchSelections_PC_V3_BB_C2_C3 : ChoiceSearchConfig<le_uint16_t> { } __packed__;
|
||||||
|
|
||||||
// C3 (C->S): Execute choice search
|
// C3 (C->S): Execute choice search (DCv2 and later versions)
|
||||||
// Same format as C2. The disabled field is unused.
|
// Same format as C2. The disabled field is unused.
|
||||||
// Server should respond with a C4 command.
|
// Server should respond with a C4 command.
|
||||||
|
|
||||||
// C4 (S->C): Choice search results
|
// C4 (S->C): Choice search results (DCv2 and later versions)
|
||||||
|
|
||||||
// Command is a list of these; header.flag is the entry count
|
// Command is a list of these; header.flag is the entry count
|
||||||
struct S_ChoiceSearchResultEntry_V3_C4 {
|
struct S_ChoiceSearchResultEntry_V3_C4 {
|
||||||
@@ -2175,7 +2186,7 @@ struct S_ChoiceSearchResultEntry_V3_C4 {
|
|||||||
parray<uint8_t, 0x58> unused2;
|
parray<uint8_t, 0x58> unused2;
|
||||||
} __packed__;
|
} __packed__;
|
||||||
|
|
||||||
// C5 (S->C): Challenge rank update (V3/BB)
|
// C5 (S->C): Challenge rank update (DCv2 and later versions)
|
||||||
// header.flag = entry count
|
// header.flag = entry count
|
||||||
// The server sends this command when a player joins a lobby to update the
|
// The server sends this command when a player joins a lobby to update the
|
||||||
// challenge mode records of all the present players.
|
// challenge mode records of all the present players.
|
||||||
|
|||||||
Reference in New Issue
Block a user