fix Ep3 NTE tournament menu bugs

This commit is contained in:
Martin Michelsen
2024-02-11 12:17:48 -08:00
parent f548fc04e2
commit 07ebafa8c6
3 changed files with 33 additions and 10 deletions
+19 -3
View File
@@ -2826,8 +2826,24 @@ struct C_CreateChallengeModeAwardItem_BB_07DF {
// The client will send 09 and 10 commands to inspect or enter a tournament. The
// server should respond to an 09 command with an E3 command; the server should
// respond to a 10 command with an E2 command.
// header.flag is the count of filled-in entries.
struct S_TournamentList_Ep3NTE_E0 {
struct Entry {
le_uint32_t menu_id = 0;
le_uint32_t item_id = 0;
uint8_t unknown_a1 = 0;
uint8_t locked = 0;
uint8_t state = 0;
uint8_t unknown_a2 = 0;
le_uint32_t start_time = 0; // In seconds since Unix epoch
pstring<TextEncoding::MARKED, 0x20> name;
le_uint16_t num_teams = 0;
le_uint16_t max_teams = 0;
} __packed__;
parray<Entry, 0x20> entries;
} __packed__;
struct S_TournamentList_Ep3_E0 {
struct Entry {
le_uint32_t menu_id = 0;
@@ -2856,8 +2872,8 @@ struct S_TournamentList_Ep3_E0 {
pstring<TextEncoding::MARKED, 0x20> name;
le_uint16_t num_teams = 0;
le_uint16_t max_teams = 0;
le_uint16_t unknown_a3 = 0;
le_uint16_t unknown_a4 = 0;
le_uint16_t unknown_a3 = 0xFFFF;
le_uint16_t unknown_a4 = 0xFFFF;
} __packed__;
parray<Entry, 0x20> entries;
} __packed__;
+3 -1
View File
@@ -1754,7 +1754,9 @@ static void on_E2_Ep3(shared_ptr<Client> c, uint16_t, uint32_t flag, string&) {
c->ep3_tournament_team.reset();
}
}
send_ep3_confirm_tournament_entry(c, nullptr);
if (c->version() != Version::GC_EP3_NTE) {
send_ep3_confirm_tournament_entry(c, nullptr);
}
break;
}
case 0x03: // Create tournament spectator team (get battle list)
+11 -6
View File
@@ -2840,12 +2840,11 @@ void send_ep3_confirm_tournament_entry(
send_command_t(c, 0xCC, tourn ? 0x01 : 0x00, cmd);
}
void send_ep3_tournament_list(
shared_ptr<Client> c,
bool is_for_spectator_team_create) {
template <typename CmdT>
void send_ep3_tournament_list_t(shared_ptr<Client> c, bool is_for_spectator_team_create) {
auto s = c->require_server_state();
S_TournamentList_Ep3_E0 cmd;
CmdT cmd;
size_t z = 0;
for (const auto& it : s->ep3_tournament_index->all_tournaments()) {
const auto& tourn = it.second;
@@ -2876,13 +2875,19 @@ void send_ep3_tournament_list(
}
}
entry.max_teams = teams.size();
entry.unknown_a3 = 0xFFFF;
entry.unknown_a4 = 0xFFFF;
z++;
}
send_command_t(c, 0xE0, z, cmd);
}
void send_ep3_tournament_list(shared_ptr<Client> c, bool is_for_spectator_team_create) {
if (c->version() == Version::GC_EP3_NTE) {
send_ep3_tournament_list_t<S_TournamentList_Ep3NTE_E0>(c, is_for_spectator_team_create);
} else {
send_ep3_tournament_list_t<S_TournamentList_Ep3_E0>(c, is_for_spectator_team_create);
}
}
void send_ep3_tournament_entry_list(
shared_ptr<Client> c,
shared_ptr<const Episode3::Tournament> tourn,