// // 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.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Stylet; using StyletIoC; namespace MeoAsstGui { public class TaskQueueViewModel : Screen { private readonly IWindowManager _windowManager; private readonly IContainer _container; public ObservableCollection TaskItemViewModels { get; set; } public ObservableCollection LogItemViewModels { get; set; } private string _actionAfterComplated = ViewStatusStorage.Get("MainFunction.ActionAfterComplated", ActionType.DoNothing.ToString()); public List> ActionAfterCompletedList { get; set; } public ActionType ActionAfterCompleted { get { if (Enum.TryParse(_actionAfterComplated, out ActionType action)) { return action; } return ActionType.DoNothing; } set { SetAndNotify(ref _actionAfterComplated, value.ToString()); string storeValue = ActionType.DoNothing.ToString(); if (value != ActionType.Shutdown && value != ActionType.Hibernate) { storeValue = value.ToString(); } ViewStatusStorage.Set("MainFunction.ActionAfterComplated", storeValue); } } public TaskQueueViewModel(IContainer container, IWindowManager windowManager) { _container = container; _windowManager = windowManager; DisplayName = Localization.GetString("Farming"); LogItemViewModels = new ObservableCollection(); InitializeItems(); InitTimer(); var trayIcon = _container.Get(); trayIcon.SetTaskQueueViewModel(this); } // public void ShowButton() // { // Visible = Visibility.Visible; // Hibernate = true; // } // private Visibility _visible = Visibility.Collapsed; // public Visibility Visible // { // get { return _visible; } // set // { // SetAndNotify(ref _visible, value); // } // } private readonly System.Windows.Forms.Timer _timer = new System.Windows.Forms.Timer(); private void InitTimer() { _timer.Enabled = true; _timer.Interval = 1000 * 50; _timer.Tick += Timer1_Elapsed; _timer.Start(); } private void Timer1_Elapsed(object sender, EventArgs e) { if (CheckAndUpdateDayOfWeek()) { UpdateDatePrompt(); UpdateStageList(); } int intMinute = DateTime.Now.Minute; if (intMinute != 0 || Idle == false) { return; } int intHour = DateTime.Now.Hour; var settings = _container.Get(); if ((settings.Timer1 && settings.Timer1Hour == intHour) || (settings.Timer2 && settings.Timer2Hour == intHour) || (settings.Timer3 && settings.Timer3Hour == intHour) || (settings.Timer4 && settings.Timer4Hour == intHour) || (settings.Timer5 && settings.Timer5Hour == intHour) || (settings.Timer6 && settings.Timer6Hour == intHour) || (settings.Timer7 && settings.Timer7Hour == intHour) || (settings.Timer8 && settings.Timer8Hour == intHour)) { LinkStart(); } } public void InitializeItems() { string[] task_list = new string[] { Localization.GetString("WakeUp"), Localization.GetString("Recruiting"), Localization.GetString("Base"), Localization.GetString("Combat"), Localization.GetString("Visiting"), Localization.GetString("Mall"), Localization.GetString("Mission"), Localization.GetString("AutoRoguelike"), }; ActionAfterCompletedList = new List> { new GenericCombData { Display = Localization.GetString("DoNothing"), Value = ActionType.DoNothing }, new GenericCombData { Display = Localization.GetString("ExitArknights"), Value = ActionType.StopGame }, new GenericCombData { Display = Localization.GetString("ExitMAA"), Value = ActionType.ExitSelf }, new GenericCombData { Display = Localization.GetString("CloseEmulator"), Value = ActionType.ExitEmulator }, new GenericCombData { Display = Localization.GetString("ExitMAAAndCloseEmulator"), Value = ActionType.ExitEmulatorAndSelf }, // new GenericCombData{ Display="待机",Value=ActionTypeAfterCompleted.Suspend }, new GenericCombData { Display = Localization.GetString("Hibernate"), Value = ActionType.Hibernate }, new GenericCombData { Display = Localization.GetString("Shutdown"), Value = ActionType.Shutdown }, }; var temp_order_list = new List(new DragItemViewModel[task_list.Length]); var non_order_list = new List(); for (int i = 0; i != task_list.Length; ++i) { var task = task_list[i]; int order; bool parsed = int.TryParse(ViewStatusStorage.Get("TaskQueue.Order." + task, "-1"), out order); var vm = new DragItemViewModel(task, "TaskQueue."); if (task == Localization.GetString("AutoRoguelike")) { vm.IsChecked = false; } if (!parsed || order < 0) { non_order_list.Add(vm); } else { temp_order_list[order] = vm; } } foreach (var new_vm in non_order_list) { int i = 0; while (temp_order_list[i] != null) { ++i; } temp_order_list[i] = new_vm; } TaskItemViewModels = new ObservableCollection(temp_order_list); AllStageList = new List { new CombData { Display = Localization.GetString("DefaultStage"), Value = string.Empty }, // new CombData { Display = Localization.GetString("CurrentStage"), Value = string.Empty }, // new CombData { Display = Localization.GetString("LastBattle"), Value = "LastBattle" }, // SideStory「多索雷斯假日」复刻活动关卡 new CombData { Display = "DH-9", Value = "DH-9" }, new CombData { Display = "1-7", Value = "1-7" }, new CombData { Display = Localization.GetString("CE-6"), Value = "CE-6" }, new CombData { Display = Localization.GetString("AP-5"), Value = "AP-5" }, new CombData { Display = Localization.GetString("CA-5"), Value = "CA-5" }, new CombData { Display = Localization.GetString("LS-6"), Value = "LS-6" }, new CombData { Display = Localization.GetString("PR-A-1"), Value = "PR-A-1" }, new CombData { Display = Localization.GetString("PR-A-2"), Value = "PR-A-2" }, new CombData { Display = Localization.GetString("PR-B-1"), Value = "PR-B-1" }, new CombData { Display = Localization.GetString("PR-B-2"), Value = "PR-B-2" }, new CombData { Display = Localization.GetString("PR-C-1"), Value = "PR-C-1" }, new CombData { Display = Localization.GetString("PR-C-2"), Value = "PR-C-2" }, new CombData { Display = Localization.GetString("PR-D-1"), Value = "PR-D-1" }, new CombData { Display = Localization.GetString("PR-D-2"), Value = "PR-D-2" }, // SideStory「绿野幻梦」活动 // new CombData { Display = "DV-6", Value = "DV-6" }, // new CombData { Display = "DV-7", Value = "DV-7" }, // new CombData { Display = "DV-8", Value = "DV-8" }, // SideStory「尘影余音」活动 // new CombData { Display = "LE-7", Value = "LE-7" }, // new CombData { Display = "LE-6", Value = "LE-6" }, // new CombData { Display = "LE-5", Value = "LE-5" }, // SideStory「愚人号」活动关卡 // new CombData { Display = "SN-8", Value = "SN-8" }, // new CombData { Display = "SN-9", Value = "SN-9" }, // new CombData { Display = "SN-10", Value = "SN-10" }, // SideStory「风雪过境」活动关卡 // new CombData { Display = "BI-7", Value = "BI-7" }, // new CombData { Display = "BI-8", Value = "BI-8" } }; _stageAvailableInfo = new Dictionary, string>> { { "CE-6", new Tuple, string>(new List { DayOfWeek.Tuesday, DayOfWeek.Thursday, DayOfWeek.Saturday, DayOfWeek.Sunday }, Localization.GetString("CETip")) }, { "AP-5", new Tuple, string>(new List { DayOfWeek.Monday, DayOfWeek.Thursday, DayOfWeek.Saturday, DayOfWeek.Sunday }, Localization.GetString("APTip")) }, { "CA-5", new Tuple, string>(new List { DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Friday, DayOfWeek.Sunday }, Localization.GetString("CATip")) }, { "LS-6", new Tuple, string>(new List { DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Saturday, DayOfWeek.Sunday }, Localization.GetString("LSTip")) }, // 碳本没做导航 { "SK-5", new Tuple, string>(new List { DayOfWeek.Monday, DayOfWeek.Wednesday, DayOfWeek.Friday, DayOfWeek.Saturday }, Localization.GetString("SKTip")) }, { "PR-A-1", new Tuple, string>(new List { DayOfWeek.Monday, DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Sunday }, Localization.GetString("PR-ATip")) }, { "PR-A-2", new Tuple, string>(new List { DayOfWeek.Monday, DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Sunday }, string.Empty) }, { "PR-B-1", new Tuple, string>(new List { DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Friday, DayOfWeek.Saturday }, Localization.GetString("PR-BTip")) }, { "PR-B-2", new Tuple, string>(new List { DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Friday, DayOfWeek.Saturday }, string.Empty) }, { "PR-C-1", new Tuple, string>(new List { DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Saturday, DayOfWeek.Sunday }, Localization.GetString("PR-CTip")) }, { "PR-C-2", new Tuple, string>(new List { DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Saturday, DayOfWeek.Sunday }, string.Empty) }, { "PR-D-1", new Tuple, string>(new List { DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Saturday, DayOfWeek.Sunday }, Localization.GetString("PR-DTip")) }, { "PR-D-2", new Tuple, string>(new List { DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Saturday, DayOfWeek.Sunday }, string.Empty) }, // 下面的不支持导航 { "Pormpt1", new Tuple, string>(new List { DayOfWeek.Monday }, Localization.GetString("Pormpt1")) }, { "Pormpt2", new Tuple, string>(new List { DayOfWeek.Sunday }, Localization.GetString("Pormpt2")) }, }; InitDrops(); CheckAndUpdateDayOfWeek(); UpdateDatePrompt(); UpdateStageList(); } private Dictionary, string>> _stageAvailableInfo; private DayOfWeek _curDayOfWeek; public void UpdateStageList() { ObservableCollection newList; var settingsModel = _container.Get(); if (settingsModel.HideUnavailableStage) { newList = new ObservableCollection(); foreach (var item in AllStageList) { if (_stageAvailableInfo.ContainsKey(item.Value)) { var info = _stageAvailableInfo[item.Value]; if (info.Item1.Contains(_curDayOfWeek)) { newList.Add(item); } } else { newList.Add(item); } } } else { newList = new ObservableCollection(AllStageList); } if (StageList == newList) { return; } StageList = newList; bool hasSavedValue = false; foreach (var item in StageList) { if (item.Value == Stage) { hasSavedValue = true; break; } } if (!hasSavedValue) { Stage = string.Empty; } } private bool CheckAndUpdateDayOfWeek() { var now = DateTime.UtcNow.AddHours(8); var hour = now.Hour; if (hour >= 0 && hour < 4) { now = now.AddDays(-1); } if (_curDayOfWeek == now.DayOfWeek) { return false; } else { _curDayOfWeek = now.DayOfWeek; return true; } } public void UpdateDatePrompt() { var prompt = Localization.GetString("TodaysStageTip") + "\n"; foreach (var item in _stageAvailableInfo) { if (item.Value.Item1.Contains(_curDayOfWeek) && item.Value.Item2 != string.Empty) { prompt += item.Value.Item2 + "\n"; } } if (StagesOfToday == prompt) { return; } StagesOfToday = prompt; } private string _stagesOfToday = string.Empty; public string StagesOfToday { get { return _stagesOfToday; } set { SetAndNotify(ref _stagesOfToday, value); } } public void AddLog(string content, string color = "Gray", string weight = "Regular") { LogItemViewModels.Add(new LogItemViewModel(content, color, weight)); // LogItemViewModels.Insert(0, new LogItemViewModel(time + content, color, weight)); } public void ClearLog() { LogItemViewModels.Clear(); } public void SelectedAll() { foreach (var item in TaskItemViewModels) { if (item.Name == Localization.GetString("AutoRoguelike")) { continue; } item.IsChecked = true; } } private bool _inverseMode = Convert.ToBoolean(ViewStatusStorage.Get("MainFunction.InverseMode", bool.FalseString)); public bool InverseMode { get { return _inverseMode; } set { SetAndNotify(ref _inverseMode, value); InverseShowText = value ? Localization.GetString("Inverse") : Localization.GetString("Clear"); InverseMenuText = value ? Localization.GetString("Clear") : Localization.GetString("Inverse"); ViewStatusStorage.Set("MainFunction.InverseMode", value.ToString()); } } private int _selectedAllWidth = ViewStatusStorage.Get("GUI.InverseClearMode", "Clear") == "ClearInverse" ? SelectedAllWidthWhenBoth : 90; public int SelectedAllWidth { get { return _selectedAllWidth; } set { SetAndNotify(ref _selectedAllWidth, value); } } public const int SelectedAllWidthWhenBoth = 85; private int _inverseSelectedWidth = 95; public int InverseSelectedWidth { get { return _inverseSelectedWidth; } set { SetAndNotify(ref _inverseSelectedWidth, value); } } private Visibility _inverseShowVisibility = ViewStatusStorage.Get("GUI.InverseClearMode", "Clear") == "ClearInverse" ? Visibility.Visible : Visibility.Collapsed; public Visibility InverseShowVisibility { get { return _inverseShowVisibility; } set { SetAndNotify(ref _inverseShowVisibility, value); } } private Visibility _notInverseShowVisibility = ViewStatusStorage.Get("GUI.InverseClearMode", "Clear") == "ClearInverse" ? Visibility.Collapsed : Visibility.Visible; public Visibility NotInverseShowVisibility { get { return _notInverseShowVisibility; } set { SetAndNotify(ref _notInverseShowVisibility, value); } } private string _inverseShowText = Convert.ToBoolean(ViewStatusStorage.Get("MainFunction.InverseMode", bool.FalseString)) ? Localization.GetString("Inverse") : Localization.GetString("Clear"); public string InverseShowText { get { return _inverseShowText; } set { SetAndNotify(ref _inverseShowText, value); } } private string _inverseMenuText = Convert.ToBoolean(ViewStatusStorage.Get("MainFunction.InverseMode", bool.FalseString)) ? Localization.GetString("Clear") : Localization.GetString("Inverse"); public string InverseMenuText { get { return _inverseMenuText; } set { SetAndNotify(ref _inverseMenuText, value); } } public void ChangeInverseMode() { InverseMode = !InverseMode; } public void InverseSelected() { if (_inverseMode) { foreach (var item in TaskItemViewModels) { if (item.Name == Localization.GetString("AutoRoguelike")) { continue; } item.IsChecked = !item.IsChecked; } } else { foreach (var item in TaskItemViewModels) { item.IsChecked = false; } } } public async void LinkStart() { if (Idle == false) { return; } Idle = false; ClearLog(); SaveSettingValue(); AddLog(Localization.GetString("ConnectingToEmulator")); var asstProxy = _container.Get(); string errMsg = string.Empty; var task = Task.Run(() => { return asstProxy.AsstConnect(ref errMsg, true); }); bool catchd = await task; if (!catchd) { AddLog(errMsg, "darkred"); var settingsModel = _container.Get(); var subtask = Task.Run(() => { settingsModel.TryToStartEmulator(true); }); await subtask; task = Task.Run(() => { return asstProxy.AsstConnect(ref errMsg); }); catchd = await task; if (!catchd) { AddLog(errMsg, "darkred"); Idle = true; return; } } // 一般是点了“停止”按钮了 if (Idle) { return; } bool ret = true; // 直接遍历TaskItemViewModels里面的内容,是排序后的 int count = 0; int index = 0; foreach (var item in TaskItemViewModels) { ViewStatusStorage.Set("TaskQueue.Order." + item.Name, index.ToString()); ++index; if (item.IsChecked == false) { continue; } ++count; if (item.Name == Localization.GetString("Base")) { ret &= appendInfrast(); } else if (item.Name == Localization.GetString("WakeUp")) { ret &= appendStart(); } else if (item.Name == Localization.GetString("Combat")) { ret &= appendFight(); } else if (item.Name == Localization.GetString("Recruiting")) { ret &= appendRecruit(); } else if (item.Name == Localization.GetString("Visiting")) { ret &= asstProxy.AsstAppendVisit(); } else if (item.Name == Localization.GetString("Mall")) { ret &= appendMall(); } else if (item.Name == Localization.GetString("Mission")) { ret &= asstProxy.AsstAppendAward(); } else if (item.Name == Localization.GetString("AutoRoguelike")) { ret &= appendRoguelike(); } else { --count; // TODO 报错 } } if (count == 0) { AddLog(Localization.GetString("UnselectedTask")); Idle = true; return; } // 一般是点了“停止”按钮了 if (Idle) { return; } ret &= asstProxy.AsstStart(); if (ret) { AddLog(Localization.GetString("Running")); } else { AddLog(Localization.GetString("UnknownErrorOccurs")); } } public void Stop() { var asstProxy = _container.Get(); asstProxy.AsstStop(); AddLog(Localization.GetString("Stopped")); Idle = true; } /// /// 保存界面设置数值 /// private void SaveSettingValue() { // 吃理智药个数 ViewStatusStorage.Set("MainFunction.UseMedicine.Quantity", MedicineNumber); // 吃石头颗数 ViewStatusStorage.Set("MainFunction.UseStone.Quantity", StoneNumber); // 指定刷关次数 ViewStatusStorage.Set("MainFunction.TimesLimited.Quantity", MaxTimes); // 指定掉落材料 ViewStatusStorage.Set("MainFunction.Drops.ItemId", DropsItemId); // 指定掉落材料数量 ViewStatusStorage.Set("MainFunction.Drops.Quantity", DropsQuantity); } private bool appendStart() { var settings = _container.Get(); var asstProxy = _container.Get(); var mode = settings.ClientType; var enable = mode.Length != 0; return asstProxy.AsstAppendStartUp(mode, enable); } private bool appendFight() { int medicine = 0; if (UseMedicine) { if (!int.TryParse(MedicineNumber, out medicine)) { medicine = 0; } } int stone = 0; if (UseStone) { if (!int.TryParse(StoneNumber, out stone)) { stone = 0; } } int times = int.MaxValue; if (HasTimesLimited) { if (!int.TryParse(MaxTimes, out times)) { times = 0; } } int drops_quantity = 0; if (IsSpecifiedDrops) { if (!int.TryParse(DropsQuantity, out drops_quantity)) { drops_quantity = 0; } } var asstProxy = _container.Get(); return asstProxy.AsstAppendFight(Stage, medicine, stone, times, DropsItemId, drops_quantity); } public void SetParams() { int medicine = 0; if (UseMedicine) { if (!int.TryParse(MedicineNumber, out medicine)) { medicine = 0; } } int stone = 0; if (UseStone) { if (!int.TryParse(StoneNumber, out stone)) { stone = 0; } } int times = int.MaxValue; if (HasTimesLimited) { if (!int.TryParse(MaxTimes, out times)) { times = 0; } } int drops_quantity = 0; if (IsSpecifiedDrops) { if (!int.TryParse(DropsQuantity, out drops_quantity)) { drops_quantity = 0; } } var asstProxy = _container.Get(); bool setted = asstProxy.AsstSetFightTaskParams(Stage, medicine, stone, times, DropsItemId, drops_quantity); if (setted) { AddLog(Localization.GetString("SetSuccessfully"), "Black"); } else { AddLog(Localization.GetString("SetFailed"), "Red"); } } private bool appendInfrast() { var settings = _container.Get(); var order = settings.GetInfrastOrderList(); settings.SaveInfrastOrderList(); int orderLen = order.Count; var asstProxy = _container.Get(); return asstProxy.AsstAppendInfrast(1, order.ToArray(), orderLen, settings.UsesOfDrones, settings.DormThreshold / 100.0); } private bool appendMall() { var settings = _container.Get(); var asstProxy = _container.Get(); var buy_first = settings.CreditFirstList.Split(new char[] { ' ', ',', ',', ';', ';', '|' }); var black_list = settings.CreditBlackList.Split(new char[] { ' ', ',', ',', ';', ';', '|' }); return asstProxy.AsstAppendMall(settings.CreditShopping, buy_first, black_list); } private bool appendRecruit() { // for debug var settings = _container.Get(); int max_times; if (!int.TryParse(settings.RecruitMaxTimes, out max_times)) { max_times = 0; } var reqList = new List(); var cfmList = new List(); if (settings.ChooseLevel3) { cfmList.Add(3); } if (settings.ChooseLevel4) { reqList.Add(4); cfmList.Add(4); } if (settings.ChooseLevel5) { reqList.Add(5); cfmList.Add(5); } bool need_refresh = settings.RefreshLevel3; bool use_expedited = settings.UseExpedited; var asstProxy = _container.Get(); return asstProxy.AsstAppendRecruit( max_times, reqList.ToArray(), reqList.Count, cfmList.ToArray(), cfmList.Count, need_refresh, use_expedited, settings.NotChooseLevel1); } private bool appendRoguelike() { var settings = _container.Get(); int mode; int.TryParse(settings.RoguelikeMode, out mode); var asstProxy = _container.Get(); return asstProxy.AsstAppendRoguelike( mode, settings.RoguelikeStartsCount, settings.RoguelikeInvestsCount, settings.RoguelikeStopWhenInvestmentFull, settings.RoguelikeSquad, settings.RoguelikeRoles, settings.RoguelikeCoreChar); } public bool killemulator() { int pid = 0; string port; string address = ViewStatusStorage.Get("Connect.Address", string.Empty); if (address.StartsWith("127")) { port = address.Substring(10); } else { port = "5555"; } string portcmd = "netstat -ano|findstr \"" + port + "\""; Process checkcmd = new Process(); checkcmd.StartInfo.FileName = "cmd.exe"; checkcmd.StartInfo.UseShellExecute = false; checkcmd.StartInfo.RedirectStandardInput = true; checkcmd.StartInfo.RedirectStandardOutput = true; checkcmd.StartInfo.RedirectStandardError = true; checkcmd.StartInfo.CreateNoWindow = true; checkcmd.Start(); checkcmd.StandardInput.WriteLine(portcmd); checkcmd.StandardInput.WriteLine("exit"); Regex reg = new Regex("\\s+", RegexOptions.Compiled); string line; while (true) { line = checkcmd.StandardOutput.ReadLine(); try { line = line.Trim(); } catch { break; } if (line.StartsWith("TCP", StringComparison.OrdinalIgnoreCase)) { line = reg.Replace(line, ","); string[] arr = line.Split(','); if (!Convert.ToBoolean(string.Compare(arr[1], address, StringComparison.Ordinal)) || !Convert.ToBoolean(string.Compare(arr[1], "[::]:" + port, StringComparison.Ordinal)) || !Convert.ToBoolean(string.Compare(arr[1], "0.0.0.0:" + port, StringComparison.Ordinal))) { pid = int.Parse(arr[4]); break; } } } if (pid == 0) { return false; } Process emulator = Process.GetProcessById(pid); try { emulator.Kill(); } catch { return false; } return true; } public enum ActionType { DoNothing, StopGame, ExitSelf, ExitEmulator, ExitEmulatorAndSelf, Suspend, Hibernate, Shutdown, } public void CheckAfterCompleted() { switch (ActionAfterCompleted) { case ActionType.DoNothing: break; case ActionType.StopGame: var asstProxy = _container.Get(); if (!asstProxy.AsstStartCloseDown()) { AddLog(Localization.GetString("CloseArknightsFailed"), "DarkRed"); } break; case ActionType.ExitSelf: // Shutdown 会调用 OnExit 但 Exit 不会 Application.Current.Shutdown(); // Enviroment.Exit(0); break; case ActionType.ExitEmulator: if (!killemulator()) { AddLog(Localization.GetString("CloseEmulatorFailed"), "DarkRed"); } break; case ActionType.ExitEmulatorAndSelf: if (!killemulator()) { AddLog(Localization.GetString("CloseEmulatorFailed"), "DarkRed"); } // Shutdown 会调用 OnExit 但 Exit 不会 Application.Current.Shutdown(); // Enviroment.Exit(0); break; case ActionType.Shutdown: Process.Start("shutdown.exe", "-s -t 60"); // 关机询问 var shutdownResult = _windowManager.ShowMessageBox(Localization.GetString("AboutToShutdown"), Localization.GetString("ShutdownPrompt"), MessageBoxButton.OK, MessageBoxImage.Question); if (shutdownResult == MessageBoxResult.OK) { Process.Start("shutdown.exe", "-a"); } break; case ActionType.Suspend: Process.Start("powercfg", "-h off"); Process.Start("rundll32.exe", "powrprof.dll,SetSuspendState 0,1,0"); Process.Start("powercfg", "-h on"); break; case ActionType.Hibernate: // 休眠提示 AddLog(Localization.GetString("HibernatePrompt"), "DarkRed"); // 休眠不能加时间参数,https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/1133 Process.Start("shutdown.exe", "-h"); break; default: break; } } // public void CheckAndShutdown() // { // if (Shutdown) // { // System.Diagnostics.Process.Start("shutdown.exe", "-s -t 60"); // var result = _windowManager.ShowMessageBox("已刷完,即将关机,是否取消?", "提示", MessageBoxButton.OK, MessageBoxImage.Question); // if (result == MessageBoxResult.OK) // { // System.Diagnostics.Process.Start("shutdown.exe", "-a"); // } // } // if (Hibernate) // { // System.Diagnostics.Process.Start("shutdown.exe", "-h"); // } // if (Suspend) // { // System.Diagnostics.Process.Start("rundll32.exe", "powrprof.dll,SetSuspendState 0,1,0"); // } // } private bool _idle = false; public bool Idle { get { return _idle; } set { SetAndNotify(ref _idle, value); var settings = _container.Get(); settings.Idle = value; if (value) { FightTaskRunning = false; } } } private bool _fightTaskRunning = false; public bool FightTaskRunning { get { return _fightTaskRunning; } set { SetAndNotify(ref _fightTaskRunning, value); } } // private bool _shutdown = false; // public bool Shutdown // { // get { return _shutdown; } // set // { // SetAndNotify(ref _shutdown, value); // if (value) // { // Hibernate = false; // Suspend = false; // } // } // } // private bool _hibernate = false; // 休眠 // public bool Hibernate // { // get { return _hibernate; } // set // { // SetAndNotify(ref _hibernate, value); // if (value) // { // Shutdown = false; // Suspend = false; // } // } // } // private bool _suspend = false; // 待机 // public bool Suspend // { // get { return _suspend; } // set // { // SetAndNotify(ref _suspend, value); // if (value) // { // Shutdown = false; // Hibernate = false; // } // } // } public List AllStageList { get; set; } private ObservableCollection _stageList = new ObservableCollection(); public ObservableCollection StageList { get { return _stageList; } set { SetAndNotify(ref _stageList, value); } } private string _stage = ViewStatusStorage.Get("MainFunction.Stage", string.Empty); public string Stage { get { return _stage; } set { SetAndNotify(ref _stage, value); ViewStatusStorage.Set("MainFunction.Stage", value); } } private bool _useMedicine = Convert.ToBoolean(ViewStatusStorage.Get("MainFunction.UseMedicine", bool.FalseString)); public bool UseMedicine { get { return _useMedicine; } set { SetAndNotify(ref _useMedicine, value); if (!value) { UseStone = false; } ViewStatusStorage.Set("MainFunction.UseMedicine", value.ToString()); } } private string _medicineNumber = ViewStatusStorage.Get("MainFunction.UseMedicine.Quantity", "999"); public string MedicineNumber { get { return _medicineNumber; } set { SetAndNotify(ref _medicineNumber, value); } } private bool _useStone; public bool UseStone { get { return _useStone; } set { SetAndNotify(ref _useStone, value); if (value) { UseMedicine = true; } } } private string _stoneNumber = ViewStatusStorage.Get("MainFunction.UseStone.Quantity", "0"); public string StoneNumber { get { return _stoneNumber; } set { SetAndNotify(ref _stoneNumber, value); } } private bool _hasTimesLimited; public bool HasTimesLimited { get { return _hasTimesLimited; } set { SetAndNotify(ref _hasTimesLimited, value); } } private string _maxTimes = ViewStatusStorage.Get("MainFunction.TimesLimited.Quantity", "5"); public string MaxTimes { get { return _maxTimes; } set { SetAndNotify(ref _maxTimes, value); } } private bool _isSpecifiedDrops = Convert.ToBoolean(ViewStatusStorage.Get("MainFunction.Drops.Enable", bool.FalseString)); public bool IsSpecifiedDrops { get { return _isSpecifiedDrops; } set { SetAndNotify(ref _isSpecifiedDrops, value); ViewStatusStorage.Set("MainFunction.Drops.Enable", value.ToString()); } } private static readonly string _DropsFilename = Environment.CurrentDirectory + "\\resource\\item_index.json"; public List AllDrops { get; set; } = new List(); private void InitDrops() { string jsonStr = File.ReadAllText(_DropsFilename); var reader = (JObject)JsonConvert.DeserializeObject(jsonStr); foreach (var item in reader) { var val = item.Key; // 不是数字的东西都是正常关卡不会掉的(大概吧) if (!int.TryParse(val, out _)) { continue; } var dis = item.Value["name"].ToString(); if (dis.EndsWith("双芯片") || dis.EndsWith("寻访凭证") || dis.EndsWith("加固建材") || dis.EndsWith("许可") || dis == "资质凭证" || dis == "高级凭证" || dis == "演习券" || dis.Contains("源石") || dis == "D32钢" || dis == "双极纳米片" || dis == "聚合剂" || dis == "晶体电子单元" || dis == "龙骨" || dis == "芯片助剂") { continue; } AllDrops.Add(new CombData { Display = dis, Value = val }); } AllDrops.Sort((a, b) => { return string.Compare(a.Value, b.Value, StringComparison.Ordinal); }); DropsList = new ObservableCollection(AllDrops); } public ObservableCollection DropsList { get; set; } private string _dropsItemId = ViewStatusStorage.Get("MainFunction.Drops.ItemId", "0"); public string DropsItemId { get { return _dropsItemId; } set { if (value == null) { return; } SetAndNotify(ref _dropsItemId, value); } } private string _dropsItem = string.Empty; private bool _isFirstLoadDropItem = true; private long _preSetDropsItemTicks = 0; public string DropsItem { get { return _dropsItem; } set { if (_isFirstLoadDropItem) { _isFirstLoadDropItem = false; } else { IsDropDown = true; } if (DateTime.Now.Ticks - _preSetDropsItemTicks < 50) { return; } _preSetDropsItemTicks = DateTime.Now.Ticks; DropsList.Clear(); foreach (CombData drop in AllDrops) { var enumStr = drop.Display; if (enumStr.Contains(value)) { DropsList.Add(drop); } } SetAndNotify(ref _dropsItem, value); } } private bool _isDropDown = false; public bool IsDropDown { get { return _isDropDown; } set { SetAndNotify(ref _isDropDown, value); } } private string _dropsQuantity = ViewStatusStorage.Get("MainFunction.Drops.Quantity", "5"); public string DropsQuantity { get { return _dropsQuantity; } set { SetAndNotify(ref _dropsQuantity, value); } } } }