From c5cde83b777bcaf11c122b400a0619b9cf76888a Mon Sep 17 00:00:00 2001 From: status102 <102887808+status102@users.noreply.github.com> Date: Mon, 23 Jun 2025 23:00:07 +0800 Subject: [PATCH] =?UTF-8?q?rft:=20=E8=82=89=E9=B8=BDcallback=E4=B8=ADInt?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=99=90=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RoguelikeSettlementTaskPlugin.cpp | 54 +++++++++---------- .../RoguelikeSettingsUserControlModel.cs | 3 +- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/MaaCore/Task/Roguelike/RoguelikeSettlementTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/RoguelikeSettlementTaskPlugin.cpp index b1d6ac4dc2..b8dc554435 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeSettlementTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/RoguelikeSettlementTaskPlugin.cpp @@ -29,6 +29,7 @@ bool asst::RoguelikeSettlementTaskPlugin::verify(AsstMsg msg, const json::value& bool asst::RoguelikeSettlementTaskPlugin::_run() { + LogTraceFunction; const auto& task = Task.get("RoguelikeSettlementConfirm"); auto json_msg = basic_info_with_what("RoguelikeSettlement"); json_msg["details"]["game_pass"] = m_game_pass; @@ -60,21 +61,21 @@ bool asst::RoguelikeSettlementTaskPlugin::_run() bool asst::RoguelikeSettlementTaskPlugin::get_settlement_info(json::value& info, const cv::Mat& image) { - auto append_data = [&](const std::string& task_name, const std::string& ocr_result) { + const auto& number_replace = Task.get("NumberOcrReplace")->replace_map; + const auto& append_data = [&](std::string task_name, const std::string& ocr_result) { int num = -1; if (!utils::chars_to_number(ocr_result, num)) { Log.error(__FUNCTION__, "convert str to int failed, task:", task_name, ", string:", ocr_result); return; } - auto tag = task_name.substr(task_name.find("-") + 1); - utils::tolowers(tag); - info["details"][tag] = num; + utils::tolowers(task_name); + info["details"][task_name] = num; }; auto analyze_battle_data = [&](const std::string& task_name) { RegionOCRer ocr(image); - ocr.set_task_info(task_name); + ocr.set_task_info("RoguelikeSettlementOcr-" + task_name); ocr.set_bin_threshold(0, 255); if (!ocr.analyze()) { Log.error(__FUNCTION__, "analyze battle data failed, task:", task_name); @@ -83,42 +84,41 @@ bool asst::RoguelikeSettlementTaskPlugin::get_settlement_info(json::value& info, append_data(task_name, ocr.get_result().text); }; - auto analyze_text_data = [&](const std::string& task_name) { + auto analyze_text_data = [&](const std::string& task_name, bool is_number) { RegionOCRer ocr(image); - ocr.set_task_info(m_config->get_theme() + "@" + task_name); + ocr.set_task_info(m_config->get_theme() + "@RoguelikeSettlementOcr-" + task_name); ocr.set_bin_threshold(50, 255); - const auto& number_replace = Task.get("NumberOcrReplace")->replace_map; - auto task_replace = Task.get(task_name)->replace_map; - - auto merge_map = std::vector(number_replace.begin(), number_replace.end()); + const auto& task_replace = Task.get("RoguelikeSettlementOcr-" + task_name)->replace_map; + auto merge_map = number_replace; ranges::copy(task_replace, std::back_inserter(merge_map)); ocr.set_replace(merge_map); if (!ocr.analyze()) { Log.error(__FUNCTION__, "analyze battle data failed, task:", task_name); return; } - auto tag = task_name.substr(task_name.find("-") + 1); + + if (is_number) { + append_data(task_name, ocr.get_result().text); + } + else { + std::string tag = task_name; utils::tolowers(tag); info["details"][tag] = ocr.get_result().text; + } }; - static const auto battle_task_name = - std::vector { "RoguelikeSettlementOcr-Floor", "RoguelikeSettlementOcr-Step", - "RoguelikeSettlementOcr-Combat", "RoguelikeSettlementOcr-Recruit", - "RoguelikeSettlementOcr-Collection", "RoguelikeSettlementOcr-BOSS", - "RoguelikeSettlementOcr-Emergency" }; - static const auto text_task_name = std::vector { "RoguelikeSettlementOcr-Difficulty", - "RoguelikeSettlementOcr-Score", - "RoguelikeSettlementOcr-Exp", - "RoguelikeSettlementOcr-Skill" }; + static const auto& battle_tasks = + std::vector { "Floor", "Step", "Combat", "Recruit", "Collection", "BOSS", "Emergency" }; + static const auto& text_tasks = std::vector> { { "Difficulty", true }, + { "Score", true }, + { "Exp", false }, + { "Skill", false } }; - ranges::for_each(battle_task_name, analyze_battle_data); + ranges::for_each(battle_tasks, analyze_battle_data); - if (m_config->get_theme() == RoguelikeTheme::Phantom) { - ranges::for_each(text_task_name | views::take(3), analyze_text_data); - } - else { - ranges::for_each(text_task_name, analyze_text_data); + using Theme = RoguelikeTheme; + for (const auto& [task, is_number] : text_tasks | views::take(m_config->get_theme() == Theme::Phantom ? 3 : 4)) { + analyze_text_data(task, is_number); } return true; diff --git a/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/RoguelikeSettingsUserControlModel.cs b/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/RoguelikeSettingsUserControlModel.cs index 7affada9f6..354a18543a 100644 --- a/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/RoguelikeSettingsUserControlModel.cs +++ b/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/RoguelikeSettingsUserControlModel.cs @@ -921,8 +921,7 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel {// 肉鸽结算 var report = subTaskDetails; var pass = (bool)report!["game_pass"]!; - var difficulty = int.TryParse((string)report["difficulty"]!, out var result) ? result : -1; - // var difficulty = (int)(report["difficulty"] ?? -1); + var difficulty = report["difficulty"]?.ToObject() ?? -1; var roguelikeInfo = string.Format( LocalizationHelper.GetString("RoguelikeSettlement"), pass ? "✓" : "✗",