From 26dde72f6619c5d7dfca68f77f9ef857b0d8aa4d Mon Sep 17 00:00:00 2001 From: MistEO Date: Thu, 10 Mar 2022 23:24:44 +0800 Subject: [PATCH] =?UTF-8?q?feat.=E5=AE=8C=E6=88=90=E9=9B=86=E6=88=90?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E4=B8=AD=E7=94=BB=E7=9A=84=E9=A5=BC=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E5=B0=91=E9=87=8F=E4=BF=AE=E6=94=B9=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ~~肉鸽选干员除外~~ --- docs/集成文档.md | 26 +- src/MeoAssistant/Assistant.cpp | 15 +- src/MeoAssistant/AutoRecruitTask.cpp | 4 +- src/MeoAssistant/AwardTask.h | 2 +- src/MeoAssistant/FightTask.cpp | 24 +- src/MeoAssistant/FightTask.h | 4 +- src/MeoAssistant/GeneralConfiger.h | 1 - src/MeoAssistant/InfrastAbstractTask.cpp | 6 + src/MeoAssistant/InfrastAbstractTask.h | 5 +- src/MeoAssistant/InfrastTask.cpp | 101 ++++++++ src/MeoAssistant/InfrastTask.h | 38 +++ src/MeoAssistant/MallTask.h | 2 +- src/MeoAssistant/MeoAssistant.vcxproj | 10 +- src/MeoAssistant/MeoAssistant.vcxproj.filters | 22 +- src/MeoAssistant/PackageTask.cpp | 2 +- src/MeoAssistant/PackageTask.h | 2 +- src/MeoAssistant/RecruitCalcTask.cpp | 221 ++++++++++++++++ src/MeoAssistant/RecruitCalcTask.h | 42 ++++ src/MeoAssistant/RecruitTask.cpp | 237 +++--------------- src/MeoAssistant/RecruitTask.h | 41 +-- .../RoguelikeFormationTaskPlugin.cpp | 6 + .../RoguelikeFormationTaskPlugin.h | 10 + src/MeoAssistant/RoguelikeTask.cpp | 50 ++++ src/MeoAssistant/RoguelikeTask.h | 21 ++ src/MeoAssistant/StageDropsTaskPlugin.cpp | 13 +- src/MeoAssistant/StageDropsTaskPlugin.h | 2 + src/MeoAssistant/StartUpTask.cpp | 9 - src/MeoAssistant/StartUpTask.h | 4 +- src/MeoAssistant/VisitTask.h | 2 +- 29 files changed, 636 insertions(+), 286 deletions(-) create mode 100644 src/MeoAssistant/InfrastTask.cpp create mode 100644 src/MeoAssistant/InfrastTask.h create mode 100644 src/MeoAssistant/RecruitCalcTask.cpp create mode 100644 src/MeoAssistant/RecruitCalcTask.h create mode 100644 src/MeoAssistant/RoguelikeTask.cpp create mode 100644 src/MeoAssistant/RoguelikeTask.h diff --git a/docs/集成文档.md b/docs/集成文档.md index 5b069d878b..0f21271099 100644 --- a/docs/集成文档.md +++ b/docs/集成文档.md @@ -41,11 +41,11 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p ```jsonc // 对应的任务参数 { - "stage": string, // 关卡名,可选,默认“当前关卡”。不支持运行中设置 - "mecidine": int, // 最大使用理智药数量,可选,默认 0 - "stone": int, // 最大吃石头数量,可选,默认 0 - "times": int, // 指定次数,可选,默认无穷大 - "penguin_id": string // 企鹅数据汇报 id, 选填 + "stage": string, // 关卡名,可选,默认“当前关卡”。不支持运行中设置 + "mecidine": int, // 最大使用理智药数量,可选,默认 0 + "stone": int, // 最大吃石头数量,可选,默认 0 + "times": int, // 指定次数,可选,默认无穷大 + "penguin_id": string // 企鹅数据汇报 id, 可选,默认为空 } ``` @@ -64,9 +64,9 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p int, ... ], - "times": int, // 招募多少次,必选。若仅公招计算,可设置为 0 - "expedite": bool, // 是否使用加急许可,可选,默认 false - "expedite_times": int, // 加急次数,仅在 expedite 为 true 时有效。 + "times": int, // 招募多少次,可选,默认 0。若仅公招计算,可设置为 0 + "expedite": bool, // 是否使用加急许可,可选,默认 false + "expedite_times": int, // 加急次数,仅在 expedite 为 true 时有效。 // 可选,默认无限使用(直到 times 达到上限) } ``` @@ -77,13 +77,13 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p ```jsonc { "mode": int, // 换班工作模式,保留接口,暂时可以不传。不支持运行中设置 - "facility": [ // 要换班的设施(有序),必选项。不支持运行中设置 + "facility": [ // 要换班的设施(有序),必选。不支持运行中设置 string, // 设施名,"Mfg" | "Trade" | "Power" | "Control" | "Reception" | "Office" | "Dorm" ... ], - "drones": string, // 无人机用途,可选项,默认不使用 + "drones": string, // 无人机用途,可选项,默认 _NotUse // "_NotUse"、"Money"、"SyntheticJade"、"CombatRecord"、"PureGold"、"OriginStone"、"Chip" - "threshold": float, // 宿舍进驻心情阈值,必选项。取值范围 [0, 1.0] + "threshold": float, // 宿舍进驻心情阈值,可选,取值范围 [0, 1.0],默认 0.3 } ``` @@ -115,12 +115,12 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p ```jsonc { - "mode": int, // 模式,必选项。 + "mode": int, // 模式,可选项。默认 0 // 0 - 尽可能一直往后打 // 1 - 第一层投资完源石锭就退出 // 2 - 投资过后再退出,没有投资就继续往后打 - "oper": [ // 会去选择的干员,必选项。数组有序 + "opers": [ // 会去选择的干员,必选项。数组有序 { "name": string, // 干员名,必选项 "fullMatch": bool, // 干员名是否需要全字匹配,可选项。默认 false diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp index 4f7ffbabcc..552cd0c7b6 100644 --- a/src/MeoAssistant/Assistant.cpp +++ b/src/MeoAssistant/Assistant.cpp @@ -5,18 +5,21 @@ #include #include +#include "AsstDef.h" #include "AsstUtils.hpp" #include "Controller.h" #include "Logger.hpp" #include "Resource.h" #include "RuntimeStatus.h" -#include "AsstDef.h" #include "FightTask.h" #include "StartUpTask.h" #include "AwardTask.h" #include "VisitTask.h" #include "MallTask.h" +#include "InfrastTask.h" +#include "RecruitTask.h" +#include "RoguelikeTask.h" using namespace asst; @@ -77,6 +80,7 @@ asst::Assistant::TaskId asst::Assistant::append_task(const std::string& type, co } std::shared_ptr ptr = nullptr; + if (type == FightTask::TaskType) { ptr = std::make_shared(task_callback, (void*)this); } @@ -92,6 +96,15 @@ asst::Assistant::TaskId asst::Assistant::append_task(const std::string& type, co else if (type == MallTask::TaskType) { ptr = std::make_shared(task_callback, (void*)this); } + else if (type == InfrastTask::TaskType) { + ptr = std::make_shared(task_callback, (void*)this); + } + else if (type == RecruitTask::TaskType) { + ptr = std::make_shared(task_callback, (void*)this); + } + else if (type == RoguelikeTask::TaskType) { + ptr = std::make_shared(task_callback, (void*)this); + } bool params_ret = ptr->set_params(ret.value()); if (!params_ret) { diff --git a/src/MeoAssistant/AutoRecruitTask.cpp b/src/MeoAssistant/AutoRecruitTask.cpp index 979b83e747..a914e3292f 100644 --- a/src/MeoAssistant/AutoRecruitTask.cpp +++ b/src/MeoAssistant/AutoRecruitTask.cpp @@ -5,7 +5,7 @@ #include "Controller.h" #include "RecruitImageAnalyzer.h" #include "ProcessTask.h" -#include "RecruitTask.h" +#include "RecruitCalcTask.h" asst::AutoRecruitTask& asst::AutoRecruitTask::set_select_level(std::vector select_level) noexcept { @@ -108,7 +108,7 @@ bool asst::AutoRecruitTask::recruit_index(size_t index) bool asst::AutoRecruitTask::calc_and_recruit() { - RecruitTask recurit_task(m_callback, m_callback_arg, m_task_chain); + RecruitCalcTask recurit_task(m_callback, m_callback_arg, m_task_chain); recurit_task.set_retry_times(m_retry_times); recurit_task.set_param(m_select_level, true); diff --git a/src/MeoAssistant/AwardTask.h b/src/MeoAssistant/AwardTask.h index c72dc2ef57..6c4ea2c2ad 100644 --- a/src/MeoAssistant/AwardTask.h +++ b/src/MeoAssistant/AwardTask.h @@ -5,7 +5,7 @@ namespace asst { class ProcessTask; - class AwardTask : public PackageTask + class AwardTask final : public PackageTask { public: AwardTask(AsstCallback callback, void* callback_arg); diff --git a/src/MeoAssistant/FightTask.cpp b/src/MeoAssistant/FightTask.cpp index 174ce2a49d..eb60707730 100644 --- a/src/MeoAssistant/FightTask.cpp +++ b/src/MeoAssistant/FightTask.cpp @@ -29,8 +29,8 @@ asst::FightTask::FightTask(AsstCallback callback, void* callback_arg) .set_times_limit("StoneConfirm", 0) .set_times_limit("StartButton1", INT_MAX) .set_times_limit("StartButton2", INT_MAX); - m_fight_task_ptr->regiseter_plugin() - ->set_retry_times(0); + m_stage_drops_plugin_ptr = m_fight_task_ptr->regiseter_plugin(); + m_stage_drops_plugin_ptr->set_retry_times(0); m_subtasks.emplace_back(m_fight_task_ptr); } @@ -41,13 +41,10 @@ bool asst::FightTask::set_params(const json::value& params) const int mecidine = params.get("mecidine", 0); const int stone = params.get("stone", 0); const int times = params.get("times", INT_MAX); + std::string penguin_id = params.get("penguin_id", ""); - if (!runned) { + if (!m_runned) { m_stage_task_ptr->set_tasks({ stage }); - m_fight_task_ptr->set_times_limit("MedicineConfirm", mecidine) - .set_times_limit("StoneConfirm", stone) - .set_times_limit("StartButton1", times) - .set_times_limit("StartButton2", times); m_subtasks.clear(); @@ -57,11 +54,12 @@ bool asst::FightTask::set_params(const json::value& params) } m_subtasks.emplace_back(m_fight_task_ptr); } - else { - m_fight_task_ptr->set_times_limit("MedicineConfirm", mecidine) - .set_times_limit("StoneConfirm", stone) - .set_times_limit("StartButton1", times) - .set_times_limit("StartButton2", times); - } + + m_fight_task_ptr->set_times_limit("MedicineConfirm", mecidine) + .set_times_limit("StoneConfirm", stone) + .set_times_limit("StartButton1", times) + .set_times_limit("StartButton2", times); + m_stage_drops_plugin_ptr->set_penguin_id(std::move(penguin_id)); + return true; } diff --git a/src/MeoAssistant/FightTask.h b/src/MeoAssistant/FightTask.h index 363f9c0fb5..6a97267d72 100644 --- a/src/MeoAssistant/FightTask.h +++ b/src/MeoAssistant/FightTask.h @@ -6,8 +6,9 @@ namespace asst { class ProcessTask; + class StageDropsTaskPlugin; - class FightTask : public PackageTask + class FightTask final : public PackageTask { public: FightTask(AsstCallback callback, void* callback_arg); @@ -21,5 +22,6 @@ namespace asst std::shared_ptr m_start_up_task_ptr = nullptr; std::shared_ptr m_stage_task_ptr = nullptr; std::shared_ptr m_fight_task_ptr = nullptr; + std::shared_ptr m_stage_drops_plugin_ptr = nullptr; }; } diff --git a/src/MeoAssistant/GeneralConfiger.h b/src/MeoAssistant/GeneralConfiger.h index e658ba0d7b..917a917d47 100644 --- a/src/MeoAssistant/GeneralConfiger.h +++ b/src/MeoAssistant/GeneralConfiger.h @@ -23,7 +23,6 @@ namespace asst { bool enable = false; std::string cmd_format; // 命令格式 - std::string extra_param; // 额外参数 std::string server; // 上传参数中"server"字段,"CN", "US", "JP" and "KR". }; diff --git a/src/MeoAssistant/InfrastAbstractTask.cpp b/src/MeoAssistant/InfrastAbstractTask.cpp index 28bc0c8efb..8ccaf45a44 100644 --- a/src/MeoAssistant/InfrastAbstractTask.cpp +++ b/src/MeoAssistant/InfrastAbstractTask.cpp @@ -11,6 +11,12 @@ #include "Resource.h" #include "ProcessTask.h" +asst::InfrastAbstractTask::InfrastAbstractTask(AsstCallback callback, void* callback_arg, std::string task_chain) + : AbstractTask(callback, callback_arg, task_chain) +{ + m_retry_times = TaskRetryTimes; +} + asst::InfrastAbstractTask& asst::InfrastAbstractTask::set_work_mode(infrast::WorkMode work_mode) noexcept { m_work_mode = work_mode; diff --git a/src/MeoAssistant/InfrastAbstractTask.h b/src/MeoAssistant/InfrastAbstractTask.h index b4cf1bbffd..326bdfe887 100644 --- a/src/MeoAssistant/InfrastAbstractTask.h +++ b/src/MeoAssistant/InfrastAbstractTask.h @@ -8,7 +8,7 @@ namespace asst class InfrastAbstractTask : public AbstractTask { public: - using AbstractTask::AbstractTask; + InfrastAbstractTask(AsstCallback callback, void* callback_arg, std::string task_chain); virtual ~InfrastAbstractTask() = default; InfrastAbstractTask& set_work_mode(infrast::WorkMode work_mode) noexcept; @@ -20,6 +20,7 @@ namespace asst virtual size_t max_num_of_opers() const noexcept { return 1ULL; } constexpr static int OperSelectRetryTimes = 3; + constexpr static int TaskRetryTimes = 3; protected: virtual bool on_run_fails() override; @@ -38,7 +39,7 @@ namespace asst virtual bool click_confirm_button(); // 点击干员选择页面的“确认”按钮 int m_last_swipe_id = 0; - infrast::WorkMode m_work_mode = infrast::WorkMode::Gentle; + infrast::WorkMode m_work_mode = infrast::WorkMode::Aggressive; std::string m_work_mode_name = "Gentle"; double m_mood_threshold = 0; mutable std::string m_facility_name_cache; diff --git a/src/MeoAssistant/InfrastTask.cpp b/src/MeoAssistant/InfrastTask.cpp new file mode 100644 index 0000000000..108096829c --- /dev/null +++ b/src/MeoAssistant/InfrastTask.cpp @@ -0,0 +1,101 @@ +#include "InfrastTask.h" + +#include "Logger.hpp" + +#include "ProcessTask.h" +#include "InfrastInfoTask.h" +#include "InfrastMfgTask.h" +#include "InfrastTradeTask.h" +#include "InfrastPowerTask.h" +#include "InfrastControlTask.h" +#include "InfrastReceptionTask.h" +#include "InfrastOfficeTask.h" +#include "InfrastDormTask.h" +#include "DronesForShamareTaskPlugin.h" + +asst::InfrastTask::InfrastTask(AsstCallback callback, void* callback_arg) + : PackageTask(callback, callback_arg, TaskType), + m_infrast_begin_task_ptr(std::make_shared(callback, callback_arg, TaskType)), + m_info_task_ptr(std::make_shared(callback, callback_arg, TaskType)), + m_mfg_task_ptr(std::make_shared(callback, callback_arg, TaskType)), + m_trade_task_ptr(std::make_shared(callback, callback_arg, TaskType)), + m_power_task_ptr(std::make_shared(callback, callback_arg, TaskType)), + m_control_task_ptr(std::make_shared(callback, callback_arg, TaskType)), + m_reception_task_ptr(std::make_shared(callback, callback_arg, TaskType)), + m_office_task_ptr(std::make_shared(callback, callback_arg, TaskType)), + m_dorm_task_ptr(std::make_shared(callback, callback_arg, TaskType)) +{ + m_infrast_begin_task_ptr->set_tasks({ "InfrastBegin" }); + m_trade_task_ptr->regiseter_plugin(); + m_subtasks.emplace_back(m_infrast_begin_task_ptr); +} + +bool asst::InfrastTask::set_params(const json::value& params) +{ + if (!m_runned) { + if (!params.contains("facility") || !params.at("facility").is_array()) { + return false; + } + + auto append_infrast_begin = [&]() { + m_subtasks.emplace_back(m_infrast_begin_task_ptr); + }; + + m_subtasks.clear(); + append_infrast_begin(); + + for (const auto& facility_json : params.at("facility").as_array()) { + if (!facility_json.is_string()) { + m_subtasks.clear(); + append_infrast_begin(); + return false; + } + + std::string facility = facility_json.as_string(); + if (facility == "Dorm") { + m_subtasks.emplace_back(m_dorm_task_ptr); + } + else if (facility == "Mfg") { + m_subtasks.emplace_back(m_mfg_task_ptr); + } + else if (facility == "Trade") { + m_subtasks.emplace_back(m_trade_task_ptr); + } + else if (facility == "Power") { + m_subtasks.emplace_back(m_power_task_ptr); + } + else if (facility == "Office") { + m_subtasks.emplace_back(m_office_task_ptr); + } + else if (facility == "Reception") { + m_subtasks.emplace_back(m_reception_task_ptr); + } + else if (facility == "Control") { + m_subtasks.emplace_back(m_control_task_ptr); + } + else { + Log.error(__FUNCTION__, "| Unknown facility", facility); + m_subtasks.clear(); + append_infrast_begin(); + return false; + } + append_infrast_begin(); + } + } + + std::string drones = params.get("drones", "_NotUse"); + m_mfg_task_ptr->set_uses_of_drone(drones); + m_trade_task_ptr->set_uses_of_drone(drones); + + double threshold = params.get("threshold", 0.3); + m_info_task_ptr->set_mood_threshold(threshold); + m_mfg_task_ptr->set_mood_threshold(threshold); + m_trade_task_ptr->set_mood_threshold(threshold); + m_power_task_ptr->set_mood_threshold(threshold); + m_control_task_ptr->set_mood_threshold(threshold); + m_reception_task_ptr->set_mood_threshold(threshold); + m_office_task_ptr->set_mood_threshold(threshold); + m_dorm_task_ptr->set_mood_threshold(threshold); + + return true; +} diff --git a/src/MeoAssistant/InfrastTask.h b/src/MeoAssistant/InfrastTask.h new file mode 100644 index 0000000000..a088310de9 --- /dev/null +++ b/src/MeoAssistant/InfrastTask.h @@ -0,0 +1,38 @@ +#pragma once +#include "PackageTask.h" + +namespace asst +{ + class ProcessTask; + class InfrastInfoTask; + class InfrastMfgTask; + class InfrastTradeTask; + class InfrastPowerTask; + class InfrastControlTask; + class InfrastReceptionTask; + class InfrastOfficeTask; + class InfrastDormTask; + + class InfrastTask final : public PackageTask + { + public: + public: + InfrastTask(AsstCallback callback, void* callback_arg); + virtual ~InfrastTask() = default; + + virtual bool set_params(const json::value& params) override; + + static constexpr const char* TaskType = "Infrast"; + + private: + std::shared_ptr m_infrast_begin_task_ptr = nullptr; + std::shared_ptr m_info_task_ptr = nullptr; + std::shared_ptr m_mfg_task_ptr = nullptr; + std::shared_ptr m_trade_task_ptr = nullptr; + std::shared_ptr m_power_task_ptr = nullptr; + std::shared_ptr m_control_task_ptr = nullptr; + std::shared_ptr m_reception_task_ptr = nullptr; + std::shared_ptr m_office_task_ptr = nullptr; + std::shared_ptr m_dorm_task_ptr = nullptr; + }; +} diff --git a/src/MeoAssistant/MallTask.h b/src/MeoAssistant/MallTask.h index 3f92c89317..71380a716d 100644 --- a/src/MeoAssistant/MallTask.h +++ b/src/MeoAssistant/MallTask.h @@ -6,7 +6,7 @@ namespace asst class ProcessTask; class CreditShoppingTask; - class MallTask : public PackageTask + class MallTask final : public PackageTask { public: MallTask(AsstCallback callback, void* callback_arg); diff --git a/src/MeoAssistant/MeoAssistant.vcxproj b/src/MeoAssistant/MeoAssistant.vcxproj index 5b91d0990a..271068d44a 100644 --- a/src/MeoAssistant/MeoAssistant.vcxproj +++ b/src/MeoAssistant/MeoAssistant.vcxproj @@ -29,8 +29,10 @@ + + @@ -62,12 +64,13 @@ - + + @@ -90,8 +93,10 @@ + + @@ -124,12 +129,13 @@ - + + diff --git a/src/MeoAssistant/MeoAssistant.vcxproj.filters b/src/MeoAssistant/MeoAssistant.vcxproj.filters index 88bb1de48e..87bee6484f 100644 --- a/src/MeoAssistant/MeoAssistant.vcxproj.filters +++ b/src/MeoAssistant/MeoAssistant.vcxproj.filters @@ -243,7 +243,7 @@ 头文件\Task\Sub - + 头文件\Task\Sub @@ -285,6 +285,15 @@ 头文件\Task + + 头文件\Task\Sub + + + 头文件\Task + + + 头文件\Task + @@ -422,7 +431,7 @@ 源文件\Task\Sub - + 源文件\Task\Sub @@ -464,6 +473,15 @@ 源文件\Task + + 源文件\Task + + + 源文件\Task + + + 源文件\Task + diff --git a/src/MeoAssistant/PackageTask.cpp b/src/MeoAssistant/PackageTask.cpp index 8a5b6a60be..4d6abcce73 100644 --- a/src/MeoAssistant/PackageTask.cpp +++ b/src/MeoAssistant/PackageTask.cpp @@ -4,7 +4,7 @@ bool asst::PackageTask::run() { - runned = true; + m_runned = true; const auto task_delay = Resrc.cfg().get_options().task_delay; diff --git a/src/MeoAssistant/PackageTask.h b/src/MeoAssistant/PackageTask.h index c9c21fe832..98c9747eb4 100644 --- a/src/MeoAssistant/PackageTask.h +++ b/src/MeoAssistant/PackageTask.h @@ -30,7 +30,7 @@ namespace asst protected: virtual bool _run() override { return true; } - bool runned = false; + bool m_runned = false; std::vector> m_subtasks; }; } diff --git a/src/MeoAssistant/RecruitCalcTask.cpp b/src/MeoAssistant/RecruitCalcTask.cpp new file mode 100644 index 0000000000..0c24a11904 --- /dev/null +++ b/src/MeoAssistant/RecruitCalcTask.cpp @@ -0,0 +1,221 @@ +#include "RecruitCalcTask.h" + +#include +#include + +#include "Controller.h" +#include "RecruitImageAnalyzer.h" +#include "Resource.h" +#include "ProcessTask.h" + +using namespace asst; + +bool RecruitCalcTask::_run() +{ + m_maybe_level = 0; + m_has_special_tag = false; + m_has_refresh = false; + + const cv::Mat image = m_ctrler->get_image(); + RecruitImageAnalyzer analyzer(image); + + if (!analyzer.analyze()) { + return false; + } + m_has_refresh = !analyzer.get_refresh_rect().empty(); + + if (m_set_time) { + for (const auto& rect : analyzer.get_set_time_rect()) { + m_ctrler->click(rect, false); + } + } + const std::vector& all_tags = analyzer.get_tags_result(); + + std::unordered_set all_tags_name; + std::vector all_tags_json_vector; + for (const TextRect& text_area : all_tags) { + all_tags_name.emplace(text_area.text); + all_tags_json_vector.emplace_back(text_area.text); + } + + /* 过滤tags数量不足的情况(可能是识别漏了) */ + if (all_tags.size() != RecruitConfiger::CorrectNumberOfTags) { + return false; + } + json::value info = basic_info(); + info["what"] = "RecruitTagsDetected"; + info["details"] = json::object{ + { "tags", json::array(all_tags_json_vector) } + }; + callback(AsstMsg::SubTaskExtraInfo, info); + + /* 针对特殊Tag的额外回调消息 */ + static const std::string SeniorOper = "高级资深干员"; + const std::vector SpecialTags = { SeniorOper, "资深干员" }; + + auto special_iter = std::find_first_of(SpecialTags.cbegin(), SpecialTags.cend(), all_tags_name.cbegin(), all_tags_name.cend()); + if (special_iter != SpecialTags.cend()) { + info["what"] = "RecruitSpecialTag"; + info["details"] = json::object{ + { "tag", *special_iter } + }; + callback(AsstMsg::SubTaskExtraInfo, info); + m_has_special_tag = true; + } + + // 识别到的5个Tags,全组合排列 + std::vector> all_combs; + size_t len = all_tags.size(); + int count = static_cast(std::pow(2, len)); + for (int i = 0; i < count; ++i) { + std::vector temp; + for (int j = 0, mask = 1; j < len; ++j) { + if ((i & mask) != 0) { // What the fuck??? + temp.emplace_back(all_tags.at(j).text); + } + mask = mask * 2; + } + // 游戏里最多选择3个tag + if (!temp.empty() && temp.size() <= 3) { + all_combs.emplace_back(std::move(temp)); + } + } + + std::vector result_vec; + for (const std::vector& comb : all_combs) { + RecruitCombs oper_combs; + oper_combs.tags = comb; + + for (const RecruitOperInfo& cur_oper : Resrc.recruit().get_all_opers()) { + int matched_count = 0; + for (const std::string& tag : comb) { + if (cur_oper.tags.find(tag) != cur_oper.tags.cend()) { + ++matched_count; + } + else { + break; + } + } + + // 单个tags comb中的每一个tag,这个干员都有,才算该干员符合这个tags comb + if (matched_count != comb.size()) { + continue; + } + + if (cur_oper.level == 6) { + // 高资tag和六星强绑定,如果没有高资tag,即使其他tag匹配上了也不可能出六星 + if (std::find(comb.cbegin(), comb.cend(), SeniorOper) == comb.cend()) { + continue; + } + } + + oper_combs.opers.emplace_back(cur_oper); + + if (cur_oper.level == 1 || cur_oper.level == 2) { + if (oper_combs.min_level == 0) + oper_combs.min_level = cur_oper.level; + if (oper_combs.max_level == 0) + oper_combs.max_level = cur_oper.level; + // 一星、二星干员不计入最低等级,因为拉满9小时之后不可能出1、2星 + continue; + } + if (oper_combs.min_level == 0 || oper_combs.min_level > cur_oper.level) { + oper_combs.min_level = cur_oper.level; + } + if (oper_combs.max_level == 0 || oper_combs.max_level < cur_oper.level) { + oper_combs.max_level = cur_oper.level; + } + oper_combs.avg_level += cur_oper.level; + } + if (!oper_combs.opers.empty()) { + oper_combs.avg_level /= oper_combs.opers.size(); + result_vec.emplace_back(std::move(oper_combs)); + } + } + + std::sort(result_vec.begin(), result_vec.end(), + [](const RecruitCombs& lhs, const RecruitCombs& rhs) -> bool { + // 最小等级大的,排前面 + if (lhs.min_level != rhs.min_level) { + return lhs.min_level > rhs.min_level; + } + // 最大等级大的,排前面 + else if (lhs.max_level != rhs.max_level) { + return lhs.max_level > rhs.max_level; + } + // 平均等级高的,排前面 + else if (std::fabs(lhs.avg_level - rhs.avg_level) > DoubleDiff) { + return lhs.avg_level > rhs.avg_level; + } + // Tag数量少的,排前面 + else { + return lhs.tags.size() < rhs.tags.size(); + } + }); + + if (!result_vec.empty()) { + m_maybe_level = result_vec.at(0).min_level; + } + else { + m_maybe_level = 0; + } + + /* 整理识别结果Json */ + json::value results_json; + results_json["result"] = json::array(); + results_json["level"] = m_maybe_level; + + std::vector result_json_vector; + for (const auto& comb : result_vec) { + auto& tags = comb.tags; + json::value comb_json; + + std::vector tags_json_vector; + for (const std::string& tag : tags) { + tags_json_vector.emplace_back(tag); + } + comb_json["tags"] = json::array(std::move(tags_json_vector)); + + std::vector opers_json_vector; + for (const RecruitOperInfo& oper_info : comb.opers) { + json::value oper_json; + oper_json["name"] = oper_info.name; + oper_json["level"] = oper_info.level; + opers_json_vector.emplace_back(std::move(oper_json)); + } + comb_json["opers"] = json::array(std::move(opers_json_vector)); + comb_json["level"] = comb.min_level; + results_json["result"].as_array().emplace_back(std::move(comb_json)); + } + info["what"] = "RecruitResult"; + info["details"] = results_json; + callback(AsstMsg::SubTaskExtraInfo, info); + + if (!result_vec.empty()) { + /* 点击最优解的tags */ + 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) { + if (std::find(final_tags_name.cbegin(), final_tags_name.cend(), text_area.text) != final_tags_name.cend()) { + m_ctrler->click(text_area.rect, true); + } + } + + info["what"] = "RecruitTagsSelected"; + info["details"] = json::object{ + { "tags", json::array(final_tags_name) } + }; + callback(AsstMsg::SubTaskExtraInfo, info); + } + } + + return true; +} + +RecruitCalcTask& RecruitCalcTask::set_param(std::vector select_level, bool set_time) noexcept +{ + m_select_level = std::move(select_level); + m_set_time = set_time; + return *this; +} diff --git a/src/MeoAssistant/RecruitCalcTask.h b/src/MeoAssistant/RecruitCalcTask.h new file mode 100644 index 0000000000..e003adf537 --- /dev/null +++ b/src/MeoAssistant/RecruitCalcTask.h @@ -0,0 +1,42 @@ +#pragma once + +#include "AbstractTask.h" + +#include + +namespace asst +{ + class RecruitCalcTask : public AbstractTask + { + public: + using AbstractTask::AbstractTask; + virtual ~RecruitCalcTask() = default; + + RecruitCalcTask& set_param(std::vector select_level, bool set_time = true) noexcept; + + bool get_has_special_tag() const noexcept + { + return m_has_special_tag; + } + bool get_has_refresh() const noexcept + { + return m_has_refresh; + } + int get_maybe_level() const noexcept + { + return m_maybe_level; + } + + protected: + virtual bool _run() override; + + /* 外部设置参数 */ + std::vector m_select_level; + bool m_set_time = false; + + /* 内部处理用参数*/ + int m_maybe_level = 0; + bool m_has_special_tag = false; + bool m_has_refresh = false; + }; +} diff --git a/src/MeoAssistant/RecruitTask.cpp b/src/MeoAssistant/RecruitTask.cpp index fcaddfce9e..ea1a6192fb 100644 --- a/src/MeoAssistant/RecruitTask.cpp +++ b/src/MeoAssistant/RecruitTask.cpp @@ -1,222 +1,57 @@ #include "RecruitTask.h" -#include -#include - -#include "Controller.h" -#include "RecruitImageAnalyzer.h" -#include "Resource.h" +#include "AutoRecruitTask.h" #include "ProcessTask.h" -using namespace asst; - -bool RecruitTask::_run() +asst::RecruitTask::RecruitTask(AsstCallback callback, void* callback_arg) + : PackageTask(callback, callback_arg, TaskType), + m_recruit_begin_task_ptr(std::make_shared(callback, callback_arg, TaskType)), + m_recruit_task_ptr(std::make_shared(callback, callback_arg, TaskType)) { - m_maybe_level = 0; - m_has_special_tag = false; - m_has_refresh = false; + m_recruit_begin_task_ptr->set_tasks({ "RecruitBegin" }); + m_subtasks.emplace_back(nullptr); // reversed for m_recruit_begin_task_ptr + m_subtasks.emplace_back(m_recruit_task_ptr); +} - const cv::Mat image = m_ctrler->get_image(); - RecruitImageAnalyzer analyzer(image); - - - if (!analyzer.analyze()) { +bool asst::RecruitTask::set_params(const json::value& params) +{ + if (!params.contains("select") || !params.at("select").is_array() + || !params.contains("confirm") || !params.at("confirm").is_array()) { return false; } - m_has_refresh = !analyzer.get_refresh_rect().empty(); + std::vector select; - if (m_set_time) { - for (const auto& rect : analyzer.get_set_time_rect()) { - m_ctrler->click(rect, false); + for (const auto& select_num_json : params.at("select").as_array()) { + if (!select_num_json.is_number()) { + return false; } + select.emplace_back(select_num_json.as_integer()); } - const std::vector& all_tags = analyzer.get_tags_result(); - - std::unordered_set all_tags_name; - std::vector all_tags_json_vector; - for (const TextRect& text_area : all_tags) { - all_tags_name.emplace(text_area.text); - all_tags_json_vector.emplace_back(text_area.text); - } - - /* 过滤tags数量不足的情况(可能是识别漏了) */ - if (all_tags.size() != RecruitConfiger::CorrectNumberOfTags) { - return false; - } - json::value info = basic_info(); - info["what"] = "RecruitTagsDetected"; - info["details"] = json::object{ - { "tags", json::array(all_tags_json_vector) } - }; - callback(AsstMsg::SubTaskExtraInfo, info); - - /* 针对特殊Tag的额外回调消息 */ - static const std::string SeniorOper = "高级资深干员"; - const std::vector SpecialTags = { SeniorOper, "资深干员" }; - - auto special_iter = std::find_first_of(SpecialTags.cbegin(), SpecialTags.cend(), all_tags_name.cbegin(), all_tags_name.cend()); - if (special_iter != SpecialTags.cend()) { - info["what"] = "RecruitSpecialTag"; - info["details"] = json::object{ - { "tag", *special_iter } - }; - callback(AsstMsg::SubTaskExtraInfo, info); - m_has_special_tag = true; - } - - // 识别到的5个Tags,全组合排列 - std::vector> all_combs; - size_t len = all_tags.size(); - int count = static_cast(std::pow(2, len)); - for (int i = 0; i < count; ++i) { - std::vector temp; - for (int j = 0, mask = 1; j < len; ++j) { - if ((i & mask) != 0) { // What the fuck??? - temp.emplace_back(all_tags.at(j).text); - } - mask = mask * 2; - } - // 游戏里最多选择3个tag - if (!temp.empty() && temp.size() <= 3) { - all_combs.emplace_back(std::move(temp)); + std::vector confirm; + for (const auto& confirm_num_json : params.at("confirm").as_array()) { + if (!confirm_num_json.is_number()) { + return false; } + confirm.emplace_back(confirm_num_json.as_integer()); } - std::vector result_vec; - for (const std::vector& comb : all_combs) { - RecruitCombs oper_combs; - oper_combs.tags = comb; + bool refresh = params.get("refresh", false); + int times = params.get("times", 0); + bool expedite = params.get("expedite", false); + [[maybe_unused]] int expedite_times = params.get("expedite_times", 0); - for (const RecruitOperInfo& cur_oper : Resrc.recruit().get_all_opers()) { - int matched_count = 0; - for (const std::string& tag : comb) { - if (cur_oper.tags.find(tag) != cur_oper.tags.cend()) { - ++matched_count; - } - else { - break; - } - } - - // 单个tags comb中的每一个tag,这个干员都有,才算该干员符合这个tags comb - if (matched_count != comb.size()) { - continue; - } - - if (cur_oper.level == 6) { - // 高资tag和六星强绑定,如果没有高资tag,即使其他tag匹配上了也不可能出六星 - if (std::find(comb.cbegin(), comb.cend(), SeniorOper) == comb.cend()) { - continue; - } - } - - oper_combs.opers.emplace_back(cur_oper); - - if (cur_oper.level == 1 || cur_oper.level == 2) { - if (oper_combs.min_level == 0) - oper_combs.min_level = cur_oper.level; - if (oper_combs.max_level == 0) - oper_combs.max_level = cur_oper.level; - // 一星、二星干员不计入最低等级,因为拉满9小时之后不可能出1、2星 - continue; - } - if (oper_combs.min_level == 0 || oper_combs.min_level > cur_oper.level) { - oper_combs.min_level = cur_oper.level; - } - if (oper_combs.max_level == 0 || oper_combs.max_level < cur_oper.level) { - oper_combs.max_level = cur_oper.level; - } - oper_combs.avg_level += cur_oper.level; - } - if (!oper_combs.opers.empty()) { - oper_combs.avg_level /= oper_combs.opers.size(); - result_vec.emplace_back(std::move(oper_combs)); - } - } - - std::sort(result_vec.begin(), result_vec.end(), - [](const RecruitCombs& lhs, const RecruitCombs& rhs) -> bool { - // 最小等级大的,排前面 - if (lhs.min_level != rhs.min_level) { - return lhs.min_level > rhs.min_level; - } - // 最大等级大的,排前面 - else if (lhs.max_level != rhs.max_level) { - return lhs.max_level > rhs.max_level; - } - // 平均等级高的,排前面 - else if (std::fabs(lhs.avg_level - rhs.avg_level) > DoubleDiff) { - return lhs.avg_level > rhs.avg_level; - } - // Tag数量少的,排前面 - else { - return lhs.tags.size() < rhs.tags.size(); - } - }); - - if (!result_vec.empty()) { - m_maybe_level = result_vec.at(0).min_level; + if (times == 0 || confirm.empty()) { // 仅识别的情况 + m_subtasks.at(0) = nullptr; } else { - m_maybe_level = 0; + m_subtasks.at(0) = m_recruit_begin_task_ptr; } - /* 整理识别结果Json */ - json::value results_json; - results_json["result"] = json::array(); - results_json["level"] = m_maybe_level; + m_recruit_task_ptr->set_max_times(times) + .set_need_refresh(refresh) + .set_use_expedited(expedite) + .set_select_level(std::move(select)) + .set_confirm_level(std::move(confirm)); - std::vector result_json_vector; - for (const auto& comb : result_vec) { - auto& tags = comb.tags; - json::value comb_json; - - std::vector tags_json_vector; - for (const std::string& tag : tags) { - tags_json_vector.emplace_back(tag); - } - comb_json["tags"] = json::array(std::move(tags_json_vector)); - - std::vector opers_json_vector; - for (const RecruitOperInfo& oper_info : comb.opers) { - json::value oper_json; - oper_json["name"] = oper_info.name; - oper_json["level"] = oper_info.level; - opers_json_vector.emplace_back(std::move(oper_json)); - } - comb_json["opers"] = json::array(std::move(opers_json_vector)); - comb_json["level"] = comb.min_level; - results_json["result"].as_array().emplace_back(std::move(comb_json)); - } - info["what"] = "RecruitResult"; - info["details"] = results_json; - callback(AsstMsg::SubTaskExtraInfo, info); - - if (!result_vec.empty()) { - /* 点击最优解的tags */ - 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) { - if (std::find(final_tags_name.cbegin(), final_tags_name.cend(), text_area.text) != final_tags_name.cend()) { - m_ctrler->click(text_area.rect, true); - } - } - - info["what"] = "RecruitTagsSelected"; - info["details"] = json::object{ - { "tags", json::array(final_tags_name) } - }; - callback(AsstMsg::SubTaskExtraInfo, info); - } - } - - return true; -} - -RecruitTask& RecruitTask::set_param(std::vector select_level, bool set_time) noexcept -{ - m_select_level = std::move(select_level); - m_set_time = set_time; - return *this; + return false; } diff --git a/src/MeoAssistant/RecruitTask.h b/src/MeoAssistant/RecruitTask.h index 3854882a8f..00e3fea9ea 100644 --- a/src/MeoAssistant/RecruitTask.h +++ b/src/MeoAssistant/RecruitTask.h @@ -1,42 +1,23 @@ #pragma once - -#include "AbstractTask.h" - -#include +#include "PackageTask.h" namespace asst { - class RecruitTask : public AbstractTask + class ProcessTask; + class AutoRecruitTask; + + class RecruitTask final : public PackageTask { public: - using AbstractTask::AbstractTask; + RecruitTask(AsstCallback callback, void* callback_arg); virtual ~RecruitTask() = default; - RecruitTask& set_param(std::vector select_level, bool set_time = true) noexcept; + virtual bool set_params(const json::value& params) override; - bool get_has_special_tag() const noexcept - { - return m_has_special_tag; - } - bool get_has_refresh() const noexcept - { - return m_has_refresh; - } - int get_maybe_level() const noexcept - { - return m_maybe_level; - } + static constexpr const char* TaskType = "Recruit"; - protected: - virtual bool _run() override; - - /* 外部设置参数 */ - std::vector m_select_level; - bool m_set_time = false; - - /* 内部处理用参数*/ - int m_maybe_level = 0; - bool m_has_special_tag = false; - bool m_has_refresh = false; + private: + std::shared_ptr m_recruit_begin_task_ptr = nullptr; + std::shared_ptr m_recruit_task_ptr = nullptr; }; } diff --git a/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp b/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp index 6554a49154..36b9483472 100644 --- a/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp +++ b/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp @@ -20,6 +20,12 @@ bool asst::RoguelikeFormationTaskPlugin::verify(AsstMsg msg, const json::value& } } +bool asst::RoguelikeFormationTaskPlugin::set_operators(std::vector opers) +{ + m_opers = std::move(opers); + return true; +} + bool asst::RoguelikeFormationTaskPlugin::_run() { RoguelikeFormationImageAnalyzer formation_analyzer(m_ctrler->get_image()); diff --git a/src/MeoAssistant/RoguelikeFormationTaskPlugin.h b/src/MeoAssistant/RoguelikeFormationTaskPlugin.h index a72f11db46..f75250dd3d 100644 --- a/src/MeoAssistant/RoguelikeFormationTaskPlugin.h +++ b/src/MeoAssistant/RoguelikeFormationTaskPlugin.h @@ -3,6 +3,12 @@ namespace asst { + struct BattleOper + { + std::string name; + bool full_match = false; + int skill = 1; + }; // 集成战略模式快捷编队任务 class RoguelikeFormationTaskPlugin : public AbstractTaskPlugin { @@ -12,7 +18,11 @@ namespace asst virtual bool verify(AsstMsg msg, const json::value& details) const override; + bool set_operators(std::vector opers); + protected: virtual bool _run() override; + + std::vector m_opers; }; } diff --git a/src/MeoAssistant/RoguelikeTask.cpp b/src/MeoAssistant/RoguelikeTask.cpp new file mode 100644 index 0000000000..c78867ef8a --- /dev/null +++ b/src/MeoAssistant/RoguelikeTask.cpp @@ -0,0 +1,50 @@ +#include "RoguelikeTask.h" + +#include "ProcessTask.h" +#include "RoguelikeFormationTaskPlugin.h" +#include "RoguelikeBattleTaskPlugin.h" + +#include "Logger.hpp" + +asst::RoguelikeTask::RoguelikeTask(AsstCallback callback, void* callback_arg) + : PackageTask(callback, callback_arg, TaskType), + m_roguelike_task_ptr(std::make_shared(callback, callback_arg, TaskType)) +{ + m_roguelike_task_ptr->set_tasks({ "Roguelike1Begin" }) + .set_retry_times(50); + m_roguelike_task_ptr->regiseter_plugin(); + m_roguelike_task_ptr->regiseter_plugin(); + + // 这个任务如果卡住会放弃当前的肉鸽并重新开始,所以多添加一点。先这样凑合用 + for (int i = 0; i != 10000; ++i) { + m_subtasks.emplace_back(m_roguelike_task_ptr); + } +} + +bool asst::RoguelikeTask::set_params(const json::value& params) +{ + // 0 - 尽可能一直往后打 + // 1 - 第一层投资完源石锭就退出 + // 2 - 投资过后再退出,没有投资就继续往后打 + int mode = params.get("mode", 0); + + switch (mode) { + case 0: + break; + case 1: + m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderLeave", 0); + break; + case 2: + m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderInvestCancel", 0); + break; + default: + Log.error(__FUNCTION__, "| Unknown mode", mode); + return false; + } + + if (params.contains("opers") && params.at("opers").is_array()) { + // TODO + } + + return true; +} diff --git a/src/MeoAssistant/RoguelikeTask.h b/src/MeoAssistant/RoguelikeTask.h new file mode 100644 index 0000000000..7d3148db38 --- /dev/null +++ b/src/MeoAssistant/RoguelikeTask.h @@ -0,0 +1,21 @@ +#pragma once +#include "PackageTask.h" + +namespace asst +{ + class ProcessTask; + + class RoguelikeTask : public PackageTask + { + public: + RoguelikeTask(AsstCallback callback, void* callback_arg); + virtual ~RoguelikeTask() = default; + + virtual bool set_params(const json::value& params) override; + + static constexpr const char* TaskType = "Roguelike"; + + private: + std::shared_ptr m_roguelike_task_ptr = nullptr; + }; +} diff --git a/src/MeoAssistant/StageDropsTaskPlugin.cpp b/src/MeoAssistant/StageDropsTaskPlugin.cpp index 05eb7b0e2d..269ffd5043 100644 --- a/src/MeoAssistant/StageDropsTaskPlugin.cpp +++ b/src/MeoAssistant/StageDropsTaskPlugin.cpp @@ -42,6 +42,12 @@ void asst::StageDropsTaskPlugin::set_task_ptr(AbstractTask* ptr) m_cast_ptr = dynamic_cast(ptr); } +bool asst::StageDropsTaskPlugin::set_penguin_id(std::string id) +{ + m_penguin_id = std::move(id); + return true; +} + bool asst::StageDropsTaskPlugin::_run() { LogTraceFunction; @@ -175,7 +181,12 @@ void asst::StageDropsTaskPlugin::upload_to_penguin() std::string body_escape = utils::string_replace_all(body.to_string(), "\"", "\\\""); std::string cmd_line = utils::string_replace_all(opt.penguin_report.cmd_format, "[body]", body_escape); - cmd_line = utils::string_replace_all(cmd_line, "[extra]", opt.penguin_report.extra_param); + + std::string extra_param; + if (!m_penguin_id.empty()) { + extra_param = "-H \"authorization: PenguinID " + m_penguin_id + "\""; + } + cmd_line = utils::string_replace_all(cmd_line, "[extra]", extra_param); Log.trace("request_penguin |", cmd_line); diff --git a/src/MeoAssistant/StageDropsTaskPlugin.h b/src/MeoAssistant/StageDropsTaskPlugin.h index 4ab5b3ac31..00742bef65 100644 --- a/src/MeoAssistant/StageDropsTaskPlugin.h +++ b/src/MeoAssistant/StageDropsTaskPlugin.h @@ -19,6 +19,7 @@ namespace asst virtual bool verify(AsstMsg msg, const json::value& details) const override; virtual void set_task_ptr(AbstractTask* ptr) override; + bool set_penguin_id(std::string id); private: virtual bool _run() override; @@ -33,5 +34,6 @@ namespace asst bool m_startbutton_delay_setted = false; std::vector> m_upload_pending; ProcessTask* m_cast_ptr = nullptr; + std::string m_penguin_id; }; } diff --git a/src/MeoAssistant/StartUpTask.cpp b/src/MeoAssistant/StartUpTask.cpp index 93862b6bd6..2dcea8e628 100644 --- a/src/MeoAssistant/StartUpTask.cpp +++ b/src/MeoAssistant/StartUpTask.cpp @@ -11,12 +11,3 @@ asst::StartUpTask::StartUpTask(AsstCallback callback, void* callback_arg) .set_times_limit("Terminal", 0); m_subtasks.emplace_back(m_start_up_task_ptr); } - -bool asst::StartUpTask::set_params([[maybe_unused]] const json::value& params) -{ - //if (!runned) { - // m_subtasks.clear(); - // m_subtasks.emplace_back(m_start_up_task_ptr); - //} - return true; -} diff --git a/src/MeoAssistant/StartUpTask.h b/src/MeoAssistant/StartUpTask.h index 01920bf8b1..801f77d398 100644 --- a/src/MeoAssistant/StartUpTask.h +++ b/src/MeoAssistant/StartUpTask.h @@ -5,14 +5,12 @@ namespace asst { class ProcessTask; - class StartUpTask : public PackageTask + class StartUpTask final : public PackageTask { public: StartUpTask(AsstCallback callback, void* callback_arg); virtual ~StartUpTask() = default; - virtual bool set_params(const json::value& params) override; - static constexpr const char* TaskType = "StartUp"; protected: diff --git a/src/MeoAssistant/VisitTask.h b/src/MeoAssistant/VisitTask.h index 5706eeb827..2d9e2b052e 100644 --- a/src/MeoAssistant/VisitTask.h +++ b/src/MeoAssistant/VisitTask.h @@ -5,7 +5,7 @@ namespace asst { class ProcessTask; - class VisitTask : public PackageTask + class VisitTask final : public PackageTask { public: VisitTask(AsstCallback callback, void* callback_arg);