Example #1
0
 partial void PatrolScriptMarkerCustomParse(OverlayStream stream, int offset)
 {
     if (stream.ReadSubrecordFrame().Content.Length != 0)
     {
         throw new ArgumentException($"Marker had unexpected length.");
     }
 }
Example #2
0
            public partial ParseResult PatrolScriptMarkerCustomParse(OverlayStream stream, int offset, PreviousParse lastParsed)
            {
                if (stream.ReadSubrecordFrame().Content.Length != 0)
                {
                    throw new ArgumentException($"Marker had unexpected length.");
                }

                return(lastParsed);
            }
Example #3
0
            partial void UnusedConditionsLogicCustomParse(OverlayStream stream, int offset)
            {
                var nextHeader = stream.ReadSubrecordFrame();

                if (nextHeader.RecordType != RecordTypes.NEXT ||
                    nextHeader.Content.Length != 0)
                {
                    throw new ArgumentException("Unexpected NEXT header");
                }
                UnusedConditions = ConditionBinaryOverlay.ConstructBinayOverlayList(stream, _package);
            }
Example #4
0
            partial void LengthLogicCustomParse(OverlayStream stream, int offset)
            {
                var xxxxHeader = stream.ReadSubrecordFrame();

                if (xxxxHeader.Content.Length != 4)
                {
                    throw new ArgumentException("Unexpected length");
                }
                var len = checked ((int)BinaryPrimitives.ReadUInt32LittleEndian(xxxxHeader.Content));

                stream.ReadSubrecord();
                _dataSpan        = _data.Slice(stream.Position - offset, len);
                stream.Position += checked ((int)len);
            }
Example #5
0
            public partial ParseResult TrapFormCustomParse(OverlayStream stream, int offset)
            {
                var subRec = stream.ReadSubrecordFrame();

                if (subRec.Content.Length != 4)
                {
                    throw new ArgumentException("Unexpected length");
                }
                var form = FormKeyBinaryTranslation.Instance.Parse(subRec.Content, _package.MetaData.MasterReferences !);

                switch (this)
                {
                case PlacedArrowBinaryOverlay arrow:
                    arrow.Projectile = new FormLink <IProjectileGetter>(form);
                    break;

                case PlacedBeamBinaryOverlay beam:
                    beam.Projectile = new FormLink <IProjectileGetter>(form);
                    break;

                case PlacedFlameBinaryOverlay flame:
                    flame.Projectile = new FormLink <IProjectileGetter>(form);
                    break;

                case PlacedConeBinaryOverlay cone:
                    cone.Projectile = new FormLink <IProjectileGetter>(form);
                    break;

                case PlacedBarrierBinaryOverlay barrier:
                    barrier.Projectile = new FormLink <IProjectileGetter>(form);
                    break;

                case PlacedTrapBinaryOverlay trap:
                    trap.Projectile = new FormLink <IProjectileGetter>(form);
                    break;

                case PlacedHazardBinaryOverlay hazard:
                    hazard.Hazard = new FormLink <IHazardGetter>(form);
                    break;

                case PlacedMissileBinaryOverlay missile:
                    missile.Projectile = new FormLink <IProjectileGetter>(form);
                    break;

                default:
                    throw new NotImplementedException();
                }

                return(null);
            }
Example #6
0
            public static IReadOnlyList <ConditionBinaryOverlay> ConstructBinayOverlayCountedList(OverlayStream stream, BinaryOverlayFactoryPackage package)
            {
                var counterMeta = stream.ReadSubrecordFrame();

                if (counterMeta.RecordType != RecordTypes.CITC ||
                    counterMeta.Content.Length != 4)
                {
                    throw new ArgumentException();
                }
                var count = BinaryPrimitives.ReadUInt32LittleEndian(counterMeta.Content);
                var ret   = ConstructBinayOverlayList(stream, package);

                if (count != ret.Count)
                {
                    throw new ArgumentException("Number of parsed conditions did not matched labeled count.");
                }
                return(ret);
            }
Example #7
0
 public partial ParseResult EndCustomParse(OverlayStream stream, int offset, PreviousParse lastParsed)
 {
     stream.ReadSubrecordFrame();
     return(lastParsed);
 }
Example #8
0
 partial void AnimationCountCustomParse(OverlayStream stream, int offset)
 {
     // Skip. Don't care
     stream.ReadSubrecordFrame();
 }
Example #9
0
 public partial ParseResult NextAliasIDCustomParse(OverlayStream stream, int offset)
 {
     stream.ReadSubrecordFrame();
     return(null);
 }
Example #10
0
        partial void PointToPointConnectionsCustomParse(OverlayStream stream, long finalPos, int offset, RecordType type, int?lastParsed)
        {
            var  dataFrame = stream.ReadSubrecordFrame();
            uint ptCount   = BinaryPrimitives.ReadUInt16LittleEndian(dataFrame.Content);

            var pgrpMeta = stream.GetSubrecord();

            if (pgrpMeta.RecordType != PathGridBinaryCreateTranslation.PGRP)
            {
                return;
            }
            stream.Position += pgrpMeta.HeaderLength;
            var pointData     = stream.ReadMemory(pgrpMeta.ContentLength);
            var bytePointsNum = pgrpMeta.ContentLength / PathGridBinaryCreateTranslation.POINT_LEN;

            if (bytePointsNum != ptCount)
            {
                throw new ArgumentException($"Unexpected point byte length, when compared to expected point count. {pgrpMeta.ContentLength} bytes: {bytePointsNum} != {ptCount} points.");
            }

            bool readPGRR = false;

            for (int recAttempt = 0; recAttempt < 2; recAttempt++)
            {
                if (stream.Complete)
                {
                    break;
                }
                var subMeta = stream.GetSubrecord();
                switch (subMeta.RecordType.TypeInt)
                {
                case 0x47414750:     //"PGAG":
                    this._PGAGLocation = stream.Position - offset;
                    stream.Position   += subMeta.TotalLength;
                    break;

                case 0x52524750:     // "PGRR":
                    stream.Position += subMeta.HeaderLength;
                    var connectionPtData = stream.ReadMemory(subMeta.ContentLength);
                    this.PointToPointConnections = BinaryOverlayList.FactoryByLazyParse <IPathGridPointGetter>(
                        pointData,
                        _package,
                        getter: (s, p) =>
                    {
                        var connectionInts = connectionPtData.Span.AsInt16Span();
                        IPathGridPointGetter[] pathGridPoints = new IPathGridPointGetter[bytePointsNum];
                        for (int i = 0; i < bytePointsNum; i++)
                        {
                            var pt = PathGridPointBinaryOverlay.Factory(s, p);
                            pt.Connections.AddRange(connectionInts.Slice(0, pt.NumConnections).ToArray());
                            pathGridPoints[i] = pt;
                            s = s.Slice(16);
                            connectionInts = connectionInts.Slice(pt.NumConnections);
                        }
                        return(pathGridPoints);
                    });
                    readPGRR = true;
                    break;

                default:
                    break;
                }
            }

            if (!readPGRR)
            {
                this.PointToPointConnections = BinaryOverlayList.FactoryByStartIndex <IPathGridPointGetter>(
                    pointData,
                    this._package,
                    itemLength: 16,
                    getter: (s, p) =>
                {
                    return(PathGridBinaryCreateTranslation.ReadPathGridPoint(s, out var numConn));
                });
            }
        }
Example #11
0
 public partial ParseResult DataMarkerCustomParse(OverlayStream stream, int offset)
 {
     // Skip marker
     stream.ReadSubrecordFrame();
     return(null);
 }
Example #12
0
 partial void EndCustomParse(OverlayStream stream, int offset)
 {
     stream.ReadSubrecordFrame();
 }
Example #13
0
 partial void CompletionConditionsCustomParse(OverlayStream stream, long finalPos, int offset, RecordType type, int?lastParsed)
 {
     stream.ReadSubrecordFrame();
     CompletionConditions = ConditionBinaryOverlay.ConstructBinayOverlayList(stream, _package);
 }
Example #14
0
            private void ParseRegionData(OverlayStream stream, int offset)
            {
                int loc       = stream.Position - offset;
                var rdatFrame = stream.ReadSubrecordFrame();

                RegionData.RegionDataType dataType = (RegionData.RegionDataType)BinaryPrimitives.ReadUInt32LittleEndian(rdatFrame.Content);
                var len = rdatFrame.TotalLength;

                if (!stream.Complete)
                {
                    var contentMeta = stream.GetSubrecord();
                    var recType     = contentMeta.RecordType;
                    if (recType == RecordTypes.ICON)
                    {
                        var totalLen = contentMeta.TotalLength;
                        len += totalLen;
                        // Skip icon subrecord for now
                        contentMeta = stream.GetSubrecord(offset: rdatFrame.TotalLength + totalLen);
                    }
                    if (RegionBinaryCreateTranslation.IsExpected(dataType, contentMeta.RecordType))
                    {
                        len             += contentMeta.TotalLength;
                        stream.Position += contentMeta.TotalLength;
                    }
                }
                switch (dataType)
                {
                case RegionData.RegionDataType.Object:
                    _ObjectsSpan = this._data.Slice(loc, len);
                    break;

                case RegionData.RegionDataType.Map:
                    _MapSpan = this._data.Slice(loc, len);
                    break;

                case RegionData.RegionDataType.Grass:
                    _GrassesSpan = this._data.Slice(loc, len);
                    break;

                case RegionData.RegionDataType.Land:
                    _LandSpan = this._data.Slice(loc, len);
                    break;

                case RegionData.RegionDataType.Sound:
                    if (stream.TryGetSubrecord(out var nextRec) &&
                        (nextRec.RecordType.Equals(RegionBinaryCreateTranslation.RDSA) ||
                         nextRec.RecordType.Equals(RegionBinaryCreateTranslation.RDMO)))
                    {
                        len += nextRec.TotalLength;
                    }
                    _SoundsSpan = this._data.Slice(loc, len);
                    break;

                case RegionData.RegionDataType.Weather:
                    _WeatherSpan = this._data.Slice(loc, len);
                    break;

                default:
                    throw new NotImplementedException();
                }
            }
Example #15
0
 partial void DataMarkerCustomParse(OverlayStream stream, int offset)
 {
     // Skip marker
     stream.ReadSubrecordFrame();
 }
Example #16
0
 public partial ParseResult AnimationCountCustomParse(OverlayStream stream, int offset)
 {
     // Skip. Don't care
     stream.ReadSubrecordFrame();
     return null;
 }