From 0a8db14315ca9c4fe89db3eb29684a2b26cd72d6 Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Thu, 13 Oct 2022 14:10:15 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E8=82=89?= =?UTF-8?q?=E9=B8=BD=E8=B5=84=E6=BA=90=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=92=8C=E4=BB=BB=E5=8A=A1=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RoguelikeFormationImageAnalyzer.cpp | 4 +- .../RoguelikeRecruitImageAnalyzer.cpp | 12 +-- .../RoguelikeSkillSelectionImageAnalyzer.cpp | 12 +-- src/MeoAssistant/Resource/TemplResource.cpp | 12 +++ src/MeoAssistant/RuntimeStatus.cpp | 20 +++++ src/MeoAssistant/RuntimeStatus.h | 7 +- .../Task/Plugin/RoguelikeBattleTaskPlugin.cpp | 18 +++- .../Plugin/RoguelikeControlTaskPlugin.cpp | 17 +++- .../Plugin/RoguelikeCustomStartTaskPlugin.cpp | 31 ++++--- .../Task/Plugin/RoguelikeDebugTaskPlugin.cpp | 14 ++- .../Plugin/RoguelikeFormationTaskPlugin.cpp | 17 +++- .../Plugin/RoguelikeRecruitTaskPlugin.cpp | 18 +++- .../Task/Plugin/RoguelikeResetTaskPlugin.cpp | 12 ++- .../Plugin/RoguelikeShoppingTaskPlugin.cpp | 16 +++- .../RoguelikeSkillSelectionTaskPlugin.cpp | 14 ++- src/MeoAssistant/Task/RoguelikeTask.cpp | 28 ++++-- src/MeoAssistant/TaskData.cpp | 6 +- src/MeoAsstGui/Helper/AsstProxy.cs | 85 ++++++++++--------- .../ViewModels/SettingsViewModel.cs | 6 +- .../ViewModels/TaskQueueViewModel.cs | 5 +- 20 files changed, 248 insertions(+), 106 deletions(-) diff --git a/src/MeoAssistant/ImageAnalyzer/RoguelikeFormationImageAnalyzer.cpp b/src/MeoAssistant/ImageAnalyzer/RoguelikeFormationImageAnalyzer.cpp index 9e645c2adf..2207b64e61 100644 --- a/src/MeoAssistant/ImageAnalyzer/RoguelikeFormationImageAnalyzer.cpp +++ b/src/MeoAssistant/ImageAnalyzer/RoguelikeFormationImageAnalyzer.cpp @@ -12,7 +12,7 @@ bool asst::RoguelikeFormationImageAnalyzer::analyze() m_result.clear(); MultiMatchImageAnalyzer opers_analyzer(m_image); - opers_analyzer.set_task_info("Roguelike1FormationOper"); + opers_analyzer.set_task_info("RoguelikeFormationOper"); if (!opers_analyzer.analyze()) { return false; @@ -51,7 +51,7 @@ bool asst::RoguelikeFormationImageAnalyzer::selected_analyze(const Rect& roi) cv::Mat hsv; cv::cvtColor(img_roi, hsv, cv::COLOR_BGR2HSV); - const auto selected_task_ptr = Task.get("Roguelike1FormationOperSelected"); + const auto selected_task_ptr = Task.get("RoguelikeFormationOperSelected"); int h_low = selected_task_ptr->mask_range.first; int h_up = selected_task_ptr->mask_range.second; int s_low = selected_task_ptr->specific_rect.x; diff --git a/src/MeoAssistant/ImageAnalyzer/RoguelikeRecruitImageAnalyzer.cpp b/src/MeoAssistant/ImageAnalyzer/RoguelikeRecruitImageAnalyzer.cpp index c0867a4fc2..7b510d2bfe 100644 --- a/src/MeoAssistant/ImageAnalyzer/RoguelikeRecruitImageAnalyzer.cpp +++ b/src/MeoAssistant/ImageAnalyzer/RoguelikeRecruitImageAnalyzer.cpp @@ -10,9 +10,9 @@ bool asst::RoguelikeRecruitImageAnalyzer::analyze() LogTraceFunction; OcrWithFlagTemplImageAnalyzer analyzer(m_image); - analyzer.set_task_info("Roguelike1RecruitOcrFlag", "Roguelike1RecruitOcr"); + analyzer.set_task_info("RoguelikeRecruitOcrFlag", "RoguelikeRecruitOcr"); analyzer.set_replace(Task.get("CharsNameOcrReplace")->replace_map); - analyzer.set_threshold(Task.get("Roguelike1RecruitOcr")->specific_rect.x); + analyzer.set_threshold(Task.get("RoguelikeRecruitOcr")->specific_rect.x); if (!analyzer.analyze()) { return false; @@ -46,9 +46,9 @@ int asst::RoguelikeRecruitImageAnalyzer::match_elite(const Rect& raw_roi) LogTraceFunction; static const std::unordered_map EliteTaskName = { - { "Roguelike1RecruitElite0", 0 }, - { "Roguelike1RecruitElite1", 1 }, - { "Roguelike1RecruitElite2", 2 }, + { "RoguelikeRecruitElite0", 0 }, + { "RoguelikeRecruitElite1", 1 }, + { "RoguelikeRecruitElite2", 2 }, }; int elite_result = 0; @@ -76,7 +76,7 @@ int asst::RoguelikeRecruitImageAnalyzer::match_level(const Rect& raw_roi) { LogTraceFunction; - auto task_ptr = Task.get("Roguelike1RecruitLevel"); + auto task_ptr = Task.get("RoguelikeRecruitLevel"); OcrWithPreprocessImageAnalyzer analyzer(m_image, raw_roi.move(task_ptr->roi)); auto& replace = Task.get("NumberOcrReplace")->replace_map; analyzer.set_replace(replace); diff --git a/src/MeoAssistant/ImageAnalyzer/RoguelikeSkillSelectionImageAnalyzer.cpp b/src/MeoAssistant/ImageAnalyzer/RoguelikeSkillSelectionImageAnalyzer.cpp index d6afa10c99..09a93c3eae 100644 --- a/src/MeoAssistant/ImageAnalyzer/RoguelikeSkillSelectionImageAnalyzer.cpp +++ b/src/MeoAssistant/ImageAnalyzer/RoguelikeSkillSelectionImageAnalyzer.cpp @@ -13,7 +13,7 @@ bool asst::RoguelikeSkillSelectionImageAnalyzer::analyze() { MultiMatchImageAnalyzer flag_analyzer(m_image); - flag_analyzer.set_task_info("Roguelike1SkillSelectionFlag"); + flag_analyzer.set_task_info("RoguelikeSkillSelectionFlag"); if (!flag_analyzer.analyze()) { return false; @@ -49,7 +49,7 @@ bool asst::RoguelikeSkillSelectionImageAnalyzer::analyze() std::string asst::RoguelikeSkillSelectionImageAnalyzer::name_analyze(const Rect& roi) { OcrWithPreprocessImageAnalyzer analyzer; - auto name_task_ptr = Task.get("Roguelike1SkillSelectionName"); + auto name_task_ptr = Task.get("RoguelikeSkillSelectionName"); analyzer.set_threshold(name_task_ptr->specific_rect.x); analyzer.set_task_info(name_task_ptr); analyzer.set_image(m_image); @@ -66,9 +66,9 @@ std::string asst::RoguelikeSkillSelectionImageAnalyzer::name_analyze(const Rect& std::vector asst::RoguelikeSkillSelectionImageAnalyzer::skill_analyze(const Rect& roi) { static const std::array TasksName = { - "Roguelike1SkillSelectionMove1", - "Roguelike1SkillSelectionMove2", - "Roguelike1SkillSelectionMove3", + "RoguelikeSkillSelectionMove1", + "RoguelikeSkillSelectionMove2", + "RoguelikeSkillSelectionMove3", }; std::vector result; result.reserve(TasksName.size()); @@ -82,6 +82,6 @@ std::vector asst::RoguelikeSkillSelectionImageAnalyzer::skill_analyz void asst::RoguelikeSkillSelectionImageAnalyzer::team_full_analyze() { MatchImageAnalyzer analyzer(m_image); - analyzer.set_task_info("Roguelike1SkillSelectionTeamFull"); + analyzer.set_task_info("RoguelikeSkillSelectionTeamFull"); m_team_full = !analyzer.analyze(); } diff --git a/src/MeoAssistant/Resource/TemplResource.cpp b/src/MeoAssistant/Resource/TemplResource.cpp index 8677583c7b..a88d13cab5 100644 --- a/src/MeoAssistant/Resource/TemplResource.cpp +++ b/src/MeoAssistant/Resource/TemplResource.cpp @@ -19,6 +19,9 @@ bool asst::TemplResource::load(const std::filesystem::path& path) LogTraceFunction; Log.info("load", path); +#ifdef ASST_DEBUG + bool some_file_not_exists = false; +#endif for (const std::string& filename : m_templs_filename) { std::filesystem::path filepath(path / asst::utils::path(filename)); if (!filepath.has_extension()) { @@ -33,9 +36,18 @@ bool asst::TemplResource::load(const std::filesystem::path& path) } else { Log.error("Templ load failed, file not exists", filepath); +#ifdef ASST_DEBUG + some_file_not_exists = true; +#else return false; +#endif } } +#ifdef ASST_DEBUG + if (some_file_not_exists) { + return false; + } +#endif m_loaded = true; return true; } diff --git a/src/MeoAssistant/RuntimeStatus.cpp b/src/MeoAssistant/RuntimeStatus.cpp index ca7ac7bc2a..7bcbe10bda 100644 --- a/src/MeoAssistant/RuntimeStatus.cpp +++ b/src/MeoAssistant/RuntimeStatus.cpp @@ -59,3 +59,23 @@ void asst::RuntimeStatus::clear_str() noexcept { m_string.clear(); } + +std::optional asst::RuntimeStatus::get_properties(const std::string& key) const noexcept +{ + if (auto iter = m_properties.find(key); iter != m_properties.cend()) { + return iter->second; + } + else { + return std::nullopt; + } +} + +void asst::RuntimeStatus::set_properties(std::string key, std::string value) +{ + m_properties.insert_or_assign(std::move(key), std::move(value)); +} + +void asst::RuntimeStatus::clear_properties() noexcept +{ + m_properties.clear(); +} diff --git a/src/MeoAssistant/RuntimeStatus.h b/src/MeoAssistant/RuntimeStatus.h index d91a8e0b02..01405c247e 100644 --- a/src/MeoAssistant/RuntimeStatus.h +++ b/src/MeoAssistant/RuntimeStatus.h @@ -29,6 +29,10 @@ namespace asst void set_str(std::string key, std::string value); void clear_str() noexcept; + std::optional get_properties(const std::string& key) const noexcept; + void set_properties(std::string key, std::string value); + void clear_properties() noexcept; + RuntimeStatus& operator=(const RuntimeStatus& rhs) = delete; RuntimeStatus& operator=(RuntimeStatus&& rhs) noexcept = delete; @@ -45,6 +49,7 @@ namespace asst private: std::unordered_map m_number; std::unordered_map m_rect; - std::unordered_map m_string; + std::unordered_map m_string; // 跨任务时会被清理的量 + std::unordered_map m_properties; // 跨任务时不会清理的量 }; } diff --git a/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.cpp b/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.cpp index 9754537721..c191531717 100644 --- a/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.cpp +++ b/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.cpp @@ -25,7 +25,17 @@ bool asst::RoguelikeBattleTaskPlugin::verify(AsstMsg msg, const json::value& det return false; } - if (details.at("details").at("task").as_string() == "Roguelike1StartAction") { + auto roguelike_name_opt = m_status->get_properties("roguelike_name"); + if (!roguelike_name_opt) { + return false; + } + const auto& roguelike_name = roguelike_name_opt.value() + "@"; + const std::string& task = details.get("details", "task", ""); + std::string_view task_view = task; + if (task_view.starts_with(roguelike_name)) { + task_view.remove_prefix(roguelike_name.length()); + } + if (task_view == "Roguelike@StartAction") { return true; } else { @@ -89,7 +99,7 @@ bool asst::RoguelikeBattleTaskPlugin::_run() void asst::RoguelikeBattleTaskPlugin::wait_for_start() { - ProcessTask(*this, { "Roguelike1WaitBattleStart" }).set_task_delay(0).set_retry_times(0).run(); + ProcessTask(*this, { "RoguelikeWaitBattleStart" }).set_task_delay(0).set_retry_times(0).run(); } bool asst::RoguelikeBattleTaskPlugin::get_stage_info() @@ -786,7 +796,7 @@ bool asst::RoguelikeBattleTaskPlugin::auto_battle() bool asst::RoguelikeBattleTaskPlugin::speed_up() { - return ProcessTask(*this, { "Roguelike1BattleSpeedUp" }).run(); + return ProcessTask(*this, { "RoguelikeBattleSpeedUp" }).run(); } bool asst::RoguelikeBattleTaskPlugin::use_skill(const Rect& rect) @@ -809,7 +819,7 @@ bool asst::RoguelikeBattleTaskPlugin::retreat(const Point& point) bool asst::RoguelikeBattleTaskPlugin::abandon() { - return ProcessTask(*this, { "Roguelike1BattleExitBegin" }).run(); + return ProcessTask(*this, { "RoguelikeBattleExitBegin" }).run(); } void asst::RoguelikeBattleTaskPlugin::all_melee_retreat() diff --git a/src/MeoAssistant/Task/Plugin/RoguelikeControlTaskPlugin.cpp b/src/MeoAssistant/Task/Plugin/RoguelikeControlTaskPlugin.cpp index 2e39057d43..e7288d17a0 100644 --- a/src/MeoAssistant/Task/Plugin/RoguelikeControlTaskPlugin.cpp +++ b/src/MeoAssistant/Task/Plugin/RoguelikeControlTaskPlugin.cpp @@ -1,5 +1,7 @@ #include "RoguelikeControlTaskPlugin.h" +#include "RuntimeStatus.h" + bool asst::RoguelikeControlTaskPlugin::verify(AsstMsg msg, const json::value& details) const { if (msg != AsstMsg::SubTaskExtraInfo || details.get("subtask", std::string()) != "ProcessTask") { @@ -10,9 +12,18 @@ bool asst::RoguelikeControlTaskPlugin::verify(AsstMsg msg, const json::value& de return false; } - const std::string task = details.at("details").at("task").as_string(); - if (task == "Roguelike1Start" || task == "Roguelike1StageTraderInvestConfirm" || - task == "Roguelike1StageTraderInvestSystemFull") { + auto roguelike_name_opt = m_status->get_properties("roguelike_name"); + if (!roguelike_name_opt) { + return false; + } + const auto& roguelike_name = roguelike_name_opt.value() + "@"; + const std::string& task = details.get("details", "task", ""); + std::string_view task_view = task; + if (task_view.starts_with(roguelike_name)) { + task_view.remove_prefix(roguelike_name.length()); + } + if (task_view == "Roguelike@Start" || task_view == "Roguelike@StageTraderInvestConfirm" || + task_view == "Roguelike@StageTraderInvestSystemFull") { return true; } diff --git a/src/MeoAssistant/Task/Plugin/RoguelikeCustomStartTaskPlugin.cpp b/src/MeoAssistant/Task/Plugin/RoguelikeCustomStartTaskPlugin.cpp index beec3ee90d..fc3220a6f2 100644 --- a/src/MeoAssistant/Task/Plugin/RoguelikeCustomStartTaskPlugin.cpp +++ b/src/MeoAssistant/Task/Plugin/RoguelikeCustomStartTaskPlugin.cpp @@ -14,13 +14,22 @@ bool asst::RoguelikeCustomStartTaskPlugin::verify(AsstMsg msg, const json::value return false; } - static const std::unordered_map> TaskMap = { - { "Roguelike1Recruit1", { AsstMsg::SubTaskCompleted, RoguelikeCustomType::Squad } }, - { "Roguelike1Team3", { AsstMsg::SubTaskCompleted, RoguelikeCustomType::Roles } }, - { "Roguelike1RecruitMain", { AsstMsg::SubTaskStart, RoguelikeCustomType::CoreChar } }, - }; + auto roguelike_name_opt = m_status->get_properties("roguelike_name"); + if (!roguelike_name_opt) { + return false; + } + const auto& roguelike_name = roguelike_name_opt.value() + "@"; const std::string& task = details.get("details", "task", ""); - auto it = TaskMap.find(task); + std::string_view task_view = task; + if (task_view.starts_with(roguelike_name)) { + task_view.remove_prefix(roguelike_name.length()); + } + static const std::unordered_map> TaskMap = { + { "Roguelike@Recruit1", { AsstMsg::SubTaskCompleted, RoguelikeCustomType::Squad } }, + { "Roguelike@Team3", { AsstMsg::SubTaskCompleted, RoguelikeCustomType::Roles } }, + { "Roguelike@RecruitMain", { AsstMsg::SubTaskStart, RoguelikeCustomType::CoreChar } }, + }; + auto it = TaskMap.find(task_view); if (it == TaskMap.cend()) { return false; } @@ -70,12 +79,12 @@ bool asst::RoguelikeCustomStartTaskPlugin::hijack_squad() for (size_t i = 0; i != SwipeTimes; ++i) { auto image = m_ctrler->get_image(); OcrImageAnalyzer analyzer(image); - analyzer.set_task_info("Roguelike1Custom-HijackSquad"); + analyzer.set_task_info("RoguelikeCustom-HijackSquad"); analyzer.set_required({ m_customs[RoguelikeCustomType::Squad] }); if (!analyzer.analyze()) { ProcessTask(*this, { "SlowlySwipeToTheRight" }).run(); - sleep(Task.get("Roguelike1Custom-HijackSquad")->rear_delay); + sleep(Task.get("RoguelikeCustom-HijackSquad")->rear_delay); continue; } const auto& rect = analyzer.get_result().front().rect; @@ -90,7 +99,7 @@ bool asst::RoguelikeCustomStartTaskPlugin::hijack_roles() { auto image = m_ctrler->get_image(); OcrImageAnalyzer analyzer(image); - analyzer.set_task_info("Roguelike1Custom-HijackRoles"); + analyzer.set_task_info("RoguelikeCustom-HijackRoles"); analyzer.set_required({ m_customs[RoguelikeCustomType::Roles] }); if (!analyzer.analyze()) { @@ -121,7 +130,7 @@ bool asst::RoguelikeCustomStartTaskPlugin::hijack_core_char() Log.info("role", role_ocr_name); auto image = m_ctrler->get_image(); OcrImageAnalyzer analyzer(image); - analyzer.set_task_info("Roguelike1Custom-HijackCoChar"); + analyzer.set_task_info("RoguelikeCustom-HijackCoChar"); analyzer.set_required({ role_ocr_name }); if (!analyzer.analyze()) { return false; @@ -129,7 +138,7 @@ bool asst::RoguelikeCustomStartTaskPlugin::hijack_core_char() const auto& role_rect = analyzer.get_result().front().rect; m_ctrler->click(role_rect); - sleep(Task.get("Roguelike1Custom-HijackCoChar")->pre_delay); + sleep(Task.get("RoguelikeCustom-HijackCoChar")->pre_delay); m_status->set_str(RuntimeStatus::RoguelikeCoreChar, char_name); return true; diff --git a/src/MeoAssistant/Task/Plugin/RoguelikeDebugTaskPlugin.cpp b/src/MeoAssistant/Task/Plugin/RoguelikeDebugTaskPlugin.cpp index 881e21145a..c2926a3a32 100644 --- a/src/MeoAssistant/Task/Plugin/RoguelikeDebugTaskPlugin.cpp +++ b/src/MeoAssistant/Task/Plugin/RoguelikeDebugTaskPlugin.cpp @@ -1,6 +1,7 @@ #include "RoguelikeDebugTaskPlugin.h" #include "Controller.h" +#include "RuntimeStatus.h" bool asst::RoguelikeDebugTaskPlugin::verify(AsstMsg msg, const json::value& details) const { @@ -12,9 +13,18 @@ bool asst::RoguelikeDebugTaskPlugin::verify(AsstMsg msg, const json::value& deta return true; } - std::string task = details.get("details", "task", std::string()); + auto roguelike_name_opt = m_status->get_properties("roguelike_name"); + if (!roguelike_name_opt) { + return false; + } + const auto& roguelike_name = roguelike_name_opt.value() + "@"; + const std::string& task = details.get("details", "task", ""); + std::string_view task_view = task; + if (task_view.starts_with(roguelike_name)) { + task_view.remove_prefix(roguelike_name.length()); + } if (msg == AsstMsg::SubTaskStart && details.get("subtask", std::string()) == "ProcessTask") { - if (task == "Roguelike1ExitThenAbandon" || task == "Roguelike1GamePass") { + if (task_view == "Roguelike@ExitThenAbandon" || task_view == "Roguelike@GamePass") { return true; } } diff --git a/src/MeoAssistant/Task/Plugin/RoguelikeFormationTaskPlugin.cpp b/src/MeoAssistant/Task/Plugin/RoguelikeFormationTaskPlugin.cpp index fc71c04d76..b6ea68a417 100644 --- a/src/MeoAssistant/Task/Plugin/RoguelikeFormationTaskPlugin.cpp +++ b/src/MeoAssistant/Task/Plugin/RoguelikeFormationTaskPlugin.cpp @@ -6,6 +6,7 @@ #include "Controller.h" #include "ImageAnalyzer/RoguelikeFormationImageAnalyzer.h" #include "TaskData.h" +#include "RuntimeStatus.h" #include "Utils/Logger.hpp" bool asst::RoguelikeFormationTaskPlugin::verify(AsstMsg msg, const json::value& details) const @@ -14,7 +15,17 @@ bool asst::RoguelikeFormationTaskPlugin::verify(AsstMsg msg, const json::value& return false; } - if (details.at("details").at("task").as_string() == "Roguelike1QuickFormation") { + auto roguelike_name_opt = m_status->get_properties("roguelike_name"); + if (!roguelike_name_opt) { + return false; + } + const auto& roguelike_name = roguelike_name_opt.value() + "@"; + const std::string& task = details.get("details", "task", ""); + std::string_view task_view = task; + if (task_view.starts_with(roguelike_name)) { + task_view.remove_prefix(roguelike_name.length()); + } + if (task_view == "Roguelike@QuickFormation") { return true; } else { @@ -50,7 +61,7 @@ bool asst::RoguelikeFormationTaskPlugin::_run() reselect = true; } if (!reselect && select_count != 0) { - sleep(Task.get("Roguelike1QuickFormationDelay")->rear_delay); + sleep(Task.get("RoguelikeQuickFormationDelay")->rear_delay); formation_analyzer.set_image(m_ctrler->get_image()); if (!formation_analyzer.analyze()) { @@ -76,7 +87,7 @@ bool asst::RoguelikeFormationTaskPlugin::_run() void asst::RoguelikeFormationTaskPlugin::clear_and_reselect() { // 清空并退出游戏会自动按等级重新排序 - ProcessTask(*this, { "Roguelike1QuickFormationClearAndReselect" }).run(); + ProcessTask(*this, { "RoguelikeQuickFormationClearAndReselect" }).run(); size_t select_count = analyze_and_select(); // 说明第二页还有 diff --git a/src/MeoAssistant/Task/Plugin/RoguelikeRecruitTaskPlugin.cpp b/src/MeoAssistant/Task/Plugin/RoguelikeRecruitTaskPlugin.cpp index ee28e7cc4b..f1a25e1f94 100644 --- a/src/MeoAssistant/Task/Plugin/RoguelikeRecruitTaskPlugin.cpp +++ b/src/MeoAssistant/Task/Plugin/RoguelikeRecruitTaskPlugin.cpp @@ -14,7 +14,17 @@ bool asst::RoguelikeRecruitTaskPlugin::verify(AsstMsg msg, const json::value& de return false; } - if (details.at("details").at("task").as_string() == "Roguelike1ChooseOper") { + auto roguelike_name_opt = m_status->get_properties("roguelike_name"); + if (!roguelike_name_opt) { + return false; + } + const auto& roguelike_name = roguelike_name_opt.value() + "@"; + const std::string& task = details.get("details", "task", ""); + std::string_view task_view = task; + if (task_view.starts_with(roguelike_name)) { + task_view.remove_prefix(roguelike_name.length()); + } + if (task_view == "Roguelike@ChooseOper") { return true; } else { @@ -52,7 +62,7 @@ bool asst::RoguelikeRecruitTaskPlugin::_run() // 干员名字的识别位置 std::unordered_map last_oper_rects; - int SwipeTimes = Task.get("Roguelike1RecruitSwipeMaxTime")->max_times; + int SwipeTimes = Task.get("RoguelikeRecruitSwipeMaxTime")->max_times; int i = 0; std::unordered_set pre_oper_names; // 翻页找出所有候选干员 @@ -182,7 +192,7 @@ bool asst::RoguelikeRecruitTaskPlugin::_run() // 向右滑动 Log.trace(__FUNCTION__, "| Page", i, "oper count:", oper_count, "- continue swiping"); slowly_swipe(ProcessTaskAction::SlowlySwipeToTheRight); - sleep(Task.get("Roguelike1Custom-HijackSquad")->rear_delay); + sleep(Task.get("RoguelikeCustom-HijackSquad")->rear_delay); } // 没有候选干员,进入后备逻辑 @@ -307,7 +317,7 @@ bool asst::RoguelikeRecruitTaskPlugin::check_char(const std::string& char_name, else { slowly_swipe(ProcessTaskAction::SlowlySwipeToTheRight); } - sleep(Task.get("Roguelike1Custom-HijackSquad")->rear_delay); + sleep(Task.get("RoguelikeCustom-HijackSquad")->rear_delay); } Log.info(__FUNCTION__, "| Cannot find oper `" + char_name + "`"); swipe_to_the_left_of_operlist(i / 3 + 1); diff --git a/src/MeoAssistant/Task/Plugin/RoguelikeResetTaskPlugin.cpp b/src/MeoAssistant/Task/Plugin/RoguelikeResetTaskPlugin.cpp index d8f42e56b8..0b2e94ed2b 100644 --- a/src/MeoAssistant/Task/Plugin/RoguelikeResetTaskPlugin.cpp +++ b/src/MeoAssistant/Task/Plugin/RoguelikeResetTaskPlugin.cpp @@ -8,7 +8,17 @@ bool asst::RoguelikeResetTaskPlugin::verify(AsstMsg msg, const json::value& deta return false; } - if (details.at("details").at("task").as_string() == "Roguelike1Start") { + auto roguelike_name_opt = m_status->get_properties("roguelike_name"); + if (!roguelike_name_opt) { + return false; + } + const auto& roguelike_name = roguelike_name_opt.value() + "@"; + const std::string& task = details.get("details", "task", ""); + std::string_view task_view = task; + if (task_view.starts_with(roguelike_name)) { + task_view.remove_prefix(roguelike_name.length()); + } + if (task_view == "Roguelike@Start") { return true; } else { diff --git a/src/MeoAssistant/Task/Plugin/RoguelikeShoppingTaskPlugin.cpp b/src/MeoAssistant/Task/Plugin/RoguelikeShoppingTaskPlugin.cpp index 69b1d830eb..893332a7e5 100644 --- a/src/MeoAssistant/Task/Plugin/RoguelikeShoppingTaskPlugin.cpp +++ b/src/MeoAssistant/Task/Plugin/RoguelikeShoppingTaskPlugin.cpp @@ -14,7 +14,17 @@ bool asst::RoguelikeShoppingTaskPlugin::verify(AsstMsg msg, const json::value& d return false; } - if (details.at("details").at("task").as_string() == "Roguelike1TraderRandomShopping") { + auto roguelike_name_opt = m_status->get_properties("roguelike_name"); + if (!roguelike_name_opt) { + return false; + } + const auto& roguelike_name = roguelike_name_opt.value() + "@"; + const std::string& task = details.get("details", "task", ""); + std::string_view task_view = task; + if (task_view.starts_with(roguelike_name)) { + task_view.remove_prefix(roguelike_name.length()); + } + if (task_view == "Roguelike@TraderRandomShopping") { return true; } else { @@ -27,7 +37,7 @@ bool asst::RoguelikeShoppingTaskPlugin::_run() LogTraceFunction; OcrWithFlagTemplImageAnalyzer analyzer; - analyzer.set_task_info("Roguelike1TraderShopping", "Roguelike1TraderShoppingOcr"); + analyzer.set_task_info("RoguelikeTraderShopping", "RoguelikeTraderShoppingOcr"); analyzer.set_image(m_ctrler->get_image()); if (!analyzer.analyze()) { @@ -151,7 +161,7 @@ bool asst::RoguelikeShoppingTaskPlugin::_run() if (!bought) { // 如果什么都没买,即使有商品,说明也是不需要买的,这里强制离开商店,后面让 ProcessTask 继续跑 - return ProcessTask(*this, { "Roguelike1TraderShoppingOver" }).run(); + return ProcessTask(*this, { "RoguelikeTraderShoppingOver" }).run(); } return true; diff --git a/src/MeoAssistant/Task/Plugin/RoguelikeSkillSelectionTaskPlugin.cpp b/src/MeoAssistant/Task/Plugin/RoguelikeSkillSelectionTaskPlugin.cpp index cfcc0e02d8..b9427b5046 100644 --- a/src/MeoAssistant/Task/Plugin/RoguelikeSkillSelectionTaskPlugin.cpp +++ b/src/MeoAssistant/Task/Plugin/RoguelikeSkillSelectionTaskPlugin.cpp @@ -14,7 +14,17 @@ bool asst::RoguelikeSkillSelectionTaskPlugin::verify(AsstMsg msg, const json::va return false; } - if (details.at("details").at("task").as_string() == "Roguelike1StartAction") { + auto roguelike_name_opt = m_status->get_properties("roguelike_name"); + if (!roguelike_name_opt) { + return false; + } + const auto& roguelike_name = roguelike_name_opt.value() + "@"; + const std::string& task = details.get("details", "task", ""); + std::string_view task_view = task; + if (task_view.starts_with(roguelike_name)) { + task_view.remove_prefix(roguelike_name.length()); + } + if (task_view == "Roguelike@StartAction") { return true; } else { @@ -33,7 +43,7 @@ bool asst::RoguelikeSkillSelectionTaskPlugin::_run() return false; } - int delay = Task.get("Roguelike1SkillSelectionMove1")->rear_delay; + int delay = Task.get("RoguelikeSkillSelectionMove1")->rear_delay; bool has_rookie = false; for (const auto& [name, skill_vec] : analyzer.get_result()) { if (name.empty()) { diff --git a/src/MeoAssistant/Task/RoguelikeTask.cpp b/src/MeoAssistant/Task/RoguelikeTask.cpp index dfa0786ed6..c854116f17 100644 --- a/src/MeoAssistant/Task/RoguelikeTask.cpp +++ b/src/MeoAssistant/Task/RoguelikeTask.cpp @@ -9,15 +9,15 @@ #include "Plugin/RoguelikeResetTaskPlugin.h" #include "Plugin/RoguelikeShoppingTaskPlugin.h" #include "Plugin/RoguelikeSkillSelectionTaskPlugin.h" +#include "RuntimeStatus.h" #include "Sub/ProcessTask.h" - #include "Utils/Logger.hpp" asst::RoguelikeTask::RoguelikeTask(const AsstCallback& callback, void* callback_arg) : PackageTask(callback, callback_arg, TaskType), m_roguelike_task_ptr(std::make_shared(callback, callback_arg, TaskType)) { - m_roguelike_task_ptr->set_tasks({ "Roguelike1Begin" }); + m_roguelike_task_ptr->set_tasks({ "Stop" }); m_roguelike_task_ptr->register_plugin(); m_roguelike_task_ptr->register_plugin(); @@ -45,16 +45,26 @@ bool asst::RoguelikeTask::set_params(const json::value& params) // 2 - 【弃用】两者兼顾,投资过后再退出,没有投资就继续往后打 // 3 - 尝试通关,激进策略 + std::string roguelike_name = params.get("name", "Phantom"); + if (m_status == nullptr) { + m_roguelike_task_ptr->set_tasks({ "Stop" }); + Log.error(__FUNCTION__, "| Cannot set roguelike name!"); + return false; + } + m_status->set_properties("roguelike_name", roguelike_name); + roguelike_name += "@"; + m_roguelike_task_ptr->set_tasks({ roguelike_name + "Roguelike@Begin" }); + int mode = params.get("mode", 0); switch (mode) { case 0: break; case 1: - m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderLeaveConfirm", 0, + m_roguelike_task_ptr->set_times_limit("StageTraderLeaveConfirm", 0, ProcessTask::TimesLimitType::Post); break; case 2: - [[unlikely]] m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderInvestCancel", 0); + [[unlikely]] m_roguelike_task_ptr->set_times_limit("StageTraderInvestCancel", 0); break; default: Log.error(__FUNCTION__, "| Unknown mode", mode); @@ -62,22 +72,22 @@ bool asst::RoguelikeTask::set_params(const json::value& params) } int number_of_starts = params.get("starts_count", INT_MAX); - m_roguelike_task_ptr->set_times_limit("Roguelike1Start", number_of_starts); + m_roguelike_task_ptr->set_times_limit(roguelike_name + "Roguelike@Start", number_of_starts); bool investment_enabled = params.get("investment_enabled", true); if (!investment_enabled) { // 禁用投资系统,通过 exceededNext 进入商店购买逻辑 - m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderInvestSystem", 0); + m_roguelike_task_ptr->set_times_limit("StageTraderInvestSystem", 0); } int number_of_investments = params.get("investments_count", INT_MAX); - m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderInvestConfirm", number_of_investments); + m_roguelike_task_ptr->set_times_limit("StageTraderInvestConfirm", number_of_investments); bool stop_when_full = params.get("stop_when_investment_full", false); if (stop_when_full) { - m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderInvestSystemFull", 0); + m_roguelike_task_ptr->set_times_limit("StageTraderInvestSystemFull", 0); constexpr int InvestLimit = 999; - m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderInvestConfirm", InvestLimit); + m_roguelike_task_ptr->set_times_limit("StageTraderInvestConfirm", InvestLimit); } if (auto squad_opt = params.find("squad")) { diff --git a/src/MeoAssistant/TaskData.cpp b/src/MeoAssistant/TaskData.cpp index 2d1f9ec2c0..52eebda8c7 100644 --- a/src/MeoAssistant/TaskData.cpp +++ b/src/MeoAssistant/TaskData.cpp @@ -60,14 +60,18 @@ bool asst::TaskData::parse(const json::value& json) } #ifdef ASST_DEBUG + bool some_next_null = false; for (const auto& [name, task] : m_all_tasks_info) { for (const auto& next : task->next) { if (get(next) == nullptr) { Log.error(name, "'s next", next, "is null"); - return false; + some_next_null = true; } } } + if (some_next_null) { + return false; + } #endif return true; } diff --git a/src/MeoAsstGui/Helper/AsstProxy.cs b/src/MeoAsstGui/Helper/AsstProxy.cs index c8d10642c4..0f45d018da 100644 --- a/src/MeoAsstGui/Helper/AsstProxy.cs +++ b/src/MeoAsstGui/Helper/AsstProxy.cs @@ -163,24 +163,6 @@ namespace MeoAsstGui } private string _curResource = "_Unloaded"; - private bool _additionalLoaded = false; - - public bool LoadAdditionalResource() - { - if (_additionalLoaded) - { - return true; - } - - var settingsModel = _container.Get(); - if (settingsModel.RoguelikeTheme != "Roguelike1") - { - _additionalLoaded = AsstLoadResource(Directory.GetCurrentDirectory() + "\\resource\\addition\\" + settingsModel.RoguelikeTheme + "\\"); - return _additionalLoaded; - } - - return true; - } /// /// 加载全局资源。 @@ -194,8 +176,6 @@ namespace MeoAsstGui return true; } - _additionalLoaded = false; - bool loaded = true; if (settingsModel.ClientType == string.Empty || settingsModel.ClientType == "Official" || settingsModel.ClientType == "Bilibili") @@ -245,11 +225,13 @@ namespace MeoAsstGui public void Init() { // TODO: 屎山.jpg,过几个版本再把这两行删了 - File.Delete(Directory.GetCurrentDirectory() + "\\resource\\addition\\Roguelike2\\resource\\roguelike_recruit.json"); - File.Delete(Directory.GetCurrentDirectory() + "\\resource\\addition\\Roguelike2\\resource\\roguelike_shopping.json"); + DirectoryInfo dir = new DirectoryInfo(Directory.GetCurrentDirectory() + "\\resource\\addition\\"); + if (dir.Exists) + { + dir.Delete(true); + } bool loaded = LoadResource(); - loaded &= LoadAdditionalResource(); _handle = AsstCreateEx(_callback, IntPtr.Zero); @@ -611,6 +593,23 @@ namespace MeoAsstGui if (subTask == "ProcessTask") { string taskName = details["details"]["task"].ToString(); + var replaceNameMap = new Dictionary + { + { "Phantom@Roguelike@", "Roguelike" }, + { "Mizuki@Roguelike@", "Roguelike" }, + { "Roguelike@", "Roguelike" }, + { "Phantom@", "Roguelike" }, + { "Mizuki@", "Roguelike" }, + }; + + foreach (var ignoreName in replaceNameMap) + { + if (taskName.StartsWith(ignoreName.Key)) + { + taskName = ignoreName.Value + taskName.Substring(ignoreName.Key.Length); + } + } + int execTimes = (int)details["details"]["exec_times"]; switch (taskName) @@ -645,62 +644,62 @@ namespace MeoAsstGui break; /* 肉鸽相关 */ - case "Roguelike1Start": + case "RoguelikeStart": mainModel.AddLog(Localization.GetString("BegunToExplore") + $" {execTimes} " + Localization.GetString("UnitTime"), LogColor.Info); break; - case "Roguelike1StageTraderInvestConfirm": + case "RoguelikeStageTraderInvestConfirm": mainModel.AddLog(Localization.GetString("HasInvested") + $" {execTimes} " + Localization.GetString("UnitTime"), LogColor.Info); break; - case "Roguelike1ExitThenAbandon": + case "RoguelikeExitThenAbandon": mainModel.AddLog(Localization.GetString("ExplorationAbandoned")); break; - // case "Roguelike1StartAction": + // case "RoguelikeStartAction": // mainModel.AddLog("开始战斗"); // break; - case "Roguelike1MissionCompletedFlag": + case "RoguelikeMissionCompletedFlag": mainModel.AddLog(Localization.GetString("FightCompleted")); break; - case "Roguelike1MissionFailedFlag": + case "RoguelikeMissionFailedFlag": mainModel.AddLog(Localization.GetString("FightFailed")); break; - case "Roguelike1StageTraderEnter": + case "RoguelikeStageTraderEnter": mainModel.AddLog(Localization.GetString("Trader")); break; - case "Roguelike1StageSafeHouseEnter": + case "RoguelikeStageSafeHouseEnter": mainModel.AddLog(Localization.GetString("SafeHouse")); break; - case "Roguelike1StageEncounterEnter": + case "RoguelikeStageEncounterEnter": mainModel.AddLog(Localization.GetString("Encounter")); break; - // case "Roguelike1StageBoonsEnter": + // case "RoguelikeStageBoonsEnter": // mainModel.AddLog("古堡馈赠"); // break; - case "Roguelike1StageCambatDpsEnter": + case "RoguelikeStageCambatDpsEnter": mainModel.AddLog(Localization.GetString("CambatDps")); break; - case "Roguelike1StageEmergencyDps": + case "RoguelikeStageEmergencyDps": mainModel.AddLog(Localization.GetString("EmergencyDps")); break; - case "Roguelike1StageDreadfulFoe": - case "Roguelike2StageDreadfulFoe-5Enter": + case "RoguelikeStageDreadfulFoe": + case "RoguelikeStageDreadfulFoe-5Enter": mainModel.AddLog(Localization.GetString("DreadfulFoe")); break; - case "Roguelike1StageTraderInvestSystemFull": + case "RoguelikeStageTraderInvestSystemFull": mainModel.AddLog(Localization.GetString("UpperLimit"), LogColor.Info); break; - case "RestartGameAndContinueFighting": + case "RestartGameAndContinue": mainModel.AddLog(Localization.GetString("GameCrash"), LogColor.Warning); break; @@ -708,7 +707,7 @@ namespace MeoAsstGui mainModel.AddLog(Localization.GetString("GameDrop"), LogColor.Warning); break; - case "Roguelike1GamePass": + case "RoguelikeGamePass": mainModel.AddLog(Localization.GetString("RoguelikeGamePass"), LogColor.RareOperator); break; } @@ -1031,7 +1030,7 @@ namespace MeoAsstGui /// 是否成功。 public bool AsstConnect(ref string error) { - if (!LoadResource() || !LoadAdditionalResource()) + if (!LoadResource()) { error = "Load Resource Failed"; return false; @@ -1421,9 +1420,10 @@ namespace MeoAsstGui /// TODO. /// TODO. /// TODO. + /// 肉鸽名字。["Phantom", "Mizuki"] /// 是否成功。 public bool AsstAppendRoguelike(int mode, int starts, bool investment_enabled, int invests, bool stop_when_full, - string squad, string roles, string core_char) + string squad, string roles, string core_char, string roguelike_name) { var task_params = new JObject(); task_params["mode"] = mode; @@ -1431,6 +1431,7 @@ namespace MeoAsstGui task_params["investment_enabled"] = investment_enabled; task_params["investments_count"] = invests; task_params["stop_when_investment_full"] = stop_when_full; + task_params["name"] = roguelike_name; if (squad.Length > 0) { task_params["squad"] = squad; diff --git a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs index 68ee39023a..d4012081db 100644 --- a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs +++ b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs @@ -176,8 +176,8 @@ namespace MeoAsstGui RoguelikeThemeList = new List { - new CombData { Display = Localization.GetString("RoguelikeThemePhantom"), Value = "Roguelike1" }, - new CombData { Display = Localization.GetString("RoguelikeThemeMizuki"), Value = "Roguelike2" }, + new CombData { Display = Localization.GetString("RoguelikeThemePhantom"), Value = "Phantom" }, + new CombData { Display = Localization.GetString("RoguelikeThemeMizuki"), Value = "Mizuki" }, }; RoguelikeSquadList = new List @@ -791,7 +791,7 @@ namespace MeoAsstGui /* 肉鸽设置 */ - private string _roguelikeTheme = ViewStatusStorage.Get("Roguelike.RoguelikeTheme", "Roguelike1"); + private string _roguelikeTheme = ViewStatusStorage.Get("Roguelike.RoguelikeTheme", "Phantom"); /// /// Gets or sets the Roguelike theme. diff --git a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs index 30c20c40eb..8009c4ea6c 100644 --- a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs +++ b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs @@ -949,14 +949,13 @@ namespace MeoAsstGui private bool appendRoguelike() { var settings = _container.Get(); - int mode; - int.TryParse(settings.RoguelikeMode, out mode); + int.TryParse(settings.RoguelikeMode, out var mode); var asstProxy = _container.Get(); return asstProxy.AsstAppendRoguelike( mode, settings.RoguelikeStartsCount, settings.RoguelikeInvestmentEnabled, settings.RoguelikeInvestsCount, settings.RoguelikeStopWhenInvestmentFull, - settings.RoguelikeSquad, settings.RoguelikeRoles, settings.RoguelikeCoreChar); + settings.RoguelikeSquad, settings.RoguelikeRoles, settings.RoguelikeCoreChar, settings.RoguelikeTheme); } [DllImport("User32.dll", EntryPoint = "FindWindow")]