diff --git a/src/MaaCore/Config/Miscellaneous/CopilotConfig.cpp b/src/MaaCore/Config/Miscellaneous/CopilotConfig.cpp index 66351ed674..ac8a671ec1 100644 --- a/src/MaaCore/Config/Miscellaneous/CopilotConfig.cpp +++ b/src/MaaCore/Config/Miscellaneous/CopilotConfig.cpp @@ -211,6 +211,7 @@ std::vector asst::CopilotConfig::parse_actions(co action.direction = string_to_direction(action_info.get("direction", "Right")); action.modify_usage = static_cast(action_info.get("skill_usage", 0)); + action.modify_times = action_info.get("skill_times", 1); action.pre_delay = action_info.get("pre_delay", 0); auto post_delay_opt = action_info.find("post_delay"); // 历史遗留字段,兼容一下 diff --git a/src/MaaCore/Config/Roguelike/RoguelikeRecruitConfig.cpp b/src/MaaCore/Config/Roguelike/RoguelikeRecruitConfig.cpp index c22633448d..9d3977ad37 100644 --- a/src/MaaCore/Config/Roguelike/RoguelikeRecruitConfig.cpp +++ b/src/MaaCore/Config/Roguelike/RoguelikeRecruitConfig.cpp @@ -78,8 +78,10 @@ bool asst::RoguelikeRecruitConfig::parse(const json::value& json) info.alternate_skill = oper_info.get("alternate_skill", info.alternate_skill); info.skill_usage = static_cast(oper_info.get("skill_usage", static_cast(info.skill_usage))); + info.skill_times = oper_info.get("skill_times", info.skill_times); info.alternate_skill_usage = static_cast( oper_info.get("alternate_skill_usage", static_cast(info.alternate_skill_usage))); + info.alternate_skill_times = oper_info.get("alternate_skill_times", info.alternate_skill_times); info.is_key = oper_info.get("is_key", info.is_key); info.is_start = oper_info.get("is_start", info.is_start); diff --git a/src/MaaCore/Config/Roguelike/RoguelikeRecruitConfig.h b/src/MaaCore/Config/Roguelike/RoguelikeRecruitConfig.h index d05b0e3c95..17782288c2 100644 --- a/src/MaaCore/Config/Roguelike/RoguelikeRecruitConfig.h +++ b/src/MaaCore/Config/Roguelike/RoguelikeRecruitConfig.h @@ -37,7 +37,9 @@ namespace asst int skill = 0; int alternate_skill = 0; battle::SkillUsage skill_usage = battle::SkillUsage::Possibly; + int skill_times = 1; battle::SkillUsage alternate_skill_usage = battle::SkillUsage::Possibly; + int alternate_skill_times = 1; }; class RoguelikeRecruitConfig final : public SingletonHolder, public AbstractConfig diff --git a/src/MaaCore/Status.h b/src/MaaCore/Status.h index df8ee652b2..8497e4f4f7 100644 --- a/src/MaaCore/Status.h +++ b/src/MaaCore/Status.h @@ -46,6 +46,7 @@ namespace asst static inline const std::string RoguelikeUseNonfriendSupport = "RoguelikeUseNonfriendSupport"; static inline const std::string RoguelikeTraderNoLongerBuy = "RoguelikeNoLongerBuy"; static inline const std::string RoguelikeSkillUsagePrefix = "RoguelikeSkillUsage-"; + static inline const std::string RoguelikeSkillTimesPrefix = "RoguelikeSkillTimes-"; static inline const std::string RoguelikeTeamFullWithoutRookie = "RoguelikeTeamFullWithoutRookie"; static inline const std::string RoguelikeTheme = "RoguelikeTheme"; static inline const std::string RoguelikeRecruitmentStartsComplete = "RoguelikeRecruitmentStartsComplete"; diff --git a/src/MaaCore/Task/BattleHelper.cpp b/src/MaaCore/Task/BattleHelper.cpp index 7714e1346d..eed9c00927 100644 --- a/src/MaaCore/Task/BattleHelper.cpp +++ b/src/MaaCore/Task/BattleHelper.cpp @@ -37,7 +37,7 @@ void asst::BattleHelper::clear() m_side_tile_info.clear(); m_normal_tile_info.clear(); m_skill_usage.clear(); - m_skill_need_use_count.clear(); + m_skill_times.clear(); m_skill_error_count.clear(); m_camera_count = 0; m_camera_shift = { 0., 0. }; @@ -445,8 +445,7 @@ bool asst::BattleHelper::use_all_ready_skill(const cv::Mat& reusable) for (const auto& [name, loc] : m_battlefield_opers) { auto& usage = m_skill_usage[name]; auto& retry = m_skill_error_count[name]; - auto& times = m_skill_need_use_count[name]; - + auto& times = m_skill_times[name]; if (usage != SkillUsage::Possibly && usage != SkillUsage::Times) { continue; } @@ -466,9 +465,10 @@ bool asst::BattleHelper::use_all_ready_skill(const cv::Mat& reusable) } used = true; retry = 0; - times--; - if (usage == SkillUsage::Times && times == 0) { - usage = SkillUsage::TimesUsed; + + if (usage == SkillUsage::Times) { + times--; + if (times == 0) usage = SkillUsage::TimesUsed; } image = m_inst_helper.ctrler()->get_image(); } diff --git a/src/MaaCore/Task/BattleHelper.h b/src/MaaCore/Task/BattleHelper.h index f9ca80b309..1b2e3c4e8f 100644 --- a/src/MaaCore/Task/BattleHelper.h +++ b/src/MaaCore/Task/BattleHelper.h @@ -70,7 +70,7 @@ namespace asst std::unordered_map m_side_tile_info; std::unordered_map m_normal_tile_info; std::unordered_map m_skill_usage; - std::unordered_map m_skill_need_use_count; + std::unordered_map m_skill_times; std::unordered_map m_skill_error_count; int m_camera_count = 0; std::pair m_camera_shift = { 0., 0. }; diff --git a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp index acdfef7d3f..08ef3ad02d 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp @@ -134,7 +134,7 @@ bool asst::BattleProcessTask::to_group() continue; } m_skill_usage.emplace(oper_name, iter->skill_usage); - m_skill_need_use_count.emplace(oper_name, iter->skill_times); + m_skill_times.emplace(oper_name, iter->skill_times); } return true; @@ -187,7 +187,7 @@ bool asst::BattleProcessTask::do_action(const battle::copilot::Action& action, s case ActionType::SkillUsage: m_skill_usage[action.name] = action.modify_usage; if (action.modify_usage == SkillUsage::Times) - m_skill_need_use_count[action.name] = action.modify_times; + m_skill_times[action.name] = action.modify_times; ret = true; break; diff --git a/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.cpp index 9ee2bc2a87..80d9b019d5 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.cpp @@ -368,6 +368,8 @@ bool asst::RoguelikeBattleTaskPlugin::do_best_deploy() auto skill_usage_opt = status()->get_number(Status::RoguelikeSkillUsagePrefix + deploy_plan.oper_name); m_skill_usage[deploy_plan.oper_name] = skill_usage_opt ? static_cast(*skill_usage_opt) : SkillUsage::Possibly; + auto skill_times_opt = status()->get_number(Status::RoguelikeSkillTimesPrefix + deploy_plan.oper_name); + m_skill_times[deploy_plan.oper_name] = skill_times_opt ? static_cast(*skill_times_opt) : 1; return true; } } @@ -469,6 +471,8 @@ bool asst::RoguelikeBattleTaskPlugin::do_once() auto skill_usage_opt = status()->get_number(Status::RoguelikeSkillUsagePrefix + best_oper.name); m_skill_usage[best_oper.name] = skill_usage_opt ? static_cast(*skill_usage_opt) : SkillUsage::Possibly; + auto skill_times_opt = status()->get_number(Status::RoguelikeSkillTimesPrefix + best_oper.name); + m_skill_times[best_oper.name] = skill_times_opt ? static_cast(*skill_times_opt) : 1; if (urgent_home_opt) { m_urgent_home_index.pop_front(); diff --git a/src/MaaCore/Task/Roguelike/RoguelikeSkillSelectionTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/RoguelikeSkillSelectionTaskPlugin.cpp index 1b594f1f8b..321963b97d 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeSkillSelectionTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/RoguelikeSkillSelectionTaskPlugin.cpp @@ -69,6 +69,7 @@ bool asst::RoguelikeSkillSelectionTaskPlugin::_run() has_rookie = true; } status()->set_number(Status::RoguelikeSkillUsagePrefix + name, static_cast(oper_info.skill_usage)); + status()->set_number(Status::RoguelikeSkillTimesPrefix + name, static_cast(oper_info.skill_times)); } if (!status()->get_str(Status::RoguelikeCharOverview)) {