diff --git a/docs/集成文档.md b/docs/集成文档.md
index 432206645e..409d8b1e8d 100644
--- a/docs/集成文档.md
+++ b/docs/集成文档.md
@@ -2,6 +2,56 @@
## 接口介绍
+### `AsstAppendTask`
+
+#### 接口原型
+
+```c++
+TaskHandle ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* params);
+```
+
+#### 接口说明
+
+添加任务
+
+#### 返回值
+
+- `TaskHandle`
+ 若添加成功,返回该任务句柄,可用于后续设置任务参数;
+ 若添加失败,返回 `NULL`
+
+#### 参数说明
+
+- `AsstHandle handle`
+ 实例句柄
+- `const char* type`
+ 任务类型
+- `const char* params`
+ 任务参数,json string
+
+##### 字段举例
+
+- `StartUp`
+ 开始唤醒
+
+```jsonc
+{
+ // 不支持参数设置
+}
+```
+
+- `Fight`
+ 刷理智
+
+```jsonc
+{
+ "stage": string, // 关卡名,可选,默认“当前关卡”。不支持运行中设置
+ "mecidine": int, // 最大使用理智药数量,可选,默认 0
+ "stone": int, // 最大吃石头数量,可选,默认 0
+ "times": int, // 指定次数,可选,默认无穷大
+}
+```
+
### `AsstSetParam`
#### 接口原型
@@ -31,4 +81,4 @@ bool ASSTAPI AsstSetParam(AsstHandle handle, const char* param_id, const char* p
| 参数作用 | 参数 id | 参数值 | 参数值示例 |
| ------- | ------- | ----- | -------- |
| 设置企鹅数据 id | `penguin_id` | { "id" : string } | `{ "id" : "1234567" }` |
-| 设置 OCR 任务目标 | `ocr_text` | { TaskName: [ string, ... ] } | `{ "Roguelike1ChooseOper" : [ "帕拉斯", "银灰" ] }` |
+| 设置 OCR 任务目标 | `ocr_text` | { TaskName: [ string, ... ] } | `{ "Roguelike1ChooseOper" : [ "帕拉斯", "银灰" ] }`
`{ "CreditShop-NotToBuy" : [ "碳", "家具" ] }` |
diff --git a/include/AsstCaller.h b/include/AsstCaller.h
index 9da5496e50..4fd901747c 100644
--- a/include/AsstCaller.h
+++ b/include/AsstCaller.h
@@ -5,34 +5,27 @@
namespace asst
{
class Assistant;
+ class PackageTask;
}
#ifdef __cplusplus
extern "C" {
#endif
typedef asst::Assistant* AsstHandle;
+ typedef asst::PackageTask* TaskHandle;
typedef void(ASST_CALL* AsstApiCallback)(int msg, const char* detail_json, void* custom_arg);
bool ASSTAPI AsstLoadResource(const char* path);
+
ASSTAPI_PORT AsstHandle ASST_CALL AsstCreate();
ASSTAPI_PORT AsstHandle ASST_CALL AsstCreateEx(AsstApiCallback callback, void* custom_arg);
void ASSTAPI AsstDestroy(AsstHandle handle);
bool ASSTAPI AsstConnect(AsstHandle handle, const char* adb_path, const char* address, const char* config);
- bool ASSTAPI AsstAppendStartUp(AsstHandle handle);
- bool ASSTAPI AsstAppendFight(AsstHandle handle, const char* stage, int max_mecidine, int max_stone, int max_times);
- bool ASSTAPI AsstAppendAward(AsstHandle handle);
- bool ASSTAPI AsstAppendVisit(AsstHandle handle);
- bool ASSTAPI AsstAppendMall(AsstHandle handle, bool with_shopping);
- // bool ASSTAPI AsstAppendProcessTask(AsstHandle handle, const char* task_name);
- bool ASSTAPI AsstAppendInfrast(AsstHandle handle, int work_mode, const char** order, int order_size, const char* uses_of_drones, double dorm_threshold);
- bool ASSTAPI AsstAppendRecruit(AsstHandle handle, int max_times, const int select_level[], int select_len, const int confirm_level[], int confirm_len, bool need_refresh, bool use_expedited);
- bool ASSTAPI AsstAppendRoguelike(AsstHandle handle, int mode);
+ TaskHandle ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* params);
+ bool ASSTAPI AsstSetTaskParams(AsstHandle handle, TaskHandle task, const char* params);
- bool ASSTAPI AsstAppendDebug(AsstHandle handle);
-
- bool ASSTAPI AsstStartRecruitCalc(AsstHandle handle, const int select_level[], int required_len, bool set_time);
bool ASSTAPI AsstStart(AsstHandle handle);
bool ASSTAPI AsstStop(AsstHandle handle);
@@ -42,7 +35,6 @@ extern "C" {
bool ASSTAPI AsstCtrlerClick(AsstHandle handle, int x, int y, bool block);
ASSTAPI_PORT const char* ASST_CALL AsstGetVersion();
-
void ASSTAPI AsstLog(const char* level, const char* message);
#ifdef __cplusplus
diff --git a/src/MeoAssistant/AbstractTask.h b/src/MeoAssistant/AbstractTask.h
index e02feb8f5e..d388249b9e 100644
--- a/src/MeoAssistant/AbstractTask.h
+++ b/src/MeoAssistant/AbstractTask.h
@@ -31,11 +31,11 @@ namespace asst
virtual bool run();
- AbstractTask& set_exit_flag(bool* exit_flag) noexcept;
- AbstractTask& set_retry_times(int times) noexcept;
- AbstractTask& set_ctrler(std::shared_ptr ctrler) noexcept;
- AbstractTask& set_status(std::shared_ptr status) noexcept;
- AbstractTask& set_task_data(std::shared_ptr task_data) noexcept;
+ virtual AbstractTask& set_exit_flag(bool* exit_flag) noexcept;
+ virtual AbstractTask& set_retry_times(int times) noexcept;
+ virtual AbstractTask& set_ctrler(std::shared_ptr ctrler) noexcept;
+ virtual AbstractTask& set_status(std::shared_ptr status) noexcept;
+ virtual AbstractTask& set_task_data(std::shared_ptr task_data) noexcept;
template
std::shared_ptr regiseter_plugin()
diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp
index 7e049d67e6..0993a9a45f 100644
--- a/src/MeoAssistant/Assistant.cpp
+++ b/src/MeoAssistant/Assistant.cpp
@@ -9,26 +9,12 @@
#include "Controller.h"
#include "Logger.hpp"
#include "Resource.h"
-
-#include "CreditShoppingTask.h"
-#include "RoguelikeBattleTaskPlugin.h"
-#include "RoguelikeFormationTaskPlugin.h"
-#include "InfrastDormTask.h"
-#include "InfrastInfoTask.h"
-#include "InfrastMfgTask.h"
-#include "InfrastOfficeTask.h"
-#include "InfrastPowerTask.h"
-#include "InfrastReceptionTask.h"
-#include "InfrastTradeTask.h"
-#include "ProcessTask.h"
-#include "RecruitTask.h"
-#include "AutoRecruitTask.h"
-#include "InfrastControlTask.h"
#include "RuntimeStatus.h"
-#include "StageDropsTaskPlugin.h"
-#include "DronesForShamareTaskPlugin.h"
#include "AsstDef.h"
+#include "FightTask.h"
+#include "StartUpTask.h"
+
using namespace asst;
Assistant::Assistant(AsstApiCallback callback, void* callback_arg)
@@ -78,329 +64,46 @@ bool asst::Assistant::connect(const std::string& adb_path, const std::string& ad
return ret;
}
-bool asst::Assistant::append_start_up()
+PackageTask* asst::Assistant::append_task(const std::string& type, const std::string& params)
{
- LogTraceFunction;
- if (!m_inited) {
- return false;
+ Log.info(__FUNCTION__, type, params);
+
+ auto ret = json::parse(params);
+ if (!ret) {
+ return nullptr;
}
- auto task_ptr = std::make_shared(task_callback, (void*)this, "StartUp");
- task_ptr->set_tasks({ "StartUp" })
- .set_times_limit("ReturnToTerminal", 0)
- .set_times_limit("Terminal", 0);
-
- std::unique_lock lock(m_mutex);
-
- m_tasks_queue.emplace(task_ptr);
-
- return true;
-}
-
-bool asst::Assistant::append_fight(const std::string& stage, int mecidine, int stone, int times)
-{
- LogTraceFunction;
- if (!m_inited) {
- return false;
+ std::shared_ptr ptr = nullptr;
+ if (type == "Fight") {
+ ptr = std::make_shared(task_callback, (void*)this);
+ ptr->set_params(ret.value());
}
-
- constexpr const char* TaskChain = "Fight";
-
- // 进入选关界面(主界面的“终端”点进去)
- auto terminal_task_ptr = std::make_shared(task_callback, (void*)this, TaskChain);
- terminal_task_ptr->set_tasks({ "StageBegin" })
- .set_times_limit("GoLastBattle", 0)
- .set_times_limit("StartButton1", 0)
- .set_times_limit("StartButton2", 0)
- .set_times_limit("MedicineConfirm", 0)
- .set_times_limit("StoneConfirm", 0);
-
- // 进入对应的关卡
- auto stage_task_ptr = std::make_shared(task_callback, (void*)this, TaskChain);
- stage_task_ptr->set_tasks({ stage })
- .set_times_limit("StartButton1", 0)
- .set_times_limit("StartButton2", 0)
- .set_times_limit("MedicineConfirm", 0)
- .set_times_limit("StoneConfirm", 0);
-
- // 开始战斗任务
- auto fight_task_ptr = std::make_shared(task_callback, (void*)this, TaskChain);
- fight_task_ptr->set_tasks({ "FightBegin" })
- .set_times_limit("MedicineConfirm", mecidine)
- .set_times_limit("StoneConfirm", stone)
- .set_times_limit("StartButton1", times)
- .set_times_limit("StartButton2", times);
- fight_task_ptr->regiseter_plugin()
- ->set_retry_times(0);
-
- std::unique_lock lock(m_mutex);
-
- if (!stage.empty()) {
- m_tasks_queue.emplace(terminal_task_ptr);
- m_tasks_queue.emplace(stage_task_ptr);
- }
- m_tasks_queue.emplace(fight_task_ptr);
-
- return true;
-}
-
-bool asst::Assistant::append_award()
-{
- std::unique_lock lock(m_mutex);
-
- return append_process_task("AwardBegin", "Award");
-}
-
-bool asst::Assistant::append_visit()
-{
- std::unique_lock lock(m_mutex);
-
- return append_process_task("VisitBegin", "Visit");
-}
-
-bool asst::Assistant::append_mall(bool with_shopping)
-{
- LogTraceFunction;
- if (!m_inited) {
- return false;
- }
-
- const std::string TaskChain = "Mall";
-
- std::unique_lock lock(m_mutex);
-
- append_process_task("MallBegin", TaskChain);
-
- if (with_shopping) {
- auto shopping_task_ptr = std::make_shared(task_callback, (void*)this, TaskChain);
- m_tasks_queue.emplace(shopping_task_ptr);
- }
-
- return true;
-}
-
-bool Assistant::append_process_task(const std::string& task_name, std::string task_chain, int retry_times)
-{
- LogTraceFunction;
- if (!m_inited) {
- return false;
- }
-
- //std::unique_lock lock(m_mutex);
-
- if (task_chain.empty()) {
- task_chain = task_name;
- }
-
- auto task_ptr = std::make_shared(task_callback, (void*)this, task_chain);
- task_ptr->set_tasks({ task_name })
- .set_retry_times(retry_times);
-
- m_tasks_queue.emplace(task_ptr);
-
- return true;
-}
-
-bool asst::Assistant::append_recruit(unsigned max_times, const std::vector& select_level, const std::vector& confirm_level, bool need_refresh, bool use_expedited)
-{
- LogTraceFunction;
- if (!m_inited) {
- return false;
- }
- constexpr static const char* TaskChain = "Recruit";
-
- auto recruit_task_ptr = std::make_shared(task_callback, (void*)this, TaskChain);
- recruit_task_ptr->set_max_times(max_times)
- .set_need_refresh(need_refresh)
- .set_use_expedited(use_expedited)
- .set_select_level(select_level)
- .set_confirm_level(confirm_level)
- .set_retry_times(AutoRecruitTaskRetryTimesDefault);
-
- std::unique_lock lock(m_mutex);
-
- append_process_task("RecruitBegin", TaskChain);
- m_tasks_queue.emplace(recruit_task_ptr);
-
- return true;
-}
-
-bool asst::Assistant::append_roguelike(int mode)
-{
- LogTraceFunction;
- if (!m_inited) {
- return false;
- }
-
- constexpr static const char* RoguelikeTaskChain = "Roguelike";
-
- auto roguelike_task_ptr = std::make_shared(task_callback, (void*)this, RoguelikeTaskChain);
- roguelike_task_ptr->set_tasks({ "Roguelike1Begin" })
- .set_retry_times(50);
-
- switch (mode) {
- case 0:
- break;
- case 1:
- roguelike_task_ptr->set_times_limit("Roguelike1StageTraderLeave", 0);
- break;
- case 2:
- roguelike_task_ptr->set_times_limit("Roguelike1StageTraderInvestCancel", 0);
- break;
- default:
- return false;
- }
-
- roguelike_task_ptr->regiseter_plugin();
- roguelike_task_ptr->regiseter_plugin();
-
- std::unique_lock lock(m_mutex);
-
- // 这个任务如果卡住会放弃当前的肉鸽并重新开始,所以多添加一点。先这样凑合用
- for (int i = 0; i != 10000; ++i) {
- m_tasks_queue.emplace(roguelike_task_ptr);
- }
-
- return true;
-}
-
-#ifdef ASST_DEBUG
-bool Assistant::append_debug()
-{
- LogTraceFunction;
- if (!m_inited) {
- return false;
+ else if (type == "StartUp") {
+ ptr = std::make_shared(task_callback, (void*)this);
+ ptr->set_params(ret.value());
}
std::unique_lock lock(m_mutex);
- {
- constexpr static const char* DebugTaskChain = "Debug";
-
- auto debug_task_ptr = std::make_shared(task_callback, (void*)this, DebugTaskChain);
- debug_task_ptr->set_stage_name("暴君");
-
- m_tasks_queue.emplace(debug_task_ptr);
- }
-
- return true;
+ return m_tasks_queue.emplace(ptr).get();
}
-#endif
-bool Assistant::start_recruit_calc(const std::vector& select_level, bool set_time)
+bool asst::Assistant::set_task_params(PackageTask* handle, const std::string& params)
{
- LogTraceFunction;
- if (!m_inited) {
+ Log.info(__FUNCTION__, handle, params);
+
+ if (!handle) {
return false;
}
- auto task_ptr = std::make_shared(task_callback, (void*)this, "RecruitCalc");
- task_ptr->set_retry_times(OpenRecruitTaskRetryTimesDefault);
- task_ptr->set_param(select_level, set_time);
-
- std::unique_lock lock(m_mutex);
-
- m_tasks_queue.emplace(task_ptr);
-
- return start(false);
-}
-
-bool asst::Assistant::append_infrast(infrast::WorkMode work_mode, const std::vector& order, const std::string& uses_of_drones, double dorm_threshold)
-{
- LogTraceFunction;
- if (!m_inited) {
+ auto ret = json::parse(params);
+ if (!ret) {
return false;
}
- // 保留接口,目前强制按激进模式进行换班
- work_mode = infrast::WorkMode::Aggressive;
+ // TODO: 检查任务句柄合法性
- constexpr static const char* InfrastTaskCahin = "Infrast";
- constexpr int InfrastRetryTimes = 3;
-
- // 这个流程任务,结束的时候是处于基建主界面的。既可以用于进入基建,也可以用于从设施里返回基建主界面
-
- auto append_infrast_begin = [&]() {
- append_process_task("InfrastBegin", InfrastTaskCahin);
- };
-
- append_infrast_begin();
-
- auto info_task_ptr = std::make_shared(task_callback, (void*)this, InfrastTaskCahin);
- info_task_ptr->set_work_mode(work_mode)
- .set_mood_threshold(dorm_threshold)
- .set_retry_times(InfrastRetryTimes);
-
- m_tasks_queue.emplace(info_task_ptr);
-
- // 因为后期要考虑多任务间的联动等,所以这些任务的声明暂时不放到for循环中
- auto mfg_task_ptr = std::make_shared(task_callback, (void*)this, InfrastTaskCahin);
- mfg_task_ptr->set_uses_of_drone(uses_of_drones)
- .set_work_mode(work_mode)
- .set_mood_threshold(dorm_threshold)
- .set_retry_times(InfrastRetryTimes);
-
- auto trade_task_ptr = std::make_shared(task_callback, (void*)this, InfrastTaskCahin);
- trade_task_ptr->set_uses_of_drone(uses_of_drones)
- .set_work_mode(work_mode)
- .set_mood_threshold(dorm_threshold)
- .set_retry_times(InfrastRetryTimes);
-
- trade_task_ptr->regiseter_plugin();
- auto power_task_ptr = std::make_shared(task_callback, (void*)this, InfrastTaskCahin);
- power_task_ptr->set_work_mode(work_mode)
- .set_mood_threshold(dorm_threshold)
- .set_retry_times(InfrastRetryTimes);
-
- auto office_task_ptr = std::make_shared(task_callback, (void*)this, InfrastTaskCahin);
- office_task_ptr->set_work_mode(work_mode)
- .set_mood_threshold(dorm_threshold)
- .set_retry_times(InfrastRetryTimes);
-
- auto recpt_task_ptr = std::make_shared(task_callback, (void*)this, InfrastTaskCahin);
- recpt_task_ptr->set_work_mode(work_mode)
- .set_mood_threshold(dorm_threshold);
- auto control_task_ptr = std::make_shared(task_callback, (void*)this, InfrastTaskCahin);
- control_task_ptr->set_work_mode(work_mode)
- .set_mood_threshold(dorm_threshold)
- .set_retry_times(InfrastRetryTimes);
-
- auto dorm_task_ptr = std::make_shared(task_callback, (void*)this, InfrastTaskCahin);
- dorm_task_ptr->set_work_mode(work_mode)
- .set_mood_threshold(dorm_threshold)
- .set_retry_times(InfrastRetryTimes);
-
- std::unique_lock lock(m_mutex);
-
- for (const auto& facility : order) {
- if (facility == "Dorm") {
- m_tasks_queue.emplace(dorm_task_ptr);
- }
- else if (facility == "Mfg") {
- m_tasks_queue.emplace(mfg_task_ptr);
- }
- else if (facility == "Trade") {
- m_tasks_queue.emplace(trade_task_ptr);
- }
- else if (facility == "Power") {
- m_tasks_queue.emplace(power_task_ptr);
- }
- else if (facility == "Office") {
- m_tasks_queue.emplace(office_task_ptr);
- }
- else if (facility == "Reception") {
- m_tasks_queue.emplace(recpt_task_ptr);
- }
- else if (facility == "Control") {
- m_tasks_queue.emplace(control_task_ptr);
- }
- else {
- Log.error("append_infrast | Unknown facility", facility);
- }
- append_infrast_begin();
- }
-
- return true;
+ return handle->set_params(ret.value());
}
std::vector asst::Assistant::get_image() const
@@ -623,13 +326,13 @@ bool asst::Assistant::set_penguid_id(const json::value& root)
bool asst::Assistant::set_ocr_text(const json::value& root)
{
bool ret = true;
- for (auto&& [key, text] : root.as_object()) {
- if (!text.is_array()) {
+ for (auto&& [key, text_arr] : root.as_object()) {
+ if (!text_arr.is_array()) {
Log.error("Json Field error");
return false;
}
std::vector text_vec;
- for (auto&& text : text.as_array()) {
+ for (auto&& text : text_arr.as_array()) {
if (!text.is_string()) {
Log.error("Json Field error");
return false;
diff --git a/src/MeoAssistant/Assistant.h b/src/MeoAssistant/Assistant.h
index 8838a093e5..14bed6767e 100644
--- a/src/MeoAssistant/Assistant.h
+++ b/src/MeoAssistant/Assistant.h
@@ -26,6 +26,7 @@ namespace asst
class Identify;
class Controller;
class TaskData;
+ class PackageTask;
class Assistant
{
@@ -36,42 +37,8 @@ namespace asst
// 连接adb
bool connect(const std::string& adb_path, const std::string& address, const std::string& config);
- // 添加开始游戏的任务(进入到主界面)
- bool append_start_up();
- // 添加刷理智任务
- bool append_fight(const std::string& stage, int mecidine = 0, int stone = 0, int times = INT_MAX);
- // 添加领取日常任务奖励任务
- bool append_award();
- // 添加访问好友任务
- bool append_visit();
- // 添加领取当日信用及信用购的任务
- bool append_mall(bool with_shopping);
-
- // 添加基建换班任务任务
- bool append_infrast(infrast::WorkMode work_mode, const std::vector& order, const std::string& uses_of_drones, double dorm_threshold);
-
- // 添加自动公招任务
- // 参数 max_times: 最多进行几次公招
- // 参数 select_level: 需要的选择Tags的等级
- // 参数 confirm_level: 需要点击确认按钮的等级
- // 参数 need_refresh: 是否刷新 3 星 Tags
- // 参数 use_expedited: 是否使用加急券
- bool append_recruit(unsigned max_times, const std::vector& select_level, const std::vector& confirm_level, bool need_refresh, bool use_expedited);
-
- /*** 添加自动肉鸽任务
- * mode: 0 - 尽可能一直往后打
- * 1 - 第一层投资完源石锭就退出
- * 2 - 投资过后再退出,没有投资就继续往后打
- ***/
- bool append_roguelike(int mode);
-
-#ifdef ASST_DEBUG
- // 调试用
- bool append_debug();
-#endif
-
- // 开始公开招募计算
- bool start_recruit_calc(const std::vector& select_level, bool set_time);
+ PackageTask* append_task(const std::string& type, const std::string& params);
+ bool set_task_params(PackageTask* handle, const std::string& params);
// 开始执行任务队列
bool start(bool block = true);
@@ -108,7 +75,7 @@ namespace asst
std::shared_ptr m_task_data = nullptr;
bool m_thread_exit = false;
- std::queue> m_tasks_queue;
+ std::queue> m_tasks_queue;
AsstApiCallback m_callback = nullptr;
void* m_callback_arg = nullptr;
diff --git a/src/MeoAssistant/AsstCaller.cpp b/src/MeoAssistant/AsstCaller.cpp
index 16467c93a0..229bce02ec 100644
--- a/src/MeoAssistant/AsstCaller.cpp
+++ b/src/MeoAssistant/AsstCaller.cpp
@@ -79,106 +79,6 @@ bool AsstConnect(AsstHandle handle, const char* adb_path, const char* address, c
return handle->connect(adb_path, address, config ? config : std::string());
}
-bool AsstAppendStartUp(AsstHandle handle)
-{
- if (!inited || handle == nullptr) {
- return false;
- }
-
- return handle->append_start_up();
-}
-
-bool AsstAppendFight(AsstHandle handle, const char* stage, int max_mecidine, int max_stone, int max_times)
-{
- if (!inited || handle == nullptr) {
- return false;
- }
-
- return handle->append_fight(stage, max_mecidine, max_stone, max_times);
-}
-
-bool AsstAppendAward(AsstHandle handle)
-{
- if (!inited || handle == nullptr) {
- return false;
- }
-
- return handle->append_award();
-}
-
-bool AsstAppendVisit(AsstHandle handle)
-{
- if (!inited || handle == nullptr) {
- return false;
- }
-
- return handle->append_visit();
-}
-
-bool AsstAppendMall(AsstHandle handle, bool with_shopping)
-{
- if (!inited || handle == nullptr) {
- return false;
- }
-
- return handle->append_mall(with_shopping);
-}
-
-//bool AsstAppendProcessTask(AsstHandle handle, const char* task_name)
-//{
-// if (!inited || handle == nullptr) {
-// return false;
-// }
-//
-// return handle->append_process_task(task_name);
-//}
-
-bool AsstStartRecruitCalc(AsstHandle handle, const int select_level[], int required_len, bool set_time)
-{
- if (!inited || handle == nullptr) {
- return false;
- }
- std::vector level_vector;
- level_vector.assign(select_level, select_level + required_len);
- return handle->start_recruit_calc(level_vector, set_time);
-}
-
-bool AsstAppendInfrast(AsstHandle handle, int work_mode, const char** order, int order_size, const char* uses_of_drones, double dorm_threshold)
-{
- if (!inited || handle == nullptr) {
- return false;
- }
- std::vector order_vector;
- order_vector.assign(order, order + order_size);
-
- return handle->append_infrast(
- static_cast(work_mode),
- order_vector,
- uses_of_drones,
- dorm_threshold);
-}
-
-bool AsstAppendRecruit(AsstHandle handle, int max_times, const int select_level[], int select_len, const int confirm_level[], int confirm_len, bool need_refresh, bool use_expedited)
-{
- if (!inited || handle == nullptr) {
- return false;
- }
- std::vector required_vector;
- required_vector.assign(select_level, select_level + select_len);
- std::vector confirm_vector;
- confirm_vector.assign(confirm_level, confirm_level + confirm_len);
-
- return handle->append_recruit(max_times, required_vector, confirm_vector, need_refresh, use_expedited);
-}
-
-bool AsstAppendRoguelike(AsstHandle handle, int mode)
-{
- if (!inited || handle == nullptr) {
- return false;
- }
- return handle->append_roguelike(mode);
-}
-
bool AsstStart(AsstHandle handle)
{
if (!inited || handle == nullptr) {
@@ -206,6 +106,23 @@ bool AsstSetParam(AsstHandle handle, const char* param_id, const char* param_val
return handle->set_param(param_id, param_value);
}
+TaskHandle ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* params)
+{
+ if (!inited || handle == nullptr) {
+ return nullptr;
+ }
+
+ return handle->append_task(type, params);
+}
+
+bool ASSTAPI AsstSetTaskParams(AsstHandle handle, TaskHandle task, const char* params)
+{
+ if (!inited || task == nullptr || handle == nullptr) {
+ return false;
+ }
+ return handle->set_task_params(task, params);
+}
+
unsigned long long AsstGetImage(AsstHandle handle, void* buff, unsigned long long buff_size)
{
if (!inited || handle == nullptr || buff == nullptr) {
@@ -250,15 +167,3 @@ void AsstLog(const char* level, const char* message)
}
asst::Log.log_with_custom_level(level, message);
}
-
-bool AsstAppendDebug(AsstHandle handle)
-{
- if (!inited || handle == nullptr) {
- return false;
- }
-#ifdef ASST_DEBUG
- return handle->append_debug();
-#else
- return false;
-#endif // ASST_DEBUG
-}
diff --git a/src/MeoAssistant/AutoRecruitTask.cpp b/src/MeoAssistant/AutoRecruitTask.cpp
index 84936f5767..86345653da 100644
--- a/src/MeoAssistant/AutoRecruitTask.cpp
+++ b/src/MeoAssistant/AutoRecruitTask.cpp
@@ -81,6 +81,7 @@ bool asst::AutoRecruitTask::analyze_start_buttons()
{
OcrImageAnalyzer start_analyzer;
start_analyzer.set_task_info(m_task_data->get("StartRecruit"));
+ start_analyzer.set_task_data(m_task_data);
auto image = m_ctrler->get_image();
start_analyzer.set_image(image);
diff --git a/src/MeoAssistant/BattleImageAnalyzer.cpp b/src/MeoAssistant/BattleImageAnalyzer.cpp
index a368ebb4ed..e8cc075abb 100644
--- a/src/MeoAssistant/BattleImageAnalyzer.cpp
+++ b/src/MeoAssistant/BattleImageAnalyzer.cpp
@@ -51,6 +51,7 @@ bool asst::BattleImageAnalyzer::opers_analyze()
MultiMatchImageAnalyzer flags_analyzer(m_image);
flags_analyzer.set_task_info(m_task_data->get("BattleOpersFlag"));
+ flags_analyzer.set_task_data(m_task_data);
if (!flags_analyzer.analyze()) {
return false;
}
@@ -104,6 +105,7 @@ asst::BattleImageAnalyzer::Role asst::BattleImageAnalyzer::oper_role_analyze(con
};
MatchImageAnalyzer role_analyzer(m_image);
+ role_analyzer.set_task_data(m_task_data);
Role result = Role::Unknown;
double max_score = 0;
@@ -161,6 +163,7 @@ int asst::BattleImageAnalyzer::oper_cost_analyze(const Rect& roi)
num_hashs.emplace(num + "_" + std::to_string(i), hashs_vec.at(i));
}
}
+ hash_analyzer.set_task_data(m_task_data);
hash_analyzer.set_hash_templates(std::move(num_hashs));
hash_analyzer.set_need_bound(true);
hash_analyzer.set_need_split(true);
@@ -254,6 +257,7 @@ bool asst::BattleImageAnalyzer::skill_analyze()
const Rect& rect_move = skill_task_ptr->rect_move;
MultiMatchImageAnalyzer mm_analyzer(m_image);
+ mm_analyzer.set_task_data(m_task_data);
mm_analyzer.set_task_info(skill_task_ptr);
if (!mm_analyzer.analyze()) {
return false;
@@ -269,6 +273,7 @@ bool asst::BattleImageAnalyzer::hp_analyze()
// 识别 HP 的那个蓝白色图标
auto flag_task_ptr = m_task_data->get("BattleHpFlag");
MatchImageAnalyzer flag_analyzer(m_image);
+ flag_analyzer.set_task_data(m_task_data);
flag_analyzer.set_task_info(flag_task_ptr);
if (!flag_analyzer.analyze()) {
// 漏怪的时候,那个图标会变成红色的,所以多识别一次
@@ -304,6 +309,7 @@ bool asst::BattleImageAnalyzer::hp_analyze()
num_hashs.emplace(num + "_" + std::to_string(i), hashs_vec.at(i));
}
}
+ hash_analyzer.set_task_data(m_task_data);
hash_analyzer.set_hash_templates(std::move(num_hashs));
hash_analyzer.set_need_bound(true);
hash_analyzer.set_need_split(true);
diff --git a/src/MeoAssistant/CreditShopImageAnalyzer.cpp b/src/MeoAssistant/CreditShopImageAnalyzer.cpp
index d58d192de3..d6ffa2de48 100644
--- a/src/MeoAssistant/CreditShopImageAnalyzer.cpp
+++ b/src/MeoAssistant/CreditShopImageAnalyzer.cpp
@@ -26,6 +26,7 @@ bool asst::CreditShopImageAnalyzer::commoditys_analyze()
const auto commodity_task_ptr = m_task_data->get("CreditShop-Commoditys");
MultiMatchImageAnalyzer mm_annlyzer(m_image);
mm_annlyzer.set_task_info(commodity_task_ptr);
+ mm_annlyzer.set_task_data(m_task_data);
if (!mm_annlyzer.analyze()) {
return false;
@@ -61,6 +62,7 @@ bool asst::CreditShopImageAnalyzer::whether_to_buy_analyze()
name_roi.y += commodity.y;
OcrImageAnalyzer ocr_analyzer(m_image, name_roi);
+ ocr_analyzer.set_task_data(m_task_data);
ocr_analyzer.set_required(not_to_buy_task_ptr->text);
if (ocr_analyzer.analyze()) {
//因为是不买的,有识别结果说明这个商品不买,直接跳过
@@ -80,6 +82,7 @@ bool asst::CreditShopImageAnalyzer::sold_out_analyze()
// 识别是否售罄
MatchImageAnalyzer sold_out_analyzer(m_image);
sold_out_analyzer.set_task_info(m_task_data->get("CreditShop-SoldOut"));
+ sold_out_analyzer.set_task_data(m_task_data);
for (const Rect& commodity : m_need_to_buy) {
sold_out_analyzer.set_roi(commodity);
diff --git a/src/MeoAssistant/CreditShoppingTask.cpp b/src/MeoAssistant/CreditShoppingTask.cpp
index 55eb49ea30..f1ce96c7e6 100644
--- a/src/MeoAssistant/CreditShoppingTask.cpp
+++ b/src/MeoAssistant/CreditShoppingTask.cpp
@@ -16,6 +16,7 @@ bool asst::CreditShoppingTask::_run()
const cv::Mat image = m_ctrler->get_image();
CreditShopImageAnalyzer shop_analyzer(image, m_task_data);
+ shop_analyzer.set_task_data(m_task_data);
if (!shop_analyzer.analyze()) {
return false;
}
@@ -39,6 +40,7 @@ bool asst::CreditShoppingTask::_run()
const cv::Mat buy_image = m_ctrler->get_image();
MatchImageAnalyzer buy_it_analyzer(buy_image);
+ buy_it_analyzer.set_task_data(m_task_data);
buy_it_analyzer.set_task_info(buy_it_task_ptr);
if (!buy_it_analyzer.analyze()) {
// 没识别到“购买商品”按钮,不应该出现这种情况,TODO 报错
@@ -59,6 +61,7 @@ bool asst::CreditShoppingTask::_run()
const cv::Mat prompt_image = m_ctrler->get_image();
OcrImageAnalyzer prompt_analyzer(prompt_image);
+ prompt_analyzer.set_task_data(m_task_data);
prompt_analyzer.set_task_info(m_task_data->get("CreditShop-NoMoney"));
if (prompt_analyzer.analyze()) {
click_return_button();
diff --git a/src/MeoAssistant/FightTask.cpp b/src/MeoAssistant/FightTask.cpp
new file mode 100644
index 0000000000..d7fa786699
--- /dev/null
+++ b/src/MeoAssistant/FightTask.cpp
@@ -0,0 +1,62 @@
+#include "FightTask.h"
+
+#include "ProcessTask.h"
+#include "StageDropsTaskPlugin.h"
+
+asst::FightTask::FightTask(AsstCallback callback, void* callback_arg)
+ : PackageTask(callback, callback_arg, TaskChain),
+ m_start_up_task_ptr(std::make_shared(m_callback, m_callback_arg, TaskChain)),
+ m_stage_task_ptr(std::make_shared(m_callback, m_callback_arg, TaskChain)),
+ m_fight_task_ptr(std::make_shared(m_callback, m_callback_arg, TaskChain))
+{
+ // 进入选关界面(主界面的“终端”点进去)
+ m_start_up_task_ptr->set_tasks({ "StageBegin" })
+ .set_times_limit("GoLastBattle", 0)
+ .set_times_limit("StartButton1", 0)
+ .set_times_limit("StartButton2", 0)
+ .set_times_limit("MedicineConfirm", 0)
+ .set_times_limit("StoneConfirm", 0);
+
+ // 进入对应的关卡
+ m_stage_task_ptr->set_times_limit("StartButton1", 0)
+ .set_times_limit("StartButton2", 0)
+ .set_times_limit("MedicineConfirm", 0)
+ .set_times_limit("StoneConfirm", 0);
+
+ // 开始战斗任务
+ m_fight_task_ptr->set_tasks({ "FightBegin" });
+
+ m_fight_task_ptr->regiseter_plugin()
+ ->set_retry_times(0);
+}
+
+bool asst::FightTask::set_params(const json::value& params)
+{
+ const std::string stage = params.get("stage", "");
+ const int mecidine = params.get("mecidine", 0);
+ const int stone = params.get("stone", 0);
+ const int times = params.get("times", INT_MAX);
+
+ if (!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();
+
+ if (!stage.empty()) {
+ m_subtasks.emplace_back(m_start_up_task_ptr);
+ m_subtasks.emplace_back(m_stage_task_ptr);
+ }
+ 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);
+ }
+ return true;
+}
diff --git a/src/MeoAssistant/FightTask.h b/src/MeoAssistant/FightTask.h
new file mode 100644
index 0000000000..2066faec40
--- /dev/null
+++ b/src/MeoAssistant/FightTask.h
@@ -0,0 +1,25 @@
+#pragma once
+#include "PackageTask.h"
+
+#include
+
+namespace asst
+{
+ class ProcessTask;
+
+ class FightTask : public PackageTask
+ {
+ public:
+ FightTask(AsstCallback callback, void* callback_arg);
+ virtual ~FightTask() = default;
+
+ virtual bool set_params(const json::value& params) override;
+
+ static constexpr const char* TaskChain = "Fight";
+ protected:
+
+ 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;
+ };
+}
diff --git a/src/MeoAssistant/InfrastAbstractTask.cpp b/src/MeoAssistant/InfrastAbstractTask.cpp
index 6cfa5c9020..3e982768cb 100644
--- a/src/MeoAssistant/InfrastAbstractTask.cpp
+++ b/src/MeoAssistant/InfrastAbstractTask.cpp
@@ -78,6 +78,7 @@ bool asst::InfrastAbstractTask::enter_facility(int index)
InfrastFacilityImageAnalyzer analyzer(image);
analyzer.set_to_be_analyzed({ facility_name() });
+ analyzer.set_task_data(m_task_data);
if (!analyzer.analyze()) {
Log.trace("result is empty");
return false;
diff --git a/src/MeoAssistant/InfrastClueImageAnalyzer.cpp b/src/MeoAssistant/InfrastClueImageAnalyzer.cpp
index b76d4cbc20..c70399aea0 100644
--- a/src/MeoAssistant/InfrastClueImageAnalyzer.cpp
+++ b/src/MeoAssistant/InfrastClueImageAnalyzer.cpp
@@ -16,7 +16,8 @@ bool asst::InfrastClueImageAnalyzer::analyze()
bool asst::InfrastClueImageAnalyzer::clue_detect()
{
MultiMatchImageAnalyzer clue_analyzer(m_image);
- clue_analyzer.set_task_info(StaticTaskData::get_instance().get("InfrastClue"));
+ clue_analyzer.set_task_info(m_task_data->get("InfrastClue"));
+ clue_analyzer.set_task_data(m_task_data);
clue_analyzer.set_roi(m_roi); // 该任务以外部设置的roi为准
if (!clue_analyzer.analyze()) {
return false;
diff --git a/src/MeoAssistant/InfrastClueVacancyImageAnalyzer.cpp b/src/MeoAssistant/InfrastClueVacancyImageAnalyzer.cpp
index 1bc779a834..c39f278f53 100644
--- a/src/MeoAssistant/InfrastClueVacancyImageAnalyzer.cpp
+++ b/src/MeoAssistant/InfrastClueVacancyImageAnalyzer.cpp
@@ -10,8 +10,9 @@ bool asst::InfrastClueVacancyImageAnalyzer::analyze()
const static std::string clue_vacancy = "InfrastClueVacancy";
MatchImageAnalyzer analyzer(m_image);
+ analyzer.set_task_data(m_task_data);
for (const std::string& suffix : m_to_be_analyzed) {
- analyzer.set_task_info(StaticTaskData::get_instance().get(clue_vacancy + suffix));
+ analyzer.set_task_info(m_task_data->get(clue_vacancy + suffix));
if (!analyzer.analyze()) {
Log.trace("no", clue_vacancy, suffix);
continue;
diff --git a/src/MeoAssistant/InfrastDormTask.cpp b/src/MeoAssistant/InfrastDormTask.cpp
index 24dc048edf..2a41341889 100644
--- a/src/MeoAssistant/InfrastDormTask.cpp
+++ b/src/MeoAssistant/InfrastDormTask.cpp
@@ -44,6 +44,7 @@ bool asst::InfrastDormTask::opers_choose()
}
const auto image = m_ctrler->get_image();
InfrastOperImageAnalyzer oper_analyzer(image);
+ oper_analyzer.set_task_data(m_task_data);
const int without_skill = InfrastOperImageAnalyzer::All ^ InfrastOperImageAnalyzer::Skill;
oper_analyzer.set_to_be_calced(without_skill);
if (!oper_analyzer.analyze()) {
diff --git a/src/MeoAssistant/InfrastFacilityImageAnalyzer.cpp b/src/MeoAssistant/InfrastFacilityImageAnalyzer.cpp
index 49fd508752..766cebb269 100644
--- a/src/MeoAssistant/InfrastFacilityImageAnalyzer.cpp
+++ b/src/MeoAssistant/InfrastFacilityImageAnalyzer.cpp
@@ -22,9 +22,10 @@ bool asst::InfrastFacilityImageAnalyzer::analyze()
const static std::vector task_name_suffix = { "", "Mini" };
MultiMatchImageAnalyzer mm_analyzer(m_image);
+ mm_analyzer.set_task_data(m_task_data);
auto task_analyze = [&](const std::string& task_name) -> bool {
- mm_analyzer.set_task_info(StaticTaskData::get_instance().get(task_name));
+ mm_analyzer.set_task_info(m_task_data->get(task_name));
return mm_analyzer.analyze();
};
diff --git a/src/MeoAssistant/InfrastInfoTask.cpp b/src/MeoAssistant/InfrastInfoTask.cpp
index b0adacdb73..80d6f48768 100644
--- a/src/MeoAssistant/InfrastInfoTask.cpp
+++ b/src/MeoAssistant/InfrastInfoTask.cpp
@@ -12,6 +12,7 @@ bool asst::InfrastInfoTask::_run()
const auto image = m_ctrler->get_image();
InfrastFacilityImageAnalyzer analyzer(image);
+ analyzer.set_task_data(m_task_data);
analyzer.set_to_be_analyzed({ "Mfg", "Trade", "Power", "Dorm" });
if (!analyzer.analyze()) {
return false;
diff --git a/src/MeoAssistant/InfrastOperImageAnalyzer.cpp b/src/MeoAssistant/InfrastOperImageAnalyzer.cpp
index e003f2da0d..dc962ba405 100644
--- a/src/MeoAssistant/InfrastOperImageAnalyzer.cpp
+++ b/src/MeoAssistant/InfrastOperImageAnalyzer.cpp
@@ -91,6 +91,7 @@ void asst::InfrastOperImageAnalyzer::oper_detect()
const std::vector all_rect_move = { skill_rect_move, hash_rect_move, prg_rect_move };
InfrastSmileyImageAnalyzer smiley_analyzer(m_image);
+ smiley_analyzer.set_task_data(m_task_data);
for (auto&& roi : all_roi) {
smiley_analyzer.set_roi(roi);
@@ -210,6 +211,7 @@ void asst::InfrastOperImageAnalyzer::face_hash_analyze()
const Rect hash_rect_move = m_task_data->get("InfrastOperFaceHash")->rect_move;
HashImageAnalyzer hash_analyzer(m_image);
+ hash_analyzer.set_task_data(m_task_data);
for (auto&& oper : m_result) {
Rect roi = oper.smiley.rect.move(hash_rect_move);
hash_analyzer.set_roi(roi);
@@ -226,6 +228,7 @@ void asst::InfrastOperImageAnalyzer::name_hash_analyze()
m_task_data->get("InfrastOperNameHash"));
HashImageAnalyzer hash_analyzer(m_image);
+ hash_analyzer.set_task_data(m_task_data);
hash_analyzer.set_mask_range(task_ptr->mask_range);
hash_analyzer.set_need_bound(true);
for (auto&& oper : m_result) {
@@ -245,6 +248,7 @@ void asst::InfrastOperImageAnalyzer::skill_analyze()
const auto bright_thres = task_ptr->special_threshold;
MatchImageAnalyzer skill_analyzer(m_image);
+ skill_analyzer.set_task_data(m_task_data);
skill_analyzer.set_mask_range(task_ptr->mask_range);
skill_analyzer.set_threshold(task_ptr->templ_threshold);
@@ -406,6 +410,7 @@ void asst::InfrastOperImageAnalyzer::doing_analyze()
Rect rect_move = working_task_ptr->rect_move;
MatchImageAnalyzer working_analyzer(m_image);
+ working_analyzer.set_task_data(m_task_data);
working_analyzer.set_task_info(working_task_ptr);
for (auto&& oper : m_result) {
diff --git a/src/MeoAssistant/InfrastProductionTask.cpp b/src/MeoAssistant/InfrastProductionTask.cpp
index fffcb6da80..b78eeb42e7 100644
--- a/src/MeoAssistant/InfrastProductionTask.cpp
+++ b/src/MeoAssistant/InfrastProductionTask.cpp
@@ -42,10 +42,12 @@ bool asst::InfrastProductionTask::shift_facility_list()
}
const auto tab_task_ptr = m_task_data->get("InfrastFacilityListTab" + facility_name());
MatchImageAnalyzer add_analyzer;
+ add_analyzer.set_task_data(m_task_data);
const auto add_task_ptr = m_task_data->get("InfrastAddOperator" + facility_name() + m_work_mode_name);
add_analyzer.set_task_info(add_task_ptr);
MultiMatchImageAnalyzer locked_analyzer;
- locked_analyzer.set_task_info(StaticTaskData::get_instance().get("InfrastOperLocked" + facility_name()));
+ locked_analyzer.set_task_data(m_task_data);
+ locked_analyzer.set_task_info(m_task_data->get("InfrastOperLocked" + facility_name()));
for (; m_cur_facility_index < m_facility_list_tabs.size(); ++m_cur_facility_index) {
Rect tab = m_facility_list_tabs.at(m_cur_facility_index);
@@ -78,11 +80,12 @@ bool asst::InfrastProductionTask::shift_facility_list()
/* 识别当前正在造什么 */
MatchImageAnalyzer product_analyzer(image);
+ product_analyzer.set_task_data(m_task_data);
auto& all_products = Resrc.infrast().get_facility_info(facility_name()).products;
std::string cur_product = all_products.at(0);
double max_score = 0;
for (const std::string& product : all_products) {
- product_analyzer.set_task_info(StaticTaskData::get_instance().get("InfrastFlag" + product));
+ product_analyzer.set_task_info(m_task_data->get("InfrastFlag" + product));
if (product_analyzer.analyze()) {
double score = product_analyzer.get_result().score;
if (score > max_score) {
@@ -179,6 +182,7 @@ size_t asst::InfrastProductionTask::opers_detect()
const auto image = m_ctrler->get_image();
InfrastOperImageAnalyzer oper_analyzer(image);
+ oper_analyzer.set_task_data(m_task_data);
oper_analyzer.set_facility(facility_name());
if (!oper_analyzer.analyze()) {
@@ -462,6 +466,7 @@ bool asst::InfrastProductionTask::opers_choose()
const auto image = m_ctrler->get_image();
InfrastOperImageAnalyzer oper_analyzer(image);
+ oper_analyzer.set_task_data(m_task_data);
oper_analyzer.set_facility(facility_name());
if (!oper_analyzer.analyze()) {
@@ -619,7 +624,8 @@ bool asst::InfrastProductionTask::facility_list_detect()
const auto image = m_ctrler->get_image();
MultiMatchImageAnalyzer mm_analyzer(image);
- mm_analyzer.set_task_info(StaticTaskData::get_instance().get("InfrastFacilityListTab" + facility_name()));
+ mm_analyzer.set_task_data(m_task_data);
+ mm_analyzer.set_task_info(m_task_data->get("InfrastFacilityListTab" + facility_name()));
if (!mm_analyzer.analyze()) {
return false;
diff --git a/src/MeoAssistant/InfrastReceptionTask.cpp b/src/MeoAssistant/InfrastReceptionTask.cpp
index ad8e77847b..6fe55443ec 100644
--- a/src/MeoAssistant/InfrastReceptionTask.cpp
+++ b/src/MeoAssistant/InfrastReceptionTask.cpp
@@ -65,6 +65,7 @@ bool asst::InfrastReceptionTask::use_clue()
// 所有的空位分析一次,看看还缺哪些线索
InfrastClueVacancyImageAnalyzer vacancy_analyzer(image);
+ vacancy_analyzer.set_task_data(m_task_data);
vacancy_analyzer.set_to_be_analyzed(clue_suffix);
if (!vacancy_analyzer.analyze()) {
}
@@ -101,6 +102,7 @@ bool asst::InfrastReceptionTask::proc_clue_vacancy()
}
// 先识别线索的空位
InfrastClueVacancyImageAnalyzer vacancy_analyzer(image);
+ vacancy_analyzer.set_task_data(m_task_data);
vacancy_analyzer.set_to_be_analyzed({ clue });
if (!vacancy_analyzer.analyze()) {
continue;
@@ -115,6 +117,7 @@ bool asst::InfrastReceptionTask::proc_clue_vacancy()
//swipe_to_the_bottom_of_clue_list_on_the_right();
image = m_ctrler->get_image();
InfrastClueImageAnalyzer clue_analyzer(image);
+ clue_analyzer.set_task_data(m_task_data);
if (!clue_analyzer.analyze()) {
continue;
}
@@ -142,6 +145,7 @@ bool asst::InfrastReceptionTask::shift()
LogTraceFunction;
const auto image = m_ctrler->get_image();
MatchImageAnalyzer add_analyzer(image);
+ add_analyzer.set_task_data(m_task_data);
const auto raw_task_ptr = m_task_data->get("InfrastAddOperator" + facility_name() + m_work_mode_name);
switch (raw_task_ptr->algorithm) {
diff --git a/src/MeoAssistant/InfrastSmileyImageAnalyzer.cpp b/src/MeoAssistant/InfrastSmileyImageAnalyzer.cpp
index b690d06617..75213618c4 100644
--- a/src/MeoAssistant/InfrastSmileyImageAnalyzer.cpp
+++ b/src/MeoAssistant/InfrastSmileyImageAnalyzer.cpp
@@ -15,10 +15,11 @@ bool asst::InfrastSmileyImageAnalyzer::analyze()
m_result.clear();
MultiMatchImageAnalyzer mm_analyzer(m_image);
+ mm_analyzer.set_task_data(m_task_data);
decltype(m_result) temp_result;
for (const auto& [type, task_name] : smiley_map) {
- mm_analyzer.set_task_info(StaticTaskData::get_instance().get(task_name));
+ mm_analyzer.set_task_info(m_task_data->get(task_name));
mm_analyzer.set_roi(m_roi);
if (!mm_analyzer.analyze()) {
continue;
diff --git a/src/MeoAssistant/MeoAssistant.vcxproj b/src/MeoAssistant/MeoAssistant.vcxproj
index 5507ee5019..f849f588e9 100644
--- a/src/MeoAssistant/MeoAssistant.vcxproj
+++ b/src/MeoAssistant/MeoAssistant.vcxproj
@@ -27,6 +27,8 @@
+
+
@@ -66,6 +68,7 @@
+
@@ -82,6 +85,8 @@
+
+
@@ -122,6 +127,7 @@
+
diff --git a/src/MeoAssistant/MeoAssistant.vcxproj.filters b/src/MeoAssistant/MeoAssistant.vcxproj.filters
index 53f319dce6..5825569fc0 100644
--- a/src/MeoAssistant/MeoAssistant.vcxproj.filters
+++ b/src/MeoAssistant/MeoAssistant.vcxproj.filters
@@ -267,6 +267,15 @@
头文件\ImageAnalyzer\Final
+
+ 头文件\Task
+
+
+ 头文件\Task
+
+
+ 头文件\Task
+
@@ -428,6 +437,15 @@
源文件\ImageAnalyzer\Final
+
+ 源文件\Task
+
+
+ 源文件\Task
+
+
+ 源文件\Task
+
diff --git a/src/MeoAssistant/PackageTask.cpp b/src/MeoAssistant/PackageTask.cpp
new file mode 100644
index 0000000000..e1b221ac99
--- /dev/null
+++ b/src/MeoAssistant/PackageTask.cpp
@@ -0,0 +1,73 @@
+#include "PackageTask.h"
+
+#include "Resource.h"
+
+bool asst::PackageTask::run()
+{
+ runned = true;
+
+ const auto task_delay = Resrc.cfg().get_options().task_delay;
+
+ for (auto task_ptr : m_subtasks) {
+ if (need_exit()) {
+ return false;
+ }
+
+ task_ptr->set_exit_flag(m_exit_flag)
+ .set_ctrler(m_ctrler)
+ .set_status(m_status)
+ .set_task_data(m_task_data);
+
+ if (!task_ptr->run()) {
+ return false;
+ }
+
+ sleep(task_delay);
+ }
+ return true;
+}
+
+asst::AbstractTask& asst::PackageTask::set_exit_flag(bool* exit_flag) noexcept
+{
+ AbstractTask::set_exit_flag(exit_flag);
+ for (auto&& sub : m_subtasks) {
+ sub->set_exit_flag(exit_flag);
+ }
+ return *this;
+}
+
+asst::AbstractTask& asst::PackageTask::set_retry_times(int times) noexcept
+{
+ AbstractTask::set_retry_times(times);
+ for (auto&& sub : m_subtasks) {
+ sub->set_retry_times(times);
+ }
+ return *this;
+}
+
+asst::AbstractTask& asst::PackageTask::set_ctrler(std::shared_ptr ctrler) noexcept
+{
+ AbstractTask::set_ctrler(ctrler);
+ for (auto&& sub : m_subtasks) {
+ sub->set_ctrler(ctrler);
+ }
+ return *this;
+}
+
+asst::AbstractTask& asst::PackageTask::set_status(std::shared_ptr status) noexcept
+{
+ AbstractTask::set_status(status);
+ for (auto&& sub : m_subtasks) {
+ sub->set_status(status);
+ }
+ return *this;
+}
+
+asst::AbstractTask& asst::PackageTask::set_task_data(std::shared_ptr task_data) noexcept
+{
+ AbstractTask::set_task_data(task_data);
+ for (auto&& sub : m_subtasks) {
+ sub->set_task_data(task_data);
+ }
+ return *this;
+}
diff --git a/src/MeoAssistant/PackageTask.h b/src/MeoAssistant/PackageTask.h
new file mode 100644
index 0000000000..0d9556f0f6
--- /dev/null
+++ b/src/MeoAssistant/PackageTask.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include "AbstractTask.h"
+
+#include
+#include
+
+namespace json
+{
+ class value;
+}
+
+namespace asst
+{
+ class PackageTask : public AbstractTask
+ {
+ public:
+ using AbstractTask::AbstractTask;
+ virtual ~PackageTask() = default;
+
+ virtual bool run() override;
+
+ virtual bool set_params(const json::value& params) = 0;
+
+ virtual AbstractTask& set_exit_flag(bool* exit_flag) noexcept;
+ virtual AbstractTask& set_retry_times(int times) noexcept;
+ virtual AbstractTask& set_ctrler(std::shared_ptr ctrler) noexcept;
+ virtual AbstractTask& set_status(std::shared_ptr status) noexcept;
+ virtual AbstractTask& set_task_data(std::shared_ptr task_data) noexcept;
+
+ protected:
+ virtual bool _run() override { return true; }
+
+ bool runned = false;
+ std::vector> m_subtasks;
+ };
+}
diff --git a/src/MeoAssistant/ProcessTask.cpp b/src/MeoAssistant/ProcessTask.cpp
index 6a9d8eb8a1..eef38baf82 100644
--- a/src/MeoAssistant/ProcessTask.cpp
+++ b/src/MeoAssistant/ProcessTask.cpp
@@ -57,13 +57,13 @@ asst::ProcessTask& asst::ProcessTask::set_tasks(std::vector tasks_n
ProcessTask& asst::ProcessTask::set_times_limit(std::string name, int limit)
{
- m_times_limit.emplace(std::move(name), limit);
+ m_times_limit[std::move(name)] = limit;
return *this;
}
ProcessTask& asst::ProcessTask::set_rear_delay(std::string name, int delay)
{
- m_rear_delay.emplace(std::move(name), delay);
+ m_rear_delay[std::move(name)] = delay;
return *this;
}
@@ -95,7 +95,9 @@ bool ProcessTask::_run()
else {
const auto image = m_ctrler->get_image();
ProcessTaskImageAnalyzer analyzer(image, m_cur_tasks_name);
+ analyzer.set_task_data(m_task_data);
analyzer.set_status(m_status);
+ analyzer.set_task_data(m_task_data);
if (!analyzer.analyze()) {
return false;
}
diff --git a/src/MeoAssistant/ProcessTaskImageAnalyzer.cpp b/src/MeoAssistant/ProcessTaskImageAnalyzer.cpp
index 983ccc5e58..a5e798a308 100644
--- a/src/MeoAssistant/ProcessTaskImageAnalyzer.cpp
+++ b/src/MeoAssistant/ProcessTaskImageAnalyzer.cpp
@@ -24,6 +24,7 @@ bool asst::ProcessTaskImageAnalyzer::match_analyze(std::shared_ptr tas
m_match_analyzer = std::make_unique(m_image);
}
const auto match_task_ptr = std::dynamic_pointer_cast(task_ptr);
+ m_match_analyzer->set_region_of_appeared(Rect());
m_match_analyzer->set_task_info(match_task_ptr);
auto region_opt = m_status->get_region(match_task_ptr->name);
if (region_opt) {
@@ -72,6 +73,7 @@ bool asst::ProcessTaskImageAnalyzer::ocr_analyze(std::shared_ptr task_
if (!m_ocr_analyzer) {
m_ocr_analyzer = std::make_unique(m_image);
}
+ m_ocr_analyzer->set_region_of_appeared(Rect());
m_ocr_analyzer->set_task_info(ocr_task_ptr);
auto region_opt = m_status->get_region(ocr_task_ptr->name);
if (region_opt) {
diff --git a/src/MeoAssistant/RecruitImageAnalyzer.cpp b/src/MeoAssistant/RecruitImageAnalyzer.cpp
index 37fcd12d1a..c7be7a5f35 100644
--- a/src/MeoAssistant/RecruitImageAnalyzer.cpp
+++ b/src/MeoAssistant/RecruitImageAnalyzer.cpp
@@ -33,6 +33,7 @@ bool asst::RecruitImageAnalyzer::tags_analyze()
if (ssr_iter != all_tags_vec.end()) {
std::swap(*ssr_iter, all_tags_vec.front());
}
+ tags_analyzer.set_task_data(m_task_data);
tags_analyzer.set_required(std::move(all_tags_vec));
tags_analyzer.set_replace(tags_task_ptr->replace_map);
analyzer_inited = true;
@@ -56,6 +57,7 @@ bool asst::RecruitImageAnalyzer::time_analyze()
MatchImageAnalyzer time_analyzer(m_image);
time_analyzer.set_task_info(time_task_ptr);
+ time_analyzer.set_task_data(m_task_data);
if (time_analyzer.analyze()) {
Rect rect = time_analyzer.get_result().rect;
@@ -75,7 +77,8 @@ bool asst::RecruitImageAnalyzer::time_analyze()
bool asst::RecruitImageAnalyzer::confirm_analyze()
{
MatchImageAnalyzer confirm_analyzer(m_image);
- confirm_analyzer.set_task_info(StaticTaskData::get_instance().get("RecruitConfirm"));
+ confirm_analyzer.set_task_info(m_task_data->get("RecruitConfirm"));
+ confirm_analyzer.set_task_data(m_task_data);
if (confirm_analyzer.analyze()) {
m_confirm_rect = confirm_analyzer.get_result().rect;
@@ -88,7 +91,8 @@ bool asst::RecruitImageAnalyzer::confirm_analyze()
bool asst::RecruitImageAnalyzer::refresh_analyze()
{
MatchImageAnalyzer refresh_analyzer(m_image);
- refresh_analyzer.set_task_info(StaticTaskData::get_instance().get("RecruitRefresh"));
+ refresh_analyzer.set_task_data(m_task_data);
+ refresh_analyzer.set_task_info(m_task_data->get("RecruitRefresh"));
if (refresh_analyzer.analyze()) {
m_refresh_rect = refresh_analyzer.get_result().rect;
diff --git a/src/MeoAssistant/RecruitTask.cpp b/src/MeoAssistant/RecruitTask.cpp
index 3feb9bc288..30a6bbfe72 100644
--- a/src/MeoAssistant/RecruitTask.cpp
+++ b/src/MeoAssistant/RecruitTask.cpp
@@ -18,6 +18,7 @@ bool RecruitTask::_run()
const cv::Mat image = m_ctrler->get_image();
RecruitImageAnalyzer analyzer(image);
+ analyzer.set_task_data(m_task_data);
if (!analyzer.analyze()) {
return false;
diff --git a/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp b/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp
index cd6129e6c3..b55d6faec0 100644
--- a/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp
+++ b/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp
@@ -66,6 +66,7 @@ bool asst::RoguelikeBattleTaskPlugin::get_stage_info()
for (int i = 0; i != StageNameRetryTimes; ++i) {
cv::Mat image = m_ctrler->get_image();
OcrImageAnalyzer name_analyzer(image);
+ name_analyzer.set_task_data(m_task_data);
name_analyzer.set_task_info(stage_name_task_ptr);
if (!name_analyzer.analyze()) {
continue;
@@ -134,6 +135,7 @@ bool asst::RoguelikeBattleTaskPlugin::auto_battle()
using Oper = asst::BattleImageAnalyzer::Oper;
BattleImageAnalyzer battle_analyzer(m_ctrler->get_image(), m_task_data);
+ battle_analyzer.set_task_data(m_task_data);
if (!battle_analyzer.analyze()) {
return false;
}
@@ -293,6 +295,7 @@ void asst::RoguelikeBattleTaskPlugin::clear()
//asst::Rect asst::RoguelikeBattleTaskPlugin::get_placed_by_cv()
//{
// BattlePerspectiveImageAnalyzer placed_analyzer(m_ctrler->get_image());
+// placed_analyzer.set_task_data(m_task_data);
// placed_analyzer.set_src_homes(m_home_cache);
// if (!placed_analyzer.analyze()) {
// return Rect();
diff --git a/src/MeoAssistant/RoguelikeFormationImageAnalyzer.cpp b/src/MeoAssistant/RoguelikeFormationImageAnalyzer.cpp
index 8393130af1..1fc59664f1 100644
--- a/src/MeoAssistant/RoguelikeFormationImageAnalyzer.cpp
+++ b/src/MeoAssistant/RoguelikeFormationImageAnalyzer.cpp
@@ -13,6 +13,7 @@ bool asst::RoguelikeFormationImageAnalyzer::analyze()
{
MultiMatchImageAnalyzer opers_analyzer(m_image);
opers_analyzer.set_task_info(m_task_data->get("Roguelike1FormationOper"));
+ opers_analyzer.set_task_data(m_task_data);
if (!opers_analyzer.analyze()) {
return false;
}
diff --git a/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp b/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp
index 2866e898f3..8e08a2ab32 100644
--- a/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp
+++ b/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp
@@ -23,6 +23,7 @@ bool asst::RoguelikeFormationTaskPlugin::verify(AsstMsg msg, const json::value&
bool asst::RoguelikeFormationTaskPlugin::_run()
{
RoguelikeFormationImageAnalyzer formation_analyzer(m_ctrler->get_image(), m_task_data);
+ formation_analyzer.set_task_data(m_task_data);
if (!formation_analyzer.analyze()) {
return false;
}
diff --git a/src/MeoAssistant/StartUpTask.cpp b/src/MeoAssistant/StartUpTask.cpp
new file mode 100644
index 0000000000..da0f21e30d
--- /dev/null
+++ b/src/MeoAssistant/StartUpTask.cpp
@@ -0,0 +1,21 @@
+#include "StartUpTask.h"
+
+#include "ProcessTask.h"
+
+asst::StartUpTask::StartUpTask(AsstCallback callback, void* callback_arg)
+ : PackageTask(callback, callback_arg, TaskChain),
+ m_start_up_task_ptr(std::make_shared(m_callback, m_callback_arg, TaskChain))
+{
+ m_start_up_task_ptr->set_tasks({ "StartUp" })
+ .set_times_limit("ReturnToTerminal", 0)
+ .set_times_limit("Terminal", 0);
+}
+
+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
new file mode 100644
index 0000000000..3ded043dbb
--- /dev/null
+++ b/src/MeoAssistant/StartUpTask.h
@@ -0,0 +1,21 @@
+#pragma once
+#include "PackageTask.h"
+
+namespace asst
+{
+ class ProcessTask;
+
+ class StartUpTask : 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* TaskChain = "StartUp";
+ protected:
+
+ std::shared_ptr m_start_up_task_ptr = nullptr;
+ };
+}
diff --git a/src/MeoAssistant/TaskData.cpp b/src/MeoAssistant/TaskData.cpp
index 1bdd7613b2..b6864ac492 100644
--- a/src/MeoAssistant/TaskData.cpp
+++ b/src/MeoAssistant/TaskData.cpp
@@ -217,7 +217,13 @@ bool asst::StaticTaskData::parse(const json::value& json)
const std::shared_ptr asst::TaskData::get(const std::string& name) const noexcept
{
- return std::shared_ptr();
+ if (auto iter = m_specal_tasks_info.find(name);
+ iter != m_specal_tasks_info.cend()) {
+ return iter->second;
+ }
+ else {
+ return StaticTaskData::get_instance().get(name);
+ }
}
std::shared_ptr asst::TaskData::get(const std::string& name)
diff --git a/tools/TestCaller/main.cpp b/tools/TestCaller/main.cpp
index b5a02ae530..dd12065bf8 100644
--- a/tools/TestCaller/main.cpp
+++ b/tools/TestCaller/main.cpp
@@ -30,27 +30,15 @@ int main(int argc, char** argv)
return -1;
}
+ const char* params = R"(
+{
+ "stage": "CE-5"
+}
+)";
+
char ch = 0;
while (ch != 'q') {
- //AsstAppendRoguelike(ptr, 0);
- //AsstAppendDebug(ptr);
- AsstAppendStartUp(ptr);
- //AsstAppendFight(ptr, "CE-5", 0, 0, 99999);
- // AsstAppendVisit(ptr, true);
- //{
- // const int required[] = { 3, 4, 5, 6 };
- // AsstStartRecruitCalc(ptr, required, sizeof(required) / sizeof(int), true);
- // }
- //{
- // const char* order[] = { "Trade", "Dorm" };
- // AsstAppendInfrast(ptr, 1, order, 2, "Money", 0.3);
- //}
- // AsstAppendProcessTask(ptr, "AwardBegin");
- //{
- // const int required[] = { 4 };
- // const int confirm[] = { 3, 4 };
- // AsstAppendRecruit(ptr, 3, required, sizeof(required) / sizeof(int), confirm, sizeof(confirm) / sizeof(int), true, true);
- //}
+ AsstAppendTask(ptr, "Fight", params);
AsstStart(ptr);
ch = static_cast(getchar());