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(""); } }
public static List <DotHackObject> GetObjectsFromPatchSheet(string patchSheet = "Patches") { List <DotHackObject> objects = new(); var assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream(ConnectionJson)) { credential = GoogleCredential.FromStream(stream).CreateScoped(Scopes); } using (service = new SheetsService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = ApplicationName, })) { var stringsByOffset = new Dictionary <int, string>(); var range = $"{patchSheet}!A2:V"; var request = service.Spreadsheets.Values.Get(SpreadsheetId, range); var response = request.Execute(); var values = response.Values; if (values != null && values.Count > 0) { foreach (var row in values) { DotHackObject o = new DotHackObject() { Name = (string)row[0], DataSheetName = (string)row[1], TextSheetName = (string)row[2], OfflineFile = DotHackFiles.GetFileByName((string)row[3]), OnlineFile = DotHackFiles.GetFileByName((string)row[4]), OfflineBaseAddress = int.Parse((string)row[5], NumberStyles.HexNumber), OnlineBaseAddress = int.Parse((string)row[6], NumberStyles.HexNumber), OfflineStringBaseAddress = int.Parse((string)row[7], NumberStyles.HexNumber), OnlineStringBaseAddress = int.Parse((string)row[8], NumberStyles.HexNumber), ObjectReadLength = int.Parse((string)row[9], NumberStyles.HexNumber), ObjectCount = int.Parse((string)row[10]), StringByteLimit = int.Parse((string)row[11], NumberStyles.HexNumber), PointerOffsets = new int[row.Count - 12] }; for (int i = 0; i < o.PointerOffsets.Length; i++) { o.PointerOffsets[i] = int.Parse((string)row[12 + i], NumberStyles.HexNumber); } objects.Add(o); } } } return(objects); }
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"))); } } } } } } } }