mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-19 18:47:55 +08:00
117 lines
3.2 KiB
C++
117 lines
3.2 KiB
C++
#include "CreditShoppingTask.h"
|
|
|
|
#include <algorithm>
|
|
#include <vector>
|
|
|
|
#include "Controller.h"
|
|
#include "ImageAnalyzer/CreditShopImageAnalyzer.h"
|
|
#include "ImageAnalyzer/General/MatchImageAnalyzer.h"
|
|
#include "ImageAnalyzer/General/OcrImageAnalyzer.h"
|
|
#include "ProcessTask.h"
|
|
#include "TaskData.h"
|
|
#include "Utils/Logger.hpp"
|
|
|
|
void asst::CreditShoppingTask::set_black_list(std::vector<std::string> black_list)
|
|
{
|
|
m_shopping_list = std::move(black_list);
|
|
m_is_white_list = false;
|
|
}
|
|
|
|
void asst::CreditShoppingTask::set_white_list(std::vector<std::string> black_list)
|
|
{
|
|
m_shopping_list = std::move(black_list);
|
|
m_is_white_list = true;
|
|
}
|
|
|
|
asst::CreditShoppingTask& asst::CreditShoppingTask::set_force_shopping_if_credit_full(
|
|
bool force_shopping_if_credit_full) noexcept
|
|
{
|
|
m_force_shopping_if_credit_full = force_shopping_if_credit_full;
|
|
return *this;
|
|
}
|
|
|
|
int asst::CreditShoppingTask::credit_ocr()
|
|
{
|
|
cv::Mat credit_image = m_ctrler->get_image();
|
|
OcrImageAnalyzer credit_analyzer(credit_image);
|
|
credit_analyzer.set_task_info("CreditShop-CreditOcr");
|
|
credit_analyzer.set_replace(Task.get<OcrTaskInfo>("NumberOcrReplace")->replace_map);
|
|
|
|
if (!credit_analyzer.analyze()) {
|
|
Log.trace("ERROR:!credit_analyzer.analyze():");
|
|
return -1;
|
|
}
|
|
|
|
const std::string& credit = credit_analyzer.get_result().front().text;
|
|
|
|
if (credit.empty() || !ranges::all_of(credit, [](char c) -> bool { return std::isdigit(c); })) {
|
|
return -1;
|
|
}
|
|
|
|
Log.trace("credit:", credit);
|
|
|
|
return std::stoi(credit);
|
|
}
|
|
|
|
bool asst::CreditShoppingTask::credit_shopping(bool white_list_enabled, bool credit_ocr_enabled)
|
|
{
|
|
const cv::Mat image = m_ctrler->get_image();
|
|
|
|
CreditShopImageAnalyzer shop_analyzer(image);
|
|
if (white_list_enabled) {
|
|
if (m_is_white_list) {
|
|
shop_analyzer.set_white_list(m_shopping_list);
|
|
}
|
|
else {
|
|
shop_analyzer.set_black_list(m_shopping_list);
|
|
}
|
|
}
|
|
|
|
if (!shop_analyzer.analyze()) {
|
|
return false;
|
|
}
|
|
const auto& shopping_list = shop_analyzer.get_result();
|
|
|
|
for (const Rect& commodity : shopping_list) {
|
|
if (need_exit()) {
|
|
return false;
|
|
}
|
|
m_ctrler->click(commodity);
|
|
|
|
ProcessTask(*this, { "CreditShop-BuyIt" }).run();
|
|
|
|
if (ProcessTask(*this, { "CreditShop-NoMoney" }).set_retry_times(0).run()) {
|
|
break;
|
|
}
|
|
if (need_exit()) {
|
|
return false;
|
|
}
|
|
if (credit_ocr_enabled) {
|
|
int credit = credit_ocr();
|
|
if (credit <= MaxCredit) { // 信用值不再溢出,停止购物
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool asst::CreditShoppingTask::_run()
|
|
{
|
|
Log.trace("CreditShopping: m_is_white_list:", m_is_white_list,
|
|
" m_force_shopping_if_credit_full: ", m_force_shopping_if_credit_full);
|
|
|
|
if (!m_force_shopping_if_credit_full) {
|
|
return credit_shopping(true, false);
|
|
}
|
|
else {
|
|
int credit = credit_ocr(); // 识别信用值,防止信用值溢出
|
|
|
|
if (credit > MaxCredit) { // 信用值溢出
|
|
return credit_shopping(false, true);
|
|
}
|
|
}
|
|
return true;
|
|
}
|