// Constructors public EffectData(BINAReader reader) { EffectName = reader.GetString(); reader.JumpAhead(12); LinkMotionStop = reader.ReadBoolean(); reader.JumpAhead(7); }
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); } }
// Constructors public MotionData(BINAReader reader) { MotionName = reader.GetString(); reader.JumpAhead(12); SyncFrame = reader.ReadBoolean(); StopEndFrame = reader.ReadBoolean(); reader.JumpAhead(6); }
// Constructors public KillData(BINAReader reader) { KillType = (KillTypes)reader.ReadUInt32(); KillTime = reader.ReadSingle(); BreakMotionName = reader.GetString(); reader.JumpAhead(12); _DebrisData = new DebrisData(reader); reader.JumpAhead(4); }
// Methods public void Read(BINAReader reader) { _MotionData = new MotionData(reader); _MirageAnimData = new MirageAnimData(reader); reader.JumpAhead(8); _ProgramMotionData = new ProgramMotionData(reader); _EffectData = new EffectData(reader); _SoundData = new SoundData(reader); _KillData = new KillData(reader); reader.JumpAhead(8); }
// Constructors public ProgramMotionData(BINAReader reader) { MotionType = (MotionTypes)reader.ReadUInt32(); reader.JumpAhead(12); Axis = reader.ReadVector3(); reader.JumpAhead(4); Power = reader.ReadSingle(); SpeedScale = reader.ReadSingle(); Time = reader.ReadSingle(); reader.JumpAhead(4); }
public override void Load(Stream fileStream) { // Header var reader = new BINAReader(fileStream); Header = reader.ReadHeader(); long namePositionHack = reader.BaseStream.Position; reader.JumpAhead(0xC); prop.Name = reader.ReadNullTerminatedString(); reader.JumpTo(namePositionHack, true); reader.JumpTo(0x4c, true); prop.ObjectCount = reader.ReadUInt32(); reader.JumpAhead(0x4); for (uint i = 0; i < prop.ObjectCount; i++) { S06PropObject obj = new S06PropObject(); var objectNameOffset = reader.ReadUInt32(); obj.ObjectParameterCount = reader.ReadUInt32(); var paramOffset = reader.ReadUInt32(); obj.ObjectUnknown1 = reader.ReadUInt32(); obj.ObjectUnknown2 = reader.ReadUInt32(); long position = reader.BaseStream.Position; reader.JumpTo(objectNameOffset, false); obj.ObjectName = reader.ReadNullTerminatedString(); for (uint c = 0; c < obj.ObjectParameterCount; c++) { reader.JumpTo(paramOffset + (c * 0x18), false); S06PropParameter parameter = new S06PropParameter(); parameter.ParameterName = reader.ReadNullTerminatedString(); reader.JumpTo(paramOffset + (c * 0x18) + 0x10, false); parameter.ParameterType = reader.ReadUInt32(); parameter.ParameterID = reader.ReadUInt32(); obj.Parameters.Add(parameter); } prop.Objects.Add(obj); reader.JumpTo(position, true); } }
public override void Load(Stream fileStream) { // Header var reader = new BINAReader(fileStream); Header = reader.ReadHeader(); VertexCountOffsetOffset = reader.ReadUInt32(); //Refered to in LibS06 as `geometry_address` PostFaceOffset = reader.ReadUInt32(); //Refered to in LibS06 as `mopp_code_address` VertexCountOffset = reader.ReadUInt32(); //Refered to in LibS06 as `vertex_section_address` FaceCountOffset = reader.ReadUInt32(); //Refered to in LibS06 as `face_section_address` VertexCount = reader.ReadUInt32(); //Vertexes for (int i = 0; i < VertexCount; i++) { Vertices.Add(reader.ReadVector3()); } //Faces FaceCount = reader.ReadUInt32(); for (int i = 0; i < FaceCount; i++) { S06CollisionFace face = new S06CollisionFace(); face.Vertex1 = reader.ReadUInt16(); face.Vertex2 = reader.ReadUInt16(); face.Vertex3 = reader.ReadUInt16(); reader.JumpAhead(2); face.Flags = reader.ReadUInt32(); Faces.Add(face); } }
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 void Read(BINAReader reader) { uint id = reader.ReadUInt32(); long dataSize = reader.ReadInt64(); reader.JumpAhead(4); DataOffset = reader.ReadInt64(); reader.JumpAhead(8); ExtensionOffset = reader.ReadInt64(); DataType = (DataEntryTypes)reader.ReadUInt64(); if (DataType != DataEntryTypes.NotHere) { Data = new byte[dataSize]; } }
// Constructors public MirageAnimData(BINAReader reader) { TextureSrtAnimName0 = reader.GetString(); reader.JumpAhead(12); TextureSrtAnimName1 = reader.GetString(); reader.JumpAhead(12); TextureSrtAnimName2 = reader.GetString(); reader.JumpAhead(12); TexturePatAnimName0 = reader.GetString(); reader.JumpAhead(12); TexturePatAnimName1 = reader.GetString(); reader.JumpAhead(12); TexturePatAnimName2 = reader.GetString(); reader.JumpAhead(12); MaterialAnimName0 = reader.GetString(); reader.JumpAhead(12); MaterialAnimName1 = reader.GetString(); reader.JumpAhead(12); MaterialAnimName2 = reader.GetString(); reader.JumpAhead(12); }
// Methods public override void Load(Stream fileStream) { var reader = new BINAReader(fileStream); Header = reader.ReadHeader(); IsBigEndian = reader.IsBigEndian; System.Console.WriteLine(reader.BaseStream.Position); RangeIn = reader.ReadSingle(); // Unused RangeDistance = reader.ReadSingle(); // Unused ModelName = reader.GetString(); reader.JumpAhead(12); SkeletonName = reader.GetString(); reader.JumpAhead(12); BoundingShape = (BoundingShapes)reader.ReadUInt32(); BoundingSize = reader.ReadVector3(); MeshName = reader.GetString(); reader.JumpAhead(20); ShapeOffset = reader.ReadVector3(); reader.JumpAhead(4); ShapeSizeOffset = reader.ReadSingle(); RigidBodyType = (RigidBodyTypes)reader.ReadByte(); RigidBodyMaterial = (RigidBodyMaterials)reader.ReadByte(); reader.JumpAhead(2); _PhysicsParam = new PhysicsParam(reader); ContactDamageType = (ContactDamageTypes)reader.ReadByte(); RideOnDamage = reader.ReadBoolean(); AerialBounce = reader.ReadBoolean(); reader.JumpAhead(9); // ReactionData for (uint i = 0; i < ReactionDataCount; i++) { _ReactionData[i] = new ReactionData(reader); } }
// Constructors public SoundData(BINAReader reader) { CueName = reader.GetString(); reader.JumpAhead(12); }
// Methods public override void Load(Stream fileStream, Dictionary <string, SetObjectType> objectTemplates) { // Header var reader = new BINAReader(fileStream); Header = reader.ReadHeader(); reader.JumpAhead(0x2C); // Skip "test" string uint objectLength = reader.ReadUInt32(); uint objectOffset = reader.ReadUInt32(); uint groupLength = reader.ReadUInt32(); uint groupOffset = reader.ReadUInt32(); Console.WriteLine($"Object Count: {objectLength}"); Console.WriteLine($"Object Table Offset Location: {objectOffset}"); Console.WriteLine($"Group Count: {groupLength}"); Console.WriteLine($"Group Table Offset Location: {groupOffset}"); //Groups reader.JumpTo(groupOffset, false); for (uint i = 0; i < groupLength; ++i) { //What we know so far: //First 4 bytes is a name for the group (usually GroupHelperXX?) //Second 4 bytes are the type? (according to LibS06), might be a second name (stuff like next_set/GroupHelperXX)? //Third 4 bytes is the amount of objects in this group. //Last 4 bytes is a list of the object IDs in this group. uint nameOffset = reader.ReadUInt32(); //Name uint typeOffset = reader.ReadUInt32(); //Type? uint groupObjectCount = reader.ReadUInt32(); //Count uint groupObjectOffset = reader.ReadUInt32(); //Address of Objects string groupName = string.Empty; string groupType = string.Empty; long pos = reader.BaseStream.Position; reader.JumpTo(nameOffset, false); groupName = reader.ReadNullTerminatedString(); groupNames.Add(groupName); reader.JumpTo(typeOffset, false); groupType = reader.ReadNullTerminatedString(); groupTypes.Add(groupType); reader.JumpTo(groupObjectOffset, false); for (int c = 0; c < groupObjectCount; c++) { reader.JumpAhead(4); uint objID = reader.ReadUInt32(); objGroupData.Add($"{groupName}|{groupType}|{objID}"); groupIDs.Add(objID); } reader.JumpTo(pos, true); } // Data reader.JumpTo(objectOffset, false); for (uint i = 0; i < objectLength; ++i) { Objects.Add(ReadObject(i)); } // TODO: Read Footer // Sub-Methods SetObject ReadObject(uint id) { // Object Entry var obj = new SetObject(); uint nameOffset = reader.ReadUInt32(); uint typeOffset = reader.ReadUInt32(); reader.JumpAhead(16); obj.Transform.Position = reader.ReadVector3(); reader.JumpAhead(4); obj.Transform.Rotation = new Quaternion(reader.ReadVector4()); uint paramCount = reader.ReadUInt32(); uint paramOffset = reader.ReadUInt32(); // Object Parameters long pos = reader.BaseStream.Position; for (uint i = 0; i < paramCount; ++i) { reader.JumpTo(paramOffset + i * 0x14, false); obj.Parameters.Add(ReadParam()); } // Object Name reader.JumpTo(nameOffset, false); obj.CustomData.Add("Name", new SetObjectParam( typeof(string), reader.ReadNullTerminatedString())); // Object Type reader.JumpTo(typeOffset, false); obj.ObjectType = reader.ReadNullTerminatedString(); obj.ObjectID = id; //Object Group if (!groupIDs.Contains(id)) { obj.CustomData.Add("GroupName", new SetObjectParam( typeof(string), "")); obj.CustomData.Add("GroupType", new SetObjectParam( typeof(string), "")); } else { string[] groupData = objGroupData[groupIDs.IndexOf(id)].Split('|'); obj.CustomData.Add("GroupName", new SetObjectParam( typeof(string), groupData[0])); obj.CustomData.Add("GroupType", new SetObjectParam( typeof(string), groupData[1])); } reader.JumpTo(pos, true); return(obj); } SetObjectParam ReadParam() { var param = new SetObjectParam(); uint type = reader.ReadUInt32(); switch (type) { case 0: param.DataType = typeof(bool); param.Data = (reader.ReadUInt32() == 1); break; case 1: param.DataType = typeof(int); param.Data = reader.ReadInt32(); break; case 2: param.DataType = typeof(float); param.Data = reader.ReadSingle(); break; case 3: uint offset = reader.ReadUInt32(); uint amount = reader.ReadUInt32(); if (amount != 1) { Console.WriteLine($"WARNING: Amount != 1. ({amount})"); } long pos = reader.BaseStream.Position; reader.JumpTo(offset, false); param.DataType = typeof(string); param.Data = reader.ReadNullTerminatedString(); reader.JumpTo(pos, true); break; case 4: param.DataType = typeof(Vector3); param.Data = reader.ReadVector3(); break; case 6: param.DataType = typeof(uint); param.Data = reader.ReadUInt32(); break; default: Console.WriteLine($"WARNING: Unknown object param type {type}!"); return(null); } return(param); } }
// Methods public override void Load(Stream fileStream, Dictionary <string, SetObjectType> objectTemplates) { // Header var reader = new BINAReader(fileStream); Header = reader.ReadHeader(); reader.JumpAhead(0x2C); // Skip "test" string uint objectLength = reader.ReadUInt32(); uint objectOffset = reader.ReadUInt32(); uint groupLength = reader.ReadUInt32(); uint groupOffset = reader.ReadUInt32(); // Data reader.JumpTo(objectOffset, false); for (uint i = 0; i < objectLength; ++i) { Objects.Add(ReadObject()); } // TODO: Read Groups // TODO: Read Footer // Sub-Methods SetObject ReadObject() { // Object Entry var obj = new SetObject(); uint nameOffset = reader.ReadUInt32(); uint typeOffset = reader.ReadUInt32(); reader.JumpAhead(16); obj.Transform.Position = reader.ReadVector3(); reader.JumpAhead(4); obj.Transform.Rotation = new Quaternion(reader.ReadVector4()); uint paramCount = reader.ReadUInt32(); uint paramOffset = reader.ReadUInt32(); // Object Parameters long pos = reader.BaseStream.Position; for (uint i = 0; i < paramCount; ++i) { reader.JumpTo(paramOffset + i * 0x14, false); obj.Parameters.Add(ReadParam()); } // TODO: Read Object Name // Object Type reader.JumpTo(typeOffset, false); obj.ObjectType = reader.ReadNullTerminatedString(); reader.JumpTo(pos, true); return(obj); } SetObjectParam ReadParam() { var param = new SetObjectParam(); uint type = reader.ReadUInt32(); switch (type) { case 0: param.DataType = typeof(bool); param.Data = (reader.ReadUInt32() == 1); break; case 1: param.DataType = typeof(int); param.Data = reader.ReadInt32(); break; case 2: param.DataType = typeof(float); param.Data = reader.ReadSingle(); break; case 3: uint offset = reader.ReadUInt32(); uint amount = reader.ReadUInt32(); if (amount != 1) { Console.WriteLine($"WARNING: Amount != 1. ({amount})"); } long pos = reader.BaseStream.Position; reader.JumpTo(offset, false); param.DataType = typeof(string); param.Data = reader.ReadNullTerminatedString(); reader.JumpTo(pos, true); break; case 4: param.DataType = typeof(Vector3); param.Data = reader.ReadVector3(); break; case 6: param.DataType = typeof(uint); param.Data = reader.ReadUInt32(); break; default: Console.WriteLine($"WARNING: Unknown object param type {type}!"); return(null); } return(param); } }
// Methods public override void Load(Stream fileStream, Dictionary <string, SetObjectType> objectTemplates) { // Header var reader = new BINAReader(fileStream); Header = reader.ReadHeader(); //Set Name (hardcoded to ASSUME it's four characters long) long namePosition = reader.BaseStream.Position; //Save position so we can jump back after reading name, type and parameters reader.JumpAhead(0xC); Name = reader.ReadNullTerminatedString(); reader.JumpTo(namePosition, true); reader.JumpAhead(0x2C); uint objectCount = reader.ReadUInt32(); uint objectTableOffset = reader.ReadUInt32(); uint groupCount = reader.ReadUInt32(); uint groupTableOffset = reader.ReadUInt32(); //Objects reader.JumpTo(objectTableOffset, false); for (uint i = 0; i < objectCount; i++) { var obj = new SetObject(); obj.ObjectID = i; uint objectNameOffset = reader.ReadUInt32(); uint objectTypeOffset = reader.ReadUInt32(); obj.UnknownBytes = reader.ReadBytes(16); //parameter.Unknown 16 bytes (pattern tends to be 40 00 00 00/01 (depending on whether object is activated by a group) 00 00 00 00 00 00 00 00 00 00 00 00) obj.Transform.Position = reader.ReadVector3(); obj.DrawDistance = reader.ReadSingle(); obj.Transform.Rotation = reader.ReadQuaternion(); uint parameterCount = reader.ReadUInt32(); uint parameterOffset = reader.ReadUInt32(); long position = reader.BaseStream.Position; //Save position so we can jump back after reading name, type and parameters //Object Name and Type reader.JumpTo(objectNameOffset, false); obj.ObjectName = reader.ReadNullTerminatedString(); reader.JumpTo(objectTypeOffset, false); obj.ObjectType = reader.ReadNullTerminatedString(); reader.JumpTo(parameterOffset, false); //Object Parameters for (uint c = 0; c < parameterCount; c++) { var parameter = new SetObjectParam(); uint parameterType = reader.ReadUInt32(); switch (parameterType) { case 0: //boolean parameter.DataType = typeof(bool); parameter.Data = reader.ReadUInt32() == 1; parameter.Unknown1 = reader.ReadUInt32(); parameter.Unknown2 = reader.ReadUInt32(); parameter.Unknown3 = reader.ReadUInt32(); break; case 1: //int parameter.DataType = typeof(int); parameter.Data = reader.ReadInt32(); parameter.Unknown1 = reader.ReadUInt32(); parameter.Unknown2 = reader.ReadUInt32(); parameter.Unknown3 = reader.ReadUInt32(); break; case 2: //single parameter.DataType = typeof(float); parameter.Data = reader.ReadSingle(); parameter.Unknown1 = reader.ReadUInt32(); parameter.Unknown2 = reader.ReadUInt32(); parameter.Unknown3 = reader.ReadUInt32(); break; case 3: //string uint offset = reader.ReadUInt32(); parameter.Unknown1 = reader.ReadUInt32(); parameter.Unknown2 = reader.ReadUInt32(); parameter.Unknown3 = reader.ReadUInt32(); long stringParameterPosition = reader.BaseStream.Position; //Save position so we can jump back after reading name, type and parameters reader.JumpTo(offset, false); parameter.DataType = typeof(string); parameter.Data = reader.ReadNullTerminatedString(); reader.JumpTo(stringParameterPosition, true); break; case 4: //Vector3 parameter.DataType = typeof(Vector3); parameter.Data = reader.ReadVector3(); parameter.Unknown3 = reader.ReadUInt32(); break; case 6: //uint parameter.DataType = typeof(uint); parameter.Data = reader.ReadUInt32(); parameter.Unknown1 = reader.ReadUInt32(); parameter.Unknown2 = reader.ReadUInt32(); parameter.Unknown3 = reader.ReadUInt32(); break; default: Console.WriteLine("Unhandled Data Type!"); break; } obj.Parameters.Add(parameter); } //Save Object and jump back for the next one Objects.Add(obj); reader.JumpTo(position, true); } //Groups reader.JumpTo(groupTableOffset, false); for (uint i = 0; i < groupCount; i++) { var group = new SetGroup(); uint groupNameOffset = reader.ReadUInt32(); uint groupTypeOffset = reader.ReadUInt32(); group.GroupObjectCount = reader.ReadUInt32(); uint groupObjectListOffset = reader.ReadUInt32(); long position = reader.BaseStream.Position; //Save position so we can jump back after reading name, type and object list //Group Name and Type reader.JumpTo(groupNameOffset, false); group.GroupName = reader.ReadNullTerminatedString(); reader.JumpTo(groupTypeOffset, false); group.GroupType = reader.ReadNullTerminatedString(); //Group Object List reader.JumpTo(groupObjectListOffset, false); for (uint c = 0; c < group.GroupObjectCount; c++) { reader.JumpAhead(4); group.ObjectIDs.Add(reader.ReadUInt32()); } //Save Group and jump back for the next one Groups.Add(group); reader.JumpTo(position, true); } }