using System; using System.Collections.Generic; using System.Linq; namespace Gibbed.Borderlands2.GameInfo.Loaders { internal static class TravelStationDefinitionLoader { public static InfoDictionary Load( InfoDictionary downloadableContents) { try { var raws = LoaderHelper .DeserializeJson>("Travel Stations"); var defs = new InfoDictionary( raws.ToDictionary(kv => kv.Key, kv => GetTravelStationDefinition(downloadableContents, kv))); foreach (var kv in raws.Where(kv => string.IsNullOrEmpty(kv.Value.PreviousStation) == false)) { if (defs.ContainsKey(kv.Value.PreviousStation) == false) { throw ResourceNotFoundException.Create("travel station", kv.Value.PreviousStation); } defs[kv.Key].PreviousStation = defs[kv.Value.PreviousStation]; } foreach (var kv in raws .Where( kv => (kv.Value is Raw.LevelTravelStationDefinition) && string.IsNullOrEmpty(((Raw.LevelTravelStationDefinition)kv.Value).DestinationStation) == false)) { var rawLevelTravelStation = (Raw.LevelTravelStationDefinition)kv.Value; if (defs.ContainsKey(rawLevelTravelStation.DestinationStation) == false) { throw ResourceNotFoundException.Create("level travel station", rawLevelTravelStation.DestinationStation); } var levelTravelStation = (LevelTravelStationDefinition)defs[kv.Key]; levelTravelStation.DestinationStation = (LevelTravelStationDefinition)defs[rawLevelTravelStation.DestinationStation]; } return defs; } catch (Exception e) { throw new InfoLoadException("failed to load travel stations", e); } } private static TravelStationDefinition GetTravelStationDefinition( InfoDictionary downloadableContents, KeyValuePair kv) { DownloadableContentDefinition dlcExpansion = null; if (string.IsNullOrEmpty(kv.Value.DLCExpansion) == false) { if (downloadableContents.ContainsKey(kv.Value.DLCExpansion) == false) { throw ResourceNotFoundException.Create("downloadable content", kv.Value.DLCExpansion); } dlcExpansion = downloadableContents[kv.Value.DLCExpansion]; } if (kv.Value is Raw.FastTravelStationDefinition) { return GetFastTravelStationDefinition(dlcExpansion, kv); } if (kv.Value is Raw.LevelTravelStationDefinition) { return GetLevelTravelStationDefinition(dlcExpansion, kv); } throw new InvalidOperationException(); } private static TravelStationDefinition GetFastTravelStationDefinition( DownloadableContentDefinition dlcExpansion, KeyValuePair kv) { var raw = (Raw.FastTravelStationDefinition)kv.Value; return new FastTravelStationDefinition() { ResourcePath = kv.Key, ResourceName = raw.ResourceName, LevelName = raw.LevelName, DLCExpansion = dlcExpansion, StationDisplayName = raw.StationDisplayName, MissionDependencies = GetMissionStatusData(raw.MissionDependencies), InitiallyActive = raw.InitiallyActive, SendOnly = raw.SendOnly, Description = raw.Description, Sign = raw.Sign, InaccessibleObjective = raw.InaccessibleObjective, AccessibleObjective = raw.AccessibleObjective, }; } private static TravelStationDefinition GetLevelTravelStationDefinition( DownloadableContentDefinition dlcExpansion, KeyValuePair kv) { var raw = (Raw.LevelTravelStationDefinition)kv.Value; return new LevelTravelStationDefinition() { ResourcePath = kv.Key, ResourceName = raw.ResourceName, LevelName = raw.LevelName, DLCExpansion = dlcExpansion, StationDisplayName = raw.StationDisplayName, MissionDependencies = GetMissionStatusData(kv.Value.MissionDependencies), }; } private static List GetMissionStatusData(IEnumerable raws) { if (raws == null) { return null; } return raws.Select(raw => new MissionStatusData() { MissionDefinition = raw.MissionDefinition, MissionStatus = raw.MissionStatus, IsObjectiveSpecific = raw.IsObjectiveSpecific, ObjectiveDefinition = raw.ObjectiveDefinition, ObjectiveStatus = raw.ObjectiveStatus, }).ToList(); } } }