perf: 合并肉鸽插件中止控制

This commit is contained in:
status102
2024-08-07 11:43:40 +08:00
parent eb111d0f0e
commit 94ad2e4718
12 changed files with 99 additions and 83 deletions

View File

@@ -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));

View File

@@ -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)
{
}

View File

@@ -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

View File

@@ -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)
{
}

View File

@@ -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;

View File

@@ -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();
}

View File

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

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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 {

View File

@@ -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);
}

View File

@@ -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();
}
}
}