Пример #1
0
    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);
        }
    }
Пример #2
0
    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
                   ));
    }