diff --git a/src/Menu.hh b/src/Menu.hh index 889041bf..e32db642 100644 --- a/src/Menu.hh +++ b/src/Menu.hh @@ -17,7 +17,8 @@ constexpr uint32_t MAIN = 0x11000011; constexpr uint32_t INFORMATION = 0x22000022; constexpr uint32_t LOBBY = 0x33000033; constexpr uint32_t GAME = 0x44000044; -constexpr uint32_t QUEST = 0x55010155; +constexpr uint32_t QUEST_EP1 = 0x55010155; +constexpr uint32_t QUEST_EP2 = 0x55020255; constexpr uint32_t QUEST_CATEGORIES = 0x66010166; constexpr uint32_t PROXY_DESTINATIONS = 0x77000077; constexpr uint32_t PROGRAMS = 0x88000088; diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index 1fc90957..57d4d59d 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -1668,7 +1668,8 @@ static void on_09(shared_ptr c, uint16_t, uint32_t, string& data) { // descriptions included with the entries, which the client shows in the // usual location on the screen. break; - case MenuID::QUEST: { + case MenuID::QUEST_EP1: + case MenuID::QUEST_EP2: { bool is_download_quest = !c->lobby.lock(); auto quest_index = s->quest_index_for_version(c->version()); if (!quest_index) { @@ -2071,12 +2072,12 @@ static void on_10(shared_ptr c, uint16_t, uint32_t, string& data) { const auto& categories = quest_index->categories(menu_type, Episode::EP3, c->version()); if (categories.size() == 1) { auto quests = quest_index->filter(menu_type, Episode::EP3, c->version(), categories[0]->category_id); - send_quest_menu(c, MenuID::QUEST, quests, true); + send_quest_menu(c, quests, true); break; } } - send_quest_categories_menu(c, MenuID::QUEST_CATEGORIES, s->quest_index_for_client(c), menu_type, Episode::NONE); + send_quest_categories_menu(c, s->quest_index_for_version(c->version()), menu_type, Episode::NONE); break; } @@ -2344,11 +2345,12 @@ static void on_10(shared_ptr c, uint16_t, uint32_t, string& data) { } const auto& quests = quest_index->filter(menu_type, episode, c->version(), item_id, include_condition); - send_quest_menu(c, MenuID::QUEST, quests, !l); + send_quest_menu(c, quests, !l); break; } - case MenuID::QUEST: { + case MenuID::QUEST_EP1: + case MenuID::QUEST_EP2: { auto s = c->require_server_state(); auto quest_index = s->quest_index_for_version(c->version()); if (!quest_index) { @@ -2699,7 +2701,7 @@ static void on_A2(shared_ptr c, uint16_t, uint32_t flag, string& data) { throw logic_error("invalid game mode"); } } - send_quest_categories_menu(c, MenuID::QUEST_CATEGORIES, s->quest_index_for_client(c), menu_type, l->episode); + send_quest_categories_menu(c, s->quest_index_for_version(c->version()), menu_type, l->episode); } } diff --git a/src/SendCommands.cc b/src/SendCommands.cc index 2440b338..b49ef225 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -1413,7 +1413,6 @@ void send_game_menu( template void send_quest_menu_t( shared_ptr c, - uint32_t menu_id, const vector>>& quests, bool is_download_menu) { auto v = c->version(); @@ -1425,7 +1424,7 @@ void send_quest_menu_t( } auto& e = entries.emplace_back(); - e.menu_id = menu_id; + e.menu_id = (it.second->episode == Episode::EP2) ? MenuID::QUEST_EP2 : MenuID::QUEST_EP1; e.item_id = it.second->quest_number; e.name.encode(vq->name, c->language()); e.short_description.encode(add_color(vq->short_description), c->language()); @@ -1435,7 +1434,6 @@ void send_quest_menu_t( void send_quest_menu_bb( shared_ptr c, - uint32_t menu_id, const vector>>& quests, bool is_download_menu) { auto v = c->version(); @@ -1447,7 +1445,7 @@ void send_quest_menu_bb( } auto& e = entries.emplace_back(); - e.menu_id = menu_id; + e.menu_id = MenuID::QUEST_EP1; e.item_id = it.second->quest_number; e.name.encode(vq->name, c->language()); e.short_description.encode(add_color(vq->short_description), c->language()); @@ -1459,7 +1457,6 @@ void send_quest_menu_bb( template void send_quest_categories_menu_t( shared_ptr c, - uint32_t menu_id, shared_ptr quest_index, QuestMenuType menu_type, Episode episode) { @@ -1472,7 +1469,7 @@ void send_quest_categories_menu_t( vector entries; for (const auto& cat : quest_index->categories(menu_type, episode, c->version(), include_condition)) { auto& e = entries.emplace_back(); - e.menu_id = menu_id; + e.menu_id = MenuID::QUEST_CATEGORIES; e.item_id = cat->category_id; e.name.encode(cat->name, c->language()); e.short_description.encode(add_color(cat->description), c->language()); @@ -1484,12 +1481,11 @@ void send_quest_categories_menu_t( void send_quest_menu( shared_ptr c, - uint32_t menu_id, const vector>>& quests, bool is_download_menu) { switch (c->version()) { case Version::PC_V2: - send_quest_menu_t(c, menu_id, quests, is_download_menu); + send_quest_menu_t(c, quests, is_download_menu); break; case Version::DC_NTE: case Version::DC_V1_11_2000_PROTOTYPE: @@ -1499,24 +1495,27 @@ void send_quest_menu( case Version::GC_V3: case Version::GC_EP3_TRIAL_EDITION: case Version::GC_EP3: - send_quest_menu_t(c, menu_id, quests, is_download_menu); + send_quest_menu_t(c, quests, is_download_menu); break; case Version::XB_V3: - send_quest_menu_t(c, menu_id, quests, is_download_menu); + send_quest_menu_t(c, quests, is_download_menu); break; case Version::BB_V4: - send_quest_menu_bb(c, menu_id, quests, is_download_menu); + send_quest_menu_bb(c, quests, is_download_menu); break; default: throw logic_error("unimplemented versioned command"); } } -void send_quest_categories_menu(shared_ptr c, uint32_t menu_id, - shared_ptr quest_index, QuestMenuType menu_type, Episode episode) { +void send_quest_categories_menu( + shared_ptr c, + shared_ptr quest_index, + QuestMenuType menu_type, + Episode episode) { switch (c->version()) { case Version::PC_V2: - send_quest_categories_menu_t(c, menu_id, quest_index, menu_type, episode); + send_quest_categories_menu_t(c, quest_index, menu_type, episode); break; case Version::DC_NTE: case Version::DC_V1_11_2000_PROTOTYPE: @@ -1526,13 +1525,13 @@ void send_quest_categories_menu(shared_ptr c, uint32_t menu_id, case Version::GC_V3: case Version::GC_EP3_TRIAL_EDITION: case Version::GC_EP3: - send_quest_categories_menu_t(c, menu_id, quest_index, menu_type, episode); + send_quest_categories_menu_t(c, quest_index, menu_type, episode); break; case Version::XB_V3: - send_quest_categories_menu_t(c, menu_id, quest_index, menu_type, episode); + send_quest_categories_menu_t(c, quest_index, menu_type, episode); break; case Version::BB_V4: - send_quest_categories_menu_t(c, menu_id, quest_index, menu_type, episode); + send_quest_categories_menu_t(c, quest_index, menu_type, episode); break; default: throw logic_error("unimplemented versioned command"); diff --git a/src/SendCommands.hh b/src/SendCommands.hh index f240d440..10c9e79b 100644 --- a/src/SendCommands.hh +++ b/src/SendCommands.hh @@ -257,12 +257,10 @@ void send_game_menu( bool is_tournament_game_list); void send_quest_menu( std::shared_ptr c, - uint32_t menu_id, const std::vector>>& quests, bool is_download_menu); void send_quest_categories_menu( std::shared_ptr c, - uint32_t menu_id, std::shared_ptr quest_index, QuestMenuType menu_type, Episode episode);