private static void ReadSheets(DotHackObject objectType) { var itemtext = GoogleReader.GetNewStringsFromSheet($"{objectType.TextSheetName}"); int newoff = 0; Dictionary <int, int> offsetPairs = new Dictionary <int, int>(); foreach (KeyValuePair <int, string> kvp in itemtext) { if (!offsetPairs.ContainsKey(kvp.Key)) { offsetPairs.Add(kvp.Key, newoff); } Trace.WriteLine(kvp.Key.ToString("X") + "\t" + newoff.ToString("X") + "\t\"" + kvp.Value.Replace("\n", " ") + "\""); newoff += enc.GetBytes(kvp.Value).Length; } var items2 = GoogleReader.GetObjectsFromSheet($"{objectType.DataSheetName}s"); foreach (KeyValuePair <int, List <int> > kvp in items2) { Trace.Write(kvp.Key.ToString("X")); foreach (int p in kvp.Value) { offsetPairs.TryGetValue(p, out int s); Trace.Write("\t" + (objectType.OfflineStringBaseAddress + objectType.OfflineFile.LiveMemoryOffset + p).ToString("X8") + " => " + (objectType.OfflineStringBaseAddress + objectType.OfflineFile.LiveMemoryOffset + s).ToString("X8")); } Trace.WriteLine(""); } }
static void Main(string[] args) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); enc = Encoding.GetEncoding(932); Trace.Listeners.Clear(); TextWriterTraceListener twt1 = new(@".\ViPatchLog.txt"); twt1.Name = "TextLogger"; twt1.TraceOutputOptions = TraceOptions.ThreadId | TraceOptions.DateTime; ConsoleTraceListener ctl = new(false); ctl.TraceOutputOptions = TraceOptions.DateTime; Trace.Listeners.Add(twt1); Trace.Listeners.Add(ctl); Trace.AutoFlush = true; Trace.WriteLine(DateTime.Now.ToString()); #if DEBUG string vanillaISO = @"P:\DotHack\Fragment\Tellipatch\fragment.iso", coldbirdISO = @"P:\DotHack\Fragment\Fragment (Coldbird v08.13).iso", telliISO = @"P:\DotHack\Fragment\Tellipatch\dotHack Fragment (0.91 DEV).iso", aliceISO = @"P:\DotHack\Fragment\Tellipatch\fragmentAlice.iso", inputISO = vanillaISO, outputISO = @"P:\DotHack\Fragment\Tellipatch\fragmentCopy.iso"; #else //string inputISO, outputISO, loc = Assembly.GetExecutingAssembly().Location; string inputISO, outputISO, loc = System.AppContext.BaseDirectory; if (loc == "") { loc = @".\"; } if (args.Length == 0) { inputISO = Path.Combine(Path.GetDirectoryName(loc), "fragment.iso"); outputISO = Path.Combine(Path.GetDirectoryName(loc), "fragmentVi.iso"); } else if (args.Length == 1) { inputISO = CheckFilePath(args[0]); outputISO = inputISO; } else { inputISO = CheckFilePath(args[0]); outputISO = CheckFilePath(args[1]); } #endif textPointerDictionaries = new Dictionary <string, Dictionary <int, int> >(); if (inputISO != outputISO) { if (File.Exists(inputISO)) { CopyFile(inputISO, outputISO); } else { Trace.WriteLine($"Could not find input file \"{inputISO}\" in the current directory."); } } if (File.Exists(outputISO)) { Trace.WriteLine($"Writing patches to: {outputISO}"); Trace.WriteLine("Reading patches from google.."); foreach (DotHackObject obj in GoogleReader.GetObjectsFromPatchSheet()) { UpdateISO(outputISO, obj); } #if Full_Version Trace.WriteLine("Reading WIP patches from google.."); foreach (DotHackObject obj in GoogleReader.GetObjectsFromPatchSheet("WIP Patches")) { UpdateISO(outputISO, obj); } Trace.WriteLine("Reading WIP image patches from google.."); foreach (DotHackObject obj in GoogleReader.GetObjectsFromPatchSheet("IMG Patches")) { UpdateISO(outputISO, obj); } #endif Trace.WriteLine("ISO patched successfully!"); } else { Trace.WriteLine($"Could not find output file \"{outputISO}\" in the current directory."); } }
private static void UpdateISO(string directory, DotHackObject objectType) { bool writeOffline = objectType.OfflineFile.FileName != DotHackFiles.NONE.FileName, writeOnline = objectType.OnlineFile.FileName != DotHackFiles.NONE.FileName; if (writeOffline) { objectType.OfflineFile.ISOLocation = GetFileLocation(directory, objectType.OfflineFile.FileName); } if (writeOnline) { objectType.OnlineFile.ISOLocation = GetFileLocation(directory, objectType.OnlineFile.FileName); } using (FileStream isoStream = File.Open(directory, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) using (BinaryWriter bw = new BinaryWriter(isoStream)) { Dictionary <int, int> offsetPairs = new Dictionary <int, int>(); if (objectType.TextSheetName != "None") { //If we already made the text pointer dictionary we don't need to redo any of this if (!textPointerDictionaries.TryGetValue(objectType.TextSheetName, out offsetPairs)) { Trace.WriteLine($"Patching {objectType.Name} Text.."); Dictionary <int, string> objText = GoogleReader.GetNewStringsFromSheet($"{objectType.TextSheetName}"); offsetPairs = new Dictionary <int, int>(); int newoff = 0; foreach (KeyValuePair <int, string> kvp in objText) { if (objectType.PointerOffsets.Length == 0) { newoff = kvp.Key; } if (!offsetPairs.ContainsKey(kvp.Key)) { offsetPairs.Add(kvp.Key, newoff); } if (writeOffline) { bw.BaseStream.Position = objectType.OfflineFile.ISOLocation + objectType.OfflineStringBaseAddress + newoff; bw.Write(enc.GetBytes(kvp.Value.Replace("\n", "\0").Replace("`", "\n"))); } if (writeOnline) { bw.BaseStream.Position = objectType.OnlineFile.ISOLocation + objectType.OnlineStringBaseAddress + newoff; //Trace.WriteLine($"{(objectType.OnlineStringBaseAddress + newoff).ToString("X")} => {kvp.Value}"); bw.Write(enc.GetBytes(kvp.Value.Replace("\n", "\0").Replace("`", "\n"))); } newoff += enc.GetBytes(kvp.Value).Length; if (newoff > objectType.StringByteLimit) { Trace.WriteLine("Writing outside string bounds!"); } //Trace.WriteLine(objectType.OnlineStringBaseAddress.ToString("X8") +" "+newoff.ToString("X8")); } textPointerDictionaries.Add(objectType.TextSheetName, offsetPairs); } } if (objectType.DataSheetName != "None") { Trace.WriteLine($"Patching {objectType.Name} Data.."); var objs = GoogleReader.GetObjectsFromSheet($"{objectType.DataSheetName}"); foreach (KeyValuePair <int, List <int> > kvp in objs) { for (int i = 0; i < kvp.Value.Count; i++) { int p = kvp.Value[i]; if (p != -1) { //If an object has no text associated, we write the value data directly to the address if (offsetPairs.Count == 0) { if (writeOffline) { bw.BaseStream.Position = objectType.OfflineFile.ISOLocation + objectType.OfflineBaseAddress + kvp.Key + i * 4; bw.Write(LittleEndian((p).ToString("X8"))); } if (writeOnline) { bw.BaseStream.Position = objectType.OnlineFile.ISOLocation + objectType.OnlineBaseAddress + kvp.Key + i * 4; bw.Write(LittleEndian((p).ToString("X8"))); } } else { offsetPairs.TryGetValue(p, out int s); if (writeOffline) { bw.BaseStream.Position = objectType.OfflineFile.ISOLocation + objectType.OfflineBaseAddress + kvp.Key + objectType.PointerOffsets[i]; bw.Write(LittleEndian((objectType.OfflineStringBaseAddress + objectType.OfflineFile.LiveMemoryOffset + s).ToString("X8"))); } if (writeOnline) { bw.BaseStream.Position = objectType.OnlineFile.ISOLocation + objectType.OnlineBaseAddress + kvp.Key + objectType.PointerOffsets[i]; bw.Write(LittleEndian((objectType.OnlineStringBaseAddress + objectType.OnlineFile.LiveMemoryOffset + s).ToString("X8"))); } } } } } } } }