opt.简单优化了下战斗任务

This commit is contained in:
MistEO
2022-01-21 00:12:39 +08:00
parent 5a7f00f4c9
commit be90db2ce5
5 changed files with 37 additions and 31 deletions

View File

@@ -29,7 +29,7 @@ bool asst::BattlePerspectiveImageAnalyzer::placed_analyze()
cv::Mat hsv;
cv::cvtColor(m_image, hsv, cv::COLOR_BGR2HSV);
cv::Mat bin;
cv::inRange(hsv, cv::Scalar(60, 100, 60), cv::Scalar(80, 150, 120), bin);
cv::inRange(hsv, cv::Scalar(60, 100, 60), cv::Scalar(80, 150, 150), bin);
// 形态学降噪
cv::Mat morph_dst = bin;
@@ -64,13 +64,13 @@ bool asst::BattlePerspectiveImageAnalyzer::placed_analyze()
cv::circle(m_image_draw, cv::Point(m_nearest_point.x, m_nearest_point.y), 3, cv::Scalar(255, 255, 0));
#endif
// // 格子的边缘是没法上人的,往格子中间位置校正一下
// Point home_center(home.x + home.width / 2, home.y + home.height / 2);
// m_nearest_point.x += home_center.x < m_nearest_point.x ? 30 : -30;
// m_nearest_point.y += home_center.y < m_nearest_point.y ? 20 : -20;
//
//#ifdef ASST_DEBUG
// cv::circle(m_image_draw, cv::Point(m_nearest_point.x, m_nearest_point.y), 3, cv::Scalar(255, 255, 0), -1);
//#endif
// // 格子的边缘是没法上人的,往格子中间位置校正一下
// Point home_center(home.x + home.width / 2, home.y + home.height / 2);
// m_nearest_point.x += home_center.x < m_nearest_point.x ? 30 : -30;
// m_nearest_point.y += home_center.y < m_nearest_point.y ? 20 : -20;
//
//#ifdef ASST_DEBUG
// cv::circle(m_image_draw, cv::Point(m_nearest_point.x, m_nearest_point.y), 3, cv::Scalar(255, 255, 0), -1);
//#endif
return true;
}

View File

@@ -27,30 +27,25 @@ bool asst::BattleTask::auto_battle()
if (opers.empty()) {
return true;
}
if (auto cur_home = oper_analyzer.get_homes();
!cur_home.empty()) {
m_home_cache = cur_home;
}
static const std::array<Role, 9> RoleOrder = {
Role::Medic,
Role::Pioneer,
Role::Sniper,
Role::Support,
Role::Warrior,
Role::Support,
Role::Caster,
Role::Special,
Role::Medic,
Role::Tank,
Role::Drone
};
const auto use_oper_task_ptr = Task.get("BattleUseOper");
// 点击当前最合适的干员
//auto oper_iter = std::find_first_of(
// opers.cbegin(), opers.cend(), RoleOrder.cbegin(), RoleOrder.cend(),
// [](const Oper& oper, const Role& role) -> bool {
// return oper.available && oper.role == role;
//});
//if (oper_iter == opers.cend()) {
// return true;
//}
Oper opt_oper;
bool oper_found = false;
for (auto role : RoleOrder) {
@@ -74,7 +69,7 @@ bool asst::BattleTask::auto_battle()
// 将干员拖动到场上
BattlePerspectiveImageAnalyzer placed_analyzer(Ctrler.get_image());
placed_analyzer.set_src_homes(oper_analyzer.get_homes());
placed_analyzer.set_src_homes(m_home_cache);
if (!placed_analyzer.analyze()) {
return true;
}
@@ -87,11 +82,19 @@ bool asst::BattleTask::auto_battle()
Rect home = placed_analyzer.get_homes().front();
Point home_center(home.x + home.width / 2, home.y + home.height / 2);
int dx = nearest_point.x - home_center.x;
int dy = nearest_point.y - home_center.y;
Point end_point;
switch (opt_oper.role) {
case Role::Medic:
case Role::Support:
Ctrler.swipe(nearest_point, home_center, 300);
break;
{
constexpr int coeff = 5;
end_point.x = nearest_point.x - coeff * dx;
end_point.y = nearest_point.y - coeff * dy;
}
break;
case Role::Pioneer:
case Role::Warrior:
case Role::Sniper:
@@ -101,12 +104,12 @@ bool asst::BattleTask::auto_battle()
case Role::Drone:
default:
{
Point reverse_point;
reverse_point.x = nearest_point.x * 2 - home_center.x;
reverse_point.y = nearest_point.y * 2 - home_center.y;
Ctrler.swipe(nearest_point, reverse_point, 300);
constexpr int coeff = 5;
end_point.x = nearest_point.x + coeff * dx;
end_point.y = nearest_point.y + coeff * dy;
}
break;
}
Ctrler.swipe(nearest_point, end_point, 300);
return true;
}

View File

@@ -1,6 +1,7 @@
#pragma once
#include "AbstractTask.h"
#include "AsstDef.h"
namespace asst
{
@@ -14,5 +15,7 @@ namespace asst
virtual bool _run() override;
bool auto_battle();
std::vector<Rect> m_home_cache;
};
}

View File

@@ -103,7 +103,7 @@ bool asst::TaskData::parse(const json::value& json)
for (const json::value& hash : task_json.at("hash").as_array()) {
hash_task_info_ptr->hashs.emplace_back(hash.as_string());
}
hash_task_info_ptr->dist_threshold = task_json.get("threshold", 0.0);
hash_task_info_ptr->dist_threshold = task_json.get("threshold", 0);
if (task_json.exist("maskRange")) {
hash_task_info_ptr->mask_range = std::make_pair(
task_json.at("maskRange")[0].as_integer(),
@@ -217,4 +217,4 @@ bool asst::TaskData::parse(const json::value& json)
}
#endif
return true;
}
}

View File

@@ -30,14 +30,14 @@ int main(int argc, char** argv)
char ch = 0;
while (ch != 'q') {
AsstAppendDebug(ptr);
// AsstAppendStartUp(ptr);
AsstAppendFight(ptr, "CE-5", 0, 0, 99999);
//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);
// }
// AsstAppendDebug(ptr);
//{
// const char* order[] = { "Trade", "Dorm" };
// AsstAppendInfrast(ptr, 1, order, 2, "Money", 0.3);