     
     var elementsCount: Int { return mapElementsByPosition.count }
     var roomsCount: Int { return positionsByRoom.count }
+    var xRange = 0 ..< 0
+    var yRange = 0 ..< 0
+    var planeRange = 0 ..< 0
     
     init(startingRoom: Room? = nil) {
         if let startingRoom = startingRoom {
             let toPosition = AreaMapPosition(0, 0, 0)
-            mapElementsByPosition[toPosition] = .room(startingRoom)
-            positionsByRoom[startingRoom] = toPosition
+            add(room: startingRoom, position: toPosition)
         }
     }
     

    }
    
    func debugPrint() {
        var minX = 0
        var maxX = 0
        var minY = 0
        var maxY = 0
        var minPlane = 0
        var maxPlane = 0
        for (position, _) in mapElementsByPosition {
            minX = min(minX, position.x)
            maxX = max(maxX, position.x)
            minY = min(minY, position.y)
            maxY = max(maxY, position.y)
            minPlane = min(minPlane, position.plane)
            maxPlane = max(maxPlane, position.plane)
        }

        let elementWidth = 14

        let width = maxX - minX + 1
        let height = maxY - minY + 1
        let fillLine = [String](repeating: " ".padding(toLength: elementWidth, withPad: " ", startingAt: 0), count: width)
        var grid = [[String]](repeating: fillLine, count: height)
        
        for (position, element) in mapElementsByPosition {
            let atX = position.x - minX
            let atY = position.y - minY
            switch element {

    }

    func shift(southOf y: Int, distance: Int) {
        yRange = yRange.lowerBound ..< yRange.upperBound + distance

        let oldMapElementsByPosition = mapElementsByPosition
        
        for (oldPosition, element) in oldMapElementsByPosition {
