Esempio n. 1
0
        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("");
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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")));
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
        }