From 4d172fff64bcf53f092745e8482c04a728622475 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Wed, 1 May 2024 23:26:08 -0700 Subject: [PATCH] fix challenge mode times window --- src/CommandFormats.hh | 31 +++++++++++---- src/Menu.hh | 3 +- src/Quest.cc | 12 ++++++ src/Quest.hh | 10 ++++- src/ReceiveCommands.cc | 14 ++++--- src/SendCommands.cc | 19 ++++----- src/SendCommands.hh | 3 +- system/config.example.json | 53 +++++++++++++------------ system/quests/challenge-ep1/c88101.json | 3 +- system/quests/challenge-ep1/c88102.json | 1 + system/quests/challenge-ep1/c88103.json | 1 + system/quests/challenge-ep1/c88104.json | 1 + system/quests/challenge-ep1/c88105.json | 1 + system/quests/challenge-ep1/c88106.json | 1 + system/quests/challenge-ep1/c88107.json | 1 + system/quests/challenge-ep1/c88108.json | 1 + system/quests/challenge-ep1/c88109.json | 1 + system/quests/challenge-ep2/d88201.json | 3 +- system/quests/challenge-ep2/d88202.json | 1 + system/quests/challenge-ep2/d88203.json | 1 + system/quests/challenge-ep2/d88204.json | 1 + system/quests/challenge-ep2/d88205.json | 1 + tests/config.json | 36 ++++++++--------- 23 files changed, 126 insertions(+), 73 deletions(-) diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index b0c9cf07..c60cd392 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -2022,8 +2022,19 @@ template struct S_QuestMenuEntryT { // Note: The game treats menu_id as two 8-bit fields followed by a 16-bit // field. In most situations, this is opaque to the server, so we treat it as - // a single 32-bit field, but in the case of the quest menu, the second byte - // is used to determine the icon that appears to the left of the quest name. + // a single 32-bit field; however, in the case of the quest menu, the first + // and second bytes have meaning on the client. + // + // The first byte is used as the quest episode number, which is only relevant + // for showing the Challenge Mode times window when a quest is selected. + // This byte must be set correctly on the quest category entry, not the quest + // itself, so the Episode 1 Challenge quests category should have a value of + // 1 in this byte, and the Episode 2 Challenge quests category should have a + // value of 2. (This is not the only condition required for the Challenge + // Mode times window to work; see the description of command A3 also.) + // + // The second byte of the menu ID is used to determine which icon appears to + // the left of the quest name. // Specifically: // 0 = online quest icon (green diamond) // 1 = download quest icon (green square with outlined diamond) @@ -2054,7 +2065,13 @@ struct S_QuestMenuEntry_BB_A2_A4 { } __packed_ws__(S_QuestMenuEntry_BB_A2_A4, 0x13C); // A3 (S->C): Quest information -// Same format as 1A/D5 command (plain text) +// Same format as 1A/D5 command (plain text). The header.flag field is used to +// inform the client of the Challenge stage number, so it can show the correct +// timing window when the stage is selected. The Episode 1 stage numbers should +// be specified as 51-59 (decimal) in header.flag, and the Episode 2 stage +// numbers should be specified as 61-65 (decimal). If the header.flag value is +// outside this range, it is ignored, and the Challenge Mode times window does +// not update. // A4 (S->C): Download quest menu // Internal name: RcvQuestList @@ -5220,12 +5237,12 @@ struct G_PlayerKilledByMonster_6x89 { le_uint16_t unused = 0; } __packed_ws__(G_PlayerKilledByMonster_6x89, 8); -// 6x8A: Unknown (not valid on Episode 3) +// 6x8A: Show Challenge time records window (not valid on Episode 3) -struct G_Unknown_6x8A { +struct G_ShowChallengeTimeRecordsWindow_6x8A { G_ClientIDHeader header; - le_uint32_t unknown_a1 = 0; // Must be < 0x11 -} __packed_ws__(G_Unknown_6x8A, 8); + le_uint32_t which = 0; // Must be < 0x11 +} __packed_ws__(G_ShowChallengeTimeRecordsWindow_6x8A, 8); // 6x8B: Unknown (not valid on Episode 3) // This command has a handler, but it does nothing. diff --git a/src/Menu.hh b/src/Menu.hh index dabff650..fc7c7665 100644 --- a/src/Menu.hh +++ b/src/Menu.hh @@ -20,7 +20,8 @@ constexpr uint32_t LOBBY = 0x33000033; constexpr uint32_t GAME = 0x44000044; constexpr uint32_t QUEST_EP1 = 0x55010155; constexpr uint32_t QUEST_EP2 = 0x55020255; -constexpr uint32_t QUEST_CATEGORIES = 0x66010166; +constexpr uint32_t QUEST_CATEGORIES_EP1 = 0x01666601; +constexpr uint32_t QUEST_CATEGORIES_EP2 = 0x02666602; constexpr uint32_t PROXY_DESTINATIONS = 0x77000077; constexpr uint32_t PROGRAMS = 0x88000088; constexpr uint32_t PATCHES = 0x99000099; diff --git a/src/Quest.cc b/src/Quest.cc index c506434c..c9ac526a 100644 --- a/src/Quest.cc +++ b/src/Quest.cc @@ -204,6 +204,7 @@ VersionedQuest::VersionedQuest( std::shared_ptr pvr_contents, std::shared_ptr battle_rules, ssize_t challenge_template_index, + uint8_t description_flag, std::shared_ptr available_expression, std::shared_ptr enabled_expression, bool allow_start_from_chat_command, @@ -223,6 +224,7 @@ VersionedQuest::VersionedQuest( pvr_contents(pvr_contents), battle_rules(battle_rules), challenge_template_index(challenge_template_index), + description_flag(description_flag), available_expression(available_expression), enabled_expression(enabled_expression) { @@ -392,6 +394,7 @@ Quest::Quest(shared_ptr initial_version) name(initial_version->name), battle_rules(initial_version->battle_rules), challenge_template_index(initial_version->challenge_template_index), + description_flag(initial_version->description_flag), available_expression(initial_version->available_expression), enabled_expression(initial_version->enabled_expression) { this->versions.emplace(this->versions_key(initial_version->version, initial_version->language), initial_version); @@ -429,6 +432,9 @@ void Quest::add_version(shared_ptr vq) { if (this->challenge_template_index != vq->challenge_template_index) { throw runtime_error("quest version has different challenge template index"); } + if (this->description_flag != vq->description_flag) { + throw runtime_error("quest version has different description flag"); + } if (!this->available_expression != !vq->available_expression) { throw runtime_error("quest version has available expression but root quest does not, or vice versa"); } @@ -680,6 +686,7 @@ QuestIndex::QuestIndex( const FileData* json_filedata = nullptr; shared_ptr battle_rules; ssize_t challenge_template_index = -1; + uint8_t description_flag = 0; shared_ptr available_expression; shared_ptr enabled_expression; bool allow_start_from_chat_command = false; @@ -707,6 +714,10 @@ QuestIndex::QuestIndex( challenge_template_index = metadata_json.at("ChallengeTemplateIndex").as_int(); } catch (const out_of_range&) { } + try { + description_flag = metadata_json.at("DescriptionFlag").as_int(); + } catch (const out_of_range&) { + } try { available_expression = make_shared(metadata_json.get_string("AvailableIf")); } catch (const out_of_range&) { @@ -739,6 +750,7 @@ QuestIndex::QuestIndex( pvr_filedata ? pvr_filedata->data : nullptr, battle_rules, challenge_template_index, + description_flag, available_expression, enabled_expression, allow_start_from_chat_command, diff --git a/src/Quest.hh b/src/Quest.hh index bce7daee..16f3294c 100644 --- a/src/Quest.hh +++ b/src/Quest.hh @@ -37,7 +37,7 @@ enum class QuestMenuType { struct QuestCategoryIndex { struct Category { uint32_t category_id; - uint8_t enabled_flags; + uint16_t enabled_flags; std::string directory_name; std::string name; std::string description; @@ -48,7 +48,10 @@ struct QuestCategoryIndex { return this->enabled_flags & (1 << static_cast(menu_type)); } [[nodiscard]] inline bool enable_episode_filter() const { - return this->enabled_flags & 0x80; + return this->enabled_flags & 0x080; + } + [[nodiscard]] inline bool use_ep2_icon() const { + return this->enabled_flags & 0x100; } }; @@ -78,6 +81,7 @@ struct VersionedQuest { std::shared_ptr pvr_contents; std::shared_ptr battle_rules; ssize_t challenge_template_index; + uint8_t description_flag; std::shared_ptr available_expression; std::shared_ptr enabled_expression; @@ -91,6 +95,7 @@ struct VersionedQuest { std::shared_ptr pvr_contents, std::shared_ptr battle_rules = nullptr, ssize_t challenge_template_index = -1, + uint8_t description_flag = 0, std::shared_ptr available_expression = nullptr, std::shared_ptr enabled_expression = nullptr, bool allow_start_from_chat_command = false, @@ -131,6 +136,7 @@ public: std::string name; std::shared_ptr battle_rules; ssize_t challenge_template_index; + uint8_t description_flag; std::shared_ptr available_expression; std::shared_ptr enabled_expression; std::map> versions; diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index 3ef81297..f4680726 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -1744,7 +1744,8 @@ static void on_09(shared_ptr c, uint16_t, uint32_t, string& data) { auto s = c->require_server_state(); switch (cmd.menu_id) { - case MenuID::QUEST_CATEGORIES: + case MenuID::QUEST_CATEGORIES_EP1: + case MenuID::QUEST_CATEGORIES_EP2: // Don't send anything here. The quest filter menu already has short // descriptions included with the entries, which the client shows in the // usual location on the screen. @@ -1754,17 +1755,17 @@ static void on_09(shared_ptr c, uint16_t, uint32_t, string& data) { bool is_download_quest = !c->lobby.lock(); auto quest_index = s->quest_index(c->version()); if (!quest_index) { - send_quest_info(c, "$C7Quests are not available.", is_download_quest); + send_quest_info(c, "$C7Quests are not available.", 0x00, is_download_quest); } else { auto q = quest_index->get(cmd.item_id); if (!q) { - send_quest_info(c, "$C4Quest does not\nexist.", is_download_quest); + send_quest_info(c, "$C4Quest does not\nexist.", 0x00, is_download_quest); } else { auto vq = q->version(c->version(), c->language()); if (!vq) { - send_quest_info(c, "$C4Quest does not\nexist for this game\nversion.", is_download_quest); + send_quest_info(c, "$C4Quest does not\nexist for this game\nversion.", 0x00, is_download_quest); } else { - send_quest_info(c, vq->long_description, is_download_quest); + send_quest_info(c, vq->long_description, vq->description_flag, is_download_quest); } } } @@ -2470,7 +2471,8 @@ static void on_10(shared_ptr c, uint16_t, uint32_t, string& data) { break; } - case MenuID::QUEST_CATEGORIES: { + case MenuID::QUEST_CATEGORIES_EP1: + case MenuID::QUEST_CATEGORIES_EP2: { auto s = c->require_server_state(); auto quest_index = s->quest_index(c->version()); if (!quest_index) { diff --git a/src/SendCommands.cc b/src/SendCommands.cc index b81781fb..dd70c2dc 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -739,6 +739,7 @@ static void send_text( Channel& ch, StringWriter& w, uint16_t command, + uint32_t flag, const string& text, ColorMode color_mode) { bool is_w = uses_utf16(ch.version); @@ -772,18 +773,18 @@ static void send_text( while (w.str().size() & 3) { w.put_u8(0); } - ch.send(command, 0x00, w.str()); + ch.send(command, flag, w.str()); } -static void send_text(Channel& ch, uint16_t command, const string& text, ColorMode color_mode) { +static void send_text(Channel& ch, uint16_t command, uint32_t flag, const string& text, ColorMode color_mode) { StringWriter w; - send_text(ch, w, command, text, color_mode); + send_text(ch, w, command, flag, text, color_mode); } static void send_header_text(Channel& ch, uint16_t command, uint32_t guild_card_number, const string& text, ColorMode color_mode) { StringWriter w; w.put(SC_TextHeader_01_06_11_B0_EE({0, guild_card_number})); - send_text(ch, w, command, text, color_mode); + send_text(ch, w, command, 0x00, text, color_mode); } void send_message_box(shared_ptr c, const string& text) { @@ -812,7 +813,7 @@ void send_message_box(shared_ptr c, const string& text) { default: throw logic_error("invalid game version"); } - send_text(c->channel, command, text, ColorMode::ADD); + send_text(c->channel, command, 0x00, text, ColorMode::ADD); } void send_ep3_timed_message_box(Channel& ch, uint32_t frames, const string& message) { @@ -834,11 +835,11 @@ void send_ep3_timed_message_box(Channel& ch, uint32_t frames, const string& mess } void send_lobby_name(shared_ptr c, const string& text) { - send_text(c->channel, 0x8A, text, ColorMode::NONE); + send_text(c->channel, 0x8A, 0x00, text, ColorMode::NONE); } -void send_quest_info(shared_ptr c, const string& text, bool is_download_quest) { - send_text(c->channel, is_download_quest ? 0xA5 : 0xA3, text, ColorMode::ADD); +void send_quest_info(shared_ptr c, const string& text, uint8_t description_flag, bool is_download_quest) { + send_text(c->channel, is_download_quest ? 0xA5 : 0xA3, description_flag, text, ColorMode::ADD); } void send_lobby_message_box(shared_ptr c, const string& text, bool left_side_on_bb) { @@ -1590,7 +1591,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 = MenuID::QUEST_CATEGORIES; + e.menu_id = cat->use_ep2_icon() ? MenuID::QUEST_CATEGORIES_EP2 : MenuID::QUEST_CATEGORIES_EP1; e.item_id = cat->category_id; e.name.encode(cat->name, c->language()); e.short_description.encode(add_color(cat->description), c->language()); diff --git a/src/SendCommands.hh b/src/SendCommands.hh index b00626fd..63ab429d 100644 --- a/src/SendCommands.hh +++ b/src/SendCommands.hh @@ -200,8 +200,7 @@ void send_complete_player_bb(std::shared_ptr c); void send_message_box(std::shared_ptr c, const std::string& text); void send_ep3_timed_message_box(Channel& ch, uint32_t frames, const std::string& text); void send_lobby_name(std::shared_ptr c, const std::string& text); -void send_quest_info(std::shared_ptr c, const std::string& text, - bool is_download_quest); +void send_quest_info(std::shared_ptr c, const std::string& text, uint8_t flag, bool is_download_quest); void send_lobby_message_box(std::shared_ptr c, const std::string& text, bool left_side_on_bb = false); void send_ship_info(std::shared_ptr c, const std::string& text); void send_ship_info(Channel& ch, const std::string& text); diff --git a/system/config.example.json b/system/config.example.json index 6bc45e85..025f56a4 100644 --- a/system/config.example.json +++ b/system/config.example.json @@ -662,37 +662,38 @@ // Each entry is [flags, directory_name, category_name, description]. // These fields are: // flags: a bit field containing the following: - // 0x01 - appears in normal mode - // 0x02 - appears in battle mode - // 0x04 - appears in challenge mode - // 0x08 - appears in solo mode (BB) - // 0x10 - appears at government counter (BB) - // 0x20 - appears in download quest menu - // 0x40 - appears in Episode 3 download quest menu - // 0x80 - hide quests that don't match the game's episode + // 0x001 - appears in normal mode + // 0x002 - appears in battle mode + // 0x004 - appears in challenge mode + // 0x008 - appears in solo mode (BB) + // 0x010 - appears at government counter (BB) + // 0x020 - appears in download quest menu + // 0x040 - appears in Episode 3 download quest menu + // 0x080 - hide quests that don't match the game's episode + // 0x100 - is Episode 2 Challenge category // directory_name: the directory inside system/quests that contains quests // for this category. // category_name: what appears in the quest menu on the client. // description: what appears in the category description window (may // contain color escape codes like $C6). - [0x81, "retrieval", "Retrieval", "$E$C6Quests that involve\nretrieving an object"], - [0x81, "extermination", "Extermination", "$E$C6Quests that involve\ndestroying all\nmonsters"], - [0x81, "events", "Events", "$E$C6Quests that are part\nof an event"], - [0x81, "shops", "Shops", "$E$C6Quests that contain\nshops"], - [0x81, "vr", "Virtual Reality", "$E$C6Quests that are\ndone in a simulator"], - [0x81, "tower", "Control Tower", "$E$C6Quests that take\nplace at the Control\nTower"], - [0x81, "team", "Team", "$E$C6Quests for you\nand your team\nmembers."], - [0x02, "battle", "Battle", "$E$C6Battle mode rule\nsets"], - [0x04, "challenge-ep1", "Challenge (Episode 1)", "$E$C6Challenge mode\nquests in Episode 1"], - [0x04, "challenge-ep2", "Challenge (Episode 2)", "$E$C6Challenge mode\nquests in Episode 2"], - [0x88, "solo-story", "Story", "$E$C6Quests that follow\nthe story"], - [0x88, "solo-extra", "Solo", "$E$C6Quests that require\na single player"], - [0x10, "government-ep1", "Hero in Red", "$E$CG-Red Ring Rico-\n$C6Quests that follow\nthe Episode 1\nstoryline"], - [0x10, "government-ep2", "The Military's Hero", "$E$CG-Heathcliff Flowen-\n$C6Quests that follow\nthe Episode 2\nstoryline"], - [0x10, "government-ep4", "The Meteor Impact Incident", "$E$C6Quests that follow\nthe Episode 4\nstoryline"], - [0x20, "download", "Download", "$E$C6Quests to download\nto your Memory Card"], - [0x40, "download-ep3-trial", "Trial Download", "$E$C6Quests to download\nto your Memory Card\nfrom Episode 3\nTrial Edition"], - [0x40, "download-ep3", "Download", "$E$C6Quests to download\nto your Memory Card"], + [0x081, "retrieval", "Retrieval", "$E$C6Quests that involve\nretrieving an object"], + [0x081, "extermination", "Extermination", "$E$C6Quests that involve\ndestroying all\nmonsters"], + [0x081, "events", "Events", "$E$C6Quests that are part\nof an event"], + [0x081, "shops", "Shops", "$E$C6Quests that contain\nshops"], + [0x081, "vr", "Virtual Reality", "$E$C6Quests that are\ndone in a simulator"], + [0x081, "tower", "Control Tower", "$E$C6Quests that take\nplace at the Control\nTower"], + [0x081, "team", "Team", "$E$C6Quests for you\nand your team\nmembers."], + [0x002, "battle", "Battle", "$E$C6Battle mode rule\nsets"], + [0x004, "challenge-ep1", "Challenge (Episode 1)", "$E$C6Challenge mode\nquests in Episode 1"], + [0x104, "challenge-ep2", "Challenge (Episode 2)", "$E$C6Challenge mode\nquests in Episode 2"], + [0x088, "solo-story", "Story", "$E$C6Quests that follow\nthe story"], + [0x088, "solo-extra", "Solo", "$E$C6Quests that require\na single player"], + [0x010, "government-ep1", "Hero in Red", "$E$CG-Red Ring Rico-\n$C6Quests that follow\nthe Episode 1\nstoryline"], + [0x010, "government-ep2", "The Military's Hero", "$E$CG-Heathcliff Flowen-\n$C6Quests that follow\nthe Episode 2\nstoryline"], + [0x010, "government-ep4", "The Meteor Impact Incident", "$E$C6Quests that follow\nthe Episode 4\nstoryline"], + [0x020, "download", "Download", "$E$C6Quests to download\nto your Memory Card"], + [0x040, "download-ep3-trial", "Trial Download", "$E$C6Quests to download\nto your Memory Card\nfrom Episode 3\nTrial Edition"], + [0x040, "download-ep3", "Download", "$E$C6Quests to download\nto your Memory Card"], ], // Item stack limits. Note that changing these does not affect the client's diff --git a/system/quests/challenge-ep1/c88101.json b/system/quests/challenge-ep1/c88101.json index 72399d77..117527de 100644 --- a/system/quests/challenge-ep1/c88101.json +++ b/system/quests/challenge-ep1/c88101.json @@ -1,3 +1,4 @@ { - "ChallengeTemplateIndex": 0 + "ChallengeTemplateIndex": 0, + "DescriptionFlag": 51 } diff --git a/system/quests/challenge-ep1/c88102.json b/system/quests/challenge-ep1/c88102.json index 0d485ed6..d1d90bb8 100644 --- a/system/quests/challenge-ep1/c88102.json +++ b/system/quests/challenge-ep1/c88102.json @@ -1,5 +1,6 @@ { "ChallengeTemplateIndex": 1, + "DescriptionFlag": 52, "AvailableIf": "CC_Ep1_1", "EnabledIf": "CC_Ep1_1" } diff --git a/system/quests/challenge-ep1/c88103.json b/system/quests/challenge-ep1/c88103.json index 5b88afff..567bb603 100644 --- a/system/quests/challenge-ep1/c88103.json +++ b/system/quests/challenge-ep1/c88103.json @@ -1,5 +1,6 @@ { "ChallengeTemplateIndex": 2, + "DescriptionFlag": 53, "AvailableIf": "CC_Ep1_2", "EnabledIf": "CC_Ep1_2" } diff --git a/system/quests/challenge-ep1/c88104.json b/system/quests/challenge-ep1/c88104.json index 2ff5f03e..97a71e0e 100644 --- a/system/quests/challenge-ep1/c88104.json +++ b/system/quests/challenge-ep1/c88104.json @@ -1,5 +1,6 @@ { "ChallengeTemplateIndex": 3, + "DescriptionFlag": 54, "AvailableIf": "CC_Ep1_3", "EnabledIf": "CC_Ep1_3" } diff --git a/system/quests/challenge-ep1/c88105.json b/system/quests/challenge-ep1/c88105.json index 8921a6c3..4258bf23 100644 --- a/system/quests/challenge-ep1/c88105.json +++ b/system/quests/challenge-ep1/c88105.json @@ -1,5 +1,6 @@ { "ChallengeTemplateIndex": 4, + "DescriptionFlag": 55, "AvailableIf": "CC_Ep1_4", "EnabledIf": "CC_Ep1_4" } diff --git a/system/quests/challenge-ep1/c88106.json b/system/quests/challenge-ep1/c88106.json index 1349ff2c..7b8a3772 100644 --- a/system/quests/challenge-ep1/c88106.json +++ b/system/quests/challenge-ep1/c88106.json @@ -1,5 +1,6 @@ { "ChallengeTemplateIndex": 5, + "DescriptionFlag": 56, "AvailableIf": "CC_Ep1_5", "EnabledIf": "CC_Ep1_5" } diff --git a/system/quests/challenge-ep1/c88107.json b/system/quests/challenge-ep1/c88107.json index c27c415f..f1141a8a 100644 --- a/system/quests/challenge-ep1/c88107.json +++ b/system/quests/challenge-ep1/c88107.json @@ -1,5 +1,6 @@ { "ChallengeTemplateIndex": 6, + "DescriptionFlag": 57, "AvailableIf": "CC_Ep1_6", "EnabledIf": "CC_Ep1_6" } diff --git a/system/quests/challenge-ep1/c88108.json b/system/quests/challenge-ep1/c88108.json index ef401d5e..72605eae 100644 --- a/system/quests/challenge-ep1/c88108.json +++ b/system/quests/challenge-ep1/c88108.json @@ -1,5 +1,6 @@ { "ChallengeTemplateIndex": 7, + "DescriptionFlag": 58, "AvailableIf": "CC_Ep1_7", "EnabledIf": "CC_Ep1_7" } diff --git a/system/quests/challenge-ep1/c88109.json b/system/quests/challenge-ep1/c88109.json index b0a58fe6..3a115194 100644 --- a/system/quests/challenge-ep1/c88109.json +++ b/system/quests/challenge-ep1/c88109.json @@ -1,5 +1,6 @@ { "ChallengeTemplateIndex": 8, + "DescriptionFlag": 59, "AvailableIf": "CC_Ep1_8", "EnabledIf": "CC_Ep1_8" } diff --git a/system/quests/challenge-ep2/d88201.json b/system/quests/challenge-ep2/d88201.json index 2faae4ca..b99a4f21 100644 --- a/system/quests/challenge-ep2/d88201.json +++ b/system/quests/challenge-ep2/d88201.json @@ -1,3 +1,4 @@ { - "ChallengeTemplateIndex": 1 + "ChallengeTemplateIndex": 1, + "DescriptionFlag": 61, } diff --git a/system/quests/challenge-ep2/d88202.json b/system/quests/challenge-ep2/d88202.json index 7bc5ee08..30bb1a9e 100644 --- a/system/quests/challenge-ep2/d88202.json +++ b/system/quests/challenge-ep2/d88202.json @@ -1,5 +1,6 @@ { "ChallengeTemplateIndex": 4, + "DescriptionFlag": 62, "AvailableIf": "CC_Ep2_1", "EnabledIf": "CC_Ep2_1" } diff --git a/system/quests/challenge-ep2/d88203.json b/system/quests/challenge-ep2/d88203.json index 79c303d7..85ace15a 100644 --- a/system/quests/challenge-ep2/d88203.json +++ b/system/quests/challenge-ep2/d88203.json @@ -1,5 +1,6 @@ { "ChallengeTemplateIndex": 5, + "DescriptionFlag": 63, "AvailableIf": "CC_Ep2_2", "EnabledIf": "CC_Ep2_2" } diff --git a/system/quests/challenge-ep2/d88204.json b/system/quests/challenge-ep2/d88204.json index b6375928..8c21cf70 100644 --- a/system/quests/challenge-ep2/d88204.json +++ b/system/quests/challenge-ep2/d88204.json @@ -1,5 +1,6 @@ { "ChallengeTemplateIndex": 8, + "DescriptionFlag": 64, "AvailableIf": "CC_Ep2_3", "EnabledIf": "CC_Ep2_3" } diff --git a/system/quests/challenge-ep2/d88205.json b/system/quests/challenge-ep2/d88205.json index a528f650..5d2d3dd5 100644 --- a/system/quests/challenge-ep2/d88205.json +++ b/system/quests/challenge-ep2/d88205.json @@ -1,5 +1,6 @@ { "ChallengeTemplateIndex": 8, + "DescriptionFlag": 65, "AvailableIf": "CC_Ep2_4", "EnabledIf": "CC_Ep2_4" } diff --git a/tests/config.json b/tests/config.json index 6f019c77..a65cb9c6 100644 --- a/tests/config.json +++ b/tests/config.json @@ -190,24 +190,24 @@ }, "QuestCategories": [ - [0x81, "retrieval", "Retrieval", "$E$C6Quests that involve\nretrieving an object"], - [0x81, "extermination", "Extermination", "$E$C6Quests that involve\ndestroying all\nmonsters"], - [0x81, "events", "Events", "$E$C6Quests that are part\nof an event"], - [0x81, "shops", "Shops", "$E$C6Quests that contain\nshops"], - [0x81, "vr", "Virtual Reality", "$E$C6Quests that are\ndone in a simulator"], - [0x81, "tower", "Control Tower", "$E$C6Quests that take\nplace at the Control\nTower"], - [0x81, "team", "Team", "$E$C6Quests for you\nand your team\nmembers."], - [0x02, "battle", "Battle", "$E$C6Battle mode rule\nsets"], - [0x04, "challenge-ep1", "Challenge (Episode 1)", "$E$C6Challenge mode\nquests in Episode 1"], - [0x04, "challenge-ep2", "Challenge (Episode 2)", "$E$C6Challenge mode\nquests in Episode 2"], - [0x88, "solo-story", "Story", "$E$C6Quests that follow\nthe Episode 1 story"], - [0x88, "solo-extra", "Solo", "$E$C6Quests that require\na single player"], - [0x10, "government-ep1", "Hero in Red", "$E$CG-Red Ring Rico-\n$C6Quests that follow\nthe Episode 1\nstoryline"], - [0x10, "government-ep2", "The Military's Hero", "$E$CG-Heathcliff Flowen-\n$C6Quests that follow\nthe Episode 2\nstoryline"], - [0x10, "government-ep4", "The Meteor Impact Incident", "$E$C6Quests that follow\nthe Episode 4\nstoryline"], - [0x20, "download", "Download", "$E$C6Quests to download\nto your Memory Card"], - [0x40, "download-ep3-trial", "Trial Download", "$E$C6Quests to download\nto your Memory Card\nfrom Episode 3\nTrial Edition"], - [0x40, "download-ep3", "Download", "$E$C6Quests to download\nto your Memory Card"], + [0x081, "retrieval", "Retrieval", "$E$C6Quests that involve\nretrieving an object"], + [0x081, "extermination", "Extermination", "$E$C6Quests that involve\ndestroying all\nmonsters"], + [0x081, "events", "Events", "$E$C6Quests that are part\nof an event"], + [0x081, "shops", "Shops", "$E$C6Quests that contain\nshops"], + [0x081, "vr", "Virtual Reality", "$E$C6Quests that are\ndone in a simulator"], + [0x081, "tower", "Control Tower", "$E$C6Quests that take\nplace at the Control\nTower"], + [0x081, "team", "Team", "$E$C6Quests for you\nand your team\nmembers."], + [0x002, "battle", "Battle", "$E$C6Battle mode rule\nsets"], + [0x004, "challenge-ep1", "Challenge (Episode 1)", "$E$C6Challenge mode\nquests in Episode 1"], + [0x104, "challenge-ep2", "Challenge (Episode 2)", "$E$C6Challenge mode\nquests in Episode 2"], + [0x088, "solo-story", "Story", "$E$C6Quests that follow\nthe Episode 1 story"], + [0x088, "solo-extra", "Solo", "$E$C6Quests that require\na single player"], + [0x010, "government-ep1", "Hero in Red", "$E$CG-Red Ring Rico-\n$C6Quests that follow\nthe Episode 1\nstoryline"], + [0x010, "government-ep2", "The Military's Hero", "$E$CG-Heathcliff Flowen-\n$C6Quests that follow\nthe Episode 2\nstoryline"], + [0x010, "government-ep4", "The Meteor Impact Incident", "$E$C6Quests that follow\nthe Episode 4\nstoryline"], + [0x020, "download", "Download", "$E$C6Quests to download\nto your Memory Card"], + [0x040, "download-ep3-trial", "Trial Download", "$E$C6Quests to download\nto your Memory Card\nfrom Episode 3\nTrial Edition"], + [0x040, "download-ep3", "Download", "$E$C6Quests to download\nto your Memory Card"], ], "ItemStackLimits": [