diff --git a/MAA.sln.DotSettings b/MAA.sln.DotSettings
index 57ad328c91..5080c45946 100644
--- a/MAA.sln.DotSettings
+++ b/MAA.sln.DotSettings
@@ -67,6 +67,7 @@
True
True
True
+ True
True
True
True
diff --git a/src/MaaCore/Task/BattleHelper.cpp b/src/MaaCore/Task/BattleHelper.cpp
index 7e650861e7..008b1b5f7e 100644
--- a/src/MaaCore/Task/BattleHelper.cpp
+++ b/src/MaaCore/Task/BattleHelper.cpp
@@ -477,6 +477,33 @@ bool asst::BattleHelper::retreat_oper(const Point& loc, bool manually)
return true;
}
+bool asst::BattleHelper::is_skill_ready(const Point& loc, const cv::Mat& reusable)
+{
+ cv::Mat image = reusable.empty() ? m_inst_helper.ctrler()->get_image() : reusable;
+ BattlefieldClassifier skill_analyzer(image);
+ skill_analyzer.set_object_of_interest({ .skill_ready = true });
+
+ auto target_iter = m_normal_tile_info.find(loc);
+ if (target_iter == m_normal_tile_info.end()) {
+ Log.error("No loc", loc);
+ return false;
+ }
+ const Point& battlefield_point = target_iter->second.pos;
+ skill_analyzer.set_base_point(battlefield_point);
+
+ return skill_analyzer.analyze()->skill_ready.ready;
+}
+
+bool asst::BattleHelper::is_skill_ready(const std::string& name, const cv::Mat& reusable)
+{
+ auto oper_iter = m_battlefield_opers.find(name);
+ if (oper_iter == m_battlefield_opers.cend()) {
+ Log.error("No oper", name);
+ return false;
+ }
+ return is_skill_ready(oper_iter->second, reusable);
+}
+
bool asst::BattleHelper::use_skill(const std::string& name, bool keep_waiting)
{
LogTraceFunction;
@@ -596,6 +623,12 @@ bool asst::BattleHelper::use_all_ready_skill(const cv::Mat& reusable)
continue;
}
+ if (!is_skill_ready(loc, image)) {
+ continue;
+ }
+
+ Log.info("Skill", name, "is ready");
+
if (auto interval = now - last_use_time; min_frame_interval > interval) {
Log.info(
name,
@@ -604,12 +637,8 @@ bool asst::BattleHelper::use_all_ready_skill(const cv::Mat& reusable)
continue;
}
- bool has_error = false;
- if (!check_and_use_skill(loc, has_error, image)) {
- continue;
- }
// 识别到了,但点进去发现没有。一般来说是识别错了
- if (has_error) {
+ if (!use_skill(loc, false)) {
Log.warn("Skill", name, "is not ready");
constexpr int MaxRetry = 3;
if (++retry >= MaxRetry) {
@@ -646,21 +675,10 @@ bool asst::BattleHelper::check_and_use_skill(const std::string& name, bool& has_
bool asst::BattleHelper::check_and_use_skill(const Point& loc, bool& has_error, const cv::Mat& reusable)
{
- cv::Mat image = reusable.empty() ? m_inst_helper.ctrler()->get_image() : reusable;
- BattlefieldClassifier skill_analyzer(image);
- skill_analyzer.set_object_of_interest({ .skill_ready = true });
-
- auto target_iter = m_normal_tile_info.find(loc);
- if (target_iter == m_normal_tile_info.end()) {
- Log.error("No loc", loc);
+ const cv::Mat image = reusable.empty() ? m_inst_helper.ctrler()->get_image() : reusable;
+ if (!is_skill_ready(loc, image)) {
return false;
}
- const Point& battlefield_point = target_iter->second.pos;
- skill_analyzer.set_base_point(battlefield_point);
- if (!skill_analyzer.analyze()->skill_ready.ready) {
- return false;
- }
-
has_error = !use_skill(loc, false);
return true;
}
diff --git a/src/MaaCore/Task/BattleHelper.h b/src/MaaCore/Task/BattleHelper.h
index b39e17125f..15d9231c39 100644
--- a/src/MaaCore/Task/BattleHelper.h
+++ b/src/MaaCore/Task/BattleHelper.h
@@ -44,6 +44,8 @@ namespace asst
bool deploy_oper(const std::string& name, const Point& loc, battle::DeployDirection direction);
bool retreat_oper(const std::string& name);
bool retreat_oper(const Point& loc, bool manually = true);
+ bool is_skill_ready(const Point& loc, const cv::Mat& reusable = cv::Mat());
+ bool is_skill_ready(const std::string& name, const cv::Mat& reusable = cv::Mat());
bool use_skill(const std::string& name, bool keep_waiting = true);
bool use_skill(const Point& loc, bool keep_waiting = true);
bool check_pause_button(const cv::Mat& reusable = cv::Mat());