Exemplo n.º 1
0
 public void WriteFiles(DataStream strOut)
 {
     // Write every file
     foreach (GameFile file in this.files) {
         file.Stream.WriteTo(strOut);
         strOut.WritePadding(FileSystem.PaddingByte, FileSystem.PaddingAddress);
     }
 }
Exemplo n.º 2
0
        private void WriteArm(DataStream str, bool isArm9)
        {
            // Write the ARM file.
            foreach (GameFile file in this.sysFolder.Files) {
                ArmFile arm = file as ArmFile;
                if (arm == null || arm.IsArm9 != isArm9)
                    continue;

                // Writes to this Stream but sets the its address after RomHeader
                arm.UpdateAndWrite(str, this.header, this.header.HeaderSize);
                str.WritePadding(FileSystem.PaddingByte, FileSystem.PaddingAddress);
            }

            // Writes the overlay table and overlays
            foreach (GameFolder folder in this.sysFolder.Folders) {
                OverlayFolder overlayFolder = folder as OverlayFolder;
                if (overlayFolder == null || overlayFolder.IsArm9 != isArm9)
                    continue;

                // Writes overlay info
                overlayFolder.WriteTable(str, this.header, this.header.HeaderSize);
                str.WritePadding(FileSystem.PaddingByte, FileSystem.PaddingAddress);

                // Write overlays
                foreach (GameFile file in overlayFolder.Files) {
                    OverlayFile overlay = file as OverlayFile;
                    if (overlay == null)
                        continue;

                    overlay.WriteAddress = (uint)(this.header.HeaderSize + str.Position);
                    overlay.Stream.WriteTo(str);
                    str.WritePadding(FileSystem.PaddingByte, FileSystem.PaddingAddress);
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Write the banner to a stream.
        /// </summary>
        /// <param name="str">Stream to write to.</param>
        public override void Write(DataStream str)
        {
            DataWriter dw = new DataWriter(str, EndiannessMode.LittleEndian, Encoding.Unicode);

            dw.Write(this.version);
            dw.Write(this.crc16);
            dw.Write(this.crc16v2);
            dw.Write(this.reserved);
            dw.Write(this.tileData);
            dw.Write(this.palette);
            dw.Write(this.japaneseTitle, 0x100);
            dw.Write(this.englishTitle,  0x100);
            dw.Write(this.frenchTitle,   0x100);
            dw.Write(this.germanTitle,   0x100);
            dw.Write(this.italianTitle,  0x100);
            dw.Write(this.spanishTitle,  0x100);

            str.WritePadding(FileSystem.PaddingByte, FileSystem.PaddingAddress);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Write the file system to the stream.
        /// </summary>
        /// <param name="str">Stream to write to.</param>
        public override void Write(DataStream str)
        {
            // The order is: ARM9 - Overlays9 - ARM7 - Overlays7 - FNT - FAT
            this.WriteArm(str, true);	// Write ARM9
            this.WriteArm(str, false);	// Write ARM7

            // To get the first ROM file ID
            int numOverlays = this.CountOverlays(false) + this.CountOverlays(true);

            // Create a new File Name Table...
            Fnt fnt = new Fnt();
            fnt.Initialize(null, this.root, numOverlays);

            // ... and writes it
            this.header.FntOffset = (uint)(this.header.HeaderSize + str.Position);
            long fntStartOffset = str.Position;
            fnt.Write(str);
            this.header.FntSize = (uint)(str.Position - fntStartOffset);
            str.WritePadding(FileSystem.PaddingByte, FileSystem.PaddingAddress);

            // Create a temp dir with every file to be register in the FAT (Game + System)
            GameFolder tmpFolder = new GameFolder(string.Empty);
            tmpFolder.AddFolders(this.sysFolder.Folders);	// Overlay folders
            tmpFolder.AddFolder(this.root);					// Game files

            // Write File Allocation Table
            Fat fat = new Fat();
            fat.Initialize(null, tmpFolder, Banner.Size + this.header.HeaderSize);	// First file offset after banner
            this.header.FatOffset = (uint)(this.header.HeaderSize + str.Position);
            fat.Write(str);
            str.WritePadding(FileSystem.PaddingByte, FileSystem.PaddingAddress);
            this.header.FatSize = fat.Size;
        }