diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index d901b69d..54c02f34 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -3106,67 +3106,145 @@ struct C_CreateTeam_BB_01EA { ptext name; } __packed__; +// 02EA (S->C): Unknown +// This command behaves exactly like 1FEA. + // 03EA (C->S): Add team member struct C_AddOrRemoveTeamMember_BB_03EA_05EA { le_uint32_t guild_card_number = 0; } __packed__; +// 04EA (S->C): Unknown +// No arguments except header.flag. + // 05EA (C->S): Remove team member // Same format as 03EA. -// 07EA (C->S): Team chat +// 06EA (S->C): Delete team? +// This command behaves exactly like 10EA. + +// 07EA: Team chat + +struct SC_TeamChat_BB_07EA { + parray sender_name; + // It seems there are no real limits on the message length, other than the + // overall command length limit of 0x7C00 bytes. + char16_t message[0]; +} __packed__; // 08EA (C->S): Team admin // No arguments +// 09EA (S->C): Unknown + +struct S_Unknown_BB_09EA { + le_uint32_t entry_count; + parray unknown_a2; + struct Entry { + // This is displayed as "<%04d> %s" % (value, message) + le_uint32_t value; + le_uint32_t color; // 0x10 or 0x20 = green, 0x30 = blue, 0x40 = red, anything else = white + le_uint32_t unknown_a1; + parray message; + } __packed__; + Entry entries[0]; // [entry_count] actually +} __packed__; + +// 0CEA (S->C): Unknown + +struct S_Unknown_BB_0CEA { + parray unknown_a1; + char16_t unknown_a2[0]; +} __packed__; + // 0DEA (C->S): Unknown // No arguments // 0EEA (S->C): Unknown +struct S_Unknown_BB_0EEA { + parray unused; + char16_t unknown_a2[0]; +} __packed__; + +// 0EEA (S->C): Unknown + // 0FEA (C->S): Set team flag +// The client also accepts this command but completely ignores it. struct C_SetTeamFlag_BB_0FEA { parray data; } __packed__; // 10EA: Delete team -// No arguments +// No arguments except header.flag -// 11EA (C->S): Promote team member +// 11EA: Promote team member +// The format below is used only when the client sends this command; when the +// server sends it, only header.flag is used. // TODO: header.flag is used for this command. Figure out what it's for. struct C_PromoteTeamMember_BB_11EA { le_uint32_t unknown_a1 = 0; } __packed__; -// 12EA (S->C): Unknown +// 12EA (S->C): Team membership information +// If the client is not in a team, all fields except guild_card_number should +// be zero. + +struct S_TeamMembershipInformation_BB_12EA { + le_uint32_t unknown_a1 = 0; // Command is ignored unless this is 0 + le_uint32_t guild_card_number; + le_uint32_t team_id; + le_uint32_t unknown_a4; + le_uint32_t privilege_level; + le_uint32_t unknown_a6; + parray team_name; +} __packed__; // 13EA: Unknown -// No arguments +// header.flag specifies the number of entries. + +struct S_Unknown_BB_13EA_15EA_Entry { + le_uint32_t guild_card_number; + le_uint32_t team_id; + le_uint32_t unknown_a3; + le_uint32_t unknown_a4; + le_uint32_t privilege_level; + parray team_name; + le_uint32_t guild_card_number2; + le_uint32_t lobby_client_id; + parray player_name; + parray team_flag; +} __packed__; // 14EA (C->S): Unknown // No arguments. Client always sends 1 in the header.flag field. // 15EA (S->C): Unknown +// header.flag specifies the number of entries. The entry format appears to be +// the same as for the 13EA command. + +// 16EA (S->C): Unknown +// No arguments except header.flag. // 18EA: Membership information // No arguments (C->S) -// TODO: Document S->C format // 19EA: Privilege list // No arguments (C->S) -// TODO: Document S->C format // 1AEA: Unknown -// 1CEA (C->S): Ranking information // 1BEA (C->S): Unknown // header.flag is used, but no other arguments -// 1CEA (C->S): Unknown -// No arguments +// 1CEA: Ranking information +// No arguments when sent by the client. + +// 1DEA (S->C): Unknown +// No arguments except header.flag. // 1EEA (C->S): Unknown // header.flag is used, but it's unknown what the value means. @@ -3175,7 +3253,11 @@ struct C_Unknown_BB_1EEA { ptext unknown_a1; } __packed__; -// 20EA (C->S): Unknown +// 1FEA (S->C): Unknown +// header.flag must be in the range [0, 6]. If it isn't, the command is ignored. +// No other arguments. + +// 20EA: Unknown // header.flag is used, but no other arguments // EB (S->C): Add player to spectator team (Episode 3)