private static MapFile ParseMapData(BinaryReader reader) { var assetNames = AssetNameCollection.Parse(reader); var result = new MapFile(); var context = new MapParseContext(assetNames); context.PushAsset(nameof(MapFile), reader.BaseStream.Length); Asset.ParseAssets(reader, context, assetName => { switch (assetName) { case AssetList.AssetName: result.AssetList = AssetList.Parse(reader, context); break; case GlobalVersion.AssetName: result.GlobalVersion = GlobalVersion.Parse(reader, context); break; case HeightMapData.AssetName: result.HeightMapData = HeightMapData.Parse(reader, context); break; case BlendTileData.AssetName: result.BlendTileData = BlendTileData.Parse(reader, context, result.HeightMapData); break; case WorldInfo.AssetName: result.WorldInfo = WorldInfo.Parse(reader, context); break; case MPPositionList.AssetName: result.MPPositionList = MPPositionList.Parse(reader, context); break; case SidesList.AssetName: result.SidesList = SidesList.Parse(reader, context, result.AssetList != null); break; case LibraryMapLists.AssetName: result.LibraryMapLists = LibraryMapLists.Parse(reader, context); break; case Teams.AssetName: result.Teams = Teams.Parse(reader, context); break; case PlayerScriptsList.AssetName: result.PlayerScriptsList = PlayerScriptsList.Parse(reader, context); break; case BuildLists.AssetName: result.BuildLists = BuildLists.Parse(reader, context, result.AssetList != null); break; case ObjectsList.AssetName: result.ObjectsList = ObjectsList.Parse(reader, context); break; case PolygonTriggers.AssetName: result.PolygonTriggers = PolygonTriggers.Parse(reader, context); break; case TriggerAreas.AssetName: result.TriggerAreas = TriggerAreas.Parse(reader, context); break; case GlobalWaterSettings.AssetName: result.GlobalWaterSettings = GlobalWaterSettings.Parse(reader, context); break; case FogSettings.AssetName: result.FogSettings = FogSettings.Parse(reader, context); break; case MissionHotSpots.AssetName: result.MissionHotSpots = MissionHotSpots.Parse(reader, context); break; case MissionObjectives.AssetName: result.MissionObjectives = MissionObjectives.Parse(reader, context); break; case StandingWaterAreas.AssetName: result.StandingWaterAreas = StandingWaterAreas.Parse(reader, context); break; case RiverAreas.AssetName: result.RiverAreas = RiverAreas.Parse(reader, context); break; case StandingWaveAreas.AssetName: result.StandingWaveAreas = StandingWaveAreas.Parse(reader, context); break; case GlobalLighting.AssetName: result.GlobalLighting = GlobalLighting.Parse(reader, context); break; case PostEffectsChunk.AssetName: result.PostEffectsChunk = PostEffectsChunk.Parse(reader, context); break; case EnvironmentData.AssetName: result.EnvironmentData = EnvironmentData.Parse(reader, context); break; case NamedCameras.AssetName: result.NamedCameras = NamedCameras.Parse(reader, context); break; case CameraAnimationList.AssetName: result.CameraAnimationList = CameraAnimationList.Parse(reader, context); break; case WaypointsList.AssetName: result.WaypointsList = WaypointsList.Parse(reader, context); break; case SkyboxSettings.AssetName: result.SkyboxSettings = SkyboxSettings.Parse(reader, context); break; default: throw new NotImplementedException(assetName); } }); context.PopAsset(); return(result); }