From ff2a87d91e46199df89f65740e62a660c08a7005 Mon Sep 17 00:00:00 2001 From: status102 Date: Wed, 15 Nov 2023 16:21:14 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E8=82=89?= =?UTF-8?q?=E9=B8=BD=E6=AF=8F=E4=B8=80=E5=B1=82=E7=9A=84=E9=A2=84=E8=A7=81?= =?UTF-8?q?=E5=AF=86=E6=96=87=E6=9D=BF=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/tasks.json | 4 ++ .../Task/Roguelike/RoguelikeConfig.cpp | 1 + src/MaaCore/Task/Roguelike/RoguelikeConfig.h | 10 ++++ .../RoguelikeFoldartalGainTaskPlugin.cpp | 59 ++++++++++--------- .../RoguelikeFoldartalGainTaskPlugin.h | 3 + 5 files changed, 49 insertions(+), 28 deletions(-) diff --git a/resource/tasks.json b/resource/tasks.json index 74a62acf28..28d4f0fdff 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -14007,6 +14007,10 @@ [ "黜", "黜人" + ], + [ + "\"", + "" ] ] }, diff --git a/src/MaaCore/Task/Roguelike/RoguelikeConfig.cpp b/src/MaaCore/Task/Roguelike/RoguelikeConfig.cpp index 39d13ac193..b325d73081 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeConfig.cpp +++ b/src/MaaCore/Task/Roguelike/RoguelikeConfig.cpp @@ -7,4 +7,5 @@ void asst::RoguelikeConfig::clear() { m_trader_no_longer_buy = false; m_core_char = std::string(); m_team_full_without_rookie = false; + m_foldartal_floor = std::nullopt; } diff --git a/src/MaaCore/Task/Roguelike/RoguelikeConfig.h b/src/MaaCore/Task/Roguelike/RoguelikeConfig.h index 39e9688337..6a70bb5bd6 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeConfig.h +++ b/src/MaaCore/Task/Roguelike/RoguelikeConfig.h @@ -1,5 +1,8 @@ #pragma once #include +#include +#include +#include namespace asst { @@ -64,6 +67,9 @@ namespace asst void set_team_full_without_rookie(bool without_rookie) { m_team_full_without_rookie = without_rookie; } bool get_team_full_without_rookie() { return m_team_full_without_rookie; } + void set_foldartal_floor(std::optional floor) { m_foldartal_floor = std::move(floor); } + const std::optional& get_foldartal_floor() { return m_foldartal_floor; } + protected: // 肉鸽主题 std::string m_theme; @@ -81,5 +87,9 @@ namespace asst bool m_trader_no_longer_buy = false; std::string m_core_char; bool m_team_full_without_rookie = false; + + /* 密文板 */ + // 当前层的预见密文板,在下一层获得 + std::optional m_foldartal_floor; }; } // namespace asst diff --git a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.cpp index 5cbc90b51a..9cef49f719 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.cpp @@ -56,41 +56,44 @@ bool asst::RoguelikeFoldartalGainTaskPlugin::_run() { LogTraceFunction; - std::string theme = m_config->get_theme(); - auto image = ctrler()->get_image(); - - OCRer analyzer(image); - std::string foldartal = "None"; if (m_ocr_next_level) { - analyzer.set_task_info(theme + "@Roguelike@FoldartalGainOcrNextLevel"); - if (analyzer.analyze()) { - foldartal = analyzer.get_result().front().text; - } - store_to_status(foldartal, Status::RoguelikeFoldartalFloor); - json::array foldartal_floor_array = get_array(Status::RoguelikeFoldartalFloor); - // 到达第二层后,获得上一层预见的密文板 - if (foldartal_floor_array.size() >= 2) { - std::string foldartal_last_floor = (foldartal_floor_array.end() - 2)->to_string(); - if (foldartal_last_floor.size() >= 2 && foldartal_last_floor.front() == '"' && - foldartal_last_floor.back() == '"') { - foldartal_last_floor = foldartal_last_floor.substr(1, foldartal_last_floor.size() - 2); - } - if (foldartal_last_floor != "None") { - store_to_status(foldartal_last_floor, Status::RoguelikeFoldartalOverview); - } - } + enter_next_floor(); return true; - }; + } + else { + return after_combat(); + } +} - std::string task_name = - m_ocr_after_combat ? theme + "@Roguelike@FoldartalGainOcrAfterCombat" : theme + "@Roguelike@FoldartalGainOcr"; - analyzer.set_task_info(task_name); +void asst::RoguelikeFoldartalGainTaskPlugin::enter_next_floor() +{ + auto foldartal_floor = m_config->get_foldartal_floor(); + // 到达第二层后,获得上一层预见的密文板 + if (foldartal_floor) { + store_to_status(*foldartal_floor, Status::RoguelikeFoldartalOverview); + } + + foldartal_floor.reset(); + OCRer analyzer(ctrler()->get_image()); + analyzer.set_task_info(m_config->get_theme() + "@Roguelike@FoldartalGainOcrNextLevel"); + if (analyzer.analyze()) { + foldartal_floor = analyzer.get_result().front().text; + } + m_config->set_foldartal_floor(std::move(foldartal_floor)); +} + +bool asst::RoguelikeFoldartalGainTaskPlugin::after_combat() +{ + OCRer analyzer(ctrler()->get_image()); + analyzer.set_task_info(m_config->get_theme() + (m_ocr_after_combat ? "@Roguelike@FoldartalGainOcrAfterCombat" + : "@Roguelike@FoldartalGainOcr")); if (!analyzer.analyze()) { return false; } - foldartal = analyzer.get_result().front().text; - store_to_status(foldartal, Status::RoguelikeFoldartalOverview); + + auto foldartal = analyzer.get_result().front().text; + store_to_status(std::move(foldartal), Status::RoguelikeFoldartalOverview); if (m_ocr_after_combat) { ctrler()->click(analyzer.get_result().front().rect); } diff --git a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.h b/src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.h index 170a012e89..7e7df8e1bb 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.h @@ -16,6 +16,9 @@ namespace asst virtual bool _run() override; private: + void enter_next_floor(); + bool after_combat(); + json::array get_array(auto& status_string); bool store_to_status(std::string foldartal, auto& status_string); // 战斗后识别密文板