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()