コード例 #1
0
        public override void WriteToStream(AwesomeWriter aw, ISerializable data)
        {
            var cam = data as Cam;

            // TODO: Add version check
            var version = Magic();

            aw.Write(version);

            MiloSerializer.WriteToStream(aw.BaseStream, cam.Trans);
            MiloSerializer.WriteToStream(aw.BaseStream, cam.Draw);

            aw.Write((float)cam.NearPlane);
            aw.Write((float)cam.FarPlane);
            aw.Write((float)cam.FOV);

            // Write screen area
            aw.Write((float)cam.ScreenArea.X);
            aw.Write((float)cam.ScreenArea.Y);
            aw.Write((float)cam.ScreenArea.Width);
            aw.Write((float)cam.ScreenArea.Height);

            // Write z-range
            aw.Write((float)cam.ZRange.X);
            aw.Write((float)cam.ZRange.Y);

            aw.Write((string)cam.TargetTexture);
        }
コード例 #2
0
ファイル: Tab.cs プロジェクト: PikminGuts92/BFForever
        protected override void WriteObjectData(AwesomeWriter aw)
        {
            aw.Write((int)11);
            aw.Write((int)64);
            aw.Write((int)Events.Count);
            aw.Write((int)4);

            foreach (TabEntry ev in Events)
            {
                aw.Write((float)ev.Start);
                aw.Write((float)ev.End);

                aw.Write((int)ev.StringNumber);
                aw.Write((int)ev.FretNumber);
                aw.Write((int)ev.Finger);

                aw.Write((int)ev.NoteType);
                aw.Write((int)ev.BendType);
                aw.Write((float)ev.BendStrength);
                aw.Write((int)ev.VibratoType);

                aw.BaseStream.Position += 4; // Always 0
                aw.Write((float)ev.Unknown1);
                aw.Write((float)ev.Unknown2);
                aw.Write((float)ev.Unknown3);
                aw.Write((float)ev.Unknown4);

                aw.Write((bool)ev.ExtendedNote);
                aw.Write((bool)ev.PalmMute);
                aw.Write((bool)ev.Tremelo);
                aw.BaseStream.Position += 1; // Always 0

                aw.Write((int)ev.BassType);
            }
        }
コード例 #3
0
        protected override void WriteObjectData(AwesomeWriter aw)
        {
            aw.Write((int)Entries.Count);
            aw.Write((int)4);

            Entries.ForEach(x => aw.Write((ulong)x));
        }
コード例 #4
0
 public void ToStream(Stream output)
 {
     using (AwesomeWriter aw = new AwesomeWriter(output, false))
     {
         WriteToStream(aw, 0);
     }
 }
コード例 #5
0
        public override void WriteToStream(AwesomeWriter aw, ISerializable data)
        {
            var env = data as Environ;

            // TODO: Add version check
            var version = Magic();

            aw.Write(version);

            MiloSerializer.WriteToStream(aw.BaseStream, env.Draw);

            // Write lights
            aw.Write((int)env.Lights.Count);
            env.Lights.ForEach(x => aw.Write((string)x));

            // Write ambient color
            aw.Write((float)env.AmbientColor.R);
            aw.Write((float)env.AmbientColor.G);
            aw.Write((float)env.AmbientColor.B);
            aw.Write((float)env.AmbientColor.A);

            // Write fog info
            aw.Write((float)env.FogStart);
            aw.Write((float)env.FogEnd);

            aw.Write((float)env.FogColor.R);
            aw.Write((float)env.FogColor.G);
            aw.Write((float)env.FogColor.B);
            aw.Write((float)env.FogColor.A);

            aw.Write((bool)env.EnableFog);
        }
コード例 #6
0
        public void WriteToStream(Stream stream, ISerializable obj)
        {
            var aw = new AwesomeWriter(stream, Info.BigEndian);

            var serializer = Serializers.FirstOrDefault(x => x.IsOfType(obj));

            if (serializer == null)
            {
                throw new NotImplementedException($"Serialization of {obj.GetType().Name} is not supported yet!");
            }

            serializer.WriteToStream(aw, obj);

            /*
             * switch (obj)
             * {
             *  case Tex tex:
             *      WriteToStream(aw, tex);
             *      break;
             *  case HMXBitmap bitmap:
             *      WriteToStream(aw, bitmap);
             *      break;
             *  case MiloObjectBytes bytes:
             *      WriteToStream(aw, bytes);
             *      break;
             *  default:
             *      throw new NotImplementedException($"Serialization of {obj.GetType().Name} is not supported yet!");
             * } */
        }
コード例 #7
0
        public override void WriteToStream(AwesomeWriter aw, ISerializable data)
        {
            var propAnim = data as PropAnim;

            var version = Magic();

            // Hacky way to support GDRB
            if (version == 11 && IsGRDRBAnim(propAnim))
            {
                version = 12;
            }

            aw.Write(version);

            // Write meta
            aw.Write((int)2);
            aw.Write((string)propAnim.AnimName);
            aw.BaseStream.Position += 5; // Skip zeros

            aw.Write((int)4);
            aw.Write((float)propAnim.TotalTime);
            aw.Write((int)1);

            if (version >= 12)
            {
                aw.Write((byte)0x00);
            }

            // Write director groups
            aw.Write(propAnim.DirectorGroups.Count);
            foreach (var group in propAnim.DirectorGroups)
            {
                WriteGroupEvent(group, aw);
            }
        }
コード例 #8
0
        private byte[] CreateData()
        {
            var stringBlob = CreateStringBlob(out var stringOffsets);

            using (var ms = new MemoryStream())
            {
                using (var aw = new AwesomeWriter(ms, true))
                {
                    // Writes entry count + blob size
                    aw.Write((int)Entries.Count);
                    aw.Write((int)stringBlob.Length);

                    // Writes entries
                    foreach (var entry in Entries)
                    {
                        aw.Write((float)entry.Start);
                        aw.Write((int)entry.Modifier);
                        aw.Write((float)entry.Length);
                        aw.Write(stringOffsets.ContainsKey(entry.Text) ? stringOffsets[entry.Text] : entry.Data);
                    }

                    // Writes string blob
                    aw.Write(stringBlob);
                }

                return(ms.ToArray());
            }
        }
コード例 #9
0
ファイル: Chunk.cs プロジェクト: ihatecompvir/Mackiloha
        public void WriteToStream(Stream stream, bool noHeader)
        {
            AwesomeWriter aw = new AwesomeWriter(stream, true);

            if (!noHeader)
            {
                aw.Write(CHNK_MAGIC);
                aw.Write((int)255);
                aw.Write(Entries.Count);
                aw.Write(Entries.Max(x => x.Data.Length));
                aw.Write((short)1);
                aw.Write((short)2);

                int currentIdx = 20 + (Entries.Count << 2);

                // Writes block details
                foreach (ChunkEntry entry in Entries)
                {
                    aw.Write(entry.Data.Length);
                    aw.Write(entry.Data.Length);

                    aw.Write((int)(entry.Compressed ? 1 : 0));
                    aw.Write(currentIdx);

                    currentIdx += entry.Data.Length;
                }
            }

            // Writes blocks
            Entries.ForEach(x => aw.Write(x.Data));
        }
コード例 #10
0
        private void WriteToStream(Stream stream)
        {
            using (AwesomeWriter aw = new AwesomeWriter(stream))
            {
                aw.BigEndian = BigEndian;
                aw.Write((int)MAGIC);
                aw.Write((ushort)Channels);
                aw.Write(Convert.ToUInt16(Encrypted));
                aw.Write((uint)TotalSamples);
                aw.Write((uint)Bitrate);

                aw.Write((ushort)FrameSize);
                aw.Write((ushort)Unknown1);
                aw.Write((ushort)SampleRate);
                aw.Write((ushort)Unknown2);

                aw.Write((uint)ReckoningOffset);
                aw.Write((uint)ReckoningSize);
                aw.Write((uint)PacketStreamOffset);
                aw.Write((uint)PacketStreamSize);

                aw.Write(Reckoning);
                aw.Write(PacketStream);
            }
        }
コード例 #11
0
 private void WriteRiff(Stream output)
 {
     // Writes riff data to stream
     using (AwesomeWriter aw = new AwesomeWriter(output, this.BigEndian))
     {
     }
 }
コード例 #12
0
        private byte[] CreateData()
        {
            using (AwesomeWriter aw = new AwesomeWriter(new MemoryStream(), BigEndian))
            {
                aw.Write((int)_version);
                // TODO: Implement directory type + name writing

                aw.Write(Entries.Count);

                // Writes entry type + name
                foreach (AbstractEntry entry in Entries)
                {
                    aw.Write(entry.Type);
                    aw.Write(entry.Name);
                }

                if (_version == MiloVersion.V10)
                {
                    aw.Write((int)0);
                }

                // Writes data from each entry
                foreach (AbstractEntry entry in Entries)
                {
                    aw.Write(entry.Data);
                    aw.Write(ADDE_PADDING);
                }

                return(((MemoryStream)(aw.BaseStream)).ToArray());
            }
        }
コード例 #13
0
ファイル: Index2.cs プロジェクト: PikminGuts92/BFForever
        protected override void WriteObjectData(AwesomeWriter aw)
        {
            aw.Write((int)Version);
            aw.Write((int)Entries.Count);
            aw.Write((int)4); // Should always be 4

            long nextPackageOffset = aw.BaseStream.Position + (Entries.Count * 24);

            // Writes index2 entries
            foreach (Index2Entry entry in Entries)
            {
                aw.Write((long)entry.FilePath.Key);
                aw.Write((long)entry.Type.Key);
                aw.Write((int)entry.PackageEntries.Count);
                aw.Write((int)(nextPackageOffset - aw.BaseStream.Position));

                nextPackageOffset += entry.PackageEntries.Count * 248;
            }

            // Writes package entries
            foreach (var entry in Entries.SelectMany(x => x.PackageEntries))
            {
                aw.Write((ulong)entry.Package);
                aw.WriteNullString(entry.ExternalFilePath, 240);
            }
        }
コード例 #14
0
        private void WriteItem(AwesomeWriter aw, DTBItem item, ref int lineNumber)
        {
            if (item is IntegerItem)
            {
                aw.Write((int)item.NumericValue);
                aw.Write((int)((IntegerItem)item).Integer);
            }
            else if (item is FloatItem)
            {
                aw.Write((int)item.NumericValue);
                aw.Write((float)((FloatItem)item).Float);
            }
            else if (item is StringItem)
            {
                aw.Write((int)item.NumericValue);
                aw.Write((string)((StringItem)item).String);
            }
            else if (item is ParentItem)
            {
                aw.Write((int)item.NumericValue);

                ParentItem parent = item as ParentItem;

                switch (Encoding)
                {
                default:
                case DTBEncoding.Classic:
                    // 6 bytes (2 count, 4 id)
                    aw.Write((short)parent.Count);
                    aw.Write((int)lineNumber);
                    break;

                case DTBEncoding.FME:
                    // TODO: Verify unknown value is constant

                    // 10 bytes (4 unk, 4 count, 2 id)
                    aw.Write((int)1);
                    aw.Write((int)parent.Count);
                    aw.Write((short)lineNumber);
                    break;

                case DTBEncoding.RBVR:
                    // 8 bytes (4 unk, 2 count, 2 id)
                    aw.Write((int)1);
                    aw.Write((short)parent.Count);
                    aw.Write((short)lineNumber);
                    break;
                }

                lineNumber++;
                foreach (DTBItem sub in parent)
                {
                    WriteItem(aw, sub, ref lineNumber);
                }
            }
            else
            {
                throw new Exception("Invalid DTB item type!");
            }
        }
コード例 #15
0
        public void SaveToStream(AwesomeWriter aw)
        {
            var version = Embedded ? 0 : 1;

            aw.Write((byte)1); // Always 1

            if (Encoding == DTBEncoding.FME)
            {
                aw.Write((int)0); // Always 0
            }
            if (Encoding != DTBEncoding.RBVR)
            {
                aw.Write((short)Items.Count);
                aw.Write((int)version);
            }
            else
            {
                aw.Write((int)version);
                aw.Write((short)Items.Count);
                aw.Write((short)1); // Always 1?
            }

            int lineNumber = 1;

            foreach (DTBItem item in Items)
            {
                WriteItem(aw, item, ref lineNumber);
            }
        }
コード例 #16
0
ファイル: ZObject.cs プロジェクト: PikminGuts92/BFForever
        internal void WriteData(AwesomeWriter aw)
        {
            aw.Write((ulong)_filePath);
            aw.Write((ulong)_directoryPath);
            aw.Write((ulong)Type);
            aw.BaseStream.Position += 8;

            WriteObjectData(aw);
        }
コード例 #17
0
 public void SaveToFile(string path)
 {
     using (FileStream fs = File.OpenWrite(path))
     {
         using (AwesomeWriter aw = new AwesomeWriter(fs))
         {
             SaveToStream(aw);
         }
     }
 }
コード例 #18
0
        public override void WriteToStream(AwesomeWriter aw, ISerializable data)
        {
            var bytes = data as MiloObjectBytes;

            if (bytes.Data == null)
            {
                return;
            }

            aw.Write(bytes.Data);
        }
コード例 #19
0
ファイル: PackageDef.cs プロジェクト: PikminGuts92/BFForever
        protected override void WriteObjectData(AwesomeWriter aw)
        {
            aw.Write((int)Version);
            aw.WriteNullString(PackageName, 256);
            aw.Write((int)Entries.Count);
            aw.Write((int)4);

            foreach (string entry in Entries)
            {
                aw.WriteNullString(entry, 256);
            }
        }
コード例 #20
0
ファイル: Index.cs プロジェクト: PikminGuts92/BFForever
        internal void WriteData(AwesomeWriter aw)
        {
            aw.Write((int)Entries.Count);
            aw.Write((int)4);

            foreach (IndexEntry entry in Entries)
            {
                aw.Write((ulong)entry.FilePath);
                aw.Write((uint)entry.Offset);
                aw.BaseStream.Position += 4;
            }
        }
コード例 #21
0
        protected override void WriteObjectData(AwesomeWriter aw)
        {
            aw.Write((int)10);
            aw.Write((int)8);
            aw.Write((int)Events.Count);
            aw.Write((int)4);

            foreach (TimeEvent ev in Events)
            {
                aw.Write((float)ev.Start);
                aw.Write((float)ev.End);
            }
        }
コード例 #22
0
 internal static void WriteData(AwesomeWriter aw, InstrumentTuning tuning)
 {
     // 40 bytes
     aw.Write((ulong)tuning.Name);
     aw.Write((int)(tuning.String1 << 8 | tuning.String1Alt));
     aw.Write((int)(tuning.String2 << 8 | tuning.String2Alt));
     aw.Write((int)(tuning.String3 << 8 | tuning.String3Alt));
     aw.Write((int)(tuning.String4 << 8 | tuning.String4Alt));
     aw.Write((int)(tuning.String5 << 8 | tuning.String5Alt));
     aw.Write((int)(tuning.String6 << 8 | tuning.String6Alt));
     aw.Write((int)(tuning.String7 << 8 | tuning.String7Alt));
     aw.Write((int)(tuning.String8 << 8 | tuning.String8Alt));
 }
コード例 #23
0
ファイル: AudioEffect.cs プロジェクト: PikminGuts92/BFForever
        protected override void WriteObjectData(AwesomeWriter aw)
        {
            aw.Write((int)7);
            aw.Write((int)16);
            aw.Write((int)Events.Count);
            aw.Write((int)4);

            foreach (AudioEffectEntry ev in Events)
            {
                aw.Write((float)ev.Start);
                aw.Write((float)ev.End);
                aw.Write((ulong)ev.EffectPath);
            }
        }
コード例 #24
0
ファイル: Whammy.cs プロジェクト: PikminGuts92/BFForever
        protected override void WriteObjectData(AwesomeWriter aw)
        {
            aw.Write((int)12);
            aw.Write((int)16);
            aw.Write((int)Events.Count);
            aw.Write((int)4);

            foreach (WhammyEntry ev in Events)
            {
                aw.Write((float)ev.Start);
                aw.Write((float)ev.End);
                aw.Write((long)0);
            }
        }
コード例 #25
0
        protected override void WriteObjectData(AwesomeWriter aw)
        {
            aw.Write((int)4);
            aw.Write((int)12);
            aw.Write((int)Events.Count);
            aw.Write((int)4);

            foreach (MeasureEntry ev in Events)
            {
                aw.Write((float)ev.Start);
                aw.Write((float)ev.End);
                aw.Write((float)ev.Beat);
            }
        }
コード例 #26
0
ファイル: Section.cs プロジェクト: PikminGuts92/BFForever
        protected override void WriteObjectData(AwesomeWriter aw)
        {
            aw.Write((int)3);
            aw.Write((int)16);
            aw.Write((int)Events.Count);
            aw.Write((int)4);

            foreach (TextEvent ev in Events)
            {
                aw.Write((float)ev.Start);
                aw.Write((float)ev.End);
                aw.Write((ulong)ev.EventName);
            }
        }
コード例 #27
0
        private static void PatchXPR2Header(byte[] header, int t, int tOffset, int h, int hOffset, int w, int wOffset)
        {
            using (AwesomeWriter aw = new AwesomeWriter(new MemoryStream(header), true))
            {
                // Encodes texture size, height, and width
                aw.Seek(tOffset, SeekOrigin.Begin);
                aw.Write((int)t);

                aw.Seek(hOffset, SeekOrigin.Begin);
                aw.Write((short)((h >> 3) - 1));

                aw.Seek(wOffset, SeekOrigin.Begin);
                aw.Write((short)((w - 1) | 0xE000));
            }
        }
コード例 #28
0
        protected override void WriteObjectData(AwesomeWriter aw)
        {
            aw.Write((ulong)InstrumentType);
            aw.Write((ulong)Difficulty);
            aw.BaseStream.Position += 8; // Should be zero'd

            InstrumentTuning.WriteData(aw, Tuning);
            aw.Write((int)TrackPaths.Count);
            aw.Write((int)4);

            foreach (HKey path in TrackPaths)
            {
                aw.Write((ulong)path);
            }
        }
コード例 #29
0
        protected override void WriteObjectData(AwesomeWriter aw)
        {
            aw.Write((int)13);
            aw.Write((int)24);
            aw.Write((int)Events.Count);
            aw.Write((int)4);

            foreach (EventEntry ev in Events)
            {
                aw.Write((float)ev.Start);
                aw.Write((float)ev.End);
                aw.Write((ulong)ev.EventName);
                aw.Write((int)0);
                aw.Write((int)ev.Index);
            }
        }
コード例 #30
0
ファイル: RiffFile.cs プロジェクト: PikminGuts92/BFForever
        private byte[] CreateChunk(ZObject obj, bool bigEndian, ref long offset)
        {
            using (AwesomeWriter aw = new AwesomeWriter(new MemoryStream(), bigEndian))
            {
                obj.WriteData(aw);

                // Ensures chunk size is always divisible by 4
                if (aw.BaseStream.Position % 4 != 0)
                {
                    aw.Write(new byte[4 - (aw.BaseStream.Position % 4)]);
                }

                offset += aw.BaseStream.Position + 8; // 8 = Chunk Magic + Size
                return(((MemoryStream)aw.BaseStream).ToArray());
            }
        }