diff --git a/resource/tasks/tasks.json b/resource/tasks/tasks.json index 3579201bfd..dfabf7108b 100644 --- a/resource/tasks/tasks.json +++ b/resource/tasks/tasks.json @@ -4600,8 +4600,8 @@ "BattleHasStarted": { "template": "empty.png", "roi": [1178, 33, 49, 39], - "specialParams_Doc": "亮度阈值;点的数量", - "specialParams": [245, 200] + "specialParams_Doc": "亮度阈值; 点的数量; 存在剧情提示时备用阈值", + "specialParams": [245, 200, 125, 130] }, "BattleSpeedButton": { "template": "empty.png", diff --git a/src/MaaCore/Task/BattleHelper.cpp b/src/MaaCore/Task/BattleHelper.cpp index 18f8740448..b97d3a0d31 100644 --- a/src/MaaCore/Task/BattleHelper.cpp +++ b/src/MaaCore/Task/BattleHelper.cpp @@ -581,7 +581,7 @@ bool asst::BattleHelper::check_in_battle(const cv::Mat& reusable, bool weak) BattlefieldMatcher analyzer(image); m_in_battle = analyzer.analyze().has_value(); } - else { + else { // init时, weak = false check_skip_plot_button(image); m_in_battle = check_pause_button(image); } diff --git a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp index 9080d05bab..2b1b53846c 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp @@ -436,7 +436,7 @@ bool asst::BattleProcessTask::check_in_battle(const cv::Mat& reusable, bool weak m_in_battle = result.has_value(); if (m_in_battle && !result->pause_button) { if (check_skip_plot_button(image) && check_in_speed_up(image)) { - speed_up(); + speed_up(); // 跳过剧情后, 方舟会自动恢复1倍速, 如果是2倍速就恢复一下 } } } diff --git a/src/MaaCore/Vision/Battle/BattlefieldMatcher.cpp b/src/MaaCore/Vision/Battle/BattlefieldMatcher.cpp index d248297102..9e7c0e2e06 100644 --- a/src/MaaCore/Vision/Battle/BattlefieldMatcher.cpp +++ b/src/MaaCore/Vision/Battle/BattlefieldMatcher.cpp @@ -354,14 +354,28 @@ bool BattlefieldMatcher::pause_button_analyze() const { auto task_ptr = Task.get("BattleHasStarted"); cv::Mat roi = m_image(make_rect(task_ptr->roi)); - cv::Mat roi_gray; + cv::Mat roi_gray, bin; cv::cvtColor(roi, roi_gray, cv::COLOR_BGR2GRAY); - cv::Mat bin; + + double min_val = 0.0, max_val = 0.0; + cv::Point min_loc, max_loc; + cv::minMaxLoc(roi_gray, &min_val, &max_val, &min_loc, &max_loc); + const int value_threshold = task_ptr->special_params[0]; - cv::threshold(roi_gray, bin, value_threshold, 255, cv::THRESH_BINARY); - int count = cv::countNonZero(bin); const int count_threshold = task_ptr->special_params[1]; - Log.trace(__FUNCTION__, "count", count, "threshold", count_threshold); + int count; + if (max_val > value_threshold) { + cv::threshold(roi_gray, bin, value_threshold, 255, cv::THRESH_BINARY); + count = cv::countNonZero(bin); + } + else { + cv::inRange( + roi_gray, + cv::Scalar::all(task_ptr->special_params[2]), + cv::Scalar::all(task_ptr->special_params[3]), + bin); + count = cv::countNonZero(bin); + } #ifdef ASST_DEBUG cv::rectangle(m_image_draw, make_rect(task_ptr->roi), cv::Scalar(0, 0, 255), 2); diff --git a/src/MaaCore/Vision/Battle/BattlefieldMatcher.h b/src/MaaCore/Vision/Battle/BattlefieldMatcher.h index 3e22388921..8e575d40ee 100644 --- a/src/MaaCore/Vision/Battle/BattlefieldMatcher.h +++ b/src/MaaCore/Vision/Battle/BattlefieldMatcher.h @@ -30,7 +30,7 @@ public: // bool in_detail = false; bool speed_button = false; - bool pause_button = false; + bool pause_button = false; // 是否有暂停/恢复按钮 }; using ResultOpt = std::optional; @@ -47,6 +47,7 @@ public: protected: bool hp_flag_analyze() const; bool kills_flag_analyze() const; + // 判断是否存在暂停/恢复按钮 bool pause_button_analyze() const; std::vector deployment_analyze() const; // 识别干员