Files
MaaAssistantArknights/src/MeoAssistance/CreditShoppingTask.cpp

84 lines
2.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "CreditShoppingTask.h"
#include <algorithm>
#include <vector>
#include <opencv2/opencv.hpp>
#include "Controller.h"
#include "CreditShopImageAnalyzer.h"
#include "MatchImageAnalyzer.h"
#include "OcrImageAnalyzer.h"
#include "Resource.h"
bool asst::CreditShoppingTask::run()
{
json::value task_start_json = json::object{
{ "task_type", "CreditShoppingTask" },
{ "task_chain", m_task_chain }
};
m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg);
const cv::Mat& image = ctrler.get_image();
CreditShopImageAnalyzer shop_analyzer(image);
if (!shop_analyzer.analyze()) {
return true;
}
const auto& shopping_list = shop_analyzer.get_result();
for (const Rect& commodity : shopping_list) {
if (need_exit()) {
return false;
}
ctrler.click(commodity);
static int pre_delay = 1000;
static int rare_delay = 1000;
sleep(pre_delay);
// “购买商品”按钮
static Rect buy_it_rect;
if (buy_it_rect.empty()) {
const auto buy_it_task_ptr = std::dynamic_pointer_cast<MatchTaskInfo>(
resource.task().task_ptr("CreditShop-BuyIt"));
const cv::Mat& buy_image = ctrler.get_image();
MatchImageAnalyzer buy_it_analyzer(buy_image);
buy_it_analyzer.set_task_info(*buy_it_task_ptr);
if (!buy_it_analyzer.analyze()) {
// 没识别到“购买商品”按钮不应该出现这种情况TODO 报错
return false;
}
buy_it_rect = buy_it_analyzer.get_result().rect;
pre_delay = buy_it_task_ptr->pre_delay;
rare_delay = buy_it_task_ptr->rear_delay;
}
if (need_exit()) {
return false;
}
ctrler.click(buy_it_rect);
sleep(rare_delay);
// 识别是否信用不足无法购买
const cv::Mat& prompt_image = ctrler.get_image();
const auto no_money_task_ptr = std::dynamic_pointer_cast<OcrTaskInfo>(
resource.task().task_ptr("CreditShop-NoMoney"));
OcrImageAnalyzer prompt_analyzer(prompt_image);
prompt_analyzer.set_task_info(*no_money_task_ptr);
if (prompt_analyzer.analyze()) {
click_return_button();
return true;
}
// 这里随便点一下都行,把购买完弹出来物品的界面取消掉
ctrler.click(buy_it_rect);
sleep(rare_delay);
}
return true;
}