diff --git a/src/MaaCore/Task/Interface/RoguelikeTask.cpp b/src/MaaCore/Task/Interface/RoguelikeTask.cpp index f513e4eac7..066d8ff2b1 100644 --- a/src/MaaCore/Task/Interface/RoguelikeTask.cpp +++ b/src/MaaCore/Task/Interface/RoguelikeTask.cpp @@ -41,43 +41,46 @@ asst::RoguelikeTask::RoguelikeTask(const AsstCallback& callback, Assistant* inst LogTraceFunction; m_roguelike_task_ptr->set_ignore_error(true); + m_control_ptr = m_roguelike_task_ptr->register_plugin(m_config_ptr); // ------------------ 通用插件 ------------------ m_roguelike_task_ptr->register_plugin(); - m_roguelike_task_ptr->register_plugin(m_config_ptr); - m_control_ptr = m_roguelike_task_ptr->register_plugin(m_config_ptr); - m_roguelike_task_ptr->register_plugin(m_config_ptr); - m_roguelike_task_ptr->register_plugin(m_config_ptr); - m_invest_ptr = m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); + m_invest_ptr = m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); - m_debug_ptr = m_roguelike_task_ptr->register_plugin(m_config_ptr); - m_custom_ptr = m_roguelike_task_ptr->register_plugin(m_config_ptr); - m_roguelike_task_ptr->register_plugin(m_config_ptr)->set_retry_times(0); + m_debug_ptr = m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); + m_custom_ptr = m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr)->set_retry_times(0); - m_roguelike_task_ptr->register_plugin(m_config_ptr) + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr) ->set_retry_times(0) .set_ignore_error(true); - m_roguelike_task_ptr->register_plugin(m_config_ptr) + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr) ->set_retry_times(2) .set_ignore_error(true); - m_roguelike_task_ptr->register_plugin(m_config_ptr) + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr) ->set_retry_times(2) .set_ignore_error(true); - m_roguelike_task_ptr->register_plugin(m_config_ptr)->set_retry_times(0); + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr) + ->set_retry_times(0); - m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); - m_roguelike_task_ptr->register_plugin(m_config_ptr); - m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); // ------------------ 萨米主题专用插件 ------------------ - m_roguelike_task_ptr->register_plugin(m_config_ptr); - m_foldartal_use_ptr = m_roguelike_task_ptr->register_plugin(m_config_ptr); - m_foldartal_start_ptr = m_roguelike_task_ptr->register_plugin(m_config_ptr); - m_roguelike_task_ptr->register_plugin(m_config_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); + m_foldartal_use_ptr = + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); + m_foldartal_start_ptr = + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); + m_roguelike_task_ptr->register_plugin(m_config_ptr, m_control_ptr); // 这个任务如果卡住会放弃当前的肉鸽并重新开始,所以多添加亿点。先这样凑合用 for (int i = 0; i != 999; ++i) { @@ -155,8 +158,6 @@ bool asst::RoguelikeTask::set_params(const json::value& params) "StageTraderRefreshWithDice", params.get("refresh_trader_with_dice", false) ? INT_MAX : 0); - m_invest_ptr->set_control_plugin_ptr(m_control_ptr); - for (const auto& plugin : m_roguelike_task_ptr->get_plugins()) { if (const auto& p_ptr = std::dynamic_pointer_cast(plugin); p_ptr != nullptr) { p_ptr->set_enable(p_ptr->load_params(params)); diff --git a/src/MaaCore/Task/Roguelike/AbstractRoguelikeTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/AbstractRoguelikeTaskPlugin.cpp index b5423e30be..ba4cb014ab 100644 --- a/src/MaaCore/Task/Roguelike/AbstractRoguelikeTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/AbstractRoguelikeTaskPlugin.cpp @@ -1,7 +1,13 @@ #include "AbstractRoguelikeTaskPlugin.h" -asst::AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin(const AsstCallback& callback, Assistant* inst, - std::string_view task_chain, - const std::shared_ptr& config) - : AbstractTaskPlugin(callback, inst, task_chain), m_config(config) -{} +asst::AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin( + const AsstCallback& callback, + Assistant* inst, + std::string_view task_chain, + const std::shared_ptr& config, + const std::shared_ptr& control) : + AbstractTaskPlugin(callback, inst, task_chain), + m_config(config), + m_control_ptr(control) +{ +} diff --git a/src/MaaCore/Task/Roguelike/AbstractRoguelikeTaskPlugin.h b/src/MaaCore/Task/Roguelike/AbstractRoguelikeTaskPlugin.h index e61ae84ea4..09a7b6cd23 100644 --- a/src/MaaCore/Task/Roguelike/AbstractRoguelikeTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/AbstractRoguelikeTaskPlugin.h @@ -4,24 +4,28 @@ #include "Task/AbstractTaskPlugin.h" #include "Task/Roguelike/RoguelikeConfig.h" +#include "Task/Roguelike/RoguelikeControlTaskPlugin.h" namespace asst { - class AbstractRoguelikeTaskPlugin : public AbstractTaskPlugin - { - public: - AbstractRoguelikeTaskPlugin(const AsstCallback& callback, Assistant* inst, std::string_view task_chain, - const std::shared_ptr& data); +class AbstractRoguelikeTaskPlugin : public AbstractTaskPlugin +{ +public: + AbstractRoguelikeTaskPlugin( + const AsstCallback& callback, + Assistant* inst, + std::string_view task_chain, + const std::shared_ptr& data, + const std::shared_ptr& control); - // 根据 params 设置插件专用参数, 返回插件是否适用 - virtual bool load_params([[maybe_unused]] const json::value& params) { return true; } + // 根据 params 设置插件专用参数, 返回插件是否启用 + virtual bool load_params([[maybe_unused]] const json::value& params) { return true; } - // 进入新的一轮坍缩时重置局内变量 - virtual void reset_in_run_variables() {} + // 进入新的一局重置变量 + virtual void reset_in_run_variables() {} - protected: - std::shared_ptr m_config; - }; - - using RoguelikeTaskPluginPtr = std::shared_ptr; -} +protected: + std::shared_ptr m_config = nullptr; + std::shared_ptr m_control_ptr = nullptr; +}; +} // namespace asst diff --git a/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.cpp index 5998179922..e586a016dd 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.cpp @@ -28,9 +28,10 @@ asst::RoguelikeBattleTaskPlugin::RoguelikeBattleTaskPlugin( const AsstCallback& callback, Assistant* inst, std::string_view task_chain, - std::shared_ptr roguelike_config_ptr) - : AbstractRoguelikeTaskPlugin(callback, inst, task_chain, roguelike_config_ptr) - , BattleHelper(inst) + const std::shared_ptr& roguelike_config_ptr, + const std::shared_ptr& control) : + AbstractRoguelikeTaskPlugin(callback, inst, task_chain, roguelike_config_ptr, control), + BattleHelper(inst) { } diff --git a/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.h b/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.h index 83bf2930ce..d967ae56e0 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.h @@ -18,7 +18,12 @@ namespace asst inline static const std::unordered_set DiceSet = { "骰子", "8面骰子", "12面骰子" }; public: - RoguelikeBattleTaskPlugin(const AsstCallback& callback, Assistant* inst, std::string_view task_chain, std::shared_ptrroguelike_config_ptr); + RoguelikeBattleTaskPlugin( + const AsstCallback& callback, + Assistant* inst, + std::string_view task_chain, + const std::shared_ptr& roguelike_config_ptr, + const std::shared_ptr& control); virtual ~RoguelikeBattleTaskPlugin() override = default; virtual bool verify(AsstMsg msg, const json::value& details) const override; diff --git a/src/MaaCore/Task/Roguelike/RoguelikeControlTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/RoguelikeControlTaskPlugin.cpp index 27ac341e7d..6b24702591 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeControlTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/RoguelikeControlTaskPlugin.cpp @@ -4,16 +4,22 @@ #include "Task/ProcessTask.h" #include "Utils/Logger.hpp" +asst::RoguelikeControlTaskPlugin::RoguelikeControlTaskPlugin( + const AsstCallback& callback, + Assistant* inst, + std::string_view task_chain, + const std::shared_ptr& data) : + AbstractTaskPlugin(callback, inst, task_chain), + m_config(data) +{ +} + bool asst::RoguelikeControlTaskPlugin::verify(AsstMsg msg, const json::value& details) const { if (msg != AsstMsg::SubTaskStart || details.get("subtask", std::string()) != "ProcessTask") { return false; } - if (!RoguelikeConfig::is_valid_theme(m_config->get_theme())) { - Log.error("Roguelike name doesn't exist!"); - return false; - } const std::string roguelike_name = m_config->get_theme() + "@"; const std::string& task = details.get("details", "task", ""); std::string_view task_view = task; @@ -35,8 +41,8 @@ bool asst::RoguelikeControlTaskPlugin::verify(AsstMsg msg, const json::value& de void asst::RoguelikeControlTaskPlugin::exit_then_stop(bool abandon) const { ProcessTask(*this, { m_config->get_theme() + "@Roguelike@ExitThenAbandon" }) - .set_times_limit("Roguelike@StartExplore", 0) .set_times_limit("Roguelike@Abandon", abandon ? INT_MAX : 0) + .set_times_limit("Roguelike@StartExplore", 0) .run(); } diff --git a/src/MaaCore/Task/Roguelike/RoguelikeControlTaskPlugin.h b/src/MaaCore/Task/Roguelike/RoguelikeControlTaskPlugin.h index 11d838e478..114bef22ec 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeControlTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/RoguelikeControlTaskPlugin.h @@ -1,22 +1,29 @@ #pragma once -#include "AbstractRoguelikeTaskPlugin.h" +#include "Task/AbstractTaskPlugin.h" +#include "Task/Roguelike/RoguelikeConfig.h" namespace asst { - class RoguelikeControlTaskPlugin : public AbstractRoguelikeTaskPlugin - { - public: - using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin; - virtual ~RoguelikeControlTaskPlugin() override = default; +class RoguelikeControlTaskPlugin : public AbstractTaskPlugin +{ +public: + // using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin; + RoguelikeControlTaskPlugin( + const AsstCallback& callback, + Assistant* inst, + std::string_view task_chain, + const std::shared_ptr& data); + virtual ~RoguelikeControlTaskPlugin() override = default; - public: - virtual bool verify(AsstMsg msg, const json::value& details) const override; - void exit_then_stop(bool abandon = false) const; +public: + virtual bool verify(AsstMsg msg, const json::value& details) const override; + void exit_then_stop(bool abandon = false) const; - protected: - virtual bool _run() override; +protected: + virtual bool _run() override; - private: - mutable bool m_need_exit_then_stop = false; - }; +private: + mutable bool m_need_exit_then_stop = false; + std::shared_ptr m_config = nullptr; +}; } diff --git a/src/MaaCore/Task/Roguelike/RoguelikeInvestTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/RoguelikeInvestTaskPlugin.cpp index df562ad902..1b27380e2c 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeInvestTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/RoguelikeInvestTaskPlugin.cpp @@ -165,8 +165,6 @@ bool asst::RoguelikeInvestTaskPlugin::is_investment_error(const cv::Mat& image) void asst::RoguelikeInvestTaskPlugin::stop_roguelike() const { - if (m_roguelike_task_ptr) { - m_roguelike_task_ptr->exit_then_stop(true); - } + m_control_ptr->exit_then_stop(true); m_task_ptr->set_enable(false); } diff --git a/src/MaaCore/Task/Roguelike/RoguelikeInvestTaskPlugin.h b/src/MaaCore/Task/Roguelike/RoguelikeInvestTaskPlugin.h index 4712c9b989..2eed705e4b 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeInvestTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/RoguelikeInvestTaskPlugin.h @@ -14,9 +14,6 @@ public: virtual bool verify(AsstMsg msg, const json::value& details) const override; virtual bool load_params([[maybe_unused]] const json::value& params) override; -public: - void set_control_plugin_ptr(const auto& ptr) { m_roguelike_task_ptr = ptr; } - private: virtual bool _run() override; std::optional ocr_count(const auto& img, const auto& task_name) const; @@ -27,6 +24,5 @@ private: int m_invest_count = 0; int m_maximum = 0; bool m_stop_when_full = false; // 存款满了就停止 - std::shared_ptr m_roguelike_task_ptr = nullptr; }; } // namespace asst diff --git a/src/MaaCore/Task/Roguelike/RoguelikeRecruitTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/RoguelikeRecruitTaskPlugin.cpp index cad5b03d9f..d8f71bd1ca 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeRecruitTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/RoguelikeRecruitTaskPlugin.cpp @@ -483,9 +483,7 @@ bool asst::RoguelikeRecruitTaskPlugin::lazy_recruit() if (!only_start_with_elite_two) { m_config->set_difficulty(0); } - ProcessTask(*this, { m_config->get_theme() + "@Roguelike@ExitThenAbandon" }) - .set_times_limit("Roguelike@Abandon", 0) - .run(); + m_control_ptr->exit_then_stop(); } } else { diff --git a/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp index 1ef251df5d..bd97f69edb 100644 --- a/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp @@ -372,16 +372,12 @@ void asst::RoguelikeCollapsalParadigmTaskPlugin::wait_for_stage() void asst::RoguelikeCollapsalParadigmTaskPlugin::exit_then_restart() { - ProcessTask(*this, { m_config->get_theme() + "@Roguelike@ExitThenAbandon" }) - .set_times_limit("Roguelike@Abandon", 0) - .run(); + m_control_ptr->exit_then_stop(); } void asst::RoguelikeCollapsalParadigmTaskPlugin::exit_then_stop() { - ProcessTask(*this, { m_config->get_theme() + "@Roguelike@ExitThenAbandon" }) - .set_times_limit(m_config->get_theme() + "@Roguelike@Abandon", 0) - .run(); + m_control_ptr->exit_then_stop(); m_task_ptr->set_enable(false); } diff --git a/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalGainTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalGainTaskPlugin.cpp index 7941ece8a2..9036adf521 100644 --- a/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalGainTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalGainTaskPlugin.cpp @@ -105,9 +105,7 @@ void asst::RoguelikeFoldartalGainTaskPlugin::enter_next_floor() ProcessTask(*this, { m_config->get_theme() + "@Roguelike@NextLevel" }) .set_times_limit("Roguelike@StrategyChange", 0) .run(); - ProcessTask(*this, { m_config->get_theme() + "@Roguelike@ExitThenAbandon" }) - .set_times_limit("Roguelike@Abandon", 0) - .run(); + m_control_ptr->exit_then_stop(); } } }