Exemplo n.º 1
0
    private void InitLevelPath()
    {
        // INITIAL ROOM SETUP

        m_rooms = new RoomBase[m_width * m_height]; // Whole grid of rooms

        // Set active rooms
        int activeRooms;

        if (m_numAvtiveRooms == 0 || m_numAvtiveRooms > m_rooms.Length)
        {
            activeRooms = Random.Range(m_rooms.Length / 2, m_rooms.Length);
        }
        else
        {
            activeRooms = m_numAvtiveRooms;
        }

        m_roomCode = new int[m_rooms.Length];                         // Parallel to m_rooms, this array gives the index of what room each room will be

        int currRoom = Random.Range(0, m_rooms.Length);               // Current room we are working with

        m_roomCode[currRoom] = Random.Range(1, m_uniqueRooms.Length); // Assign a unique room to current room

        // PATH GENERATION

        int[] randNeighbor = { 0, 1, 2, 3 }; // Randomize which adjacent room to look at
        m_path = new List <int>();           // In case we find a dead end, we can back track to another room we've visited. Also for debugging
        int rewind = 1;                      // Used while traversing the room path

        m_path.Add(currRoom);

        for (int i = 0; i < activeRooms - 1; i++) // Loop for each room after the starter room
        {
            RandomizeArray(randNeighbor);

            for (int j = 0; j < randNeighbor.Length; j++)
            {
                int            roomToCheck = -1;
                RoomBase.nbors facing      = 0;

                string[] roomData = m_uniqueRooms[m_roomCode[currRoom]].name.Split('-');

                if (randNeighbor[j] == (int)RoomBase.nbors.left && currRoom > 0 && (currRoom - 1) / m_width == currRoom / m_width &&
                    m_roomCode[currRoom - 1] == 0 && (int)char.GetNumericValue(roomData[1][(int)RoomBase.nbors.left]) != 0)
                {
                    roomToCheck = currRoom - 1;
                    facing      = RoomBase.nbors.left;
                }
                else if (randNeighbor[j] == (int)RoomBase.nbors.top && currRoom - m_width >= 0 &&
                         m_roomCode[currRoom - m_width] == 0 && (int)char.GetNumericValue(roomData[1][(int)RoomBase.nbors.top]) != 0)
                {
                    roomToCheck = currRoom - m_width;
                    facing      = RoomBase.nbors.top;
                }
                else if (randNeighbor[j] == (int)RoomBase.nbors.right && currRoom <= m_rooms.Length && (currRoom + 1) / m_width == currRoom / m_width &&
                         m_roomCode[currRoom + 1] == 0 && (int)char.GetNumericValue(roomData[1][(int)RoomBase.nbors.right]) != 0)
                {
                    roomToCheck = currRoom + 1;
                    facing      = RoomBase.nbors.right;
                }
                else if (randNeighbor[j] == (int)RoomBase.nbors.bottom && currRoom + m_width < m_rooms.Length &&
                         m_roomCode[currRoom + m_width] == 0 && (int)char.GetNumericValue(roomData[1][(int)RoomBase.nbors.bottom]) != 0)
                {
                    roomToCheck = currRoom + m_width;
                    facing      = RoomBase.nbors.bottom;
                }

                if (roomToCheck >= 0)
                {
                    int oldRoomCode = currRoom;
                    currRoom             = roomToCheck;
                    m_roomCode[currRoom] = ValidRoomCheck(facing, (int)char.GetNumericValue(roomData[1][(int)facing]), oldRoomCode);
                    m_path.Add(currRoom);
                    rewind = 1;

                    break;
                }

                if (j == randNeighbor.Length - 1 && m_path.Count - rewind >= 0)
                {
                    currRoom = m_path[m_path.Count - rewind];
                    rewind++;
                }
            }
        }
    }
Exemplo n.º 2
0
    private int ValidRoomCheck(RoomBase.nbors _facing, int _wallCode, int _roomCode)
    {
        int[] randRoom = new int[m_uniqueRooms.Length - 1];

        for (int i = 0; i < randRoom.Length; i++)
        {
            randRoom[i] = i + 1;
        }

        RandomizeArray(randRoom);

        for (int i = 0; i < randRoom.Length; i++)
        {
            string[] roomData     = m_uniqueRooms[randRoom[i]].name.Split('-');
            int      wallToCheck  = (int)char.GetNumericValue(roomData[1][(int)RoomBase.InvertFacing(_facing)]);
            int[]    roomsToCheck = { (int)char.GetNumericValue(roomData[2][0]), (int)char.GetNumericValue(roomData[2][2]) };

            bool       fail        = false;
            List <int> roomsToTake = new List <int>();
            if (roomsToCheck[0] != 1 && roomsToCheck[1] != 1)
            {
                for (int y = 0; y < roomsToCheck[1]; y++)
                {
                    for (int x = 0; x < roomsToCheck[0]; x++)
                    {
                        if (y == 0 && x == 0)
                        {
                            x = 1;
                        }

                        int currRoomToCheck = _roomCode + x + m_width * y;
                        if (currRoomToCheck / m_width != _roomCode / (m_width + y) || m_roomCode[currRoomToCheck] != 0)
                        {
                            fail = true;
                            break;
                        }
                        roomsToTake.Add(currRoomToCheck);
                    }
                    if (fail == true)
                    {
                        break;
                    }
                    if (y == roomsToCheck[1] - 1)
                    {
                        for (int j = 0; j < roomsToTake.Count; j++)
                        {
                            m_roomCode[roomsToTake[j]] = -1;
                        }
                    }
                }
            }

            if (wallToCheck == 0 || fail)
            {
                continue;
            }

            if (wallToCheck == 7 || _wallCode == 7 ||
                (wallToCheck == 2 && _wallCode == 1 || wallToCheck == 2 && _wallCode == 3) ||
                (wallToCheck == 4 && _wallCode == 3 || wallToCheck == 4 && _wallCode == 5) ||
                (wallToCheck == 6 && _wallCode == 1 || wallToCheck == 6 && _wallCode == 5) ||
                (wallToCheck == 1 && _wallCode == 2 || wallToCheck == 3 && _wallCode == 2) ||
                (wallToCheck == 3 && _wallCode == 4 || wallToCheck == 5 && _wallCode == 4) ||
                (wallToCheck == 1 && _wallCode == 6 || wallToCheck == 5 && _wallCode == 6))
            {
                return(randRoom[i]);
            }
        }

        return(-1);
    }