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; + }; +}