fix incorrect team flag alpha channel when loaded from disk

This commit is contained in:
Martin Michelsen
2023-12-25 15:06:38 -08:00
parent a8061efc0d
commit 2ef6acaa0e
8 changed files with 46 additions and 39 deletions
+6 -3
View File
@@ -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<TextEncoding::UTF16, 0x10> team_name;
/* 0034 */ le_uint32_t guild_card_number2 = 0;
/* 0038 */ le_uint32_t lobby_client_id = 0;
+16 -16
View File
@@ -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);
}
+15 -13
View File
@@ -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<uint8_t, 6> mac_address = 0x77;
le_uint32_t unknown_a1;
le_uint32_t unknown_a2;
le_uint64_t account_id = 0xFFFFFFFFFFFFFFFF;
parray<le_uint32_t, 4> 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<uint8_t, 6> mac_address = 0x77;
/* 10 */ le_uint32_t unknown_a1;
/* 14 */ le_uint32_t unknown_a2;
/* 18 */ le_uint64_t account_id = 0xFFFFFFFFFFFFFFFF;
/* 20 */ parray<le_uint32_t, 4> 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<TextEncoding::ASCII, 0x10> 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<TextEncoding::ASCII, 0x10> name;
/* 40 */
void clear();
} __attribute__((packed));
+2 -2
View File
@@ -1081,7 +1081,7 @@ static HandlerResult C_GXB_61(shared_ptr<ProxyServer::LinkedSession> 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<ProxyServer::LinkedSession> 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());
}
}
+1
View File
@@ -4279,6 +4279,7 @@ static void on_6F(shared_ptr<Client> 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);
}
+1
View File
@@ -891,6 +891,7 @@ static void on_set_player_visible(shared_ptr<Client> 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);
}
}
+1 -1
View File
@@ -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;
+4 -4
View File
@@ -96,7 +96,7 @@ void TeamIndex::Team::load_flag() {
this->flag_data.reset(new parray<le_uint16_t, 0x20 * 0x20>());
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;