From 788a9566edd8a10c85f7107d8a69f5443d1f6cd9 Mon Sep 17 00:00:00 2001 From: MistEO Date: Fri, 24 Sep 2021 23:06:18 +0800 Subject: [PATCH] =?UTF-8?q?feat.=E7=95=8C=E9=9D=A2=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BF=A1=E7=94=A8=E8=B4=AD=E7=89=A9=E7=9A=84=E9=80=89=E9=A1=B9?= =?UTF-8?q?=EF=BC=8C=E7=9B=B8=E5=85=B3=E5=9B=9E=E8=B0=83=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=8F=8A=E6=8E=A5=E5=8F=A3=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/AsstCaller.h | 2 +- resource/tasks.json | 4 +- src/MeoAssistance/Assistance.cpp | 67 ++++++++++++------- src/MeoAssistance/Assistance.h | 2 +- src/MeoAssistance/AsstCaller.cpp | 4 +- src/MeoAssistance/AsstMsg.h | 6 +- src/MeoAssistance/ProcessTask.cpp | 2 +- src/MeoAsstGui/Helper/AsstProxy.cs | 26 +++---- .../UserControl/ParamSettingUserControl.xaml | 14 ++-- .../ViewModels/MainFunctionViewModel.cs | 24 ++++++- src/MeoAsstGui/Views/MainFunctionView.xaml | 6 +- src/MeoAsstGui/Views/RecruitView.xaml | 3 + 12 files changed, 98 insertions(+), 62 deletions(-) diff --git a/include/AsstCaller.h b/include/AsstCaller.h index 08c433644a..2460175686 100644 --- a/include/AsstCaller.h +++ b/include/AsstCaller.h @@ -17,7 +17,7 @@ extern "C" { bool MEOAPI AsstCatchRemote(void* p_asst, const char* address); bool MEOAPI AsstStartSanity(void* p_asst); - bool MEOAPI AsstStartVisit(void* p_asst); + bool MEOAPI AsstStartVisit(void* p_asst, bool with_shopping); bool MEOAPI AsstStartProcessTask(void* p_asst, const char* task); bool MEOAPI AsstStartOpenRecruit(void* p_asst, const int required_level[], int required_len, bool set_time); bool MEOAPI AsstStartIndertifyOpers(void* p_asst); diff --git a/resource/tasks.json b/resource/tasks.json index 139ec3d0a1..c40e485e7a 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -283,8 +283,8 @@ "action": "clickSelf", "next": [ "Mall", - "ReturnToMall", - "ReturnToMallConfirm" + "ReturnToMallConfirm", + "ReturnToMall" ] }, "ReturnToMallConfirm": { diff --git a/src/MeoAssistance/Assistance.cpp b/src/MeoAssistance/Assistance.cpp index 5329b4906e..31ecbe070b 100644 --- a/src/MeoAssistance/Assistance.cpp +++ b/src/MeoAssistance/Assistance.cpp @@ -26,6 +26,7 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg) // 检查返回值,若为false则回调错误 auto callback_error = [&](const std::string& filename = std::string()) { + DebugTraceError("Resource error", filename); if (m_callback == nullptr) { return; } @@ -37,22 +38,22 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg) bool ret = Configer::get_instance().load(GetResourceDir() + "config.json"); if (!ret) { - callback_error(); + callback_error("config.json"); return; } ret = TaskConfiger::get_instance().load(GetResourceDir() + "tasks.json"); if (!ret) { - callback_error(); + callback_error("tasks.json"); return; } ret = RecruitConfiger::get_instance().load(GetResourceDir() + "recruit.json"); if (!ret) { - callback_error(); + callback_error("recruit.json"); return; } ret = InfrastConfiger::get_instance().load(GetResourceDir() + "infrast.json"); if (!ret) { - callback_error(); + callback_error("infrast.json"); return; } @@ -66,7 +67,7 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg) std::string filename = std::dynamic_pointer_cast(info)->template_filename; ret = m_identify_ptr->add_image(name, GetResourceDir() + "template\\" + filename); if (!ret) { - callback_error(); + callback_error(filename); return; } } @@ -81,7 +82,7 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg) m_identify_ptr->set_ocr_param(Configer::get_instance().m_options.ocr_gpu_index, Configer::get_instance().m_options.ocr_thread_number); ret = m_identify_ptr->ocr_init_models(GetResourceDir() + "OcrLiteOnnx\\models\\"); if (!ret) { - callback_error(); + callback_error("OcrLiteOnnx\\models\\"); return; } @@ -101,10 +102,9 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg) } ret = UserConfiger::get_instance().load(GetCurrentDir() + "user.json"); if (!ret) { - callback_error(); + callback_error("user.json"); return; } - m_controller_ptr = std::make_shared(); @@ -225,9 +225,28 @@ bool asst::Assistance::start_sanity() return start_process_task("SanityBegin", ProcessTaskRetryTimesDefault); } -bool asst::Assistance::start_visit() +bool asst::Assistance::start_visit(bool with_shopping) { - return start_process_task("VisitBegin", ProcessTaskRetryTimesDefault); + DebugTraceFunction; + if (!m_thread_idle || !m_inited) { + return false; + } + + std::unique_lock lock(m_mutex); + m_identify_ptr->clear_cache(); + + append_match_task("VisitBegin", { "VisitBegin" }, ProcessTaskRetryTimesDefault); + + if (with_shopping) { + auto shopping_task_ptr = std::make_shared(task_callback, (void*)this); + shopping_task_ptr->set_task_chain("VisitBegin"); + m_tasks_deque.emplace_back(shopping_task_ptr); + } + + m_thread_idle = false; + m_condvar.notify_one(); + + return true; } bool Assistance::start_process_task(const std::string& task, int retry_times, bool block) @@ -474,13 +493,11 @@ void Assistance::working_proc() auto p_this = this; int retry_times = 0; - while (!m_thread_exit) - { + while (!m_thread_exit) { //DebugTraceScope("Assistance::working_proc Loop"); std::unique_lock lock(m_mutex); - if (!m_thread_idle && !m_tasks_deque.empty()) - { + if (!m_thread_idle && !m_tasks_deque.empty()) { //m_controller_ptr->set_idle(false); auto start_time = std::chrono::system_clock::now(); @@ -491,25 +508,26 @@ void Assistance::working_proc() task_ptr->set_ptr(m_controller_ptr, m_identify_ptr); task_ptr->set_exit_flag(&m_thread_idle); bool ret = task_ptr->run(); - if (ret) - { + if (ret) { retry_times = 0; + if (m_tasks_deque.empty()) { + json::value task_all_completed_json; + task_all_completed_json["task_chain"] = task_ptr->get_task_chain(); + task_callback(AsstMsg::TaskChainCompleted, task_all_completed_json, p_this); + } } - else - { + else { // 失败了累加失败次数,超限了再pop - if (retry_times >= task_ptr->get_retry_times()) - { + if (retry_times >= task_ptr->get_retry_times()) { json::value task_error_json; task_error_json["retry_limit"] = task_ptr->get_retry_times(); task_error_json["retry_times"] = retry_times; task_error_json["task_chain"] = task_ptr->get_task_chain(); - task_callback(AsstMsg::TaskError, std::move(task_error_json), p_this); + task_callback(AsstMsg::TaskError, task_error_json, p_this); retry_times = 0; } - else - { + else { ++retry_times; // 执行失败再还原回去 m_tasks_deque.emplace_front(task_ptr); @@ -521,8 +539,7 @@ void Assistance::working_proc() m_condvar.wait_until(lock, start_time + std::chrono::milliseconds(delay), [&]() -> bool { return m_thread_idle; }); } - else - { + else { m_thread_idle = true; //m_controller_ptr->set_idle(true); m_condvar.wait(lock); diff --git a/src/MeoAssistance/Assistance.h b/src/MeoAssistance/Assistance.h index e3b42599fe..3ed66bbc0b 100644 --- a/src/MeoAssistance/Assistance.h +++ b/src/MeoAssistance/Assistance.h @@ -38,7 +38,7 @@ namespace asst { // 开始刷理智 bool start_sanity(); // 开始访问好友基建 - bool start_visit(); + bool start_visit(bool with_shopping = false); // 开始公开招募操作 bool start_open_recruit(const std::vector& required_level, bool set_time = true); diff --git a/src/MeoAssistance/AsstCaller.cpp b/src/MeoAssistance/AsstCaller.cpp index bac21f4da3..c3c34c3eb2 100644 --- a/src/MeoAssistance/AsstCaller.cpp +++ b/src/MeoAssistance/AsstCaller.cpp @@ -105,13 +105,13 @@ bool AsstStartSanity(void* p_asst) return ((asst::Assistance*)p_asst)->start_sanity(); } -bool AsstStartVisit(void* p_asst) +bool AsstStartVisit(void* p_asst, bool with_shopping) { if (p_asst == nullptr) { return false; } - return ((asst::Assistance*)p_asst)->start_visit(); + return ((asst::Assistance*)p_asst)->start_visit(with_shopping); } bool AsstStartProcessTask(void* p_asst, const char* task) diff --git a/src/MeoAssistance/AsstMsg.h b/src/MeoAssistance/AsstMsg.h index d18b4fc690..fda50725b8 100644 --- a/src/MeoAssistance/AsstMsg.h +++ b/src/MeoAssistance/AsstMsg.h @@ -26,7 +26,8 @@ namespace asst { AppendTask, // 新增任务,Assistance内部消息,外部不需要处理 TaskCompleted, // 单个原子任务完成 PrintWindow, // 截图消息 - TaskStop, // 任务停止 + ProcessTaskStopAction, // 流程任务执行到了Stop的动作 + TaskChainCompleted, // 任务链完成 /* Info Msg: about Identify */ TextDetected = 2000, // 识别到文字 ImageFindResult, // 查找图像的结果 @@ -63,9 +64,10 @@ namespace asst { {AsstMsg::EndOfSleep, "EndOfSleep"}, {AsstMsg::AppendProcessTask, "AppendProcessTask"}, {AsstMsg::TaskCompleted, "TaskCompleted"}, + {AsstMsg::TaskChainCompleted, "TaskChainCompleted"}, {AsstMsg::PrintWindow, "PrintWindow"}, {AsstMsg::TaskError, "TaskError"}, - {AsstMsg::TaskStop, "TaskStop"}, + {AsstMsg::ProcessTaskStopAction, "ProcessTaskStopAction"}, {AsstMsg::TextDetected, "TextDetected"}, {AsstMsg::RecruitTagsDetected, "RecruitTagsDetected"}, {AsstMsg::OcrResultError, "OcrResultError"}, diff --git a/src/MeoAssistance/ProcessTask.cpp b/src/MeoAssistance/ProcessTask.cpp index fb4b23292f..a92f2805d3 100644 --- a/src/MeoAssistance/ProcessTask.cpp +++ b/src/MeoAssistance/ProcessTask.cpp @@ -86,7 +86,7 @@ bool ProcessTask::run() case ProcessTaskAction::DoNothing: break; case ProcessTaskAction::Stop: - m_callback(AsstMsg::TaskStop, json::object{ {"task_chain", m_task_chain} }, m_callback_arg); + m_callback(AsstMsg::ProcessTaskStopAction, json::object{ {"task_chain", m_task_chain} }, m_callback_arg); need_stop = true; break; case ProcessTaskAction::PrintWindow: diff --git a/src/MeoAsstGui/Helper/AsstProxy.cs b/src/MeoAsstGui/Helper/AsstProxy.cs index 39c8714f6f..ab0ac8f80e 100644 --- a/src/MeoAsstGui/Helper/AsstProxy.cs +++ b/src/MeoAsstGui/Helper/AsstProxy.cs @@ -26,7 +26,7 @@ namespace MeoAsstGui [DllImport("MeoAssistance.dll")] static private extern bool AsstStartSanity(IntPtr ptr); - [DllImport("MeoAssistance.dll")] static private extern bool AsstStartVisit(IntPtr ptr); + [DllImport("MeoAssistance.dll")] static private extern bool AsstStartVisit(IntPtr ptr, bool with_shopping); [DllImport("MeoAssistance.dll")] static private extern bool AsstStartOpenRecruit(IntPtr ptr, int[] required_level, int required_len, bool set_time); @@ -110,13 +110,14 @@ namespace MeoAsstGui } break; - case AsstMsg.TaskStop: + case AsstMsg.TaskChainCompleted: { string taskChain = detail["task_chain"].ToString(); if (taskChain != "SanityBegin" && taskChain != "VisitBegin") { break; } + mfvm.CreditShoppingCheckBoxIsEnable = true; mfvm.RunStatus = "已刷完,自动停止"; if (mfvm.Shutdown == true) { @@ -146,7 +147,7 @@ namespace MeoAsstGui string taskChain = detail["task_chain"].ToString(); if (taskChain == "SanityBegin") { - // 出错了会重试两次,再不行就算了 + // 刷理智出错了会重试两次,再不行就算了 if (_retryTimes >= _retryLimit) { _retryTimes = 0; @@ -156,18 +157,6 @@ namespace MeoAsstGui ++_retryTimes; AsstStartSanity(); } - else if (taskChain == "VisitBegin") - { - // 出错了会重试两次,再不行就算了 - if (_retryTimes >= _retryLimit) - { - _retryTimes = 0; - mfvm.RunStatus = "出现错误,已停止运行"; - break; - } - ++_retryTimes; - AsstStartVisit(); - } } break; @@ -256,9 +245,9 @@ namespace MeoAsstGui return AsstStartSanity(_ptr); } - public bool AsstStartVisit() + public bool AsstStartVisit(bool with_shopping) { - return AsstStartVisit(_ptr); + return AsstStartVisit(_ptr, with_shopping); } public void AsstSetParam(string type, string param, string value) @@ -291,7 +280,8 @@ namespace MeoAsstGui AppendTask, // 新增任务,Assistance内部消息,外部不需要处理 TaskCompleted, // 单个原子任务完成 PrintWindow, // 截图消息 - TaskStop, // 任务停止 + ProcessTaskStopAction, // 流程任务执行到了Stop的动作 + TaskChainCompleted, // 任务链完成 /* Info Msg: about Identify */ TextDetected = 2000, // 识别到文字 ImageFindResult, // 查找图像的结果 diff --git a/src/MeoAsstGui/UserControl/ParamSettingUserControl.xaml b/src/MeoAsstGui/UserControl/ParamSettingUserControl.xaml index b3622b72c1..ceefe540af 100644 --- a/src/MeoAsstGui/UserControl/ParamSettingUserControl.xaml +++ b/src/MeoAsstGui/UserControl/ParamSettingUserControl.xaml @@ -5,18 +5,19 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:hc="https://handyorg.github.io/handycontrol" mc:Ignorable="d" - d:DesignHeight="200" d:DesignWidth="500"> + d:DesignHeight="230" d:DesignWidth="500"> + - @@ -24,20 +25,21 @@ - - + - - + + \ No newline at end of file diff --git a/src/MeoAsstGui/ViewModels/MainFunctionViewModel.cs b/src/MeoAsstGui/ViewModels/MainFunctionViewModel.cs index 589edde007..2cd1b8920d 100644 --- a/src/MeoAsstGui/ViewModels/MainFunctionViewModel.cs +++ b/src/MeoAsstGui/ViewModels/MainFunctionViewModel.cs @@ -226,6 +226,27 @@ namespace MeoAsstGui } } + private bool _creditShopping = System.Convert.ToBoolean(ViewStatusStorage.Get("MainFunction.CreditShopping", bool.FalseString)); + + public bool CreditShopping + { + get { return _creditShopping; } + set + { + SetAndNotify(ref _creditShopping, value); + ViewStatusStorage.Set("MainFunction.CreditShopping", value.ToString()); + } + } + private bool _creditShoppingCheckBoxIsEnable = true; + public bool CreditShoppingCheckBoxIsEnable + { + get { return _creditShoppingCheckBoxIsEnable; } + set + { + SetAndNotify(ref _creditShoppingCheckBoxIsEnable, value); + } + } + public void Stop() { var asstProxy = _container.Get(); @@ -263,10 +284,11 @@ namespace MeoAsstGui var asstProxy = _container.Get(); bool catched = asstProxy.AsstCatchDefault(); CatchStatus = "捕获模拟器窗口:" + catched; - if (!asstProxy.AsstStartVisit()) + if (!asstProxy.AsstStartVisit(CreditShopping)) { return; } + CreditShoppingCheckBoxIsEnable = false; ExecInfo = ""; } } diff --git a/src/MeoAsstGui/Views/MainFunctionView.xaml b/src/MeoAsstGui/Views/MainFunctionView.xaml index 6188aadf27..67b6b11c1c 100644 --- a/src/MeoAsstGui/Views/MainFunctionView.xaml +++ b/src/MeoAsstGui/Views/MainFunctionView.xaml @@ -9,9 +9,9 @@ Height="350" Width="500"> - - - + + + diff --git a/src/MeoAsstGui/Views/RecruitView.xaml b/src/MeoAsstGui/Views/RecruitView.xaml index 992afd0060..61b93a0a58 100644 --- a/src/MeoAsstGui/Views/RecruitView.xaml +++ b/src/MeoAsstGui/Views/RecruitView.xaml @@ -20,6 +20,9 @@ + + +