diff --git a/include/AsstCaller.h b/include/AsstCaller.h index 8fbea66229..e9b163ae6d 100644 --- a/include/AsstCaller.h +++ b/include/AsstCaller.h @@ -9,7 +9,7 @@ extern "C" { MEOAPI_PORT void* MEO_CALL AsstCreate(); MEOAPI_PORT void* MEO_CALL AsstCreateEx(AsstCallback callback, void* custom_arg); - void MEOAPI AsstDestory(void* p_asst); + void MEOAPI AsstDestroy(void* p_asst); bool MEOAPI AsstCatchDefault(void* p_asst); bool MEOAPI AsstCatchEmulator(void* p_asst); @@ -22,10 +22,10 @@ extern "C" { bool MEOAPI AsstAppendMall(void* p_asst, bool with_shopping); //bool MEOAPI AsstAppendProcessTask(void* p_asst, const char* task); bool MEOAPI AsstAppendInfrast(void* p_asst, int work_mode, const char** order, int order_size, const char* uses_of_drones, double dorm_threshold); - bool MEOAPI AsstAppendRecruit(void* p_asst, int max_times, const int required_level[], int required_len, const int confirm_level[], int confirm_len, bool need_refresh); + bool MEOAPI AsstAppendRecruit(void* p_asst, int max_times, const int select_level[], int select_len, const int confirm_level[], int confirm_len, bool need_refresh); bool MEOAPI AsstAppendDebug(void* p_asst); - bool MEOAPI AsstStartRecruitCalc(void* p_asst, const int required_level[], int required_len, bool set_time); + bool MEOAPI AsstStartRecruitCalc(void* p_asst, const int select_level[], int required_len, bool set_time); bool MEOAPI AsstStart(void* p_asst); bool MEOAPI AsstStop(void* p_asst); diff --git a/src/MeoAssistance/Assistance.cpp b/src/MeoAssistance/Assistance.cpp index ef471d56a0..9450306865 100644 --- a/src/MeoAssistance/Assistance.cpp +++ b/src/MeoAssistance/Assistance.cpp @@ -233,7 +233,7 @@ bool Assistance::append_process_task(const std::string& task, std::string task_c return true; } -bool asst::Assistance::append_recruit(unsigned max_times, const std::vector& required_level, const std::vector& confirm_level, bool need_refresh) +bool asst::Assistance::append_recruit(unsigned max_times, const std::vector& select_level, const std::vector& confirm_level, bool need_refresh) { LogTraceFunction; if (!m_inited) { @@ -246,7 +246,7 @@ bool asst::Assistance::append_recruit(unsigned max_times, const std::vector auto recruit_task_ptr = std::make_shared(task_callback, (void*)this); recruit_task_ptr->set_max_times(max_times); recruit_task_ptr->set_need_refresh(need_refresh); - recruit_task_ptr->set_required_level(required_level); + recruit_task_ptr->set_select_level(select_level); recruit_task_ptr->set_confirm_level(confirm_level); recruit_task_ptr->set_task_chain(TaskChain); recruit_task_ptr->set_retry_times(AutoRecruitTaskRetryTimesDefault); @@ -280,7 +280,7 @@ bool Assistance::append_debug() } #endif -bool Assistance::start_recruit_calc(const std::vector& required_level, bool set_time) +bool Assistance::start_recruit_calc(const std::vector& select_level, bool set_time) { LogTraceFunction; if (!m_inited) { @@ -290,7 +290,7 @@ bool Assistance::start_recruit_calc(const std::vector& required_level, bool std::unique_lock lock(m_mutex); auto task_ptr = std::make_shared(task_callback, (void*)this); - task_ptr->set_param(required_level, set_time); + task_ptr->set_param(select_level, set_time); task_ptr->set_retry_times(OpenRecruitTaskRetryTimesDefault); task_ptr->set_task_chain("OpenRecruit"); m_tasks_queue.emplace(task_ptr); diff --git a/src/MeoAssistance/Assistance.h b/src/MeoAssistance/Assistance.h index 01069bca1c..11bdf5044e 100644 --- a/src/MeoAssistance/Assistance.h +++ b/src/MeoAssistance/Assistance.h @@ -52,9 +52,9 @@ namespace asst // 添加自动公招任务 // 参数max_times: 最多进行几次公招 - // 参数required_level: 需要的选择Tags的等级 + // 参数select_level: 需要的选择Tags的等级 // 参数confirm_level: 需要点击确认按钮的等级 - bool append_recruit(unsigned max_times, const std::vector& required_level, const std::vector& confirm_level, bool need_refresh); + bool append_recruit(unsigned max_times, const std::vector& select_level, const std::vector& confirm_level, bool need_refresh); #ifdef LOG_TRACE // 调试用 @@ -62,7 +62,7 @@ namespace asst #endif // 开始公开招募计算 - bool start_recruit_calc(const std::vector& required_level, bool set_time); + bool start_recruit_calc(const std::vector& select_level, bool set_time); // 开始执行任务队列 bool start(bool block = true); diff --git a/src/MeoAssistance/AsstCaller.cpp b/src/MeoAssistance/AsstCaller.cpp index d8835afdeb..c8d398bceb 100644 --- a/src/MeoAssistance/AsstCaller.cpp +++ b/src/MeoAssistance/AsstCaller.cpp @@ -9,18 +9,22 @@ #include "AsstUtils.hpp" #include "Version.h" -#if 0 #if _MSC_VER // Win32平台下Dll的入口 -BOOL APIENTRY DllMain(HANDLE hModule, +BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { - UNREFERENCED_PARAMETER(hModule); + //UNREFERENCED_PARAMETER(hModule); UNREFERENCED_PARAMETER(lpReserved); switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH: + case DLL_PROCESS_ATTACH: { + char exepath_buff[_MAX_PATH] = { 0 }; + ::GetModuleFileNameA(hModule, exepath_buff, _MAX_PATH); + std::string exepath(exepath_buff); + asst::utils::_cur_dir = exepath.substr(0, exepath.find_last_of('\\') + 1); + } break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: @@ -30,7 +34,6 @@ BOOL APIENTRY DllMain(HANDLE hModule, } #elif VA_GNUC -#endif #endif AsstCallback _callback = nullptr; @@ -62,7 +65,7 @@ void* AsstCreateEx(AsstCallback callback, void* custom_arg) } } -void AsstDestory(void* p_asst) +void AsstDestroy(void* p_asst) { if (p_asst == nullptr) { return; @@ -158,13 +161,13 @@ bool AsstAppendMall(void* p_asst, bool with_shopping) // return ((asst::Assistance*)p_asst)->append_process_task(task); //} -bool AsstStartRecruitCalc(void* p_asst, const int required_level[], int required_len, bool set_time) +bool AsstStartRecruitCalc(void* p_asst, const int select_level[], int required_len, bool set_time) { if (p_asst == nullptr) { return false; } std::vector level_vector; - level_vector.assign(required_level, required_level + required_len); + level_vector.assign(select_level, select_level + required_len); return ((asst::Assistance*)p_asst)->start_recruit_calc(level_vector, set_time); } @@ -184,13 +187,13 @@ bool AsstAppendInfrast(void* p_asst, int work_mode, const char** order, int orde dorm_threshold); } -bool AsstAppendRecruit(void* p_asst, int max_times, const int required_level[], int required_len, const int confirm_level[], int confirm_len, bool need_refresh) +bool AsstAppendRecruit(void* p_asst, int max_times, const int select_level[], int select_len, const int confirm_level[], int confirm_len, bool need_refresh) { if (p_asst == nullptr) { return false; } std::vector required_vector; - required_vector.assign(required_level, required_level + required_len); + required_vector.assign(select_level, select_level + select_len); std::vector confirm_vector; confirm_vector.assign(confirm_level, confirm_level + confirm_len); diff --git a/src/MeoAssistance/AsstUtils.hpp b/src/MeoAssistance/AsstUtils.hpp index 1e649ace82..2451d1ddd9 100644 --- a/src/MeoAssistance/AsstUtils.hpp +++ b/src/MeoAssistance/AsstUtils.hpp @@ -10,16 +10,10 @@ namespace asst { namespace utils { + static std::string _cur_dir; static std::string get_cur_dir() { - static std::string cur_dir; - if (cur_dir.empty()) { - char exepath_buff[_MAX_PATH] = { 0 }; - ::GetModuleFileNameA(NULL, exepath_buff, _MAX_PATH); - std::string exepath(exepath_buff); - cur_dir = exepath.substr(0, exepath.find_last_of('\\') + 1); - } - return cur_dir; + return _cur_dir; } static std::string get_resource_dir() diff --git a/src/MeoAssistance/AutoRecruitTask.cpp b/src/MeoAssistance/AutoRecruitTask.cpp index 295861ddd6..d93a818582 100644 --- a/src/MeoAssistance/AutoRecruitTask.cpp +++ b/src/MeoAssistance/AutoRecruitTask.cpp @@ -7,9 +7,9 @@ #include "ProcessTask.h" #include "RecruitTask.h" -void asst::AutoRecruitTask::set_required_level(std::vector required_level) noexcept +void asst::AutoRecruitTask::set_select_level(std::vector select_level) noexcept { - m_required_level = std::move(required_level); + m_select_level = std::move(select_level); } void asst::AutoRecruitTask::set_confirm_level(std::vector confirm_level) noexcept @@ -58,7 +58,7 @@ bool asst::AutoRecruitTask::_run() while (true) { RecruitTask recurit_task(m_callback, m_callback_arg); recurit_task.set_retry_times(10); - recurit_task.set_param(m_required_level, true); + recurit_task.set_param(m_select_level, true); recurit_task.set_task_chain(m_task_chain); // 识别错误,放弃这个公招位,直接返回 @@ -91,4 +91,4 @@ bool asst::AutoRecruitTask::_run() } } } -} +} \ No newline at end of file diff --git a/src/MeoAssistance/AutoRecruitTask.h b/src/MeoAssistance/AutoRecruitTask.h index 9177c9a538..5497834a9d 100644 --- a/src/MeoAssistance/AutoRecruitTask.h +++ b/src/MeoAssistance/AutoRecruitTask.h @@ -9,7 +9,7 @@ namespace asst using AbstractTask::AbstractTask; virtual ~AutoRecruitTask() = default; - void set_required_level(std::vector required_level) noexcept; + void set_select_level(std::vector select_level) noexcept; void set_confirm_level(std::vector confirm_level) noexcept; void set_need_refresh(bool need_refresh) noexcept; void set_max_times(int max_times) noexcept; @@ -17,7 +17,7 @@ namespace asst protected: virtual bool _run() override; - std::vector m_required_level; + std::vector m_select_level; std::vector m_confirm_level; bool m_need_refresh = false; int m_max_times = 0; diff --git a/src/MeoAssistance/RecruitTask.cpp b/src/MeoAssistance/RecruitTask.cpp index eed18dd96e..d056288758 100644 --- a/src/MeoAssistance/RecruitTask.cpp +++ b/src/MeoAssistance/RecruitTask.cpp @@ -201,7 +201,7 @@ bool RecruitTask::_run() if (!result_vec.empty()) { /* 点击最优解的tags */ - if (std::find(m_required_level.cbegin(), m_required_level.cend(), m_maybe_level) != m_required_level.cend()) { + if (std::find(m_select_level.cbegin(), m_select_level.cend(), m_maybe_level) != m_select_level.cend()) { const std::vector& final_tags_name = result_vec.at(0).tags; for (const TextRect& text_area : all_tags) { @@ -219,8 +219,8 @@ bool RecruitTask::_run() return true; } -void RecruitTask::set_param(std::vector required_level, bool set_time) noexcept +void RecruitTask::set_param(std::vector select_level, bool set_time) noexcept { - m_required_level = std::move(required_level); + m_select_level = std::move(select_level); m_set_time = set_time; -} +} \ No newline at end of file diff --git a/src/MeoAssistance/RecruitTask.h b/src/MeoAssistance/RecruitTask.h index 45aa2f5f30..468b8a08c3 100644 --- a/src/MeoAssistance/RecruitTask.h +++ b/src/MeoAssistance/RecruitTask.h @@ -12,7 +12,7 @@ namespace asst using AbstractTask::AbstractTask; virtual ~RecruitTask() = default; - void set_param(std::vector required_level, bool set_time = true) noexcept; + void set_param(std::vector select_level, bool set_time = true) noexcept; bool get_has_special_tag() const noexcept { @@ -31,7 +31,7 @@ namespace asst virtual bool _run() override; /* 外部设置参数 */ - std::vector m_required_level; + std::vector m_select_level; bool m_set_time = false; /* 内部处理用参数*/ diff --git a/src/MeoAsstGui/Helper/AsstProxy.cs b/src/MeoAsstGui/Helper/AsstProxy.cs index d6e5711c11..bd8d25172c 100644 --- a/src/MeoAsstGui/Helper/AsstProxy.cs +++ b/src/MeoAsstGui/Helper/AsstProxy.cs @@ -20,7 +20,7 @@ namespace MeoAsstGui [DllImport("MeoAssistance.dll")] private static extern IntPtr AsstCreateEx(CallbackDelegate callback, IntPtr custom_arg); - [DllImport("MeoAssistance.dll")] private static extern void AsstDestory(IntPtr ptr); + [DllImport("MeoAssistance.dll")] private static extern void AsstDestroy(IntPtr ptr); [DllImport("MeoAssistance.dll")] private static extern bool AsstCatchDefault(IntPtr ptr); @@ -36,9 +36,9 @@ namespace MeoAsstGui [DllImport("MeoAssistance.dll")] private static extern bool AsstAppendInfrast(IntPtr ptr, int work_mode, string[] order, int order_len, string uses_of_drones, double dorm_threshold); - [DllImport("MeoAssistance.dll")] private static extern bool AsstAppendRecruit(IntPtr ptr, int max_times, int[] required_level, int required_len, int[] confirm_level, int confirm_len, bool need_refresh); + [DllImport("MeoAssistance.dll")] private static extern bool AsstAppendRecruit(IntPtr ptr, int max_times, int[] select_level, int required_len, int[] confirm_level, int confirm_len, bool need_refresh); - [DllImport("MeoAssistance.dll")] private static extern bool AsstStartRecruitCalc(IntPtr ptr, int[] required_level, int required_len, bool set_time); + [DllImport("MeoAssistance.dll")] private static extern bool AsstStartRecruitCalc(IntPtr ptr, int[] select_level, int required_len, bool set_time); [DllImport("MeoAssistance.dll")] private static extern bool AsstStart(IntPtr ptr); @@ -331,9 +331,9 @@ namespace MeoAsstGui return AsstAppendMall(_ptr, with_shopping); } - public bool AsstAppendRecruit(int max_times, int[] required_level, int required_len, int[] confirm_level, int confirm_len, bool need_refresh) + public bool AsstAppendRecruit(int max_times, int[] select_level, int required_len, int[] confirm_level, int confirm_len, bool need_refresh) { - return AsstAppendRecruit(_ptr, max_times, required_level, required_len, confirm_level, confirm_len, need_refresh); + return AsstAppendRecruit(_ptr, max_times, select_level, required_len, confirm_level, confirm_len, need_refresh); } public bool AsstAppendInfrast(int work_mode, string[] order, int order_len, string uses_of_drones, double dorm_threshold) @@ -346,9 +346,9 @@ namespace MeoAsstGui return AsstStart(_ptr); } - public bool AsstStartRecruitCalc(int[] required_level, int required_len, bool set_time) + public bool AsstStartRecruitCalc(int[] select_level, int required_len, bool set_time) { - return AsstStartRecruitCalc(_ptr, required_level, required_len, set_time); + return AsstStartRecruitCalc(_ptr, select_level, required_len, set_time); } public bool AsstStop() diff --git a/src/Python/interface.py b/src/Python/interface.py new file mode 100644 index 0000000000..7d72b8f418 --- /dev/null +++ b/src/Python/interface.py @@ -0,0 +1,133 @@ +import ctypes +import os +import json +import pathlib +from msg import Msg + + +class Asst: + CallBackType = ctypes.CFUNCTYPE( + None, ctypes.c_int, ctypes.c_char_p, ctypes.c_void_p) + + def __init__(self, dirname: str, callback: CallBackType, arg=None): + os.chdir(dirname) + self.__dllpath = pathlib.Path(dirname) / 'MeoAssistance.dll' + self.__dll = ctypes.WinDLL(str(self.__dllpath)) + + self.__dll.AsstCreateEx.restype = ctypes.c_void_p + self.__dll.AsstCreateEx.argtypes = (ctypes.c_void_p, ctypes.c_void_p,) + self.__ptr = self.__dll.AsstCreateEx(callback, arg) + + def __del__(self): + self.__dll.AsstDestroy.argtypes = (ctypes.c_void_p,) + self.__dll.AsstDestroy(self.__ptr) + + def catch_default(self) -> bool: + self.__dll.AsstCatchDefault.argtypes = (ctypes.c_void_p,) + return self.__dll.AsstCatchDefault(self.__ptr) + + def catch_emulator(self) -> bool: + self.__dll.AsstCatchEmulator.argtypes = (ctypes.c_void_p,) + return self.__dll.AsstCatchEmulator(self.__ptr) + + def catch_custom(self, address: str) -> bool: + self.__dll.AsstCatchCustom.argtypes = ( + ctypes.c_void_p, ctypes.c_char_p,) + return self.__dll.AsstCatchCustom(self.__ptr, address) + + def append_fight(self, max_medicine: int, max_stone: int, max_times: int) -> bool: + self.__dll.AsstAppendFight.argtypes = ( + ctypes.c_void_p, ctypes.c_int, ctypes.c_int, ctypes.c_int,) + return self.__dll.AsstAppendFight(self.__ptr, max_medicine, max_stone, max_times) + + def append_award(self) -> bool: + self.__dll.AsstAppendAward.argtypes = (ctypes.c_void_p,) + return self.__dll.AsstAppendAward(self.__ptr) + + def append_visit(self) -> bool: + self.__dll.AsstAppendVisit.argtypes = (ctypes.c_void_p,) + return self.__dll.AsstAppendVisit(self.__ptr) + + def append_mall(self, with_shopping: bool) -> bool: + self.__dll.AsstAppendMall.argtypes = (ctypes.c_void_p, ctypes.c_bool) + return self.__dll.AsstAppendMall(self.__ptr, with_shopping) + + def append_infrast(self, work_mode: int, order_list: list, uses_of_drones: str, dorm_threshold: float) -> bool: + order_len = len(order_list) + order_arr = (ctypes.c_char_p * order_len)() + order_arr[:] = order_list + + self.__dll.AsstAppendInfrast.argtypes = ( + ctypes.c_void_p, ctypes.c_int, + ctypes.POINTER(ctypes.c_char_p), ctypes.c_int, + ctypes.c_char_p, ctypes.c_double,) + return self.__dll.AsstAppendInfrast(self.__ptr, work_mode, + order_arr, order_len, + uses_of_drones, dorm_threshold) + + def append_recruit(self, max_times: int, select_level: list, confirm_level: list, need_refresh: bool) -> bool: + select_len = len(select_level) + select_arr = (ctypes.c_int * select_len)() + select_arr[:] = select_level + + confirm_len = len(confirm_level) + confirm_arr = (ctypes.c_int * confirm_len)() + confirm_arr[:] = confirm_level + + self.__dll.AsstAppendRecruit.argtypes = ( + ctypes.c_void_p, ctypes.c_int, + ctypes.POINTER(ctypes.c_int), ctypes.c_int, + ctypes.POINTER(ctypes.c_int), ctypes.c_int, ctypes.c_bool,) + return self.__dll.AsstAppendRecruit(self.__ptr, max_times, + select_arr, select_len, + confirm_arr, confirm_len, need_refresh) + + def start(self) -> bool: + self.__dll.AsstStart.argtypes = (ctypes.c_void_p,) + return self.__dll.AsstStart(self.__ptr) + + def start_recurit_clac(self, select_level: list, set_time: bool) -> bool: + select_len = len(select_level) + select_arr = (ctypes.c_int * select_len)() + select_arr[:] = select_level + + self.__dll.AsstStartRecruitCalc.argtypes = ( + ctypes.c_void_p, ctypes.POINTER(ctypes.c_int), ctypes.c_int, ctypes.c_bool,) + return self.__dll.AsstStartRecruitCalc(self.__ptr, select_arr, select_len, set_time) + + def stop(self) -> bool: + self.__dll.AsstStop.argtypes = (ctypes.c_void_p,) + return self.__dll.AsstStop(self.__ptr) + + def set_penguin_id(self, id: str) -> bool: + self.__dll.AsstSetPenguinId.argtypes = ( + ctypes.c_void_p, ctypes.c_char_p) + return self.__dll.AsstSetPenguinId(self.__ptr, id) + + def get_version(self) -> str: + self.__dll.AsstGetVersion.restype = ctypes.c_char_p + return self.__dll.AsstGetVersion() + + +@Asst.CallBackType +def my_callback(msg, details, arg): + d = json.loads(details.decode('gbk')) + print(Msg(msg), d, arg) + + +if __name__ == "__main__": + + asst = Asst('D:\\Code\\MeoAssistance\\x64\\Release\\', my_callback) + if asst.catch_default(): + print('连接成功') + else: + print('连接失败') + os.system.exit() + + # asst.append_fight(0, 0, 1) + # asst.start() + + asst.start_recurit_clac([4, 5, 6], True) + + while True: + pass diff --git a/src/Python/msg.py b/src/Python/msg.py new file mode 100644 index 0000000000..4612b4bd59 --- /dev/null +++ b/src/Python/msg.py @@ -0,0 +1,43 @@ +from enum import Enum, unique, auto + + +@unique +class Msg(Enum): + # Error Msg + PtrIsNull = auto() # 指针为空 + ImageIsEmpty = auto() # 图像为空 + WindowMinimized = auto() # [已弃用] 窗口被最小化了 + InitFaild = auto() # 初始化失败 + TaskError = auto() # 任务错误(任务一直出错,retry次数达到上限) + OcrResultError = auto() # Ocr识别结果错误 + # Info Msg: about Task + TaskStart = 1000 # 任务开始 + TaskMatched = auto() # 任务匹配成功 + ReachedLimit = auto() # 单个原子任务达到次数上限 + ReadyToSleep = auto() # 准备开始睡眠 + EndOfSleep = auto() # 睡眠结束 + AppendProcessTask = auto() # [已弃用] 新增流程任务,Assistance内部消息,外部不需要处理 + AppendTask = auto() # [已弃用] 新增任务,Assistance内部消息,外部不需要处理 + TaskCompleted = auto() # 单个原子任务完成 + PrintWindow = auto() # 截图消息 + ProcessTaskStopAction = auto() # 流程任务执行到了Stop的动作 + TaskChainCompleted = auto() # 任务链完成 + ProcessTaskNotMatched = auto() # 流程任务识别错误 + AllTasksCompleted = auto() # 所有任务完成 + TaskChainStart = auto() # 开始任务链 + # Info Msg: about Identify */ + TextDetected = 2000 # 识别到文字 + ImageFindResult = auto() # 查找图像的结果 + ImageMatched = auto() # 图像匹配成功 + StageDrops = auto() # 关卡掉落信息 + # Open Recruit Msg */ + RecruitTagsDetected = 3000 # 公招识别到了Tags + RecruitSpecialTag = auto() # 公招识别到了特殊的Tag + RecruitResult = auto() # 公开招募结果 + RecruitSelected = auto() # 选择了Tags + # Infrast Msg */ + InfrastSkillsDetected = 4000 # 识别到了基建技能(当前页面) + InfrastSkillsResult = auto() # 识别到的所有可用技能 + InfrastComb = auto() # 当前房间的最优干员组合 + EnterFacility = auto() # 进入某个房间 + FacilityInfo = auto() # 当前设施信息 diff --git a/tools/TestCaller/main.cpp b/tools/TestCaller/main.cpp index 01f1af887e..95efbdfa85 100644 --- a/tools/TestCaller/main.cpp +++ b/tools/TestCaller/main.cpp @@ -8,7 +8,7 @@ int main(int argc, char** argv) if (!ret) { getchar(); if (ptr) { - AsstDestory(ptr); + AsstDestroy(ptr); ptr = nullptr; } return -1; @@ -39,7 +39,7 @@ int main(int argc, char** argv) } if (ptr) { - AsstDestory(ptr); + AsstDestroy(ptr); ptr = nullptr; }