diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index 446c8eb8..5dd8dc9e 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -3374,9 +3374,12 @@ struct S_TeamInfoForPlayer_BB_13EA_15EA_Entry { // team or not - if they are all zero, the player is not in a team. /* 0000 */ le_uint32_t guild_card_number = 0; /* 0004 */ le_uint32_t team_id = 0; - /* 0008 */ le_uint32_t unknown_a3 = 0; - /* 000C */ le_uint32_t unknown_a4 = 0; - /* 0010 */ le_uint32_t privilege_level = 0; + /* 0008 */ le_uint32_t reward_flags = 0; + /* 000C */ le_uint32_t unknown_a6 = 0; + /* 0010 */ uint8_t privilege_level = 0; + /* 0011 */ uint8_t unknown_a7 = 0; + /* 0012 */ uint8_t unknown_a8 = 0; + /* 0013 */ uint8_t unknown_a9 = 0; /* 0014 */ pstring team_name; /* 0034 */ le_uint32_t guild_card_number2 = 0; /* 0038 */ le_uint32_t lobby_client_id = 0; diff --git a/src/GVMEncoder.hh b/src/GVMEncoder.hh index fa0a17cf..10c8a527 100644 --- a/src/GVMEncoder.hh +++ b/src/GVMEncoder.hh @@ -37,23 +37,23 @@ constexpr uint32_t encode_argb8888(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { return (a << 24) | (r << 16) | (g << 8) | b; } -constexpr uint16_t encode_xrgb8888_to_xrgb1555(uint32_t xrgb8888) { +constexpr uint16_t encode_argb8888_to_argb1555(uint32_t argb8888) { + // In: aaaaaaaarrrrrrrrggggggggbbbbbbbb + // Out: arrrrrgggggbbbbb + return ((argb8888 >> 9) & 0x7C00) | ((argb8888 >> 6) & 0x03E0) | ((argb8888 >> 3) & 0x001F) | ((argb8888 >> 16) & 0x8000); +} + +constexpr uint16_t encode_rgba8888_to_argb1555(uint32_t rgba8888) { // In: rrrrrrrrggggggggbbbbbbbbaaaaaaaa - // Out: -rrrrrgggggbbbbb - return ((xrgb8888 >> 9) & 0x7C00) | ((xrgb8888 >> 6) & 0x03E0) | ((xrgb8888 >> 3) & 0x001F); + // Out: arrrrrgggggbbbbb + return ((rgba8888 >> 17) & 0x7C00) | ((rgba8888 >> 14) & 0x03E0) | ((rgba8888 >> 11) & 0x001F) | ((rgba8888 << 8) & 0x8000); } -constexpr uint16_t encode_rgbx8888_to_xrgb1555(uint32_t rgbx8888) { - // In: rrrrrrrrggggggggbbbbbbbbxxxxxxxx - // Out: -rrrrrgggggbbbbb - return ((rgbx8888 >> 17) & 0x7C00) | ((rgbx8888 >> 14) & 0x03E0) | ((rgbx8888 >> 11) & 0x001F); -} - -constexpr uint32_t decode_xrgb1555_to_rgba8888(uint16_t xrgb1555) { - // In: -rrrrrgggggbbbbb - // Out: rrrrrrrrggggggggbbbbbbbbaaaaaaaa (a is always FF) - return ((xrgb1555 << 17) & 0xF8000000) | ((xrgb1555 << 12) & 0x07000000) | - ((xrgb1555 << 14) & 0x00F80000) | ((xrgb1555 << 9) & 0x00070000) | - ((xrgb1555 << 11) & 0x0000F800) | ((xrgb1555 << 6) & 0x00000700) | - 0x000000FF; +constexpr uint32_t decode_argb1555_to_rgba8888(uint16_t argb1555) { + // In: arrrrrgggggbbbbb + // Out: rrrrrrrrggggggggbbbbbbbbaaaaaaaa + return ((argb1555 << 17) & 0xF8000000) | ((argb1555 << 12) & 0x07000000) | + ((argb1555 << 14) & 0x00F80000) | ((argb1555 << 9) & 0x00070000) | + ((argb1555 << 11) & 0x0000F800) | ((argb1555 << 6) & 0x00000700) | + ((argb1555 & 0x8000) ? 0x000000FF : 0x00000000); } diff --git a/src/PlayerSubordinates.hh b/src/PlayerSubordinates.hh index 3394e764..ee2ad27c 100644 --- a/src/PlayerSubordinates.hh +++ b/src/PlayerSubordinates.hh @@ -283,24 +283,26 @@ struct PlayerLobbyDataDCGC { } __attribute__((packed)); struct XBNetworkLocation { - le_uint32_t internal_ipv4_address = 0x0A0A0A0A; - le_uint32_t external_ipv4_address = 0x23232323; - le_uint16_t port = 9500; - parray mac_address = 0x77; - le_uint32_t unknown_a1; - le_uint32_t unknown_a2; - le_uint64_t account_id = 0xFFFFFFFFFFFFFFFF; - parray unknown_a3; + /* 00 */ le_uint32_t internal_ipv4_address = 0x0A0A0A0A; + /* 04 */ le_uint32_t external_ipv4_address = 0x23232323; + /* 08 */ le_uint16_t port = 9500; + /* 0A */ parray mac_address = 0x77; + /* 10 */ le_uint32_t unknown_a1; + /* 14 */ le_uint32_t unknown_a2; + /* 18 */ le_uint64_t account_id = 0xFFFFFFFFFFFFFFFF; + /* 20 */ parray unknown_a3; + /* 24 */ void clear(); } __attribute__((packed)); struct PlayerLobbyDataXB { - le_uint32_t player_tag = 0; - le_uint32_t guild_card_number = 0; - XBNetworkLocation netloc; - le_uint32_t client_id = 0; - pstring name; + /* 00 */ le_uint32_t player_tag = 0; + /* 04 */ le_uint32_t guild_card_number = 0; + /* 08 */ XBNetworkLocation netloc; + /* 2C */ le_uint32_t client_id = 0; + /* 30 */ pstring name; + /* 40 */ void clear(); } __attribute__((packed)); diff --git a/src/ProxyCommands.cc b/src/ProxyCommands.cc index 9b656ab0..af7891cd 100644 --- a/src/ProxyCommands.cc +++ b/src/ProxyCommands.cc @@ -1081,7 +1081,7 @@ static HandlerResult C_GXB_61(shared_ptr ses, uint16 modified = true; } if (!ses->challenge_rank_title_override.empty()) { - pd.records.challenge.title_color = encode_xrgb8888_to_xrgb1555(ses->challenge_rank_color_override); + pd.records.challenge.title_color = encode_rgba8888_to_argb1555(ses->challenge_rank_color_override); pd.records.challenge.rank_title.encode(ses->challenge_rank_title_override, ses->language()); } @@ -1120,7 +1120,7 @@ static HandlerResult C_GXB_61(shared_ptr ses, uint16 modified = true; } if (!ses->challenge_rank_title_override.empty()) { - pd->records.challenge.stats.title_color = encode_xrgb8888_to_xrgb1555(ses->challenge_rank_color_override); + pd->records.challenge.stats.title_color = encode_rgba8888_to_argb1555(ses->challenge_rank_color_override); pd->records.challenge.rank_title.encode(ses->challenge_rank_title_override, ses->language()); } } diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index 0be9e0a9..f927137a 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -4279,6 +4279,7 @@ static void on_6F(shared_ptr c, uint16_t command, uint32_t, string& data send_set_exp_multiplier(l); } if (c->version() == Version::BB_V4) { + send_update_team_reward_flags(c); send_all_nearby_team_metadatas_to_client(c, false); } diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 413b89c0..aae4c1db 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -891,6 +891,7 @@ static void on_set_player_visible(shared_ptr c, uint8_t command, uint8_t send_lobby_message_box(c, ""); } if (c->version() == Version::BB_V4) { + send_update_team_reward_flags(c); send_all_nearby_team_metadatas_to_client(c, false); } } diff --git a/src/SaveFileFormats.hh b/src/SaveFileFormats.hh index c2bbcc55..e959c648 100644 --- a/src/SaveFileFormats.hh +++ b/src/SaveFileFormats.hh @@ -136,7 +136,7 @@ struct PSOBBMinimalSystemFile { struct PSOBBTeamMembership { /* 0000 */ le_uint32_t guild_card_number = 0; /* 0004 */ le_uint32_t team_id = 0; - /* 0008 */ le_uint32_t unknown_a4 = 0; + /* 0008 */ le_uint32_t unknown_a5 = 0; /* 000C */ le_uint32_t unknown_a6 = 0; /* 0010 */ uint8_t privilege_level = 0; /* 0011 */ uint8_t unknown_a7 = 0; diff --git a/src/TeamIndex.cc b/src/TeamIndex.cc index 5dffab7c..b2de7dd9 100644 --- a/src/TeamIndex.cc +++ b/src/TeamIndex.cc @@ -96,7 +96,7 @@ void TeamIndex::Team::load_flag() { this->flag_data.reset(new parray()); for (size_t y = 0; y < 32; y++) { for (size_t x = 0; x < 32; x++) { - this->flag_data->at(y * 0x20 + x) = encode_rgbx8888_to_xrgb1555(img.read_pixel(x, y)); + this->flag_data->at(y * 0x20 + x) = encode_rgba8888_to_argb1555(img.read_pixel(x, y)); } } } @@ -108,7 +108,7 @@ void TeamIndex::Team::save_flag() const { Image img(32, 32, false); for (size_t y = 0; y < 32; y++) { for (size_t x = 0; x < 32; x++) { - img.write_pixel(x, y, decode_xrgb1555_to_rgba8888(this->flag_data->at(y * 0x20 + x))); + img.write_pixel(x, y, decode_argb1555_to_rgba8888(this->flag_data->at(y * 0x20 + x))); } } img.save(this->flag_filename(), Image::Format::WINDOWS_BITMAP); @@ -127,9 +127,9 @@ PSOBBTeamMembership TeamIndex::Team::membership_for_member(uint32_t serial_numbe PSOBBTeamMembership ret; ret.guild_card_number = serial_number; ret.team_id = this->team_id; - ret.unknown_a4 = 0; - ret.privilege_level = m.privilege_level(); + ret.unknown_a5 = 0; ret.unknown_a6 = 0; + ret.privilege_level = m.privilege_level(); ret.unknown_a7 = 0; ret.unknown_a8 = 0; ret.unknown_a9 = 0;