partial void PatrolScriptMarkerCustomParse(OverlayStream stream, int offset) { if (stream.ReadSubrecordFrame().Content.Length != 0) { throw new ArgumentException($"Marker had unexpected length."); } }
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); }
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); }
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); }
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); }
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); }
public partial ParseResult EndCustomParse(OverlayStream stream, int offset, PreviousParse lastParsed) { stream.ReadSubrecordFrame(); return(lastParsed); }
partial void AnimationCountCustomParse(OverlayStream stream, int offset) { // Skip. Don't care stream.ReadSubrecordFrame(); }
public partial ParseResult NextAliasIDCustomParse(OverlayStream stream, int offset) { stream.ReadSubrecordFrame(); return(null); }
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)); }); } }
public partial ParseResult DataMarkerCustomParse(OverlayStream stream, int offset) { // Skip marker stream.ReadSubrecordFrame(); return(null); }
partial void EndCustomParse(OverlayStream stream, int offset) { stream.ReadSubrecordFrame(); }
partial void CompletionConditionsCustomParse(OverlayStream stream, long finalPos, int offset, RecordType type, int?lastParsed) { stream.ReadSubrecordFrame(); CompletionConditions = ConditionBinaryOverlay.ConstructBinayOverlayList(stream, _package); }
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(); } }
partial void DataMarkerCustomParse(OverlayStream stream, int offset) { // Skip marker stream.ReadSubrecordFrame(); }
public partial ParseResult AnimationCountCustomParse(OverlayStream stream, int offset) { // Skip. Don't care stream.ReadSubrecordFrame(); return null; }