diff --git a/src/MaaCore/Config/ResourceLoader.cpp b/src/MaaCore/Config/ResourceLoader.cpp index 844a133650..ced93e8461 100644 --- a/src/MaaCore/Config/ResourceLoader.cpp +++ b/src/MaaCore/Config/ResourceLoader.cpp @@ -16,11 +16,11 @@ #include "Miscellaneous/TilePack.h" #include "OnnxSessions.h" #include "Roguelike/RoguelikeCopilotConfig.h" -#include "Roguelike/RoguelikeFoldartalConfig.h" -#include "Roguelike/RoguelikeCollapsalParadigmConfig.h" #include "Roguelike/RoguelikeRecruitConfig.h" #include "Roguelike/RoguelikeShoppingConfig.h" #include "Roguelike/RoguelikeStageEncounterConfig.h" +#include "Roguelike/Sami/RoguelikeFoldartalConfig.h" +#include "Roguelike/Sami/RoguelikeCollapsalParadigmConfig.h" #include "TaskData.h" #include "TemplResource.h" #include "Utils/Logger.hpp" @@ -167,10 +167,12 @@ bool asst::ResourceLoader::load(const std::filesystem::path& path) // 原来这后面是用 AsyncLoadConfig 的,以下是原来的注释: //// 不太重要又加载的慢的资源,但不怎么占内存的,实时异步加载 //// DEBUG 模式下这里还是检查返回值的,方便排查问题 + // –––––––– Roguelike Copilot Config –––––––––––––––––––––––––––––––––––––––––––––– LoadResourceAndCheckRet(RoguelikeCopilotConfig, "roguelike"_p / "Phantom"_p / "autopilot"_p); LoadResourceAndCheckRet(RoguelikeCopilotConfig, "roguelike"_p / "Mizuki"_p / "autopilot"_p); LoadResourceAndCheckRet(RoguelikeCopilotConfig, "roguelike"_p / "Sami"_p / "autopilot"_p); + // –––––––– Roguelike Recruitment Config –––––––––––––––––––––––––––––––––––––––––– LoadResourceAndCheckRet( RoguelikeRecruitConfig, "roguelike"_p / "Phantom"_p / "recruitment.json"_p); @@ -181,14 +183,18 @@ bool asst::ResourceLoader::load(const std::filesystem::path& path) RoguelikeRecruitConfig, "roguelike"_p / "Sami"_p / "recruitment.json"_p); + // –––––––– Roguelike Shopping Config ––––––––––––––––––––––––––––––––––––––––––––– LoadResourceAndCheckRet( RoguelikeShoppingConfig, "roguelike"_p / "Phantom"_p / "shopping.json"_p); LoadResourceAndCheckRet( RoguelikeShoppingConfig, "roguelike"_p / "Mizuki"_p / "shopping.json"_p); - LoadResourceAndCheckRet(RoguelikeShoppingConfig, "roguelike"_p / "Sami"_p / "shopping.json"_p); + LoadResourceAndCheckRet( + RoguelikeShoppingConfig, + "roguelike"_p / "Sami"_p / "shopping.json"_p); + // –––––––– Roguelike Encounter Config –––––––––––––––––––––––––––––––––––––––––––– LoadResourceAndCheckRet( RoguelikeStageEncounterConfig, "roguelike"_p / "Phantom"_p / "encounter"_p / "default.json"_p); @@ -211,10 +217,10 @@ bool asst::ResourceLoader::load(const std::filesystem::path& path) RoguelikeStageEncounterConfig, "roguelike"_p / "Sami"_p / "encounter"_p / "collapse.json"_p); + // –––––––– Sami Plugin Config –––––––––––––––––––––––––––––––––––––––––––––––––––– LoadResourceAndCheckRet( RoguelikeFoldartalConfig, "roguelike"_p / "Sami"_p / "foldartal.json"_p); - LoadResourceAndCheckRet( RoguelikeCollapsalParadigmConfig, "roguelike"_p / "Sami"_p / "collapsal_paradigms.json"_p); diff --git a/src/MaaCore/Config/Roguelike/RoguelikeCollapsalParadigmConfig.cpp b/src/MaaCore/Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.cpp similarity index 100% rename from src/MaaCore/Config/Roguelike/RoguelikeCollapsalParadigmConfig.cpp rename to src/MaaCore/Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.cpp diff --git a/src/MaaCore/Config/Roguelike/RoguelikeCollapsalParadigmConfig.h b/src/MaaCore/Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.h similarity index 100% rename from src/MaaCore/Config/Roguelike/RoguelikeCollapsalParadigmConfig.h rename to src/MaaCore/Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.h diff --git a/src/MaaCore/Config/Roguelike/RoguelikeFoldartalConfig.cpp b/src/MaaCore/Config/Roguelike/Sami/RoguelikeFoldartalConfig.cpp similarity index 100% rename from src/MaaCore/Config/Roguelike/RoguelikeFoldartalConfig.cpp rename to src/MaaCore/Config/Roguelike/Sami/RoguelikeFoldartalConfig.cpp diff --git a/src/MaaCore/Config/Roguelike/RoguelikeFoldartalConfig.h b/src/MaaCore/Config/Roguelike/Sami/RoguelikeFoldartalConfig.h similarity index 100% rename from src/MaaCore/Config/Roguelike/RoguelikeFoldartalConfig.h rename to src/MaaCore/Config/Roguelike/Sami/RoguelikeFoldartalConfig.h diff --git a/src/MaaCore/MaaCore.vcxproj b/src/MaaCore/MaaCore.vcxproj index 2ff2c06773..e072e4da95 100644 --- a/src/MaaCore/MaaCore.vcxproj +++ b/src/MaaCore/MaaCore.vcxproj @@ -93,15 +93,16 @@ - - - + + + + @@ -154,8 +155,8 @@ - - + + @@ -209,7 +210,6 @@ - @@ -276,9 +276,10 @@ - - - + + + + @@ -332,8 +333,8 @@ - - + + @@ -386,7 +387,6 @@ - diff --git a/src/MaaCore/MaaCore.vcxproj.filters b/src/MaaCore/MaaCore.vcxproj.filters index ada2d30f30..fbd79516d8 100644 --- a/src/MaaCore/MaaCore.vcxproj.filters +++ b/src/MaaCore/MaaCore.vcxproj.filters @@ -219,9 +219,6 @@ Source\Resource - - Source\Resource\Roguelike - Source\Resource\Roguelike @@ -234,7 +231,10 @@ Source\Resource\Roguelike - + + Source\Resource\Roguelike + + Source\Resource\Roguelike @@ -453,10 +453,16 @@ Source\Task\Roguelike - + Source\Task\Roguelike - + + Source\Task\Roguelike + + + Source\Task\Roguelike + + Source\Task\Roguelike @@ -498,9 +504,6 @@ Source\Task\Roguelike - - Source\Task\Roguelike - Source @@ -702,9 +705,6 @@ Source\Task\Roguelike - - Source\Task\Roguelike - Source\Controller @@ -785,9 +785,6 @@ Source\Resource - - Source\Resource\Roguelike - Source\Resource\Roguelike @@ -800,7 +797,10 @@ Source\Resource\Roguelike - + + Source\Resource\Roguelike + + Source\Resource\Roguelike @@ -965,10 +965,16 @@ Source\Task\Roguelike - + Source\Task\Roguelike - + + Source\Task\Roguelike + + + Source\Task\Roguelike + + Source\Task\Roguelike @@ -1010,9 +1016,6 @@ Source\Task\Roguelike - - Source\Task\Roguelike - Source @@ -1184,9 +1187,6 @@ Source\Task\Roguelike - - Source\Task\Roguelike - Source\Controller diff --git a/src/MaaCore/Task/Interface/RoguelikeTask.cpp b/src/MaaCore/Task/Interface/RoguelikeTask.cpp index b024251ec0..af7f0c0566 100644 --- a/src/MaaCore/Task/Interface/RoguelikeTask.cpp +++ b/src/MaaCore/Task/Interface/RoguelikeTask.cpp @@ -3,17 +3,16 @@ #include "Common/AsstBattleDef.h" #include "Config/TaskData.h" #include "Status.h" -#include "Task/Miscellaneous/ScreenshotTaskPlugin.h" #include "Task/ProcessTask.h" -#include "Task/Roguelike/RoguelikeBattleTaskPlugin.h" + +// –––––––– 通用配置及插件 ––––––––––––––––––––––– #include "Task/Roguelike/RoguelikeConfig.h" +#include "Task/Miscellaneous/ScreenshotTaskPlugin.h" +#include "Task/Roguelike/RoguelikeBattleTaskPlugin.h" #include "Task/Roguelike/RoguelikeControlTaskPlugin.h" #include "Task/Roguelike/RoguelikeCustomStartTaskPlugin.h" #include "Task/Roguelike/RoguelikeDebugTaskPlugin.h" #include "Task/Roguelike/RoguelikeDifficultySelectionTaskPlugin.h" -#include "Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.h" -#include "Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.h" -#include "Task/Roguelike/RoguelikeFoldartalUseTaskPlugin.h" #include "Task/Roguelike/RoguelikeFormationTaskPlugin.h" #include "Task/Roguelike/RoguelikeInvestTaskPlugin.h" #include "Task/Roguelike/RoguelikeLastRewardTaskPlugin.h" @@ -25,8 +24,12 @@ #include "Task/Roguelike/RoguelikeStageEncounterTaskPlugin.h" #include "Task/Roguelike/RoguelikeStrategyChangeTaskPlugin.h" -#include "Task/Roguelike/RoguelikeCollapsalParadigmTaskPlugin.h" -#include "Config/Roguelike/RoguelikeCollapsalParadigmConfig.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" @@ -49,6 +52,7 @@ bool asst::RoguelikeTask::set_params(const json::value& params) { LogTraceFunction; + // –––––––– 肉鸽主题设置 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– std::string theme = params.get("theme", std::string(RoguelikeTheme::Phantom)); if (!RoguelikeConfig::is_valid_theme(theme)) { m_roguelike_task_ptr->set_tasks({ "Stop" }); @@ -71,7 +75,66 @@ bool asst::RoguelikeTask::set_params(const json::value& params) 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_roguelike_config_ptr->set_invest_maximum(params.get("investments_count", INT_MAX)); + m_roguelike_config_ptr->set_invest_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(mode)); + if (Task.get(strategy_task_with_mode) == nullptr) { + strategy_task_with_mode = "#none"; // 没有对应的层数选点策略,使用默认策略(避战) + Log.warn(__FUNCTION__, "No strategy for mode", static_cast(mode)); + } + Task.set_task_base(strategy_task, strategy_task_with_mode); + } + + // 重置开局奖励 next,获得任意奖励均继续;烧水相关逻辑在 RoguelikeLastRewardTaskPlugin + Task.set_task_base("Roguelike@LastReward", "Roguelike@LastReward_default"); + Task.set_task_base("Roguelike@LastReward2", "Roguelike@LastReward_default"); + Task.set_task_base("Roguelike@LastReward3", "Roguelike@LastReward_default"); + Task.set_task_base("Roguelike@LastReward4", "Roguelike@LastReward_default"); + Task.set_task_base("Roguelike@LastRewardRand", "Roguelike@LastReward_default"); + + 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")) { + 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("================ DEPRECATED ================"); + } + m_roguelike_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"); + m_roguelike_task_ptr->set_times_limit("StageTraderInvestCancel", INT_MAX); + m_roguelike_task_ptr->set_times_limit("StageTraderLeaveConfirm", 0, ProcessTask::TimesLimitType::Post); + } + else { + // 战斗后奖励只拿钱 + 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); + } + } + else { + // 重置战斗后奖励next + 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", 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); + + // ======== 萨米主题专用参数 ============================================================== + if (theme == RoguelikeTheme::Sami) { // 是否凹开局远见密文板 m_roguelike_config_ptr->set_first_floor_foldartal(params.contains("first_floor_foldartal")); @@ -104,97 +167,46 @@ bool asst::RoguelikeTask::set_params(const json::value& params) const std::unordered_set& 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)); } - // –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– - m_roguelike_register_plugins(); - - m_roguelike_config_ptr->set_invest_maximum(params.get("investments_count", INT_MAX)); - m_roguelike_config_ptr->set_invest_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(mode)); - if (Task.get(strategy_task_with_mode) == nullptr) { - strategy_task_with_mode = "#none"; // 没有对应的层数选点策略,使用默认策略(避战) - Log.warn(__FUNCTION__, "No strategy for mode", static_cast(mode)); - } - Task.set_task_base(strategy_task, strategy_task_with_mode); - } - - // 重置开局奖励 next,获得任意奖励均继续;烧水相关逻辑在 RoguelikeLastRewardTaskPlugin - Task.set_task_base("Roguelike@LastReward", "Roguelike@LastReward_default"); - Task.set_task_base("Roguelike@LastReward2", "Roguelike@LastReward_default"); - Task.set_task_base("Roguelike@LastReward3", "Roguelike@LastReward_default"); - Task.set_task_base("Roguelike@LastReward4", "Roguelike@LastReward_default"); - Task.set_task_base("Roguelike@LastRewardRand", "Roguelike@LastReward_default"); - - if (mode == RoguelikeMode::Investment) { - m_debug_plugin_ptr->set_enable(false); - 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")) { - 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("================ DEPRECATED ================"); - } - m_roguelike_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"); - m_roguelike_task_ptr->set_times_limit("StageTraderInvestCancel", INT_MAX); - m_roguelike_task_ptr->set_times_limit("StageTraderLeaveConfirm", 0, ProcessTask::TimesLimitType::Post); - } - else { - // 战斗后奖励只拿钱 - 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); - } - } - else { - m_debug_plugin_ptr->set_enable(true); - // 重置战斗后奖励next - 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", 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_custom_start_plugin_ptr->set_custom(RoguelikeCustomType::Squad, params.get("squad", "")); // 开局分队 - m_custom_start_plugin_ptr->set_custom(RoguelikeCustomType::Roles, params.get("roles", "")); // 开局职业组 - m_custom_start_plugin_ptr->set_custom(RoguelikeCustomType::CoreChar, params.get("core_char", "")); // 开局干员名 - m_custom_start_plugin_ptr->set_custom(RoguelikeCustomType::UseSupport, - params.get("use_support", false) ? "1" : "0"); // 开局干员是否为助战干员 - m_custom_start_plugin_ptr->set_custom(RoguelikeCustomType::UseNonfriendSupport, - params.get("use_nonfriend_support", false) ? "1" - : "0"); // 是否可以是非好友助战干员 + register_roguelike_plugins(params); + return true; } -void asst::RoguelikeTask::m_roguelike_register_plugins() { +void asst::RoguelikeTask::register_roguelike_plugins(const json::value& params) { LogTraceFunction; - // 通用插件 + // –––––––– 通用插件 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– m_roguelike_task_ptr->register_plugin(); m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - m_debug_plugin_ptr = m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); + + std::shared_ptr debug_plugin_ptr = + m_roguelike_task_ptr->register_plugin(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(m_roguelike_config_ptr)->set_retry_times(0); m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - m_custom_start_plugin_ptr = + std::shared_ptr custom_start_plugin_ptr = m_roguelike_task_ptr->register_plugin(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(m_roguelike_config_ptr) ->set_retry_times(0) .set_ignore_error(true); @@ -214,7 +226,8 @@ void asst::RoguelikeTask::m_roguelike_register_plugins() { m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); - // 萨米肉鸽专用插件 + // –––––––– 萨米主题专用插件 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + if (m_roguelike_config_ptr->get_theme() == RoguelikeTheme::Sami) { m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); @@ -222,4 +235,4 @@ void asst::RoguelikeTask::m_roguelike_register_plugins() { m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); } -}; \ No newline at end of file +} diff --git a/src/MaaCore/Task/Interface/RoguelikeTask.h b/src/MaaCore/Task/Interface/RoguelikeTask.h index 8da18fe311..7a2889d154 100644 --- a/src/MaaCore/Task/Interface/RoguelikeTask.h +++ b/src/MaaCore/Task/Interface/RoguelikeTask.h @@ -21,9 +21,7 @@ namespace asst private: std::shared_ptr m_roguelike_task_ptr = nullptr; std::shared_ptr m_roguelike_config_ptr = nullptr; - std::shared_ptr m_custom_start_plugin_ptr = nullptr; - std::shared_ptr m_debug_plugin_ptr = nullptr; - void m_roguelike_register_plugins(); + void register_roguelike_plugins(const json::value& params); }; } diff --git a/src/MaaCore/Task/Roguelike/RoguelikeConfig.cpp b/src/MaaCore/Task/Roguelike/RoguelikeConfig.cpp index 34dfcf2f4c..379b1f32f3 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeConfig.cpp +++ b/src/MaaCore/Task/Roguelike/RoguelikeConfig.cpp @@ -2,6 +2,7 @@ void asst::RoguelikeConfig::clear() { + // –––––––– 通用参数 –––––––––––––––––––––––––––––––––––––––––––––––––– m_recruitment_count = 0; m_recruitment_starts_complete = false; m_recruitment_team_complete = false; @@ -11,9 +12,9 @@ void asst::RoguelikeConfig::clear() m_use_support = false; m_oper = std::unordered_map(); + // –––––––– 萨米主题专用参数 –––––––––––––––––––––––––––––––––––––––––––––– m_foldartal_floor.reset(); m_foldartal = std::vector(); - m_clp_pds = std::vector(); m_need_check_panel = false; } diff --git a/src/MaaCore/Task/Roguelike/RoguelikeConfig.h b/src/MaaCore/Task/Roguelike/RoguelikeConfig.h index fe9ab66a9c..fe0145f3a5 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeConfig.h +++ b/src/MaaCore/Task/Roguelike/RoguelikeConfig.h @@ -1,22 +1,14 @@ #pragma once #include #include -#include #include +#include #include +#include +#include namespace asst { - enum class RoguelikeMode - { - Exp = 0, // 0 - 刷经验,尽可能稳定地打更多层数,不期而遇采用激进策略 - Investment = 1, // 1 - 刷源石锭,第一层投资完就退出,不期而遇采用保守策略 - // 2 - 【已移除】两者兼顾,投资过后再退出,没有投资就继续往后打 - Ending = 3, // 3 - 尝试通关,激进策略(TODO) - Collectible = 4, // 4 - 刷开局,以获得热水壶或者演讲稿开局或只凹直升,不期而遇采用保守策略 - CLP_PDS = 5 // 5 - 刷隐藏坍缩范式,以增加坍缩值为最优先目标 - }; - class RoguelikeTheme { public: @@ -25,6 +17,19 @@ namespace asst static constexpr std::string_view Sami = "Sami"; }; + enum class RoguelikeMode + { + // –––––––– 通用模式 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + Exp = 0, // 0 - 刷经验,尽可能稳定地打更多层数,不期而遇采用激进策略 + Investment = 1, // 1 - 刷源石锭,第一层投资完就退出,不期而遇采用保守策略 + // 2 - 【已移除】两者兼顾,投资过后再退出,没有投资就继续往后打 + Ending = 3, // 3 - 尝试通关,激进策略(TODO) + Collectible = 4, // 4 - 刷开局,以获得热水壶或者演讲稿开局或只凹直升,不期而遇采用保守策略 + + // –––––––– 萨米主题专用模式 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + CLP_PDS = 5 // 5 - 刷隐藏坍缩范式,以增加坍缩值为最优先目标 + }; + struct RoguelikeOper { int elite = 0; // 精英化 @@ -34,19 +39,25 @@ namespace asst class RoguelikeConfig { public: - // 清理缓存的肉鸽数据 - void clear(); static constexpr bool is_valid_theme(std::string_view theme) { - return theme == RoguelikeTheme::Phantom || theme == RoguelikeTheme::Mizuki || theme == RoguelikeTheme::Sami; + return theme == RoguelikeTheme::Phantom || + theme == RoguelikeTheme::Mizuki || + theme == RoguelikeTheme::Sami; } static constexpr bool is_valid_mode(RoguelikeMode mode, std::string_view theme = RoguelikeTheme::Sami) { - return mode == RoguelikeMode::Exp || mode == RoguelikeMode::Investment || + return mode == RoguelikeMode::Exp || + mode == RoguelikeMode::Investment || mode == RoguelikeMode::Collectible || - (mode == RoguelikeMode::CLP_PDS && theme == RoguelikeTheme::Sami); + (mode == RoguelikeMode::CLP_PDS && theme == RoguelikeTheme::Sami); } + // 重制肉鸽局内数据 + void clear(); + + // ======== 通用参数 ================================================================== + public: void set_theme(std::string theme) { m_theme = std::move(theme); } std::string get_theme() const { return m_theme; } @@ -54,10 +65,85 @@ namespace asst RoguelikeMode get_mode() const { return m_mode; } void set_difficulty(int difficulty) { m_difficulty = difficulty; } int get_difficulty() const { return m_difficulty; } + + // –––––––– 开局 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– void set_start_with_elite_two(bool value) { m_start_with_elite_two = value; } bool get_start_with_elite_two() const { return m_start_with_elite_two; } void set_only_start_with_elite_two(bool value) { m_only_start_with_elite_two = value; } bool get_only_start_with_elite_two() const { return m_only_start_with_elite_two; } + + // –––––––– 投资模式 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + void set_invest_maximum(int value) { m_invest_maximum = value; } + int get_invest_maximum() const { return m_invest_maximum; } + void set_invest_stop_when_full(bool value) { m_invest_stop_when_full = value; } + bool get_invest_stop_when_full() const { return m_invest_stop_when_full; } + void set_invest_with_more_score(bool value) { m_invest_with_more_score = value; } + bool get_invest_with_more_score() const { return m_invest_with_more_score; } + + private: + std::string m_theme; // 主题 + RoguelikeMode m_mode = RoguelikeMode::Exp; // 模式 + int m_difficulty = 0; // 难度 + + // –––––––– 开局 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + bool m_start_with_elite_two = false; // 在刷开局模式下凹开局干员精二直升 + bool m_only_start_with_elite_two = false; // 只凹开局干员精二直升且不进行作战 + + // –––––––– 投资模式 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + int m_invest_maximum = 0; // 投资次数上限 + bool m_invest_stop_when_full = false; // 存款满了就停止 + bool m_invest_with_more_score = false; // 投资时招募、购物刷分 + + /* 以下为局内数据,每次重置 */ + public: + // –––––––– 招募 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + void set_recruitment_count(int count) { m_recruitment_count = count; } + int get_recruitment_count() const { return m_recruitment_count; } + void set_recruitment_starts_complete(bool complete) { m_recruitment_starts_complete = complete; } + bool get_recruitment_starts_complete() const { return m_recruitment_starts_complete; } + void set_recruitment_team_complete(bool complete) { m_recruitment_team_complete = complete; } + bool get_recruitment_team_complete() const { return m_recruitment_team_complete; } + void set_team_full_without_rookie(bool without_rookie) { m_team_full_without_rookie = without_rookie; } + bool get_team_full_without_rookie() const { return m_team_full_without_rookie; } + + // –––––––– 商店 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + void set_trader_no_longer_buy(bool no_longer_buy) { m_trader_no_longer_buy = no_longer_buy; } + bool get_trader_no_longer_buy() const { return m_trader_no_longer_buy; } + + // –––––––– 开局 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + void set_core_char(std::string core_char) { m_core_char = std::move(core_char); } + std::string get_core_char() const { return m_core_char; } + void set_use_support(bool use_support) { m_use_support = use_support; } + bool get_use_support() const { return m_use_support; } + void set_use_nonfriend_support(bool use_nonfriend_support) { m_use_nonfriend_support = use_nonfriend_support; } + bool get_use_nonfriend_support() const { return m_use_nonfriend_support; } + + void set_oper(std::unordered_map oper) { m_oper = std::move(oper); } + const std::unordered_map& get_oper() const { return m_oper; } + + private: + // –––––––– 招募 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + int m_recruitment_count = 0; // 招募次数 + bool m_recruitment_starts_complete = false; // 开局干员是否已经招募 + bool m_recruitment_team_complete = false; // 阵容是否完备 + bool m_team_full_without_rookie = false; // 编队内没有预干员 + + // –––––––– 商店 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + bool m_trader_no_longer_buy = false; // 不再购买藏品 + + // –––––––– 开局 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + std::string m_core_char; // 开局干员名 + bool m_use_support = false; // 开局干员是否为助战干员 + bool m_use_nonfriend_support = false; // 是否可以是非好友助战干员 + + std::unordered_map m_oper; // 干员精英&等级 + + + + // ======== 萨米主题专用参数 ============================================================== + + public: + // –––––––– 密文板 ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– void set_first_floor_foldartal(bool first_floor_foldartal) { m_first_floor_foldartal = first_floor_foldartal; } bool get_first_floor_foldartal() const { return m_first_floor_foldartal; } void set_start_floor_foldartal(std::string value) { m_start_floor_foldartal = value; } @@ -66,14 +152,10 @@ namespace asst bool get_start_foldartal() const { return m_start_foldartal; } void set_start_foldartal_list(std::vector string) { m_start_foldartal_list = string; } std::vector get_start_foldartal_list() const { return m_start_foldartal_list; } - void set_invest_maximum(int value) { m_invest_maximum = value; } - int get_invest_maximum() const { return m_invest_maximum; } - void set_invest_stop_when_full(bool value) { m_invest_stop_when_full = value; } - bool get_invest_stop_when_full() const { return m_invest_stop_when_full; } - void set_invest_with_more_score(bool value) { m_invest_with_more_score = value; } - bool get_invest_with_more_score() const { return m_invest_with_more_score; } void set_use_foldartal(bool use_foldrtal) { m_use_foldartal = use_foldrtal; } bool get_use_foldartal() const {return m_use_foldartal; } + + // –––––––– 坍缩范式 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– void set_check_clp_pds(bool check_clp_pds) { m_check_clp_pds = check_clp_pds; } bool get_check_clp_pds() const {return m_check_clp_pds; } void set_double_check_clp_pds(bool double_check_clp_pds) { m_double_check_clp_pds = double_check_clp_pds; } @@ -82,65 +164,39 @@ namespace asst std::unordered_set get_expected_clp_pds() const { return m_expected_clp_pds; } private: - std::string m_theme; // 主题 - RoguelikeMode m_mode = RoguelikeMode::Exp; // 模式 - int m_difficulty = 0; // 难度 - bool m_start_with_elite_two = false; // 在刷开局模式下凹开局干员精二直升 - bool m_only_start_with_elite_two = false; // 只凹开局干员精二直升且不进行作战 - bool m_first_floor_foldartal = false; // 凹远见密文板 - std::string m_start_floor_foldartal; // 需要凹的远见 - bool m_start_foldartal = false; // 生活队凹开局密文板 - std::vector m_start_foldartal_list; // 需要凹的板子 - int m_invest_maximum = 0; // 投资次数上限 - bool m_invest_stop_when_full = false; // 存款满了就停止 - bool m_invest_with_more_score = false; // 投资时招募、购物刷分 - bool m_use_foldartal = true; // 是否使用密文板 - bool m_check_clp_pds = false; // 是否检查坍缩范式 - bool m_double_check_clp_pds = false; // 是否反复检查坍缩范式 + // –––––––– 密文板 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + bool m_first_floor_foldartal = false; // 凹远见密文板 + std::string m_start_floor_foldartal; // 需要凹的远见 + bool m_start_foldartal = false; // 生活队凹开局密文板 + std::vector m_start_foldartal_list; // 需要凹的板子 + bool m_use_foldartal = true; // 是否使用密文板 + + // –––––––– 坍缩范式 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + bool m_check_clp_pds = false; // 是否检查坍缩范式 + bool m_double_check_clp_pds = false; // 是否反复检查坍缩范式 std::unordered_set m_expected_clp_pds; // 期望获得坍缩范式 - /* 以下为每次重置 */ + /* 以下为局内数据,每次重置 */ public: - void set_recruitment_count(int count) { m_recruitment_count = count; } - int get_recruitment_count() const { return m_recruitment_count; } - void set_recruitment_starts_complete(bool complete) { m_recruitment_starts_complete = complete; } - bool get_recruitment_starts_complete() const { return m_recruitment_starts_complete; } - void set_recruitment_team_complete(bool complete) { m_recruitment_team_complete = complete; } - bool get_recruitment_team_complete() const { return m_recruitment_team_complete; } - void set_trader_no_longer_buy(bool no_longer_buy) { m_trader_no_longer_buy = no_longer_buy; } - bool get_trader_no_longer_buy() const { return m_trader_no_longer_buy; } - void set_core_char(std::string core_char) { m_core_char = std::move(core_char); } - std::string get_core_char() const { return m_core_char; } - void set_team_full_without_rookie(bool without_rookie) { m_team_full_without_rookie = without_rookie; } - bool get_team_full_without_rookie() const { return m_team_full_without_rookie; } - void set_use_support(bool use_support) { m_use_support = use_support; } - bool get_use_support() const { return m_use_support; } - void set_use_nonfriend_support(bool use_nonfriend_support) { m_use_nonfriend_support = use_nonfriend_support; } - bool get_use_nonfriend_support() const { return m_use_nonfriend_support; } - void set_oper(std::unordered_map oper) { m_oper = std::move(oper); } - const std::unordered_map& get_oper() const { return m_oper; } + // –––––––– 密文板 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– void set_foldartal_floor(std::optional floor) { m_foldartal_floor = std::move(floor); } const std::optional& get_foldartal_floor() const { return m_foldartal_floor; } void set_foldartal(std::vector foldartal) { m_foldartal = std::move(foldartal); } const std::vector& get_foldartal() const { return m_foldartal; } + + // –––––––– 坍缩范式 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– void set_clp_pds(std::vector clp_pds) { m_clp_pds = std::move(clp_pds); } const std::vector& get_clp_pds() const { return m_clp_pds; } void set_need_check_panel(bool need_check_panel) { m_need_check_panel = need_check_panel; } bool get_need_check_panel() const { return m_need_check_panel; } private: - int m_recruitment_count = 0; // 招募次数 - bool m_recruitment_starts_complete = false; // 开局干员是否已经招募 - bool m_recruitment_team_complete = false; // 阵容是否完备 - bool m_trader_no_longer_buy = false; // 不再购买藏品 - std::string m_core_char; // 开局干员名 - bool m_team_full_without_rookie = false; // 编队内没有预干员 - bool m_use_support = false; // 开局干员是否为助战干员 - bool m_use_nonfriend_support = false; // 是否可以是非好友助战干员 - std::unordered_map m_oper; // 干员精英&等级 - std::optional m_foldartal_floor; // 当前层的预见密文板,在下一层获得 - std::vector m_foldartal; // 所有已获得密文板 - std::vector m_clp_pds; // 已受到的坍缩范式 - bool m_need_check_panel = false; // 是否在下次回到关卡选择界面时检查坍缩范式 + // –––––––– 密文板 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + std::optional m_foldartal_floor; // 当前层的预见密文板,在下一层获得 + std::vector m_foldartal; // 所有已获得密文板 + + // –––––––– 坍缩范式 –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– + std::vector m_clp_pds; // 已受到的坍缩范式 + bool m_need_check_panel = false; // 是否在下次回到关卡选择界面时检查坍缩范式 }; } // namespace asst diff --git a/src/MaaCore/Task/Roguelike/RoguelikeStageEncounterTaskPlugin.h b/src/MaaCore/Task/Roguelike/RoguelikeStageEncounterTaskPlugin.h index b1cb5665db..2a09f6063c 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeStageEncounterTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/RoguelikeStageEncounterTaskPlugin.h @@ -3,7 +3,7 @@ #include "Config/Roguelike/RoguelikeStageEncounterConfig.h" #include "Config/TaskData.h" #include "Vision/OCRer.h" -#include "RoguelikeCollapsalParadigmTaskPlugin.h" +#include "Sami/RoguelikeCollapsalParadigmTaskPlugin.h" namespace asst { diff --git a/src/MaaCore/Task/Roguelike/RoguelikeCollapsalParadigmTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp similarity index 99% rename from src/MaaCore/Task/Roguelike/RoguelikeCollapsalParadigmTaskPlugin.cpp rename to src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp index b1c7b30ca5..3bfcbdf0d9 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeCollapsalParadigmTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.cpp @@ -1,5 +1,5 @@ #include "RoguelikeCollapsalParadigmTaskPlugin.h" -#include "Config/Roguelike/RoguelikeCollapsalParadigmConfig.h" +#include "Config/Roguelike/Sami/RoguelikeCollapsalParadigmConfig.h" #include "Config/TaskData.h" #include "Controller/Controller.h" diff --git a/src/MaaCore/Task/Roguelike/RoguelikeCollapsalParadigmTaskPlugin.h b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h similarity index 98% rename from src/MaaCore/Task/Roguelike/RoguelikeCollapsalParadigmTaskPlugin.h rename to src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h index 9e1a9b8977..1a0c07af26 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeCollapsalParadigmTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeCollapsalParadigmTaskPlugin.h @@ -1,5 +1,5 @@ #pragma once -#include "AbstractRoguelikeTaskPlugin.h" +#include "../AbstractRoguelikeTaskPlugin.h" #include "Common/AsstTypes.h" #include "Vision/OCRer.h" #include "Config/TaskData.h" diff --git a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalGainTaskPlugin.cpp similarity index 100% rename from src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.cpp rename to src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalGainTaskPlugin.cpp diff --git a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.h b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalGainTaskPlugin.h similarity index 94% rename from src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.h rename to src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalGainTaskPlugin.h index fa794b75f5..d16df1aded 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalGainTaskPlugin.h @@ -1,5 +1,5 @@ #pragma once -#include "AbstractRoguelikeTaskPlugin.h" +#include "../AbstractRoguelikeTaskPlugin.h" namespace asst { diff --git a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalStartTaskPlugin.cpp similarity index 100% rename from src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.cpp rename to src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalStartTaskPlugin.cpp diff --git a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.h b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalStartTaskPlugin.h similarity index 91% rename from src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.h rename to src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalStartTaskPlugin.h index eb2a63eb23..66318d9fb7 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalStartTaskPlugin.h @@ -1,5 +1,5 @@ #pragma once -#include "AbstractRoguelikeTaskPlugin.h" +#include "../AbstractRoguelikeTaskPlugin.h" namespace asst { diff --git a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalUseTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.cpp similarity index 99% rename from src/MaaCore/Task/Roguelike/RoguelikeFoldartalUseTaskPlugin.cpp rename to src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.cpp index 3fd76fe1b7..819b180a6e 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalUseTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.cpp @@ -1,6 +1,6 @@ #include "RoguelikeFoldartalUseTaskPlugin.h" -#include "Config/Roguelike/RoguelikeFoldartalConfig.h" +#include "Config/Roguelike/Sami/RoguelikeFoldartalConfig.h" #include "Config/TaskData.h" #include "Controller/Controller.h" #include "Task/ProcessTask.h" diff --git a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalUseTaskPlugin.h b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.h similarity index 95% rename from src/MaaCore/Task/Roguelike/RoguelikeFoldartalUseTaskPlugin.h rename to src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.h index 25cede3aa9..15f4d29c6d 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalUseTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/Sami/RoguelikeFoldartalUseTaskPlugin.h @@ -1,6 +1,6 @@ #pragma once -#include "AbstractRoguelikeTaskPlugin.h" -#include "Config/Roguelike/RoguelikeFoldartalConfig.h" +#include "../AbstractRoguelikeTaskPlugin.h" +#include "Config/Roguelike/Sami/RoguelikeFoldartalConfig.h" #include "RoguelikeCollapsalParadigmTaskPlugin.h" namespace asst