コード例 #1
0
ファイル: PackageDef.cs プロジェクト: PikminGuts92/BFForever
        internal override void ReadData(AwesomeReader ar)
        {
            Entries.Clear();

            Version = ar.ReadInt32();

            long nextString = ar.BaseStream.Position + 256;

            PackageName = ar.ReadNullString();

            ar.BaseStream.Position = nextString;
            int count = ar.ReadInt32(); // # of strings

            // Offset - Always 4
            ar.BaseStream.Position += 4;
            nextString              = ar.BaseStream.Position;

            for (int i = 0; i < count; i++)
            {
                ar.BaseStream.Position = nextString;

                // Reads string
                Entries.Add(ar.ReadNullString());
                nextString += 256;
            }
        }
コード例 #2
0
ファイル: Vox.cs プロジェクト: PikminGuts92/BFForever
        internal override void ReadData(AwesomeReader ar)
        {
            Events.Clear();
            ar.BaseStream.Position += 8; // Skips constants

            int count = ar.ReadInt32();

            ar.BaseStream.Position += 4;

            for (int i = 0; i < count; i++)
            {
                // Reads vox entry (32 bytes)
                VoxEntry ev = new VoxEntry();
                ev.Start = ar.ReadSingle();
                ev.End   = ar.ReadSingle();

                ev.Pitch                = ar.ReadInt24() & 0xFF;
                ev.PitchAlt             = ar.ReadByte();
                ar.BaseStream.Position += 4; // Always 0

                ev.Lyric                = ar.ReadUInt64();
                ev.NoteType             = (VoxNote)ar.ReadInt32();
                ar.BaseStream.Position += 4; // Always 0

                Events.Add(ev);
            }
        }
コード例 #3
0
        public override void ReadFromStream(AwesomeReader ar, ISerializable data)
        {
            var draw    = data as Draw;
            int version = ReadMagic(ar, data);

            draw.Showing = ar.ReadBoolean();

            if (version < 3)
            {
                var drawableCount = ar.ReadInt32();
                draw.Drawables.Clear();
                draw.Drawables.AddRange(RepeatFor(drawableCount, () => ar.ReadString()));
            }

            draw.Boundry = new Sphere()
            {
                X      = ar.ReadSingle(),
                Y      = ar.ReadSingle(),
                Z      = ar.ReadSingle(),
                Radius = ar.ReadSingle()
            };

            if (version == 3)
            {
                // Should always be 0
                ar.BaseStream.Position += 4;
            }
            else if (version >= 4)
            {
                // Should always be 0'd data
                ar.BaseStream.Position += 8;
            }
        }
コード例 #4
0
        public override void ReadFromStream(AwesomeReader ar, ISerializable data)
        {
            var cam     = data as Cam;
            int version = ReadMagic(ar, data);

            MiloSerializer.ReadFromStream(ar.BaseStream, cam.Trans);
            MiloSerializer.ReadFromStream(ar.BaseStream, cam.Draw);

            cam.NearPlane = ar.ReadSingle();
            cam.FarPlane  = ar.ReadSingle();
            cam.FOV       = ar.ReadSingle();

            // Read screen area
            cam.ScreenArea = new Rectangle()
            {
                X      = ar.ReadSingle(),
                Y      = ar.ReadSingle(),
                Width  = ar.ReadSingle(),
                Height = ar.ReadSingle()
            };

            // Read z-range
            cam.ZRange = new Vector2()
            {
                X = ar.ReadSingle(),
                Y = ar.ReadSingle()
            };

            cam.TargetTexture = ar.ReadString();
        }
コード例 #5
0
ファイル: Vox.cs プロジェクト: maxton/BFForever
        protected override void ImportData(AwesomeReader ar)
        {
            ar.ReadInt32(); // Always 8
            ar.ReadInt32(); // Size of each VoxEntry (32 bytes)

            int count = ar.ReadInt32();

            ar.ReadInt32(); // Offset to entries (Always 4)

            for (int i = 0; i < count; i++)
            {
                // Reads vox entry (32 bytes)
                VoxEntry entry = new VoxEntry();

                entry.Start = ar.ReadSingle();
                entry.End   = ar.ReadSingle();
                ar.ReadInt16(); // 2 zero'd bytes

                entry.Pitch          = (sbyte)ar.ReadByte();
                entry.SecondaryPitch = (sbyte)ar.ReadByte();
                ar.ReadInt32(); // Always 0

                entry.Lyric    = ar.ReadInt64();
                entry.NoteType = ar.ReadInt32();
                ar.ReadInt32(); // Always 0

                Entries.Add(entry);
            }
        }
コード例 #6
0
ファイル: Audio.cs プロジェクト: maxton/BFForever
 protected override void ImportData(AwesomeReader ar)
 {
     // Reads audio path
     ar.BaseStream.Position += 8;
     ExternalPath            = ar.ReadInt64();
     ar.BaseStream.Position += 8;
 }
コード例 #7
0
        public override void ReadFromStream(AwesomeReader ar, ISerializable data)
        {
            var anim    = data as Anim;
            int version = ReadMagic(ar, data);

            if (version >= 4)
            {
                // Skips anim rate + unknown
                ar.BaseStream.Position += 8;
                return;
            }

            // Read anim entries
            int count = ar.ReadInt32();

            anim.AnimEntries.Clear();
            anim.AnimEntries.AddRange(
                RepeatFor(count, () => new AnimEntry()
            {
                Name = ar.ReadString(),
                F1   = ar.ReadSingle(),
                F2   = ar.ReadSingle()
            }));

            // Read animatable strings
            count = ar.ReadInt32();
            anim.Animatables.Clear();
            anim.Animatables.AddRange(
                RepeatFor(count, () => ar.ReadString()));
        }
コード例 #8
0
        public override void ReadFromStream(AwesomeReader ar, ISerializable data)
        {
            var env     = data as Environ;
            int version = ReadMagic(ar, data);

            MiloSerializer.ReadFromStream(ar.BaseStream, env.Draw);

            // Read lights
            var lightCount = ar.ReadInt32();

            env.Lights.Clear();
            env.Lights.AddRange(RepeatFor(lightCount, () => ar.ReadString()));

            env.AmbientColor = new Color4()
            {
                R = ar.ReadSingle(),
                G = ar.ReadSingle(),
                B = ar.ReadSingle(),
                A = ar.ReadSingle()
            };

            env.FogStart = ar.ReadSingle();
            env.FogEnd   = ar.ReadSingle();

            env.FogColor = new Color4()
            {
                R = ar.ReadSingle(),
                G = ar.ReadSingle(),
                B = ar.ReadSingle(),
                A = ar.ReadSingle()
            };

            env.EnableFog = ar.ReadBoolean();
        }
コード例 #9
0
        public MiloMeta ReadMeta(AwesomeReader ar)
        {
            var meta = new MiloMeta();

            if (MiloSerializer.Info.Version <= 10)
            {
                return(meta);
            }

            meta.Revision   = ar.ReadInt32();
            meta.ScriptName = ar.ReadString();

            var hasDtb = ar.ReadBoolean();

            if (hasDtb)
            {
                ar.BaseStream.Position -= 1;
                meta.Script             = DTBFile.FromStream(ar, DTBEncoding.Classic); // TODO: Support encodings for post-RB3 and pre-GH1 games?
            }

            if (MiloSerializer.Info.Platform != Platform.PS2)
            {
                // Extra meta
                meta.Comments = ar.ReadString();
            }

            return(meta);
        }
コード例 #10
0
        internal static InstrumentTuning ReadData(AwesomeReader ar)
        {
            InstrumentTuning tuning = new InstrumentTuning();

            // 40 bytes
            tuning.Name = ar.ReadUInt64();

            tuning.String1    = ar.ReadInt24() & 0xFF;
            tuning.String1Alt = ar.ReadByte();

            tuning.String2    = ar.ReadInt24() & 0xFF;
            tuning.String2Alt = ar.ReadByte();

            tuning.String3    = ar.ReadInt24() & 0xFF;
            tuning.String3Alt = ar.ReadByte();

            tuning.String4    = ar.ReadInt24() & 0xFF;
            tuning.String4Alt = ar.ReadByte();

            tuning.String5    = ar.ReadInt24() & 0xFF;
            tuning.String5Alt = ar.ReadByte();

            tuning.String6    = ar.ReadInt24() & 0xFF;
            tuning.String6Alt = ar.ReadByte();

            tuning.String7    = ar.ReadInt24() & 0xFF;
            tuning.String7Alt = ar.ReadByte();

            tuning.String8    = ar.ReadInt24() & 0xFF;
            tuning.String8Alt = ar.ReadByte();

            return(tuning);
        }
コード例 #11
0
ファイル: PackageDef.cs プロジェクト: maxton/BFForever
        protected override void ImportData(AwesomeReader ar)
        {
            Version = ar.ReadInt32(); // 1100024

            long nextString = ar.BaseStream.Position + 256;

            PackageName = ar.ReadNullString(); // "DLC0024"

            ar.BaseStream.Position = nextString;
            int count = ar.ReadInt32(); // # of strings

            // Offset - Always 4
            int offset = ar.ReadInt32();

            nextString = ar.BaseStream.Position + (offset - 4);

            Entries = new List <string>();

            for (int i = 0; i < count; i++)
            {
                ar.BaseStream.Position = nextString;

                // Reads string
                Entries.Add(ar.ReadNullString());
                nextString += 256;
            }
        }
コード例 #12
0
        private static Mub FromStream(Stream stream)
        {
            AwesomeReader ar  = new AwesomeReader(stream, true);
            Mub           mub = new Mub();

            mub.Version             = ar.ReadInt32();
            ar.BaseStream.Position += 4; // CRC-32 hash

            int  entryCount = ar.ReadInt32(), entrySize = entryCount * 16;
            int  blobSize    = ar.ReadInt32();
            long startOffset = ar.BaseStream.Position;

            // Reads in strings
            ar.BaseStream.Seek(entrySize, SeekOrigin.Current);
            var stringBlob = ar.ReadBytes(blobSize);
            Dictionary <long, string> words = ParseBlob(stringBlob, entrySize);

            ar.BaseStream.Seek(startOffset, SeekOrigin.Begin);

            // Reads entries
            for (int i = 0; i < entryCount; i++)
            {
                float start  = ar.ReadSingle();
                int   mod    = ar.ReadInt32();
                float length = ar.ReadSingle();
                int   data   = ar.ReadInt32();

                mub.Entries.Add(new MubEntry(start, mod, length, data, data > 0 && words.ContainsKey(data) ? words[data] : ""));
            }

            return(mub);
        }
コード例 #13
0
        public static Trans FromStream(Stream input)
        {
            using (AwesomeReader ar = new AwesomeReader(input))
            {
                int   version;
                bool  valid;
                Trans trans = new Trans("");

                // Guesses endianess
                ar.BigEndian = DetermineEndianess(ar.ReadBytes(4), out version, out valid);
                if (!valid)
                {
                    return(null);            // Probably do something else later
                }
                ar.BaseStream.Position += 9; // Should all be 0

                // Reads in matrix tables
                trans._mat1 = Matrix.FromStream(ar);
                trans._mat2 = Matrix.FromStream(ar);

                // TODO: Parse other stuff

                return(trans);
            }
        }
コード例 #14
0
ファイル: StringTable.cs プロジェクト: maxton/BFForever
        protected override void ImportData(AwesomeReader ar)
        {
            BaseDirectory           = ar.ReadInt64(); // songs.Halestorm.LoveBites
            TableLanguage           = (Language)ar.ReadInt64();
            ar.BaseStream.Position += 8;              // Skips zeros

            Dictionary <long, string> dic = new Dictionary <long, string>();
            int count = ar.ReadInt32();

            ar.BaseStream.Position += 12; // Skips to entries
            long difference = ar.BaseStream.Position + (count * 16);

            long[] key    = new long[count];
            long[] offset = new long[count];

            for (int i = 0; i < count; i++)
            {
                key[i]    = ar.ReadInt64();
                offset[i] = ar.ReadInt32();
                ar.ReadInt32(); // Should be zero
            }

            for (int i = 0; i < count; i++)
            {
                ar.BaseStream.Position = offset[i] + difference;
                string text = ar.ReadNullString();

                if (!dic.ContainsKey(key[i]))
                {
                    dic.Add(key[i], text);
                    continue;
                }

                // Evidently the same string with different casings will have the same key (only for directory paths?)
                if (string.Compare(dic[key[i]], text, true) == 0)
                {
                    dic.Remove(key[i]);
                    dic.Add(key[i], text);
                }
                else
                {
                    Console.WriteLine("STRING ERROR: {0} != {1}", dic[key[i]], text);
                    //subDictionary.Add(key[i], text);
                }
            }

            Strings = new List <FString>();

            foreach (var d in dic)
            {
                // Finds/adds key string globally
                StringKey sk = StringKey.FindCreate(d.Key);
                sk.SetValue(d.Value, TableLanguage);

                // Adds string to string table collection (And adds globally)
                StringKey.AddString(sk);
                Strings.Add(sk.Key);
            }
        }
コード例 #15
0
ファイル: RiffFile.cs プロジェクト: PikminGuts92/BFForever
        private static int GetChunkType(AwesomeReader ar)
        {
            int type = ar.ReadInt32();

            ar.BaseStream.Position += 4; // Skips size

            return(type);
        }
コード例 #16
0
ファイル: CSVFile.cs プロジェクト: ihatecompvir/Mackiloha
        private static string[] ParseRow(AwesomeReader ar, AwesomeReader strStream)
        {
            var count = ar.ReadInt32();

            return(Enumerable.Range(0, count)
                   .Select(x => GetStringValue(strStream, ar.ReadInt32()))
                   .ToArray());
        }
コード例 #17
0
        private void ReadGH2Material(AwesomeReader ar, Mat mat, int version)
        {
            // TODO: Better figure out GH2 material structure
            var num = ar.ReadInt32();

            switch (num)
            {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                break;

            default:
                throw new Exception($"Unexpected number, got {num}");
            }

            mat.BaseColor = new Color4()
            {
                R = ar.ReadSingle(),
                G = ar.ReadSingle(),
                B = ar.ReadSingle(),
                A = ar.ReadSingle()
            };

            var alwaysT = ar.ReadBoolean();
            var alwaysF = ar.ReadBoolean();

            var textureCount = ar.ReadInt32(); // Should always be 1

            mat.TextureEntries.Clear();
            mat.TextureEntries.AddRange(RepeatFor(1, () =>
            {
                ar.BaseStream.Position += 2;

                if (version >= 55)
                {
                    // Skip unknown data
                    ar.BaseStream.Position += 4;
                }

                var texEntry = new TextureEntry()
                {
                    Unknown1 = ar.ReadInt32(),
                    Unknown2 = ar.ReadInt32(),
                    Mat      = ReadMatrix(ar),
                    Unknown3 = 0,
                    Texture  = ar.ReadString()
                };

                // TODO: Read normal, specular, environment

                return(texEntry);
            }));
        }
コード例 #18
0
ファイル: ArkFile.cs プロジェクト: PikminGuts92/Mackiloha
        private static ArkFile ParseArkHeader(string input, Stream stream)
        {
            ArkFile ark = new ArkFile();

            ark._encrypted = false;
            ark._xor       = false;
            ark._arkPaths  = new[] { Path.GetFullPath(input) };

            using var ar = new AwesomeReader(stream);

            // Checks version
            int version = ar.ReadInt32();

            if (!Enum.IsDefined(typeof(ArkVersion), version))
            {
                throw new NotSupportedException($"Unsupported ark version 0x{version:X8}");
            }

            ark._version = (ArkVersion)version;

            // Skip entries and come back later
            var entryOffset = ar.BaseStream.Position;
            var entryCount  = ar.ReadInt32();

            ar.BaseStream.Seek(entryCount * 20, SeekOrigin.Current);

            // Read string blob + string indicies
            var strings = ReadStringBlob(ar);

            int[] stringIndex = ReadStringIndicies(ar);

            // Read entries
            ar.BaseStream.Seek(entryOffset + 4, SeekOrigin.Begin);

            for (int i = 0; i < entryCount; i++)
            {
                uint offset = ar.ReadUInt32();

                int fileIdx = ar.ReadInt32();
                int dirIdx  = ar.ReadInt32();

                string filePath = (fileIdx >= 0)
                    ? strings[stringIndex[fileIdx]]
                    : "";

                string direPath = (dirIdx >= 0)
                    ? strings[stringIndex[dirIdx]]
                    : "";

                uint size         = ar.ReadUInt32();
                uint inflatedSize = ar.ReadUInt32();

                ark._offsetEntries.Add(new OffsetArkEntry(offset, filePath, direPath, size, inflatedSize, 0, offset));
            }

            return(ark);
        }
コード例 #19
0
 public static DTBFile FromFile(string path, DTBEncoding encoding)
 {
     using (FileStream fs = File.OpenRead(path))
     {
         using (AwesomeReader ar = new AwesomeReader(fs))
         {
             return(FromStream(ar, encoding));
         }
     }
 }
コード例 #20
0
        internal override void ReadData(AwesomeReader ar)
        {
            _strings.Clear();

            int count = ar.ReadInt32();

            ar.BaseStream.Position += 12; // Skips to entries
            long stringTableOffset = ar.BaseStream.Position + (count * 16);

            ulong[] key    = new ulong[count];
            long[]  offset = new long[count];

            for (int i = 0; i < count; i++)
            {
                key[i]    = ar.ReadUInt64();
                offset[i] = ar.ReadInt32();
                ar.BaseStream.Position += 4; // Should be zero
            }

            for (int i = 0; i < count; i++)
            {
                ar.BaseStream.Position = offset[i] + stringTableOffset;
                string text = ar.ReadNullString();

                if (!_strings.ContainsKey(key[i]))
                {
                    _strings.Add(key[i], text);
                    continue;
                }

                // Evidently the same string with different casings will have the same key (only for directory paths?)
                if (string.Compare(_strings[key[i]], text, true) == 0)
                {
                    _strings.Remove(key[i]);
                    _strings.Add(key[i], text);
                }
                else
                {
                    throw new Exception($"STRING ERROR: {_strings[key[i]]} != {text}");
                }
            }

            foreach (var d in _strings)
            {
                // Updates global string value
                StringKey.UpdateValue(d.Key, d.Value, _localization);
            }

            // English localization is missing directory path entry
            if (Localization == Localization.Japanese)
            {
                StringKey.UpdateValue(DirectoryPath.Key, _strings[DirectoryPath.Key], Localization.English);
            }
        }
コード例 #21
0
ファイル: Chunk.cs プロジェクト: ihatecompvir/Mackiloha
        private static Chunk ReadFromStream(Stream stream)
        {
            Chunk         chunk = new Chunk();
            AwesomeReader ar    = new AwesomeReader(stream, true);

            if (ar.ReadUInt32() != CHNK_MAGIC)
            {
                return(chunk);
            }

            ar.BaseStream.Position += 4; // Always 255?
            int blockCount = ar.ReadInt32();

            ar.BaseStream.Position += 8; // Skips 1, 2 (16-bits)

            int[]  blockSize  = new int[blockCount];
            bool[] compressed = new bool[blockCount]; // Uncompressed by default

            // Reads block details
            for (int i = 0; i < blockCount; i++)
            {
                blockSize[i]            = ar.ReadInt32();
                ar.BaseStream.Position += 4; // Decompressed size (Not needed)

                // Sets as compressed if it meets the requirement
                compressed[i] = ar.ReadInt32() == 0x1000000;

                ar.BaseStream.Position += 4; // Offset (Not needed)
            }

            for (int i = 0; i < blockCount; i++)
            {
                // Reads block bytes
                byte[] block = ar.ReadBytes(blockSize[i]);

                // Decompresses if needed
                if (block.Length > 0 && compressed[i])
                {
                    block        = Compression.InflateBlock(block, CompressionType.ZLIB);
                    blockSize[i] = block.Length;
                }

                chunk.Entries.Add(new ChunkEntry()
                {
                    Data       = block,
                    Compressed = false
                });

                // TODO: Write blocks to stream, and parse internal file system instead
                // ms.Write(block, 0, block.Length);
            }

            return(chunk);
        }
コード例 #22
0
        protected MiloObjectDirEntry ParseWorldDir(AwesomeReader ar, MiloObjectDir dir)
        {
            // Read past unknown stuff, big hack
            int    unk1 = ar.ReadInt32();
            int    unk2 = ar.ReadInt32();
            float  unk3 = ar.ReadSingle();
            string unk4 = ar.ReadString();
            int    unk5 = ar.ReadInt32();
            int    unk6 = ar.ReadInt32();

            // Hack for project 9
            var dirEntry = new MiloObjectDirEntry()
            {
                Name = dir.Name
            };

            dirEntry.Version     = ar.ReadInt32();
            dirEntry.SubVersion  = ar.ReadInt32();
            dirEntry.ProjectName = ar.ReadString();

            // Skip matrices + constants
            var matCount = ar.ReadInt32(); // Usually 7

            ar.BaseStream.Position += (matCount * 48) + 9;

            // Read imported milos
            var importedMiloCount = ar.ReadInt32();

            dirEntry.ImportedMiloPaths = Enumerable.Range(0, importedMiloCount)
                                         .Select(x => ar.ReadString())
                                         .ToArray();

            // Boolean, true when sub directory?
            ar.ReadBoolean();

            // Sub directory names seem to be in reverse order of serialization...
            var subDirCount = ar.ReadInt32();
            var subDirNames = Enumerable.Range(0, subDirCount)
                              .Select(x => ar.ReadString())
                              .ToArray();

            // Read subdirectories
            foreach (var _ in subDirNames.Reverse())
            {
                var subDir = new MiloObjectDir();
                ReadFromStream(ar, subDir);

                dirEntry.SubDirectories.Add(subDir);
            }

            ar.BaseStream.Position += 17; // 0'd data + ADDE
            return(dirEntry);
        }
コード例 #23
0
ファイル: Tone2.cs プロジェクト: PikminGuts92/BFForever
        internal override void ReadData(AwesomeReader ar)
        {
            Pedals.Clear();
            Processors.Clear();

            AmpPath     = ar.ReadUInt64();
            GainLevel   = ar.ReadSingle();
            BassLevel   = ar.ReadSingle();
            MidLevel    = ar.ReadSingle();
            TrebleLevel = ar.ReadSingle();
            ReverbLevel = ar.ReadSingle();
            VolumeLevel = ar.ReadSingle();

            AmpReverb = ar.ReadUInt64();

            int pedalCount = ar.ReadInt32();

            ar.BaseStream.Position += 4;

            int processorCount = ar.ReadInt32();

            ar.BaseStream.Position += 4;

            // Reads pedals
            for (int i = 0; i < pedalCount; i++)
            {
                Pedal pedal = new Pedal();
                pedal.ModelPath = ar.ReadUInt64();
                pedal.Flag1     = ar.ReadBoolean();
                pedal.Flag2     = ar.ReadBoolean();
                pedal.Flag3     = ar.ReadBoolean();
                pedal.Flag4     = ar.ReadBoolean();

                pedal.Knob1 = ar.ReadSingle();
                pedal.Knob2 = ar.ReadSingle();
                pedal.Knob3 = ar.ReadSingle();

                Pedals.Add(pedal);
            }

            // Reads audio processors
            for (int i = 0; i < processorCount; i++)
            {
                AudioProcessor processor = new AudioProcessor();
                processor.ModelPath = ar.ReadUInt64();

                processor.Knob1 = ar.ReadSingle();
                processor.Knob2 = ar.ReadSingle();

                Processors.Add(processor);
            }
        }
コード例 #24
0
ファイル: UILocStrings.cs プロジェクト: maxton/BFForever
        protected override void ImportData(AwesomeReader ar)
        {
            int count = ar.ReadInt32();

            ar.ReadInt32(); // Always 4

            // Reads all fstring entries
            for (int i = 0; i < count; i++)
            {
                FString fstring = new FString(ar.ReadInt64());
                Entries.Add(fstring);
            }
        }
コード例 #25
0
        public void ReadFromStream(Stream stream, ISerializable data)
        {
            var serializer = Serializers.FirstOrDefault(x => x.IsOfType(data));

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

            var ar = new AwesomeReader(stream, Info.BigEndian);

            serializer.ReadFromStream(ar, data);
        }
コード例 #26
0
        internal override void ReadData(AwesomeReader ar)
        {
            Entries.Clear();

            int count = ar.ReadInt32();

            ar.BaseStream.Position += 4; // Offset is always 4

            // Reads entries
            for (int i = 0; i < count; i++)
            {
                Entries.Add(ar.ReadUInt64());
            }
        }
コード例 #27
0
ファイル: Catalog2.cs プロジェクト: maxton/BFForever
        protected override void ImportData(AwesomeReader ar)
        {
            int count = ar.ReadInt32();

            ar.ReadInt32(); // Offset to entries (Always 4)

            for (int i = 0; i < count; i++)
            {
                // Reads each entry
                Catalog2Entry entry = new Catalog2Entry();
                entry.ImportData(ar);
                Entries.Add(entry);
            }
        }
コード例 #28
0
        protected MiloObject ParseDirEntryAsBlob(AwesomeReader ar, MiloObjectDir dir, string dirType)
        {
            // Reads data as a byte array
            var entrySize  = GuessEntrySize(ar);
            var entryBytes = new MiloObjectBytes(dirType)
            {
                Name = dir.Name
            };

            entryBytes.Data = ar.ReadBytes((int)entrySize);

            ar.BaseStream.Position += 4;
            return(entryBytes);
        }
コード例 #29
0
        /// <summary>
        /// Parse chunk data from riff file
        /// </summary>
        /// <param name="input">Riff stream</param>
        private void ParseRiff(Stream input)
        {
            using (AwesomeReader ar = new AwesomeReader(input))
            {
                // Checks for "RIFF" magic.
                switch (ar.ReadInt32())
                {
                case Constant.RIFF_R:     // "FFIR"
                    ar.BigEndian = true;
                    break;

                case Constant.RIFF:
                    // Reader is already little endian by default.
                    break;

                default:
                    throw new Exception("Invalid magic. Expected \"RIFF\"");
                }

                BigEndian = ar.BigEndian; // Sets endianess

                int size = ar.ReadInt32();

                Chunk headChunk = Chunk.FromStream(ar);
                if (headChunk == null || !(headChunk is Index))
                {
                    throw new Exception("Could not find index chunk");
                }

                foreach (IndexEntry entry in ((Index)headChunk).Entries)
                {
                    ar.BaseStream.Position = entry.Offset; // Goes to chunk offset

                    // Reads chunk
                    // - If it was a string table then all values will be added to global strings
                    Chunk chunk = Chunk.FromStream(ar);

                    if (chunk != null && chunk is ZObject)
                    {
                        // Adds object to riff collection
                        Objects.Add(chunk as ZObject);
                    }
                    else if (chunk != null && chunk is StringTable)
                    {
                        // Adds table to riff collection
                        Tables.Add(chunk as StringTable);
                    }
                }
            }
        }
コード例 #30
0
ファイル: Instrument.cs プロジェクト: maxton/BFForever
        protected override void ImportData(AwesomeReader ar)
        {
            InstrumentType = ar.ReadInt64();
            Difficulty     = ar.ReadInt64();
            ar.ReadInt64(); // Should be zero'd
            TuningName = ar.ReadInt64();

            // Reads 1st string info.
            ar.ReadInt16();
            RealTuning1   = ar.ReadByte();
            OffsetTuning1 = ar.ReadByte();

            // Reads 2nd string info.
            ar.ReadInt16();
            RealTuning2   = ar.ReadByte();
            OffsetTuning2 = ar.ReadByte();

            // Reads 3rd string info.
            ar.ReadInt16();
            RealTuning3   = ar.ReadByte();
            OffsetTuning3 = ar.ReadByte();

            // Reads 4th string info.
            ar.ReadInt16();
            RealTuning4   = ar.ReadByte();
            OffsetTuning4 = ar.ReadByte();

            // Reads 5th string info.
            ar.ReadInt16();
            RealTuning5   = ar.ReadByte();
            OffsetTuning5 = ar.ReadByte();

            // Reads 6th string info.
            ar.ReadInt16();
            RealTuning6   = ar.ReadByte();
            OffsetTuning6 = ar.ReadByte();

            ar.ReadInt64(); // Should be zero'd
            int  count            = ar.ReadInt32();
            int  offset           = ar.ReadInt32();
            long previousPosition = ar.BaseStream.Position;

            // Reads entry paths.
            ar.BaseStream.Position += offset - 4;
            for (int i = 0; i < count; i++)
            {
                EntryPaths.Add(ar.ReadInt64());
            }
        }