From 3d9dad8e07398ef0b4e00e1c3333c3d29ddbdf81 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 12 Sep 2021 23:55:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BA=E5=9F=BA=E5=BB=BA=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9B=9E=E8=B0=83=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/config.json | 1 + src/MeoAssistance/AbstractTask.cpp | 17 +++--- src/MeoAssistance/AbstractTask.h | 1 + src/MeoAssistance/Assistance.cpp | 7 ++- src/MeoAssistance/AsstMsg.h | 68 ++++++++++++--------- src/MeoAssistance/InfrastAbstractTask.cpp | 25 ++++++++ src/MeoAssistance/InfrastAbstractTask.h | 3 + src/MeoAssistance/InfrastDormTask.cpp | 25 +++++++- src/MeoAssistance/InfrastDormTask.h | 1 + src/MeoAssistance/InfrastOfficeTask.cpp | 19 +++++- src/MeoAssistance/InfrastPowerTask.cpp | 28 +++++++-- src/MeoAssistance/InfrastProductionTask.cpp | 22 ++++++- src/MeoAssistance/WinMacro.cpp | 8 +-- src/MeoAssistance/WinMacro.h | 4 +- src/MeoAsstGui/Helper/AsstProxy.cs | 56 ++++++++++------- 15 files changed, 209 insertions(+), 76 deletions(-) diff --git a/resource/config.json b/resource/config.json index d41c164881..5ab4d91f3e 100644 --- a/resource/config.json +++ b/resource/config.json @@ -152,6 +152,7 @@ "ClickCorner_Doc": "点击右下角,既不会点到掉落物品,又能点到蓝色开始按钮(为了容错)的一块位置。", "algorithm": "justreturn", "action": "clickRect", + "rearDelay": 2000, "specificArea": [ 1100, 700, diff --git a/src/MeoAssistance/AbstractTask.cpp b/src/MeoAssistance/AbstractTask.cpp index 5280cba1ac..83726cf018 100644 --- a/src/MeoAssistance/AbstractTask.cpp +++ b/src/MeoAssistance/AbstractTask.cpp @@ -60,10 +60,10 @@ bool AbstractTask::sleep(unsigned millisecond) bool AbstractTask::print_window(const std::string& dir) { - const cv::Mat& image = m_controller_ptr->get_image(true); - if (image.empty()) { - return false; - } + //const cv::Mat& image = m_controller_ptr->get_image(true); + //if (image.empty()) { + // return false; + //} // 现在用adb直接截图了,不用裁剪了 //// 保存的截图额外再裁剪掉一圈,不然企鹅物流识别不出来 //int offset = Configer::get_instance().m_options.print_window_crop_offset; @@ -73,15 +73,18 @@ bool AbstractTask::print_window(const std::string& dir) const std::string time_str = StringReplaceAll(StringReplaceAll(GetFormatTimeString(), " ", "_"), ":", "-"); const std::string filename = dir + time_str + ".png"; - bool ret = cv::imwrite(filename.c_str(), image); + //bool ret = cv::imwrite(filename.c_str(), image); + + // 直接把Adb上次pull出来的拷贝过去就行了 + std::filesystem::copy(m_controller_ptr->ScreenFilename, filename); json::value callback_json; callback_json["filename"] = filename; - callback_json["ret"] = ret; + callback_json["ret"] = true; callback_json["offset"] = 0; m_callback(AsstMsg::PrintWindow, callback_json, m_callback_arg); - return ret; + return true; } bool asst::AbstractTask::need_exit() const noexcept diff --git a/src/MeoAssistance/AbstractTask.h b/src/MeoAssistance/AbstractTask.h index 58c36e20c7..45ec43c3ab 100644 --- a/src/MeoAssistance/AbstractTask.h +++ b/src/MeoAssistance/AbstractTask.h @@ -29,6 +29,7 @@ namespace asst { virtual int get_retry_times() { return m_retry_times; } virtual void set_task_chain(std::string name) { m_task_chain = std::move(name); } virtual const std::string& get_task_chain() { return m_task_chain; } + virtual void on_run_fails(int retry_times) { ; } protected: virtual bool sleep(unsigned millisecond); virtual bool print_window(const std::string& dir); diff --git a/src/MeoAssistance/Assistance.cpp b/src/MeoAssistance/Assistance.cpp index 5a754cae8b..1406ff9d35 100644 --- a/src/MeoAssistance/Assistance.cpp +++ b/src/MeoAssistance/Assistance.cpp @@ -459,6 +459,7 @@ void Assistance::working_proc() ++retry_times; // 执行失败再还原回去 m_tasks_deque.emplace_front(task_ptr); + task_ptr->on_run_fails(retry_times); } } @@ -515,9 +516,9 @@ void Assistance::task_callback(AsstMsg msg, const json::value& detail, void* cus case AsstMsg::ImageIsEmpty: p_this->stop(false); break; - case AsstMsg::WindowMinimized: - p_this->m_controller_ptr->show_window(); - break; + //case AsstMsg::WindowMinimized: + // p_this->m_controller_ptr->show_window(); + // break; case AsstMsg::AppendProcessTask: more_detail["type"] = "ProcessTask"; [[fallthrough]]; diff --git a/src/MeoAssistance/AsstMsg.h b/src/MeoAssistance/AsstMsg.h index 6460e3b4f1..d18b4fc690 100644 --- a/src/MeoAssistance/AsstMsg.h +++ b/src/MeoAssistance/AsstMsg.h @@ -10,34 +10,41 @@ namespace asst { enum class AsstMsg { /* Error Msg */ - PtrIsNull, - ImageIsEmpty, - WindowMinimized, - InitFaild, - /* Info Msg */ - TaskStart, - ImageFindResult, - ImageMatched, - TaskMatched, - ReachedLimit, - ReadyToSleep, - EndOfSleep, - AppendProcessTask, // 这个消息Assistance会新增任务,外部不需要处理 - AppendTask, // 这个消息Assistance会新增任务,外部不需要处理 - TaskCompleted, - PrintWindow, - TaskStop, - TaskError, + PtrIsNull, // 指针为空 + ImageIsEmpty, // 图像为空 + WindowMinimized, // [已弃用] 窗口被最小化了 + InitFaild, // 初始化失败 + TaskError, // 任务错误(任务一直出错,retry次数达到上限) + OcrResultError, // Ocr识别结果错误 + /* Info Msg: about Task */ + TaskStart = 1000, // 任务开始 + TaskMatched, // 任务匹配成功 + ReachedLimit, // 单个原子任务达到次数上限 + ReadyToSleep, // 准备开始睡眠 + EndOfSleep, // 睡眠结束 + AppendProcessTask, // 新增流程任务,Assistance内部消息,外部不需要处理 + AppendTask, // 新增任务,Assistance内部消息,外部不需要处理 + TaskCompleted, // 单个原子任务完成 + PrintWindow, // 截图消息 + TaskStop, // 任务停止 + /* Info Msg: about Identify */ + TextDetected = 2000, // 识别到文字 + ImageFindResult, // 查找图像的结果 + ImageMatched, // 图像匹配成功 /* Open Recruit Msg */ - TextDetected, - RecruitTagsDetected, - OcrResultError, - RecruitSpecialTag, - RecruitResult, - /* Infrast Msg*/ - OpersDetected, // 识别到了干员s - OpersIdtfResult, // 干员识别结果(总的) - InfrastComb // 当前设置的最优干员组合 + RecruitTagsDetected = 3000, // 公招识别到了Tags + RecruitSpecialTag, // 公招识别到了特殊的Tag + RecruitResult, // 公开招募结果 + /* Infrast Msg */ + OpersDetected = 4000, // 识别到了干员s + OpersIdtfResult, // 干员识别结果(总的) + InfrastComb, // 当前房间的最优干员组合 + EnterStation, // 进入某个房间 + StationInfo, // 当前房间信息 + ReadyToShift, // 准备换班 + ShiftCompleted, // 换班完成(单个房间) + NoNeedToShift // 无需换班(单个房间) + }; static std::ostream& operator<<(std::ostream& os, const AsstMsg& type) @@ -67,7 +74,12 @@ namespace asst { {AsstMsg::AppendTask, "AppendTask"}, {AsstMsg::OpersDetected, "OpersDetected"}, {AsstMsg::OpersIdtfResult, "OpersIdtfResult"}, - {AsstMsg::InfrastComb, "InfrastComb"} + {AsstMsg::InfrastComb, "InfrastComb"}, + {AsstMsg::EnterStation, "EnterStation"}, + {AsstMsg::StationInfo, "StationInfo"}, + {AsstMsg::ReadyToShift, "ReadyToShift"}, + {AsstMsg::ShiftCompleted, "ShiftCompleted"}, + {AsstMsg::NoNeedToShift, "NoNeedToShift"} }; return os << _type_name.at(type); } diff --git a/src/MeoAssistance/InfrastAbstractTask.cpp b/src/MeoAssistance/InfrastAbstractTask.cpp index 10e4b54123..87fe4876f4 100644 --- a/src/MeoAssistance/InfrastAbstractTask.cpp +++ b/src/MeoAssistance/InfrastAbstractTask.cpp @@ -310,21 +310,46 @@ bool asst::InfrastAbstractTask::enter_station(const std::vector& te cv::Mat image = m_controller_ptr->get_image(); std::vector max_score_reslut; + json::value callback_json; + callback_json["algorithm"] = "MatchTemplate"; + callback_json["threshold"] = threshold; + + std::string max_score_name; for (const auto& templ : templ_names) { auto cur_result = m_identify_ptr->find_all_images(image, templ, threshold); + callback_json["name"] = templ; + if (cur_result.empty()) { + callback_json["value"] = 0; + callback_json["rect"] = json::array({ 0, 0, 0, 0 }); + m_callback(AsstMsg::ImageFindResult, callback_json, m_callback_arg); continue; } + Rect& rect = cur_result.at(0).rect; + callback_json["value"] = cur_result.at(0).score; + callback_json["rect"] = json::array({ rect.x, rect.y, rect.width, rect.height }); + m_callback(AsstMsg::ImageFindResult, callback_json, m_callback_arg); + if (max_score_reslut.empty() || cur_result.at(0).score > max_score_reslut.at(0).score) { // find_all_image里是排过序的,直接取第一个就是最大得分 max_score_reslut = std::move(cur_result); + max_score_name = templ; } } if (max_score_reslut.empty()) { + DebugTraceError("The number of matches is empty"); return false; } + callback_json["name"] = max_score_name; + Rect& rect = max_score_reslut.at(0).rect; + callback_json["size"] = max_score_reslut.size(); + callback_json["value"] = max_score_reslut.at(0).score; + callback_json["rect"] = json::array({ rect.x, rect.y, rect.width, rect.height }); + m_callback(AsstMsg::ImageMatched, callback_json, m_callback_arg); + if (index >= max_score_reslut.size()) { + DebugTraceError("The number of matches is too few", index, max_score_reslut.size()); return false; } diff --git a/src/MeoAssistance/InfrastAbstractTask.h b/src/MeoAssistance/InfrastAbstractTask.h index f0e2810c56..830baf73cd 100644 --- a/src/MeoAssistance/InfrastAbstractTask.h +++ b/src/MeoAssistance/InfrastAbstractTask.h @@ -10,6 +10,9 @@ namespace asst { InfrastAbstractTask(AsstCallback callback, void* callback_arg); virtual ~InfrastAbstractTask() = default; virtual bool run() = 0; + virtual void on_run_fails(int retry_times) override { + append_task_to_back_to_infrast_home(); + } protected: virtual bool swipe_to_the_left(); // 滑动到最左侧 virtual bool click_clear_button(); diff --git a/src/MeoAssistance/InfrastDormTask.cpp b/src/MeoAssistance/InfrastDormTask.cpp index 0b4bed80c9..cfa6567f9b 100644 --- a/src/MeoAssistance/InfrastDormTask.cpp +++ b/src/MeoAssistance/InfrastDormTask.cpp @@ -20,9 +20,14 @@ bool asst::InfrastDormTask::run() return false; } + json::value task_start_json = json::object{ + { "task_type", "InfrastDormTask" }, + { "task_chain", m_task_chain} + }; + m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); + bool ret = enter_station({ "Dorm", "DormMini" }, m_dorm_begin, 0.8); if (!ret) { - append_task_to_back_to_infrast_home(); return false; } @@ -39,6 +44,14 @@ bool asst::InfrastDormTask::run() else { to_left = true; // 第一个进入的宿舍需要滑动到最左侧一下。后面的宿舍都不用了 } + if (!ret) { + return false; + } + json::value enter_json; + enter_json["station"] = "Dorm"; + enter_json["index"] = dorm_index; + m_callback(AsstMsg::EnterStation, enter_json, m_callback_arg); + enter_operator_selection(); int selected = select_operators(to_left); if (selected == -1) { @@ -51,6 +64,8 @@ bool asst::InfrastDormTask::run() } m_dorm_begin = dorm_index; + m_callback(AsstMsg::TaskCompleted, task_start_json, m_callback_arg); + return ret; } @@ -168,10 +183,14 @@ int asst::InfrastDormTask::select_operators(bool need_to_the_left) } cv::Mat image = m_controller_ptr->get_image(); + json::value shift_json; + shift_json["station"] = "Dorm"; + // 识别“休息中”的干员 auto resting_result = m_identify_ptr->find_all_images(image, "Resting", 0.8); if (resting_result.size() == MaxOperNumInDorm) { // 如果所有人都在休息,那这个宿舍不用换班,直接关了 click_return_button(); + m_callback(AsstMsg::NoNeedToShift, shift_json, m_callback_arg); return resting_result.size(); } @@ -182,6 +201,8 @@ int asst::InfrastDormTask::select_operators(bool need_to_the_left) double mood_threshold = Configer::get_instance().m_infrast_options.dorm_threshold; auto work_mood_result = detect_mood_status_at_work(image, mood_threshold); + m_callback(AsstMsg::ReadyToShift, shift_json, m_callback_arg); + click_clear_button(); // 把“休息中”的干员,都再次选上 for (const auto& resting : resting_result) { @@ -207,6 +228,7 @@ int asst::InfrastDormTask::select_operators(bool need_to_the_left) } if (count >= MaxOperNumInDorm) { click_confirm_button(); + m_callback(AsstMsg::ShiftCompleted, shift_json, m_callback_arg); return count; } @@ -236,6 +258,7 @@ int asst::InfrastDormTask::select_operators(bool need_to_the_left) } click_confirm_button(); + m_callback(AsstMsg::ShiftCompleted, shift_json, m_callback_arg); return count; } diff --git a/src/MeoAssistance/InfrastDormTask.h b/src/MeoAssistance/InfrastDormTask.h index 41fc14158e..0bf9f31771 100644 --- a/src/MeoAssistance/InfrastDormTask.h +++ b/src/MeoAssistance/InfrastDormTask.h @@ -10,6 +10,7 @@ namespace asst { virtual ~InfrastDormTask() = default; virtual bool run() override; + bool set_dorm_begin(int index) { if (index < 0 || index >= DormNum) { return false; diff --git a/src/MeoAssistance/InfrastOfficeTask.cpp b/src/MeoAssistance/InfrastOfficeTask.cpp index 85b297fbc5..f215a99bd5 100644 --- a/src/MeoAssistance/InfrastOfficeTask.cpp +++ b/src/MeoAssistance/InfrastOfficeTask.cpp @@ -13,15 +13,32 @@ bool asst::InfrastOfficeTask::run() return false; } + json::value task_start_json = json::object{ + { "task_type", "InfrastOfficeTask" }, + { "task_chain", m_task_chain} + }; + m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); + bool ret = swipe_right(); ret &= enter_station({ "Office", "OfficeMini" }, 0); if (!ret) { - append_task_to_back_to_infrast_home(); return false; } + json::value enter_json; + enter_json["station"] = "Office"; + enter_json["index"] = 0; + m_callback(AsstMsg::EnterStation, enter_json, m_callback_arg); + if (enter_operator_selection()) { + m_callback(AsstMsg::ReadyToShift, enter_json, m_callback_arg); select_operators(true); + m_callback(AsstMsg::ShiftCompleted, enter_json, m_callback_arg); } + else { + m_callback(AsstMsg::NoNeedToShift, enter_json, m_callback_arg); + } + m_callback(AsstMsg::TaskCompleted, task_start_json, m_callback_arg); + return true; } diff --git a/src/MeoAssistance/InfrastPowerTask.cpp b/src/MeoAssistance/InfrastPowerTask.cpp index 8284e02c53..a957b19099 100644 --- a/src/MeoAssistance/InfrastPowerTask.cpp +++ b/src/MeoAssistance/InfrastPowerTask.cpp @@ -13,21 +13,36 @@ bool asst::InfrastPowerTask::run() return false; } + json::value task_start_json = json::object{ + { "task_type", "InfrastPowerTask" }, + { "task_chain", m_task_chain} + }; + m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); + bool is_the_left = false; for (int i = 0; i != PowerNum; ++i) { if (need_exit()) { return false; } swipe_left(); - enter_station({ "Power", "PowerMini" }, i); + if (!enter_station({ "Power", "PowerMini" }, i)) { + return false; + } + json::value enter_json; + enter_json["station"] = "Power"; + enter_json["index"] = i; + m_callback(AsstMsg::EnterStation, enter_json, m_callback_arg); + if (enter_operator_selection()) { - if (is_the_left) { - select_operators(false); - } - else { - select_operators(true); + m_callback(AsstMsg::ReadyToShift, enter_json, m_callback_arg); + select_operators(!is_the_left); + if (!is_the_left) { is_the_left = true; } + m_callback(AsstMsg::ShiftCompleted, enter_json, m_callback_arg); + } + else { + m_callback(AsstMsg::NoNeedToShift, enter_json, m_callback_arg); } if (!sleep(1000)) { return false; @@ -37,6 +52,7 @@ bool asst::InfrastPowerTask::run() return false; } } + m_callback(AsstMsg::TaskCompleted, task_start_json, m_callback_arg); return true; } diff --git a/src/MeoAssistance/InfrastProductionTask.cpp b/src/MeoAssistance/InfrastProductionTask.cpp index 30d9d78357..3aba1f30ef 100644 --- a/src/MeoAssistance/InfrastProductionTask.cpp +++ b/src/MeoAssistance/InfrastProductionTask.cpp @@ -25,6 +25,12 @@ bool asst::InfrastProductionTask::run() return false; } + json::value task_start_json = json::object{ + { "task_type", "InfrastProductionTask" }, + { "task_chain", m_task_chain} + }; + m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); + cv::Mat image = m_controller_ptr->get_image(); // 先识别一下有几个制造站/贸易站 const static std::array facility_number_key = { "02", "03", "04", "05" }; @@ -50,10 +56,16 @@ bool asst::InfrastProductionTask::run() sleep(300); image = m_controller_ptr->get_image(); } + json::value enter_json; + enter_json["station"] = "Production"; + enter_json["index"] = i; + m_callback(AsstMsg::EnterStation, enter_json, m_callback_arg); + // 如果当前界面没有添加干员的按钮,那就不换班 auto&& [algorithm1, score1, add_rect1] = m_identify_ptr->find_image(image, "AddOperator"); auto&& [algorithm2, score2, add_rect2] = m_identify_ptr->find_image(image, "AddOperator-Trade"); if (score1 < Configer::TemplThresholdDefault && score2 < Configer::TemplThresholdDefault) { + m_callback(AsstMsg::NoNeedToShift, enter_json, m_callback_arg); continue; } @@ -65,6 +77,11 @@ bool asst::InfrastProductionTask::run() break; } } + enter_json["production"] = m_facility; + m_callback(AsstMsg::StationInfo, enter_json, m_callback_arg); + + m_callback(AsstMsg::ReadyToShift, enter_json, m_callback_arg); + //点击添加干员的那个按钮 Rect add_rect = score1 >= score2 ? std::move(add_rect1) : std::move(add_rect2); m_controller_ptr->click(add_rect); @@ -82,8 +99,11 @@ bool asst::InfrastProductionTask::run() auto cur_opers_info = std::move(detect_ret.value()); // TODO,可以识别一次,把前6个最优解都列出来(最多6个制造站),然后就不用每次都识别并计算最优解了 std::list optimal_comb = calc_optimal_comb(cur_opers_info); - swipe_and_select(optimal_comb); + if (swipe_and_select(optimal_comb)) { + m_callback(AsstMsg::ShiftCompleted, enter_json, m_callback_arg); + } } + m_callback(AsstMsg::TaskCompleted, task_start_json, m_callback_arg); return true; } diff --git a/src/MeoAssistance/WinMacro.cpp b/src/MeoAssistance/WinMacro.cpp index e54651b4ab..4a5cb59fbf 100644 --- a/src/MeoAssistance/WinMacro.cpp +++ b/src/MeoAssistance/WinMacro.cpp @@ -19,7 +19,7 @@ using namespace asst; WinMacro::WinMacro(const EmulatorInfo& info) : m_emulator_info(info), m_rand_engine(std::chrono::system_clock::now().time_since_epoch().count()), - m_screen_filename(GetCurrentDir() + "adb_screen.png") + ScreenFilename(GetCurrentDir() + "adb_screen.png") { find_handle(); } @@ -123,10 +123,10 @@ bool WinMacro::find_handle() m_emulator_info.adb.screencap = StringReplaceAll( StringReplaceAll(m_emulator_info.adb.screencap, "[Adb]", adb_dir), - "[Filename]", m_screen_filename); + "[Filename]", ScreenFilename); m_emulator_info.adb.pullscreen = StringReplaceAll( StringReplaceAll(m_emulator_info.adb.pullscreen, "[Adb]", adb_dir), - "[Filename]", m_screen_filename); + "[Filename]", ScreenFilename); DebugTrace("Handle:", m_handle, "Name:", m_emulator_info.name); return true; @@ -305,7 +305,7 @@ cv::Mat asst::WinMacro::get_image(bool raw) if (!call_ret) { return cv::Mat(); } - cv::Mat raw_mat = cv::imread(m_screen_filename); + cv::Mat raw_mat = cv::imread(ScreenFilename); if (raw) { return raw_mat; } diff --git a/src/MeoAssistance/WinMacro.h b/src/MeoAssistance/WinMacro.h index 5053102535..08cdffa6a4 100644 --- a/src/MeoAssistance/WinMacro.h +++ b/src/MeoAssistance/WinMacro.h @@ -33,6 +33,8 @@ namespace asst { bool swipe(const Rect& r1, const Rect& r2, int duration = 0); bool swipe_without_scale(const Point& p1, const Point& p2, int duration = 0); bool swipe_without_scale(const Rect& r1, const Rect& r2, int duration = 0); + + const std::string ScreenFilename; private: bool find_handle(); std::optional call_command(const std::string& cmd, bool use_pipe = true); @@ -43,7 +45,5 @@ namespace asst { std::minstd_rand m_rand_engine; std::pair m_scale_size; double m_control_scale = 1.0; - - const std::string m_screen_filename; }; } diff --git a/src/MeoAsstGui/Helper/AsstProxy.cs b/src/MeoAsstGui/Helper/AsstProxy.cs index 2d00f8ecdb..6d48bdd4c2 100644 --- a/src/MeoAsstGui/Helper/AsstProxy.cs +++ b/src/MeoAsstGui/Helper/AsstProxy.cs @@ -266,29 +266,39 @@ namespace MeoAsstGui public enum AsstMsg { /* Error Msg */ - PtrIsNull, - ImageIsEmpty, - WindowMinimized, - InitFaild, - /* Info Msg */ - TaskStart, - ImageFindResult, - ImageMatched, - TaskMatched, - ReachedLimit, - ReadyToSleep, - EndOfSleep, - AppendProcessTask, - AppendTask, - TaskCompleted, - PrintWindow, - TaskStop, - TaskError, + PtrIsNull, // 指针为空 + ImageIsEmpty, // 图像为空 + WindowMinimized, // [已弃用] 窗口被最小化了 + InitFaild, // 初始化失败 + TaskError, // 任务错误(任务一直出错,retry次数达到上限) + OcrResultError, // Ocr识别结果错误 + /* Info Msg: about Task */ + TaskStart = 1000, // 任务开始 + TaskMatched, // 任务匹配成功 + ReachedLimit, // 单个原子任务达到次数上限 + ReadyToSleep, // 准备开始睡眠 + EndOfSleep, // 睡眠结束 + AppendProcessTask, // 新增流程任务,Assistance内部消息,外部不需要处理 + AppendTask, // 新增任务,Assistance内部消息,外部不需要处理 + TaskCompleted, // 单个原子任务完成 + PrintWindow, // 截图消息 + TaskStop, // 任务停止 + /* Info Msg: about Identify */ + TextDetected = 2000, // 识别到文字 + ImageFindResult, // 查找图像的结果 + ImageMatched, // 图像匹配成功 /* Open Recruit Msg */ - TextDetected, - RecruitTagsDetected, - OcrResultError, - RecruitSpecialTag, - RecruitResult + RecruitTagsDetected = 3000, // 公招识别到了Tags + RecruitSpecialTag, // 公招识别到了特殊的Tag + RecruitResult, // 公开招募结果 + /* Infrast Msg */ + OpersDetected = 4000, // 识别到了干员s + OpersIdtfResult, // 干员识别结果(总的) + InfrastComb, // 当前房间的最优干员组合 + EnterStation, // 进入某个房间 + StationInfo, // 当前房间信息 + ReadyToShift, // 准备换班 + ShiftCompleted, // 换班完成(单个房间) + NoNeedToShift // 无需换班(单个房间) }; } \ No newline at end of file