mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-17 10:00:44 +08:00
perf: 合并肉鸽插件中止控制
This commit is contained in:
@@ -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<RoguelikeControlTaskPlugin>(m_config_ptr);
|
||||
|
||||
// ------------------ 通用插件 ------------------
|
||||
m_roguelike_task_ptr->register_plugin<ScreenshotTaskPlugin>();
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeFormationTaskPlugin>(m_config_ptr);
|
||||
m_control_ptr = m_roguelike_task_ptr->register_plugin<RoguelikeControlTaskPlugin>(m_config_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeResetTaskPlugin>(m_config_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeSettlementTaskPlugin>(m_config_ptr);
|
||||
m_invest_ptr = m_roguelike_task_ptr->register_plugin<RoguelikeInvestTaskPlugin>(m_config_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeFormationTaskPlugin>(m_config_ptr, m_control_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeResetTaskPlugin>(m_config_ptr, m_control_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeSettlementTaskPlugin>(m_config_ptr, m_control_ptr);
|
||||
m_invest_ptr = m_roguelike_task_ptr->register_plugin<RoguelikeInvestTaskPlugin>(m_config_ptr, m_control_ptr);
|
||||
|
||||
m_debug_ptr = m_roguelike_task_ptr->register_plugin<RoguelikeDebugTaskPlugin>(m_config_ptr);
|
||||
m_custom_ptr = m_roguelike_task_ptr->register_plugin<RoguelikeCustomStartTaskPlugin>(m_config_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeShoppingTaskPlugin>(m_config_ptr)->set_retry_times(0);
|
||||
m_debug_ptr = m_roguelike_task_ptr->register_plugin<RoguelikeDebugTaskPlugin>(m_config_ptr, m_control_ptr);
|
||||
m_custom_ptr = m_roguelike_task_ptr->register_plugin<RoguelikeCustomStartTaskPlugin>(m_config_ptr, m_control_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeShoppingTaskPlugin>(m_config_ptr, m_control_ptr)->set_retry_times(0);
|
||||
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeBattleTaskPlugin>(m_config_ptr)
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeBattleTaskPlugin>(m_config_ptr, m_control_ptr)
|
||||
->set_retry_times(0)
|
||||
.set_ignore_error(true);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeRecruitTaskPlugin>(m_config_ptr)
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeRecruitTaskPlugin>(m_config_ptr, m_control_ptr)
|
||||
->set_retry_times(2)
|
||||
.set_ignore_error(true);
|
||||
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeSkillSelectionTaskPlugin>(m_config_ptr)
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeSkillSelectionTaskPlugin>(m_config_ptr, m_control_ptr)
|
||||
->set_retry_times(2)
|
||||
.set_ignore_error(true);
|
||||
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeStageEncounterTaskPlugin>(m_config_ptr)->set_retry_times(0);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeStageEncounterTaskPlugin>(m_config_ptr, m_control_ptr)
|
||||
->set_retry_times(0);
|
||||
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeLastRewardTaskPlugin>(m_config_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeLastRewardTaskPlugin>(m_config_ptr, m_control_ptr);
|
||||
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeDifficultySelectionTaskPlugin>(m_config_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeStrategyChangeTaskPlugin>(m_config_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeDifficultySelectionTaskPlugin>(m_config_ptr, m_control_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeStrategyChangeTaskPlugin>(m_config_ptr, m_control_ptr);
|
||||
|
||||
// ------------------ 萨米主题专用插件 ------------------
|
||||
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeFoldartalGainTaskPlugin>(m_config_ptr);
|
||||
m_foldartal_use_ptr = m_roguelike_task_ptr->register_plugin<RoguelikeFoldartalUseTaskPlugin>(m_config_ptr);
|
||||
m_foldartal_start_ptr = m_roguelike_task_ptr->register_plugin<RoguelikeFoldartalStartTaskPlugin>(m_config_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeCollapsalParadigmTaskPlugin>(m_config_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeFoldartalGainTaskPlugin>(m_config_ptr, m_control_ptr);
|
||||
m_foldartal_use_ptr =
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeFoldartalUseTaskPlugin>(m_config_ptr, m_control_ptr);
|
||||
m_foldartal_start_ptr =
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeFoldartalStartTaskPlugin>(m_config_ptr, m_control_ptr);
|
||||
m_roguelike_task_ptr->register_plugin<RoguelikeCollapsalParadigmTaskPlugin>(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<AbstractRoguelikeTaskPlugin>(plugin); p_ptr != nullptr) {
|
||||
p_ptr->set_enable(p_ptr->load_params(params));
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
#include "AbstractRoguelikeTaskPlugin.h"
|
||||
|
||||
asst::AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin(const AsstCallback& callback, Assistant* inst,
|
||||
std::string_view task_chain,
|
||||
const std::shared_ptr<RoguelikeConfig>& 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<RoguelikeConfig>& config,
|
||||
const std::shared_ptr<RoguelikeControlTaskPlugin>& control) :
|
||||
AbstractTaskPlugin(callback, inst, task_chain),
|
||||
m_config(config),
|
||||
m_control_ptr(control)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -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<RoguelikeConfig>& data);
|
||||
class AbstractRoguelikeTaskPlugin : public AbstractTaskPlugin
|
||||
{
|
||||
public:
|
||||
AbstractRoguelikeTaskPlugin(
|
||||
const AsstCallback& callback,
|
||||
Assistant* inst,
|
||||
std::string_view task_chain,
|
||||
const std::shared_ptr<RoguelikeConfig>& data,
|
||||
const std::shared_ptr<RoguelikeControlTaskPlugin>& 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<RoguelikeConfig> m_config;
|
||||
};
|
||||
|
||||
using RoguelikeTaskPluginPtr = std::shared_ptr<AbstractRoguelikeTaskPlugin>;
|
||||
}
|
||||
protected:
|
||||
std::shared_ptr<RoguelikeConfig> m_config = nullptr;
|
||||
std::shared_ptr<RoguelikeControlTaskPlugin> m_control_ptr = nullptr;
|
||||
};
|
||||
} // namespace asst
|
||||
|
||||
@@ -28,9 +28,10 @@ asst::RoguelikeBattleTaskPlugin::RoguelikeBattleTaskPlugin(
|
||||
const AsstCallback& callback,
|
||||
Assistant* inst,
|
||||
std::string_view task_chain,
|
||||
std::shared_ptr<RoguelikeConfig> roguelike_config_ptr)
|
||||
: AbstractRoguelikeTaskPlugin(callback, inst, task_chain, roguelike_config_ptr)
|
||||
, BattleHelper(inst)
|
||||
const std::shared_ptr<RoguelikeConfig>& roguelike_config_ptr,
|
||||
const std::shared_ptr<RoguelikeControlTaskPlugin>& control) :
|
||||
AbstractRoguelikeTaskPlugin(callback, inst, task_chain, roguelike_config_ptr, control),
|
||||
BattleHelper(inst)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,12 @@ namespace asst
|
||||
inline static const std::unordered_set<std::string> DiceSet = { "骰子", "8面骰子", "12面骰子" };
|
||||
|
||||
public:
|
||||
RoguelikeBattleTaskPlugin(const AsstCallback& callback, Assistant* inst, std::string_view task_chain, std::shared_ptr<RoguelikeConfig>roguelike_config_ptr);
|
||||
RoguelikeBattleTaskPlugin(
|
||||
const AsstCallback& callback,
|
||||
Assistant* inst,
|
||||
std::string_view task_chain,
|
||||
const std::shared_ptr<RoguelikeConfig>& roguelike_config_ptr,
|
||||
const std::shared_ptr<RoguelikeControlTaskPlugin>& control);
|
||||
virtual ~RoguelikeBattleTaskPlugin() override = default;
|
||||
|
||||
virtual bool verify(AsstMsg msg, const json::value& details) const override;
|
||||
|
||||
@@ -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<RoguelikeConfig>& 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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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<RoguelikeConfig>& 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<RoguelikeConfig> m_config = nullptr;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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<int> 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<RoguelikeControlTaskPlugin> m_roguelike_task_ptr = nullptr;
|
||||
};
|
||||
} // namespace asst
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user