diff --git a/docs/en/INTEGRATION.md b/docs/en/INTEGRATION.md
index 394dfb8e21..223876969a 100644
--- a/docs/en/INTEGRATION.md
+++ b/docs/en/INTEGRATION.md
@@ -159,10 +159,16 @@ Appends a task.
```jsonc
{
"enable": bool, // Whether to enable this task, optional, by default true
- "mode": int // Mode, optional, by default 0
- // 0 - Plays as much as you can
- // 1 - Exits after first level
- // 2 - Plays until trading
+ "mode": int, // Mode, optional, by default 0
+ // 0 - For candle, plays as much as you can with stable strategy
+ // 1 - For Originium Ingots, exits after first level
+ // 2 - For both, Plays until invests
+ // 3 - For pass, plays as much as you can with aggressive strategy
+ "starts_count": int, // Number of starts, optional, by default INT_MAX
+ "investments_count": int,
+ // Number of investments, optional, by default INT_MAX
+ "stop_when_investment_full": bool
+ // Stop the task when investment is full, optional, by default false
}
```
diff --git a/docs/集成文档.md b/docs/集成文档.md
index 1c09302680..0106e314d3 100644
--- a/docs/集成文档.md
+++ b/docs/集成文档.md
@@ -159,10 +159,16 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p
```jsonc
{
"enable": bool, // 是否启用本任务,可选,默认为 true
- "mode": int // 模式,可选项。默认 0
- // 0 - 尽可能一直往后打
- // 1 - 第一层投资完源石锭就退出
- // 2 - 投资过后再退出,没有投资就继续往后打
+ "mode": int, // 模式,可选项。默认 0
+ // 0 - 刷蜡烛,尽可能稳定的打更多层数
+ // 1 - 刷源石锭,第一层投资完就退出
+ // 2 - 【即将弃用】两者兼顾,投资过后再退出,没有投资就继续往后打
+ // 3 - 【开发中】尝试通关,尽可能打的远
+ "starts_count": int, // 开始探索 次数,可选,默认 INT_MAX。达到后自动停止任务
+ "investments_count": int,
+ // 投资源石锭 次数,可选,默认 INT_MAX。达到后自动停止任务
+ "stop_when_investment_full": bool
+ // 投资满了自动停止任务,可选,默认 false
}
```
diff --git a/src/MeoAssistant/MeoAssistant.vcxproj b/src/MeoAssistant/MeoAssistant.vcxproj
index 2f439c7ddc..3caf0d32ed 100644
--- a/src/MeoAssistant/MeoAssistant.vcxproj
+++ b/src/MeoAssistant/MeoAssistant.vcxproj
@@ -34,6 +34,7 @@
+
@@ -118,6 +119,7 @@
+
diff --git a/src/MeoAssistant/MeoAssistant.vcxproj.filters b/src/MeoAssistant/MeoAssistant.vcxproj.filters
index 081f88d251..e58aad4a4a 100644
--- a/src/MeoAssistant/MeoAssistant.vcxproj.filters
+++ b/src/MeoAssistant/MeoAssistant.vcxproj.filters
@@ -76,6 +76,12 @@
{a37e0b23-e8f8-499c-adf5-9990277e9ffe}
+
+ {82f533ab-3647-46ea-b9e1-0af634b3545c}
+
+
+ {67b117db-cce6-459f-bd26-bf897c02fbd7}
+
@@ -207,12 +213,6 @@
头文件\ImageAnalyzer\General
-
- 头文件\Task\Plugin
-
-
- 头文件\Task\Plugin
-
头文件\Resource
@@ -276,12 +276,6 @@
头文件\Task
-
- 头文件\Task\Plugin
-
-
- 头文件\Task\Plugin
-
头文件\Task\Plugin
@@ -345,6 +339,21 @@
头文件\Task\Plugin
+
+ 头文件\Task\Plugin\Roguelike
+
+
+ 头文件\Task\Plugin\Roguelike
+
+
+ 头文件\Task\Plugin\Roguelike
+
+
+ 头文件\Task\Plugin\Roguelike
+
+
+ 头文件\Task\Plugin\Roguelike
+
@@ -458,12 +467,6 @@
源文件\ImageAnalyzer\General
-
- 源文件\Task\Plugin
-
-
- 源文件\Task\Plugin
-
源文件\Resource
@@ -524,12 +527,6 @@
源文件\Task
-
- 源文件\Task\Plugin
-
-
- 源文件\Task\Plugin
-
源文件\Task
@@ -596,6 +593,21 @@
源文件\Task\Plugin
+
+ 源文件\Task\Plugin\Roguelike
+
+
+ 源文件\Task\Plugin\Roguelike
+
+
+ 源文件\Task\Plugin\Roguelike
+
+
+ 源文件\Task\Plugin\Roguelike
+
+
+ 源文件\Task\Plugin\Roguelike
+
diff --git a/src/MeoAssistant/ProcessTask.cpp b/src/MeoAssistant/ProcessTask.cpp
index d64a8d7872..4d310c2613 100644
--- a/src/MeoAssistant/ProcessTask.cpp
+++ b/src/MeoAssistant/ProcessTask.cpp
@@ -141,12 +141,14 @@ bool ProcessTask::_run()
}
if (exec_times >= max_times) {
+ info["what"] = "ExceededLimit";
info["details"] = json::object{
{ "task", cur_name },
{ "exec_times", exec_times },
{ "max_times", max_times }
};
Log.info("exec times exceeded the limit", info.to_string());
+ callback(AsstMsg::SubTaskExtraInfo, info);
m_cur_tasks_name = m_cur_task_ptr->exceeded_next;
sleep(m_task_delay);
continue;
@@ -260,6 +262,13 @@ bool asst::ProcessTask::on_run_fails()
return run();
}
+json::value asst::ProcessTask::basic_info() const
+{
+ return AbstractTask::basic_info() | json::object{
+ { "first", json::array(m_raw_tasks_name) }
+ };
+}
+
void ProcessTask::exec_click_task(const Rect& matched_rect)
{
m_ctrler->click(matched_rect);
diff --git a/src/MeoAssistant/ProcessTask.h b/src/MeoAssistant/ProcessTask.h
index 98e39a1e89..2f93055baa 100644
--- a/src/MeoAssistant/ProcessTask.h
+++ b/src/MeoAssistant/ProcessTask.h
@@ -25,6 +25,7 @@ namespace asst
protected:
virtual bool _run() override;
virtual bool on_run_fails() override;
+ virtual json::value basic_info() const override;
void exec_click_task(const Rect& matched_rect);
void exec_swipe_task(ProcessTaskAction action);
diff --git a/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp b/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp
index 56c175635f..dbd1914a93 100644
--- a/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp
+++ b/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp
@@ -310,7 +310,7 @@ bool asst::RoguelikeBattleTaskPlugin::auto_battle()
Point placed_point = m_side_tile_info.at(placed_loc).pos;
Rect placed_rect(placed_point.x, placed_point.y, 1, 1);
int dist = static_cast(Point::distance(
- placed_point, {opt_oper.rect.x + opt_oper.rect.width / 2, opt_oper.rect.y + opt_oper.rect.height / 2}));
+ placed_point, { opt_oper.rect.x + opt_oper.rect.width / 2, opt_oper.rect.y + opt_oper.rect.height / 2 }));
// 1000 是随便取的一个系数,把整数的 pre_delay 转成小数用的
int duration = static_cast(swipe_oper_task_ptr->pre_delay / 800.0 * dist * log10(dist));
m_ctrler->swipe(opt_oper.rect, placed_rect, duration, true, 0);
@@ -708,7 +708,7 @@ std::pair asst::RoguelikeBattleTaskPlugin::calc_best_direction
int max_score = 0;
Point opt_direction;
- for (const Point& direction : {Point::right(), Point::up(), Point::left(), Point::down()}) {
+ for (const Point& direction : { Point::right(), Point::up(), Point::left(), Point::down() }) {
int score = 0;
for (const Point& relative_pos : right_attack_range) {
Point absolute_pos = loc + relative_pos;
@@ -746,16 +746,16 @@ std::pair asst::RoguelikeBattleTaskPlugin::calc_best_direction
};
switch (role) {
- case BattleRole::Medic:
- if (m_used_tiles.find(absolute_pos) != m_used_tiles.end()) // 根据哪个方向上人多决定朝向哪
- score += 10000;
- if (auto iter = m_side_tile_info.find(absolute_pos); iter != m_side_tile_info.end())
- score += TileKeyMedicWeights.at(iter->second.key);
- break;
- default:
- if (auto iter = m_side_tile_info.find(absolute_pos); iter != m_side_tile_info.end())
- score += TileKeyFightWeights.at(iter->second.key);
- break;
+ case BattleRole::Medic:
+ if (m_used_tiles.find(absolute_pos) != m_used_tiles.end()) // 根据哪个方向上人多决定朝向哪
+ score += 10000;
+ if (auto iter = m_side_tile_info.find(absolute_pos); iter != m_side_tile_info.end())
+ score += TileKeyMedicWeights.at(iter->second.key);
+ break;
+ default:
+ if (auto iter = m_side_tile_info.find(absolute_pos); iter != m_side_tile_info.end())
+ score += TileKeyFightWeights.at(iter->second.key);
+ break;
}
}
@@ -769,7 +769,7 @@ std::pair asst::RoguelikeBattleTaskPlugin::calc_best_direction
// rotate relative attack range counterclockwise
for (Point& point : right_attack_range)
- point = {point.y, -point.x};
+ point = { point.y, -point.x };
}
return std::make_pair(opt_direction, max_score);
diff --git a/src/MeoAssistant/RoguelikeControlTaskPlugin.cpp b/src/MeoAssistant/RoguelikeControlTaskPlugin.cpp
new file mode 100644
index 0000000000..4281df05d9
--- /dev/null
+++ b/src/MeoAssistant/RoguelikeControlTaskPlugin.cpp
@@ -0,0 +1,28 @@
+#include "RoguelikeControlTaskPlugin.h"
+
+bool asst::RoguelikeControlTaskPlugin::verify(AsstMsg msg, const json::value& details) const
+{
+ if (msg != AsstMsg::SubTaskExtraInfo
+ || details.get("subtask", std::string()) != "ProcessTask") {
+ return false;
+ }
+ const std::string what = details.get("what", std::string());
+ if (what != "ExceededLimit") {
+ return false;
+ }
+
+ const std::string task = details.at("details").at("task").as_string();
+ if (task == "Roguelike1Start" ||
+ task == "Roguelike1StageTraderInvestConfirm" ||
+ task == "Roguelike1StageTraderInvestSystemFull") {
+ return true;
+ }
+
+ return false;
+}
+
+bool asst::RoguelikeControlTaskPlugin::_run()
+{
+ m_task_ptr->set_enable(false);
+ return true;
+}
diff --git a/src/MeoAssistant/RoguelikeControlTaskPlugin.h b/src/MeoAssistant/RoguelikeControlTaskPlugin.h
new file mode 100644
index 0000000000..79dde47f04
--- /dev/null
+++ b/src/MeoAssistant/RoguelikeControlTaskPlugin.h
@@ -0,0 +1,18 @@
+#pragma once
+#include "AbstractTaskPlugin.h"
+
+namespace asst
+{
+ class RoguelikeControlTaskPlugin : public AbstractTaskPlugin
+ {
+ public:
+ using AbstractTaskPlugin::AbstractTaskPlugin;
+ virtual ~RoguelikeControlTaskPlugin() = default;
+
+ public:
+ virtual bool verify(AsstMsg msg, const json::value& details) const override;
+
+ protected:
+ virtual bool _run() override;
+ };
+}
diff --git a/src/MeoAssistant/RoguelikeTask.cpp b/src/MeoAssistant/RoguelikeTask.cpp
index 4fccee9e44..16972cf3f2 100644
--- a/src/MeoAssistant/RoguelikeTask.cpp
+++ b/src/MeoAssistant/RoguelikeTask.cpp
@@ -6,6 +6,7 @@
#include "RoguelikeRecruitTaskPlugin.h"
#include "RoguelikeSkillSelectionTaskPlugin.h"
#include "RoguelikeBattleTaskPlugin.h"
+#include "RoguelikeControlTaskPlugin.h"
#include "Logger.hpp"
@@ -17,6 +18,7 @@ asst::RoguelikeTask::RoguelikeTask(const AsstCallback& callback, void* callback_
.set_retry_times(50);
m_roguelike_task_ptr->regiseter_plugin();
+ m_roguelike_task_ptr->regiseter_plugin();
m_battle_task_ptr = m_roguelike_task_ptr->regiseter_plugin();
@@ -27,16 +29,17 @@ asst::RoguelikeTask::RoguelikeTask(const AsstCallback& callback, void* callback_
m_skill_task_ptr->set_retry_times(3);
// 这个任务如果卡住会放弃当前的肉鸽并重新开始,所以多添加一点。先这样凑合用
- for (int i = 0; i != 10000; ++i) {
+ for (int i = 0; i != 100; ++i) {
m_subtasks.emplace_back(m_roguelike_task_ptr);
}
}
bool asst::RoguelikeTask::set_params(const json::value& params)
{
- // 0 - 尽可能一直往后打
- // 1 - 第一层投资完源石锭就退出
- // 2 - 投资过后再退出,没有投资就继续往后打
+ // 0 - 刷蜡烛,尽可能稳定的打更多层数
+ // 1 - 刷源石锭,第一层投资完就退出
+ // 2 - 【弃用】两者兼顾,投资过后再退出,没有投资就继续往后打
+ // 3 - 尝试通关,激进策略
int mode = params.get("mode", 0);
switch (mode) {
@@ -53,5 +56,18 @@ bool asst::RoguelikeTask::set_params(const json::value& params)
return false;
}
+ int number_of_starts = params.get("starts_count", INT_MAX);
+ m_roguelike_task_ptr->set_times_limit("Roguelike1Start", number_of_starts);
+
+ int number_of_investments = params.get("investments_count", INT_MAX);
+ m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderInvestConfirm", number_of_investments);
+
+ bool stop_when_full = params.get("stop_when_investment_full", false);
+ if (stop_when_full) {
+ m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderInvestSystemFull", 0);
+ constexpr int InvestLimit = 999;
+ m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderInvestConfirm", InvestLimit);
+ }
+
return true;
}
diff --git a/src/MeoAsstGui/Helper/AsstProxy.cs b/src/MeoAsstGui/Helper/AsstProxy.cs
index c1e7c35b9a..bf4a326fbd 100644
--- a/src/MeoAsstGui/Helper/AsstProxy.cs
+++ b/src/MeoAsstGui/Helper/AsstProxy.cs
@@ -985,10 +985,13 @@ namespace MeoAsstGui
return id != 0;
}
- public bool AsstAppendRoguelike(int mode)
+ public bool AsstAppendRoguelike(int mode, int starts, int invests, bool stop_when_full)
{
var task_params = new JObject();
task_params["mode"] = mode;
+ task_params["starts_count"] = starts;
+ task_params["investments_count"] = invests;
+ task_params["stop_when_investment_full"] = stop_when_full;
TaskId id = AsstAppendTaskWithEncoding("Roguelike", task_params);
_latestTaskId[TaskType.Roguelike] = id;
return id != 0;
diff --git a/src/MeoAsstGui/UserControl/RogueliekSettingsUserControl.xaml b/src/MeoAsstGui/UserControl/RogueliekSettingsUserControl.xaml
index b2c0391e88..d56a643ceb 100644
--- a/src/MeoAsstGui/UserControl/RogueliekSettingsUserControl.xaml
+++ b/src/MeoAsstGui/UserControl/RogueliekSettingsUserControl.xaml
@@ -7,14 +7,36 @@
xmlns:dd="urn:gong-wpf-dragdrop"
mc:Ignorable="d"
xmlns:vm="clr-namespace:MeoAsstGui;assembly=MeoAsstGui"
+ xmlns:hc="https://handyorg.github.io/handycontrol"
d:DataContext="{d:DesignInstance {x:Type vm:SettingsViewModel}}"
d:DesignHeight="300" d:DesignWidth="550">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs
index 6d57146c1a..d33a9bc6d1 100644
--- a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs
+++ b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs
@@ -135,9 +135,10 @@ namespace MeoAsstGui
RoguelikeModeList = new List
{
- new CombData { Display = "尽可能往后打", Value = "0" },
- new CombData { Display = "刷源石锭投资,第一层商店后直接退出", Value = "1" },
- new CombData { Display = "刷源石锭投资,投资过后退出", Value = "2" }
+ new CombData { Display = "刷蜡烛,尽可能稳定的打更多层数", Value = "0" },
+ new CombData { Display = "刷源石锭,第一层商店后直接退出", Value = "1" },
+ //new CombData { Display = "两者兼顾,投资过后退出", Value = "2" } // 弃用
+ //new CombData { Display = "尝试通关,贪B策略", Value = "3" }, // 开发中
};
ClientTypeList = new List
@@ -493,6 +494,42 @@ namespace MeoAsstGui
}
}
+ private string _roguelikeStartsCount = ViewStatusStorage.Get("Roguelike.StartsCount", "9999999");
+
+ public int RoguelikeStartsCount
+ {
+ get { return int.Parse(_roguelikeStartsCount); }
+ set
+ {
+ SetAndNotify(ref _roguelikeStartsCount, value.ToString());
+ ViewStatusStorage.Set("Roguelike.StartsCount", value.ToString());
+ }
+ }
+
+ private string _roguelikeInvestsCount = ViewStatusStorage.Get("Roguelike.InvestsCount", "9999999");
+
+ public int RoguelikeInvestsCount
+ {
+ get { return int.Parse(_roguelikeInvestsCount); }
+ set
+ {
+ SetAndNotify(ref _roguelikeInvestsCount, value.ToString());
+ ViewStatusStorage.Set("Roguelike.InvestsCount", value.ToString());
+ }
+ }
+
+ private string _roguelikeStopWhenInvestmentFull = ViewStatusStorage.Get("Roguelike.StopWhenInvestmentFull", false.ToString());
+
+ public bool RoguelikeStopWhenInvestmentFull
+ {
+ get { return bool.Parse(_roguelikeStopWhenInvestmentFull); }
+ set
+ {
+ SetAndNotify(ref _roguelikeStopWhenInvestmentFull, value.ToString());
+ ViewStatusStorage.Set("Roguelike.StopWhenInvestmentFull", value.ToString());
+ }
+ }
+
/* 信用商店设置 */
private bool _creditShopping = Convert.ToBoolean(ViewStatusStorage.Get("Mall.CreditShopping", bool.TrueString));
diff --git a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs
index dd28485d9f..0d72197a76 100644
--- a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs
+++ b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs
@@ -796,7 +796,7 @@ namespace MeoAsstGui
int.TryParse(settings.RoguelikeMode, out mode);
var asstProxy = _container.Get();
- return asstProxy.AsstAppendRoguelike(mode);
+ return asstProxy.AsstAppendRoguelike(mode, settings.RoguelikeStartsCount, settings.RoguelikeInvestsCount, settings.RoguelikeStopWhenInvestmentFull);
}
public bool killemulator()