diff --git a/src/MaaCore/Task/BattleHelper.cpp b/src/MaaCore/Task/BattleHelper.cpp index 6ef7d6ea7a..e9de0e6b36 100644 --- a/src/MaaCore/Task/BattleHelper.cpp +++ b/src/MaaCore/Task/BattleHelper.cpp @@ -30,6 +30,21 @@ bool asst::BattleHelper::set_stage_name(const std::string& name) return true; } +void asst::BattleHelper::clear() +{ + m_stage_name.clear(); + m_side_tile_info.clear(); + m_normal_tile_info.clear(); + m_skill_usage.clear(); + + m_kills = 0; + m_total_kills = 0; + m_all_deployment_avatars.clear(); + m_cur_deployment_opers.clear(); + m_battlefield_opers.clear(); + m_used_tiles.clear(); +} + bool asst::BattleHelper::calc_tiles_info(const std::string& stage_name) { LogTraceFunction; @@ -181,7 +196,7 @@ bool asst::BattleHelper::update_deployment(bool init) } } - if (!unknown_opers.empty()) { + if (!unknown_opers.empty() || init) { // 一个都没匹配上的,挨个点开来看一下 LogTraceScope("rec unknown opers"); @@ -208,6 +223,10 @@ bool asst::BattleHelper::update_deployment(bool init) } name_analyzer.sort_result_by_score(); const std::string& name = name_analyzer.get_result().front().text; + if (name.empty()) { + Log.error("ocr failed, empty name"); + continue; + } oper.name = name; m_cur_deployment_opers.insert_or_assign(name, oper); @@ -217,7 +236,9 @@ bool asst::BattleHelper::update_deployment(bool init) } pause(); - cancel_oper_selection(); + if (!unknown_opers.empty()) { + cancel_oper_selection(); + } } return true; @@ -337,9 +358,8 @@ bool asst::BattleHelper::use_skill(const Point& loc) bool asst::BattleHelper::check_pause_button() { - MatchImageAnalyzer battle_flag_analyzer; + MatchImageAnalyzer battle_flag_analyzer(m_inst_helper.ctrler()->get_image()); battle_flag_analyzer.set_task_info("BattleOfficiallyBegin"); - battle_flag_analyzer.set_image(m_inst_helper.ctrler()->get_image()); return battle_flag_analyzer.analyze(); } diff --git a/src/MaaCore/Task/BattleHelper.h b/src/MaaCore/Task/BattleHelper.h index 61c9758fff..21f8f7e822 100644 --- a/src/MaaCore/Task/BattleHelper.h +++ b/src/MaaCore/Task/BattleHelper.h @@ -25,6 +25,7 @@ namespace asst BattleHelper(Assistant* inst); virtual bool set_stage_name(const std::string& name); + virtual void clear(); bool calc_tiles_info(const std::string& stage_name); bool load_avatar_cache(const std::string& name, bool with_token = false); diff --git a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp index dcc0a4cc15..7eccfd670b 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp @@ -30,6 +30,7 @@ asst::BattleProcessTask::BattleProcessTask(const AsstCallback& callback, Assista bool asst::BattleProcessTask::_run() { LogTraceFunction; + clear(); if (!calc_tiles_info(m_stage_name)) { Log.error("get stage info failed"); @@ -47,6 +48,15 @@ bool asst::BattleProcessTask::_run() return true; } +void asst::BattleProcessTask::clear() +{ + BattleHelper::clear(); + + m_combat_data = decltype(m_combat_data)(); + m_oper_in_group.clear(); + m_in_bullet_time = false; +} + bool asst::BattleProcessTask::set_stage_name(const std::string& stage_name) { LogTraceFunction; diff --git a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h index 10e3965e27..ccdef0eadd 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h +++ b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h @@ -20,6 +20,7 @@ namespace asst protected: virtual bool _run() override; virtual AbstractTask& this_task() override { return *this; } + virtual void clear() override; void load_cache(); bool to_group(); diff --git a/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.cpp index a2df19122a..c3f9bb297f 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.cpp +++ b/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.cpp @@ -185,11 +185,11 @@ bool asst::RoguelikeBattleTaskPlugin::calc_stage_info() battle::Role::Support, battle::Role::Special, battle::Role::Drone, }; } - m_homes_status.resize(m_homes.size()); if (m_homes.empty()) { Log.error("Unknown home pos"); return false; } + m_homes_status.resize(m_homes.size()); auto cb_info = basic_info_with_what("StageInfo"); auto& details = cb_info["details"]; @@ -364,7 +364,7 @@ bool asst::RoguelikeBattleTaskPlugin::do_once() // 超过一半的人费用都没好,且没有紧急情况,那就不下人 // TODO: 这个逻辑非常不好,待优化 size_t not_cooling_count = m_cur_deployment_opers.size() - cur_cooling.size(); - if (cur_available.size() <= not_cooling_count / 2) { + if (cur_available.size() <= not_cooling_count / 2 && m_battlefield_opers.size() > m_homes.size()) { Log.trace("now_total", m_cur_deployment_opers.size(), ", available", cur_available.size(), ", not_cooling", not_cooling_count, ", just wait a minute"); return true; @@ -485,11 +485,6 @@ std::optional asst::RoguelikeBattleTaskPlugin::check_urgent(const std::u const std::map& pre_bf_opers, bool& deploy_dice_now) { - if (m_first_deploy) { - // No emergency - return std::nullopt; - } - std::vector new_urgent; for (const auto& name : cur_cooling) { if (pre_cooling.find(name) != pre_cooling.cend()) { @@ -654,6 +649,8 @@ void asst::RoguelikeBattleTaskPlugin::all_melee_retreat() void asst::RoguelikeBattleTaskPlugin::clear() { + BattleHelper::clear(); + m_homes.clear(); m_allow_to_use_dice = true; m_blacklist_location.clear(); diff --git a/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.h b/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.h index 0f8d45e406..799a8b0c32 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.h +++ b/src/MaaCore/Task/Roguelike/RoguelikeBattleTaskPlugin.h @@ -27,6 +27,7 @@ namespace asst protected: virtual bool _run() override; virtual AbstractTask& this_task() override { return *this; } + virtual void clear() override; // 有些特殊的角色,他的职业并不一定和正常的位置相对应,比如“掠风”是地面辅助 // get_role_location_type 可以仅知道干员职业的情况下,大概猜测一下位置 @@ -44,7 +45,6 @@ namespace asst bool calc_stage_info(); void load_cache(); - void clear(); void all_melee_retreat(); bool abandon();