diff --git a/resource/infrast.json b/resource/infrast.json index 8c59890dcf..b73bccb3bc 100644 --- a/resource/infrast.json +++ b/resource/infrast.json @@ -3,7 +3,8 @@ "Mfg", "Trade", "Power", - "Office" + "Office", + "Reception" ], "Mfg": { "Mfg_Doc": "制造站", @@ -1644,5 +1645,189 @@ } ], "skillsGroup": [] + }, + "Reception": { + "Doc": "会客室", + "maxNumOfOpers": 2, + "products": [ + "General", + "No1", + "No2", + "No3", + "No4", + "No5", + "No6", + "No7" + ], + "skills": [ + { + "name": [ + "信使·罗德岛制药" + ], + "intro": "进驻会客室时,线索搜集速度提升10%,且更容易获得罗德岛制药线索(工作时长影响概率)", + "template": "Bskill_meet_rhodes2.png", + "efficient": { + "General": 10, + "No7": 30 + } + }, + { + "name": [ + "通讯员" + ], + "intro": "进驻会客室时,更容易获得罗德岛制药线索(工作时长影响概率)", + "template": "Bskill_meet_blacksteel2.png", + "efficient": { + "No7": 10 + } + }, + { + "name": [ + "插旗" + ], + "intro": "进驻会客室后,每当新搜集到的线索不是罗德岛制药时,则额外增加罗德岛制药线索的出现概率(工作时长影响概率)", + "template": "Bskill_meet_flag_rhodes.png", + "efficient": { + "No7": 15 + } + }, + { + "name": [ + "讯使" + ], + "intro": "进驻会客室时,线索搜集速度提升10%,且更容易获得喀兰贸易线索(工作时长影响概率)", + "template": "Bskill_meet_kjerag2.png", + "efficient": { + "General": 10, + "No6": 30 + } + }, + { + "name": [ + "传讯者" + ], + "intro": "进驻会客室时,线索搜集速度提升10%,且更容易获得格拉斯哥帮线索(工作时长影响概率)", + "template": "Bskill_meet_glasgow2.png", + "efficient": { + "General": 10, + "No5": 30 + } + }, + { + "name": [ + "军师" + ], + "intro": "进驻会客室时,线索搜集速度提升10%,且更容易获得乌萨斯学生自治团线索(工作时长影响概率)", + "template": "Bskill_meet_ursus2.png", + "efficient": { + "General": 10, + "No4": 30 + } + }, + { + "name": [ + "秘密搜查" + ], + "intro": "进驻会客室时,更容易获得乌萨斯学生自治团线索(工作时长影响概率)", + "template": "Bskill_meet_ursus1.png", + "efficient": { + "No4": 10 + } + }, + { + "name": [ + "甄别" + ], + "intro": "进驻会客室后,每当新搜集到的线索不是乌萨斯学生自治团时,则额外增加乌萨斯学生自治团线索的出现概率(工作时长影响概率)", + "template": "Bskill_meet_flag_ursus.png", + "efficient": { + "No4": 15 + } + }, + { + "name": [ + "B.P.R.S" + ], + "intro": "进驻会客室时,线索搜集速度提升10%,且更容易获得黑钢国际线索(工作时长影响概率)", + "template": "Bskill_meet_blacksteel2.png", + "efficient": { + "General": 10, + "No3": 30 + } + }, + { + "name": [ + "信使·企鹅物流" + ], + "intro": "进驻会客室时,线索搜集速度提升10%,且更容易获得企鹅物流线索(工作时长影响概率)", + "template": "Bskill_meet_penguin2.png", + "efficient": { + "General": 10, + "No2": 30 + } + }, + { + "name": [ + "皇家探员(自称)" + ], + "intro": "进驻会客室时,更容易获得企鹅物流线索(工作时长影响概率)", + "template": "Bskill_meet_penguin1.png", + "efficient": { + "No2": 10 + } + }, + { + "name": [ + "守望者" + ], + "intro": "进驻会客室时,线索搜集速度提升10%,且更容易获得莱茵生命线索(工作时长影响概率)", + "template": "Bskill_meet_rhine2.png", + "efficient": { + "General": 10, + "No1": 30 + } + }, + { + "name": [ + "哥伦比亚史" + ], + "intro": "进驻会客室后,每当新搜集到的线索不是莱茵生命时,则额外增加莱茵生命线索的出现概率(工作时长影响概率)", + "template": "Bskill_meet_flag_rhine.png", + "efficient": { + "No1": 15 + } + }, + { + "name": [ + "警司" + ], + "intro": "进驻会客室时,线索搜集速度提升25%", + "template": "Bskill_meet_spd3.png", + "efficient": { + "all": 25 + } + }, + { + "name": [ + "线索搜集·β" + ], + "intro": "进驻会客室时,线索搜集速度提升20%", + "template": "Bskill_meet_spd2.png", + "efficient": { + "all": 20 + } + }, + { + "name": [ + "线索搜集·α" + ], + "intro": "进驻会客室时,线索搜集速度提升10%", + "template": "Bskill_meet_spd1.png", + "efficient": { + "all": 10 + } + } + ], + "skillsGroup": [] } } \ No newline at end of file diff --git a/resource/tasks.json b/resource/tasks.json index 2c2018635f..db86a52161 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -1238,6 +1238,17 @@ ], "rearDelay": 1000 }, + "InfrastAddOperatorReception": { + "template": "AddOperatorReception.png", + "cache": false, + "roi": [ + 0, + 0, + 300, + 720 + ], + "rearDelay": 1000 + }, "InfrastOperSelected": { "template": "OperSelected.png", "cache": false, @@ -1271,7 +1282,8 @@ 250, 255 ], - "templThreshold": 0.95 + "templThreshold": 0.95, + "rearDelay": 1000 }, "InfrastClueVacancyNo2": { "template": "ClueVacancyNo2.png", @@ -1280,7 +1292,8 @@ 250, 255 ], - "templThreshold": 0.95 + "templThreshold": 0.95, + "rearDelay": 1000 }, "InfrastClueVacancyNo3": { "template": "ClueVacancyNo3.png", @@ -1289,7 +1302,8 @@ 250, 255 ], - "templThreshold": 0.95 + "templThreshold": 0.95, + "rearDelay": 1000 }, "InfrastClueVacancyNo4": { "template": "ClueVacancyNo4.png", @@ -1298,7 +1312,8 @@ 250, 255 ], - "templThreshold": 0.95 + "templThreshold": 0.95, + "rearDelay": 1000 }, "InfrastClueVacancyNo5": { "template": "ClueVacancyNo5.png", @@ -1307,7 +1322,8 @@ 250, 255 ], - "templThreshold": 0.95 + "templThreshold": 0.95, + "rearDelay": 1000 }, "InfrastClueVacancyNo6": { "template": "ClueVacancyNo6.png", @@ -1316,7 +1332,8 @@ 250, 255 ], - "templThreshold": 0.95 + "templThreshold": 0.95, + "rearDelay": 1000 }, "InfrastClueVacancyNo7": { "template": "ClueVacancyNo7.png", @@ -1325,7 +1342,8 @@ 250, 255 ], - "templThreshold": 0.95 + "templThreshold": 0.95, + "rearDelay": 1000 }, "InfrastClue": { "template": "Clue.png", @@ -1358,5 +1376,48 @@ 300, 100 ] + }, + "InfrastClueNew": { + "template": "ClueNew.png", + "action": "clickSelf", + "roi": [ + 1000, + 0, + 280, + 720 + ], + "cache": false, + "rectMove": [ + -45, + 15, + 60, + 60 + ], + "next": [ + "GetClue1", + "GetClue2" + ] + }, + "GetClue1": { + "template": "GetClue1.png", + "action": "clickSelf", + "cache": false, + "next": [ + "InfrastClueNew" + ] + }, + "GetClue2": { + "template": "GetClue2.png", + "action": "clickSelf", + "cache": false, + "next": [ + "InfrastClueNew" + ] + }, + "UnlockClues": { + "template": "UnlockClues.png", + "action": "clickSelf", + "cache": false, + "rearDelay": 2000 } } \ No newline at end of file diff --git a/resource/template/AddOperatorReception.png b/resource/template/AddOperatorReception.png new file mode 100644 index 0000000000..9c9f1e5656 Binary files /dev/null and b/resource/template/AddOperatorReception.png differ diff --git a/resource/template/Bskill_meet_blacksteel2.png b/resource/template/Bskill_meet_blacksteel2.png new file mode 100644 index 0000000000..171d599b31 Binary files /dev/null and b/resource/template/Bskill_meet_blacksteel2.png differ diff --git a/resource/template/Bskill_meet_flag_rhine.png b/resource/template/Bskill_meet_flag_rhine.png new file mode 100644 index 0000000000..1a0cd7152b Binary files /dev/null and b/resource/template/Bskill_meet_flag_rhine.png differ diff --git a/resource/template/Bskill_meet_flag_rhodes.png b/resource/template/Bskill_meet_flag_rhodes.png new file mode 100644 index 0000000000..ef2bfe3dac Binary files /dev/null and b/resource/template/Bskill_meet_flag_rhodes.png differ diff --git a/resource/template/Bskill_meet_flag_ursus.png b/resource/template/Bskill_meet_flag_ursus.png new file mode 100644 index 0000000000..3fa8eba997 Binary files /dev/null and b/resource/template/Bskill_meet_flag_ursus.png differ diff --git a/resource/template/Bskill_meet_glasgow2.png b/resource/template/Bskill_meet_glasgow2.png new file mode 100644 index 0000000000..cd2715afe4 Binary files /dev/null and b/resource/template/Bskill_meet_glasgow2.png differ diff --git a/resource/template/Bskill_meet_kjerag2.png b/resource/template/Bskill_meet_kjerag2.png new file mode 100644 index 0000000000..50d692a809 Binary files /dev/null and b/resource/template/Bskill_meet_kjerag2.png differ diff --git a/resource/template/Bskill_meet_penguin1.png b/resource/template/Bskill_meet_penguin1.png new file mode 100644 index 0000000000..c6df6b0987 Binary files /dev/null and b/resource/template/Bskill_meet_penguin1.png differ diff --git a/resource/template/Bskill_meet_penguin2.png b/resource/template/Bskill_meet_penguin2.png new file mode 100644 index 0000000000..82d018d6c2 Binary files /dev/null and b/resource/template/Bskill_meet_penguin2.png differ diff --git a/resource/template/Bskill_meet_rhine2.png b/resource/template/Bskill_meet_rhine2.png new file mode 100644 index 0000000000..b20de0064c Binary files /dev/null and b/resource/template/Bskill_meet_rhine2.png differ diff --git a/resource/template/Bskill_meet_rhodes1.png b/resource/template/Bskill_meet_rhodes1.png new file mode 100644 index 0000000000..279d38e4a3 Binary files /dev/null and b/resource/template/Bskill_meet_rhodes1.png differ diff --git a/resource/template/Bskill_meet_rhodes2.png b/resource/template/Bskill_meet_rhodes2.png new file mode 100644 index 0000000000..911f856426 Binary files /dev/null and b/resource/template/Bskill_meet_rhodes2.png differ diff --git a/resource/template/Bskill_meet_spd1.png b/resource/template/Bskill_meet_spd1.png new file mode 100644 index 0000000000..8dc62b17d3 Binary files /dev/null and b/resource/template/Bskill_meet_spd1.png differ diff --git a/resource/template/Bskill_meet_spd2.png b/resource/template/Bskill_meet_spd2.png new file mode 100644 index 0000000000..b591175409 Binary files /dev/null and b/resource/template/Bskill_meet_spd2.png differ diff --git a/resource/template/Bskill_meet_spd3.png b/resource/template/Bskill_meet_spd3.png new file mode 100644 index 0000000000..991c2abfd3 Binary files /dev/null and b/resource/template/Bskill_meet_spd3.png differ diff --git a/resource/template/Bskill_meet_ursus1.png b/resource/template/Bskill_meet_ursus1.png new file mode 100644 index 0000000000..a05208b7d9 Binary files /dev/null and b/resource/template/Bskill_meet_ursus1.png differ diff --git a/resource/template/Bskill_meet_ursus2.png b/resource/template/Bskill_meet_ursus2.png new file mode 100644 index 0000000000..42c6d1bb2c Binary files /dev/null and b/resource/template/Bskill_meet_ursus2.png differ diff --git a/resource/template/CloseCluePage.png b/resource/template/CloseCluePage.png new file mode 100644 index 0000000000..bfc6379240 Binary files /dev/null and b/resource/template/CloseCluePage.png differ diff --git a/resource/template/ClueNew.png b/resource/template/ClueNew.png new file mode 100644 index 0000000000..895c8deb87 Binary files /dev/null and b/resource/template/ClueNew.png differ diff --git a/resource/template/GetClue1.png b/resource/template/GetClue1.png new file mode 100644 index 0000000000..4a6104fa86 Binary files /dev/null and b/resource/template/GetClue1.png differ diff --git a/resource/template/GetClue2.png b/resource/template/GetClue2.png new file mode 100644 index 0000000000..c04446854f Binary files /dev/null and b/resource/template/GetClue2.png differ diff --git a/src/MeoAssistance/Assistance.cpp b/src/MeoAssistance/Assistance.cpp index d2614aabce..024a75ae91 100644 --- a/src/MeoAssistance/Assistance.cpp +++ b/src/MeoAssistance/Assistance.cpp @@ -291,6 +291,8 @@ bool asst::Assistance::start_infrast_shift(const std::vector& order power_task_ptr->set_task_chain(InfrastTaskCahin); auto office_task_ptr = std::make_shared(task_callback, (void*)this); office_task_ptr->set_task_chain(InfrastTaskCahin); + auto recpt_task_ptr = std::make_shared(task_callback, (void*)this); + recpt_task_ptr->set_task_chain(InfrastTaskCahin); for (const auto& facility : order) { if (facility == "Dorm") { @@ -314,6 +316,9 @@ bool asst::Assistance::start_infrast_shift(const std::vector& order else if (facility == "Office") { m_tasks_deque.emplace_back(office_task_ptr); } + else if (facility == "Reception") { + m_tasks_deque.emplace_back(recpt_task_ptr); + } else { log.error("start_infrast_shift | Unknown facility", facility); } diff --git a/src/MeoAssistance/InfrastProductionTask.cpp b/src/MeoAssistance/InfrastProductionTask.cpp index 3b5456abef..a0575710cc 100644 --- a/src/MeoAssistance/InfrastProductionTask.cpp +++ b/src/MeoAssistance/InfrastProductionTask.cpp @@ -322,6 +322,8 @@ bool asst::InfrastProductionTask::opers_choose() if (!skills_analyzer.analyze()) { return false; } + skills_analyzer.sort_result(); + auto cur_all_info = skills_analyzer.get_result(); std::vector selected_hash; @@ -335,6 +337,7 @@ bool asst::InfrastProductionTask::opers_choose() continue; } if (find_iter->selected == true) { + cur_all_info.erase(find_iter); continue; } ctrler.click(find_iter->rect); diff --git a/src/MeoAssistance/InfrastReceptionTask.cpp b/src/MeoAssistance/InfrastReceptionTask.cpp index a8747403a0..f5d7f7a59e 100644 --- a/src/MeoAssistance/InfrastReceptionTask.cpp +++ b/src/MeoAssistance/InfrastReceptionTask.cpp @@ -4,9 +4,72 @@ #include "Resource.h" #include "InfrastClueVacancyImageAnalyzer.h" #include "InfrastClueImageAnalyzer.h" +#include "MatchImageAnalyzer.h" #include "Logger.hpp" +#include "ProcessTaskImageAnalyzer.h" + +const std::string asst::InfrastReceptionTask::FacilityName = "Reception"; bool asst::InfrastReceptionTask::run() +{ + json::value task_start_json = json::object{ + { "task_type", "InfrastReceptionTask" }, + { "task_chain", m_task_chain} + }; + m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); + + set_facility(FacilityName); + m_all_available_opers.clear(); + + swipe_to_the_right_of_main_ui(); + enter_facility(FacilityName, 0); + click_bottomleft_tab(); + + harvest_clue(); + proc_clue(); + + click_return_button(); + click_bottomleft_tab(); + + shift(); + + return true; +} + +bool asst::InfrastReceptionTask::harvest_clue() +{ + std::vector tasks_vec = { "InfrastClueNew" }; + while (!tasks_vec.empty()) { + ProcessTaskImageAnalyzer analyzer(ctrler.get_image(), tasks_vec); + if (!analyzer.analyze()) { + break; + } + auto task_info_ptr = analyzer.get_result(); + Rect rect = analyzer.get_rect(); + const auto& res_move = task_info_ptr->rect_move; + if (!res_move.empty()) { + rect.x += res_move.x; + rect.y += res_move.y; + rect.width = res_move.width; + rect.height = res_move.height; + } + sleep(task_info_ptr->pre_delay); + if (task_info_ptr->action == ProcessTaskAction::ClickSelf) { + ctrler.click(rect); + } + else { + log.error("InfrastReceptionTask::harvest_clue only support ClickSelf"); + return false; + } + int defalut_sleep = resource.cfg().get_options().task_delay; + sleep(task_info_ptr->rear_delay + defalut_sleep); + tasks_vec = task_info_ptr->next; + } + + return true; +} + +bool asst::InfrastReceptionTask::proc_clue() { const static std::string clue_vacancy = "InfrastClueVacancy"; const static std::vector clue_suffix = { @@ -37,16 +100,69 @@ bool asst::InfrastReceptionTask::run() ctrler.click(clue_analyzer.get_result().back().first); sleep(delay); } + // 开启线索交流,“解锁线索” + image = ctrler.get_image(); + MatchImageAnalyzer unlock_analyzer(image); + const auto unlock_task_ptr = std::dynamic_pointer_cast( + resource.task().task_ptr("UnlockClues")); + unlock_analyzer.set_task_info(*unlock_task_ptr); + if (unlock_analyzer.analyze()) { + ctrler.click(unlock_analyzer.get_result().rect); + sleep(unlock_task_ptr->rear_delay); + click_bottomleft_tab(); + image = ctrler.get_image(); + } + // 所有的空位分析一次,看看还缺哪些线索 InfrastClueVacancyImageAnalyzer vacancy_analyzer(image); vacancy_analyzer.set_to_be_analyzed(clue_suffix); if (!vacancy_analyzer.analyze()) { } - for (auto&& [id, _] : vacancy_analyzer.get_vacancy()) { + const auto& vacancy = vacancy_analyzer.get_vacancy(); + for (auto&& [id, _] : vacancy) { log.trace("InfrastReceptionTask | Vacancy", id); } - return false; + std::string product; + if (vacancy.size() == 1) { + product = vacancy.begin()->first; + } + else { + product = "General"; + } + log.trace("InfrastReceptionTask | product", product); + set_product(product); + + return true; +} + +bool asst::InfrastReceptionTask::shift() +{ + const auto& image = ctrler.get_image(); + MatchImageAnalyzer add_analyzer(image); + + const auto add_task_ptr = std::dynamic_pointer_cast( + resource.task().task_ptr("InfrastAddOperator" + m_facility)); + add_analyzer.set_task_info(*add_task_ptr); + + if (!add_analyzer.analyze()) { + return true; + } + ctrler.click(add_analyzer.get_result().rect); + sleep(add_task_ptr->rear_delay); + + swipe_to_the_left_of_operlist(); + click_clear_button(); + + opers_detect_with_swipe(); + swipe_to_the_left_of_operlist(); + + optimal_calc(); + opers_choose(); + + click_confirm_button(); + + return true; } bool asst::InfrastReceptionTask::swipe_to_the_bottom_of_clue_list_on_the_right() diff --git a/src/MeoAssistance/InfrastReceptionTask.h b/src/MeoAssistance/InfrastReceptionTask.h index bb60b2256d..cc1c647735 100644 --- a/src/MeoAssistance/InfrastReceptionTask.h +++ b/src/MeoAssistance/InfrastReceptionTask.h @@ -8,7 +8,12 @@ namespace asst { using InfrastProductionTask::InfrastProductionTask; virtual ~InfrastReceptionTask() = default; virtual bool run() override; + + const static std::string FacilityName; private: + bool harvest_clue(); + bool proc_clue(); + bool shift(); bool swipe_to_the_bottom_of_clue_list_on_the_right(); }; } diff --git a/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp b/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp index 142c429018..8f89daa37b 100644 --- a/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp +++ b/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp @@ -21,6 +21,21 @@ bool asst::InfrastSkillsImageAnalyzer::analyze() return true; } +void asst::InfrastSkillsImageAnalyzer::sort_result() +{ + // 按位置排个序 + std::sort(m_result.begin(), m_result.end(), + [](const auto& lhs, const auto& rhs) -> bool { + if (std::abs(lhs.rect.x - rhs.rect.x) < 5) { // x差距较小则理解为是同一排的,按y排序 + return lhs.rect.y < rhs.rect.y; + } + else { + return lhs.rect.x < rhs.rect.x; + } + } + ); +} + bool asst::InfrastSkillsImageAnalyzer::skills_detect() { const auto upper_task_ptr = resource.task().task_ptr("InfrastSkillsUpper"); @@ -192,7 +207,8 @@ bool asst::InfrastSkillsImageAnalyzer::skill_analyze() if (size_t find_pos = skill.id.find(base_id); find_pos != std::string::npos) { std::string cur_skill_level = skill.id.substr(base_id.size()); - if (cur_skill_level > max_level) { + if (max_level.empty() + || cur_skill_level > max_level) { max_level = cur_skill_level; most_confident_skills = skill; } diff --git a/src/MeoAssistance/InfrastSkillsImageAnalyzer.h b/src/MeoAssistance/InfrastSkillsImageAnalyzer.h index 26f7eab598..5a16c7f8f5 100644 --- a/src/MeoAssistance/InfrastSkillsImageAnalyzer.h +++ b/src/MeoAssistance/InfrastSkillsImageAnalyzer.h @@ -15,6 +15,8 @@ namespace asst { virtual ~InfrastSkillsImageAnalyzer() = default; virtual bool analyze() override; + void sort_result(); + const std::vector& get_result() const noexcept { return m_result; } diff --git a/src/MeoAssistance/ProcessTask.cpp b/src/MeoAssistance/ProcessTask.cpp index e77351ea1b..df5814142a 100644 --- a/src/MeoAssistance/ProcessTask.cpp +++ b/src/MeoAssistance/ProcessTask.cpp @@ -39,11 +39,6 @@ bool ProcessTask::run() rect.height = res_move.height; } - if (!task_info_ptr) { - m_callback(AsstMsg::ProcessTaskNotMatched, task_start_json, m_callback_arg); - return false; - } - json::value callback_json = json::object{ { "name", task_info_ptr->name }, { "type", static_cast(task_info_ptr->action) }, diff --git a/src/MeoAsstGui/ViewModels/InfrastructureConstructionViewModel.cs b/src/MeoAsstGui/ViewModels/InfrastructureConstructionViewModel.cs index de83539330..10173a7cb7 100644 --- a/src/MeoAsstGui/ViewModels/InfrastructureConstructionViewModel.cs +++ b/src/MeoAsstGui/ViewModels/InfrastructureConstructionViewModel.cs @@ -25,6 +25,7 @@ namespace MeoAsstGui facility_key.Add("制造站", "Mfg"); facility_key.Add("贸易站", "Trade"); facility_key.Add("发电站", "Power"); + facility_key.Add("会客室", "Reception"); facility_key.Add("办公室", "Office"); _dormThresholdLabel = "宿舍入驻心情阈值:" + _dormThreshold + "%"; @@ -50,9 +51,9 @@ namespace MeoAsstGui ItemViewModels.Add(new ItemViewModel(2, "制造站")); ItemViewModels.Add(new ItemViewModel(3, "贸易站")); ItemViewModels.Add(new ItemViewModel(4, "发电站")); - ItemViewModels.Add(new ItemViewModel(5, "办公室")); - ItemViewModels.Add(new ItemViewModel(6, "宿舍")); - //ItemViewModels.Add(new ItemViewModel(7, "会客室")); + ItemViewModels.Add(new ItemViewModel(5, "会客室")); + ItemViewModels.Add(new ItemViewModel(6, "办公室")); + ItemViewModels.Add(new ItemViewModel(7, "宿舍")); //ItemViewModels.Add(new ItemViewModel(8, "控制中枢")); } diff --git a/src/MeoAsstGui/Views/InfrastructureConstructionView.xaml b/src/MeoAsstGui/Views/InfrastructureConstructionView.xaml index 689bf91ab8..c3f9ec8c27 100644 --- a/src/MeoAsstGui/Views/InfrastructureConstructionView.xaml +++ b/src/MeoAsstGui/Views/InfrastructureConstructionView.xaml @@ -61,6 +61,6 @@ + Text="基建换班功能仍处于测试阶段,BUG较多,请酌情使用!(暂不支持控制中枢)" /> \ No newline at end of file