diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index ccfc5678..eabed938 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -1616,8 +1616,16 @@ struct S_ChoiceSearchResultEntry_GC_C4 { parray unused2; }; -// C5 (S->C): Challenge rank update -// TODO: Document format and usage for this command +// C5 (S->C): Challenge rank update (GC/BB) +// header.flag = entry count +// The server sends this command when a player joins a lobby to update the +// challenge mode records of all the present players. +// Entry format is PlayerChallengeDataGC or PlayerChallengeDataBB. +// newserv currently doesn't send this command at all because the GC and +// BB formats aren't fully documented. +// TODO: Figure out where the text is in those formats, write appropriate +// conversion functions, and implement the command. Don't forget to override the +// client_id field in each entry before sending. // C6 (C->S): Set blocked senders list (GC/BB) diff --git a/src/Player.hh b/src/Player.hh index 34448e6f..e3888fb3 100644 --- a/src/Player.hh +++ b/src/Player.hh @@ -14,7 +14,7 @@ -struct ItemData { +struct ItemData { // 0x14 bytes union { uint8_t data1[12]; le_uint16_t data1w[6]; @@ -34,7 +34,7 @@ struct ItemData { struct PlayerBankItem; -struct PlayerInventoryItem { +struct PlayerInventoryItem { // 0x1C bytes le_uint16_t equip_flags; le_uint16_t tech_flag; le_uint32_t game_flags; @@ -44,7 +44,7 @@ struct PlayerInventoryItem { PlayerInventoryItem(const PlayerBankItem&); } __attribute__((packed)); -struct PlayerBankItem { +struct PlayerBankItem { // 0x18 bytes ItemData data; le_uint16_t amount; le_uint16_t show_flags; @@ -53,7 +53,7 @@ struct PlayerBankItem { PlayerBankItem(const PlayerInventoryItem&); } __attribute__((packed)); -struct PlayerInventory { +struct PlayerInventory { // 0x34C bytes uint8_t num_items; uint8_t hp_materials_used; uint8_t tp_materials_used; @@ -65,7 +65,7 @@ struct PlayerInventory { size_t find_item(uint32_t item_id); } __attribute__((packed)); -struct PlayerBank { +struct PlayerBank { // 0xFA8 bytes le_uint32_t num_items; le_uint32_t meseta; PlayerBankItem items[200]; @@ -86,7 +86,7 @@ struct PlayerBank { struct PlayerDispDataBB; // PC/GC player appearance and stats data -struct PlayerDispDataPCGC { // 0xD0 in size +struct PlayerDispDataPCGC { // 0xD0 bytes PlayerStats stats; parray unknown_a1; le_uint32_t level; @@ -289,6 +289,41 @@ struct PlayerLobbyDataBB { +struct PlayerChallengeDataGC { + le_uint32_t client_id; + struct { + le_uint16_t unknown_a1; + parray unknown_a2; // Possibly unused + parray unknown_a3; + struct { + parray unknown_a1; + le_uint16_t unknown_a2; + parray unknown_a3; + parray unknown_a4; + parray unknown_a5; + } __attribute__((packed)) unknown_a4; + struct { + parray unknown_a1; + parray unknown_a2; + } __attribute__((packed)) unknown_a5; + struct UnknownPair { + le_uint32_t unknown_a1; + le_uint32_t unknown_a2; + } __attribute__((packed)); + parray unknown_a6; + parray unknown_a7; + } __attribute__((packed)) unknown_a1; + parray unknown_a2; + parray unknown_a3; +} __attribute__((packed)); + +struct PlayerChallengeDataBB { + le_uint32_t client_id; + parray unknown_a1; +} __attribute__((packed)); + + + struct PSOPlayerDataPC { // For command 61 PlayerInventory inventory; PlayerDispDataPCGC disp; @@ -297,7 +332,8 @@ struct PSOPlayerDataPC { // For command 61 struct PSOPlayerDataGC { // For command 61 PlayerInventory inventory; PlayerDispDataPCGC disp; - parray unknown; + PlayerChallengeDataGC challenge_data; + parray unknown; ptext info_board; parray blocked_senders; le_uint32_t auto_reply_enabled; @@ -307,7 +343,8 @@ struct PSOPlayerDataGC { // For command 61 struct PSOPlayerDataGCEp3 { // For command 61 PlayerInventory inventory; PlayerDispDataPCGC disp; - parray unknown; + PlayerChallengeDataGC challenge_data; + parray unknown; ptext info_board; parray blocked_senders; le_uint32_t auto_reply_enabled; @@ -318,7 +355,8 @@ struct PSOPlayerDataGCEp3 { // For command 61 struct PSOPlayerDataBB { // For command 61 PlayerInventory inventory; PlayerDispDataBB disp; - ptext unused; + PlayerChallengeDataBB challenge_data; + parray unknown; ptext info_board; parray blocked_senders; le_uint32_t auto_reply_enabled;