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.
|
// team or not - if they are all zero, the player is not in a team.
|
||||||
/* 0000 */ le_uint32_t guild_card_number = 0;
|
/* 0000 */ le_uint32_t guild_card_number = 0;
|
||||||
/* 0004 */ le_uint32_t team_id = 0;
|
/* 0004 */ le_uint32_t team_id = 0;
|
||||||
/* 0008 */ le_uint32_t unknown_a3 = 0;
|
/* 0008 */ le_uint32_t reward_flags = 0;
|
||||||
/* 000C */ le_uint32_t unknown_a4 = 0;
|
/* 000C */ le_uint32_t unknown_a6 = 0;
|
||||||
/* 0010 */ le_uint32_t privilege_level = 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;
|
/* 0014 */ pstring<TextEncoding::UTF16, 0x10> team_name;
|
||||||
/* 0034 */ le_uint32_t guild_card_number2 = 0;
|
/* 0034 */ le_uint32_t guild_card_number2 = 0;
|
||||||
/* 0038 */ le_uint32_t lobby_client_id = 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;
|
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
|
// In: rrrrrrrrggggggggbbbbbbbbaaaaaaaa
|
||||||
// Out: -rrrrrgggggbbbbb
|
// Out: arrrrrgggggbbbbb
|
||||||
return ((xrgb8888 >> 9) & 0x7C00) | ((xrgb8888 >> 6) & 0x03E0) | ((xrgb8888 >> 3) & 0x001F);
|
return ((rgba8888 >> 17) & 0x7C00) | ((rgba8888 >> 14) & 0x03E0) | ((rgba8888 >> 11) & 0x001F) | ((rgba8888 << 8) & 0x8000);
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr uint16_t encode_rgbx8888_to_xrgb1555(uint32_t rgbx8888) {
|
constexpr uint32_t decode_argb1555_to_rgba8888(uint16_t argb1555) {
|
||||||
// In: rrrrrrrrggggggggbbbbbbbbxxxxxxxx
|
// In: arrrrrgggggbbbbb
|
||||||
// Out: -rrrrrgggggbbbbb
|
// Out: rrrrrrrrggggggggbbbbbbbbaaaaaaaa
|
||||||
return ((rgbx8888 >> 17) & 0x7C00) | ((rgbx8888 >> 14) & 0x03E0) | ((rgbx8888 >> 11) & 0x001F);
|
return ((argb1555 << 17) & 0xF8000000) | ((argb1555 << 12) & 0x07000000) |
|
||||||
}
|
((argb1555 << 14) & 0x00F80000) | ((argb1555 << 9) & 0x00070000) |
|
||||||
|
((argb1555 << 11) & 0x0000F800) | ((argb1555 << 6) & 0x00000700) |
|
||||||
constexpr uint32_t decode_xrgb1555_to_rgba8888(uint16_t xrgb1555) {
|
((argb1555 & 0x8000) ? 0x000000FF : 0x00000000);
|
||||||
// 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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-13
@@ -283,24 +283,26 @@ struct PlayerLobbyDataDCGC {
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
struct XBNetworkLocation {
|
struct XBNetworkLocation {
|
||||||
le_uint32_t internal_ipv4_address = 0x0A0A0A0A;
|
/* 00 */ le_uint32_t internal_ipv4_address = 0x0A0A0A0A;
|
||||||
le_uint32_t external_ipv4_address = 0x23232323;
|
/* 04 */ le_uint32_t external_ipv4_address = 0x23232323;
|
||||||
le_uint16_t port = 9500;
|
/* 08 */ le_uint16_t port = 9500;
|
||||||
parray<uint8_t, 6> mac_address = 0x77;
|
/* 0A */ parray<uint8_t, 6> mac_address = 0x77;
|
||||||
le_uint32_t unknown_a1;
|
/* 10 */ le_uint32_t unknown_a1;
|
||||||
le_uint32_t unknown_a2;
|
/* 14 */ le_uint32_t unknown_a2;
|
||||||
le_uint64_t account_id = 0xFFFFFFFFFFFFFFFF;
|
/* 18 */ le_uint64_t account_id = 0xFFFFFFFFFFFFFFFF;
|
||||||
parray<le_uint32_t, 4> unknown_a3;
|
/* 20 */ parray<le_uint32_t, 4> unknown_a3;
|
||||||
|
/* 24 */
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
struct PlayerLobbyDataXB {
|
struct PlayerLobbyDataXB {
|
||||||
le_uint32_t player_tag = 0;
|
/* 00 */ le_uint32_t player_tag = 0;
|
||||||
le_uint32_t guild_card_number = 0;
|
/* 04 */ le_uint32_t guild_card_number = 0;
|
||||||
XBNetworkLocation netloc;
|
/* 08 */ XBNetworkLocation netloc;
|
||||||
le_uint32_t client_id = 0;
|
/* 2C */ le_uint32_t client_id = 0;
|
||||||
pstring<TextEncoding::ASCII, 0x10> name;
|
/* 30 */ pstring<TextEncoding::ASCII, 0x10> name;
|
||||||
|
/* 40 */
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|||||||
@@ -1081,7 +1081,7 @@ static HandlerResult C_GXB_61(shared_ptr<ProxyServer::LinkedSession> ses, uint16
|
|||||||
modified = true;
|
modified = true;
|
||||||
}
|
}
|
||||||
if (!ses->challenge_rank_title_override.empty()) {
|
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());
|
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;
|
modified = true;
|
||||||
}
|
}
|
||||||
if (!ses->challenge_rank_title_override.empty()) {
|
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());
|
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);
|
send_set_exp_multiplier(l);
|
||||||
}
|
}
|
||||||
if (c->version() == Version::BB_V4) {
|
if (c->version() == Version::BB_V4) {
|
||||||
|
send_update_team_reward_flags(c);
|
||||||
send_all_nearby_team_metadatas_to_client(c, false);
|
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, "");
|
send_lobby_message_box(c, "");
|
||||||
}
|
}
|
||||||
if (c->version() == Version::BB_V4) {
|
if (c->version() == Version::BB_V4) {
|
||||||
|
send_update_team_reward_flags(c);
|
||||||
send_all_nearby_team_metadatas_to_client(c, false);
|
send_all_nearby_team_metadatas_to_client(c, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ struct PSOBBMinimalSystemFile {
|
|||||||
struct PSOBBTeamMembership {
|
struct PSOBBTeamMembership {
|
||||||
/* 0000 */ le_uint32_t guild_card_number = 0;
|
/* 0000 */ le_uint32_t guild_card_number = 0;
|
||||||
/* 0004 */ le_uint32_t team_id = 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;
|
/* 000C */ le_uint32_t unknown_a6 = 0;
|
||||||
/* 0010 */ uint8_t privilege_level = 0;
|
/* 0010 */ uint8_t privilege_level = 0;
|
||||||
/* 0011 */ uint8_t unknown_a7 = 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>());
|
this->flag_data.reset(new parray<le_uint16_t, 0x20 * 0x20>());
|
||||||
for (size_t y = 0; y < 32; y++) {
|
for (size_t y = 0; y < 32; y++) {
|
||||||
for (size_t x = 0; x < 32; x++) {
|
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);
|
Image img(32, 32, false);
|
||||||
for (size_t y = 0; y < 32; y++) {
|
for (size_t y = 0; y < 32; y++) {
|
||||||
for (size_t x = 0; x < 32; x++) {
|
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);
|
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;
|
PSOBBTeamMembership ret;
|
||||||
ret.guild_card_number = serial_number;
|
ret.guild_card_number = serial_number;
|
||||||
ret.team_id = this->team_id;
|
ret.team_id = this->team_id;
|
||||||
ret.unknown_a4 = 0;
|
ret.unknown_a5 = 0;
|
||||||
ret.privilege_level = m.privilege_level();
|
|
||||||
ret.unknown_a6 = 0;
|
ret.unknown_a6 = 0;
|
||||||
|
ret.privilege_level = m.privilege_level();
|
||||||
ret.unknown_a7 = 0;
|
ret.unknown_a7 = 0;
|
||||||
ret.unknown_a8 = 0;
|
ret.unknown_a8 = 0;
|
||||||
ret.unknown_a9 = 0;
|
ret.unknown_a9 = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user