public static void ExportFont(Stream stream, string outputFile) { var reader = new BINAReader(stream); reader.ReadHeader(); var sig = reader.ReadSignature(8); if (sig != "KFCS1000") { throw new InvalidSignatureException("KFCS1000", sig); } var fontName = reader.GetString(); reader.JumpAhead(4); reader.JumpAhead(0x10); var length = reader.ReadInt64(); var fntSig = reader.ReadSignature(); outputFile = fntSig == "OTTO" ? Path.ChangeExtension(outputFile, ".otf") : Path.ChangeExtension(outputFile, ".ttf"); var data = reader.ReadBytes((int)length - 4); using (var fntStream = File.Create(outputFile)) { fntStream.Write(Encoding.Default.GetBytes(fntSig), 0, 4); fntStream.Write(data, 0, data.Length); } }
// Methods public override void Load(Stream fileStream) { // BINA Header var reader = new BINAReader(fileStream); Header = reader.ReadHeader(); string sig = reader.ReadSignature(4); if (sig != Signature) { throw new InvalidSignatureException(Signature, sig); } var unknown1 = reader.ReadUInt32(); //Might be part of the Header according to Skyth's spec? if (unknown1 != 1) { Console.WriteLine($"Unknown1 does not equal 1 in this file! It's actually set to {unknown1}"); } var shapeCount = reader.ReadInt64(); var unknown2 = reader.ReadUInt64(); if (unknown2 != 24) { Console.WriteLine($"Unknown1 does not equal 24 in this file! It's actually set to {unknown1}"); } Console.WriteLine(unknown2); for (int i = 0; i < shapeCount; i++) { SvShape shape = new SvShape(); var shapeNameOffset = reader.ReadInt64(); long pos = reader.BaseStream.Position; reader.JumpTo(shapeNameOffset, false); shape.Name = reader.ReadNullTerminatedString(); reader.JumpTo(pos, true); shape.Unknown1 = reader.ReadUInt32(); shape.Size = reader.ReadVector3(); shape.Position = reader.ReadVector3(); shape.Rotation = reader.ReadQuaternion(); shape.BoundingBox.Minimum = reader.ReadVector3(); shape.BoundingBox.Maximum = reader.ReadVector3(); shape.Unknown2 = reader.ReadUInt32(); var sectorCount = reader.ReadInt64(); var sectorListOffset = reader.ReadInt64(); pos = reader.BaseStream.Position; reader.JumpTo(sectorListOffset, false); for (int s = 0; s < sectorCount; s++) { SvSector sector = new SvSector(); sector.SectorIndex = reader.Read(); sector.Visible = reader.ReadBoolean(); shape.Sectors.Add(sector); } reader.JumpTo(pos, true); SvShapes.Add(shape); } }
public override void Load(Stream fileStream) { // Header var reader = new BINAReader(fileStream); Header = reader.ReadHeader(); string sig = reader.ReadSignature(4); if (sig != Signature) { throw new InvalidSignatureException(Signature, sig); } uint unknown1 = reader.ReadUInt32(); //Probably Flags according to Rad's Spec if (unknown1 != 537265920) { Console.WriteLine($"unknown1 does not equal 537265920! Actually equals {unknown1}!"); } uint bankNameOffset = reader.ReadUInt32(); //Offset to the Scene Bank name uint cueNameOffset = reader.ReadUInt32(); //Offset of the first entry in the Scene Bank uint cueIndiciesOffset = reader.ReadUInt32(); //Offset to the number list for non stream indexs uint streamOffset = reader.ReadUInt32(); //Offset to the table for xma names Name = reader.ReadChars(64); //Scene Bank's name uint cueCount = reader.ReadUInt32(); //Total Number of Cues in this Scene Bank uint csbCueCount = reader.ReadUInt32(); //Amount of Cues in this Scene Bank which pull their data from a corrosponding CSB file uint streamCueCount = reader.ReadUInt32(); //Amount of Cues in this Scene Bank which use XMA files int streams = 0; for (uint i = 0; i < cueCount; i++) { Cue cue = new Cue() { Name = reader.ReadChars(32) }; uint cueType = reader.ReadUInt32(); uint cueIndex = reader.ReadUInt32(); cue.Category = reader.ReadUInt32(); cue.Unknown1 = reader.ReadSingle(); cue.Unknown2 = reader.ReadSingle(); if (cueType == 1) { long pos = reader.BaseStream.Position; //Save position reader.JumpTo(streamOffset, false); reader.JumpAhead(4 * streams); //Jump ahead to the right offset for our Cue's XMA reader.JumpTo(reader.ReadUInt32(), false); cue.Stream = reader.ReadNullTerminatedString(); //Read the XMA's name for this Cue reader.JumpTo(pos, true); //Jump back to where we were streams++; } Cues.Add(cue); //Save Cue to list } }
// Methods public override void Load(Stream fileStream) { // Header var reader = new BINAReader(fileStream); Header = reader.ReadHeader(); string sig = reader.ReadSignature(4); if (sig != Signature) { throw new InvalidSignatureException(Signature, sig); } uint messageTableOffset = reader.ReadUInt32(); uint messageCount = reader.ReadUInt32(); long namePos = reader.BaseStream.Position; reader.JumpTo(messageTableOffset, false); Name = reader.ReadNullTerminatedString(); reader.JumpTo(namePos, true); for (uint i = 0; i < messageCount; i++) { string name = string.Empty; string text = string.Empty; string placeholder = string.Empty; uint nameOffset = reader.ReadUInt32(); uint textOffset = reader.ReadUInt32(); uint placeholderOffset = reader.ReadUInt32(); long pos = reader.BaseStream.Position; reader.JumpTo(nameOffset, false); name = reader.ReadNullTerminatedString(); reader.JumpTo(textOffset, false); text = reader.ReadNullTerminatedStringUTF16(); if (placeholderOffset != 0) { reader.JumpTo(placeholderOffset, false); placeholder = reader.ReadNullTerminatedString(); } MSTEntries entry = new MSTEntries(name, text, placeholder); entries.Add(entry); reader.JumpTo(pos, true); } }
// Methods public override void Load(Stream fileStream) { // BINA Header var reader = new BINAReader(fileStream); Header = reader.ReadHeader(); string sig = reader.ReadSignature(4); if (sig != Signature) { throw new InvalidSignatureException(Signature, sig); } var unknown1 = reader.ReadUInt32(); //Might be part of the Header if Skyth's svcol spec is anything to go on? }
public override void Load(Stream fileStream) { // Header var reader = new BINAReader(fileStream); reader.ReadHeader(); string sig = reader.ReadSignature(4); if (sig != Signature) { throw new InvalidSignatureException(Signature, sig); } uint texturePos = reader.ReadUInt32(); uint placeholderEntries = reader.ReadUInt32(); reader.JumpTo(reader.ReadUInt32(), false); long pos = reader.BaseStream.Position; // Texture reader.JumpTo(texturePos, false); string texture = reader.ReadNullTerminatedString(); reader.JumpTo(pos, true); // Placeholders for (uint i = 0; i < placeholderEntries; ++i) { S06FontPictureUV fontPicture = new S06FontPictureUV(); Texture = texture; uint placeholderEntry = reader.ReadUInt32(); fontPicture.X = reader.ReadUInt16(); fontPicture.Y = reader.ReadUInt16(); fontPicture.Width = reader.ReadUInt16(); fontPicture.Height = reader.ReadUInt16(); pos = reader.BaseStream.Position; reader.JumpTo(placeholderEntry, false); fontPicture.Placeholder = reader.ReadNullTerminatedString(); reader.JumpTo(pos, true); Entries.Add(fontPicture); } }
// Methods public override void Load(Stream fileStream) { // Header var reader = new BINAReader(fileStream); Header = reader.ReadHeader(); string sig = reader.ReadSignature(4); if (sig != Signature) { throw new InvalidSignatureException(Signature, sig); } uint unknown1 = reader.ReadUInt32(); uint soundEntryCount = reader.ReadUInt32(); uint soundEntriesOffset = reader.ReadUInt32(); // Data SoundEntries = new string[soundEntryCount]; var soundNameOffsets = new uint[soundEntryCount]; reader.JumpTo(soundEntriesOffset, false); // We read the offsets first and then the names to avoid unnecessary seeking. for (uint i = 0; i < soundEntryCount; ++i) { uint soundEntryIndex = reader.ReadUInt32(); soundNameOffsets[soundEntryIndex] = reader.ReadUInt32(); } for (uint i = 0; i < soundEntryCount; ++i) { reader.JumpTo(soundNameOffsets[i], false); SoundEntries[i] = reader.ReadNullTerminatedString(); } }