Example #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("");
            }
        }
Example #2
0
        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.");
            }
        }
Example #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")));
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
        }