Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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;
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }