示例#1
0
        internal Package(AssetLoader loader)
            : base(loader)
        {
            loader.MakeBigEndian();
            BinaryReader reader = Reader = loader.Reader;

            ushort versionMajor = reader.ReadUInt16();
            ushort versionMinor = reader.ReadUInt16();

            reader.RequireZeroes(4);

            int stringCount = reader.ReadInt32();
            Codex <PackageString> strings = new Codex <PackageString>(stringCount);

            for (int index = 0; index < stringCount; index++)
            {
                strings.Add(new PackageString(this, index, reader));
            }
            Strings = strings;

            int fileCount = reader.ReadInt32();

            for (int index = 0; index < fileCount; index++)
            {
                new PackageFile(this, index, loader);
            }
        }
示例#2
0
文件: Rom.cs 项目: layshua/Alexandria
        internal Rom(AssetLoader loader)
            : base(loader)
        {
            BinaryReader reader = Reader = loader.Reader;

            Codex <RomFile>   files   = new Codex <RomFile>();
            Codex <RomFolder> folders = new Codex <RomFolder>();

            Files   = files;
            Folders = folders;

            GameTitle = Reader.ReadStringz(12, Encoding.ASCII);
            GameCode  = Reader.ReadStringz(4, Encoding.ASCII);

            // Offset 0x10
            MakerCode    = Reader.ReadStringz(2, Encoding.ASCII);
            UnitCode     = reader.ReadByte();
            DeviceCode   = reader.ReadByte();
            CardSizeBase = reader.ReadByte();
            loader.ExpectZeroes(1, 7);
            Unknowns.ReadInt32s(reader, 1);             // Usually 0, Alice in Wonderland: 3

            // Offset 0x20
            PageSize = reader.ReadInt32();             // Usually (always?) 0x4000
            Unknowns.ReadInt16s(reader, 2);            // The Dark Spire: 0x800; Trauma Center: 0xF780 (-2176)
            loader.Expect(0x2000000);
            Unknowns.ReadInt32s(reader, 1);            // The Dark Spire: 0x9BEF8; Trauma Center: 0x1DC518

            // Offset 0x30
            Unknowns.ReadInt32s(reader, 1);             // Entry points? The Dark Spire: 0x152200; Trauma Center: 0x1E0600
            loader.Expect(0x2380000);
            loader.Expect(0x2380000);
            Unknowns.ReadInt16s(reader, 1);             // The Dark Spire: 0x6F28; Trauma Center: 0x6F24
            loader.Expect((short)0x2);

            // Offset 0x40
            int fileNameTableOffset = reader.ReadInt32();
            int fileNameTableSize   = reader.ReadInt32();
            int fileSizeTableOffset = reader.ReadInt32();
            int fileSizeTableSize   = reader.ReadInt32();

            // Offset 0x50
            Unknowns.ReadInt32s(reader, 2, "Offset and size");             // Used in The Dark Spire, zeroes in Trauma Center.
            loader.ExpectZeroes(4, 2);

            // Offset 0x60
            Unknowns.ReadInt32s(reader, 2);
            int iconAndTitleOffset = reader.ReadInt32();

            Unknowns.ReadInt32s(reader, 1);

            // Offset 0x70
            Unknowns.ReadInt32s(reader, 2);
            loader.ExpectZeroes(4, 2);

            // Offset 0x80
            DataLength = reader.ReadInt32();
            loader.Expect(PageSize);
            Unknowns.ReadInt32s(reader, 2);             // The Dark Spire: 0x4B68; 0 in Trauma Center.

            ReadIconAndTitle(iconAndTitleOffset);

            if (fileNameTableOffset > 0)
            {
                int folderNamesOffset = reader.ReadInt32At(fileNameTableOffset);
                reader.BaseStream.Position = fileNameTableOffset;
                int folderCount = folderNamesOffset / 8;
                for (int index = 0; index < folderCount; index++)
                {
                    folders.Add(new RomFolder(this, index, reader));
                }
                byte[] folderNames = reader.ReadBytes(fileNameTableSize - folderNamesOffset);

                reader.BaseStream.Position = fileSizeTableOffset;
                int fileCount = fileSizeTableSize / 8;
                for (int index = 0; index < fileCount; index++)
                {
                    files.Add(new RomFile(this, index, reader));
                }

                folders[0].Sort(this, "Root", folderNamesOffset, folderNames);

                FolderAsset orphanedFolders = null, orphanedFiles = null;

                foreach (RomFolder folder in folders)
                {
                    if (folder.Used)
                    {
                        continue;
                    }
                    if (orphanedFolders == null)
                    {
                        orphanedFolders = new FolderAsset(this, "Orphaned folder[s]");
                    }
                    folder.Sort(this, folder.Name, folderNamesOffset, folderNames);
                }

                foreach (RomFile file in files)
                {
                    if (file.Used)
                    {
                        continue;
                    }
                    if (orphanedFiles == null)
                    {
                        orphanedFiles = new FolderAsset(this, "Orphaned file[s]");
                    }
                    file.Sort(orphanedFiles, file.Name);
                }
            }
        }