using LinePutScript; using LinePutScript.Dictionary; using LinePutScript.Localization.WPF; using Panuon.WPF.UI; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; using VPet_Simulator.Core; using static System.Net.Mime.MediaTypeNames; namespace VPet_Simulator.Windows.Interface { /// /// 游戏存档 最新版 /// public class GameSave_v2 : IGetOBJ { /// /// 新存档 /// public GameSave_v2(string petname) { GameSave = new IGameSave(petname); Statistics = new Statistics(); } protected void load(ILPS lps, Statistics oldStatistics = null, IGameSave oldGameSave = null, ILPS olddata = null) { if (lps.FindLine("statistics") == null) {//尝试从老存档加载 Statistics = oldStatistics ?? new Statistics(); } else { Statistics = new Statistics(lps["statistics"].ToList()); } ILine vpet = lps.FindLine("vpet"); bool nohashcheck = true; long hash; if (vpet != null) { GameSave = IGameSave.Load(vpet); hash = vpet.GetInt64("hash"); if (vpet.Remove("hash")) { nohashcheck = false; try { using (MD5 md5 = MD5.Create()) { long hs = BitConverter.ToInt64(md5.ComputeHash(Encoding.UTF8.GetBytes(vpet.Name)), 0) * 2 + BitConverter.ToInt64(md5.ComputeHash(Encoding.UTF8.GetBytes(vpet.info)), 0) * 3 + BitConverter.ToInt64(md5.ComputeHash(Encoding.UTF8.GetBytes(vpet.text)), 0) * 4; foreach (ISub su in vpet.ToList()) { hs += BitConverter.ToInt64(md5.ComputeHash(Encoding.UTF8.GetBytes(su.Name)), 0) * 2 + BitConverter.ToInt64(md5.ComputeHash(Encoding.UTF8.GetBytes(su.Info)), 0) * 3; } HashCheck = hs == hash; } } catch { nohashcheck = true; } } } else if (oldGameSave != null) { GameSave = oldGameSave; } if (nohashcheck) { hash = lps.GetInt64("hash"); int ver = lps["hash"].GetInt("ver"); if (lps.Remove("hash")) { if (ver == 2) HashCheck = Sub.GetHashCode(lps.ToString()) == hash; else { try { using (MD5 md5 = MD5.Create()) { HashCheck = BitConverter.ToInt64(md5.ComputeHash(Encoding.UTF8.GetBytes(lps.ToString())), 0) == hash; } if (!HashCheck) HashCheck = Sub.GetHashCode(lps.ToString()) == hash; } catch (Exception e) { HashCheck = false; MessageBoxX.Show(e.ToString(), "当前存档Hash验证信息".Translate() + ":" + "失败".Translate()); } } } } if (olddata != null) Data.AddRange(olddata); Data.AddRange(lps); } /// /// 读存档, 带入老数据 /// /// 数据 /// 老统计 /// 老存档 /// 老数据 public GameSave_v2(ILPS lps, Statistics oldStatistics = null, IGameSave oldGameSave = null, ILPS olddata = null) { load(lps, oldStatistics, oldGameSave, olddata); } /// /// 读存档, 带入老存档 /// /// /// public GameSave_v2(ILPS lps, GameSave_v2 oldSave) { load(lps, oldSave.Statistics, oldSave.GameSave, oldSave.Data); } /// /// 游戏相关数据 /// public LPS_D Data = new LPS_D(); /// /// 游戏存档 /// public IGameSave GameSave; /// /// 统计 /// public Statistics Statistics = null; public ILPS ToLPS() { var lps = new LPS_D(); lps.AddRange(Data); lps.AddLine(GameSave.ToLine()); lps.Add(new Line("statistics", "", Statistics.ToSubs())); lps.Remove("hash"); if (HashCheck) { lps[(gi64)"hash"] = Sub.GetHashCode(lps.ToString()); lps["hash"][(gint)"ver"] = 2; } else { lps[(gint)"hash"] = -1; lps["hash"][(gint)"ver"] = 2; } return lps; } /// /// Hash检查 /// public bool HashCheck { get; private set; } = true; FInt64 IGetOBJ.this[gflt subName] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } /// /// 关闭该玩家的HashCheck检查 /// 请使用imw中的HashCheckOff /// public void HashCheckOff() { HashCheck = false; } #region GETOBJ public DateTime this[gdat subName] { get => Data[subName]; set => Data[subName] = value; } public FInt64 this[gflt subName] { get => Data[subName]; set => Data[subName] = value; } public double this[gdbe subName] { get => Data[subName]; set => Data[subName] = value; } public long this[gi64 subName] { get => Data[subName]; set => Data[subName] = value; } public int this[gint subName] { get => Data[subName]; set => Data[subName] = value; } public bool this[gbol subName] { get => Data[subName]; set => Data[subName] = value; } public string this[gstr subName] { get => Data[subName]; set => Data[subName] = value; } public ILine this[string subName] { get => Data[subName]; set => Data[subName] = value; } public bool GetBool(string subName) { return Data.GetBool(subName); } public void SetBool(string subName, bool value) { Data.SetBool(subName, value); } public int GetInt(string subName, int defaultvalue = 0) { return Data.GetInt(subName, defaultvalue); } public void SetInt(string subName, int value) { Data.SetInt(subName, value); } public long GetInt64(string subName, long defaultvalue = 0) { return Data.GetInt64(subName, defaultvalue); } public void SetInt64(string subName, long value) { Data.SetInt64(subName, value); } public FInt64 GetFloat(string subName, FInt64 defaultvalue = default) { return Data.GetFloat(subName, defaultvalue); } public void SetFloat(string subName, FInt64 value) { Data.SetFloat(subName, value); } public DateTime GetDateTime(string subName, DateTime defaultvalue = default) { return Data.GetDateTime(subName, defaultvalue); } public void SetDateTime(string subName, DateTime value) { Data.SetDateTime(subName, value); } public string GetString(string subName, string defaultvalue = null) { return Data.GetString(subName, defaultvalue); } public void SetString(string subName, string value) { Data.SetString(subName, value); } public double GetDouble(string subName, double defaultvalue = 0) { return Data.GetDouble(subName, defaultvalue); } public void SetDouble(string subName, double value) { Data.SetDouble(subName, value); } #endregion } }