diff --git a/src/MeoAssistant/AsstUtils.hpp b/src/MeoAssistant/AsstUtils.hpp index 475679fdab..2d3ce27916 100644 --- a/src/MeoAssistant/AsstUtils.hpp +++ b/src/MeoAssistant/AsstUtils.hpp @@ -307,5 +307,5 @@ namespace asst // } // return str; //} - } - } + } +} diff --git a/src/MeoAssistant/GeneralConfiger.cpp b/src/MeoAssistant/GeneralConfiger.cpp index 9af27cee4f..47c372bcb1 100644 --- a/src/MeoAssistant/GeneralConfiger.cpp +++ b/src/MeoAssistant/GeneralConfiger.cpp @@ -5,50 +5,50 @@ bool asst::GeneralConfiger::parse(const json::value& json) { - LogTraceFunction; + LogTraceFunction; - m_version = json.at("version").as_string(); + m_version = json.at("version").as_string(); - { - const json::value& options_json = json.at("options"); - m_options.task_delay = options_json.at("taskDelay").as_integer(); - m_options.control_delay_lower = options_json.at("controlDelayRange")[0].as_integer(); - m_options.control_delay_upper = options_json.at("controlDelayRange")[1].as_integer(); - //m_options.print_window = options_json.at("printWindow").as_boolean(); - m_options.adb_extra_swipe_dist = options_json.get("adbExtraSwipeDist", 100); - m_options.adb_extra_swipe_duration = options_json.get("adbExtraSwipeDuration", -1); + { + const json::value& options_json = json.at("options"); + m_options.task_delay = options_json.at("taskDelay").as_integer(); + m_options.control_delay_lower = options_json.at("controlDelayRange")[0].as_integer(); + m_options.control_delay_upper = options_json.at("controlDelayRange")[1].as_integer(); + //m_options.print_window = options_json.at("printWindow").as_boolean(); + m_options.adb_extra_swipe_dist = options_json.get("adbExtraSwipeDist", 100); + m_options.adb_extra_swipe_duration = options_json.get("adbExtraSwipeDuration", -1); - auto& penguin_report = options_json.at("penguinReport"); - m_options.penguin_report.cmd_format = penguin_report.get("cmdFormat", std::string()); + auto& penguin_report = options_json.at("penguinReport"); + m_options.penguin_report.cmd_format = penguin_report.get("cmdFormat", std::string()); - if (options_json.contains("aipOcr")) { - auto& aip_ocr = options_json.at("aipOcr"); - m_options.aip_ocr.enable = aip_ocr.get("enable", false); - m_options.aip_ocr.accurate = aip_ocr.get("accurate", false); - m_options.aip_ocr.client_id = aip_ocr.get("clientId", std::string()); - m_options.aip_ocr.client_secret = aip_ocr.get("clientSerect", std::string()); - } - } + if (options_json.contains("aipOcr")) { + auto& aip_ocr = options_json.at("aipOcr"); + m_options.aip_ocr.enable = aip_ocr.get("enable", false); + m_options.aip_ocr.accurate = aip_ocr.get("accurate", false); + m_options.aip_ocr.client_id = aip_ocr.get("clientId", std::string()); + m_options.aip_ocr.client_secret = aip_ocr.get("clientSerect", std::string()); + } + } - for (const auto& [name, cfg_json] : json.at("connection").as_object()) { - AdbCfg adb; + for (const auto& [name, cfg_json] : json.at("connection").as_object()) { + AdbCfg adb; - adb.devices = cfg_json.at("devices").as_string(); - adb.address_regex = cfg_json.at("addressRegex").as_string(); - adb.connect = cfg_json.at("connect").as_string(); - adb.display_id = cfg_json.get("displayId", std::string()); - adb.uuid = cfg_json.at("uuid").as_string(); - adb.click = cfg_json.at("click").as_string(); - adb.swipe = cfg_json.at("swipe").as_string(); - adb.display = cfg_json.at("display").as_string(); - adb.display_format = cfg_json.at("displayFormat").as_string(); - adb.screencap_raw_with_gzip = cfg_json.at("screencapRawWithGzip").as_string(); - adb.screencap_encode = cfg_json.at("screencapEncode").as_string(); - adb.release = cfg_json.at("release").as_string(); - //adb.pullscreen = cfg_json.at("pullscreen").as_string(); + adb.devices = cfg_json.at("devices").as_string(); + adb.address_regex = cfg_json.at("addressRegex").as_string(); + adb.connect = cfg_json.at("connect").as_string(); + adb.display_id = cfg_json.get("displayId", std::string()); + adb.uuid = cfg_json.at("uuid").as_string(); + adb.click = cfg_json.at("click").as_string(); + adb.swipe = cfg_json.at("swipe").as_string(); + adb.display = cfg_json.at("display").as_string(); + adb.display_format = cfg_json.at("displayFormat").as_string(); + adb.screencap_raw_with_gzip = cfg_json.at("screencapRawWithGzip").as_string(); + adb.screencap_encode = cfg_json.at("screencapEncode").as_string(); + adb.release = cfg_json.at("release").as_string(); + //adb.pullscreen = cfg_json.at("pullscreen").as_string(); - m_adb_cfg[name] = std::move(adb); - } + m_adb_cfg[name] = std::move(adb); + } - return true; + return true; } diff --git a/src/MeoAssistant/StageDropsTaskPlugin.cpp b/src/MeoAssistant/StageDropsTaskPlugin.cpp index 3eb742638b..0ad9fc2ff4 100644 --- a/src/MeoAssistant/StageDropsTaskPlugin.cpp +++ b/src/MeoAssistant/StageDropsTaskPlugin.cpp @@ -110,7 +110,6 @@ bool asst::StageDropsTaskPlugin::recognize_drops() auto last_time = last_time_opt ? last_time_opt.value() : 0; m_status->set_data("LastRecognizeDrops", last_time + RecognizationTimeOffset); - return true; } diff --git a/src/MeoAssistant/TilePack.cpp b/src/MeoAssistant/TilePack.cpp index aeb67e0ee2..2798da9313 100644 --- a/src/MeoAssistant/TilePack.cpp +++ b/src/MeoAssistant/TilePack.cpp @@ -6,7 +6,7 @@ asst::TilePack::~TilePack() = default; -bool asst::TilePack::load(const std::string & dir) +bool asst::TilePack::load(const std::string& dir) { LogTraceFunction; @@ -28,7 +28,7 @@ bool asst::TilePack::load(const std::string & dir) } std::unordered_map asst::TilePack::calc( - const std::string & stage_code, bool side) const + const std::string& stage_code, bool side) const { LogTraceFunction; diff --git a/src/MeoAssistantBuilder/Constants.cs b/src/MeoAssistantBuilder/Constants.cs index 7b67b1daf4..52811043bb 100644 --- a/src/MeoAssistantBuilder/Constants.cs +++ b/src/MeoAssistantBuilder/Constants.cs @@ -14,10 +14,10 @@ public static class Constants public const string MaaWpfProjectFilePath = $"{MaaWpfProjectDirectory}/MeoAsstGui.csproj"; public const string MaaBuildOutputDirectory = $"{MaaProjectRootDirectory}/x64"; - + public const string MaaCoreBuildIntermediatOutputDirectory = $"{MaaCoreProjectDirectory}/x64"; - public static readonly string[] MaaCoreExtraFiles = new [] { "MeoAssistant.pdb", "MeoAssistant.lib", "MeoAssistant.exp" }; + public static readonly string[] MaaCoreExtraFiles = new[] { "MeoAssistant.pdb", "MeoAssistant.lib", "MeoAssistant.exp" }; public static readonly string[] MaaWpfExtraFiles = new[] { "MeoAsstGui.pdb", "MeoAsstGui.exe.config" }; } diff --git a/src/MeoAssistantBuilder/Helper/CleanDirectoryHelper.cs b/src/MeoAssistantBuilder/Helper/CleanDirectoryHelper.cs index 44611e9631..48c5fa8ae9 100644 --- a/src/MeoAssistantBuilder/Helper/CleanDirectoryHelper.cs +++ b/src/MeoAssistantBuilder/Helper/CleanDirectoryHelper.cs @@ -2,6 +2,7 @@ using Cake.Common.Diagnostics; using Cake.Common.IO; namespace MeoAssistantBuilder.Helper; + public static class CleanDirectoryHelper { public static void CleanArtifacts(this MaaBuildContext context) diff --git a/src/MeoAssistantBuilder/MaaBuildContext.cs b/src/MeoAssistantBuilder/MaaBuildContext.cs index 01044eed84..ad393e1914 100644 --- a/src/MeoAssistantBuilder/MaaBuildContext.cs +++ b/src/MeoAssistantBuilder/MaaBuildContext.cs @@ -9,7 +9,7 @@ namespace MeoAssistantBuilder; public class MaaBuildContext : FrostingContext { public string MsBuildExecutable { get; set; } - + public MaaBuildContext(ICakeContext context) : base(context) { MsBuildExecutable = context.Argument("tool", ""); diff --git a/src/MeoAssistantBuilder/Tasks/DevBuildTask.cs b/src/MeoAssistantBuilder/Tasks/DevBuildTask.cs index 6b7ce804c7..1507ba06b2 100644 --- a/src/MeoAssistantBuilder/Tasks/DevBuildTask.cs +++ b/src/MeoAssistantBuilder/Tasks/DevBuildTask.cs @@ -1,4 +1,3 @@ -using Cake.Common.Build; using Cake.Common.Diagnostics; using Cake.Frosting; using MeoAssistantBuilder.Helper; diff --git a/src/MeoAssistantBuilder/Tasks/ReleaseBundleTask.cs b/src/MeoAssistantBuilder/Tasks/ReleaseBundleTask.cs index 1a75549b30..a1a056d509 100644 --- a/src/MeoAssistantBuilder/Tasks/ReleaseBundleTask.cs +++ b/src/MeoAssistantBuilder/Tasks/ReleaseBundleTask.cs @@ -45,7 +45,7 @@ public sealed class ReleaseBundleTask : FrostingTask { version += $"-{ghActions.Environment.Workflow.RunId}"; } - else + else { var tag = ghActions.Environment.Workflow.Ref.Replace("refs/tags/", ""); if (tag != version) diff --git a/src/MeoAssistantBuilder/Tasks/ReleaseCoreTask.cs b/src/MeoAssistantBuilder/Tasks/ReleaseCoreTask.cs index 8a2131b5e4..ad4fe1d1e3 100644 --- a/src/MeoAssistantBuilder/Tasks/ReleaseCoreTask.cs +++ b/src/MeoAssistantBuilder/Tasks/ReleaseCoreTask.cs @@ -45,7 +45,7 @@ public sealed class ReleaseCoreTask : FrostingTask { version += $"-{ghActions.Environment.Workflow.RunId}"; } - else + else { var tag = ghActions.Environment.Workflow.Ref.Replace("refs/tags/", ""); if (tag != version) @@ -78,7 +78,7 @@ public sealed class ReleaseCoreTask : FrostingTask context.Information("--------------------------------------------------"); var thirdPartyDlls = Directory.GetFiles(Path.Combine(Constants.MaaProjectThirdPartyDirectory, "bin")); - foreach(var f in thirdPartyDlls) + foreach (var f in thirdPartyDlls) { var fileName = new FileInfo(f).Name; File.Copy(f, Path.Combine(buildOutput, fileName)); diff --git a/src/MeoAssistantBuilder/Tasks/ReleaseResourceTask.cs b/src/MeoAssistantBuilder/Tasks/ReleaseResourceTask.cs index de89df2d60..744ff6247e 100644 --- a/src/MeoAssistantBuilder/Tasks/ReleaseResourceTask.cs +++ b/src/MeoAssistantBuilder/Tasks/ReleaseResourceTask.cs @@ -1,4 +1,3 @@ -using Cake.Common.Build; using Cake.Common.Diagnostics; using Cake.Frosting; using MeoAssistantBuilder.Helper; diff --git a/src/MeoAssistantBuilder/Tasks/ReleaseWpfTask.cs b/src/MeoAssistantBuilder/Tasks/ReleaseWpfTask.cs index 43b7ceb0b9..c12ccf6789 100644 --- a/src/MeoAssistantBuilder/Tasks/ReleaseWpfTask.cs +++ b/src/MeoAssistantBuilder/Tasks/ReleaseWpfTask.cs @@ -1,4 +1,3 @@ -using Cake.Common.Build; using Cake.Common.Diagnostics; using Cake.Frosting; using MeoAssistantBuilder.Helper; diff --git a/src/MeoAsstGui/Helper/AsstProxy.cs b/src/MeoAsstGui/Helper/AsstProxy.cs index 35101bf9ad..46e37ff562 100644 --- a/src/MeoAsstGui/Helper/AsstProxy.cs +++ b/src/MeoAsstGui/Helper/AsstProxy.cs @@ -1,697 +1,697 @@ -// MeoAsstGui - A part of the MeoAssistantArknights project -// Copyright (C) 2021 MistEO and Contributors -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY - -using System; -using System.Runtime.InteropServices; -using System.Text; -using System.Windows; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Stylet; -using StyletIoC; - -namespace MeoAsstGui -{ - using AsstHandle = IntPtr; - using TaskId = Int32; - - public class AsstProxy - { - private delegate void CallbackDelegate(int msg, IntPtr json_buffer, IntPtr custom_arg); - - private delegate void ProcCallbckMsg(AsstMsg msg, JObject details); - - [DllImport("MeoAssistant.dll")] private static extern bool AsstLoadResource(byte[] dirname); - - private static bool AsstLoadResource(string dirname) - { - return AsstLoadResource(Encoding.UTF8.GetBytes(dirname)); - } - - [DllImport("MeoAssistant.dll")] private static extern AsstHandle AsstCreate(); - - [DllImport("MeoAssistant.dll")] private static extern AsstHandle AsstCreateEx(CallbackDelegate callback, IntPtr custom_arg); - - [DllImport("MeoAssistant.dll")] private static extern void AsstDestroy(AsstHandle handle); - - [DllImport("MeoAssistant.dll")] private static extern bool AsstConnect(AsstHandle handle, byte[] adb_path, byte[] address, byte[] config); - - private static bool AsstConnect(AsstHandle handle, string adb_path, string address, string config) - { - return AsstConnect(handle, Encoding.UTF8.GetBytes(adb_path), Encoding.UTF8.GetBytes(address), Encoding.UTF8.GetBytes(config)); - } - - [DllImport("MeoAssistant.dll")] private static extern TaskId AsstAppendTask(AsstHandle handle, byte[] type, byte[] task_params); - - private static TaskId AsstAppendTask(AsstHandle handle, string type, string task_params) - { - return AsstAppendTask(handle, Encoding.UTF8.GetBytes(type), Encoding.UTF8.GetBytes(task_params)); - } - - [DllImport("MeoAssistant.dll")] private static extern bool AsstSetTaskParams(AsstHandle handle, TaskId id, byte[] task_params); - - [DllImport("MeoAssistant.dll")] private static extern bool AsstStart(AsstHandle handle); - - [DllImport("MeoAssistant.dll")] private static extern bool AsstStop(AsstHandle handle); - - [DllImport("MeoAssistant.dll")] private static extern void AsstLog(byte[] level, byte[] message); - - private readonly CallbackDelegate _callback; - - public AsstProxy(IContainer container, IWindowManager windowManager) - { - _container = container; - _windowManager = windowManager; - _callback = CallbackFunction; - } - - public void Init() - { - bool loaded = AsstLoadResource(System.IO.Directory.GetCurrentDirectory()); - _handle = AsstCreateEx(_callback, IntPtr.Zero); - - if (loaded == false || _handle == IntPtr.Zero) - { - Execute.OnUIThread(() => - { - _windowManager.ShowMessageBox("出现未知异常", "错误", icon: MessageBoxImage.Error); - Environment.Exit(0); - }); - } - var tvm = _container.Get(); - tvm.Idle = true; - } - - [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)] - internal static extern int lstrlenA(IntPtr ptr); - - private static string PtrToStringCustom(IntPtr ptr, System.Text.Encoding enc) - { - if (IntPtr.Zero == ptr) - { - return null; - } - if (lstrlenA(ptr) == 0) - { - return string.Empty; - } - int len = lstrlenA(ptr); - Byte[] bytes = new Byte[len + 1]; - Marshal.Copy(ptr, bytes, 0, len + 1); - return enc.GetString(bytes); - } - - private void CallbackFunction(int msg, IntPtr json_buffer, IntPtr custom_arg) - { - string json_str = PtrToStringCustom(json_buffer, System.Text.Encoding.UTF8); - //Console.WriteLine(json_str); - JObject json = (JObject)JsonConvert.DeserializeObject(json_str); - ProcCallbckMsg dlg = new ProcCallbckMsg(procMsg); - Execute.OnUIThread(() => - { - dlg((AsstMsg)msg, json); - }); - } - - private readonly IWindowManager _windowManager; - private readonly IContainer _container; - private IntPtr _handle; - - private void procMsg(AsstMsg msg, JObject details) - { - switch (msg) - { - case AsstMsg.InternalError: - break; - - case AsstMsg.InitFailed: - _windowManager.ShowMessageBox("初始化错误!请检查是否使用了中文路径", "错误", icon: MessageBoxImage.Error); - Environment.Exit(0); - break; - - case AsstMsg.ConnectionError: - break; - - case AsstMsg.AllTasksCompleted: - case AsstMsg.TaskChainError: - case AsstMsg.TaskChainStart: - case AsstMsg.TaskChainCompleted: - case AsstMsg.TaskChainExtraInfo: - procTaskChainMsg(msg, details); - break; - - case AsstMsg.SubTaskError: - case AsstMsg.SubTaskStart: - case AsstMsg.SubTaskCompleted: - case AsstMsg.SubTaskExtraInfo: - procSubTaskMsg(msg, details); - break; - } - } - - private void procTaskChainMsg(AsstMsg msg, JObject details) - { - string taskChain = details["taskchain"].ToString(); - - if (taskChain == "Recruit") - { - if (msg == AsstMsg.TaskChainError) - { - var recruitModel = _container.Get(); - recruitModel.RecruitInfo = "识别错误!"; - } - } - var mainModel = _container.Get(); - - switch (msg) - { - case AsstMsg.TaskChainError: - mainModel.AddLog("任务出错:" + taskChain, "darkred"); - break; - - case AsstMsg.TaskChainStart: - mainModel.AddLog("开始任务:" + taskChain); - break; - - case AsstMsg.TaskChainCompleted: - mainModel.AddLog("完成任务:" + taskChain); - break; - - case AsstMsg.TaskChainExtraInfo: - break; - - case AsstMsg.AllTasksCompleted: - mainModel.Idle = true; - mainModel.AddLog("任务已全部完成"); - mainModel.UseStone = false; - using (var toast = new ToastNotification("任务已全部完成!")) - { - toast.Show(); - } - mainModel.CheckAndShutdown(); - break; - } - } - - private void procSubTaskMsg(AsstMsg msg, JObject details) - { - // 下面几行注释暂时没用到,先注释起来... - //string taskChain = details["taskchain"].ToString(); - //string classType = details["class"].ToString(); - - //var mainModel = _container.Get(); - switch (msg) - { - case AsstMsg.SubTaskError: - procSubTaskError(details); - break; - - case AsstMsg.SubTaskStart: - procSubTaskStart(details); - break; - - case AsstMsg.SubTaskCompleted: - procSubTaskCompleted(details); - break; - - case AsstMsg.SubTaskExtraInfo: - procSubTaskExtraInfo(details); - break; - } - } - - private void procSubTaskError(JObject details) - { - string subTask = details["subtask"].ToString(); - - var mainModel = _container.Get(); - - switch (subTask) - { - case "AutoRecruitTask": - mainModel.AddLog("公招识别错误,已返回", "darkred"); - break; - - //case "StageDropsTask": - // mainModel.AddLog("关卡识别错误", "darkred"); - // break; - - case "ReportToPenguinStats": - mainModel.AddLog("上传企鹅数据错误", "darkred"); - break; - - case "CheckStageValid": - mainModel.AddLog("EX 关卡,已停止", "darkred"); - break; - } - } - - private void procSubTaskStart(JObject details) - { - string subTask = details["subtask"].ToString(); - - var mainModel = _container.Get(); - if (subTask == "ProcessTask") - { - string taskName = details["details"]["task"].ToString(); - int execTimes = (int)details["details"]["exec_times"]; - - switch (taskName) - { - case "StartButton2": - mainModel.AddLog("已开始行动 " + execTimes + " 次", "darkcyan"); - break; - - case "MedicineConfirm": - mainModel.AddLog("已吃药 " + execTimes + " 个", "darkcyan"); - break; - - case "StoneConfirm": - mainModel.AddLog("已碎石 " + execTimes + " 颗", "darkcyan"); - break; - - case "AbandonAction": - mainModel.AddLog("代理指挥失误", "darkred"); - break; - - case "RecruitRefreshConfirm": - mainModel.AddLog("已刷新标签", "darkcyan"); - break; - - case "RecruitConfirm": - mainModel.AddLog("已确认招募", "darkcyan"); - break; - - case "InfrastDormDoubleConfirmButton": - mainModel.AddLog("干员冲突", "darkred"); - break; - - /* 肉鸽相关 */ - case "Roguelike1Start": - mainModel.AddLog("已开始探索 " + execTimes + " 次", "darkcyan"); - break; - - case "Roguelike1StageTraderInvestConfirm": - mainModel.AddLog("已投资 " + execTimes + " 个源石锭", "darkcyan"); - break; - - case "Roguelike1ExitThenAbandon": - mainModel.AddLog("已放弃本次探索"); - break; - - //case "Roguelike1StartAction": - // mainModel.AddLog("开始战斗"); - // break; - - case "Roguelike1MissionCompletedFlag": - mainModel.AddLog("战斗完成"); - break; - - case "Roguelike1MissionFailedFlag": - mainModel.AddLog("战斗失败"); - break; - - case "Roguelike1StageTraderEnter": - mainModel.AddLog("关卡:诡异行商"); - break; - - case "Roguelike1StageSafeHouseEnter": - mainModel.AddLog("关卡:安全的角落"); - break; - - case "Roguelike1StageEncounterEnter": - mainModel.AddLog("关卡:不期而遇/古堡馈赠"); - break; - - //case "Roguelike1StageBoonsEnter": - // mainModel.AddLog("古堡馈赠"); - // break; - - case "Roguelike1StageCambatDpsEnter": - mainModel.AddLog("关卡:普通作战"); - break; - - case "Roguelike1StageEmergencyDps": - mainModel.AddLog("关卡:紧急作战"); - break; - - case "Roguelike1StageDreadfulFoe": - mainModel.AddLog("关卡:险路恶敌"); - break; - - case "Roguelike1StageTraderInvestSystemFull": - mainModel.AddLog("投资达到上限", "darkcyan"); - break; - } - } - } - - private void procSubTaskCompleted(JObject details) - { - } - - private void procSubTaskExtraInfo(JObject details) - { - string taskChain = details["taskchain"].ToString(); - - if (taskChain == "Recruit") - { - procRecruitCalcMsg(details); - } - - string what = details["what"].ToString(); - var subTaskDetails = details["details"]; - - var mainModel = _container.Get(); - switch (what) - { - case "StageDrops": - { - string cur_drops = string.Empty; - JArray drops = (JArray)subTaskDetails["drops"]; - foreach (var item in drops) - { - string itemName = item["itemName"].ToString(); - int count = (int)item["quantity"]; - cur_drops += $"{itemName} : {count}\n"; - } - cur_drops = cur_drops.EndsWith("\n") ? cur_drops.TrimEnd('\n') : "无"; - mainModel.AddLog("当次掉落:\n" + cur_drops); - - string all_drops = string.Empty; - JArray statistics = (JArray)subTaskDetails["stats"]; - foreach (var item in statistics) - { - string itemName = item["itemName"].ToString(); - int count = (int)item["quantity"]; - all_drops += $"{itemName} : {count}\n"; - } - all_drops = all_drops.EndsWith("\n") ? all_drops.TrimEnd('\n') : "无"; - mainModel.AddLog("掉落统计:\n" + all_drops); - } - break; - - case "EnterFacility": - mainModel.AddLog("当前设施:" + subTaskDetails["facility"] + " " + (int)subTaskDetails["index"]); - break; - - case "RecruitTagsDetected": - { - JArray tags = (JArray)subTaskDetails["tags"]; - string log_content = string.Empty; - foreach (var tag_name in tags) - { - string tag_str = tag_name.ToString(); - log_content += tag_str + "\n"; - } - log_content = log_content.EndsWith("\n") ? log_content.TrimEnd('\n') : "错误"; - mainModel.AddLog("公招识别结果:\n" + log_content); - } - break; - - case "RecruitSpecialTag": - { - string special = subTaskDetails["tag"].ToString(); - using (var toast = new ToastNotification("公招提示")) - { - toast.AppendContentText(special).ShowRecruit(); - } - } - break; - - case "RecruitResult": - { - int level = (int)subTaskDetails["level"]; - if (level >= 5) - { - using (var toast = new ToastNotification($"公招出 {level} 星了哦!")) - { - toast.AppendContentText(new string('★', level)).ShowRecruit(row: 2); - } - mainModel.AddLog(level + " 星 Tags", "darkorange", "Bold"); - } - else - { - mainModel.AddLog(level + " 星 Tags", "darkcyan"); - } - } - break; - - case "RecruitTagsSelected": - { - JArray selected = (JArray)subTaskDetails["tags"]; - string selected_log = string.Empty; - foreach (var tag in selected) - { - selected_log += tag.ToString() + "\n"; - } - selected_log = selected_log.EndsWith("\n") ? selected_log.TrimEnd('\n') : "无"; - - mainModel.AddLog("选择 Tags:\n" + selected_log); - } - break; - - case "NotEnoughStaff": - { - mainModel.AddLog("可用干员不足", "darkred"); - } - break; - - /* Roguelike */ - case "StageInfo": - { - mainModel.AddLog("开始战斗:" + subTaskDetails["name"]); - } - break; - - case "StageInfoError": - { - mainModel.AddLog("关卡识别错误", "darkred"); - } - break; - - case "PenguinId": - { - var settings = _container.Get(); - if (settings.PenguinId == String.Empty) - { - string id = subTaskDetails["id"].ToString(); - settings.PenguinId = id; - //AsstSetPenguinId(id); - } - } - break; - } - } - - private void procRecruitCalcMsg(JObject details) - { - string what = details["what"].ToString(); - var subTaskDetails = details["details"]; - - var recruitModel = _container.Get(); - - switch (what) - { - case "RecruitTagsDetected": - { - JArray tags = (JArray)subTaskDetails["tags"]; - string info_content = "识别结果: "; - foreach (var tag_name in tags) - { - string tag_str = tag_name.ToString(); - info_content += tag_str + " "; - } - recruitModel.RecruitInfo = info_content; - } - break; - - case "RecruitSpecialTag": - { - string special = subTaskDetails["tag"].ToString(); - using (var toast = new ToastNotification("公招提示")) - { - toast.AppendContentText(special).ShowRecruit(); - } - } - break; - - case "RecruitResult": - { - string resultContent = string.Empty; - JArray result_array = (JArray)subTaskDetails["result"]; - int level = (int)subTaskDetails["level"]; - foreach (var combs in result_array) - { - int tag_level = (int)combs["level"]; - resultContent += tag_level + "星Tags: "; - foreach (var tag in (JArray)combs["tags"]) - { - resultContent += tag.ToString() + " "; - } - resultContent += "\n\t"; - foreach (var oper in (JArray)combs["opers"]) - { - resultContent += oper["level"].ToString() + " - " + oper["name"].ToString() + " "; - } - resultContent += "\n\n"; - } - recruitModel.RecruitResult = resultContent; - if (level >= 5) - { - using (var toast = new ToastNotification($"公招出 {level} 星了哦!")) - { - toast.AppendContentText(new string('★', level)).ShowRecruit(row: 2); - } - } - } - break; - } - } - - public bool AsstConnect() - { - var settings = _container.Get(); - if (settings.AdbPath == String.Empty || - settings.ConnectAddress == String.Empty) - { - return false; - } - else - { - return AsstConnect(_handle, settings.AdbPath, settings.ConnectAddress, settings.ConnectConfig); - } - } - - private bool AsstAppendTaskWithEncoding(string type, JObject task_params = null) - { - task_params = task_params ?? new JObject(); - return AsstAppendTask(_handle, type, JsonConvert.SerializeObject(task_params)) != 0; - } - - public bool AsstAppendFight(string stage, int max_medicine, int max_stone, int max_times) - { - var task_params = new JObject(); - task_params["stage"] = stage; - task_params["medicine"] = max_medicine; - task_params["stone"] = max_stone; - task_params["times"] = max_times; - task_params["report_to_penguin"] = true; - var settings = _container.Get(); - task_params["penguin_id"] = settings.PenguinId; - task_params["server"] = "CN"; - return AsstAppendTaskWithEncoding("Fight", task_params); - } - - public bool AsstAppendAward() - { - return AsstAppendTaskWithEncoding("Award"); - } - - public bool AsstAppendStartUp() - { - return AsstAppendTaskWithEncoding("StartUp"); - } - - public bool AsstAppendVisit() - { - return AsstAppendTaskWithEncoding("Visit"); - } - - public bool AsstAppendMall(bool with_shopping, string[] firstlist, string[] blacklist) - { - var task_params = new JObject(); - task_params["shopping"] = with_shopping; - task_params["buy_first"] = new JArray { firstlist }; - task_params["blacklist"] = new JArray { blacklist }; - return AsstAppendTaskWithEncoding("Mall", task_params); - } - - public bool AsstAppendRecruit(int max_times, int[] select_level, int required_len, int[] confirm_level, int confirm_len, bool need_refresh, bool use_expedited) - { - var task_params = new JObject(); - task_params["refresh"] = need_refresh; - task_params["select"] = new JArray(select_level); - task_params["confirm"] = new JArray(confirm_level); - task_params["times"] = max_times; - task_params["set_time"] = true; - task_params["expedite"] = use_expedited; - task_params["expedite_times"] = max_times; - return AsstAppendTaskWithEncoding("Recruit", task_params); - } - - public bool AsstAppendInfrast(int work_mode, string[] order, int order_len, string uses_of_drones, double dorm_threshold) - { - var task_params = new JObject(); - //task_params["mode"] = 0; - task_params["facility"] = new JArray(order); - task_params["drones"] = uses_of_drones; - task_params["threshold"] = dorm_threshold; - task_params["replenish"] = true; - return AsstAppendTaskWithEncoding("Infrast", task_params); - } - - public bool AsstAppendRoguelike(int mode) - { - var task_params = new JObject(); - task_params["mode"] = mode; - task_params["opers"] = new JArray { - new JObject { { "name", "山" }, { "skill", 2 }, { "skill_usage", 2 } }, - new JObject { { "name", "棘刺" }, { "skill", 3 }, { "skill_usage", 1 } }, - new JObject { { "name", "芙蓉" }, { "skill", 1 }, { "skill_usage", 1 } }, - new JObject { { "name", "梓兰" }, { "skill", 1 }, { "skill_usage", 1 } }, - }; - return AsstAppendTaskWithEncoding("Roguelike", task_params); - } - - public bool AsstStartRecruitCalc(int[] select_level, int required_len, bool set_time) - { - var task_params = new JObject(); - task_params["refresh"] = false; - task_params["select"] = new JArray(select_level); - task_params["confirm"] = new JArray(); - task_params["times"] = 0; - task_params["set_time"] = true; - task_params["expedite"] = false; - task_params["expedite_times"] = 0; - return AsstAppendTaskWithEncoding("Recruit", task_params); - } - - public bool AsstStart() - { - return AsstStart(_handle); - } - - public bool AsstStop() - { - return AsstStop(_handle); - } - } - - public enum AsstMsg - { - /* Global Info */ - InternalError = 0, // 内部错误 - InitFailed, // 初始化失败 - ConnectionError, // 连接相关错误 - AllTasksCompleted, // 全部任务完成 - /* TaskChain Info */ - TaskChainError = 10000, // 任务链执行/识别错误 - TaskChainStart, // 任务链开始 - TaskChainCompleted, // 任务链完成 - TaskChainExtraInfo, // 任务链额外信息 - /* SubTask Info */ - SubTaskError = 20000, // 原子任务执行/识别错误 - SubTaskStart, // 原子任务开始 - SubTaskCompleted, // 原子任务完成 - SubTaskExtraInfo // 原子任务额外信息 - }; -} +// MeoAsstGui - A part of the MeoAssistantArknights project +// Copyright (C) 2021 MistEO and Contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY + +using System; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Stylet; +using StyletIoC; + +namespace MeoAsstGui +{ + using AsstHandle = IntPtr; + using TaskId = Int32; + + public class AsstProxy + { + private delegate void CallbackDelegate(int msg, IntPtr json_buffer, IntPtr custom_arg); + + private delegate void ProcCallbckMsg(AsstMsg msg, JObject details); + + [DllImport("MeoAssistant.dll")] private static extern bool AsstLoadResource(byte[] dirname); + + private static bool AsstLoadResource(string dirname) + { + return AsstLoadResource(Encoding.UTF8.GetBytes(dirname)); + } + + [DllImport("MeoAssistant.dll")] private static extern AsstHandle AsstCreate(); + + [DllImport("MeoAssistant.dll")] private static extern AsstHandle AsstCreateEx(CallbackDelegate callback, IntPtr custom_arg); + + [DllImport("MeoAssistant.dll")] private static extern void AsstDestroy(AsstHandle handle); + + [DllImport("MeoAssistant.dll")] private static extern bool AsstConnect(AsstHandle handle, byte[] adb_path, byte[] address, byte[] config); + + private static bool AsstConnect(AsstHandle handle, string adb_path, string address, string config) + { + return AsstConnect(handle, Encoding.UTF8.GetBytes(adb_path), Encoding.UTF8.GetBytes(address), Encoding.UTF8.GetBytes(config)); + } + + [DllImport("MeoAssistant.dll")] private static extern TaskId AsstAppendTask(AsstHandle handle, byte[] type, byte[] task_params); + + private static TaskId AsstAppendTask(AsstHandle handle, string type, string task_params) + { + return AsstAppendTask(handle, Encoding.UTF8.GetBytes(type), Encoding.UTF8.GetBytes(task_params)); + } + + [DllImport("MeoAssistant.dll")] private static extern bool AsstSetTaskParams(AsstHandle handle, TaskId id, byte[] task_params); + + [DllImport("MeoAssistant.dll")] private static extern bool AsstStart(AsstHandle handle); + + [DllImport("MeoAssistant.dll")] private static extern bool AsstStop(AsstHandle handle); + + [DllImport("MeoAssistant.dll")] private static extern void AsstLog(byte[] level, byte[] message); + + private readonly CallbackDelegate _callback; + + public AsstProxy(IContainer container, IWindowManager windowManager) + { + _container = container; + _windowManager = windowManager; + _callback = CallbackFunction; + } + + public void Init() + { + bool loaded = AsstLoadResource(System.IO.Directory.GetCurrentDirectory()); + _handle = AsstCreateEx(_callback, IntPtr.Zero); + + if (loaded == false || _handle == IntPtr.Zero) + { + Execute.OnUIThread(() => + { + _windowManager.ShowMessageBox("出现未知异常", "错误", icon: MessageBoxImage.Error); + Environment.Exit(0); + }); + } + var tvm = _container.Get(); + tvm.Idle = true; + } + + [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)] + internal static extern int lstrlenA(IntPtr ptr); + + private static string PtrToStringCustom(IntPtr ptr, System.Text.Encoding enc) + { + if (IntPtr.Zero == ptr) + { + return null; + } + if (lstrlenA(ptr) == 0) + { + return string.Empty; + } + int len = lstrlenA(ptr); + Byte[] bytes = new Byte[len + 1]; + Marshal.Copy(ptr, bytes, 0, len + 1); + return enc.GetString(bytes); + } + + private void CallbackFunction(int msg, IntPtr json_buffer, IntPtr custom_arg) + { + string json_str = PtrToStringCustom(json_buffer, System.Text.Encoding.UTF8); + //Console.WriteLine(json_str); + JObject json = (JObject)JsonConvert.DeserializeObject(json_str); + ProcCallbckMsg dlg = new ProcCallbckMsg(procMsg); + Execute.OnUIThread(() => + { + dlg((AsstMsg)msg, json); + }); + } + + private readonly IWindowManager _windowManager; + private readonly IContainer _container; + private IntPtr _handle; + + private void procMsg(AsstMsg msg, JObject details) + { + switch (msg) + { + case AsstMsg.InternalError: + break; + + case AsstMsg.InitFailed: + _windowManager.ShowMessageBox("初始化错误!请检查是否使用了中文路径", "错误", icon: MessageBoxImage.Error); + Environment.Exit(0); + break; + + case AsstMsg.ConnectionError: + break; + + case AsstMsg.AllTasksCompleted: + case AsstMsg.TaskChainError: + case AsstMsg.TaskChainStart: + case AsstMsg.TaskChainCompleted: + case AsstMsg.TaskChainExtraInfo: + procTaskChainMsg(msg, details); + break; + + case AsstMsg.SubTaskError: + case AsstMsg.SubTaskStart: + case AsstMsg.SubTaskCompleted: + case AsstMsg.SubTaskExtraInfo: + procSubTaskMsg(msg, details); + break; + } + } + + private void procTaskChainMsg(AsstMsg msg, JObject details) + { + string taskChain = details["taskchain"].ToString(); + + if (taskChain == "Recruit") + { + if (msg == AsstMsg.TaskChainError) + { + var recruitModel = _container.Get(); + recruitModel.RecruitInfo = "识别错误!"; + } + } + var mainModel = _container.Get(); + + switch (msg) + { + case AsstMsg.TaskChainError: + mainModel.AddLog("任务出错:" + taskChain, "darkred"); + break; + + case AsstMsg.TaskChainStart: + mainModel.AddLog("开始任务:" + taskChain); + break; + + case AsstMsg.TaskChainCompleted: + mainModel.AddLog("完成任务:" + taskChain); + break; + + case AsstMsg.TaskChainExtraInfo: + break; + + case AsstMsg.AllTasksCompleted: + mainModel.Idle = true; + mainModel.AddLog("任务已全部完成"); + mainModel.UseStone = false; + using (var toast = new ToastNotification("任务已全部完成!")) + { + toast.Show(); + } + mainModel.CheckAndShutdown(); + break; + } + } + + private void procSubTaskMsg(AsstMsg msg, JObject details) + { + // 下面几行注释暂时没用到,先注释起来... + //string taskChain = details["taskchain"].ToString(); + //string classType = details["class"].ToString(); + + //var mainModel = _container.Get(); + switch (msg) + { + case AsstMsg.SubTaskError: + procSubTaskError(details); + break; + + case AsstMsg.SubTaskStart: + procSubTaskStart(details); + break; + + case AsstMsg.SubTaskCompleted: + procSubTaskCompleted(details); + break; + + case AsstMsg.SubTaskExtraInfo: + procSubTaskExtraInfo(details); + break; + } + } + + private void procSubTaskError(JObject details) + { + string subTask = details["subtask"].ToString(); + + var mainModel = _container.Get(); + + switch (subTask) + { + case "AutoRecruitTask": + mainModel.AddLog("公招识别错误,已返回", "darkred"); + break; + + //case "StageDropsTask": + // mainModel.AddLog("关卡识别错误", "darkred"); + // break; + + case "ReportToPenguinStats": + mainModel.AddLog("上传企鹅数据错误", "darkred"); + break; + + case "CheckStageValid": + mainModel.AddLog("EX 关卡,已停止", "darkred"); + break; + } + } + + private void procSubTaskStart(JObject details) + { + string subTask = details["subtask"].ToString(); + + var mainModel = _container.Get(); + if (subTask == "ProcessTask") + { + string taskName = details["details"]["task"].ToString(); + int execTimes = (int)details["details"]["exec_times"]; + + switch (taskName) + { + case "StartButton2": + mainModel.AddLog("已开始行动 " + execTimes + " 次", "darkcyan"); + break; + + case "MedicineConfirm": + mainModel.AddLog("已吃药 " + execTimes + " 个", "darkcyan"); + break; + + case "StoneConfirm": + mainModel.AddLog("已碎石 " + execTimes + " 颗", "darkcyan"); + break; + + case "AbandonAction": + mainModel.AddLog("代理指挥失误", "darkred"); + break; + + case "RecruitRefreshConfirm": + mainModel.AddLog("已刷新标签", "darkcyan"); + break; + + case "RecruitConfirm": + mainModel.AddLog("已确认招募", "darkcyan"); + break; + + case "InfrastDormDoubleConfirmButton": + mainModel.AddLog("干员冲突", "darkred"); + break; + + /* 肉鸽相关 */ + case "Roguelike1Start": + mainModel.AddLog("已开始探索 " + execTimes + " 次", "darkcyan"); + break; + + case "Roguelike1StageTraderInvestConfirm": + mainModel.AddLog("已投资 " + execTimes + " 个源石锭", "darkcyan"); + break; + + case "Roguelike1ExitThenAbandon": + mainModel.AddLog("已放弃本次探索"); + break; + + //case "Roguelike1StartAction": + // mainModel.AddLog("开始战斗"); + // break; + + case "Roguelike1MissionCompletedFlag": + mainModel.AddLog("战斗完成"); + break; + + case "Roguelike1MissionFailedFlag": + mainModel.AddLog("战斗失败"); + break; + + case "Roguelike1StageTraderEnter": + mainModel.AddLog("关卡:诡异行商"); + break; + + case "Roguelike1StageSafeHouseEnter": + mainModel.AddLog("关卡:安全的角落"); + break; + + case "Roguelike1StageEncounterEnter": + mainModel.AddLog("关卡:不期而遇/古堡馈赠"); + break; + + //case "Roguelike1StageBoonsEnter": + // mainModel.AddLog("古堡馈赠"); + // break; + + case "Roguelike1StageCambatDpsEnter": + mainModel.AddLog("关卡:普通作战"); + break; + + case "Roguelike1StageEmergencyDps": + mainModel.AddLog("关卡:紧急作战"); + break; + + case "Roguelike1StageDreadfulFoe": + mainModel.AddLog("关卡:险路恶敌"); + break; + + case "Roguelike1StageTraderInvestSystemFull": + mainModel.AddLog("投资达到上限", "darkcyan"); + break; + } + } + } + + private void procSubTaskCompleted(JObject details) + { + } + + private void procSubTaskExtraInfo(JObject details) + { + string taskChain = details["taskchain"].ToString(); + + if (taskChain == "Recruit") + { + procRecruitCalcMsg(details); + } + + string what = details["what"].ToString(); + var subTaskDetails = details["details"]; + + var mainModel = _container.Get(); + switch (what) + { + case "StageDrops": + { + string cur_drops = string.Empty; + JArray drops = (JArray)subTaskDetails["drops"]; + foreach (var item in drops) + { + string itemName = item["itemName"].ToString(); + int count = (int)item["quantity"]; + cur_drops += $"{itemName} : {count}\n"; + } + cur_drops = cur_drops.EndsWith("\n") ? cur_drops.TrimEnd('\n') : "无"; + mainModel.AddLog("当次掉落:\n" + cur_drops); + + string all_drops = string.Empty; + JArray statistics = (JArray)subTaskDetails["stats"]; + foreach (var item in statistics) + { + string itemName = item["itemName"].ToString(); + int count = (int)item["quantity"]; + all_drops += $"{itemName} : {count}\n"; + } + all_drops = all_drops.EndsWith("\n") ? all_drops.TrimEnd('\n') : "无"; + mainModel.AddLog("掉落统计:\n" + all_drops); + } + break; + + case "EnterFacility": + mainModel.AddLog("当前设施:" + subTaskDetails["facility"] + " " + (int)subTaskDetails["index"]); + break; + + case "RecruitTagsDetected": + { + JArray tags = (JArray)subTaskDetails["tags"]; + string log_content = string.Empty; + foreach (var tag_name in tags) + { + string tag_str = tag_name.ToString(); + log_content += tag_str + "\n"; + } + log_content = log_content.EndsWith("\n") ? log_content.TrimEnd('\n') : "错误"; + mainModel.AddLog("公招识别结果:\n" + log_content); + } + break; + + case "RecruitSpecialTag": + { + string special = subTaskDetails["tag"].ToString(); + using (var toast = new ToastNotification("公招提示")) + { + toast.AppendContentText(special).ShowRecruit(); + } + } + break; + + case "RecruitResult": + { + int level = (int)subTaskDetails["level"]; + if (level >= 5) + { + using (var toast = new ToastNotification($"公招出 {level} 星了哦!")) + { + toast.AppendContentText(new string('★', level)).ShowRecruit(row: 2); + } + mainModel.AddLog(level + " 星 Tags", "darkorange", "Bold"); + } + else + { + mainModel.AddLog(level + " 星 Tags", "darkcyan"); + } + } + break; + + case "RecruitTagsSelected": + { + JArray selected = (JArray)subTaskDetails["tags"]; + string selected_log = string.Empty; + foreach (var tag in selected) + { + selected_log += tag.ToString() + "\n"; + } + selected_log = selected_log.EndsWith("\n") ? selected_log.TrimEnd('\n') : "无"; + + mainModel.AddLog("选择 Tags:\n" + selected_log); + } + break; + + case "NotEnoughStaff": + { + mainModel.AddLog("可用干员不足", "darkred"); + } + break; + + /* Roguelike */ + case "StageInfo": + { + mainModel.AddLog("开始战斗:" + subTaskDetails["name"]); + } + break; + + case "StageInfoError": + { + mainModel.AddLog("关卡识别错误", "darkred"); + } + break; + + case "PenguinId": + { + var settings = _container.Get(); + if (settings.PenguinId == String.Empty) + { + string id = subTaskDetails["id"].ToString(); + settings.PenguinId = id; + //AsstSetPenguinId(id); + } + } + break; + } + } + + private void procRecruitCalcMsg(JObject details) + { + string what = details["what"].ToString(); + var subTaskDetails = details["details"]; + + var recruitModel = _container.Get(); + + switch (what) + { + case "RecruitTagsDetected": + { + JArray tags = (JArray)subTaskDetails["tags"]; + string info_content = "识别结果: "; + foreach (var tag_name in tags) + { + string tag_str = tag_name.ToString(); + info_content += tag_str + " "; + } + recruitModel.RecruitInfo = info_content; + } + break; + + case "RecruitSpecialTag": + { + string special = subTaskDetails["tag"].ToString(); + using (var toast = new ToastNotification("公招提示")) + { + toast.AppendContentText(special).ShowRecruit(); + } + } + break; + + case "RecruitResult": + { + string resultContent = string.Empty; + JArray result_array = (JArray)subTaskDetails["result"]; + int level = (int)subTaskDetails["level"]; + foreach (var combs in result_array) + { + int tag_level = (int)combs["level"]; + resultContent += tag_level + "星Tags: "; + foreach (var tag in (JArray)combs["tags"]) + { + resultContent += tag.ToString() + " "; + } + resultContent += "\n\t"; + foreach (var oper in (JArray)combs["opers"]) + { + resultContent += oper["level"].ToString() + " - " + oper["name"].ToString() + " "; + } + resultContent += "\n\n"; + } + recruitModel.RecruitResult = resultContent; + if (level >= 5) + { + using (var toast = new ToastNotification($"公招出 {level} 星了哦!")) + { + toast.AppendContentText(new string('★', level)).ShowRecruit(row: 2); + } + } + } + break; + } + } + + public bool AsstConnect() + { + var settings = _container.Get(); + if (settings.AdbPath == String.Empty || + settings.ConnectAddress == String.Empty) + { + return false; + } + else + { + return AsstConnect(_handle, settings.AdbPath, settings.ConnectAddress, settings.ConnectConfig); + } + } + + private bool AsstAppendTaskWithEncoding(string type, JObject task_params = null) + { + task_params = task_params ?? new JObject(); + return AsstAppendTask(_handle, type, JsonConvert.SerializeObject(task_params)) != 0; + } + + public bool AsstAppendFight(string stage, int max_medicine, int max_stone, int max_times) + { + var task_params = new JObject(); + task_params["stage"] = stage; + task_params["medicine"] = max_medicine; + task_params["stone"] = max_stone; + task_params["times"] = max_times; + task_params["report_to_penguin"] = true; + var settings = _container.Get(); + task_params["penguin_id"] = settings.PenguinId; + task_params["server"] = "CN"; + return AsstAppendTaskWithEncoding("Fight", task_params); + } + + public bool AsstAppendAward() + { + return AsstAppendTaskWithEncoding("Award"); + } + + public bool AsstAppendStartUp() + { + return AsstAppendTaskWithEncoding("StartUp"); + } + + public bool AsstAppendVisit() + { + return AsstAppendTaskWithEncoding("Visit"); + } + + public bool AsstAppendMall(bool with_shopping, string[] firstlist, string[] blacklist) + { + var task_params = new JObject(); + task_params["shopping"] = with_shopping; + task_params["buy_first"] = new JArray { firstlist }; + task_params["blacklist"] = new JArray { blacklist }; + return AsstAppendTaskWithEncoding("Mall", task_params); + } + + public bool AsstAppendRecruit(int max_times, int[] select_level, int required_len, int[] confirm_level, int confirm_len, bool need_refresh, bool use_expedited) + { + var task_params = new JObject(); + task_params["refresh"] = need_refresh; + task_params["select"] = new JArray(select_level); + task_params["confirm"] = new JArray(confirm_level); + task_params["times"] = max_times; + task_params["set_time"] = true; + task_params["expedite"] = use_expedited; + task_params["expedite_times"] = max_times; + return AsstAppendTaskWithEncoding("Recruit", task_params); + } + + public bool AsstAppendInfrast(int work_mode, string[] order, int order_len, string uses_of_drones, double dorm_threshold) + { + var task_params = new JObject(); + //task_params["mode"] = 0; + task_params["facility"] = new JArray(order); + task_params["drones"] = uses_of_drones; + task_params["threshold"] = dorm_threshold; + task_params["replenish"] = true; + return AsstAppendTaskWithEncoding("Infrast", task_params); + } + + public bool AsstAppendRoguelike(int mode) + { + var task_params = new JObject(); + task_params["mode"] = mode; + task_params["opers"] = new JArray { + new JObject { { "name", "山" }, { "skill", 2 }, { "skill_usage", 2 } }, + new JObject { { "name", "棘刺" }, { "skill", 3 }, { "skill_usage", 1 } }, + new JObject { { "name", "芙蓉" }, { "skill", 1 }, { "skill_usage", 1 } }, + new JObject { { "name", "梓兰" }, { "skill", 1 }, { "skill_usage", 1 } }, + }; + return AsstAppendTaskWithEncoding("Roguelike", task_params); + } + + public bool AsstStartRecruitCalc(int[] select_level, int required_len, bool set_time) + { + var task_params = new JObject(); + task_params["refresh"] = false; + task_params["select"] = new JArray(select_level); + task_params["confirm"] = new JArray(); + task_params["times"] = 0; + task_params["set_time"] = true; + task_params["expedite"] = false; + task_params["expedite_times"] = 0; + return AsstAppendTaskWithEncoding("Recruit", task_params); + } + + public bool AsstStart() + { + return AsstStart(_handle); + } + + public bool AsstStop() + { + return AsstStop(_handle); + } + } + + public enum AsstMsg + { + /* Global Info */ + InternalError = 0, // 内部错误 + InitFailed, // 初始化失败 + ConnectionError, // 连接相关错误 + AllTasksCompleted, // 全部任务完成 + /* TaskChain Info */ + TaskChainError = 10000, // 任务链执行/识别错误 + TaskChainStart, // 任务链开始 + TaskChainCompleted, // 任务链完成 + TaskChainExtraInfo, // 任务链额外信息 + /* SubTask Info */ + SubTaskError = 20000, // 原子任务执行/识别错误 + SubTaskStart, // 原子任务开始 + SubTaskCompleted, // 原子任务完成 + SubTaskExtraInfo // 原子任务额外信息 + }; +} diff --git a/src/MeoAsstGui/Helper/ScrollViewerBinding.cs b/src/MeoAsstGui/Helper/ScrollViewerBinding.cs index fe2913ed6b..ef67fdf86e 100644 --- a/src/MeoAsstGui/Helper/ScrollViewerBinding.cs +++ b/src/MeoAsstGui/Helper/ScrollViewerBinding.cs @@ -224,7 +224,6 @@ namespace MeoAsstGui private static void BindRectangleVerticalOffsetList(ScrollViewer scrollViewer) { - if (scrollViewer.GetValue(RectangleVerticalOffsetListBindingProperty) != null) return; @@ -257,6 +256,5 @@ namespace MeoAsstGui } #endregion RectangleVerticalOffsetList attached property - } } diff --git a/src/MeoAsstGui/Helper/ToastNotification.cs b/src/MeoAsstGui/Helper/ToastNotification.cs index 86a4a8d80c..944bdf7964 100644 --- a/src/MeoAsstGui/Helper/ToastNotification.cs +++ b/src/MeoAsstGui/Helper/ToastNotification.cs @@ -88,7 +88,7 @@ namespace MeoAsstGui // 最大显示宽度 NotificationConstants.MaxWidth = 460d; - #endregion + #endregion 初始化 Notification.Wpf 默认静态配置 } /// @@ -130,7 +130,7 @@ namespace MeoAsstGui None } - #endregion + #endregion 通知提示音列表枚举 /// /// 播放通知提示音 @@ -180,19 +180,23 @@ namespace MeoAsstGui } } - #endregion + #endregion 通知提示音 #region 通知按钮设置 #region 通知按钮变量 + // 左边按钮 protected string _buttonLeftText = null; + protected Action _buttonLeftAction = null; // 右边按钮 protected string _buttonRightText = null; + protected Action _buttonRightAction = null; - #endregion + + #endregion 通知按钮变量 /// /// 给通知添加一个在左边的按钮,比如确定按钮,多次设置只会按最后一次设置生效 @@ -220,7 +224,7 @@ namespace MeoAsstGui return this; } - #endregion + #endregion 通知按钮设置 #region 通知显示 @@ -279,7 +283,7 @@ namespace MeoAsstGui return content; } - #endregion + #endregion 通知基本字体样式和内容模板 #region 显示通知方法 @@ -373,9 +377,9 @@ namespace MeoAsstGui notificationContent: content); } - #endregion + #endregion 显示通知方法 - #endregion + #endregion 通知显示 #region 任务栏闪烁 @@ -457,7 +461,7 @@ namespace MeoAsstGui return FlashWindowEx(ref fInfo); } - #endregion + #endregion 任务栏闪烁 /// /// 通知使用完后释放已使用的数据 @@ -472,6 +476,5 @@ namespace MeoAsstGui _buttonLeftText = _buttonRightText = null; _buttonLeftAction = _buttonRightAction = null; } - } } diff --git a/src/MeoAsstGui/Helper/ViewStatusStorage.cs b/src/MeoAsstGui/Helper/ViewStatusStorage.cs index eb7ae2a96c..37afa53517 100644 --- a/src/MeoAsstGui/Helper/ViewStatusStorage.cs +++ b/src/MeoAsstGui/Helper/ViewStatusStorage.cs @@ -1,84 +1,84 @@ -// MeoAsstGui - A part of the MeoAssistantArknights project -// Copyright (C) 2021 MistEO and Contributors -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY - -using System; -using System.IO; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace MeoAsstGui -{ - // 界面设置存储(读写json文件) - public class ViewStatusStorage - { - private static readonly string _configFilename = System.Environment.CurrentDirectory + "\\gui.json"; - private static JObject _viewStatus = new JObject(); - - public static string Get(string key, string defalut_value) - { - if (_viewStatus.ContainsKey(key)) - { - return _viewStatus[key].ToString(); - } - else - { - return defalut_value; - } - } - - public static void Set(string key, string value) - { - _viewStatus[key] = value; - Save(); - } - - public static bool Load() - { - if (File.Exists(_configFilename)) - { - try - { - string jsonStr = File.ReadAllText(_configFilename); - - // 文件存在但为空,会读出来一个null,感觉c#这库有bug,如果是null 就赋值一个空JObject - _viewStatus = (JObject)JsonConvert.DeserializeObject(jsonStr) ?? new JObject(); - } - catch (Exception) - { - _viewStatus = new JObject(); - return false; - } - } - else - { - _viewStatus = new JObject(); - return false; - } - return true; - } - - public static bool Save() - { - try - { - using (StreamWriter sw = new StreamWriter(_configFilename)) - { - sw.Write(_viewStatus.ToString()); - } - } - catch (Exception) - { - return false; - } - return true; - } - } -} +// MeoAsstGui - A part of the MeoAssistantArknights project +// Copyright (C) 2021 MistEO and Contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY + +using System; +using System.IO; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace MeoAsstGui +{ + // 界面设置存储(读写json文件) + public class ViewStatusStorage + { + private static readonly string _configFilename = System.Environment.CurrentDirectory + "\\gui.json"; + private static JObject _viewStatus = new JObject(); + + public static string Get(string key, string defalut_value) + { + if (_viewStatus.ContainsKey(key)) + { + return _viewStatus[key].ToString(); + } + else + { + return defalut_value; + } + } + + public static void Set(string key, string value) + { + _viewStatus[key] = value; + Save(); + } + + public static bool Load() + { + if (File.Exists(_configFilename)) + { + try + { + string jsonStr = File.ReadAllText(_configFilename); + + // 文件存在但为空,会读出来一个null,感觉c#这库有bug,如果是null 就赋值一个空JObject + _viewStatus = (JObject)JsonConvert.DeserializeObject(jsonStr) ?? new JObject(); + } + catch (Exception) + { + _viewStatus = new JObject(); + return false; + } + } + else + { + _viewStatus = new JObject(); + return false; + } + return true; + } + + public static bool Save() + { + try + { + using (StreamWriter sw = new StreamWriter(_configFilename)) + { + sw.Write(_viewStatus.ToString()); + } + } + catch (Exception) + { + return false; + } + return true; + } + } +} diff --git a/src/MeoAsstGui/UserControl/ToastSettingsUserControl.xaml b/src/MeoAsstGui/UserControl/ToastSettingsUserControl.xaml index b4bff8d5cc..d01a5d5c0b 100644 --- a/src/MeoAsstGui/UserControl/ToastSettingsUserControl.xaml +++ b/src/MeoAsstGui/UserControl/ToastSettingsUserControl.xaml @@ -86,7 +86,6 @@ VerticalAlignment="Bottom" Content="↘ 右下" IsChecked="{Binding ToastPositionBottomRight}" /> -