コード例 #1
0
                public void WriteToFile(BinaryWriter writer)
                {
                    writer.Write(header.ToCharArray());
                    writer.Write(unk02);
                    writer.Write(unk03);
                    writer.Write(unk04);
                    writer.Write(unk05);
                    writer.Write(unk06);
                    writer.Write(unk07);
                    writer.Write(unk08);
                    writer.Write(unk09);
                    writer.Write(numEntities);

                    foreach (var Entity in entities)
                    {
                        writer.Write(126); //Header for types is 126.

                        long sizePosition = writer.BaseStream.Position;
                        writer.Write(-1);
                        writer.Write((int)Entity.GetEntityType());

                        using (MemoryStream stream = new MemoryStream())
                        {
                            // Write Entity to the Stream
                            CutsceneEntityFactory.WriteAnimEntityToFile(stream, Entity);
                            writer.Write(stream.ToArray());

                            // Update Size.
                            long currentPosition = writer.BaseStream.Position;
                            writer.BaseStream.Seek(sizePosition, SeekOrigin.Begin);
                            writer.Write((uint)stream.Length + 12);
                            writer.BaseStream.Seek(currentPosition, SeekOrigin.Begin);
                        }
                    }

                    foreach (var Entity in entities)
                    {
                        using (MemoryStream EntityStream = new MemoryStream())
                        {
                            bool isBigEndian = false;
                            Entity.AnimEntityData.WriteToFile(EntityStream, isBigEndian);

                            EntityStream.Seek(4, SeekOrigin.Begin);
                            EntityStream.Write((uint)EntityStream.Length, isBigEndian);
                            EntityStream.Seek(0, SeekOrigin.End);

                            writer.Write(EntityStream.ToArray());
                        }
                    }

                    writer.Write(unk10);
                    writer.Write(unk11);
                    writer.Write(unk12);
                    writer.Write(unk13);
                    writer.Write(unk14);
                }
コード例 #2
0
                public void WriteToFile(BinaryWriter Writer)
                {
                    Writer.Write(1000); // Magic
                    long SPDSizePosition = Writer.BaseStream.Position;

                    Writer.Write(Size);
                    Writer.Write(0x21445053);
                    Writer.Write(Unk01);
                    Writer.Write(Unk02);
                    Writer.Write(EntityDefinitions.Length);

                    foreach (var Entity in EntityDefinitions)
                    {
                        Writer.Write(126); //Header for types is 126.

                        long sizePosition = Writer.BaseStream.Position;
                        Writer.Write(-1);
                        Writer.Write((int)Entity.GetEntityType());

                        using (MemoryStream EntityStream = new MemoryStream())
                        {
                            CutsceneEntityFactory.WriteAnimEntityToFile(EntityStream, Entity);
                            Writer.Write(EntityStream.ToArray());

                            long currentPosition = Writer.BaseStream.Position;
                            Writer.BaseStream.Seek(sizePosition, SeekOrigin.Begin);
                            Writer.Write((uint)EntityStream.Length + 12);
                            Writer.BaseStream.Seek(currentPosition, SeekOrigin.Begin);
                        }
                    }

                    foreach (var Entity in EntityDefinitions)
                    {
                        using (MemoryStream EntityStream = new MemoryStream())
                        {
                            bool isBigEndian = false;
                            Entity.AnimEntityData.WriteToFile(EntityStream, isBigEndian);

                            EntityStream.Seek(4, SeekOrigin.Begin);
                            EntityStream.Write((uint)EntityStream.Length, isBigEndian);
                            EntityStream.Seek(0, SeekOrigin.End);

                            Writer.Write(EntityStream.ToArray());
                        }
                    }

                    Writer.Seek((int)SPDSizePosition, SeekOrigin.Begin);
                    uint SPDSize = (uint)(Writer.BaseStream.Length - SPDSizePosition) + 4;

                    Writer.Write(SPDSize);
                    Writer.Seek(0, SeekOrigin.End);
                }
コード例 #3
0
                private string CutsceneName; // For debugging

                public void ReadFromFile(BinaryReader reader, string name)
                {
                    CutsceneName = name;

                    int magic = reader.ReadInt32();

                    if (magic == 1000)
                    {
                        //the size includes the size and the magic, A.K.A: (magic and size == 8)
                        Size = reader.ReadUInt32();

                        int fourcc = reader.ReadInt32();
                        if (fourcc == 0x21445053)
                        {
                            Unk01 = reader.ReadInt32();
                            Unk02 = reader.ReadSingle();
                            int NumEntities = reader.ReadInt32();
                            EntityDefinitions = new AnimEntityWrapper[NumEntities];

                            for (int i = 0; i < NumEntities; i++)
                            {
                                int Header = reader.ReadInt32();
                                Debug.Assert(Header == 126, "We've missed the entity definition Magic!"); // Or 0x7F

                                int             Size = reader.ReadInt32();
                                int             RawAnimEntityType = reader.ReadInt32();
                                AnimEntityTypes AnimEntityType    = (AnimEntityTypes)RawAnimEntityType;

                                byte[] DefintionData = reader.ReadBytes(Size - 12);
                                using (MemoryStream Reader = new MemoryStream(DefintionData))
                                {
                                    AnimEntityWrapper Entity = CutsceneEntityFactory.ReadAnimEntityWrapperFromFile(AnimEntityType, Reader);

                                    // Debugging: If the AnimEntity is null and a debugger is attached, we should save it to the disc.
                                    string format = string.Format("CutsceneInfo/{0}/Entity_SPD_{1}_{2}.bin", CutsceneName, AnimEntityType, i);
                                    File.WriteAllBytes(format, DefintionData);

                                    EntityDefinitions[i] = Entity;
                                }
                            }

                            for (int z = 0; z < NumEntities; z++)
                            {
                                // Export this first
                                int dataType   = reader.ReadInt32();
                                int entitySize = reader.ReadInt32();
                                reader.BaseStream.Position -= 8;
                                byte[] dataBytes = reader.ReadBytes(entitySize);

                                string format = string.Format("CutsceneInfo/{2}/{0}_SPD_{1}.bin", EntityDefinitions[z], z, CutsceneName);
                                File.WriteAllBytes(format, dataBytes);

                                // And then This
                                using (MemoryStream stream = new MemoryStream(dataBytes))
                                {
                                    EntityDefinitions[z].AnimEntityData.ReadFromFile(stream, false);
                                }
                            }
                        }
                    }
                }
コード例 #4
0
                public void ReadFromFile(BinaryReader reader, string name)
                {
                    CutsceneName = name;

                    header      = new string(reader.ReadChars(4));
                    unk02       = reader.ReadInt32();
                    unk03       = reader.ReadSingle();
                    unk04       = reader.ReadInt16();
                    unk05       = reader.ReadInt16();
                    unk06       = reader.ReadInt32();
                    unk07       = reader.ReadInt32();
                    unk08       = reader.ReadBytes(unk07 - 4);
                    unk09       = reader.ReadInt32();
                    numEntities = reader.ReadUInt16();
                    entities    = new AnimEntityWrapper[numEntities];

                    for (int i = 0; i < numEntities; i++)
                    {
                        int Header = reader.ReadInt32();
                        Debug.Assert(Header == 126, "We've missed the entity definition Magic!"); // Or 0x7F

                        int             Size = reader.ReadInt32();
                        int             RawAnimEntityType = reader.ReadInt32();
                        AnimEntityTypes AnimEntityType    = (AnimEntityTypes)RawAnimEntityType;

                        byte[] DefintionData = reader.ReadBytes(Size - 12);
                        using (MemoryStream Reader = new MemoryStream(DefintionData))
                        {
                            AnimEntityWrapper EntityWrapper = CutsceneEntityFactory.ReadAnimEntityWrapperFromFile(AnimEntityType, Reader);

                            string format = string.Format("CutsceneInfo/{2}/Entity_{0}_{1}.bin", AnimEntityType, i, CutsceneName);
                            File.WriteAllBytes(format, DefintionData);

                            entities[i] = EntityWrapper;
                        }
                    }

                    for (int z = 0; z < numEntities; z++)
                    {
                        // Export this first
                        int dataType = reader.ReadInt32();
                        int size     = reader.ReadInt32();
                        reader.BaseStream.Position -= 8;
                        byte[] dataBytes = reader.ReadBytes(size);

                        string format = string.Format("CutsceneInfo/{2}/{0}_{1}.bin", entities[z], z, CutsceneName);
                        File.WriteAllBytes(format, dataBytes);

                        // And then This
                        using (MemoryStream stream = new MemoryStream(dataBytes))
                        {
                            entities[z].AnimEntityData.ReadFromFile(stream, false);
                            Debug.Assert(stream.Position == stream.Length, "When reading the AnimEntity Data, we did not reach the end of the stream!");
                        }
                    }

                    unk10 = reader.ReadInt32();
                    unk11 = reader.ReadSingle();
                    unk12 = reader.ReadInt32();
                    unk13 = reader.ReadSingle();
                    unk14 = reader.ReadInt32();
                }