feat: 使用 set_params + set_enable 管理插件而不是延迟注册插件

This commit is contained in:
zzyyyl
2024-07-23 16:21:33 +08:00
parent 6835fbc0fb
commit e76acfcdf2
4 changed files with 42 additions and 34 deletions

View File

@@ -204,15 +204,8 @@ bool asst::RoguelikeTask::set_params(const json::value& params)
// 是否检查坍缩范式非CLP_PDS模式下默认为False, CLP_PDS模式下默认为True
m_config_ptr->set_check_clp_pds(params.get("check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS));
m_cp_ptr->set_double_check_clp_pds(
params.get("double_check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS));
}
m_foldartal_gain_ptr->set_enable(theme == RoguelikeTheme::Sami);
m_foldartal_start_ptr->set_enable(theme == RoguelikeTheme::Sami);
m_foldartal_use_ptr->set_enable(theme == RoguelikeTheme::Sami);
m_cp_ptr->set_enable(theme == RoguelikeTheme::Sami);
m_invest_ptr->set_control_plugin_ptr(m_control_ptr);
const auto& ptr = m_custom_ptr;
@@ -226,5 +219,16 @@ bool asst::RoguelikeTask::set_params(const json::value& params)
RoguelikeCustomType::UseNonfriendSupport,
params.get("use_nonfriend_support", false) ? "1" : "0"); // 是否可以是非好友助战干员
m_foldartal_gain_ptr->set_enable(theme == RoguelikeTheme::Sami);
m_foldartal_start_ptr->set_enable(theme == RoguelikeTheme::Sami);
m_foldartal_use_ptr->set_enable(theme == RoguelikeTheme::Sami);
m_cp_ptr->set_enable(theme == RoguelikeTheme::Sami);
for (const auto& plugin : m_roguelike_task_ptr->get_plugins()) {
if (const auto& roguelike_plugin = std::dynamic_pointer_cast<AbstractRoguelikeTaskPlugin>(plugin)) {
roguelike_plugin->set_enable(roguelike_plugin->set_params(params));
}
}
return true;
}

View File

@@ -15,7 +15,12 @@ namespace asst
virtual void reset_variable() {}
// 根据 params 设置插件专用参数, 返回插件是否适用
virtual bool set_params([[maybe_unused]] const json::value& params) { return true; }
protected:
std::shared_ptr<RoguelikeConfig> m_config;
};
using RoguelikeTaskPluginPtr = std::shared_ptr<AbstractRoguelikeTaskPlugin>;
}

View File

@@ -1,6 +1,8 @@
#include "RoguelikeCollapsalParadigmTaskPlugin.h"
#include "Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.h"
#include <algorithm>
#include "Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.h"
#include "Config/TaskData.h"
#include "Controller/Controller.h"
#include "Task/ProcessTask.h"
@@ -8,33 +10,35 @@
#include "Vision/Matcher.h"
#include "Vision/OCRer.h"
#include <algorithm>
asst::RoguelikeCollapsalParadigmTaskPlugin::RoguelikeCollapsalParadigmTaskPlugin(
const AsstCallback& callback,
Assistant* inst,
std::string_view task_chain,
std::shared_ptr<RoguelikeConfig> config) :
AbstractRoguelikeTaskPlugin(callback, inst, task_chain, config)
bool asst::RoguelikeCollapsalParadigmTaskPlugin::set_params(const json::value& params)
{
// 由于仅有萨米肉鸽使用,任务名暂定写死
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());
const std::string& theme = m_config->get_theme();
if (theme != RoguelikeTheme::Sami) {
return false;
}
std::shared_ptr<OcrTaskInfo> panelCheckConfig =
const RoguelikeMode& mode = m_config->get_mode();
m_double_check_clp_pds = params.get("double_check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS);
// 仅萨米肉鸽使用 TODO: 去掉名字里的下划线, _b -> B, _p -> P
const auto& bannerCheckConfig =
Task.get<OcrTaskInfo>("Sami@Roguelike@CheckCollapsalParadigms_bannerCheckConfig");
const auto& panelCheckConfig =
Task.get<OcrTaskInfo>("Sami@Roguelike@CheckCollapsalParadigms_panelCheckConfig");
m_deepen_text = bannerCheckConfig->text.front();
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());
ranges::for_each(panelCheckConfig->replace_map, [&](const std::pair<std::string, std::string>& p) {
m_zone_dict.emplace(p.first, p.second);
});
m_banner_triggers_start = std::unordered_set(bannerCheckConfig->sub.begin(), bannerCheckConfig->sub.end());
m_banner_triggers_completed = std::unordered_set(bannerCheckConfig->next.begin(), bannerCheckConfig->next.end());
m_panel_triggers = std::unordered_set(panelCheckConfig->sub.begin(), panelCheckConfig->sub.end());
m_zone_dict = std::unordered_map(panelCheckConfig->replace_map.begin(), panelCheckConfig->replace_map.end());
return true;
}
bool asst::RoguelikeCollapsalParadigmTaskPlugin::verify(const AsstMsg msg, const json::value& details) const

View File

@@ -9,15 +9,10 @@ namespace asst
class RoguelikeCollapsalParadigmTaskPlugin : public AbstractRoguelikeTaskPlugin
{
public:
RoguelikeCollapsalParadigmTaskPlugin(
const AsstCallback& callback,
Assistant* inst,
std::string_view task_chain,
std::shared_ptr<RoguelikeConfig> config);
// using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin;
using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin;
virtual ~RoguelikeCollapsalParadigmTaskPlugin() override = default;
virtual bool verify(AsstMsg msg, const json::value& details) const override;
virtual bool set_params(const json::value& params) override;
static bool enabled(std::shared_ptr<RoguelikeConfig> config)
{
return config->get_theme() == RoguelikeTheme::Sami && config->get_check_clp_pds();