diff --git a/CHANGELOG_MAA.md b/CHANGELOG_MAA.md index f9ff2c8a0a..5d72247769 100644 --- a/CHANGELOG_MAA.md +++ b/CHANGELOG_MAA.md @@ -1,12 +1,11 @@ -- 自动战斗 - - 修复击杀数识别错误 - - 修复偶尔部署不上去的问题 +- 版本亮点 + - 新增支持开机自启动、启动后自动开机模拟器及游戏、启动后自动 LinkStart, 请进入设置中开启使用~ (模拟器等待时间建议设大点) -- 刷理智 - - 新增支持游戏崩溃重连,需要在设置中开启 `唤醒设置` - - 修复一个刷理智时的识别错误 - - 修复一个掉落识别错误的 - - 修复勾选材料后刷几次就自动停了的问题 +- 自动战斗 + - 修复不开技能的问题 + - 修复尽可能开技能干员一直点不上的问题 + - 允许使用鼠标拖拽选择作业文件 - 其他 - - 新增 adb 出错后的重连机制;及重连失败时的报错 + - 优化了刷理智时游戏崩溃后重连的机制 + - 其他的一些小问题优化及修复 diff --git a/docs/maa_tasks_schema.json b/docs/maa_tasks_schema.json index 06430a4984..a9972cfdc9 100644 --- a/docs/maa_tasks_schema.json +++ b/docs/maa_tasks_schema.json @@ -69,6 +69,10 @@ "$ref": "#/definitions/TaskNameList", "description": "可选项,表示达到了最大执行次数后要执行的任务\n不填写时,达到了最大执行次数则停止;填写后就执行这里的,而不是 next 里的" }, + "onErrorNext": { + "$ref": "#/definitions/TaskNameList", + "description": "可选项,表示执行出错时,后续要执行的任务" + }, "preDelay": { "type": "number", "description": "可选项,表示识别到后延迟多久才执行 action,单位毫秒;不填写时默认 0" @@ -218,4 +222,4 @@ ] } } -} \ No newline at end of file +} diff --git a/docs/任务流程协议.md b/docs/任务流程协议.md index f41d3900a2..3ca63c8e8e 100644 --- a/docs/任务流程协议.md +++ b/docs/任务流程协议.md @@ -53,6 +53,8 @@ "exceededNext": [ "OtherTaskName1", "OtherTaskName2" ], // 可选项,表示达到了最大执行次数后要执行的任务 // 不填写时,达到了最大执行次数则停止;填写后就执行这里的,而不是 next 里的 + "onErrorNext": [ "OtherTaskName1", "OtherTaskName2" ], + // 可选项,表示执行出错时,后续要执行的任务 "preDelay": 1000, // 可选项,表示识别到后延迟多久才执行 action,单位毫秒;不填写时默认 0 "rearDelay": 1000, // 可选项,表示 action 执行完后延迟多久才去识别 next, 单位毫秒;不填写时默认 0 diff --git a/docs/回调消息协议.md b/docs/回调消息协议.md index bf289ee7bf..ab10908f8a 100644 --- a/docs/回调消息协议.md +++ b/docs/回调消息协议.md @@ -200,6 +200,8 @@ Todo 肉鸽关卡:紧急作战 - `Roguelike1StageDreadfulFoe` 肉鸽关卡:险路恶敌 +- `StartGameTask` + 打开客户端失败(配置文件与传入client_type不匹配) - Todo 其他 #### SubTaskExtraInfo @@ -290,6 +292,16 @@ Todo } ``` +- `RecruitRobotTag` + 公招识别到了小车 Tag 且跳过小车(即用户需要小车) + + ```jsonc + // 对应的 details 字段举例 + { + "tag": "支援机械" + } + ``` + - `RecruitResult` 公招识别结果 @@ -356,7 +368,8 @@ Todo } ] } - ] + ], + "robot": True // 公招识别到了小车 Tag 且跳过小车(即用户需要小车) } ``` diff --git a/docs/集成文档.md b/docs/集成文档.md index 89978650a4..a0482a9a5d 100644 --- a/docs/集成文档.md +++ b/docs/集成文档.md @@ -33,7 +33,15 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p - `StartUp` 开始唤醒 - 不支持设置参数 + +```jsonc +// 对应的任务参数 +{ + "client_type": string, // 客户端版本,可选,默认为空 + // 选项:"Official" | "Bilibili" + "start_game_enable": bool // 是否自动启动客户端,可选,默认不启动 +} +``` - `Fight` 刷理智 @@ -78,6 +86,7 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p "expedite": bool, // 是否使用加急许可,可选,默认 false "expedite_times": int, // 加急次数,仅在 expedite 为 true 时有效。 // 可选,默认无限使用(直到 times 达到上限) + "skip_robot": bool // 是否在识别到小车词条时跳过,可选,默认跳过 } ``` @@ -94,7 +103,7 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p "drones": string, // 无人机用途,可选项,默认 _NotUse // "_NotUse"、"Money"、"SyntheticJade"、"CombatRecord"、"PureGold"、"OriginStone"、"Chip" "threshold": float, // 宿舍进驻心情阈值,可选,取值范围 [0, 1.0],默认 0.3 - "replenish": bool, // 贸易站“源石碎片”是否自动补货,可选,默认 false + "replenish": bool // 贸易站“源石碎片”是否自动补货,可选,默认 false } ``` @@ -112,6 +121,7 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p "shopping": bool, // 是否购物,可选,默认 false。不支持运行中设置 "buy_first": [ // 优先购买列表,可选。不支持运行中设置 string, // 商品名,如 "招聘许可"、"龙门币" 等 + ... ], "blacklist": [ // 黑名单列表,可选。不支持运行中设置 string, // 商品名,如 "加急许可"、"家具零件" 等 @@ -129,7 +139,7 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p ```jsonc { - "mode": int, // 模式,可选项。默认 0 + "mode": int // 模式,可选项。默认 0 // 0 - 尽可能一直往后打 // 1 - 第一层投资完源石锭就退出 // 2 - 投资过后再退出,没有投资就继续往后打 diff --git a/resource/tasks.json b/resource/tasks.json index fd036802ae..f006700f75 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -779,6 +779,7 @@ "TodaysSupplies", "ReturnToTerminal", "OfflineConfirm", + "EndOfAction", "StageSNFlag" ] }, @@ -1263,6 +1264,10 @@ "UseMedicine", "UseStone", "NoStone", + "StartToWakeUp", + "StartUpConnectingFlag", + "StartLoginBServer", + "OfflineConfirm", "ClickCornerAfterPRTS_2" ] }, @@ -1277,28 +1282,6 @@ 10 ], "rearDelay": 3000, - "next": [ - "EndOfAction", - "StartButton1", - "StartButton2", - "UseMedicine", - "UseStone", - "NoStone", - "MaybeCrashAndRestartGame" - ] - }, - "MaybeCrashAndRestartGame": { - "ClickCorner_Doc": "一般能点这么多下还不行的,多半是游戏崩了,所以重启游戏试试", - "Doc": "本任务注册了插件 GameCrashRestartTaskPlugin", - "algorithm": "JustReturn", - "action": "ClickRect", - "specificRect": [ - 1000, - 120, - 270, - 10 - ], - "rearDelay": 3000, "next": [ "EndOfAction", "StartButton1", @@ -1310,12 +1293,10 @@ "StartToWakeUp", "StartUpConnectingFlag", "StartLoginBServer", - "Terminal", - "CloseAnno", - "TodaysSupplies", - "ReturnToTerminal", - "OfflineConfirm", - "StageSNFlag" + "OfflineConfirm" + ], + "onErrorNext": [ + "RestartGameAndContinueFighting" ] }, "EndOfAction": { @@ -1352,6 +1333,24 @@ "UseStone", "NoStone", "EndOfAction" + ], + "onErrorNext": [ + "RestartGameAndContinueFighting" + ] + }, + "RestartGameAndContinueFighting": { + "algorithm": "JustReturn", + "action": "DoNothing", + "rearDelay": 5000, + "next": [ + "GameStart", + "StartToWakeUp", + "StartUpConnectingFlag", + "StartLoginBServer", + "Terminal", + "CloseAnno", + "TodaysSupplies", + "OfflineConfirm" ] }, "UseMedicine": { @@ -1500,6 +1499,9 @@ "StartLoginBServer", "OfflineConfirm", "StartButton1" + ], + "onErrorNext": [ + "ClickCornerAfterPRTS_1" ] }, "OfflineConfirmAfterBattle": { diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp index c2667cc2e1..9531ac3efd 100644 --- a/src/MeoAssistant/Assistant.cpp +++ b/src/MeoAssistant/Assistant.cpp @@ -322,5 +322,6 @@ void asst::Assistant::append_callback(AsstMsg msg, json::value detail) void Assistant::clear_cache() { m_status->clear_number(); - //Task.clear_cache(); + m_status->clear_rect(); + m_status->clear_str(); } diff --git a/src/MeoAssistant/AsstTypes.h b/src/MeoAssistant/AsstTypes.h index 18d77de3be..417afee185 100644 --- a/src/MeoAssistant/AsstTypes.h +++ b/src/MeoAssistant/AsstTypes.h @@ -98,7 +98,7 @@ namespace asst } Rect move(Rect move) const { - return {x + move.x, y + move.y, move.width, move.height}; + return { x + move.x, y + move.y, move.width, move.height }; } int x = 0; @@ -158,7 +158,6 @@ namespace asst double score = 0.0; Rect rect; }; - } namespace std @@ -225,6 +224,7 @@ namespace asst std::vector next; // 下一个可能的任务(列表) int max_times = INT_MAX; // 任务最多执行多少次 std::vector exceeded_next; // 达到最多次数了之后,下一个可能的任务(列表) + std::vector on_error_next; // 任务出错之后要去执行什么 std::vector reduce_other_times; // 执行了该任务后,需要减少别的任务的执行次数。例如执行了吃理智药,则说明上一次点击蓝色开始行动按钮没生效,所以蓝色开始行动要-1 asst::Rect specific_rect; // 指定区域,目前仅针对ClickRect任务有用,会点这个区域 int pre_delay = 0; // 执行该任务前的延时 diff --git a/src/MeoAssistant/BattleProcessTask.cpp b/src/MeoAssistant/BattleProcessTask.cpp index a276fa8e5b..57e5c79fc3 100644 --- a/src/MeoAssistant/BattleProcessTask.cpp +++ b/src/MeoAssistant/BattleProcessTask.cpp @@ -518,7 +518,7 @@ bool asst::BattleProcessTask::oper_retreat(const BattleAction& action) action.location.x == 0 && action.location.y == 0 && iter != m_used_opers.cend()) { pos = iter->second.pos; - m_used_opers.erase(name); + m_used_opers.erase(iter); } else { pos = m_normal_tile_info.at(action.location).pos; @@ -537,7 +537,6 @@ bool asst::BattleProcessTask::use_skill(const BattleAction& action) action.location.x == 0 && action.location.y == 0 && iter != m_used_opers.cend()) { pos = iter->second.pos; - m_used_opers.erase(name); } else { pos = m_normal_tile_info.at(action.location).pos; @@ -571,6 +570,7 @@ bool asst::BattleProcessTask::try_possible_skill(const cv::Mat& image) continue; } m_ctrler->click(info.pos); + sleep(Task.get("BattleUseOper")->pre_delay); used |= ProcessTask(*this, { "BattleSkillReadyOnClick" }).set_task_delay(0).run(); if (info.info.skill_usage == BattleSkillUsage::Once) { info.info.skill_usage = BattleSkillUsage::OnceUsed; diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index 54932c3f29..616429a7fe 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -480,11 +480,11 @@ void asst::Controller::clear_info() noexcept m_height = 0; m_control_scale = 1.0; m_scale_size = { WindowWidthDefault, WindowHeightDefault }; - m_server_started = false; - if (m_support_socket && m_server_started && m_server_sock) { + if (m_server_sock) { ::closesocket(m_server_sock); m_server_sock = 0U; } + m_server_started = false; --m_instance_count; } diff --git a/src/MeoAssistant/FightTask.cpp b/src/MeoAssistant/FightTask.cpp index 5e3945f95d..58d40aecb7 100644 --- a/src/MeoAssistant/FightTask.cpp +++ b/src/MeoAssistant/FightTask.cpp @@ -37,7 +37,9 @@ asst::FightTask::FightTask(AsstCallback callback, void* callback_arg) .set_times_limit("MedicineConfirm", 0) .set_times_limit("StoneConfirm", 0) .set_times_limit("StartButton1", INT_MAX) - .set_times_limit("StartButton2", INT_MAX); + .set_times_limit("StartButton2", INT_MAX) + .set_ignore_error(false); + m_stage_drops_plugin_ptr = m_fight_task_ptr->regiseter_plugin(); m_stage_drops_plugin_ptr->set_retry_times(0); m_game_restart_plugin_ptr = m_fight_task_ptr->regiseter_plugin(); diff --git a/src/MeoAssistant/GameCrashRestartTaskPlugin.cpp b/src/MeoAssistant/GameCrashRestartTaskPlugin.cpp index 2fda43d6b8..e334a74893 100644 --- a/src/MeoAssistant/GameCrashRestartTaskPlugin.cpp +++ b/src/MeoAssistant/GameCrashRestartTaskPlugin.cpp @@ -1,13 +1,16 @@ #include "GameCrashRestartTaskPlugin.h" +#include "RuntimeStatus.h" + bool asst::GameCrashRestartTaskPlugin::verify(AsstMsg msg, const json::value& details) const { - if (msg != AsstMsg::SubTaskCompleted + if (msg != AsstMsg::SubTaskStart || details.get("subtask", std::string()) != "ProcessTask") { return false; } - if (details.at("details").at("task").as_string() == "MaybeCrashAndRestartGame") { + if (details.at("details").at("task").as_string() == "RestartGameAndContinueFighting" + && m_status->get_number("LastStartButton2")) { return true; } else { diff --git a/src/MeoAssistant/ProcessTask.cpp b/src/MeoAssistant/ProcessTask.cpp index 67aa931b81..0816a79a5f 100644 --- a/src/MeoAssistant/ProcessTask.cpp +++ b/src/MeoAssistant/ProcessTask.cpp @@ -49,13 +49,9 @@ bool asst::ProcessTask::run() return false; } sleep(m_task_delay); - - if (!on_run_fails()) { - return false; - } } callback(AsstMsg::SubTaskError, basic_info()); - return false; + return on_run_fails(); } ProcessTask& asst::ProcessTask::set_task_delay(int delay) noexcept @@ -66,6 +62,7 @@ ProcessTask& asst::ProcessTask::set_task_delay(int delay) noexcept asst::ProcessTask& asst::ProcessTask::set_tasks(std::vector tasks_name) noexcept { + m_cur_retry = 0; m_raw_tasks_name = std::move(tasks_name); return *this; } @@ -99,7 +96,6 @@ bool ProcessTask::_run() Log.info(info.to_string()); Rect rect; - std::shared_ptr cur_task_ptr = nullptr; auto front_task_ptr = Task.get(m_cur_tasks_name.front()); // 可能有配置错误,导致不存在对应的任务 @@ -109,7 +105,7 @@ bool ProcessTask::_run() } // 如果第一个任务是JustReturn的,那就没必要再截图并计算了 if (front_task_ptr->algorithm == AlgorithmType::JustReturn) { - cur_task_ptr = front_task_ptr; + m_cur_task_ptr = front_task_ptr; } else { const auto image = m_ctrler->get_image(); @@ -120,15 +116,15 @@ bool ProcessTask::_run() if (!analyzer.analyze()) { return false; } - cur_task_ptr = analyzer.get_result(); + m_cur_task_ptr = analyzer.get_result(); rect = analyzer.get_rect(); } if (need_exit()) { return false; } - std::string cur_name = cur_task_ptr->name; + std::string cur_name = m_cur_task_ptr->name; - const auto& res_move = cur_task_ptr->rect_move; + const auto& res_move = m_cur_task_ptr->rect_move; if (!res_move.empty()) { rect.x += res_move.x; rect.y += res_move.y; @@ -138,7 +134,7 @@ bool ProcessTask::_run() int& exec_times = m_exec_times[cur_name]; - int max_times = cur_task_ptr->max_times; + int max_times = m_cur_task_ptr->max_times; if (auto iter = m_times_limit.find(cur_name); iter != m_times_limit.cend()) { max_times = iter->second; @@ -151,7 +147,7 @@ bool ProcessTask::_run() { "max_times", max_times } }; Log.info("exec times exceeded the limit", info.to_string()); - m_cur_tasks_name = cur_task_ptr->exceeded_next; + m_cur_tasks_name = m_cur_task_ptr->exceeded_next; sleep(m_task_delay); continue; } @@ -161,23 +157,23 @@ bool ProcessTask::_run() info["details"] = json::object{ { "task", cur_name }, - { "action", static_cast(cur_task_ptr->action) }, + { "action", static_cast(m_cur_task_ptr->action) }, { "exec_times", exec_times }, { "max_times", max_times }, - { "algorithm", static_cast(cur_task_ptr->algorithm) } + { "algorithm", static_cast(m_cur_task_ptr->algorithm) } }; callback(AsstMsg::SubTaskStart, info); // 前置固定延时 - if (!sleep(cur_task_ptr->pre_delay)) { + if (!sleep(m_cur_task_ptr->pre_delay)) { return false; } bool need_stop = false; - switch (cur_task_ptr->action) { + switch (m_cur_task_ptr->action) { case ProcessTaskAction::ClickRect: - rect = cur_task_ptr->specific_rect; + rect = m_cur_task_ptr->specific_rect; [[fallthrough]]; case ProcessTaskAction::ClickSelf: exec_click_task(rect); @@ -189,11 +185,11 @@ bool ProcessTask::_run() } break; case ProcessTaskAction::SwipeToTheLeft: case ProcessTaskAction::SwipeToTheRight: - exec_swipe_task(cur_task_ptr->action); + exec_swipe_task(m_cur_task_ptr->action); break; case ProcessTaskAction::SlowlySwipeToTheLeft: case ProcessTaskAction::SlowlySwipeToTheRight: - exec_slowly_swipe_task(cur_task_ptr->action); + exec_slowly_swipe_task(m_cur_task_ptr->action); break; case ProcessTaskAction::DoNothing: break; @@ -210,7 +206,7 @@ bool ProcessTask::_run() // 减少其他任务的执行次数 // 例如,进入吃理智药的界面了,相当于上一次点蓝色开始行动没生效 // 所以要给蓝色开始行动的次数减一 - for (const std::string& reduce : cur_task_ptr->reduce_other_times) { + for (const std::string& reduce : m_cur_task_ptr->reduce_other_times) { auto& v = m_exec_times[reduce]; if (v > 0) { --v; @@ -218,7 +214,7 @@ bool ProcessTask::_run() } // 后置固定延时 - int rear_delay = cur_task_ptr->rear_delay; + int rear_delay = m_cur_task_ptr->rear_delay; if (auto iter = m_rear_delay.find(cur_name); iter != m_rear_delay.cend()) { rear_delay = iter->second; @@ -227,10 +223,10 @@ bool ProcessTask::_run() return false; } - for (const std::string& sub : cur_task_ptr->sub) { + for (const std::string& sub : m_cur_task_ptr->sub) { LogTraceScope("Sub: " + sub); bool sub_ret = ProcessTask(*this, { sub }).run(); - if (!sub_ret && !cur_task_ptr->sub_error_ignored) { + if (!sub_ret && !m_cur_task_ptr->sub_error_ignored) { Log.error("Sub error and not ignored", sub); return false; } @@ -238,20 +234,32 @@ bool ProcessTask::_run() callback(AsstMsg::SubTaskCompleted, info); - if (cur_task_ptr->next.empty()) { + if (m_cur_task_ptr->next.empty()) { need_stop = true; } if (need_stop) { return true; } - m_cur_tasks_name = cur_task_ptr->next; + m_cur_tasks_name = m_cur_task_ptr->next; sleep(m_task_delay); } return true; } +bool asst::ProcessTask::on_run_fails() +{ + LogTraceFunction; + + if (!m_cur_task_ptr || m_cur_task_ptr->on_error_next.empty()) { + return false; + } + + set_tasks(m_cur_task_ptr->on_error_next); + return run(); +} + void ProcessTask::exec_click_task(const Rect& matched_rect) { m_ctrler->click(matched_rect); diff --git a/src/MeoAssistant/ProcessTask.h b/src/MeoAssistant/ProcessTask.h index d30e03fdb1..98e39a1e89 100644 --- a/src/MeoAssistant/ProcessTask.h +++ b/src/MeoAssistant/ProcessTask.h @@ -24,11 +24,13 @@ namespace asst protected: virtual bool _run() override; + virtual bool on_run_fails() override; void exec_click_task(const Rect& matched_rect); void exec_swipe_task(ProcessTaskAction action); void exec_slowly_swipe_task(ProcessTaskAction action); + std::shared_ptr m_cur_task_ptr = nullptr; std::vector m_raw_tasks_name; std::vector m_cur_tasks_name; std::unordered_map m_rear_delay; diff --git a/src/MeoAssistant/StartUpTask.cpp b/src/MeoAssistant/StartUpTask.cpp index 7508377335..d4696b960b 100644 --- a/src/MeoAssistant/StartUpTask.cpp +++ b/src/MeoAssistant/StartUpTask.cpp @@ -11,7 +11,8 @@ asst::StartUpTask::StartUpTask(AsstCallback callback, void* callback_arg) { m_start_up_task_ptr->set_tasks({ "StartUp" }) .set_times_limit("ReturnToTerminal", 0) - .set_times_limit("Terminal", 0); + .set_times_limit("Terminal", 0) + .set_times_limit("EndOfAction", 0); m_subtasks.emplace_back(m_start_game_task_ptr); m_subtasks.emplace_back(m_start_up_task_ptr); } diff --git a/src/MeoAssistant/TaskData.cpp b/src/MeoAssistant/TaskData.cpp index 7c23e79396..d6ebabc49b 100644 --- a/src/MeoAssistant/TaskData.cpp +++ b/src/MeoAssistant/TaskData.cpp @@ -160,8 +160,11 @@ bool asst::TaskData::parse(const json::value& json) task_info_ptr->exceeded_next.emplace_back(excceed_next.as_string()); } } - else { - task_info_ptr->exceeded_next.emplace_back("Stop"); + if (task_json.contains("onErrorNext")) { + const json::array& on_error_next_arr = task_json.at("onErrorNext").as_array(); + for (const json::value& on_error_next : on_error_next_arr) { + task_info_ptr->on_error_next.emplace_back(on_error_next.as_string()); + } } task_info_ptr->pre_delay = task_json.get("preDelay", 0); task_info_ptr->rear_delay = task_json.get("rearDelay", 0); diff --git a/src/MeoAsstGui/Helper/AsstProxy.cs b/src/MeoAsstGui/Helper/AsstProxy.cs index 54c17f836a..d40963bb44 100644 --- a/src/MeoAsstGui/Helper/AsstProxy.cs +++ b/src/MeoAsstGui/Helper/AsstProxy.cs @@ -12,6 +12,7 @@ using System; using System.Runtime.InteropServices; using System.Text; +using System.Threading.Tasks; using System.Windows; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -86,8 +87,21 @@ namespace MeoAsstGui Environment.Exit(0); }); } - var tvm = _container.Get(); - tvm.Idle = true; + var mainModel = _container.Get(); + mainModel.Idle = true; + var settingsModel = _container.Get(); + + Execute.OnUIThread(() => + { + Task.Run(() => + { + settingsModel.TryToStartEmulator(); + }); + if (settingsModel.RunDirectly) + { + mainModel.LinkStart(); + } + }); } [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)] @@ -383,7 +397,7 @@ namespace MeoAsstGui mainModel.AddLog("投资达到上限", "darkcyan"); break; - case "MaybeCrashAndRestartGame": + case "RestartGameAndContinueFighting": mainModel.AddLog("游戏崩溃,重新启动", "darkgoldenrod"); break; @@ -604,16 +618,6 @@ namespace MeoAsstGui } break; - case "RecruitSpecialTag": - { - string special = subTaskDetails["tag"].ToString(); - using (var toast = new ToastNotification("公招提示")) - { - toast.AppendContentText(special).ShowRecruit(); - } - } - break; - case "RecruitResult": { string resultContent = string.Empty; @@ -635,13 +639,6 @@ namespace MeoAsstGui resultContent += "\n\n"; } recruitModel.RecruitResult = resultContent; - if (level >= 5) - { - using (var toast = new ToastNotification($"公招出 {level} 星了哦!")) - { - toast.AppendContentText(new string('★', level)).ShowRecruit(row: 2); - } - } } break; } diff --git a/src/MeoAsstGui/MeoAsstGui.csproj b/src/MeoAsstGui/MeoAsstGui.csproj index bc1485c184..50f5fe3bbd 100644 --- a/src/MeoAsstGui/MeoAsstGui.csproj +++ b/src/MeoAsstGui/MeoAsstGui.csproj @@ -138,7 +138,7 @@ VersionUpdateSettingsUserControl.xaml - + diff --git a/src/MeoAsstGui/UserControl/StartSettingsUserControl.xaml b/src/MeoAsstGui/UserControl/StartSettingsUserControl.xaml index 218e84cf6c..23af617aaf 100644 --- a/src/MeoAsstGui/UserControl/StartSettingsUserControl.xaml +++ b/src/MeoAsstGui/UserControl/StartSettingsUserControl.xaml @@ -8,31 +8,39 @@ mc:Ignorable="d" xmlns:vm="clr-namespace:MeoAsstGui;assembly=MeoAsstGui" d:DataContext="{d:DesignInstance {x:Type vm:SettingsViewModel}}" - d:DesignHeight="90" d:DesignWidth="400"> + d:DesignHeight="300" d:DesignWidth="400"> - - - + + - - - - - - - - + + + + + + + + + + + +