diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index b2e76bf8..fc380b5e 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -444,6 +444,12 @@ struct S_UpdateClientConfig_BB_04 : S_UpdateClientConfig { }; // 06: Chat // Server->client format is same as 01 command. The maximum size of the message // is 0x200 bytes. +// When sent by the client, the text field includes only the message. When sent +// by the server, the text field includes the origin player's name, followed by +// a tab character, followed by the message. During Episode 3 battles, chat +// messages can additionally be targeted to only your teammate; in this case, +// the message (at least, when seen by spectators) is of the form +// '\t\t'.' // Client->server format is very similar; we include a zero-length array in this // struct to make parsing easier. @@ -1034,7 +1040,8 @@ struct S_JoinLobby_XB_65_67_68 { struct S_LeaveLobby_66_69_Ep3_E9 { uint8_t client_id; uint8_t leader_id; - // Note: disable_udp only has an effect for games; it is unused for lobbies. + // Note: disable_udp only has an effect for games; it is unused for lobbies + // and spectator teams. uint8_t disable_udp; uint8_t unused; }; @@ -2434,32 +2441,37 @@ struct C_CreateSpectatorTeam_GC_Ep3_E7 { // See export_bb_player_data() in Player.cc for format. // TODO: Verify full breakdown from send_E7 in BB disassembly. -// E8 (S->C): Join spectator team (probably) (Episode 3) +// E8 (S->C): Join spectator team (Episode 3) +// header.flag = player count (including spectators) -struct S_Unknown_GC_Ep3_E8 { - parray unknown_a1; +struct S_JoinSpectatorTeam_GC_Ep3_E8 { + parray variations; // 04-84 struct PlayerEntry { - PlayerLobbyDataDCGC lobby_data; - PlayerInventory inventory; - PlayerDispDataDCPCV3 disp; - }; - PlayerEntry players[4]; - parray unknown_a2; - le_uint32_t unknown_a3; - parray unknown_a4; + PlayerLobbyDataDCGC lobby_data; // 0x20 bytes + PlayerInventory inventory; // 0x34C bytes + PlayerDispDataDCPCV3 disp; // 0xD0 bytes + }; // 0x43C bytes + PlayerEntry players[4]; // 84-1174 + parray unknown_a2; // 1174-117C + le_uint32_t unknown_a3; // 117C-1180 + parray unknown_a4; // 1180-1184 struct SpectatorEntry { - // TODO: The game treats these two fields as [8][8][16][32], but that - // doesn't necessarily mean they're a player tag / guild card number pair. le_uint32_t player_tag; le_uint32_t guild_card_number; - parray unknown_a2; + ptext name; uint8_t unknown_a3[2]; le_uint16_t unknown_a4; parray unknown_a5; parray unknown_a6; - }; - SpectatorEntry entries[12]; - parray unknown_a5; + }; // 0x38 bytes + // Somewhat misleadingly, this array also includes the players actually in the + // battle - they appear in the first positions. Presumably the first 4 are + // always for battlers, and the last 8 are always for spectators. + SpectatorEntry entries[12]; // 1184-1424 + ptext spectator_team_name; + // This field doesn't appear to be actually used by the game, but some servers + // send it anyway (and the game presumably ignores it) + PlayerEntry spectator_players[8]; }; // E8 (C->S): Guild card commands (BB) @@ -2523,7 +2535,8 @@ struct C_MoveGuildCard_BB_0AE8 { }; // E9 (S->C): Other player left spectator team (probably) (Episode 3) -// Same format as 66/69 commands. +// Same format as 66/69 commands. Like 69 (and unlike 66), the disable_udp field +// is unused in command E9. // EA (S->C): Timed message box (Episode 3) // The message appears in the upper half of the screen; the box is as wide as @@ -2620,10 +2633,14 @@ struct C_Unknown_BB_1EEA { // header.flag is used, but no other arguments // EB (S->C): Unknown (Episode 3) -// Looks like another lobby-joining type of command. +// Looks like another lobby-joining type of command. Although the command has 12 +// entries, it appears the game only uses the first one. This command is +// presumably sent to existing spectators when a player joins a spectator team, +// analogous to the 65 and 68 commands for games and lobbies. +// TODO: Verify usage of this command struct S_Unknown_GC_Ep3_EB { - parray unknown_a1; + parray unused; struct PlayerEntry { PlayerLobbyDataDCGC lobby_data; PlayerInventory inventory; @@ -2675,8 +2692,8 @@ struct C_LeaveCharacterSelect_BB_00EC { // and sends them to the lobby. If the client is in a lobby (and not a game), // the client sends a 98 in response as if they were in a game. Curiously, the // client also sends a meseta transaction (BA) with a value of zero before -// sending an 84 to be added to a lobby. It's likely this is used when a -// spectator team is disbanded because the target game ends. +// sending an 84 to be added to a lobby. This is used when a spectator team is +// disbanded because the target game ends. // ED (C->S): Update account data (BB) // There are several subcommands (noted in the union below) that each update a