public void WriteFiles(DataStream strOut) { // Write every file foreach (GameFile file in this.files) { file.Stream.WriteTo(strOut); strOut.WritePadding(FileSystem.PaddingByte, FileSystem.PaddingAddress); } }
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); } } }
/// <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); }
/// <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; }