fix: 修复肉鸽插件重复注册

This commit is contained in:
status102
2024-07-21 15:46:18 +08:00
parent e5c6bc5191
commit 2ebaa0a978
9 changed files with 170 additions and 148 deletions

View File

@@ -7,8 +7,8 @@
// ------------------ 通用配置及插件 ------------------
#include "Task/Miscellaneous/ScreenshotTaskPlugin.h"
#include "Task/Roguelike/RoguelikeConfig.h"
#include "Task/Roguelike/RoguelikeBattleTaskPlugin.h"
#include "Task/Roguelike/RoguelikeConfig.h"
#include "Task/Roguelike/RoguelikeControlTaskPlugin.h"
#include "Task/Roguelike/RoguelikeCustomStartTaskPlugin.h"
#include "Task/Roguelike/RoguelikeDebugTaskPlugin.h"
@@ -25,25 +25,62 @@
#include "Task/Roguelike/RoguelikeStrategyChangeTaskPlugin.h"
// ------------------ 萨米主题专用配置及插件 ------------------
#include "Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.h"
#include "Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h"
#include "Task/Roguelike/Sami/RoguelikeFoldartalGainTaskPlugin.h"
#include "Task/Roguelike/Sami/RoguelikeFoldartalStartTaskPlugin.h"
#include "Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.h"
#include "Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.h"
#include "Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h"
#include "Utils/Logger.hpp"
asst::RoguelikeTask::RoguelikeTask(const AsstCallback& callback, Assistant* inst)
: InterfaceTask(callback, inst, TaskType),
m_roguelike_task_ptr(std::make_shared<ProcessTask>(callback, inst, TaskType)),
m_roguelike_config_ptr(std::make_shared<RoguelikeConfig>())
: InterfaceTask(callback, inst, TaskType)
, m_roguelike_task_ptr(std::make_shared<ProcessTask>(callback, inst, TaskType))
, m_config_ptr(std::make_shared<RoguelikeConfig>())
{
LogTraceFunction;
m_roguelike_task_ptr->set_ignore_error(true);
m_invest_plugin_ptr = m_roguelike_task_ptr->register_plugin<RoguelikeInvestTaskPlugin>(
m_roguelike_config_ptr);
// ------------------ 通用插件 ------------------
m_roguelike_task_ptr->register_plugin<ScreenshotTaskPlugin>();
m_roguelike_task_ptr->register_plugin<RoguelikeFormationTaskPlugin>(m_config_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_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_roguelike_task_ptr->register_plugin<RoguelikeBattleTaskPlugin>(m_config_ptr)
->set_retry_times(0)
.set_ignore_error(true);
m_roguelike_task_ptr->register_plugin<RoguelikeRecruitTaskPlugin>(m_config_ptr)
->set_retry_times(2)
.set_ignore_error(true);
m_roguelike_task_ptr->register_plugin<RoguelikeSkillSelectionTaskPlugin>(m_config_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<RoguelikeLastRewardTaskPlugin>(m_config_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<RoguelikeFoldartalGainTaskPlugin>(m_config_ptr);
m_roguelike_task_ptr->register_plugin<RoguelikeFoldartalUseTaskPlugin>(m_config_ptr);
m_roguelike_task_ptr->register_plugin<RoguelikeFoldartalStartTaskPlugin>(m_config_ptr);
m_roguelike_task_ptr->register_plugin<RoguelikeCollapsalParadigmTaskPlugin>(m_config_ptr);
// 这个任务如果卡住会放弃当前的肉鸽并重新开始,所以多添加亿点。先这样凑合用
for (int i = 0; i != 999; ++i) {
@@ -71,20 +108,21 @@ bool asst::RoguelikeTask::set_params(const json::value& params)
}
m_roguelike_task_ptr->set_tasks({ theme + "@Roguelike@Begin" });
m_roguelike_config_ptr->set_theme(theme);
m_roguelike_config_ptr->set_mode(mode);
m_roguelike_config_ptr->set_difficulty(0);
m_config_ptr->set_theme(theme);
m_config_ptr->set_mode(mode);
m_config_ptr->set_difficulty(0);
// 是否凹指定干员开局直升
m_roguelike_config_ptr->set_start_with_elite_two(params.get("start_with_elite_two", false));
m_roguelike_config_ptr->set_only_start_with_elite_two(params.get("only_start_with_elite_two", false));
m_config_ptr->set_start_with_elite_two(params.get("start_with_elite_two", false));
m_config_ptr->set_only_start_with_elite_two(params.get("only_start_with_elite_two", false));
m_invest_plugin_ptr->set_invest_maximum(params.get("investments_count", INT_MAX));
m_invest_plugin_ptr->set_stop_when_full(params.get("stop_when_investment_full", false));
m_invest_ptr->set_invest_maximum(params.get("investments_count", INT_MAX));
m_invest_ptr->set_stop_when_full(params.get("stop_when_investment_full", false));
// 设置层数选点策略,相关逻辑在 RoguelikeStrategyChangeTaskPlugin
{
Task.set_task_base(theme + "@Roguelike@Stages", theme + "@Roguelike@Stages_default");
std::string strategy_task = theme + "@Roguelike@StrategyChange";
std::string strategy_task_with_mode = strategy_task + "_mode" + std::to_string(static_cast<int>(mode));
std::string strategy_task_with_mode =
strategy_task + "_mode" + std::to_string(static_cast<int>(mode));
if (Task.get(strategy_task_with_mode) == nullptr) {
strategy_task_with_mode = "#none"; // 没有对应的层数选点策略,使用默认策略(避战)
Log.warn(__FUNCTION__, "No strategy for mode", static_cast<int>(mode));
@@ -99,25 +137,36 @@ bool asst::RoguelikeTask::set_params(const json::value& params)
Task.set_task_base("Roguelike@LastReward4", "Roguelike@LastReward_default");
Task.set_task_base("Roguelike@LastRewardRand", "Roguelike@LastReward_default");
m_debug_ptr->set_enable(mode != RoguelikeMode::Investment);
if (mode == RoguelikeMode::Investment) {
bool investment_with_more_score = params.get("investment_with_more_score", false);
if (!params.contains("investment_with_more_score") && params.contains("investment_enter_second_floor")) {
if (!params.contains("investment_with_more_score")
&& params.contains("investment_enter_second_floor")) {
investment_with_more_score = params.get("investment_enter_second_floor", true);
Log.warn("================ DEPRECATED ================");
Log.warn("`investment_enter_second_floor` has been deprecated since v5.2.1; Please use 'investment_with_more_score'");
Log.warn(
"`investment_enter_second_floor` has been deprecated since v5.2.1; Please use "
"'investment_with_more_score'");
Log.warn("================ DEPRECATED ================");
}
m_roguelike_config_ptr->set_invest_with_more_score(investment_with_more_score);
m_config_ptr->set_invest_with_more_score(investment_with_more_score);
// 刷源石锭模式是否进入第二层
if (investment_with_more_score) {
// 战斗后奖励默认
Task.set_task_base(theme + "@Roguelike@DropsFlag", theme + "@Roguelike@DropsFlag_default");
Task.set_task_base(
theme + "@Roguelike@DropsFlag",
theme + "@Roguelike@DropsFlag_default");
m_roguelike_task_ptr->set_times_limit("StageTraderInvestCancel", INT_MAX);
m_roguelike_task_ptr->set_times_limit("StageTraderLeaveConfirm", 0, ProcessTask::TimesLimitType::Post);
m_roguelike_task_ptr->set_times_limit(
"StageTraderLeaveConfirm",
0,
ProcessTask::TimesLimitType::Post);
}
else {
// 战斗后奖励只拿钱
Task.set_task_base(theme + "@Roguelike@DropsFlag", theme + "@Roguelike@DropsFlag_mode1");
Task.set_task_base(
theme + "@Roguelike@DropsFlag",
theme + "@Roguelike@DropsFlag_mode1");
m_roguelike_task_ptr->set_times_limit("StageTraderInvestCancel", 0);
m_roguelike_task_ptr->set_times_limit("StageTraderLeaveConfirm", INT_MAX);
}
@@ -129,22 +178,26 @@ bool asst::RoguelikeTask::set_params(const json::value& params)
m_roguelike_task_ptr->set_times_limit("StageTraderLeaveConfirm", INT_MAX);
}
m_roguelike_task_ptr->set_times_limit(theme + "@Roguelike@StartExplore", params.get("starts_count", INT_MAX));
m_roguelike_task_ptr->set_times_limit(
theme + "@Roguelike@StartExplore",
params.get("starts_count", INT_MAX));
// 通过 exceededNext 禁用投资系统,进入商店购买逻辑
m_roguelike_task_ptr->set_times_limit("StageTraderInvestSystem",
params.get("investment_enabled", true) ? INT_MAX : 0);
m_roguelike_task_ptr->set_times_limit("StageTraderRefreshWithDice",
params.get("refresh_trader_with_dice", false) ? INT_MAX : 0);
m_roguelike_task_ptr->set_times_limit(
"StageTraderInvestSystem",
params.get("investment_enabled", true) ? INT_MAX : 0);
m_roguelike_task_ptr->set_times_limit(
"StageTraderRefreshWithDice",
params.get("refresh_trader_with_dice", false) ? INT_MAX : 0);
// =========================== 萨米主题专用参数 ===========================
if (theme == RoguelikeTheme::Sami) {
// 是否凹开局远见密文板
m_roguelike_config_ptr->set_first_floor_foldartal(params.contains("first_floor_foldartal"));
m_roguelike_config_ptr->set_start_floor_foldartal(params.get("first_floor_foldartal", ""));
m_config_ptr->set_first_floor_foldartal(params.contains("first_floor_foldartal"));
m_config_ptr->set_start_floor_foldartal(params.get("first_floor_foldartal", ""));
// 是否生活队凹开局板子
m_roguelike_config_ptr->set_start_foldartal(params.contains("start_foldartal_list"));
m_config_ptr->set_start_foldartal(params.contains("start_foldartal_list"));
if (auto opt = params.find<json::array>("start_foldartal_list"); opt) {
std::vector<std::string> list;
@@ -157,84 +210,35 @@ bool asst::RoguelikeTask::set_params(const json::value& params)
Log.error(__FUNCTION__, "| Empty start_foldartal_list");
return false;
}
m_roguelike_config_ptr->set_start_foldartal_list(std::move(list));
m_config_ptr->set_start_foldartal_list(std::move(list));
}
// 是否使用密文版, 非CLP_PDS模式下默认为True, CLP_PDS模式下默认为False
m_roguelike_config_ptr->set_use_foldartal(params.get("use_foldartal", mode != RoguelikeMode::CLP_PDS));
m_config_ptr->set_use_foldartal(
params.get("use_foldartal", mode != RoguelikeMode::CLP_PDS));
// 是否检查坍缩范式非CLP_PDS模式下默认为False, CLP_PDS模式下默认为True
m_roguelike_config_ptr->set_check_clp_pds(params.get("check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS));
m_roguelike_config_ptr->set_double_check_clp_pds(params.get("double_check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS));
m_config_ptr->set_check_clp_pds(
params.get("check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS));
m_config_ptr->set_double_check_clp_pds(
params.get("double_check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS));
const std::unordered_set<std::string>& rare_clp_pds = RoguelikeCollapsalParadigms.get_rare_clp_pds(theme);
m_roguelike_config_ptr->set_expected_clp_pds(params.get("expected_collapsal_paradigms", rare_clp_pds));
const std::unordered_set<std::string>& rare_clp_pds =
RoguelikeCollapsalParadigms.get_rare_clp_pds(theme);
m_config_ptr->set_expected_clp_pds(
params.get("expected_collapsal_paradigms", rare_clp_pds));
}
register_roguelike_plugins(params);
const auto& ptr = m_custom_ptr;
ptr->set_custom(RoguelikeCustomType::Squad, params.get("squad", "")); // 开局分队
ptr->set_custom(RoguelikeCustomType::Roles, params.get("roles", "")); // 开局职业组
ptr->set_custom(RoguelikeCustomType::CoreChar, params.get("core_char", "")); // 开局干员名
ptr->set_custom(
RoguelikeCustomType::UseSupport,
params.get("use_support", false) ? "1" : "0"); // 开局干员是否为助战干员
ptr->set_custom(
RoguelikeCustomType::UseNonfriendSupport,
params.get("use_nonfriend_support", false) ? "1" : "0"); // 是否可以是非好友助战干员
return true;
}
void asst::RoguelikeTask::register_roguelike_plugins(const json::value& params) {
LogTraceFunction;
// ------------------ 通用插件 ------------------
m_roguelike_task_ptr->register_plugin<ScreenshotTaskPlugin>();
m_roguelike_task_ptr->register_plugin<RoguelikeFormationTaskPlugin>(m_roguelike_config_ptr);
m_roguelike_task_ptr->register_plugin<RoguelikeControlTaskPlugin>(m_roguelike_config_ptr);
m_roguelike_task_ptr->register_plugin<RoguelikeResetTaskPlugin>(m_roguelike_config_ptr);
m_roguelike_task_ptr->register_plugin<RoguelikeSettlementTaskPlugin>(m_roguelike_config_ptr);
std::shared_ptr<RoguelikeDebugTaskPlugin> debug_plugin_ptr =
m_roguelike_task_ptr->register_plugin<RoguelikeDebugTaskPlugin>(m_roguelike_config_ptr);
if (m_roguelike_config_ptr->get_mode() == RoguelikeMode::Investment) {
debug_plugin_ptr->set_enable(false);
}
else {
debug_plugin_ptr->set_enable(true);
}
m_roguelike_task_ptr->register_plugin<RoguelikeShoppingTaskPlugin>(m_roguelike_config_ptr)->set_retry_times(0);
const auto& custom_start_plugin_ptr = m_roguelike_task_ptr->register_plugin<RoguelikeCustomStartTaskPlugin>(m_roguelike_config_ptr);
custom_start_plugin_ptr->set_custom(RoguelikeCustomType::Squad, params.get("squad", "")); // 开局分队
custom_start_plugin_ptr->set_custom(RoguelikeCustomType::Roles, params.get("roles", "")); // 开局职业组
custom_start_plugin_ptr->set_custom(RoguelikeCustomType::CoreChar, params.get("core_char", "")); // 开局干员名
custom_start_plugin_ptr->set_custom(RoguelikeCustomType::UseSupport,
params.get("use_support", false) ? "1" : "0"); // 开局干员是否为助战干员
custom_start_plugin_ptr->set_custom(RoguelikeCustomType::UseNonfriendSupport,
params.get("use_nonfriend_support", false) ? "1"
: "0"); // 是否可以是非好友助战干员
m_roguelike_task_ptr->register_plugin<RoguelikeBattleTaskPlugin>(m_roguelike_config_ptr)
->set_retry_times(0)
.set_ignore_error(true);
m_roguelike_task_ptr->register_plugin<RoguelikeRecruitTaskPlugin>(m_roguelike_config_ptr)
->set_retry_times(2)
.set_ignore_error(true);
m_roguelike_task_ptr->register_plugin<RoguelikeSkillSelectionTaskPlugin>(m_roguelike_config_ptr)
->set_retry_times(2)
.set_ignore_error(true);
m_roguelike_task_ptr->register_plugin<RoguelikeStageEncounterTaskPlugin>(m_roguelike_config_ptr)
->set_retry_times(0);
m_roguelike_task_ptr->register_plugin<RoguelikeLastRewardTaskPlugin>(m_roguelike_config_ptr);
m_roguelike_task_ptr->register_plugin<RoguelikeDifficultySelectionTaskPlugin>(m_roguelike_config_ptr);
m_roguelike_task_ptr->register_plugin<RoguelikeStrategyChangeTaskPlugin>(m_roguelike_config_ptr);
// ------------------ 萨米主题专用插件 ------------------
if (m_roguelike_config_ptr->get_theme() == RoguelikeTheme::Sami) {
m_roguelike_task_ptr->register_plugin<RoguelikeFoldartalGainTaskPlugin>(m_roguelike_config_ptr);
m_roguelike_task_ptr->register_plugin<RoguelikeFoldartalUseTaskPlugin>(m_roguelike_config_ptr);
m_roguelike_task_ptr->register_plugin<RoguelikeFoldartalStartTaskPlugin>(m_roguelike_config_ptr);
m_roguelike_task_ptr->register_plugin<RoguelikeCollapsalParadigmTaskPlugin>(m_roguelike_config_ptr);
}
}

View File

@@ -6,6 +6,8 @@ namespace asst
class ProcessTask;
class RoguelikeConfig;
class RoguelikeInvestTaskPlugin;
class RoguelikeDebugTaskPlugin;
class RoguelikeCustomStartTaskPlugin;
class RoguelikeTask : public InterfaceTask
{
@@ -19,9 +21,10 @@ namespace asst
private:
std::shared_ptr<ProcessTask> m_roguelike_task_ptr = nullptr;
std::shared_ptr<RoguelikeConfig> m_roguelike_config_ptr = nullptr;
std::shared_ptr<RoguelikeInvestTaskPlugin> m_invest_plugin_ptr = nullptr;
std::shared_ptr<RoguelikeConfig> m_config_ptr = nullptr;
std::shared_ptr<RoguelikeInvestTaskPlugin> m_invest_ptr = nullptr;
std::shared_ptr<RoguelikeDebugTaskPlugin> m_debug_ptr = nullptr;
std::shared_ptr<RoguelikeCustomStartTaskPlugin> m_custom_ptr = nullptr;
void register_roguelike_plugins(const json::value& params);
};
}

View File

@@ -150,7 +150,7 @@ namespace asst
void set_use_nonfriend_support(bool value) { m_use_nonfriend_support = value; }
bool get_use_nonfriend_support() const { return m_use_nonfriend_support; }
void set_oper(std::unordered_map<std::string, RoguelikeOper> oper) { m_oper = std::move(oper); }
const std::unordered_map<std::string, RoguelikeOper>& get_oper() const { return m_oper; }
const auto& get_oper() const { return m_oper; }
private:
// ------------------ 招募 ------------------

View File

@@ -35,11 +35,11 @@ bool asst::RoguelikeStageEncounterTaskPlugin::verify(AsstMsg msg, const json::va
bool asst::RoguelikeStageEncounterTaskPlugin::_run()
{
LogTraceFunction;
if (!plugin_gained) {
plugin_gained = true;
typedef RoguelikeCollapsalParadigmTaskPlugin CPPlugin;
if (!m_plugin_gained) {
m_plugin_gained = true;
typedef RoguelikeCollapsalParadigmTaskPlugin Plugin;
for (const auto& plugin : m_task_ptr->get_plugins()) {
if (auto ptr = std::dynamic_pointer_cast<CPPlugin>(plugin)) {
if (auto ptr = std::dynamic_pointer_cast<Plugin>(plugin)) {
m_clp_pd_plugin = ptr;
break;
}

View File

@@ -25,6 +25,6 @@ namespace asst
private:
std::shared_ptr<RoguelikeCollapsalParadigmTaskPlugin> m_clp_pd_plugin;
bool plugin_gained = false;
bool m_plugin_gained = false;
};
}

View File

@@ -10,7 +10,40 @@
#include <algorithm>
bool asst::RoguelikeCollapsalParadigmTaskPlugin::verify(const AsstMsg msg, const json::value& details) const
asst::RoguelikeCollapsalParadigmTaskPlugin::RoguelikeCollapsalParadigmTaskPlugin(
const AsstCallback& callback,
Assistant* inst,
std::string_view task_chain,
std::shared_ptr<RoguelikeConfig> config)
: AbstractRoguelikeTaskPlugin(callback, inst, task_chain, config)
{
// 由于仅有萨米肉鸽使用,任务名暂定写死
std::shared_ptr<OcrTaskInfo> bannerCheckConfig =
Task.get<OcrTaskInfo>("Sami@Roguelike@CheckCollapsalParadigms_bannerCheckConfig");
m_deepen_text = bannerCheckConfig->text.front();
m_banner_triggers_start.insert(bannerCheckConfig->sub.begin(), bannerCheckConfig->sub.end());
m_banner_triggers_completed.insert(
bannerCheckConfig->next.begin(),
bannerCheckConfig->next.end());
std::shared_ptr<OcrTaskInfo> panelCheckConfig =
Task.get<OcrTaskInfo>("Sami@Roguelike@CheckCollapsalParadigms_panelCheckConfig");
m_roi = panelCheckConfig->roi;
m_swipe_begin.x = panelCheckConfig->specific_rect.x;
m_swipe_begin.y = panelCheckConfig->specific_rect.y;
m_swipe_end.x = panelCheckConfig->rect_move.x;
m_swipe_end.y = panelCheckConfig->rect_move.y;
m_panel_triggers.insert(panelCheckConfig->sub.begin(), panelCheckConfig->sub.end());
std::ranges::for_each(
panelCheckConfig->replace_map,
[&](const std::pair<std::string, std::string>& p) {
m_zone_dict.emplace(p.first, p.second);
});
}
bool asst::RoguelikeCollapsalParadigmTaskPlugin::verify(
const AsstMsg msg,
const json::value& details) const
{
if ((msg != AsstMsg::SubTaskStart && msg != AsstMsg::SubTaskCompleted) || details.get("subtask", std::string()) != "ProcessTask") {
return false;

View File

@@ -9,31 +9,12 @@ namespace asst
class RoguelikeCollapsalParadigmTaskPlugin : public AbstractRoguelikeTaskPlugin
{
public:
RoguelikeCollapsalParadigmTaskPlugin(const AsstCallback& callback,
Assistant* inst,
std::string_view task_chain,
std::shared_ptr<RoguelikeConfig> config)
: AbstractRoguelikeTaskPlugin(callback, inst, task_chain, config)
{
const std::string& theme = config->get_theme();
std::shared_ptr<OcrTaskInfo> bannerCheckConfig =
Task.get<OcrTaskInfo>(theme + "@Roguelike@CheckCollapsalParadigms_bannerCheckConfig");
m_deepen_text = bannerCheckConfig->text.front();
m_banner_triggers_start.insert(bannerCheckConfig->sub.begin(), bannerCheckConfig->sub.end());
m_banner_triggers_completed.insert(bannerCheckConfig->next.begin(), bannerCheckConfig->next.end());
std::shared_ptr<OcrTaskInfo> panelCheckConfig =
Task.get<OcrTaskInfo>(theme + "@Roguelike@CheckCollapsalParadigms_panelCheckConfig");
m_roi = panelCheckConfig->roi;
m_swipe_begin.x = panelCheckConfig->specific_rect.x;
m_swipe_begin.y = panelCheckConfig->specific_rect.y;
m_swipe_end.x = panelCheckConfig->rect_move.x;
m_swipe_end.y = panelCheckConfig->rect_move.y;
m_panel_triggers.insert(panelCheckConfig->sub.begin(), panelCheckConfig->sub.end());
std::ranges::for_each(panelCheckConfig->replace_map,
[&](const std::pair<std::string, std::string>& p) { m_zone_dict.emplace(p.first, p.second); });
}
RoguelikeCollapsalParadigmTaskPlugin(
const AsstCallback& callback,
Assistant* inst,
std::string_view task_chain,
std::shared_ptr<RoguelikeConfig> config);
// using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin;
virtual ~RoguelikeCollapsalParadigmTaskPlugin() override = default;

View File

@@ -76,6 +76,16 @@ bool asst::RoguelikeFoldartalUseTaskPlugin::verify(const AsstMsg msg, const json
bool asst::RoguelikeFoldartalUseTaskPlugin::_run()
{
LogTraceFunction;
if (!m_plugin_gained) {
m_plugin_gained = true;
typedef RoguelikeCollapsalParadigmTaskPlugin Plugin;
for (const auto& plugin : m_task_ptr->get_plugins()) {
if (auto ptr = std::dynamic_pointer_cast<Plugin>(plugin)) {
m_clp_pd_plugin = ptr;
break;
}
}
}
std::vector<RoguelikeFoldartalCombination> combination =
RoguelikeFoldartal.get_combination(m_config->get_theme());

View File

@@ -8,17 +8,7 @@ namespace asst
class RoguelikeFoldartalUseTaskPlugin : public AbstractRoguelikeTaskPlugin
{
public:
// using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin;
RoguelikeFoldartalUseTaskPlugin(const AsstCallback& callback,
Assistant* inst,
std::string_view task_chain,
std::shared_ptr<RoguelikeConfig> config)
: AbstractRoguelikeTaskPlugin(callback, inst, task_chain, config)
{
if (RoguelikeCollapsalParadigmTaskPlugin::enabled(config)) {
m_clp_pd_plugin = std::make_shared<RoguelikeCollapsalParadigmTaskPlugin>(callback, inst, task_chain, config);
}
}
using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin;
virtual ~RoguelikeFoldartalUseTaskPlugin() override = default;
public:
@@ -54,6 +44,7 @@ namespace asst
// 节点类型
mutable std::string m_stage;
bool m_plugin_gained;
std::shared_ptr<RoguelikeCollapsalParadigmTaskPlugin> m_clp_pd_plugin;
};
}