aboutsummaryrefslogtreecommitdiff
path: root/TimeHACK.Engine/SaveSystem.cs
diff options
context:
space:
mode:
Diffstat (limited to 'TimeHACK.Engine/SaveSystem.cs')
-rw-r--r--TimeHACK.Engine/SaveSystem.cs173
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; }
}
}