Exemple #1
0
    private DungeonRoomViewData Insert(string room, Vector2Int coordinates)
    {
        var data = new DungeonRoomViewData(room, coordinates);

        RoomMap[coordinates.y][coordinates.x] = Optional <DungeonRoomViewData> .Some(data);

        return(data);
    }
Exemple #2
0
    private void ParseDungeonRec(DungeonRoomViewData roomData)
    {
        var doors = DungeonLayout.Instance.Data.rooms[roomData.name].roomConnections;

        foreach (var direction in new[] { "up", "down", "left", "right" })
        {
            if (doors.TryGetValue(direction, out var connectedRoom))
            {
                if (!Contains(connectedRoom.targetRoom))
                {
                    DungeonRoomViewData connectedRoomData = null; // Cannot be null after switch
                    switch (direction)
                    {
                    case "up":
                        connectedRoomData = InsertAbove(connectedRoom.targetRoom, roomData.coordinates);
                        break;

                    case "down":
                        connectedRoomData = InsertBelow(connectedRoom.targetRoom, roomData.coordinates);
                        break;

                    case "left":
                        connectedRoomData = InsertLeft(connectedRoom.targetRoom, roomData.coordinates);
                        break;

                    case "right":
                        connectedRoomData = InsertRight(connectedRoom.targetRoom, roomData.coordinates);
                        break;
                    }

                    roomData.connections.Add(connectedRoomData);
                    ParseDungeonRec(connectedRoomData);
                }
                else
                {
                    // Simply search the room in the map and add a connection
                    Func <Optional <DungeonRoomViewData>, bool> predicate = o => o.Fulfills(r => r.name == connectedRoom.targetRoom);
                    var connectedRoomData = RoomMap
                                            .Find(row => row.Any(predicate))
                                            .Find(o => o.Fulfills(r => r.name == connectedRoom.targetRoom));
                    connectedRoomData.Match(r => roomData.connections.Add(r), () => { });
                }
            }
        }
    }
Exemple #3
0
    /**
     * Parse the loaded dungeon layout into a 2D grid
     *
     * TODO: Rooms can only have one door per direction, probably better to extract direction from tilemap
     */
    public void ParseDungeon()
    {
        DungeonRoomViewData initialRoom = new DungeonRoomViewData(
            DungeonLayout.Instance.Data.initialRoom,
            new Vector2Int(0, 0)
            );

        RoomMap = new List <List <Optional <DungeonRoomViewData> > >();
        RoomMap.Add(new List <Optional <DungeonRoomViewData> >());
        RoomMap[0].Add(Optional <DungeonRoomViewData> .Some(initialRoom));

        ParseDungeonRec(initialRoom);

        RoomMap.Reverse();
        ReassignCoordinates();

        RowCount    = RoomMap.Count;
        ColumnCount = RoomMap.Select(row => row.Count).Max();
    }