diff --git a/src/MaaCore/Assistant.cpp b/src/MaaCore/Assistant.cpp
index dae6eb08bc..bc40b674ea 100644
--- a/src/MaaCore/Assistant.cpp
+++ b/src/MaaCore/Assistant.cpp
@@ -14,6 +14,7 @@
#include "Task/Interface/DepotTask.h"
#include "Task/Interface/FightTask.h"
#include "Task/Interface/InfrastTask.h"
+#include "Task/Interface/SingleStepTask.h"
#include "Task/Interface/MallTask.h"
#include "Task/Interface/RecruitTask.h"
#include "Task/Interface/RoguelikeTask.h"
@@ -159,6 +160,7 @@ asst::Assistant::TaskId asst::Assistant::append_task(const std::string& type, co
ASST_ASSISTANT_APPEND_TASK_FROM_STRING_IF_BRANCH(RoguelikeTask)
ASST_ASSISTANT_APPEND_TASK_FROM_STRING_IF_BRANCH(CopilotTask)
ASST_ASSISTANT_APPEND_TASK_FROM_STRING_IF_BRANCH(SSSCopilotTask)
+ ASST_ASSISTANT_APPEND_TASK_FROM_STRING_IF_BRANCH(SingleStepTask)
ASST_ASSISTANT_APPEND_TASK_FROM_STRING_IF_BRANCH(DepotTask)
#ifdef ASST_DEBUG
ASST_ASSISTANT_APPEND_TASK_FROM_STRING_IF_BRANCH(DebugTask)
diff --git a/src/MaaCore/MaaCore.vcxproj b/src/MaaCore/MaaCore.vcxproj
index ef1759f59d..8eec06d02f 100644
--- a/src/MaaCore/MaaCore.vcxproj
+++ b/src/MaaCore/MaaCore.vcxproj
@@ -33,7 +33,9 @@
+
+
@@ -157,7 +159,9 @@
+
+
diff --git a/src/MaaCore/MaaCore.vcxproj.filters b/src/MaaCore/MaaCore.vcxproj.filters
index 0f8939bbfd..f1a98154f8 100644
--- a/src/MaaCore/MaaCore.vcxproj.filters
+++ b/src/MaaCore/MaaCore.vcxproj.filters
@@ -74,6 +74,9 @@
{a5775bd2-7a8a-4bcb-9465-75d899ea8ca1}
+
+ {987541fc-58f0-40eb-8b93-c0cb38881d92}
+
@@ -483,6 +486,12 @@
源文件\Vision
+
+ 源文件\Task\SingleStep
+
+
+ 源文件\Task\Interface
+
@@ -794,5 +803,11 @@
源文件\Vision
+
+ 源文件\Task\SingleStep
+
+
+ 源文件\Task\Interface
+
\ No newline at end of file
diff --git a/src/MaaCore/Task/Interface/SingleStepTask.cpp b/src/MaaCore/Task/Interface/SingleStepTask.cpp
new file mode 100644
index 0000000000..43ef23e897
--- /dev/null
+++ b/src/MaaCore/Task/Interface/SingleStepTask.cpp
@@ -0,0 +1,24 @@
+#include "SingleStepTask.h"
+
+#include "../SingleStep/SingleStepBattleProcessTask.h"
+#include "Config/Miscellaneous/CopilotConfig.h"
+
+asst::SingleStepTask::SingleStepTask(const AsstCallback& callback, Assistant* inst)
+ : InterfaceTask(callback, inst, TaskType)
+{}
+
+bool asst::SingleStepTask::set_params(const json::value& params)
+{
+ std::string type = params.at("type").as_string();
+ std::string subtype = params.at("subtype").as_string();
+ const json::value& details = params.at("details");
+
+ if (type == "copilot" && subtype == "action") {
+ auto task = std::make_shared(m_callback, m_inst, TaskType);
+ // 请参考自动战斗协议
+ task->set_actions(CopilotConfig::parse_actions(details));
+ m_subtasks.emplace_back(std::move(task));
+ }
+
+ return false;
+}
diff --git a/src/MaaCore/Task/Interface/SingleStepTask.h b/src/MaaCore/Task/Interface/SingleStepTask.h
new file mode 100644
index 0000000000..09db6800fe
--- /dev/null
+++ b/src/MaaCore/Task/Interface/SingleStepTask.h
@@ -0,0 +1,18 @@
+#pragma once
+#include "Task/InterfaceTask.h"
+
+#include
+
+namespace asst
+{
+ class SingleStepTask final : public InterfaceTask
+ {
+ public:
+ inline static constexpr std::string_view TaskType = "SingleStep";
+
+ SingleStepTask(const AsstCallback& callback, Assistant* inst);
+ virtual ~SingleStepTask() override = default;
+
+ virtual bool set_params(const json::value& params) override;
+ };
+}
diff --git a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp
index 0a095430d0..853a8f3a91 100644
--- a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp
+++ b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp
@@ -43,7 +43,8 @@ bool asst::BattleProcessTask::_run()
size_t action_size = get_combat_data().actions.size();
for (size_t i = 0; i < action_size && !need_exit() && m_in_battle; ++i) {
- do_action(i);
+ const auto& action = get_combat_data().actions.at(i);
+ do_action(action, i);
}
if (need_to_wait_until_end()) {
@@ -132,12 +133,10 @@ bool asst::BattleProcessTask::to_group()
return true;
}
-bool asst::BattleProcessTask::do_action(size_t action_index)
+bool asst::BattleProcessTask::do_action(const battle::copilot::Action& action, size_t action_index)
{
LogTraceFunction;
- const auto& action = get_combat_data().actions.at(action_index);
-
notify_action(action);
if (!wait_condition(action)) {
diff --git a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h
index 46e062866f..55156966f5 100644
--- a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h
+++ b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h
@@ -27,7 +27,7 @@ namespace asst
virtual bool need_to_wait_until_end() const { return false; }
bool to_group();
- bool do_action(size_t action_index);
+ bool do_action(const battle::copilot::Action& action, size_t action_index);
const std::string& get_name_from_group(const std::string& action_name);
void notify_action(const battle::copilot::Action& action);
diff --git a/src/MaaCore/Task/SingleStep/SingleStepBattleProcessTask.cpp b/src/MaaCore/Task/SingleStep/SingleStepBattleProcessTask.cpp
new file mode 100644
index 0000000000..6d50e88a0e
--- /dev/null
+++ b/src/MaaCore/Task/SingleStep/SingleStepBattleProcessTask.cpp
@@ -0,0 +1,40 @@
+#include "SingleStepBattleProcessTask.h"
+
+#include "Controller.h"
+#include "Task/ProcessTask.h"
+#include "Utils/Logger.hpp"
+
+void asst::SingleStepBattleProcessTask::set_actions(Actions actions)
+{
+ m_actions = std::move(actions);
+}
+
+bool asst::SingleStepBattleProcessTask::_run()
+{
+ LogTraceFunction;
+
+ cv::Mat image = ctrler()->get_image();
+ bool init = !check_in_battle(image);
+ if (init) {
+ clear();
+
+ if (!calc_tiles_info(m_stage_name)) {
+ Log.error("get stage info failed");
+ return false;
+ }
+ }
+
+ update_deployment(init, image);
+
+ if (init) {
+ to_group();
+ }
+
+ size_t action_size = m_actions.size();
+ for (size_t i = 0; i < action_size && !need_exit() && m_in_battle; ++i) {
+ const auto& action = m_actions.at(i);
+ do_action(action, i);
+ }
+
+ return true;
+}
diff --git a/src/MaaCore/Task/SingleStep/SingleStepBattleProcessTask.h b/src/MaaCore/Task/SingleStep/SingleStepBattleProcessTask.h
new file mode 100644
index 0000000000..bd5ec2b5ad
--- /dev/null
+++ b/src/MaaCore/Task/SingleStep/SingleStepBattleProcessTask.h
@@ -0,0 +1,24 @@
+#pragma once
+#include "Task/Miscellaneous/BattleProcessTask.h"
+
+namespace asst
+{
+ class SingleStepBattleProcessTask : public BattleProcessTask
+ {
+ public:
+ using Actions = std::vector;
+
+ public:
+ using BattleProcessTask::BattleProcessTask;
+ virtual ~SingleStepBattleProcessTask() override = default;
+
+ void set_actions(Actions actions);
+
+ protected:
+ virtual bool _run() override;
+ virtual bool need_to_wait_until_end() const noexcept override { return false; }
+
+ private:
+ Actions m_actions;
+ };
+}