implement quest stats command

This commit is contained in:
Martin Michelsen
2022-05-11 00:50:40 -07:00
parent ceb0fbb849
commit 57179513b8
2 changed files with 43 additions and 8 deletions
+22 -4
View File
@@ -1096,11 +1096,29 @@ struct S_QuestMenuEntry_BB_A2_A4 {
// download quest menu is closed, either by downloading a quest or canceling,
// the client sends A0 instead.
// AA: Invalid command
// TODO: Sylverant defines this as quest stats, specifically used during Maximum
// Attack 2. Verify this and document if needed.
// AA (C->S): Update quest statistics
// This command is used in Maximum Attack 2, but its format is unlikely to be
// specific to that quest. The structure here represents the only instance I've
// seen so far.
// The server will respond with an AB command.
// AB (S->C): Unknown (BB)
struct C_UpdateQuestStatistics_AA {
le_uint32_t quest_internal_id;
le_uint16_t request_token;
le_uint16_t unknown_a1;
le_uint32_t unknown_a2;
le_uint32_t kill_count;
le_uint32_t time_taken; // in seconds
parray<uint8_t, 0x14> unknown_a3;
};
// AB (S->C): Confirm update quest statistics
struct S_ConfirmUpdateQuestStatistics_AB {
le_uint32_t unknown_a1; // 0
le_uint16_t request_token; // Should match token sent in AA command
le_uint16_t unknown_a2; // Schtserv always sends 0xBFFF here
};
// AC: Quest barrier
// No arguments
+21 -4
View File
@@ -1025,6 +1025,23 @@ void process_quest_ready(shared_ptr<ServerState> s, shared_ptr<Client> c,
}
}
void process_update_quest_statistics(shared_ptr<ServerState> s,
shared_ptr<Client> c, uint16_t, uint32_t, const string& data) { // AA
const auto& cmd = check_size_t<C_UpdateQuestStatistics_AA>(data);
auto l = s->find_lobby(c->lobby_id);
if (!l || !l->is_game() || !l->loading_quest.get() ||
(l->loading_quest->internal_id != cmd.quest_internal_id)) {
return;
}
S_ConfirmUpdateQuestStatistics_AB response;
response.unknown_a1 = 0;
response.request_token = cmd.request_token;
response.unknown_a2 = 0xBFFF;
send_command_t(c, 0xAB, 0x00, response);
}
void process_gba_file_request(shared_ptr<ServerState>, shared_ptr<Client> c,
uint16_t, uint32_t, const string& data) { // D7
string filename(data);
@@ -1835,7 +1852,7 @@ static process_command_t dc_handlers[0x100] = {
// A0
process_change_ship, process_change_block, process_quest_list_request, nullptr,
nullptr, nullptr, nullptr, nullptr,
nullptr, process_ignored_command, nullptr, nullptr,
nullptr, process_ignored_command, process_update_quest_statistics, nullptr,
process_quest_ready, nullptr, nullptr, nullptr,
// B0
@@ -1918,7 +1935,7 @@ static process_command_t pc_handlers[0x100] = {
// A0
process_change_ship, process_change_block, process_quest_list_request, nullptr,
nullptr, nullptr, nullptr, nullptr,
nullptr, process_ignored_command, nullptr, nullptr,
nullptr, process_ignored_command, process_update_quest_statistics, nullptr,
process_quest_ready, nullptr, nullptr, nullptr,
// B0
@@ -2002,7 +2019,7 @@ static process_command_t gc_handlers[0x100] = {
// A0
process_change_ship, process_change_block, process_quest_list_request, nullptr,
nullptr, nullptr, process_ignored_command, process_ignored_command,
nullptr, process_ignored_command, nullptr, nullptr,
nullptr, process_ignored_command, process_update_quest_statistics, nullptr,
process_quest_ready, nullptr, nullptr, nullptr,
// B0
@@ -2091,7 +2108,7 @@ static process_command_t bb_handlers[0x100] = {
// A0
process_change_ship, process_change_block, process_quest_list_request, nullptr,
nullptr, nullptr, nullptr, nullptr,
nullptr, process_ignored_command, nullptr, nullptr,
nullptr, process_ignored_command, process_update_quest_statistics, nullptr,
process_quest_ready, nullptr, nullptr, nullptr,
// B0