static void ParseRegionData(MutagenFrame frame, IRegionInternal item) { var rdatFrame = frame.GetSubrecordFrame(); RegionData.RegionDataType dataType = (RegionData.RegionDataType)BinaryPrimitives.ReadUInt32LittleEndian(rdatFrame.Content); var subMeta = frame.GetSubrecord(offset: rdatFrame.TotalLength); int len = rdatFrame.TotalLength; if (IsExpected(dataType, subMeta.RecordType)) { len += subMeta.TotalLength; } switch (dataType) { case RegionData.RegionDataType.Object: item.Objects = RegionObjects.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false)); break; case RegionData.RegionDataType.Map: item.MapName = RegionMap.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false)); break; case RegionData.RegionDataType.Grass: item.Grasses = RegionGrasses.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false)); break; case RegionData.RegionDataType.Sound: if (frame.Reader.TryGetSubrecord(out var nextRec, offset: len) && (nextRec.RecordType.Equals(RDSD) || nextRec.RecordType.Equals(RDMD))) { len += nextRec.TotalLength; } item.Sounds = RegionSounds.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false)); break; case RegionData.RegionDataType.Weather: item.Weather = RegionWeather.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false)); break; case RegionData.RegionDataType.Icon: frame.Position += frame.MetaData.Constants.SubConstants.HeaderLength + rdatFrame.TotalLength; len = len - frame.MetaData.Constants.SubConstants.HeaderLength - rdatFrame.TotalLength; if (StringBinaryTranslation.Instance.Parse( frame.SpawnWithLength(len, checkFraming: false), out var iconVal)) { item.Icon = iconVal; } else { item.Icon = null; } break; default: throw new NotImplementedException(); } }
static void ParseRegionData(MutagenFrame frame, IRegionInternal item) { var rdatFrame = frame.Reader.GetSubrecordFrame(); int len = rdatFrame.TotalLength; RegionData.RegionDataType dataType = (RegionData.RegionDataType)BinaryPrimitives.ReadUInt32LittleEndian(rdatFrame.Content); if (frame.Reader.TryGetSubrecord(out var subMeta, offset: len)) { var recType = subMeta.RecordType; if (recType == RecordTypes.ICON) { len += subMeta.TotalLength; // Skip icon subrecord for now subMeta = frame.Reader.GetSubrecord(offset: rdatFrame.TotalLength + subMeta.TotalLength); } if (IsExpected(dataType, recType)) { len += subMeta.TotalLength; } } switch (dataType) { case RegionData.RegionDataType.Object: item.Objects = RegionObjects.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false)); break; case RegionData.RegionDataType.Map: item.Map = RegionMap.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false)); break; case RegionData.RegionDataType.Grass: item.Grasses = RegionGrasses.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false)); break; case RegionData.RegionDataType.Sound: if (frame.Reader.TryGetSubrecord(out var nextRec, offset: len) && (nextRec.RecordType.Equals(RDSA) || nextRec.RecordType.Equals(RDMO))) { len += nextRec.TotalLength; } item.Sounds = RegionSounds.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false)); break; case RegionData.RegionDataType.Weather: item.Weather = RegionWeather.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false)); break; case RegionData.RegionDataType.Land: item.Land = RegionLand.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false)); break; default: throw new NotImplementedException(); } }