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++; } } } }
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); }