diff --git a/resource/tasks/Roguelike/JieGarden.json b/resource/tasks/Roguelike/JieGarden.json index 618e842d0c..f260848364 100644 --- a/resource/tasks/Roguelike/JieGarden.json +++ b/resource/tasks/Roguelike/JieGarden.json @@ -177,7 +177,12 @@ "JieGarden@Roguelike@CoppersAnalyzer-ExchangeNameOCR": { "Doc": "通宝名称识别 - EXCHANGE 模式 - 通宝已投出识别用 roi 为 通宝类型 的 Rect.move(me.roi)", "baseTask": "JieGarden@Roguelike@CoppersNameOcrReplace", - "roi": [29, -5, 160, 40] + "roi": [29, -5, 240, 40] + }, + "JieGarden@Roguelike@CoppersAnalyzer-LeftNameOCR": { + "Doc": "通宝名称识别 - 左侧列专用OCR - EXCHANGE 模式", + "baseTask": "JieGarden@Roguelike@CoppersNameOcrReplace", + "roi": [29, -5, 170, 40] }, "JieGarden@Roguelike@CoppersAnalyzer-LeftType": { "Doc": "通宝类型识别 - 左侧新拾取通宝区域 (EXCHANGE 模式)", @@ -192,7 +197,7 @@ "JieGarden@Roguelike@CoppersAnalyzer-PickupNameOCR": { "Doc": "通宝名称识别 - PICKUP 模式 - 通宝已投出识别用 roi 为 通宝类型 的 Rect.move(me.roi)", "baseTask": "JieGarden@Roguelike@CoppersNameOcrReplace", - "roi": [0, -209, 167, 37] + "roi": [-29, -209, 218, 37] }, "JieGarden@Roguelike@CoppersAnalyzer-RightType": { "Doc": "通宝类型识别 - 最右侧列区域", diff --git a/src/MaaCore/Vision/Roguelike/JieGarden/RoguelikeCoppersAnalyzer.cpp b/src/MaaCore/Vision/Roguelike/JieGarden/RoguelikeCoppersAnalyzer.cpp index f32126b84b..47684e63ef 100644 --- a/src/MaaCore/Vision/Roguelike/JieGarden/RoguelikeCoppersAnalyzer.cpp +++ b/src/MaaCore/Vision/Roguelike/JieGarden/RoguelikeCoppersAnalyzer.cpp @@ -17,6 +17,7 @@ namespace constexpr std::string_view kPickupMatcherTask = "JieGarden@Roguelike@GetDropSwitch"; constexpr std::string_view kPickupNameTask = "JieGarden@Roguelike@CoppersAnalyzer-PickupNameOCR"; constexpr std::string_view kExchangeNameTask = "JieGarden@Roguelike@CoppersAnalyzer-ExchangeNameOCR"; +constexpr std::string_view kExchangeMatcherTask = "JieGarden@Roguelike@CoppersAnalyzer-LeftNameOCR"; constexpr std::string_view kCastTask = "JieGarden@Roguelike@CoppersAnalyzer-CastOCR"; constexpr std::string_view kLeftColumnMatcherTask = "JieGarden@Roguelike@CoppersAnalyzer-LeftType"; constexpr std::string_view kMiddleColumnMatcherTask = "JieGarden@Roguelike@CoppersAnalyzer-Type"; @@ -62,9 +63,21 @@ bool RoguelikeCoppersAnalyzer::analyze_column(ColumnRole role, bool detect_cast) { LogTraceFunction; - const auto name_task = Task.get(kExchangeNameTask); + // 根据列角色选择适当的OCR任务 + std::string_view ocr_task_name; + switch (role) { + case ColumnRole::Leftmost: + ocr_task_name = kExchangeMatcherTask; + break; + case ColumnRole::Middle: + case ColumnRole::Rightmost: + ocr_task_name = kExchangeNameTask; + break; + } + + const auto name_task = Task.get(ocr_task_name); if (!name_task) { - Log.error(__FUNCTION__, "| failed to load exchange name OCR task"); + Log.error(__FUNCTION__, "| failed to load OCR task:", ocr_task_name); return false; } @@ -88,6 +101,7 @@ bool RoguelikeCoppersAnalyzer::analyze_column(ColumnRole role, bool detect_cast) } const bool analyzed = analyze_internal(matcher_task, *name_task, cast_task.get(), SortStrategy::Vertical); + if (!analyzed) { Log.error(__FUNCTION__, "| failed to analyze column ", to_string(role)); } @@ -185,7 +199,10 @@ bool RoguelikeCoppersAnalyzer::analyze_internal( const auto& cast_result = cast_ocr.get_result(); detection.cast_score = cast_result.score; detection.cast_recognized = !cast_result.text.empty(); - detection.is_cast = cast_result.text.find("已投出") != std::string::npos; + detection.is_cast = + std::any_of(cast_task->text.begin(), cast_task->text.end(), [&](const std::string& t) { + return cast_result.text.find(t) != std::string::npos; + }); } }