diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b0e1c99e8..872ceec3ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,5 @@ -- New support for interface English, 日本語, 한국어, 繁體中文 and 牛牛喝酒 translation. It was a difficult task, thanks to all collaborators: @ABA2396 @ChingCdesu @LYZhelloworld @Tastror @cloakWatcher @lsequeiraa @MistEO -- 新增支持 肉鸽 开局自定义分队、自定义职业组、自定义干员 @MistEO @ABA2396 -- 新增支持 Rust http 接口 @yuanyan3060 -- 优化 肉鸽 干员部署及朝向、商店购买逻辑、干员招募逻辑 @MistEO -- 重构并优化 公招 功能 @horror-proton -- 优化 刷理智 `上次作战/当前作战` 功能,合并为一个选项 @MistEO -- 优化 界面布局 @ABA2396 -- 优化项目 CI/CD 工程 @LiamSho @zzyyyl -- 修复 美服肉鸽 一处卡住的问题 @AkarinVS -- 修复 刷理智 偶现掉落识别错误 @MistEO @ABA2396 -- 修复 基建 会客室送线索时卡住问题 @MistEO -- 修复 Linux 编译错误 @zhangchi0104 +- 优化 肉鸽 干员部署策略、招募策略、商店购物策略 @MistEO @ABA2396 +- 修复 肉鸽 商店卡住的问题、自定义干员不选的问题 @MistEO +- 修复公招的一些小问题 @horror-proton +- 修复一些界面 bug 和布局问题 @ABA2396 @zzyyyl @lhhxxxxx +- 新增 日文 文档翻译 @LYZhelloworld diff --git a/resource/roguelike_copilot.json b/resource/roguelike_copilot.json index 18fc8d769c..f16403cd3c 100644 --- a/resource/roguelike_copilot.json +++ b/resource/roguelike_copilot.json @@ -16,8 +16,8 @@ "stage_name": "压轴登场", "replacement_home": [ [ - 2, - 2 + 3, + 3 ] ] }, diff --git a/resource/roguelike_recruit.json b/resource/roguelike_recruit.json index fa3dbf50ce..4f0b6167e6 100644 --- a/resource/roguelike_recruit.json +++ b/resource/roguelike_recruit.json @@ -82,7 +82,7 @@ "name": "棘刺", "level": 6, "skill": 3, - "alternate_skill": 2 + "alternate_skill": 1 }, { "name": "柏喙", @@ -285,12 +285,12 @@ "skill": 1 }, { - "name": "芙蓉", + "name": "安赛尔", "level": 3, "skill": 1 }, { - "name": "安赛尔", + "name": "芙蓉", "level": 3, "skill": 1 } diff --git a/resource/tasks.json b/resource/tasks.json index c0b27f72f4..2ecdd29246 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -6932,7 +6932,9 @@ 216 ], "next": [ - "Roguelike1StageTraderInvestSystemEnter" + "Roguelike1StageTraderInvestSystemEnter", + "Roguelike1TraderRandomShopping", + "Roguelike1StageTraderLeave" ] }, "Roguelike1StageTraderInvestSystemEnter": { diff --git a/src/MeoAssistant/AsstBattleDef.h b/src/MeoAssistant/AsstBattleDef.h index f78d860a7d..48d3df0921 100644 --- a/src/MeoAssistant/AsstBattleDef.h +++ b/src/MeoAssistant/AsstBattleDef.h @@ -126,6 +126,7 @@ namespace asst Rect rect; int elite = 0; int level = 0; + bool required = false; }; using BattleAttackRange = std::vector; diff --git a/src/MeoAssistant/AutoRecruitTask.cpp b/src/MeoAssistant/AutoRecruitTask.cpp index c5b8c82023..bbd89d7384 100644 --- a/src/MeoAssistant/AutoRecruitTask.cpp +++ b/src/MeoAssistant/AutoRecruitTask.cpp @@ -313,7 +313,13 @@ asst::AutoRecruitTask::calc_task_result_type asst::AutoRecruitTask::recruit_calc // assuming timer would be set to 09:00:00 for (RecruitCombs& rc : result_vec) { - rc.min_level = (std::max)(rc.min_level, 3); + if (rc.min_level < 3) { + // find another min level backwards (assuming operator list reversely sorted by level) + auto sec = std::find_if( + rc.opers.crbegin(), rc.opers.crend(), + [](const RecruitOperInfo& op) -> bool { return op.level >= 3; }); + if (sec != rc.opers.crend()) { rc.min_level = sec->level; } + } } std::sort( diff --git a/src/MeoAssistant/BattleImageAnalyzer.cpp b/src/MeoAssistant/BattleImageAnalyzer.cpp index 025ea258fd..720e9894ab 100644 --- a/src/MeoAssistant/BattleImageAnalyzer.cpp +++ b/src/MeoAssistant/BattleImageAnalyzer.cpp @@ -111,6 +111,12 @@ void asst::BattleImageAnalyzer::clear() noexcept m_cost = 0; } +void asst::BattleImageAnalyzer::sort_opers_by_cost() +{ + // 本来游戏就是按费用排的,这里倒序一下就行了 + std::reverse(m_opers.begin(), m_opers.end()); +} + bool asst::BattleImageAnalyzer::opers_analyze() { LogTraceFunction; diff --git a/src/MeoAssistant/BattleImageAnalyzer.h b/src/MeoAssistant/BattleImageAnalyzer.h index 2aac55cd0c..db5bed10fb 100644 --- a/src/MeoAssistant/BattleImageAnalyzer.h +++ b/src/MeoAssistant/BattleImageAnalyzer.h @@ -39,6 +39,7 @@ namespace asst [[nodiscard]] int get_cost() const noexcept; void clear() noexcept; + void sort_opers_by_cost(); // 高费在前,费用降序 protected: bool opers_analyze(); // 识别干员 diff --git a/src/MeoAssistant/OcrImageAnalyzer.cpp b/src/MeoAssistant/OcrImageAnalyzer.cpp index 5ce7366a7e..290a8e6c89 100644 --- a/src/MeoAssistant/OcrImageAnalyzer.cpp +++ b/src/MeoAssistant/OcrImageAnalyzer.cpp @@ -208,13 +208,23 @@ void asst::OcrImageAnalyzer::sort_result_by_required() return; } - std::unordered_map m_req_cache; + std::unordered_map req_cache; for (size_t i = 0; i != m_required.size(); ++i) { - m_req_cache.emplace(m_required.at(i), i + 1); + req_cache.emplace(m_required.at(i), i + 1); } - std::sort(get_result().begin(), get_result().end(), - [&m_req_cache](const auto& lhs, const auto& rhs) -> bool { - return m_req_cache[lhs.text] < m_req_cache[rhs.text]; + auto& result = get_result(); + // 不在 m_required 中的将被排在最后 + std::sort(result.begin(), result.end(), + [&req_cache](const auto& lhs, const auto& rhs) -> bool { + size_t lvalue = req_cache[lhs.text]; + size_t rvalue = req_cache[rhs.text]; + if (lvalue == 0) { + return false; + } + else if (rvalue == 0) { + return true; + } + return lvalue < rvalue; }); } diff --git a/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp b/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp index 2007c810af..1e7c89620b 100644 --- a/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp +++ b/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp @@ -214,10 +214,30 @@ bool asst::RoguelikeBattleTaskPlugin::auto_battle() return false; } + battle_analyzer.sort_opers_by_cost(); const auto& opers = battle_analyzer.get_opers(); if (opers.empty()) { return true; } + // 如果已经放了一些人了,就不要再有费就下了 + if (m_used_tiles.size() >= std::max(m_homes.size(), 2ULL)) { + size_t available_count = 0; + size_t not_cooling_count = 0; + for (const auto& oper : opers) { + if (oper.available) { + available_count += 1; + } + if (!oper.cooling) { + not_cooling_count += 1; + } + } + // 超过一半的人费用都没好,那就不下人 + if (available_count <= not_cooling_count / 2) { + Log.trace("already used", m_used_tiles.size(), ", now_total", opers.size(), + ", avaliable", available_count, ", not_cooling", not_cooling_count); + return true; + } + } static const std::array RoleOrder = { BattleRole::Warrior, @@ -725,7 +745,7 @@ std::pair asst::RoguelikeBattleTaskPlugin::calc_best_direction { TileKey::Wall, 500 }, { TileKey::Road, 1000 }, { TileKey::Home, 500 }, - { TileKey::EnemyHome, 1200 }, + { TileKey::EnemyHome, 1000 }, { TileKey::Floor, 1000 }, { TileKey::Hole, 0 }, { TileKey::Telin, 700 }, diff --git a/src/MeoAssistant/RoguelikeCustomStartTaskPlugin.cpp b/src/MeoAssistant/RoguelikeCustomStartTaskPlugin.cpp index b3255e687a..85eff9bab7 100644 --- a/src/MeoAssistant/RoguelikeCustomStartTaskPlugin.cpp +++ b/src/MeoAssistant/RoguelikeCustomStartTaskPlugin.cpp @@ -107,13 +107,13 @@ bool asst::RoguelikeCustomStartTaskPlugin::hijack_core_char() const std::string& char_name = m_customs[RoguelikeCustomType::CoreChar]; static const std::unordered_map RoleOcrNameMap = { - { BattleRole::Caster, "术士" }, + { BattleRole::Caster, "术师" }, { BattleRole::Medic, "医疗" }, { BattleRole::Pioneer, "先锋" }, { BattleRole::Sniper, "狙击" }, { BattleRole::Special, "特种" }, { BattleRole::Support, "辅助" }, - { BattleRole::Tank, "坦克" }, + { BattleRole::Tank, "重装" }, { BattleRole::Warrior, "近卫" } }; const auto& role = Resrc.battle_data().get_role(char_name); diff --git a/src/MeoAssistant/RoguelikeRecruitImageAnalyzer.cpp b/src/MeoAssistant/RoguelikeRecruitImageAnalyzer.cpp index 054b99dd06..3bcf957cdf 100644 --- a/src/MeoAssistant/RoguelikeRecruitImageAnalyzer.cpp +++ b/src/MeoAssistant/RoguelikeRecruitImageAnalyzer.cpp @@ -15,12 +15,12 @@ bool asst::RoguelikeRecruitImageAnalyzer::analyze() analyzer.set_replace( Task.get("CharsNameOcrReplace")->replace_map); - analyzer.set_required(Resrc.roguelike_recruit().get_oper_order()); - if (!analyzer.analyze()) { return false; } + const auto& order = Resrc.roguelike_recruit().get_oper_order(); + analyzer.set_required(order); analyzer.sort_result_by_required(); for (const auto& [_, rect, name] : analyzer.get_result()) { @@ -32,10 +32,23 @@ bool asst::RoguelikeRecruitImageAnalyzer::analyze() info.name = name; info.elite = elite; info.level = level; + info.required = std::find(order.cbegin(), order.cend(), name) != order.cend(); Log.info(__FUNCTION__, name, elite, level, rect.to_string()); m_result.emplace_back(std::move(info)); } + + auto first_un_req = std::find_if(m_result.begin(), m_result.end(), + [&](const auto& info) -> bool { + return info.required == false; + }); + std::sort(first_un_req, m_result.end(), + [&](const auto& lhs, const auto& rhs) -> bool { + if (lhs.elite == rhs.elite) { + return lhs.level > rhs.level; + } + return lhs.elite > rhs.elite; + }); return !m_result.empty(); } diff --git a/src/MeoAssistant/RoguelikeRecruitTaskPlugin.cpp b/src/MeoAssistant/RoguelikeRecruitTaskPlugin.cpp index 5a1a540894..b6c6a15f81 100644 --- a/src/MeoAssistant/RoguelikeRecruitTaskPlugin.cpp +++ b/src/MeoAssistant/RoguelikeRecruitTaskPlugin.cpp @@ -57,6 +57,9 @@ bool asst::RoguelikeRecruitTaskPlugin::_run() if (!recruited) { for (const auto& info : oper_list) { + if (!info.required) { + continue; + } // 拿个精一 50 以上的 if (info.elite == 0 || (info.elite == 1 && info.level < 50)) { @@ -71,6 +74,9 @@ bool asst::RoguelikeRecruitTaskPlugin::_run() Log.info("All are lower"); // 随便招个精一的 for (const auto& info : oper_list) { + if (!info.required) { + continue; + } if (info.elite == 0) { continue; } diff --git a/src/MeoAssistant/RoguelikeShoppingTaskPlugin.cpp b/src/MeoAssistant/RoguelikeShoppingTaskPlugin.cpp index 556aa00960..8ff2575d7f 100644 --- a/src/MeoAssistant/RoguelikeShoppingTaskPlugin.cpp +++ b/src/MeoAssistant/RoguelikeShoppingTaskPlugin.cpp @@ -46,7 +46,8 @@ bool asst::RoguelikeShoppingTaskPlugin::_run() } auto find_it = std::find_if(result.cbegin(), result.cend(), [&](const TextRect& tr) -> bool { - return tr.text == goods.name; + return tr.text.find(goods.name) != std::string::npos || + goods.name.find(tr.text) != std::string::npos; }); if (find_it == result.cend()) { continue; diff --git a/src/MeoAsstGui/Resources/Localizations/en-us.xaml b/src/MeoAsstGui/Resources/Localizations/en-us.xaml index f80c359549..8f73558f54 100644 --- a/src/MeoAsstGui/Resources/Localizations/en-us.xaml +++ b/src/MeoAsstGui/Resources/Localizations/en-us.xaml @@ -116,6 +116,7 @@ Hide today not open level Variable function button + Tip: It will be automatically detected here. If there is an error, you can try to modify it again, otherwise you do not need to fill in it yourself ADB path (rel/abs) Connection address Connection Preset diff --git a/src/MeoAsstGui/Resources/Localizations/ja-jp.xaml b/src/MeoAsstGui/Resources/Localizations/ja-jp.xaml index 5e6d43603e..a263ef6d09 100644 --- a/src/MeoAsstGui/Resources/Localizations/ja-jp.xaml +++ b/src/MeoAsstGui/Resources/Localizations/ja-jp.xaml @@ -116,6 +116,7 @@ 当日は開放されないステージを隠します メイン画面左側のボタン + ヒント:ここで自動的に検出されます。エラーが発生した場合は、もう一度変更を試みることができます。それ以外の場合は、自分で入力する必要はありません。 adbパス (相対/絶対) 接続先アドレス 接続構成 diff --git a/src/MeoAsstGui/Resources/Localizations/ko-kr.xaml b/src/MeoAsstGui/Resources/Localizations/ko-kr.xaml index 7a44a90ea4..d0d3c438e6 100644 --- a/src/MeoAsstGui/Resources/Localizations/ko-kr.xaml +++ b/src/MeoAsstGui/Resources/Localizations/ko-kr.xaml @@ -116,6 +116,7 @@ 당일 스테이지만 표시 메인 화면 왼쪽의 버튼 + 팁: 여기에서 자동으로 감지됩니다. 오류가 있는 경우 다시 수정을 시도할 수 있습니다. 그렇지 않으면 직접 입력할 필요가 없습니다. adb 경로 (상대/절대) 연결 주소 연결 사전 설정 diff --git a/src/MeoAsstGui/Resources/Localizations/pallas.xaml b/src/MeoAsstGui/Resources/Localizations/pallas.xaml index 78d1f6b240..2ac7a0dfb0 100644 --- a/src/MeoAsstGui/Resources/Localizations/pallas.xaml +++ b/src/MeoAsstGui/Resources/Localizations/pallas.xaml @@ -116,6 +116,7 @@ 🍻🍸🍷🍺🍺🍸🍸 🍷🍺🍻🍺🍸🍺 + 🍸🍻🍻🍸🍸🍻💃🍻🍸🍷🍸🍷🍷💃🍸🍻💃🍷🍺🍺🍸🍷🕺🍷🍷🍷🕺🍻🍷🍸💃🕺🍸🍷🍺 🕺💃🍸🍷🍸💃🍸 🍻🕺🍻 🍸🍷🍻 diff --git a/src/MeoAsstGui/Resources/Localizations/zh-cn.xaml b/src/MeoAsstGui/Resources/Localizations/zh-cn.xaml index 59d3db3aab..39b0bd8cca 100644 --- a/src/MeoAsstGui/Resources/Localizations/zh-cn.xaml +++ b/src/MeoAsstGui/Resources/Localizations/zh-cn.xaml @@ -116,6 +116,7 @@ 关卡选择隐藏当日不开放关卡 主界面可选择按钮功能 + 小提示:这里会自动检测的,若出现问题可再尝试修改,否则不需要自行填写 adb 路径 (相对/绝对) 连接地址 连接配置 diff --git a/src/MeoAsstGui/Resources/Localizations/zh-tw.xaml b/src/MeoAsstGui/Resources/Localizations/zh-tw.xaml index 11979040ae..b15b1ea77e 100644 --- a/src/MeoAsstGui/Resources/Localizations/zh-tw.xaml +++ b/src/MeoAsstGui/Resources/Localizations/zh-tw.xaml @@ -116,6 +116,7 @@ 關卡選擇隱藏當日不開放關卡 主介面可選擇按鈕功能 + 小提示:這裡會自動檢測的,若出現問題可再嘗試修改,否則不需要自行填寫 adb 路徑 (相對/絕對) 連接地址 連接配置 diff --git a/src/MeoAsstGui/UserControl/ConnectSettingsUserControl.xaml b/src/MeoAsstGui/UserControl/ConnectSettingsUserControl.xaml index 7f6c7f1423..333d3c676a 100644 --- a/src/MeoAsstGui/UserControl/ConnectSettingsUserControl.xaml +++ b/src/MeoAsstGui/UserControl/ConnectSettingsUserControl.xaml @@ -21,9 +21,18 @@ + +