Files
MaaAssistantArknights/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp
2022-07-21 23:58:41 +08:00

107 lines
3.1 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 "RoguelikeFormationTaskPlugin.h"
#include "RoguelikeFormationImageAnalyzer.h"
#include "Controller.h"
#include "TaskData.h"
#include "ProcessTask.h"
#include "Logger.hpp"
bool asst::RoguelikeFormationTaskPlugin::verify(AsstMsg msg, const json::value& details) const
{
if (msg != AsstMsg::SubTaskCompleted
|| details.get("subtask", std::string()) != "ProcessTask") {
return false;
}
if (details.at("details").at("task").as_string() == "Roguelike1QuickFormation") {
return true;
}
else {
return false;
}
}
bool asst::RoguelikeFormationTaskPlugin::_run()
{
RoguelikeFormationImageAnalyzer formation_analyzer(m_ctrler->get_image());
if (!formation_analyzer.analyze()) {
return false;
}
size_t pre_selected = 0;
size_t select_count = 0;
for (const auto& oper : formation_analyzer.get_result()) {
if (oper.selected) {
++pre_selected;
continue;
}
m_ctrler->click(oper.rect);
++select_count;
}
Log.info(__FUNCTION__, "pre_selected: ", pre_selected, " select: ", select_count);
// 以下情况清空重选(游戏会自动排序)
// 1. 这一页选满 8 个了
// 2. select 有值但是重新识别后发现总的选择数量并没有增加说明上面的click都没生效
bool reselect = false;
if (pre_selected == MaxNumOfOperPerPage) {
reselect = true;
}
if (!reselect && select_count != 0) {
sleep(Task.get("Roguelike1QuickFormationDelay")->rear_delay);
formation_analyzer.set_image(m_ctrler->get_image());
if (!formation_analyzer.analyze()) {
Log.warn("RoguelikeFormationImageAnalyzer re analyze failed");
return true;
}
auto& new_result = formation_analyzer.get_result();
size_t new_selected_count = std::count_if(new_result.cbegin(), new_result.cend(),
[](const auto& oper) { return oper.selected; });
// 说明 select_count 计数没生效,即都没点上
if (new_selected_count == pre_selected) {
reselect = true;
}
}
if (reselect) {
clear_and_reselect();
}
return true;
}
void asst::RoguelikeFormationTaskPlugin::clear_and_reselect()
{
// 清空并退出游戏会自动按等级重新排序
ProcessTask(*this, { "Roguelike1QuickFormationClearAndReselect" }).run();
size_t select_count = analyze_and_select();
// 说明第二页还有
if (select_count == MaxNumOfOperPerPage) {
ProcessTask(*this, { "SlowlySwipeToTheRight" }).run();
analyze_and_select();
// 应该不可能还有第三页吧,不管了
}
}
size_t asst::RoguelikeFormationTaskPlugin::analyze_and_select()
{
RoguelikeFormationImageAnalyzer formation_analyzer(m_ctrler->get_image());
if (!formation_analyzer.analyze()) {
return false;
}
size_t select_count = 0;
for (const auto& oper : formation_analyzer.get_result()) {
if (oper.selected) {
continue;
}
m_ctrler->click(oper.rect);
++select_count;
}
return select_count;
}