private static void LoadPathConnections(JsonElement element, out IImmutableSet <int> incomingPaths, out IImmutableSet <int> outgoingPaths, out int usePathsOf) { incomingPaths = ImmutableSortedSet <int> .Empty; outgoingPaths = ImmutableSortedSet <int> .Empty; usePathsOf = element.GetInt32Prop("usePathsOf", -1); if (usePathsOf != -1) { if (element.TryGetProperty("incomingPaths", out _) || element.TryGetProperty("outgoingPaths", out _)) { throw new InvalidOperationException( "If usePathsOf is used, incoming and outgoing Paths are not allowed."); } return; } if (element.TryGetProperty("incomingPaths", out var incomingPathsElement)) { incomingPaths = LoadPathIdList(incomingPathsElement); } if (element.TryGetProperty("outgoingPaths", out var outgoingPathsElement)) { outgoingPaths = LoadPathIdList(outgoingPathsElement); } }
public static WorldMapLocation LoadFromJson(JsonElement element) { var name = element.GetStringProp("name"); var x = element.GetInt32Prop("x"); var y = element.GetInt32Prop("y"); var radius = element.GetInt32Prop("radius"); var teleportMapId = element.GetInt32Prop("teleportMapId"); var initialStateJson = element.GetStringProp("initialState", JsonInitialStateUndiscovered); var initialState = initialStateJson switch { JsonInitialStateUndiscovered => WorldMapLocationState.Undiscovered, JsonInitialStateDiscovered => WorldMapLocationState.Discovered, JsonInitialStateVisited => WorldMapLocationState.Visited, _ => throw new InvalidOperationException($"Invalid initial state: {initialStateJson}") }; var areaIds = LoadAreaIds(element); var images = ImmutableList <WorldMapImage> .Empty; if (element.TryGetProperty("images", out var imagesElement)) { try { images = LoadImagesFromJson(imagesElement); } catch (Exception e) { throw new InvalidOperationException($"Failed to parse images: {e}"); } } LoadPathConnections(element, out var incomingPaths, out var outgoingPaths, out var usePathsOf); return(new WorldMapLocation( name, areaIds, teleportMapId, new Point(x, y), radius, images.ToImmutableList(), usePathsOf, outgoingPaths, incomingPaths, initialState )); }