mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-16 17:57:01 +08:00
初步完成公开招募的任务框架
This commit is contained in:
@@ -24,7 +24,7 @@ namespace asst {
|
||||
class AbstractTask;
|
||||
enum class TaskMsg;
|
||||
|
||||
class Assistance
|
||||
class MEOAPI_PORT Assistance
|
||||
{
|
||||
public:
|
||||
Assistance();
|
||||
@@ -33,6 +33,7 @@ namespace asst {
|
||||
std::optional<std::string> catch_emulator(const std::string& emulator_name = std::string());
|
||||
|
||||
void start(const std::string& task);
|
||||
void start_open_recruit(const std::vector<int>& required_level, bool set_time = true);
|
||||
|
||||
void stop(bool block = true);
|
||||
|
||||
@@ -41,6 +42,7 @@ namespace asst {
|
||||
|
||||
bool print_window(const std::string& filename, bool block = true);
|
||||
|
||||
// for debug
|
||||
// 计算公开招募,需要当前处在选择公招Tag的页面
|
||||
// 参数:
|
||||
// required_level:需要的等级,最优组合的最低等级,在required_level中,才会进行点击
|
||||
@@ -49,6 +51,7 @@ namespace asst {
|
||||
// std::vector< std::pair < Tags名vector,这个Tags组合可能出的干员组合 > >
|
||||
std::optional<std::vector<std::pair<std::vector<std::string>, OperCombs>>>
|
||||
open_recruit(const std::vector<int>& required_level, bool set_time = true);
|
||||
|
||||
private:
|
||||
static void working_proc(Assistance* pThis);
|
||||
static void task_callback(TaskMsg msg, const json::value& detail, void* custom_arg);
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#include "Version.h"
|
||||
|
||||
namespace asst {
|
||||
class Logger {
|
||||
class MEOAPI_PORT Logger {
|
||||
public:
|
||||
~Logger() = default;
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <ostream>
|
||||
|
||||
#include "AsstDef.h"
|
||||
#include "AsstAux.h"
|
||||
|
||||
namespace cv
|
||||
{
|
||||
@@ -24,6 +25,7 @@ namespace asst {
|
||||
class WinMacro;
|
||||
class Identify;
|
||||
class Configer;
|
||||
class RecruitConfiger;
|
||||
|
||||
enum class TaskMsg {
|
||||
/* Error Msg */
|
||||
@@ -36,9 +38,11 @@ namespace asst {
|
||||
ReadyToSleep,
|
||||
AppendTask,
|
||||
TaskCompleted,
|
||||
MissionStop
|
||||
/* Trace Msg */
|
||||
// Todo
|
||||
MissionStop,
|
||||
/* Open Recruit Msg */
|
||||
DetectText,
|
||||
DetectTags,
|
||||
RecruitCombs
|
||||
};
|
||||
static std::ostream& operator<<(std::ostream& os, const TaskMsg& type)
|
||||
{
|
||||
@@ -51,8 +55,10 @@ namespace asst {
|
||||
{TaskMsg::ReadyToSleep, "ReadyToSleep"},
|
||||
{TaskMsg::AppendTask, "AppendTask"},
|
||||
{TaskMsg::TaskCompleted, "TaskCompleted"},
|
||||
{TaskMsg::MissionStop, "MissionStop"}
|
||||
|
||||
{TaskMsg::MissionStop, "MissionStop"},
|
||||
{TaskMsg::DetectText, "DetectText"},
|
||||
{TaskMsg::DetectTags, "DetectTags"},
|
||||
{TaskMsg::RecruitCombs, "RecruitCombs"}
|
||||
};
|
||||
return os << _type_name.at(type);
|
||||
}
|
||||
@@ -109,4 +115,49 @@ namespace asst {
|
||||
Configer* m_configer_ptr = NULL;
|
||||
std::vector<std::string> m_cur_tasks_name;
|
||||
};
|
||||
|
||||
class OcrAbstractTask : public AbstractTask
|
||||
{
|
||||
public:
|
||||
OcrAbstractTask(TaskCallback callback, void* callback_arg);
|
||||
virtual bool run() override = 0 ;
|
||||
|
||||
protected:
|
||||
std::vector<TextArea> ocr_detect();
|
||||
|
||||
template<typename FilterArray, typename ReplaceMap>
|
||||
std::vector<TextArea> text_filter(const std::vector<TextArea>& src,
|
||||
const FilterArray& filter_array, const ReplaceMap& replace_map)
|
||||
{
|
||||
std::vector<TextArea> dst;
|
||||
for (const TextArea& text_area : src) {
|
||||
TextArea temp = text_area;
|
||||
for (const auto& [old_str, new_str] : replace_map) {
|
||||
temp.text = StringReplaceAll(temp.text, old_str, new_str);
|
||||
}
|
||||
for (const auto& text : filter_array) {
|
||||
if (temp.text == text) {
|
||||
dst.emplace_back(std::move(temp));
|
||||
}
|
||||
}
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
};
|
||||
|
||||
class OpenRecruitTask : public OcrAbstractTask
|
||||
{
|
||||
public:
|
||||
OpenRecruitTask(TaskCallback callback, void* callback_arg,
|
||||
Configer * configer_ptr, RecruitConfiger * recruit_configer_ptr);
|
||||
|
||||
virtual bool run() override;
|
||||
virtual void set_param(std::vector<int> required_level, bool set_time = true);
|
||||
|
||||
protected:
|
||||
std::vector<int> m_required_level;
|
||||
bool m_set_time = false;
|
||||
Configer* m_configer_ptr = NULL;
|
||||
RecruitConfiger* m_recruit_configer_ptr = NULL;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -113,6 +113,23 @@ void Assistance::start(const std::string& task)
|
||||
m_condvar.notify_one();
|
||||
}
|
||||
|
||||
void asst::Assistance::start_open_recruit(const std::vector<int>& required_level, bool set_time)
|
||||
{
|
||||
DebugTraceFunction;
|
||||
if (!m_thread_idle || !m_inited) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::unique_lock<std::mutex> lock(m_mutex);
|
||||
|
||||
auto task_ptr = std::make_shared<OpenRecruitTask>(task_callback, (void*)this, &m_configer, &m_recruit_configer);
|
||||
task_ptr->set_param(required_level, set_time);
|
||||
m_tasks_queue.emplace(task_ptr);
|
||||
|
||||
m_thread_idle = false;
|
||||
m_condvar.notify_one();
|
||||
}
|
||||
|
||||
void Assistance::stop(bool block)
|
||||
{
|
||||
DebugTraceFunction;
|
||||
@@ -391,6 +408,7 @@ void Assistance::working_proc(Assistance* pThis)
|
||||
[&]() -> bool { return pThis->m_thread_idle; });
|
||||
}
|
||||
else {
|
||||
pThis->m_thread_idle = true;
|
||||
pThis->m_condvar.wait(lock);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "Configer.h"
|
||||
#include "RecruitConfiger.h"
|
||||
#include "json.h"
|
||||
#include "AsstAux.h"
|
||||
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
@@ -225,4 +226,71 @@ void MatchTask::exec_click_task(TaskInfo& task, const asst::Rect& matched_rect)
|
||||
}
|
||||
|
||||
m_control_ptr->click(matched_rect);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
OcrAbstractTask::OcrAbstractTask(TaskCallback callback, void* callback_arg)
|
||||
: AbstractTask(callback, callback_arg)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
std::vector<TextArea> OcrAbstractTask::ocr_detect()
|
||||
{
|
||||
const cv::Mat& image = get_format_image();
|
||||
return m_identify_ptr->ocr_detect(image);
|
||||
}
|
||||
|
||||
OpenRecruitTask::OpenRecruitTask(TaskCallback callback, void* callback_arg,
|
||||
Configer* configer_ptr, RecruitConfiger* recruit_configer_ptr)
|
||||
: OcrAbstractTask(callback, callback_arg),
|
||||
m_configer_ptr(configer_ptr),
|
||||
m_recruit_configer_ptr(recruit_configer_ptr)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
bool OpenRecruitTask::run()
|
||||
{
|
||||
if (m_view_ptr == NULL
|
||||
|| m_control_ptr == NULL
|
||||
|| m_identify_ptr == NULL
|
||||
|| m_control_ptr == NULL
|
||||
|| m_recruit_configer_ptr == NULL)
|
||||
{
|
||||
m_callback(TaskMsg::PtrIsNull, json::value(), m_callback_arg);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Find all text */
|
||||
std::vector<TextArea> all_text_area = ocr_detect();
|
||||
|
||||
std::vector<json::value> all_text_json_vector;
|
||||
for (const TextArea& text_area : all_text_area) {
|
||||
all_text_json_vector.emplace_back(Utf8ToGbk(text_area.text));
|
||||
}
|
||||
json::value all_text_json;
|
||||
all_text_json["text"] = json::array(all_text_json_vector);
|
||||
m_callback(TaskMsg::DetectText, all_text_json, m_callback_arg);
|
||||
|
||||
|
||||
/* Filter out all tags from all text */
|
||||
std::vector<TextArea> all_tags = text_filter(all_text_area, m_recruit_configer_ptr->m_all_tags, m_configer_ptr->m_ocr_replace);
|
||||
|
||||
std::vector<json::value> all_tags_json_vector;
|
||||
for (const TextArea& text_area : all_tags) {
|
||||
all_tags_json_vector.emplace_back(Utf8ToGbk(text_area.text));
|
||||
}
|
||||
json::value all_tags_json;
|
||||
all_tags_json["tags"] = json::array(all_tags_json_vector);
|
||||
m_callback(TaskMsg::DetectText, all_tags_json, m_callback_arg);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void OpenRecruitTask::set_param(std::vector<int> required_level, bool set_time)
|
||||
{
|
||||
m_required_level = std::move(required_level);
|
||||
m_set_time = set_time;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,13 +37,7 @@ void asst_ocr_test()
|
||||
}
|
||||
char c = 0;
|
||||
while (c != 'q') {
|
||||
|
||||
std::ifstream ifs(GetCurrentDir() + "name.txt");
|
||||
std::string person_name;
|
||||
ifs >> person_name;
|
||||
|
||||
asst.open_recruit({ 4, 5 });
|
||||
|
||||
asst.start_open_recruit({ 3, 4, 5 });
|
||||
c = getchar();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user