using System;
using System.Collections.Generic;
using System.Linq;
namespace Gibbed.Borderlands2.GameInfo.Loaders
{
internal static class TravelStationDefinitionLoader
{
public static InfoDictionary<TravelStationDefinition> Load(
InfoDictionary<DownloadableContentDefinition> downloadableContents)
{
try
{
var raws = LoaderHelper
.DeserializeJson<Dictionary<string, Raw.TravelStationDefinition>>("Travel Stations");
var defs = new InfoDictionary<TravelStationDefinition>(
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<DownloadableContentDefinition> downloadableContents,
KeyValuePair<string, Raw.TravelStationDefinition> 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<string, Raw.TravelStationDefinition> 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<string, Raw.TravelStationDefinition> 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<MissionStatusData> GetMissionStatusData(IEnumerable<Raw.MissionStatusData> 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();
}
}
}