feat: 初步跑通保全关卡切换流程

This commit is contained in:
MistEO
2023-01-03 00:00:29 +08:00
parent d25c2c04ef
commit b0547c302a
10 changed files with 174 additions and 48 deletions

View File

@@ -9475,10 +9475,16 @@
576,
288,
144
],
"next": [
"SSSStartFighting",
"SSSCloseTip"
]
},
"SSSStageNameOCR": {
"algorithm": "OcrDetect",
"text": [],
"roi": [
121,
263,
188,
50
]
},
"SSSCloseTip": {
@@ -9497,7 +9503,24 @@
"action": "ClickSelf",
"algorithm": "OcrDetect",
"text": [
"开始部署"
"开始部署",
"重新部署"
],
"roi": [
992,
576,
288,
144
],
"next": [
"SSSStartFighting2"
]
},
"SSSStartFighting2": {
"action": "ClickSelf",
"algorithm": "OcrDetect",
"text": [
"开始行动"
],
"roi": [
992,

View File

@@ -200,6 +200,7 @@ namespace asst::battle
{
std::vector<Strategy> strategies;
bool draw_as_possible = false;
int retry_times = 0;
};
enum class EquipmentType

View File

@@ -34,6 +34,7 @@
<ClInclude Include="Task\BattleHelper.h" />
<ClInclude Include="Task\Interface\SSSCopilotTask.h" />
<ClInclude Include="Task\Miscellaneous\SSSBattleProcessTask.h" />
<ClInclude Include="Task\Miscellaneous\SSSStageManagerTask.h" />
<ClInclude Include="Vision\AbstractImageAnalyzer.h" />
<ClInclude Include="Vision\HashImageAnalyzer.h" />
<ClInclude Include="Vision\Infrast\InfrastClueImageAnalyzer.h" />
@@ -154,6 +155,7 @@
<ClCompile Include="Task\BattleHelper.cpp" />
<ClCompile Include="Task\Interface\SSSCopilotTask.cpp" />
<ClCompile Include="Task\Miscellaneous\SSSBattleProcessTask.cpp" />
<ClCompile Include="Task\Miscellaneous\SSSStageManagerTask.cpp" />
<ClCompile Include="Vision\AbstractImageAnalyzer.cpp" />
<ClCompile Include="Vision\HashImageAnalyzer.cpp" />
<ClCompile Include="Vision\Infrast\InfrastClueImageAnalyzer.cpp" />
@@ -403,4 +405,4 @@
<UserProperties _1_1_4_1_1_4resource_4config_1json__JsonSchema="" _1_1_4_1_1_4resource_4tasks_1json__JsonSchema="../docs/maa_tasks_schema.json" />
</VisualStudio>
</ProjectExtensions>
</Project>
</Project>

View File

@@ -468,6 +468,9 @@
<ClInclude Include="Task\Miscellaneous\StopGameTaskPlugin.h">
<Filter>源文件\Task\Roguelike</Filter>
</ClInclude>
<ClInclude Include="Task\Miscellaneous\SSSStageManagerTask.h">
<Filter>源文件\Task\Miscellaneous</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Vision\AbstractImageAnalyzer.cpp">
@@ -767,5 +770,8 @@
<ClCompile Include="Task\Miscellaneous\SSSBattleProcessTask.cpp">
<Filter>源文件\Task\Miscellaneous</Filter>
</ClCompile>
<ClCompile Include="Task\Miscellaneous\SSSStageManagerTask.cpp">
<Filter>源文件\Task\Miscellaneous</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@@ -3,7 +3,7 @@
#include "Config/Miscellaneous/SSSCopilotConfig.h"
#include "Config/TaskData.h"
#include "Task/Miscellaneous/BattleFormationTask.h"
#include "Task/Miscellaneous/SSSBattleProcessTask.h"
#include "Task/Miscellaneous/SSSStageManagerTask.h"
#include "Task/ProcessTask.h"
#include "Utils/Logger.hpp"
#include "Utils/Platform.hpp"
@@ -12,19 +12,19 @@ asst::SSSCopilotTask::SSSCopilotTask(const AsstCallback& callback, Assistant* in
: InterfaceTask(callback, inst, TaskType),
m_begin_task_ptr(std::make_shared<ProcessTask>(callback, inst, TaskType)),
m_formation_task_ptr(std::make_shared<BattleFormationTask>(callback, inst, TaskType)),
m_battle_task_ptr(std::make_shared<SSSBattleProcessTask>(callback, inst, TaskType))
m_stage_task_ptr(std::make_shared<SSSStageManagerTask>(callback, inst, TaskType))
{
// m_begin_task_ptr->set_tasks({ inst_string() + "@SSSBegin" }).set_ignore_error(false);
// m_subtasks.emplace_back(m_begin_task_ptr);
m_begin_task_ptr->set_tasks({ inst_string() + "@SSSBegin" }).set_ignore_error(false);
m_subtasks.emplace_back(m_begin_task_ptr);
// m_formation_task_ptr->set_data_resource(BattleFormationTask::DataResource::SSSCopilot);
// m_subtasks.emplace_back(m_formation_task_ptr);
m_formation_task_ptr->set_data_resource(BattleFormationTask::DataResource::SSSCopilot);
m_subtasks.emplace_back(m_formation_task_ptr);
// auto start_2_tp = std::make_shared<ProcessTask>(callback, inst, TaskType);
// start_2_tp->set_tasks({ inst_string() + "@SSSTeamConfirm" }).set_ignore_error(false);
// m_subtasks.emplace_back(start_2_tp);
auto start_2_tp = std::make_shared<ProcessTask>(callback, inst, TaskType);
start_2_tp->set_tasks({ inst_string() + "@SSSTeamConfirm" }).set_ignore_error(false);
m_subtasks.emplace_back(start_2_tp);
m_subtasks.emplace_back(m_battle_task_ptr)->set_retry_times(0);
m_subtasks.emplace_back(m_stage_task_ptr);
}
bool asst::SSSCopilotTask::set_params(const json::value& params)
@@ -62,9 +62,5 @@ bool asst::SSSCopilotTask::set_params(const json::value& params)
};
m_formation_task_ptr->append_additional_formation(std::move(additional_formation));
// for debug
m_battle_task_ptr->set_stage_index(0);
m_battle_task_ptr->set_stage_name("蜂拥而上");
return true;
}

View File

@@ -5,9 +5,9 @@
namespace asst
{
class SSSBattleProcessTask;
class BattleFormationTask;
class ProcessTask;
class BattleFormationTask;
class SSSStageManagerTask;
// 保全派驻抄作业任务
class SSSCopilotTask final : public InterfaceTask
@@ -23,6 +23,6 @@ namespace asst
private:
std::shared_ptr<ProcessTask> m_begin_task_ptr = nullptr;
std::shared_ptr<BattleFormationTask> m_formation_task_ptr = nullptr;
std::shared_ptr<SSSBattleProcessTask> m_battle_task_ptr = nullptr;
std::shared_ptr<SSSStageManagerTask> m_stage_task_ptr = nullptr;
};
}

View File

@@ -8,11 +8,19 @@
using namespace asst::battle;
using namespace asst::battle::sss;
bool asst::SSSBattleProcessTask::set_stage_name(const std::string& stage_name)
bool asst::SSSBattleProcessTask::set_stage_index(size_t index)
{
LogTraceFunction;
Log.info(__FUNCTION__, index);
if (!BattleHelper::set_stage_name(stage_name)) {
if (index >= SSSCopilot.stages_size()) {
Log.error("SSS SSSBattleProcessTask: stage index out of range", index);
return false;
}
m_sss_combat_data = SSSCopilot.get_data(index);
ranges::transform(m_sss_combat_data.strategies, std::inserter(m_all_cores, m_all_cores.begin()),
[](const auto& strategy) { return strategy.core; });
if (!BattleHelper::set_stage_name(m_sss_combat_data.info.stage_name)) {
json::value info = basic_info_with_what("UnsupportedLevel");
auto& details = info["details"];
details["level"] = m_stage_name;
@@ -20,26 +28,6 @@ bool asst::SSSBattleProcessTask::set_stage_name(const std::string& stage_name)
return false;
}
if (m_stage_index >= SSSCopilot.stages_size()) {
Log.error("SSS CopilotConfig: stage index out of range", m_stage_index);
return false;
}
m_sss_combat_data = SSSCopilot.get_data(m_stage_index);
ranges::transform(m_sss_combat_data.strategies, std::inserter(m_all_cores, m_all_cores.begin()),
[](const auto& strategy) { return strategy.core; });
return true;
}
bool asst::SSSBattleProcessTask::set_stage_index(size_t index)
{
Log.info(__FUNCTION__, index);
if (index >= SSSCopilot.stages_size()) {
return false;
}
m_stage_index = index;
return true;
}

View File

@@ -10,7 +10,6 @@ namespace asst
virtual ~SSSBattleProcessTask() override = default;
bool set_stage_index(size_t index);
virtual bool set_stage_name(const std::string& stage_name) override;
protected:
virtual bool do_derived_action(size_t action_index) override;
@@ -24,6 +23,8 @@ namespace asst
battle::sss::CombatData m_sss_combat_data;
std::unordered_set<std::string> m_all_cores;
size_t m_stage_index = SIZE_MAX;
private:
using BattleProcessTask::set_stage_name;
};
}

View File

@@ -0,0 +1,80 @@
#include "SSSStageManagerTask.h"
#include "Config/Miscellaneous/SSSCopilotConfig.h"
#include "Controller.h"
#include "Task/Miscellaneous/SSSBattleProcessTask.h"
#include "Task/ProcessTask.h"
#include "Utils/Logger.hpp"
#include "Vision/OcrWithPreprocessImageAnalyzer.h"
bool asst::SSSStageManagerTask::_run()
{
LogTraceFunction;
preprocess_data();
size_t stage_count = SSSCopilot.get_data().stages_data.size();
while (!need_exit()) {
auto stage_opt = analyze_stage();
if (!stage_opt) {
// TODO: 在点完开始之后,加载动画时,还会有一个很大的关卡名,可能识别成功率会更高
// 如果这里识别失败,可以考虑再识别一下加载动画的
Log.error("unknown stage");
return false;
}
if (!click_start_button()) {
return false;
}
const auto& [stage_name, stage_index] = stage_opt.value();
int times = m_remaining_times[stage_name] + 1;
SSSBattleProcessTask battle_task(m_callback, m_inst, m_task_chain);
battle_task.set_stage_index(stage_index);
for (int i = 0; i < times; ++i) {
if (battle_task.run()) {
break;
}
}
if (stage_index >= stage_count) {
// TODO: 任务结束
break;
}
}
return true;
}
void asst::SSSStageManagerTask::preprocess_data()
{
for (const auto& stage : SSSCopilot.get_data().stages_data) {
m_remaining_times[stage.info.stage_name] = stage.retry_times;
}
}
std::optional<asst::SSSStageManagerTask::StageInfo> asst::SSSStageManagerTask::analyze_stage()
{
OcrWithPreprocessImageAnalyzer analyzer(ctrler()->get_image());
analyzer.set_task_info("SSSStageNameOCR");
if (!analyzer.analyze()) {
return std::nullopt;
}
analyzer.sort_result_by_score();
const std::string& text = analyzer.get_result().front().text;
const auto& stages_data = SSSCopilot.get_data().stages_data;
for (int i = 0; i != stages_data.size(); ++i) {
if (stages_data.at(i).info.stage_name == text) {
Log.info("cur sss stage", text, ", index", i);
return StageInfo { .name = text, .index = i };
}
}
return std::nullopt;
}
bool asst::SSSStageManagerTask::click_start_button()
{
return ProcessTask(*this, { "SSSStartFighting", "SSSCloseTip" }).run();
}

View File

@@ -0,0 +1,29 @@
#pragma once
#include "Task/AbstractTask.h"
#include <optional>
namespace asst
{
class SSSStageManagerTask : public AbstractTask
{
public:
using AbstractTask::AbstractTask;
virtual ~SSSStageManagerTask() override = default;
private:
virtual bool _run() override;
void preprocess_data();
struct StageInfo
{
std::string name;
int index = 0;
};
std::optional<StageInfo> analyze_stage();
bool click_start_button();
std::unordered_map<std::string, int> m_remaining_times;
};
}