public RoomLayout getPerpendicular() { List <Vector2> cons = new List <Vector2>(); foreach (var v in connections) { cons.Add(new Vector2(v.y, v.x)); } RoomLayout rl = new RoomLayout(height, width, cons); return(rl); }
public void run(out bool[,] map) { int mapWidth = 501; int mapHeight = 501; map = new bool[mapWidth, mapHeight]; RoomLayout roomBegin = new RoomLayout(5, 5, new List <Vector2>() { new Vector2(0, 2), new Vector2(4, 2), new Vector2(2, 0), new Vector2(2, 4) }); int roomBeginX = mapWidth / 2 - roomBegin.WIDTH / 2; int roomBeginY = mapHeight / 2 - roomBegin.HEIGHT / 2; bool[,] mapTemp = new bool[mapWidth, mapHeight]; if (checkAddRoom(map, mapWidth, mapHeight, roomBeginX, roomBeginY, roomBegin.WIDTH, roomBegin.HEIGHT)) { markRoom(map, roomBeginX, roomBeginY, roomBegin.WIDTH, roomBegin.HEIGHT); Room roomStart = getRoom(roomBegin, roomBeginX, roomBeginY); { Room r = roomStart;// = connectRoom(map, mapWidth, mapHeight, roomStart, tunnelLayouts[0]); for (int i = 0; i < 100; i++) { RoomLayout tunnelLayout = tunnelLayouts[(int)UnityEngine.Random.Range(0, tunnelLayouts.Count)]; Room roomBefore = r; r = connectRoom(map, mapWidth, mapHeight, r, tunnelLayout); if (r == null) { r = connectRoom(map, mapWidth, mapHeight, roomBefore, tunnelLayout.getPerpendicular()); Debug.Log("PERPENDICULAR TRY"); if (r == null) { break; } } RoomLayout roomLayout = roomLayouts[(int)UnityEngine.Random.Range(0, roomLayouts.Count)]; Room newRoomConnected = connectRoom(map, mapWidth, mapHeight, r, roomLayout); if (newRoomConnected == null) { r = roomBefore; Debug.Log("Failed to connect TRY"); } else { r = newRoomConnected; } } } } }
Room getRoom(RoomLayout layout, int x, int y) { Room r = new Room(); r.width = layout.WIDTH; r.height = layout.HEIGHT; r.x = x; r.y = y; foreach (var c in layout.connections) { r.connectionsOpen.Add(c); } return(r); }
Room connectRoom(bool[,] map, int mapWidth, int mapHeight, Room currentRoom, RoomLayout layout) { Debug.Log("new " + currentRoom); Vector2[] directions = new Vector2[] { new Vector2(1, 0), new Vector2(-1, 0), new Vector2(0, 1), new Vector2(0, -1) }; for (int connectionUsedIndex = 0; connectionUsedIndex < currentRoom.connectionsOpen.Count; connectionUsedIndex++) { Debug.Log("i " + connectionUsedIndex + "/" + currentRoom.connectionsOpen.Count); Vector2 doorPosition = currentRoom.connectionsOpen[connectionUsedIndex]; List <Vector2> availableSpots = new List <Vector2>(); for (int d = 0; d < 4; d++) { int doorX = (int)(currentRoom.x + doorPosition.x + directions[d].x); int doorY = (int)(currentRoom.y + doorPosition.y + directions[d].y); if (!checkMap(map, mapWidth, mapHeight, doorX, doorY)) { availableSpots.Add(new Vector2(doorX, doorY)); } } foreach (var spots in availableSpots) { Debug.Log("SPOT " + spots); for (int layoutConnectionIndex = 0; layoutConnectionIndex < layout.connections.Count; layoutConnectionIndex++) { var connection = layout.connections[layoutConnectionIndex]; int potentialX = (int)(spots.x - connection.x); int potentialY = (int)(spots.y - connection.y); if (checkAddRoom(map, mapWidth, mapHeight, potentialX, potentialY, layout.WIDTH, layout.HEIGHT)) { markRoom(map, potentialX, potentialY, layout.WIDTH, layout.HEIGHT); Room newRoom = getRoom(layout, potentialX, potentialY); newRoom.closeConnectionAt(layoutConnectionIndex); currentRoom.closeConnectionAt(connectionUsedIndex); Debug.Log("CONNECTED " + newRoom); return(newRoom); } } } } Debug.Log("FAIL"); return(null); }