diff --git a/docs/集成文档.md b/docs/集成文档.md index 1b963d32f3..d0ebf66761 100644 --- a/docs/集成文档.md +++ b/docs/集成文档.md @@ -45,7 +45,9 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p "mecidine": int, // 最大使用理智药数量,可选,默认 0 "stone": int, // 最大吃石头数量,可选,默认 0 "times": int, // 指定次数,可选,默认无穷大 - "penguin_id": string // 企鹅数据汇报 id, 可选,默认为空 + "penguin_id": string, // 企鹅数据汇报 id, 可选,默认为空 + "server": string // 服务器,可选,默认 "CN", 会影响掉落识别及上传 + // 选项:"CN" | "US" | "JP" | "KR" } ``` diff --git a/src/MeoAssistant/AbstractConfiger.cpp b/src/MeoAssistant/AbstractConfiger.cpp index bdb608b872..ffaf6df7ac 100644 --- a/src/MeoAssistant/AbstractConfiger.cpp +++ b/src/MeoAssistant/AbstractConfiger.cpp @@ -9,6 +9,10 @@ bool asst::AbstractConfiger::load(const std::string& filename) { LogTraceFunction; + if (!std::filesystem::exists(filename)) { + return false; + } + std::string content = utils::load_file_without_bom(filename); auto&& ret = json::parser::parse(content); diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp index acecb5803e..e11fb3eeb0 100644 --- a/src/MeoAssistant/Assistant.cpp +++ b/src/MeoAssistant/Assistant.cpp @@ -5,7 +5,6 @@ #include #include -#include "AsstDef.h" #include "AsstUtils.hpp" #include "Controller.h" #include "Logger.hpp" diff --git a/src/MeoAssistant/FightTask.cpp b/src/MeoAssistant/FightTask.cpp index bbd38db2f4..e62da9111e 100644 --- a/src/MeoAssistant/FightTask.cpp +++ b/src/MeoAssistant/FightTask.cpp @@ -46,11 +46,17 @@ bool asst::FightTask::set_params(const json::value& params) const int stone = params.get("stone", 0); const int times = params.get("times", INT_MAX); std::string penguin_id = params.get("penguin_id", ""); + std::string server = params.get("server", "CN"); if (!m_runned) { - m_start_up_task_ptr->set_enable(true); - - m_stage_task_ptr->set_enable(true); + if (stage.empty()) { + m_start_up_task_ptr->set_enable(false); + m_stage_task_ptr->set_enable(false); + } + else { + m_start_up_task_ptr->set_enable(true); + m_stage_task_ptr->set_enable(true); + } m_stage_task_ptr->set_tasks({ stage }); } diff --git a/src/MeoAssistant/OcrPack.cpp b/src/MeoAssistant/OcrPack.cpp index 732fae3bc4..5a31b7eab4 100644 --- a/src/MeoAssistant/OcrPack.cpp +++ b/src/MeoAssistant/OcrPack.cpp @@ -1,5 +1,7 @@ #include "OcrPack.h" +#include + #include #include @@ -28,6 +30,10 @@ bool asst::OcrPack::load(const std::string& dir) { LogTraceFunction; + if (!std::filesystem::exists(dir)) { + return false; + } + constexpr static const char* DetName = "/det"; //constexpr static const char* ClsName = "/cls"; constexpr static const char* RecName = "/rec"; diff --git a/src/MeoAssistant/PenguinPack.cpp b/src/MeoAssistant/PenguinPack.cpp index 21a54b5c26..e2712aa27f 100644 --- a/src/MeoAssistant/PenguinPack.cpp +++ b/src/MeoAssistant/PenguinPack.cpp @@ -16,6 +16,10 @@ bool asst::PenguinPack::load(const std::string& dir) { LogTraceFunction; + if (!std::filesystem::exists(dir)) { + return false; + } + bool ret = load_json(dir + "/json/stages.json", dir + "/json/hash_index.json"); for (const auto& file : std::filesystem::directory_iterator(dir + "/items")) { diff --git a/src/MeoAssistant/Resource.cpp b/src/MeoAssistant/Resource.cpp index dad3515574..8e3ceb1c67 100644 --- a/src/MeoAssistant/Resource.cpp +++ b/src/MeoAssistant/Resource.cpp @@ -23,27 +23,57 @@ bool asst::Resource::load(const std::string& dir) constexpr static const char* PenguinResourceFilename = "penguin-stats-recognize"; constexpr static const char* TilesCalcResourceFilename = "Arknights-Tile-Pos"; + bool overload = false; + /* 加载各个Json配置文件 */ if (!m_general_cfg_unique_ins.load(dir + GeneralCfgFilename)) { - m_last_error = std::string(GeneralCfgFilename) + ": " + m_general_cfg_unique_ins.get_last_error(); - return false; + if (!m_loaded) { + m_last_error = std::string(GeneralCfgFilename) + ": " + m_general_cfg_unique_ins.get_last_error(); + return false; + } } + else { + overload = true; + } + if (!TaskData::get_instance().load(dir + TaskDataFilename)) { - m_last_error = std::string(TaskDataFilename) + ": " + TaskData::get_instance().get_last_error(); - return false; + if (!m_loaded) { + m_last_error = std::string(TaskDataFilename) + ": " + TaskData::get_instance().get_last_error(); + return false; + } + } + else { + overload = true; } if (!m_recruit_cfg_unique_ins.load(dir + RecruitCfgFilename)) { - m_last_error = std::string(RecruitCfgFilename) + ": " + m_recruit_cfg_unique_ins.get_last_error(); - return false; + if (!m_loaded) { + m_last_error = std::string(RecruitCfgFilename) + ": " + m_recruit_cfg_unique_ins.get_last_error(); + return false; + } } + else { + overload = true; + } + if (!m_item_cfg_unique_ins.load(dir + ItemCfgFilename)) { - m_last_error = std::string(ItemCfgFilename) + ": " + m_item_cfg_unique_ins.get_last_error(); - return false; + if (!m_loaded) { + m_last_error = std::string(ItemCfgFilename) + ": " + m_item_cfg_unique_ins.get_last_error(); + return false; + } } + else { + overload = true; + } + if (!m_infrast_cfg_unique_ins.load(dir + InfrastCfgFilename)) { - m_last_error = std::string(InfrastCfgFilename) + ": " + m_infrast_cfg_unique_ins.get_last_error(); - return false; + if (!m_loaded) { + m_last_error = std::string(InfrastCfgFilename) + ": " + m_infrast_cfg_unique_ins.get_last_error(); + return false; + } + } + else { + overload = true; } const auto& opt = m_general_cfg_unique_ins.get_options(); @@ -55,28 +85,55 @@ bool asst::Resource::load(const std::string& dir) m_templ_resource_unique_ins.append_load_required(m_infrast_cfg_unique_ins.get_templ_required()); if (!m_templ_resource_unique_ins.load(dir + TemplsFilename)) { - m_last_error = std::string(TemplsFilename) + ": " + m_templ_resource_unique_ins.get_last_error(); - return false; + if (!m_loaded) { + m_last_error = std::string(TemplsFilename) + ": " + m_templ_resource_unique_ins.get_last_error(); + return false; + } + } + else { + overload = true; } /* 加载OCR库所需要的资源 */ //m_ocr_pack_unique_ins.set_param(opt.ocr_gpu_index, opt.ocr_thread_number); if (!m_ocr_pack_unique_ins.load(dir + OcrResourceFilename)) { - m_last_error = std::string(OcrResourceFilename) + ": " + m_ocr_pack_unique_ins.get_last_error(); - return false; + if (!m_loaded) { + m_last_error = std::string(OcrResourceFilename) + ": " + m_ocr_pack_unique_ins.get_last_error(); + return false; + } } + else { + overload = true; + } + /* 加载企鹅数据识别库所需要的资源 */ m_penguin_pack_unique_ins.set_language(opt.penguin_report.server); if (!m_penguin_pack_unique_ins.load(dir + PenguinResourceFilename)) { - m_last_error = std::string(PenguinResourceFilename) + ": " + m_penguin_pack_unique_ins.get_last_error(); - return false; + if (!m_loaded) { + m_last_error = std::string(PenguinResourceFilename) + ": " + m_penguin_pack_unique_ins.get_last_error(); + return false; + } + } + else { + overload = true; } /* 加载地图格子识别库所需要的资源 */ + if (!m_tile_pack_unique_ins.load(dir + TilesCalcResourceFilename)) { - m_last_error = std::string(TilesCalcResourceFilename) + ": " + m_tile_pack_unique_ins.get_last_error(); - return false; + if (!m_loaded) { + m_last_error = std::string(TilesCalcResourceFilename) + ": " + m_tile_pack_unique_ins.get_last_error(); + return false; + } + } + else { + overload = true; } + if (m_loaded) { + return overload; + } + + m_loaded = true; return true; } diff --git a/src/MeoAssistant/Resource.h b/src/MeoAssistant/Resource.h index 5b4fc9ddd7..983627082a 100644 --- a/src/MeoAssistant/Resource.h +++ b/src/MeoAssistant/Resource.h @@ -110,6 +110,8 @@ namespace asst OcrPack m_ocr_pack_unique_ins; PenguinPack m_penguin_pack_unique_ins; TilePack m_tile_pack_unique_ins; + + bool m_loaded = false; }; //static auto& resource = Resource::get_instance(); diff --git a/src/MeoAssistant/StageDropsTaskPlugin.cpp b/src/MeoAssistant/StageDropsTaskPlugin.cpp index 269ffd5043..9132e71a07 100644 --- a/src/MeoAssistant/StageDropsTaskPlugin.cpp +++ b/src/MeoAssistant/StageDropsTaskPlugin.cpp @@ -48,6 +48,11 @@ bool asst::StageDropsTaskPlugin::set_penguin_id(std::string id) return true; } +bool asst::StageDropsTaskPlugin::set_server(std::string server) +{ + m_server = std::move(server); +} + bool asst::StageDropsTaskPlugin::_run() { LogTraceFunction; @@ -82,6 +87,7 @@ bool asst::StageDropsTaskPlugin::recognize_drops() if (need_exit()) { return false; } + Resrc.penguin().set_language(m_server); const cv::Mat image = m_ctrler->get_image(); std::string res = Resrc.penguin().recognize(image); Log.trace("Results of penguin recognition:\n", res); @@ -165,7 +171,7 @@ void asst::StageDropsTaskPlugin::upload_to_penguin() return; } json::value body; - body["server"] = opt.penguin_report.server; + body["server"] = m_server; body["stageId"] = stage_id; // To fix: https://github.com/MistEO/MeoAssistantArknights/issues/40 body["drops"] = json::array(); diff --git a/src/MeoAssistant/StageDropsTaskPlugin.h b/src/MeoAssistant/StageDropsTaskPlugin.h index 00742bef65..6091530da3 100644 --- a/src/MeoAssistant/StageDropsTaskPlugin.h +++ b/src/MeoAssistant/StageDropsTaskPlugin.h @@ -20,6 +20,7 @@ namespace asst virtual void set_task_ptr(AbstractTask* ptr) override; bool set_penguin_id(std::string id); + bool set_server(std::string server); private: virtual bool _run() override; @@ -35,5 +36,6 @@ namespace asst std::vector> m_upload_pending; ProcessTask* m_cast_ptr = nullptr; std::string m_penguin_id; + std::string m_server = "CN"; }; } diff --git a/src/MeoAssistant/TemplResource.cpp b/src/MeoAssistant/TemplResource.cpp index 6ee05cfb48..89fd7ac5da 100644 --- a/src/MeoAssistant/TemplResource.cpp +++ b/src/MeoAssistant/TemplResource.cpp @@ -25,12 +25,15 @@ bool asst::TemplResource::load(const std::string& dir) cv::Mat templ = cv::imread(filepath); emplace_templ(filename, std::move(templ)); } + else if (m_loaded) { + continue; + } else { m_last_error = filepath + " not exists"; return false; } } - + m_loaded = true; return true; } @@ -52,5 +55,5 @@ const cv::Mat asst::TemplResource::get_templ(const std::string& key) const noexc void asst::TemplResource::emplace_templ(std::string key, cv::Mat templ) { - m_templs.emplace(std::move(key), std::move(templ)); + m_templs[std::move(key)] = std::move(templ); } diff --git a/src/MeoAssistant/TemplResource.h b/src/MeoAssistant/TemplResource.h index a8303488b2..953212c0bc 100644 --- a/src/MeoAssistant/TemplResource.h +++ b/src/MeoAssistant/TemplResource.h @@ -26,5 +26,7 @@ namespace asst private: std::unordered_set m_templs_filename; std::unordered_map m_templs; + + bool m_loaded = false; }; } diff --git a/src/MeoAssistant/TilePack.cpp b/src/MeoAssistant/TilePack.cpp index e66b537249..04811081bd 100644 --- a/src/MeoAssistant/TilePack.cpp +++ b/src/MeoAssistant/TilePack.cpp @@ -10,6 +10,10 @@ bool asst::TilePack::load(const std::string & dir) { LogTraceFunction; + if (!std::filesystem::exists(dir)) { + return false; + } + constexpr static const char* filename = "/levels.json"; try { diff --git a/tools/TestCaller/main.cpp b/tools/TestCaller/main.cpp index 635a3e7270..b0b4e92e91 100644 --- a/tools/TestCaller/main.cpp +++ b/tools/TestCaller/main.cpp @@ -15,13 +15,16 @@ int main(int argc, char** argv) // 若使用 VS,请先设置 TestCaller 属性-调试-工作目录为 $(TargetDir) AsstLoadResource(get_cur_dir().c_str()); + // 增量更新国际服的资源 + //AsstLoadResource((get_cur_dir() + R"(/resource/international/US)").c_str()); + auto ptr = AsstCreate(); if (ptr == nullptr) { std::cerr << "create failed" << std::endl; return -1; } - bool connected = AsstConnect(ptr, "adb", "127.0.0.1:5555", ""); + bool connected = AsstConnect(ptr, "adb", "127.0.0.1:7555", ""); if (!connected) { std::cerr << "connect failed" << std::endl; AsstDestroy(ptr); @@ -32,58 +35,58 @@ int main(int argc, char** argv) /* 详细参数可参考 docs / 集成文档.md */ - AsstAppendTask(ptr, "StartUp", R"({})"); + //AsstAppendTask(ptr, "StartUp", R"({})"); AsstAppendTask(ptr, "Fight", R"( { - "stage": "CE-5" + "stage": "" } )"); - AsstAppendTask(ptr, "Recruit", R"( -{ - "select":[4], - "confirm":[3,4], - "times":4 -} - )"); - - AsstAppendTask(ptr, "Infrast", R"( -{ - "facility": ["Mfg", "Trade", "Power", "Control", "Reception", "Office", "Dorm"], - "drones": "Money" -} -)"); - - AsstAppendTask(ptr, "Visit", R"({})"); - - AsstAppendTask(ptr, "Mall", R"( -{ - "shopping": true, - "is_black_list": false, - "shopping_list": [ - "家具", - "碳" - ] -} -)"); - AsstAppendTask(ptr, "Award", R"({})"); - - AsstAppendTask(ptr, "Roguelike", R"( -{ - "opers": [ - { - "name": "帕拉斯" - }, - { - "name": "梓兰" - }, - { - "name": "安赛尔" - } - ] -} -)"); + // AsstAppendTask(ptr, "Recruit", R"( + //{ + // "select":[4], + // "confirm":[3,4], + // "times":4 + //} + // )"); + // + // AsstAppendTask(ptr, "Infrast", R"( + //{ + // "facility": ["Mfg", "Trade", "Power", "Control", "Reception", "Office", "Dorm"], + // "drones": "Money" + //} + //)"); + // + // AsstAppendTask(ptr, "Visit", R"({})"); + // + // AsstAppendTask(ptr, "Mall", R"( + //{ + // "shopping": true, + // "is_black_list": false, + // "shopping_list": [ + // "家具", + // "碳" + // ] + //} + //)"); + // AsstAppendTask(ptr, "Award", R"({})"); + // + // AsstAppendTask(ptr, "Roguelike", R"( + //{ + // "opers": [ + // { + // "name": "帕拉斯" + // }, + // { + // "name": "梓兰" + // }, + // { + // "name": "安赛尔" + // } + // ] + //} + //)"); AsstStart(ptr);