private DungeonRoomViewData Insert(string room, Vector2Int coordinates) { var data = new DungeonRoomViewData(room, coordinates); RoomMap[coordinates.y][coordinates.x] = Optional <DungeonRoomViewData> .Some(data); return(data); }
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), () => { }); } } } }
/** * 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(); }