using CSCore.CoreAudioAPI; using LinePutScript; using LinePutScript.Dictionary; using LinePutScript.Localization.WPF; using Panuon.WPF.UI; using Steamworks; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; using System.Web; using System.Windows; using System.Windows.Controls; using System.Windows.Media.Imaging; using VPet_Simulator.Core; using VPet_Simulator.Windows.Interface; using static VPet_Simulator.Core.GraphHelper; using static VPet_Simulator.Core.GraphInfo; using Timer = System.Timers.Timer; using ToolBar = VPet_Simulator.Core.ToolBar; namespace VPet_Simulator.Windows { public partial class MainWindow : IMainWindow { public readonly string ModPath = Environment.CurrentDirectory + @"\mod"; public bool IsSteamUser { get; } public Setting Set { get; set; } public List Pets { get; set; } = new List(); public List CoreMODs = new List(); public GameCore Core { get; set; } = new GameCore(); public Main Main { get; set; } public UIElement TalkBox; public winGameSetting winSetting { get; set; } public winBetterBuy winBetterBuy { get; set; } //public ChatGPTClient CGPTClient; public ImageResources ImageSources { get; set; } = new ImageResources(); /// /// 所有三方插件 /// public List Plugins { get; } = new List(); public List Foods { get; } = new List(); /// /// 版本号 /// public int version { get; } = 107; /// /// 版本号 /// public string Version => $"{version / 100}.{version % 100}"; public List LowFoodText { get; set; } = new List(); public List LowDrinkText { get; set; } = new List(); public List SelectTexts { get; set; } = new List(); public List ClickTexts { get; set; } = new List(); public GameSave_v2 GameSavesData { get; set; } /// /// 获得自动点击的文本 /// /// 说话内容 public ClickText GetClickText() { ClickText.DayTime dt; var now = DateTime.Now.Hour; if (now < 6) dt = ClickText.DayTime.Midnight; else if (now < 12) dt = ClickText.DayTime.Morning; else if (now < 18) dt = ClickText.DayTime.Afternoon; else dt = ClickText.DayTime.Night; ClickText.ModeType mt; switch (Core.Save.Mode) { case GameSave.ModeType.PoorCondition: mt = ClickText.ModeType.PoorCondition; break; default: case GameSave.ModeType.Nomal: mt = ClickText.ModeType.Nomal; break; case GameSave.ModeType.Happy: mt = ClickText.ModeType.Happy; break; case GameSave.ModeType.Ill: mt = ClickText.ModeType.Ill; break; } var list = ClickTexts.FindAll(x => x.DaiTime.HasFlag(dt) && x.Mode.HasFlag(mt) && x.CheckState(Main)); if (list.Count == 0) return null; return list[Function.Rnd.Next(list.Count)]; } private Image hashcheckimg; /// /// 关闭该玩家的HashCheck检查 /// 如果你的mod属于作弊mod/有作弊内容,请在作弊前调用这个方法 /// public void HashCheckOff() { HashCheck = false; } /// /// 存档 Hash检查 是否通过 /// public bool HashCheck { get => GameSavesData.HashCheck; set { if (!value) { GameSavesData.HashCheckOff(); } Main?.Dispatcher.Invoke(() => { if (GameSavesData.HashCheck) { if (hashcheckimg == null) { hashcheckimg = new Image(); hashcheckimg.Source = new BitmapImage(new Uri("pack://application:,,,/Res/hash.png")); hashcheckimg.HorizontalAlignment = HorizontalAlignment.Right; hashcheckimg.ToolTip = "是没有修改过存档/使用超模MOD的玩家专属标志".Translate(); Grid.SetColumn(hashcheckimg, 4); Grid.SetRowSpan(hashcheckimg, 2); Main.ToolBar.gdPanel.Children.Add(hashcheckimg); } } else { if (hashcheckimg != null) { Main.ToolBar.gdPanel.Children.Remove(hashcheckimg); hashcheckimg = null; } } }); } } public void SetZoomLevel(double zl) { Set.ZoomLevel = zl; //this.Height = 500 * zl; this.Width = 500 * zl; if (petHelper != null) { petHelper.Width = 50 * zl; petHelper.Height = 50 * zl; petHelper.ReloadLocation(); } } //private DateTime timecount = DateTime.Now; /// /// 保存设置 /// public void Save() { foreach (MainPlugin mp in Plugins) mp.Save(); //游戏存档 if (Set != null) { var st = Set.SaveTimesPP; if (Main != null) { Set.VoiceVolume = Main.PlayVoiceVolume; List list = new List(); Foods.FindAll(x => x.Star).ForEach(x => list.Add(x.Name)); Set["betterbuy"]["star"].info = string.Join(",", list); //GameSavesData.Statistics[(gint)"stat_time"] = (int)(DateTime.Now - timecount).TotalMinutes; //timecount = DateTime.Now; } Set.StartRecordLastPoint = new Point(Dispatcher.Invoke(() => Left), Dispatcher.Invoke(() => Top)); File.WriteAllText(ExtensionValue.BaseDirectory + @"\Setting.lps", Set.ToString()); if (!Directory.Exists(ExtensionValue.BaseDirectory + @"\Saves")) Directory.CreateDirectory(ExtensionValue.BaseDirectory + @"\Saves"); if (Core != null && Core.Save != null) { var ds = new List(Directory.GetFiles(ExtensionValue.BaseDirectory + @"\Saves", "*.lps")).FindAll(x => x.Contains('_')).OrderBy(x => { if (int.TryParse(x.Split('_')[1].Split('.')[0], out int i)) return i; return 0; }).ToList(); while (ds.Count > Set.BackupSaveMaxNum) { File.Delete(ds[0]); ds.RemoveAt(0); } if (File.Exists(ExtensionValue.BaseDirectory + $"\\Saves\\Save_{st}.lps")) File.Delete(ExtensionValue.BaseDirectory + $"\\Saves\\Save_{st}.lps"); if (File.Exists(ExtensionValue.BaseDirectory + @"\Save.lps")) File.Move(ExtensionValue.BaseDirectory + @"\Save.lps", ExtensionValue.BaseDirectory + @"\Save.bkp"); File.WriteAllText(ExtensionValue.BaseDirectory + $"\\Saves\\Save_{st}.lps", GameSavesData.ToLPS().ToString()); } } } /// /// 重载DIY按钮区域 /// public void LoadDIY() { Main.ToolBar.MenuDIY.Items.Clear(); foreach (Sub sub in Set["diy"]) Main.ToolBar.AddMenuButton(ToolBar.MenuType.DIY, sub.Name, () => { Main.ToolBar.Visibility = Visibility.Collapsed; RunDIY(sub.Info); }); try { //加载游戏创意工坊插件 foreach (MainPlugin mp in Plugins) mp.LoadDIY(); } catch (Exception e) { new winReport(this, "由于插件引起的自定按钮加载错误".Translate() + '\n' + e.ToString()).Show(); } } /// /// 加载帮助器 /// public void LoadPetHelper() { petHelper = new PetHelper(this); petHelper.Show(); } public static void RunDIY(string content) { if (content.Contains("://") || content.Contains(@":\")) { try { Process.Start(content); } catch (Exception e) { MessageBox.Show("快捷键运行失败:无法运行指定内容".Translate() + '\n' + e.Message); } } else { try { System.Windows.Forms.SendKeys.SendWait(content); } catch (Exception e) { MessageBox.Show("快捷键运行失败:无法运行指定内容".Translate() + '\n' + e.Message); } } } public void ShowSetting(int page = -1) { if (page >= 0 && page <= 6) winSetting.MainTab.SelectedIndex = page; winSetting.Show(); } public void ShowBetterBuy(Food.FoodType type) { winBetterBuy.Show(type); } int lowstrengthAskCountFood = 20; int lowstrengthAskCountDrink = 20; private void lowStrength() { if (Set.AutoBuy && Core.Save.Money >= 100) { var havemoney = Core.Save.Money * 1.2 - 120; List food = Foods.FindAll(x => x.Price >= 2 && x.Health >= 0 && x.Exp >= 0 && x.Likability >= 0 && x.Price < havemoney //桌宠不吃负面的食物 && !x.IsOverLoad() // 不吃超模食物 ); if (Core.Save.StrengthFood < 75) { if (Core.Save.StrengthFood < 50) {//太饿了,找正餐 food = food.FindAll(x => x.Type == Food.FoodType.Meal && x.StrengthFood > 20); } else {//找零食 food = food.FindAll(x => x.Type == Food.FoodType.Snack && x.StrengthFood > 10); } if (food.Count == 0) return; var item = food[Function.Rnd.Next(food.Count)]; Core.Save.Money -= item.Price * 0.2; TakeItem(item); GameSavesData.Statistics[(gint)"stat_autobuy"]++; Main.Display(item.GetGraph(), item.ImageSource, Main.DisplayToNomal); } else if (Core.Save.StrengthDrink < 75) { food = food.FindAll(x => x.Type == Food.FoodType.Drink && x.StrengthDrink > 10); if (food.Count == 0) return; var item = food[Function.Rnd.Next(food.Count)]; Core.Save.Money -= item.Price * 0.2; TakeItem(item); GameSavesData.Statistics[(gint)"stat_autobuy"]++; Main.Display(item.GetGraph(), item.ImageSource, Main.DisplayToNomal); } else if (Set.AutoGift && Core.Save.Feeling < 50) { food = food.FindAll(x => x.Type == Food.FoodType.Gift && x.Feeling > 10); if (food.Count == 0) return; var item = food[Function.Rnd.Next(food.Count)]; Core.Save.Money -= item.Price * 0.2; TakeItem(item); GameSavesData.Statistics[(gint)"stat_autogift"]++; Main.Display(item.GetGraph(), item.ImageSource, Main.DisplayToNomal); } } else if (Core.Save.Mode == GameSave.ModeType.Happy || Core.Save.Mode == GameSave.ModeType.Nomal) { if (Core.Save.StrengthFood < 75 && Function.Rnd.Next(lowstrengthAskCountFood--) == 0) { lowstrengthAskCountFood = Set.InteractionCycle; var like = Core.Save.Likability < 40 ? 0 : (Core.Save.Likability < 70 ? 1 : (Core.Save.Likability < 100 ? 2 : 3)); var txt = LowFoodText.FindAll(x => x.Mode == LowText.ModeType.H && (int)x.Like <= like); if (txt.Count != 0) if (Core.Save.StrengthFood > 60) { txt = txt.FindAll(x => x.Strength == LowText.StrengthType.L); Main.Say(txt[Function.Rnd.Next(txt.Count)].TranslateText); } else if (Core.Save.StrengthFood > 40) { txt = txt.FindAll(x => x.Strength == LowText.StrengthType.M); Main.Say(txt[Function.Rnd.Next(txt.Count)].TranslateText); } else { txt = txt.FindAll(x => x.Strength == LowText.StrengthType.S); Main.Say(txt[Function.Rnd.Next(txt.Count)].TranslateText); } Main.DisplayStopForce(() => Main.Display(GraphType.Switch_Hunger, AnimatType.Single, Main.DisplayToNomal)); return; } if (Core.Save.StrengthDrink < 75 && Function.Rnd.Next(lowstrengthAskCountDrink--) == 0) { lowstrengthAskCountDrink = Set.InteractionCycle; var like = Core.Save.Likability < 40 ? 0 : (Core.Save.Likability < 70 ? 1 : (Core.Save.Likability < 100 ? 2 : 3)); var txt = LowDrinkText.FindAll(x => x.Mode == LowText.ModeType.H && (int)x.Like <= like); if (txt.Count != 0) if (Core.Save.StrengthDrink > 60) { txt = txt.FindAll(x => x.Strength == LowText.StrengthType.L); Main.Say(txt[Function.Rnd.Next(txt.Count)].TranslateText); } else if (Core.Save.StrengthDrink > 40) { txt = txt.FindAll(x => x.Strength == LowText.StrengthType.M); Main.Say(txt[Function.Rnd.Next(txt.Count)].TranslateText); } else { txt = txt.FindAll(x => x.Strength == LowText.StrengthType.S); Main.Say(txt[Function.Rnd.Next(txt.Count)].TranslateText); } Main.DisplayStopForce(() => Main.Display(GraphType.Switch_Thirsty, AnimatType.Single, Main.DisplayToNomal)); return; } } else { if (Core.Save.StrengthFood < 60 && Function.Rnd.Next(lowstrengthAskCountFood--) == 0) { lowstrengthAskCountFood = Set.InteractionCycle; var like = Core.Save.Likability < 40 ? 0 : (Core.Save.Likability < 70 ? 1 : (Core.Save.Likability < 100 ? 2 : 3)); var txt = LowFoodText.FindAll(x => x.Mode == LowText.ModeType.L && (int)x.Like < like); if (Core.Save.StrengthFood > 40) { txt = txt.FindAll(x => x.Strength == LowText.StrengthType.L); Main.Say(txt[Function.Rnd.Next(txt.Count)].TranslateText); } else if (Core.Save.StrengthFood > 20) { txt = txt.FindAll(x => x.Strength == LowText.StrengthType.M); Main.Say(txt[Function.Rnd.Next(txt.Count)].TranslateText); } else { txt = txt.FindAll(x => x.Strength == LowText.StrengthType.S); Main.Say(txt[Function.Rnd.Next(txt.Count)].TranslateText); } Main.DisplayStopForce(() => Main.Display(GraphType.Switch_Hunger, AnimatType.Single, Main.DisplayToNomal)); return; } if (Core.Save.StrengthDrink < 60 && Function.Rnd.Next(lowstrengthAskCountDrink--) == 0) { lowstrengthAskCountDrink = Set.InteractionCycle; var like = Core.Save.Likability < 40 ? 0 : (Core.Save.Likability < 70 ? 1 : (Core.Save.Likability < 100 ? 2 : 3)); var txt = LowDrinkText.FindAll(x => x.Mode == LowText.ModeType.L && (int)x.Like < like); if (Core.Save.StrengthDrink > 40) { txt = txt.FindAll(x => x.Strength == LowText.StrengthType.L); Main.Say(txt[Function.Rnd.Next(txt.Count)].TranslateText); } else if (Core.Save.StrengthDrink > 20) { txt = txt.FindAll(x => x.Strength == LowText.StrengthType.M); Main.Say(txt[Function.Rnd.Next(txt.Count)].TranslateText); } else { txt = txt.FindAll(x => x.Strength == LowText.StrengthType.S); Main.Say(txt[Function.Rnd.Next(txt.Count)].TranslateText); } Main.DisplayStopForce(() => Main.Display(GraphType.Switch_Thirsty, AnimatType.Single, Main.DisplayToNomal)); return; } } } /// /// 使用/食用物品 (不包括显示动画) /// /// 物品 public void TakeItem(Food item) { //获取吃腻时间 DateTime now = DateTime.Now; DateTime eattime = GameSavesData["buytime"].GetDateTime(item.Name, now); double eattimes = 0; if (eattime > now) { eattimes = (eattime - now).TotalHours; } //开始加点 Core.Save.EatFood(item, Math.Max(0.5, 1 - Math.Pow(eattimes, 2) * 0.01)); //吃腻了 eattimes += 2; GameSavesData["buytime"].SetDateTime(item.Name, now.AddHours(eattimes)); //通知 item.LoadEatTimeSource(this); item.NotifyOfPropertyChange("Description"); Core.Save.Money -= item.Price; //统计 GameSavesData.Statistics[(gint)"stat_buytimes"]++; GameSavesData.Statistics[(gint)("buy_" + item.Name)]++; GameSavesData.Statistics[(gdbe)"stat_betterbuy"] += item.Price; switch (item.Type) { case Food.FoodType.Food: GameSavesData.Statistics[(gdbe)"stat_bb_food"] += item.Price; break; case Food.FoodType.Drink: GameSavesData.Statistics[(gdbe)"stat_bb_drink"] += item.Price; break; case Food.FoodType.Drug: GameSavesData.Statistics[(gdbe)"stat_bb_drug"] += item.Price; GameSavesData.Statistics[(gdbe)"stat_bb_drug_exp"] += item.Exp; break; case Food.FoodType.Snack: GameSavesData.Statistics[(gdbe)"stat_bb_snack"] += item.Price; break; case Food.FoodType.Functional: GameSavesData.Statistics[(gdbe)"stat_bb_functional"] += item.Price; break; case Food.FoodType.Meal: GameSavesData.Statistics[(gdbe)"stat_bb_meal"] += item.Price; break; case Food.FoodType.Gift: GameSavesData.Statistics[(gdbe)"stat_bb_gift"] += item.Price; GameSavesData.Statistics[(gdbe)"stat_bb_gift_like"] += item.Likability; break; } } public void RunAction(string action) { switch (action) { case "DisplayNomal": Main.DisplayNomal(); break; case "DisplayToNomal": Main.DisplayToNomal(); break; case "DisplayTouchHead": Main.DisplayTouchHead(); break; case "DisplayTouchBody": Main.DisplayTouchBody(); break; case "DisplayIdel": Main.DisplayIdel(); break; case "DisplayIdel_StateONE": Main.DisplayIdel_StateONE(); break; case "DisplaySleep": Main.DisplaySleep(); break; case "DisplayRaised": Main.DisplayRaised(); break; case "DisplayMove": Main.DisplayMove(); break; } } /// /// Steam统计相关变化 /// private void Statistics_StatisticChanged(Statistics sender, string name, SetObject value) { if (name.StartsWith("stat_")) { Steamworks.SteamUserStats.SetStat(name, (int)value); } } /// /// 计算统计数据 /// private void StatisticsCalHandle() { var stat = GameSavesData.Statistics; var save = Core.Save; stat["stat_money"] = save.Money; stat["stat_level"] = save.Level; stat["stat_likability"] = save.Likability; stat[(gi64)"stat_total_time"] += (int)Set.LogicInterval; switch (Main.State) { case Main.WorkingState.Work: if (Main.nowWork.Type == GraphHelper.Work.WorkType.Work) stat[(gi64)"stat_work_time"] += (int)Set.LogicInterval; else stat[(gi64)"stat_study_time"] += (int)Set.LogicInterval; break; case Main.WorkingState.Sleep: stat[(gi64)"stat_sleep_time"] += (int)Set.LogicInterval; break; } if (save.Mode == GameSave.ModeType.Ill) { if (save.Money < 100) stat["stat_ill_nomoney"] = 1; } if (save.Money < save.Level) { stat["stat_level_g_money"] = 1; } if (save.Feeling < 1) { stat["stat_0_feel"] = 1; if (save.StrengthDrink < 1) stat["stat_0_f_sd"] = 1; } if (save.Strength < 1 && save.Feeling < 1 && save.StrengthFood < 1 && save.StrengthDrink < 1) stat["stat_0_all"] = 1; if (save.StrengthFood < 1) stat["stat_0_strengthfood"] = 1; if (save.StrengthDrink < 1) { stat["stat_0_strengthdrink"] = 1; if (save.StrengthFood < 1) stat["stat_0_sd_sf"] = 1; } if (save.Strength > 99 && save.Feeling > 99 && save.StrengthFood > 99 && save.StrengthDrink > 99) stat[(gint)"stat_100_all"]++; if (IsSteamUser) { Task.Run(Steamworks.SteamUserStats.StoreStats); } } /// /// 加载游戏 /// public bool GameLoad(ILPS lps) { if (lps == null) return false; if (string.IsNullOrWhiteSpace(lps.ToString())) return false; GameSave_v2 tmp; if (GameSavesData != null) tmp = new GameSave_v2(lps, GameSavesData); else { var data = new LPS_D(); foreach (var item in Set.PetData_OLD) { if (item.Name.Contains("_")) { var strs = Sub.Split(item.Name, "_", 1); data[strs[0]][(gstr)strs[1]] = item.Info; } else data.Add(new Line(item.Name, item.Info)); } tmp = new GameSave_v2(lps, Set.Statistics_OLD, olddata: data); } if (tmp.GameSave == null) return false; if (tmp.GameSave.Money == 0 && tmp.GameSave.Likability == 0 && tmp.GameSave.Exp == 0 && tmp.GameSave.StrengthDrink == 0 && tmp.GameSave.StrengthFood == 0)//数据全是0,可能是bug return false; GameSavesData = tmp; Core.Save = tmp.GameSave; HashCheck = HashCheck; return true; } private void Handle_Steam(Main obj) { if (HashCheck) { SteamFriends.SetRichPresence("lv", $" (lv{GameSavesData.GameSave.Level})"); } else { SteamFriends.SetRichPresence("lv", " "); } if (Core.Save.Mode == GameSave.ModeType.Ill) { SteamFriends.SetRichPresence("steam_display", "#Status_Ill"); } else { SteamFriends.SetRichPresence("mode", (Core.Save.Mode.ToString() + "ly").Translate()); switch (obj.State) { case Main.WorkingState.Work: SteamFriends.SetRichPresence("work", obj.nowWork.Name.Translate()); SteamFriends.SetRichPresence("steam_display", "#Status_Work"); break; case Main.WorkingState.Sleep: SteamFriends.SetRichPresence("steam_display", "#Status_Sleep"); break; default: if (obj.DisplayType.Name == "music") SteamFriends.SetRichPresence("steam_display", "#Status_Music"); else { switch (obj.DisplayType.Type) { case GraphType.Move: SteamFriends.SetRichPresence("idel", "乱爬".Translate()); break; case GraphType.Idel: case GraphType.StateONE: case GraphType.StateTWO: SteamFriends.SetRichPresence("idel", "发呆".Translate()); break; default: SteamFriends.SetRichPresence("idel", "闲逛".Translate()); break; } SteamFriends.SetRichPresence("steam_display", "#Status_IDLE"); } break; } } } private bool? AudioPlayingVolumeOK = null; /// /// 获得当前系统音乐播放音量 /// public float AudioPlayingVolume() { if (AudioPlayingVolumeOK == null) {//第一调用检查是否支持 try { float vol = 0; using (var enumerator = new MMDeviceEnumerator()) { using (var meter = AudioMeterInformation.FromDevice(enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia))) { vol = meter.GetPeakValue(); AudioPlayingVolumeOK = true; } } } catch { AudioPlayingVolumeOK = false; } } else if (AudioPlayingVolumeOK == false) { return -1; } try {//后续容错可能是偶发性 using (var enumerator = new MMDeviceEnumerator()) { using (var meter = AudioMeterInformation.FromDevice(enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia))) { return meter.GetPeakValue(); } } } catch { return -1; } } /// /// 音乐检测器 /// private void Handle_Music(Main obj) { if (MusicTimer.Enabled == false && Core.Graph.FindGraphs("music", AnimatType.B_Loop, Core.Save.Mode) != null && Main.IsIdel && AudioPlayingVolume() > Set.MusicCatch) { catch_MusicVolSum = 0; catch_MusicVolCount = 0; CurrMusicType = null; MusicTimer.Start(); Task.Run(() => {//等2秒看看识别结果 Thread.Sleep(2500); if (CurrMusicType != null && Main.IsIdel) {//识别通过,开始跑跳舞动画 //先统计下 GameSavesData.Statistics[(gint)"stat_music"]++; Main.Display(Core.Graph.FindGraph("music", AnimatType.A_Start, Core.Save.Mode), Display_Music); } else { //失败或有东西阻塞,停止检测 MusicTimer.Stop(); } }); } } private void Display_Music() { if (CurrMusicType.HasValue) { if (CurrMusicType.Value) {//播放更刺激的 var mg = Core.Graph.FindGraph("music", AnimatType.Single, Core.Save.Mode); mg ??= Core.Graph.FindGraph("music", AnimatType.B_Loop, Core.Save.Mode); Main.Display(mg, Display_Music); } else { Main.Display(Core.Graph.FindGraph("music", AnimatType.B_Loop, Core.Save.Mode), Display_Music); } } else { Main.Display("music", AnimatType.C_End, Main.DisplayToNomal); } } private void MusicTimer_Elapsed(object sender, ElapsedEventArgs e) { if (!(Main.IsIdel || Main.DisplayType.Name == "music"))//不是音乐,被掐断 return; catch_MusicVolSum += AudioPlayingVolume(); catch_MusicVolCount++; if (catch_MusicVolCount >= 20) { double ans = catch_MusicVolSum / catch_MusicVolCount; catch_MusicVolSum /= 4; catch_MusicVolCount /= 4; if (ans > Set.MusicCatch) { var bef = CurrMusicType; CurrMusicType = ans > Set.MusicMax; if (bef != null && bef != CurrMusicType) Display_Music(); MusicTimer.Start(); } else { CurrMusicType = null; if (Main.DisplayType.Name == "music") Main.Display("music", AnimatType.C_End, Main.DisplayToNomal); } } else { MusicTimer.Start(); } } public Timer MusicTimer; private double catch_MusicVolSum; private int catch_MusicVolCount; /// /// 当前音乐播放状态 /// public bool? CurrMusicType { get; private set; } int LastDiagnosisTime = 0; /// /// 上传遥测文件 /// public void DiagnosisUPLoad() { if (!IsSteamUser) return;//不遥测非Steam用户 if (!Set.DiagnosisDayEnable) return;//不遥测不参加遥测的用户 if (!Set.Diagnosis) return;//不遥测不参加遥测的用户 if (!HashCheck) return;//不遥测数据修改过的用户 if (LastDiagnosisTime++ < Set.DiagnosisInterval) return;//等待间隔 LastDiagnosisTime = 0; string _url = "http://cn.exlb.org:5810/VPET/Report"; //参数 StringBuilder sb = new StringBuilder(); sb.Append("action=data"); sb.Append($"&steamid={Steamworks.SteamClient.SteamId.Value}"); sb.Append($"&ver={version}"); sb.Append("&save="); sb.AppendLine(HttpUtility.UrlEncode(Core.Save.ToLine().ToString() + Set.ToString())); //游戏设置比存档更重要,桌宠大部分内容存设置里了,所以一起上传 var request = (HttpWebRequest)WebRequest.Create(_url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded";//ContentType byte[] byteData = Encoding.UTF8.GetBytes(sb.ToString()); int length = byteData.Length; request.ContentLength = length; using (Stream writer = request.GetRequestStream()) { writer.Write(byteData, 0, length); writer.Close(); writer.Dispose(); } string responseString; using (var response = (HttpWebResponse)request.GetResponse()) { responseString = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd(); response.Dispose(); } if (responseString == "IP times Max") { Set.DiagnosisDayEnable = false; } #if DEBUG else { throw new Exception("诊断上传失败"); } #endif } /// /// 关闭指示器,默认为true /// public bool CloseConfirm { get; private set; } = true; public List TalkAPI { get; } = new List(); /// /// 当前选择的对话框index /// public int TalkAPIIndex = -1; /// /// 当前对话框 /// public ITalkAPI TalkBoxCurr { get { if (TalkAPIIndex == -1) return null; return TalkAPI[TalkAPIIndex]; } } /// /// 移除所有聊天对话框 /// public void RemoveTalkBox() { if (TalkBox != null) { Main.ToolBar.MainGrid.Children.Remove(TalkBox); TalkBox = null; } if (TalkAPIIndex == -1) return; Main.ToolBar.MainGrid.Children.Remove(TalkAPI[TalkAPIIndex].This); } /// /// 加载自定义对话框 /// public void LoadTalkDIY() { RemoveTalkBox(); if (TalkAPIIndex == -1) return; Main.ToolBar.MainGrid.Children.Add(TalkAPI[TalkAPIIndex].This); } /// /// 超模工作检查 /// public bool WorkCheck(Work work) { //看看是否超模 if (HashCheck && work.IsOverLoad()) { var spend = ((work.StrengthFood >= 0 ? 1 : -1) * Math.Pow(work.StrengthFood * 2 + 1, 2) / 6 + (work.StrengthDrink >= 0 ? 1 : -1) * Math.Pow(work.StrengthDrink * 2 + 1, 2) / 9 + (work.Feeling >= 0 ? 1 : -1) * Math.Pow((work.Type == Work.WorkType.Play ? -1 : 1) * work.Feeling * 2 + 1, 2) / 12) * (Math.Pow(work.LevelLimit / 2 + 1, 0.5) / 4 + 1) - 0.5; var get = (work.MoneyBase + work.MoneyLevel * 10) * (work.MoneyLevel + 1) * (1 + work.FinishBonus / 2); if (work.Type != Work.WorkType.Work) { get /= 12;//经验值换算 } var rel = get / spend; if (MessageBoxX.Show("当前工作数据属性超模,是否继续工作?\n超模工作可能会导致游戏发生不可预料的错误\n超模工作不影响大部分成就解锁\n当前数据比率 {0:f2} 推荐<1.5\n盈利速度:{1:f0} 推荐<{2}" .Translate(rel, get, (work.LevelLimit + 4) * 6), "超模工作提醒".Translate(), MessageBoxButton.YesNo) != MessageBoxResult.Yes) { return false; } HashCheck = false; } return true; } } }