fix incorrect team flag alpha channel when loaded from disk
This commit is contained in:
@@ -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
@@ -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
@@ -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));
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user