Пример #1
0
                    public static ArmourStrength ReadFrom(PrimitiveReader reader)
                    {
                        ArmourStrength value;

                        value.GroupType = reader.ReadInt16();
                        value.Amount    = reader.ReadInt16();
                        return(value);
                    }
Пример #2
0
                    public static ResourceCost ReadFrom(PrimitiveReader reader)
                    {
                        ResourceCost value;

                        value.Type    = reader.ReadInt16();
                        value.Amount  = reader.ReadInt16();
                        value.Unknown = reader.ReadInt16();
                        return(value);
                    }
Пример #3
0
        public async ValueTask Read(PrimitiveReader primitiveReader, CancellationToken cancellationToken)
        {
            BoolValue = await primitiveReader.ReadBool(cancellationToken);

            ByteValue = await primitiveReader.ReadByte(cancellationToken);

            SByteValue = await primitiveReader.ReadSByte(cancellationToken);

            ShortValue = await primitiveReader.ReadInt16(cancellationToken);

            UShortValue = await primitiveReader.ReadUInt16(cancellationToken);

            IntValue = await primitiveReader.ReadInt32(cancellationToken);

            UIntValue = await primitiveReader.ReadUInt32(cancellationToken);

            LongValue = await primitiveReader.ReadInt64(cancellationToken);

            ULongValue = await primitiveReader.ReadUInt64(cancellationToken);

            FloatValue = await primitiveReader.ReadSingle(cancellationToken);

            DoubleValue = await primitiveReader.ReadDouble(cancellationToken);

            StringValue = await primitiveReader.ReadString(cancellationToken);

            deserializationCounter++;
        }
Пример #4
0
        public void ShouldReadAndWriteLimits()
        {
            var stream = new MemoryStream();

            using (var writer = new PrimitiveWriter(stream))
            {
                writer.Write(byte.MinValue);
                writer.Write(byte.MaxValue);
                writer.Write(sbyte.MinValue);
                writer.Write(sbyte.MaxValue);
                writer.Write(short.MinValue);
                writer.Write(short.MaxValue);
                writer.Write(ushort.MinValue);
                writer.Write(ushort.MaxValue);
                writer.Write(int.MinValue);
                writer.Write(int.MaxValue);
                writer.Write(uint.MinValue);
                writer.Write(uint.MaxValue);
                writer.Write(long.MinValue);
                writer.Write(long.MaxValue);
                writer.Write(ulong.MinValue);
                writer.Write(ulong.MaxValue);
            }
            var position = stream.Position;

            stream.Seek(0, SeekOrigin.Begin);
            using (var reader = new PrimitiveReader(stream))
            {
                Assert.AreEqual(byte.MinValue, reader.ReadByte());
                Assert.AreEqual(byte.MaxValue, reader.ReadByte());
                Assert.AreEqual(sbyte.MinValue, reader.ReadSByte());
                Assert.AreEqual(sbyte.MaxValue, reader.ReadSByte());
                Assert.AreEqual(short.MinValue, reader.ReadInt16());
                Assert.AreEqual(short.MaxValue, reader.ReadInt16());
                Assert.AreEqual(ushort.MinValue, reader.ReadUInt16());
                Assert.AreEqual(ushort.MaxValue, reader.ReadUInt16());
                Assert.AreEqual(int.MinValue, reader.ReadInt32());
                Assert.AreEqual(int.MaxValue, reader.ReadInt32());
                Assert.AreEqual(uint.MinValue, reader.ReadUInt32());
                Assert.AreEqual(uint.MaxValue, reader.ReadUInt32());
                Assert.AreEqual(long.MinValue, reader.ReadInt64());
                Assert.AreEqual(long.MaxValue, reader.ReadInt64());
                Assert.AreEqual(ulong.MinValue, reader.ReadUInt64());
                Assert.AreEqual(ulong.MaxValue, reader.ReadUInt64());
            }
            Assert.AreEqual(position, stream.Position, StreamCorruptedMessage);
        }
Пример #5
0
                public static ResearchStat ReadFrom(PrimitiveReader reader)
                {
                    ResearchStat s = new ResearchStat();

                    s.Status   = reader.ReadInt16();
                    s.Unknown1 = reader.ReadUInt32();
                    s.Unknown2 = reader.ReadUInt32();
                    s.Unknown3 = reader.ReadUInt32();
                    return(s);
                }
 public void ShouldReadAndWriteLimits()
 {
     var stream = new MemoryStream();
     using(var writer = new PrimitiveWriter(stream))
     {
         writer.Write(byte.MinValue);
         writer.Write(byte.MaxValue);
         writer.Write(sbyte.MinValue);
         writer.Write(sbyte.MaxValue);
         writer.Write(short.MinValue);
         writer.Write(short.MaxValue);
         writer.Write(ushort.MinValue);
         writer.Write(ushort.MaxValue);
         writer.Write(int.MinValue);
         writer.Write(int.MaxValue);
         writer.Write(uint.MinValue);
         writer.Write(uint.MaxValue);
         writer.Write(long.MinValue);
         writer.Write(long.MaxValue);
         writer.Write(ulong.MinValue);
         writer.Write(ulong.MaxValue);
     }
     var position = stream.Position;
     stream.Seek(0, SeekOrigin.Begin);
     using(var reader = new PrimitiveReader(stream))
     {
         Assert.AreEqual(byte.MinValue, reader.ReadByte());
         Assert.AreEqual(byte.MaxValue, reader.ReadByte());
         Assert.AreEqual(sbyte.MinValue, reader.ReadSByte());
         Assert.AreEqual(sbyte.MaxValue, reader.ReadSByte());
         Assert.AreEqual(short.MinValue, reader.ReadInt16());
         Assert.AreEqual(short.MaxValue, reader.ReadInt16());
         Assert.AreEqual(ushort.MinValue, reader.ReadUInt16());
         Assert.AreEqual(ushort.MaxValue, reader.ReadUInt16());
         Assert.AreEqual(int.MinValue, reader.ReadInt32());
         Assert.AreEqual(int.MaxValue, reader.ReadInt32());
         Assert.AreEqual(uint.MinValue, reader.ReadUInt32());
         Assert.AreEqual(uint.MaxValue, reader.ReadUInt32());
         Assert.AreEqual(long.MinValue, reader.ReadInt64());
         Assert.AreEqual(long.MaxValue, reader.ReadInt64());
         Assert.AreEqual(ulong.MinValue, reader.ReadUInt64());
         Assert.AreEqual(ulong.MaxValue, reader.ReadUInt64());
     }
     Assert.AreEqual(position, stream.Position, StreamCorruptedMessage);
 }
Пример #7
0
        void ProcessFormatChunk( RiffChunkHeader chunk, PrimitiveReader reader )
        {
            byte[] chunkData = reader.ReadBytes( chunk.DataSize );
            Stream source = reader.stream;
            reader.stream = new MemoryStream( chunkData );
            int audioFormat = reader.ReadUInt16();
            Metadata["WAVE audio format"] = ((AudioFormat)audioFormat).ToString();
            int channels = reader.ReadInt16();
            Metadata[MetadataKeys.Channels] = channels.ToString();
            int sampleRate = reader.ReadInt32();
            Metadata[MetadataKeys.SampleRate] = sampleRate.ToString();
            int byteRate = reader.ReadInt32();
            int blockAlign = reader.ReadInt16();
            int bitsPerSample = reader.ReadInt16();
            Metadata[MetadataKeys.BitsPerSample] = bitsPerSample.ToString();
            int extraInfoSize = 0;
            #pragma warning disable 0618
            // Usually, only very old wave files don't have this
            // field included. (WaveFormat structure, not WaveFormatEx structure)
            // Supress the warning because it's a MemoryStream.
            if( reader.Position != reader.Length ) {
                extraInfoSize = reader.ReadUInt16();
            }
            #pragma warning restore 0618

            this.freq = sampleRate;
            transformer = EmptyTransformer.Instance;
            this.channels = channels;
            this.bitsPerSample = bitsPerSample;
            codecBitsPerSample = bitsPerSample;

            switch( (AudioFormat)audioFormat ) {
                case AudioFormat.Pcm: // No compression.
                    if( bitsPerSample == 16 && reader.BigEndian ) {
                        transformer = BigEndian16BitTo16BitTransformer.Instance;
                    }
                    break;

                case AudioFormat.IeeeFloat:
                    if( bitsPerSample == 32 ) {
                        this.bitsPerSample = 16;
                    } else if( bitsPerSample == 64 ) {
                        this.bitsPerSample = 16;
                    }
                    throw new NotSupportedException();
                    break;

                case AudioFormat.ALaw:
                    transformer = ALawTransformer.Instance;
                    this.bitsPerSample = 16;
                    break;

                case AudioFormat.MuLaw:
                    transformer = MuLawTransformer.Instance;
                    this.bitsPerSample = 16;
                    break;

                    // TODO: Properly test this transformer, but I can't seem to find any wave files that use this format.
                case AudioFormat.DialogicOkiAdpcm:
                    transformer = DialogicAdpcmTransformer.Instance;
                    this.bitsPerSample = 16;
                    break;

                    // TODO: Test this transformer too.
                case AudioFormat.ImaAdpcm:
                    transformer = ImaAdpcmTransformer.Instance;
                    this.bitsPerSample = 16;
                    break;

                case AudioFormat.Extensible:
                    ushort validBitsPerSample = reader.ReadUInt16();
                    uint channelMask = reader.ReadUInt32();
                    Guid subFormat = reader.ReadGuid();
                    Metadata["extensible guid"] = subFormat.ToString();
                    if( subFormat == PcmGuid ) {
                    } else if( subFormat == IeeeFloatGuid ) {
                        throw new NotSupportedException( "Ieee float sub format not supported." );
                    } else if( subFormat == DrmGuid ) {
                        throw new NotSupportedException( "Drm sub format not supported." );
                    } else if( subFormat == AlawGuid ) {
                        transformer = ALawTransformer.Instance;
                        this.bitsPerSample = 16;
                    } else if( subFormat == MulawGuid ) {
                        transformer = MuLawTransformer.Instance;
                        this.bitsPerSample = 16;
                    } else if( subFormat == AdpcmGuid ) {
                        throw new NotSupportedException( "Adpcm sub format not supported." );
                    } else if( subFormat == MpegGuid ) {
                        throw new NotSupportedException( "Mpeg sub format not supported." );
                    } else {
                        throw new NotSupportedException( "Unsupported sub format: " + subFormat );
                    }
                    break;

                default:
                    throw new NotSupportedException( "Unsupported audio format: " + (AudioFormat)audioFormat );
            }
            reader.stream = source;
        }
Пример #8
0
        void ProcessCommonChunk( AiffChunkHeader chunk, PrimitiveReader reader )
        {
            byte[] chunkData = reader.ReadBytes( chunk.DataSize );
            Stream source = reader.stream;
            reader.stream = new MemoryStream( chunkData );
            int channelsCount = reader.ReadInt16();
            uint frameCount = reader.ReadUInt32();
            int bitsPerSample = reader.ReadInt16();
            byte[] sampleRateBytes = reader.ReadBytes( 10 );
            double sampleRate = ConvertFromIeeeExtended( sampleRateBytes );
            Console.WriteLine( sampleRate );

            AppendInfoLine( 2, "Channels Count: {0}", channelsCount );
            AppendInfoLine( 2, "Sample rate (frames/sec): {0}", sampleRate );
            AppendInfoLine( 2, "Bits per sample: {0}", bitsPerSample );
            AppendInfoLine( 2, "Frame count: {0}", frameCount );

            int byteRate = (int)Math.Ceiling( sampleRate ) * channelsCount * bitsPerSample / 8;
            info.Frequency = (int)sampleRate;
            Console.WriteLine( "BPS:" + bitsPerSample + ", SR:" + info.Frequency );

            transformer = EmptyTransformer.Instance;
            if( bitsPerSample > 8 && bitsPerSample <= 16 ) {
                transformer = BigEndian16BitTo16BitTransformer.Instance;
            }
            if( bitsPerSample > 16 && bitsPerSample <= 24 ) {
                transformer = BigEndian24BitTo16BitTransformer.Instance;
            }
            // Number of bytes that make up a second's worth of audio data.
            bufferSize = byteRate;
            info.Channels = channelsCount;
            actualBitsPerSample = bitsPerSample;
            // TODO: Remove this hackery.
            if( bitsPerSample > 16 )
                bitsPerSample = 16;
            info.BitsPerSample = bitsPerSample;
            if( aifcFormat ) {
                string compressionType = reader.ReadASCIIString( 4 );
                string compressionName = reader.ReadASCIIString( reader.ReadByte() );
                AppendInfoLine( 2, "Compression type: {0}", compressionType );
                AppendInfoLine( 2, "Compression name: {0}", compressionName );
                switch( compressionType ) {
                    case "NONE":
                    case "sowt":
                        break;

                    case "alaw":
                    case "ALAW":
                        info.BitsPerSample = 16;
                        transformer = ALawTransformer.Instance;
                        break;

                    case "ulaw":
                    case "ULAW":
                        info.BitsPerSample = 16;
                        transformer = MuLawTransformer.Instance;
                        break;
                }
            }
            reader.stream = source;
        }
Пример #9
0
        void ProcessMetadataStreamInfo( int len, PrimitiveReader reader )
        {
            short minBlockSize = reader.ReadInt16();
            short maxBlockSize = reader.ReadInt16();
            int minFrameSize = reader.ReadUInt24();
            int maxFrameSize = reader.ReadUInt24();

            FlacBitReader bitReader = new FlacBitReader( reader );
            bitReader.BigEndian = true;
            int sampleRate = bitReader.ReadBits( 20 );
            Metadata[MetadataKeys.SampleRate] = sampleRate.ToString();
            int channels = bitReader.ReadBits( 3 ) + 1;
            Metadata[MetadataKeys.Channels] = channels.ToString();
            int bitsPerSample = bitReader.ReadBits( 5 ) + 1;
            Metadata[MetadataKeys.BitsPerSample] = bitsPerSample.ToString();
            long totalSamples = bitReader.ReadBits64( 36 );
            Metadata["Total samples"] = totalSamples.ToString();

            channelCount = channels;
            metaSampleRate = sampleRate;
            metaBitsPerSample = bitsPerSample;
            byte[] md5hash = reader.ReadBytes( 16 );
        }
Пример #10
0
                public static MasterObject ReadFrom(PrimitiveReader reader, int i)
                {
                    MasterObject value = new MasterObject();

                    byte objectType = reader.ReadUInt8();

                    value.ObjectType = objectType;
                    value.UnitId     = reader.ReadUInt16();
                    value.Unknown1   = reader.ReadUInt16();
                    value.Unknown2   = reader.ReadUInt16();
                    value.UnitClass  = reader.ReadUInt16();
                    value.Unknown3   = reader.ReadBytes(6);

                    const int breakId = -1;

                    switch (objectType)
                    {
                    default:
                        throw new NotImplementedException("Unsupported object type: " + objectType);

                    case 10:                             // Basic units
                    {
                        short  hitpoints        = reader.ReadInt16();
                        float  lengthOfSight    = reader.ReadFloat32();
                        byte   garrisonCapacity = reader.ReadUInt8();
                        float  sizeRadiusX      = reader.ReadFloat32();
                        float  sizeRadiusY      = reader.ReadFloat32();
                        ushort resourceCarriage = reader.ReadUInt16();
                        float  resourceAmount   = reader.ReadFloat32();

                        // Constants?
                        ushort unknown12 = reader.ReadUInt16();
                        byte   unknown13 = reader.ReadUInt8();
                    }
                    break;

                    case 25:                             // Same as 20, only DOPL uses this.
                    case 20:                             // Extended basic units (FLAGX)
                    {
                        value.UnitData = reader.ReadBytes(28);
                        PrimitiveReader r2               = new PrimitiveReader(value.UnitData);
                        short           hitpoints        = r2.ReadInt16();
                        float           lengthOfSight    = r2.ReadFloat32();
                        byte            garrisonCapacity = r2.ReadUInt8();
                        float           sizeRadiusX      = r2.ReadFloat32();
                        float           sizeRadiusY      = r2.ReadFloat32();

                        ulong  unknown1 = r2.ReadUInt64();
                        ushort unknown2 = r2.ReadUInt16();

                        if (unknown1 != 0 || unknown2 != 0)
                        {
                            File.WriteAllBytes("unitextended.bin", value.UnitData);
                            System.Diagnostics.Debugger.Break();
                        }

                        // Constants?
                        ushort unknown12 = r2.ReadUInt16();
                        byte   unknown13 = r2.ReadUInt8();

                        if (i == breakId)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                    } break;

                    case 30:                             // Dead units
                    {
                        value.UnitData = reader.ReadBytes(32);
                        if (i == breakId)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                    }
                    break;

                    case 60:                             // Projectiles
                    {
                        short hitpoints        = reader.ReadInt16();
                        float lengthOfSight    = reader.ReadFloat32();
                        byte  garrisonCapacity = reader.ReadUInt8();
                        float sizeRadiusX      = reader.ReadFloat32();
                        float sizeRadiusY      = reader.ReadFloat32();
                        short resourceCarriage = reader.ReadInt16();
                        float unknownFloat     = reader.ReadFloat32();
                        byte  unknown2         = reader.ReadUInt8();
                        float movementRate     = reader.ReadFloat32();

                        float extraRotationSpeed = reader.ReadFloat32();
                        float searchRadius       = reader.ReadFloat32();
                        float workRate           = reader.ReadFloat32();
                        short unknown4           = reader.ReadInt16();

                        ushort           attackStrengthsCount = reader.ReadUInt16();
                        AttackStrength[] strengths            = new AttackStrength[attackStrengthsCount];
                        for (int j = 0; j < strengths.Length; j++)
                        {
                            strengths[j] = AttackStrength.ReadFrom(reader);
                        }

                        ushort           armourStrengthsCount = reader.ReadUInt16();
                        ArmourStrength[] astrengths           = new ArmourStrength[armourStrengthsCount];
                        for (int j = 0; j < astrengths.Length; j++)
                        {
                            astrengths[j] = ArmourStrength.ReadFrom(reader);
                        }
                        float reloadTime   = reader.ReadFloat32();
                        float maximumRange = reader.ReadFloat32();

                        short accuracyPercentage = reader.ReadInt16();
                        short projectileUnitId   = reader.ReadInt16();

                        short unknown7             = reader.ReadInt16();
                        float displayedAttackRange = reader.ReadFloat32();
                        float blastRadius          = reader.ReadFloat32();
                        float minimumRange         = reader.ReadFloat32();

                        // Constants?
                        ushort unknown12 = reader.ReadUInt16();
                        byte   unknown13 = reader.ReadUInt8();

                        if (unknown2 != 0)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                        if (i == breakId)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                    } break;

                    case 70:                             // Living units
                    {
                        short hitpoints        = reader.ReadInt16();
                        float lengthOfSight    = reader.ReadFloat32();
                        byte  garrisonCapacity = reader.ReadUInt8();
                        float sizeRadiusX      = reader.ReadFloat32();
                        float sizeRadiusY      = reader.ReadFloat32();
                        short resourceCarriage = reader.ReadInt16();
                        float storageAmount    = reader.ReadFloat32();                                      // e.g. iron boar = 700

                        byte  unknown2           = reader.ReadUInt8();
                        float movementRate       = reader.ReadFloat32();
                        float extraRotationSpeed = reader.ReadFloat32();                                         // Rotation speed for extra parts - sails for ships.

                        float searchRadius = reader.ReadFloat32();
                        float workRate     = reader.ReadFloat32();
                        short unknown4     = reader.ReadInt16();

                        ushort           attackStrengthsCount = reader.ReadUInt16();
                        AttackStrength[] strengths            = new AttackStrength[attackStrengthsCount];
                        for (int j = 0; j < strengths.Length; j++)
                        {
                            strengths[j] = AttackStrength.ReadFrom(reader);
                        }

                        ushort           armourStrengthsCount = reader.ReadUInt16();
                        ArmourStrength[] astrengths           = new ArmourStrength[armourStrengthsCount];
                        for (int j = 0; j < astrengths.Length; j++)
                        {
                            astrengths[j] = ArmourStrength.ReadFrom(reader);
                        }
                        float reloadTime   = reader.ReadFloat32();
                        float maximumRange = reader.ReadFloat32();

                        short accuracyPercentage = reader.ReadInt16();
                        short projectileUnitId   = reader.ReadInt16();

                        short unknown7             = reader.ReadInt16();
                        float displayedAttackRange = reader.ReadFloat32();
                        float blastRadius          = reader.ReadFloat32();
                        float minimumRange         = reader.ReadFloat32();

                        ResourceCost res1                     = ResourceCost.ReadFrom(reader);
                        ResourceCost res2                     = ResourceCost.ReadFrom(reader);
                        ResourceCost res3                     = ResourceCost.ReadFrom(reader);
                        short        trainingTime             = reader.ReadInt16();
                        float        missileDuplicationAmount = reader.ReadFloat32();

                        // Constants?
                        ushort unknown12 = reader.ReadUInt16();
                        byte   unknown13 = reader.ReadUInt8();

                        if (i == breakId)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                    }
                    break;

                    case 80:                             // Buildings
                    {
                        short hitpoints        = reader.ReadInt16();
                        float lengthOfSight    = reader.ReadFloat32();
                        byte  garrisonCapacity = reader.ReadUInt8();
                        float sizeRadius1      = reader.ReadFloat32();
                        float sizeRadius2      = reader.ReadFloat32();
                        short resourceCarriage = reader.ReadInt16();
                        float storageAmount    = reader.ReadFloat32();

                        byte  unknown2     = reader.ReadUInt8();
                        float movementRate = reader.ReadFloat32();

                        float extraRotationSpeed = reader.ReadFloat32();                                        // Rotation speed for extra parts - something for trebuchets.
                        float searchRadius       = reader.ReadFloat32();
                        float workRate           = reader.ReadFloat32();
                        short unknown4           = reader.ReadInt16();

                        ushort           attackStrengthsCount = reader.ReadUInt16();
                        AttackStrength[] strengths            = new AttackStrength[attackStrengthsCount];
                        for (int j = 0; j < strengths.Length; j++)
                        {
                            strengths[j] = AttackStrength.ReadFrom(reader);
                        }

                        ushort           armourStrengthsCount = reader.ReadUInt16();
                        ArmourStrength[] astrengths           = new ArmourStrength[armourStrengthsCount];
                        for (int j = 0; j < astrengths.Length; j++)
                        {
                            astrengths[j] = ArmourStrength.ReadFrom(reader);
                        }
                        float reloadTime   = reader.ReadFloat32();
                        float maximumRange = reader.ReadFloat32();

                        short accuracyPercentage = reader.ReadInt16();
                        short projectileUnitId   = reader.ReadInt16();

                        short unknown7             = reader.ReadInt16();                             // Seems to have something to do with buildings
                        float displayedAttackRange = reader.ReadFloat32();
                        float blastRadius          = reader.ReadFloat32();
                        float minimumRange         = reader.ReadFloat32();

                        ResourceCost res1                     = ResourceCost.ReadFrom(reader);
                        ResourceCost res2                     = ResourceCost.ReadFrom(reader);
                        ResourceCost res3                     = ResourceCost.ReadFrom(reader);
                        short        trainingTime             = reader.ReadInt16();
                        float        missileDuplicationAmount = reader.ReadFloat32();
                        ushort       unknown14                = reader.ReadUInt16();                    // No clue at all.

                        // Constants?
                        ushort unknown12 = reader.ReadUInt16();
                        byte   unknown13 = reader.ReadUInt8();

                        if (i == breakId)
                        {
                            System.Diagnostics.Debugger.Break();
                        }
                    }
                    break;
                    }
                    return(value);
                }