diff options
Diffstat (limited to 'TimeHACK.Engine/SaveSystem.cs')
| -rw-r--r-- | TimeHACK.Engine/SaveSystem.cs | 173 |
1 files changed, 119 insertions, 54 deletions
diff --git a/TimeHACK.Engine/SaveSystem.cs b/TimeHACK.Engine/SaveSystem.cs index 2745738..f08e637 100644 --- a/TimeHACK.Engine/SaveSystem.cs +++ b/TimeHACK.Engine/SaveSystem.cs @@ -14,6 +14,9 @@ using Newtonsoft.Json; using System.Diagnostics; using System.Windows.Forms; using System.Runtime.CompilerServices; +using System.Drawing; +using System.Text.RegularExpressions; +using System.Runtime.InteropServices; namespace TimeHACK.Engine { @@ -130,6 +133,7 @@ namespace TimeHACK.Engine { save.CurrentOS = "95"; save.ThemeName = "default95"; + save.BytesLeft = 536870912; currentTheme = new Default95Theme(); } } @@ -137,6 +141,7 @@ namespace TimeHACK.Engine { save.CurrentOS = "95"; save.ThemeName = "default95"; + save.BytesLeft = 536870912; currentTheme = new Default95Theme(); } CurrentSave = save; @@ -147,53 +152,78 @@ namespace TimeHACK.Engine public static void CheckFiles() { - if (!Directory.Exists(GameDirectory)) - Directory.CreateDirectory(GameDirectory); - - if (!Directory.Exists(AllProfilesDirectory)) - Directory.CreateDirectory(AllProfilesDirectory); - - if (!Directory.Exists(ProfileDirectory)) - Directory.CreateDirectory(ProfileDirectory); - - if (!Directory.Exists(ProfileFileSystemDirectory)) - Directory.CreateDirectory(ProfileFileSystemDirectory); - - SaveDirectoryInfo(ProfileFileSystemDirectory, false, "My Computer", false); - SaveDirectoryInfo(ProfileMyComputerDirectory, false, "Win95 (C:)", true); - if (CurrentSave.CurrentOS == "95" || CurrentSave.CurrentOS == "98") SaveDirectoryInfo(ProfileDocumentsDirectory, false, "My Documents", true); - if (CurrentSave.CurrentOS == "2000" || CurrentSave.CurrentOS == "ME") SaveDirectoryInfo(ProfileSettingsDirectory, false, "Documents and Settings", true); - SaveDirectoryInfo(ProfileProgramsDirectory, true, "Program Files", true); - SaveDirectoryInfo(Path.Combine(ProfileProgramsDirectory, "Accessories"), false, "Accessories", true); - SaveDirectoryInfo(Path.Combine(ProfileProgramsDirectory, "Internet Explorer"), true, "Internet Explorer", true); - SaveDirectoryInfo(Path.Combine(ProfileProgramsDirectory, "The Microsoft Network"), true, "The Microsoft Network", true); - SaveDirectoryInfo(ProfileWindowsDirectory, true, "Windows", true); - - CreateWindowsFile(Path.Combine(ProfileProgramsDirectory, "Accessories", "wordpad.exe"), "wordpad"); - CreateWindowsFile(Path.Combine(ProfileProgramsDirectory, "Internet Explorer", "ie20.exe"), "ie"); - CreateWindowsFile(Path.Combine(ProfileProgramsDirectory, "Internet Explorer", "lnfinst.exe"), "iebrokeninstaller"); - CreateWindowsFile(Path.Combine(ProfileProgramsDirectory, "The Microsoft Network", "msnver.txt"), "5900"); + Directory.CreateDirectory(GameDirectory); + Directory.CreateDirectory(AllProfilesDirectory); + Directory.CreateDirectory(ProfileDirectory); + Directory.CreateDirectory(ProfileFileSystemDirectory); + + SaveDirectoryInfo(ProfileDirectory, "folders", false, "My Computer", false); + SaveDirectoryInfo(ProfileFileSystemDirectory, "CDrive", false, "C:", true); + if (CurrentSave.CurrentOS == "95" || CurrentSave.CurrentOS == "98") SaveDirectoryInfo(ProfileMyComputerDirectory, "Doc", false, "My Documents", true); + if (CurrentSave.CurrentOS == "2000" || CurrentSave.CurrentOS == "ME") SaveDirectoryInfo(ProfileMyComputerDirectory, "Settings", false, "Documents and Settings", true); + SaveDirectoryInfo(ProfileMyComputerDirectory, "Prog", true, "Program Files", true); + SaveDirectoryInfo(ProfileProgramsDirectory, "Accessories", false, "Accessories", true); + SaveDirectoryInfo(ProfileProgramsDirectory, "Internet Explorer", true, "Internet Explorer", true); + SaveDirectoryInfo(ProfileProgramsDirectory, "The Microsoft Network", true, "The Microsoft Network", true); + SaveDirectoryInfo(ProfileMyComputerDirectory, "Win", true, "Windows", true); + + CreateWindowsFile(Path.Combine(ProfileProgramsDirectory, "Accessories"), "wordpad.exe", "wordpad"); + CreateWindowsFile(Path.Combine(ProfileProgramsDirectory, "Internet Explorer"), "ie20.exe", "ie"); + CreateWindowsFile(Path.Combine(ProfileProgramsDirectory, "Internet Explorer"), "lnfinst.exe", "iebrokeninstaller"); + CreateWindowsFile(Path.Combine(ProfileProgramsDirectory, "The Microsoft Network"), "msnver.txt", "5900"); CreateWindowsDirectory(); } public static void CreateWindowsDirectory() { - SaveDirectoryInfo(Path.Combine(ProfileWindowsDirectory, "System"), true, "System", true); - SaveDirectoryInfo(Path.Combine(ProfileWindowsDirectory, "Config"), true, "Config", true); - SaveDirectoryInfo(Path.Combine(ProfileWindowsDirectory, "Cursors"), true, "Cursors", true); - SaveDirectoryInfo(Path.Combine(ProfileWindowsDirectory, "Fonts"), true, "Fonts", true); - SaveDirectoryInfo(Path.Combine(ProfileWindowsDirectory, "Help"), true, "Help", true); - SaveDirectoryInfo(Path.Combine(ProfileWindowsDirectory, "Temp"), true, "Temp", true); - SaveDirectoryInfo(Path.Combine(ProfileWindowsDirectory, "Desktop"), true, "Desktop", true); - - CreateWindowsFile(Path.Combine(ProfileWindowsDirectory, "calc.exe"), "calc"); - CreateWindowsFile(Path.Combine(ProfileWindowsDirectory, "explorer.exe"), "explorer"); + SaveDirectoryInfo(ProfileWindowsDirectory, "System", true, "System", true); + SaveDirectoryInfo(ProfileWindowsDirectory, "Config", true, "Config", true); + SaveDirectoryInfo(ProfileWindowsDirectory, "Cursors", true, "Cursors", true); + SaveDirectoryInfo(ProfileWindowsDirectory, "Fonts", true, "Fonts", true); + SaveDirectoryInfo(ProfileWindowsDirectory, "Help", true, "Help", true); + SaveDirectoryInfo(ProfileWindowsDirectory, "Temp", true, "Temp", true); + SaveDirectoryInfo(ProfileWindowsDirectory, "Desktop", true, "Desktop", true); + + CreateWindowsFile(ProfileWindowsDirectory, "calc.exe", "calc", bytes: 59392); + CreateWindowsFile(ProfileWindowsDirectory, "explorer.exe", "explorer", bytes:204288); } - public static void CreateWindowsFile(string filepath, string contents) + public static void CreateWindowsFile(string filepath, string filename, string contents, int fileicon = 8, int bytes = 512) { - File.WriteAllText(filepath, contents); + File.WriteAllText(Path.Combine(filepath, filename), contents); + THFileInfo info = new THFileInfo(); + info.Name = filename; + info.FileIcon = fileicon; + info.ByteSize = bytes; + CurrentSave.BytesLeft -= bytes; + UpdateDirectoryInfo(filepath, info); + } + + public static void UpdateDirectoryInfo(string path, THFileInfo newfile) + { + newfile.DOSName = newfile.Name.ToUpper().Replace("*", "").Replace("+", "").Replace(":", "").Replace(";", "").Replace(" ", ""); + string[] dos = newfile.DOSName.Split('.'); + + if (dos.Count() > 2) + { + List<string> dosb = dos.ToList(); + dosb.RemoveRange(1, dos.Count() - 2); + dos = dosb.ToArray(); + } + dos[1] = dos[1].Substring(0, 3); + if (dos[0].Length > 8) dos[0] = dos[0].Substring(0, 6) + "~1"; + + newfile.DOSName = dos[0] + "." + dos[1]; + + if (File.ReadAllText(Path.Combine(path, "_data.info")).Contains(newfile.DOSName)) return; + FileSystemFolderInfo fsfi = JsonConvert.DeserializeObject<FileSystemFolderInfo>(File.ReadAllText(Path.Combine(path, "_data.info"))); + fsfi.Files.Add(newfile); + fsfi.ByteSize += newfile.ByteSize; + + string toWrite = JsonConvert.SerializeObject(fsfi, Formatting.Indented); + + File.WriteAllText(Path.Combine(path, "_data.info"), toWrite); } public static void UpgradeFileSystem(string oldOS, string newOS) @@ -207,14 +237,10 @@ namespace TimeHACK.Engine // All the above OSes share basically the same file layout! // (Excluding Documents And Settings) which is 2000 and ME only - // Rename the C Drive to Win98 - - SaveDirectoryInfo(ProfileMyComputerDirectory, false, "Win98 (C:)", true); - // Add Address Book into existance! - SaveDirectoryInfo(Path.Combine(ProfileProgramsDirectory, "Outlook Express"), false, "Outlook Express", true); - CreateWindowsFile(Path.Combine(ProfileProgramsDirectory, "Outlook Express", "WAB.exe"), "addressbook"); + SaveDirectoryInfo(ProfileProgramsDirectory, "Outlook Express", false, "Outlook Express", true); + CreateWindowsFile(Path.Combine(ProfileProgramsDirectory, "Outlook Express"), "WAB.exe", "addressbook"); // There is no "The Microsoft Network" folder! @@ -224,20 +250,38 @@ namespace TimeHACK.Engine } } - public static void SaveDirectoryInfo(string directory, bool isProtected, string label, bool allowback) + public static void SaveDirectoryInfo(string parent, string dirname, bool isProtected, string label, bool allowback) { - if (!Directory.Exists(directory)) - Directory.CreateDirectory(directory); + if (Directory.Exists(Path.Combine(parent, dirname)) && Path.Combine(parent, dirname) != ProfileFileSystemDirectory) return; + Directory.CreateDirectory(Path.Combine(parent, dirname)); FileSystemFolderInfo info = new FileSystemFolderInfo(); - info.Isprotected = isProtected; - info.label = label; - info.allowback = allowback; + info.IsProtected = isProtected; + info.Label = label; + + info.DOSLabel = info.Label.ToUpper().Replace("*", "").Replace("+", "").Replace(":", "").Replace(";", "").Replace(".", "").Replace(" ", ""); + if (info.DOSLabel.Length > 8) info.DOSLabel = info.DOSLabel.Substring(0, 6) + "~1"; + if (dirname == "C:") info.DOSLabel = "C:"; + info.AllowBack = allowback; + info.Files = new List<THFileInfo>(256); + info.SubDirs = new List<THDirInfo>(256); + info.ByteSize = 0; + + if (parent != ProfileDirectory) + { + FileSystemFolderInfo fsfi = JsonConvert.DeserializeObject<FileSystemFolderInfo>(File.ReadAllText(Path.Combine(parent, "_data.info"))); + THDirInfo thd = new THDirInfo(); + thd.Name = info.Label; + thd.DOSName = info.DOSLabel; + fsfi.SubDirs.Add(thd); + + File.WriteAllText(Path.Combine(parent, "_data.info"), JsonConvert.SerializeObject(fsfi, Formatting.Indented)); + } string toWrite = JsonConvert.SerializeObject(info, Formatting.Indented); - File.WriteAllText(Path.Combine(directory, "_data.info"), toWrite); + File.WriteAllText(Path.Combine(Path.Combine(parent, dirname), "_data.info"), toWrite); } #if BINARY_SAVE @@ -599,12 +643,33 @@ namespace TimeHACK.Engine [Order] public string ThemeName { get; set; } + + [Order] + public int BytesLeft { get; set; } } public class FileSystemFolderInfo { - public bool Isprotected { get; set; } - public string label { get; set; } - public bool allowback { get; set; } + public bool IsProtected { get; set; } + public string Label { get; set; } + public string DOSLabel { get; set; } + public bool AllowBack { get; set; } + public int ByteSize { get; set; } + public List<THFileInfo> Files { get; set; } + public List<THDirInfo> SubDirs { get; set; } + } + + public class THFileInfo + { + public string Name { get; set; } + public string DOSName { get; set; } + public int FileIcon { get; set; } + public int ByteSize { get; set; } + } + + public class THDirInfo + { + public string Name { get; set; } + public string DOSName { get; set; } } } |
