mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-20 02:55:38 +08:00
perf: 非萨米肉鸽时禁用仅萨米用插件 (#9880)
This commit is contained in:
@@ -224,6 +224,9 @@ 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));
|
||||
|
||||
}
|
||||
|
||||
const auto& ptr = m_custom_ptr;
|
||||
@@ -237,12 +240,5 @@ bool asst::RoguelikeTask::set_params(const json::value& params)
|
||||
RoguelikeCustomType::UseNonfriendSupport,
|
||||
params.get("use_nonfriend_support", false) ? "1" : "0"); // 是否可以是非好友助战干员
|
||||
|
||||
// ———————— plugin configuration ————————————————————————————————
|
||||
for (const TaskPluginPtr& plugin : m_roguelike_task_ptr->get_plugins()) {
|
||||
if (RoguelikeTaskPluginPtr roguelike_plugin = std::dynamic_pointer_cast<AbstractRoguelikeTaskPlugin>(plugin)) {
|
||||
roguelike_plugin->config(params);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -15,12 +15,7 @@ namespace asst
|
||||
|
||||
virtual void reset_variable() {}
|
||||
|
||||
// 根据 params 设置插件专用参数, 当插件不适用时关闭 m_enable
|
||||
virtual void config([[maybe_unused]] const json::value& params) {}
|
||||
|
||||
protected:
|
||||
std::shared_ptr<RoguelikeConfig> m_config;
|
||||
};
|
||||
|
||||
using RoguelikeTaskPluginPtr = std::shared_ptr<AbstractRoguelikeTaskPlugin>;
|
||||
}
|
||||
|
||||
@@ -10,28 +10,19 @@
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
void asst::RoguelikeCollapsalParadigmTaskPlugin::config(const json::value& params)
|
||||
asst::RoguelikeCollapsalParadigmTaskPlugin::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 = m_config->get_theme();
|
||||
if (theme != RoguelikeTheme::Sami) {
|
||||
m_enable = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// ———————— 根据 params 设置插件 ————————————————
|
||||
const RoguelikeMode& mode = m_config->get_mode();
|
||||
m_double_check_clp_pds = params.get("double_check_collapsal_paradigms", mode == RoguelikeMode::CLP_PDS);
|
||||
|
||||
// ———————— 从 tasks.json 获取插件设置 ———————————
|
||||
// 由于仅有萨米肉鸽使用,任务名暂定写死
|
||||
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());
|
||||
m_banner_triggers_completed.insert(bannerCheckConfig->next.begin(), bannerCheckConfig->next.end());
|
||||
|
||||
std::shared_ptr<OcrTaskInfo> panelCheckConfig =
|
||||
Task.get<OcrTaskInfo>("Sami@Roguelike@CheckCollapsalParadigms_panelCheckConfig");
|
||||
@@ -41,42 +32,41 @@ void asst::RoguelikeCollapsalParadigmTaskPlugin::config(const json::value& param
|
||||
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);
|
||||
});
|
||||
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
|
||||
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") {
|
||||
if ((msg != AsstMsg::SubTaskStart && msg != AsstMsg::SubTaskCompleted) ||
|
||||
details.get("subtask", std::string()) != "ProcessTask") {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_config->get_theme() != RoguelikeTheme::Sami || !m_config->get_check_clp_pds()) {
|
||||
if (m_config->get_theme() != RoguelikeTheme::Sami) {
|
||||
m_enable = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_config->get_check_clp_pds()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto task_name = details.get("details", "task", "");
|
||||
|
||||
if (msg == AsstMsg::SubTaskStart
|
||||
&& m_banner_triggers_start.find(task_name) != m_banner_triggers_start.end()) {
|
||||
if (msg == AsstMsg::SubTaskStart && m_banner_triggers_start.find(task_name) != m_banner_triggers_start.end()) {
|
||||
m_check_banner = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (msg == AsstMsg::SubTaskCompleted
|
||||
&& m_banner_triggers_completed.find(task_name) != m_banner_triggers_completed.end()) {
|
||||
if (msg == AsstMsg::SubTaskCompleted &&
|
||||
m_banner_triggers_completed.find(task_name) != m_banner_triggers_completed.end()) {
|
||||
m_check_banner = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (msg == AsstMsg::SubTaskStart
|
||||
&& m_panel_triggers.find(task_name) != m_panel_triggers.end()) {
|
||||
if (msg == AsstMsg::SubTaskStart && m_panel_triggers.find(task_name) != m_panel_triggers.end()) {
|
||||
if (new_zone()) {
|
||||
m_config->set_need_check_panel(true);
|
||||
m_verification_check = false;
|
||||
@@ -89,8 +79,8 @@ bool asst::RoguelikeCollapsalParadigmTaskPlugin::verify(
|
||||
}
|
||||
}
|
||||
|
||||
if (msg == AsstMsg::SubTaskCompleted && !m_config->get_need_check_panel()
|
||||
&& m_double_check_clp_pds && m_panel_triggers.find(task_name) == m_panel_triggers.end()) {
|
||||
if (msg == AsstMsg::SubTaskCompleted && !m_config->get_need_check_panel() && m_double_check_clp_pds &&
|
||||
m_panel_triggers.find(task_name) == m_panel_triggers.end()) {
|
||||
m_config->set_need_check_panel(true);
|
||||
m_verification_check = true;
|
||||
};
|
||||
@@ -146,8 +136,7 @@ bool asst::RoguelikeCollapsalParadigmTaskPlugin::check_collapsal_paradigm_banner
|
||||
OCRer analyzer2(image); // 检测坍缩范式
|
||||
analyzer2.set_task_info(theme + "@Roguelike@CheckCollapsalParadigms_banner");
|
||||
if (!analyzer2.analyze()) {
|
||||
Log.info(
|
||||
"Roguelike Collapsal Paradigm Task Plugin: Erroneous Recognition in Banner Check");
|
||||
Log.info("Roguelike Collapsal Paradigm Task Plugin: Erroneous Recognition in Banner Check");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -178,13 +167,9 @@ bool asst::RoguelikeCollapsalParadigmTaskPlugin::check_collapsal_paradigm_banner
|
||||
std::string cur_clp_pd = (*result_it2).text;
|
||||
const CollapsalParadigmClass& cur_class = clp_pd_classes.at(clp_pd_dict.at(cur_clp_pd));
|
||||
if ((*result_it1).text == m_deepen_text) {
|
||||
if (it = std::find(prev_clp_pds.begin(), prev_clp_pds.end(), cur_clp_pd);
|
||||
it == prev_clp_pds.end()) {
|
||||
if (it = std::find(prev_clp_pds.begin(), prev_clp_pds.end(), cur_clp_pd); it == prev_clp_pds.end()) {
|
||||
if (cur_clp_pd == cur_class.level_2) {
|
||||
if (it = std::find(
|
||||
prev_clp_pds.begin(),
|
||||
prev_clp_pds.end(),
|
||||
cur_class.level_1);
|
||||
if (it = std::find(prev_clp_pds.begin(), prev_clp_pds.end(), cur_class.level_1);
|
||||
it != prev_clp_pds.end()) {
|
||||
clp_pd_callback(cur_clp_pd, 1, *it);
|
||||
*it = cur_clp_pd;
|
||||
@@ -205,16 +190,14 @@ bool asst::RoguelikeCollapsalParadigmTaskPlugin::check_collapsal_paradigm_banner
|
||||
return true;
|
||||
}
|
||||
else if (
|
||||
m_config->get_mode()
|
||||
== RoguelikeMode::CLP_PDS) { // 刷坍缩范式模式下,获得了不想要的坍缩范式
|
||||
m_config->get_mode() == RoguelikeMode::CLP_PDS) { // 刷坍缩范式模式下,获得了不想要的坍缩范式
|
||||
exit_then_restart();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (it = std::find(prev_clp_pds.begin(), prev_clp_pds.end(), cur_clp_pd);
|
||||
it != prev_clp_pds.end()) {
|
||||
if (it = std::find(prev_clp_pds.begin(), prev_clp_pds.end(), cur_clp_pd); it != prev_clp_pds.end()) {
|
||||
if (cur_clp_pd == cur_class.level_2) {
|
||||
clp_pd_callback(cur_class.level_1, -1, cur_clp_pd);
|
||||
*it = cur_class.level_1;
|
||||
@@ -247,8 +230,7 @@ bool asst::RoguelikeCollapsalParadigmTaskPlugin::check_collapsal_paradigm_panel(
|
||||
|
||||
const std::string& theme = m_config->get_theme();
|
||||
|
||||
const std::vector<CollapsalParadigmClass>& clp_pd_classes =
|
||||
RoguelikeCollapsalParadigms.get_clp_pd_classes(theme);
|
||||
const std::vector<CollapsalParadigmClass>& clp_pd_classes = RoguelikeCollapsalParadigms.get_clp_pd_classes(theme);
|
||||
const std::unordered_map<std::string, unsigned int>& clp_pd_dict =
|
||||
RoguelikeCollapsalParadigms.get_clp_pd_dict(theme);
|
||||
const auto& expected_clp_pds = RoguelikeCollapsalParadigms.get_rare_clp_pds(theme);
|
||||
@@ -258,8 +240,7 @@ bool asst::RoguelikeCollapsalParadigmTaskPlugin::check_collapsal_paradigm_panel(
|
||||
|
||||
cv::Mat image;
|
||||
OCRer analyzer;
|
||||
analyzer.set_task_info(
|
||||
theme + "@Roguelike@CheckCollapsalParadigms_onPanel"); // 检测 "当前坍缩值" 字样
|
||||
analyzer.set_task_info(theme + "@Roguelike@CheckCollapsalParadigms_onPanel"); // 检测 "当前坍缩值" 字样
|
||||
do {
|
||||
toggle_collapsal_status_panel();
|
||||
image = ctrler()->get_image();
|
||||
@@ -289,11 +270,9 @@ bool asst::RoguelikeCollapsalParadigmTaskPlugin::check_collapsal_paradigm_panel(
|
||||
}
|
||||
sort_by_vertical_(ocr_results); // 按照水平方向排序(从左到右
|
||||
|
||||
std::transform(
|
||||
ocr_results.begin(),
|
||||
ocr_results.end(),
|
||||
std::back_inserter(cur_clp_pds),
|
||||
[](OCRer::Result x) { return x.text; });
|
||||
std::transform(ocr_results.begin(), ocr_results.end(), std::back_inserter(cur_clp_pds), [](OCRer::Result x) {
|
||||
return x.text;
|
||||
});
|
||||
}
|
||||
|
||||
if (m_verification_check) {
|
||||
@@ -332,8 +311,7 @@ bool asst::RoguelikeCollapsalParadigmTaskPlugin::check_collapsal_paradigm_panel(
|
||||
if (cur_clp_pd == cur_class.level_2 && *it == cur_class.level_1) { // 从1级加深到2级
|
||||
clp_pd_callback(cur_clp_pd, 1, cur_class.level_1);
|
||||
}
|
||||
else if (
|
||||
cur_clp_pd == cur_class.level_1 && *it == cur_class.level_2) { // 从2级消退到1级
|
||||
else if (cur_clp_pd == cur_class.level_1 && *it == cur_class.level_2) { // 从2级消退到1级
|
||||
clp_pd_callback(cur_clp_pd, -1, cur_class.level_2);
|
||||
}
|
||||
++it;
|
||||
@@ -345,9 +323,7 @@ bool asst::RoguelikeCollapsalParadigmTaskPlugin::check_collapsal_paradigm_panel(
|
||||
exit_then_stop();
|
||||
return true;
|
||||
}
|
||||
else if (
|
||||
m_config->get_mode()
|
||||
== RoguelikeMode::CLP_PDS) { // 刷坍缩范式模式下,获得了不想要的坍缩范式
|
||||
else if (m_config->get_mode() == RoguelikeMode::CLP_PDS) { // 刷坍缩范式模式下,获得了不想要的坍缩范式
|
||||
toggle_collapsal_status_panel();
|
||||
exit_then_restart();
|
||||
return true;
|
||||
|
||||
@@ -9,10 +9,15 @@ namespace asst
|
||||
class RoguelikeCollapsalParadigmTaskPlugin : public AbstractRoguelikeTaskPlugin
|
||||
{
|
||||
public:
|
||||
using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin;
|
||||
RoguelikeCollapsalParadigmTaskPlugin(
|
||||
const AsstCallback& callback,
|
||||
Assistant* inst,
|
||||
std::string_view task_chain,
|
||||
std::shared_ptr<RoguelikeConfig> config);
|
||||
// using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin;
|
||||
virtual ~RoguelikeCollapsalParadigmTaskPlugin() override = default;
|
||||
virtual bool verify(AsstMsg msg, const json::value& details) const override;
|
||||
virtual void config(const json::value& params) override;
|
||||
|
||||
static bool enabled(std::shared_ptr<RoguelikeConfig> config)
|
||||
{
|
||||
return config->get_theme() == RoguelikeTheme::Sami && config->get_check_clp_pds();
|
||||
|
||||
@@ -13,8 +13,10 @@ bool asst::RoguelikeFoldartalGainTaskPlugin::verify(AsstMsg msg, const json::val
|
||||
}
|
||||
|
||||
if (m_config->get_theme() != RoguelikeTheme::Sami) {
|
||||
m_enable = false;
|
||||
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;
|
||||
@@ -105,8 +107,9 @@ void asst::RoguelikeFoldartalGainTaskPlugin::enter_next_floor()
|
||||
bool asst::RoguelikeFoldartalGainTaskPlugin::gain_stage_award()
|
||||
{
|
||||
OCRer analyzer(ctrler()->get_image());
|
||||
analyzer.set_task_info(m_config->get_theme() + (m_ocr_after_combat ? "@Roguelike@FoldartalGainOcrAfterCombat"
|
||||
: "@Roguelike@FoldartalGainOcr"));
|
||||
analyzer.set_task_info(
|
||||
m_config->get_theme() +
|
||||
(m_ocr_after_combat ? "@Roguelike@FoldartalGainOcrAfterCombat" : "@Roguelike@FoldartalGainOcr"));
|
||||
if (!analyzer.analyze()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -11,7 +11,12 @@ bool asst::RoguelikeFoldartalStartTaskPlugin::verify(AsstMsg msg, const json::va
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_config->get_theme() != RoguelikeTheme::Sami || m_config->get_difficulty() != INT_MAX || !m_start_foldartal) {
|
||||
if (m_config->get_theme() != RoguelikeTheme::Sami) {
|
||||
m_enable = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_config->get_difficulty() != INT_MAX || !m_start_foldartal) {
|
||||
return false;
|
||||
}
|
||||
const std::string roguelike_name = m_config->get_theme() + "@";
|
||||
|
||||
@@ -16,7 +16,12 @@ bool asst::RoguelikeFoldartalUseTaskPlugin::verify(const AsstMsg msg, const json
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_config->get_theme() != RoguelikeTheme::Sami || !m_use_foldartal) {
|
||||
if (m_config->get_theme() != RoguelikeTheme::Sami) {
|
||||
m_enable = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_use_foldartal) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user