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 ? "✓" : "✗",