Esempio n. 1
0
        public void Read(EndianBinaryReader reader)
        {
            XData = new XData(reader);
            if (!XData.isValid())
            {
                return;
            }

            Version = reader.ReadBytes(4);
            int namespaceCount = reader.ReadInt32() - 1;

            reader.BaseStream.Seek(4, SeekOrigin.Current);
            int  scriptCount = reader.ReadInt32();
            uint scriptList  = reader.ReadUInt32();
            uint unk         = reader.ReadUInt32();

            reader.BaseStream.Seek(0x30, SeekOrigin.Begin);
            RootNamespaces = reader.ReadUInt32();

            Console.WriteLine($"Archive Header Data:" +
                              $"\n-XData-" +
                              $"\nMagic: {XData.Magic}" +
                              $"\nEndianness: {XData.Endianness}" +
                              $"\nFilesize: 0x{XData.Filesize:X8}" +
                              $"\n-Mint Archive-" +
                              $"\nVersion: {string.Join(".", Version)}" +
                              $"\nNamespaces: {namespaceCount}" +
                              $"\nRoot Namespaces: {RootNamespaces}" +
                              $"\nScripts: {scriptCount}" +
                              $"\nScript List Offset: 0x{scriptList:X8}" +
                              $"\nIndex Table Offset: 0x{0x34 + (namespaceCount * 0x14):X8}");

            Console.WriteLine("Reading Namespaces...");
            Namespaces = new List <Namespace>();
            for (int i = 0; i < namespaceCount; i++)
            {
                reader.BaseStream.Seek(0x34 + (i * 0x14), SeekOrigin.Begin);
                uint indexOffset   = reader.ReadUInt32();
                uint nameOffset    = reader.ReadUInt32();
                int  scrCount      = reader.ReadInt32();
                int  totalScripts  = reader.ReadInt32();
                int  childrenCount = reader.ReadInt32();

                reader.BaseStream.Seek(indexOffset, SeekOrigin.Begin);
                int index = reader.ReadInt32();
                reader.BaseStream.Seek(nameOffset, SeekOrigin.Begin);
                string name = Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadInt32()));

                Namespaces.Add(new Namespace(index, name, scrCount, totalScripts, childrenCount));
            }

            Console.WriteLine("Reading index table...");
            IndexTable = new List <int>();
            reader.BaseStream.Seek(0x34 + (namespaceCount * 0x14), SeekOrigin.Begin);
            while (reader.BaseStream.Position < scriptList)
            {
                IndexTable.Add(reader.ReadInt32());
            }
            //Console.WriteLine(string.Join(",", IndexTable));

            Console.WriteLine("Reading scripts...");
            Scripts = new Dictionary <string, MintScript>();
            reader.BaseStream.Seek(scriptList, SeekOrigin.Begin);
            for (int i = 0; i < scriptCount; i++)
            {
                reader.BaseStream.Seek(scriptList + (i * 8), SeekOrigin.Begin);
                uint nameOffset   = reader.ReadUInt32();
                uint scriptOffset = reader.ReadUInt32();

                reader.BaseStream.Seek(nameOffset, SeekOrigin.Begin);
                string name = Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadInt32()));

                reader.BaseStream.Seek(scriptOffset, SeekOrigin.Begin);
                XData scrX = new XData(reader);
                reader.BaseStream.Seek(scriptOffset, SeekOrigin.Begin);

                using (MemoryStream scr = new MemoryStream(reader.ReadBytes((int)scrX.Filesize)))
                    using (EndianBinaryReader scrReader = new EndianBinaryReader(scr))
                        Scripts.Add(name, new MintScript(new EndianBinaryReader(scr), Version));
            }

            reader.BaseStream.Seek(unk, SeekOrigin.Begin);
            //Console.WriteLine(reader.ReadUInt32());
        }