/// <summary> /// Creates doors for the first room /// </summary> private void CreateRoomDoors(RoomDoor createdFromDoor, BaseRoom room) { if (room == null) { return; } // Ignore restrictions for the first room bool ignoreRestrictions = createdFromDoor == null; List <Vector2> possibleDirections = new List <Vector2> { Vector2.left, Vector2.right, Vector2.up, Vector2.down }; List <Vector2> directions = new List <Vector2>(); if (!ignoreRestrictions) { // Find furthest tiles in all directions except current door direction Vector2 excludedDirection = room.GetDoorExit(createdFromDoor) - room.GetDoorEntrance(createdFromDoor); possibleDirections.Remove(excludedDirection); for (int i = 0; i < Instance?.doorAmountPerRoom; ++i) { int randomNumber = UnityEngine.Random.Range(0, possibleDirections.Count); directions.Add(possibleDirections[randomNumber]); possibleDirections.RemoveAt(randomNumber); } } else { directions = possibleDirections; } for (int i = 0; i < directions.Count; ++i) { Vector2 direction = directions[i]; Vector2 doorLocation = room.FindFurthestTileInDirection(direction); // Skip if no eligible location was found if (doorLocation == Vector2.zero) { continue; } Vector2 setLocation = doorLocation + (direction * 0.5f); if (roomLocations.ContainsKey(doorLocation + direction)) { // Disabled creating new doors to old rooms for now continue; //BaseRoom room = RoomGenerator.roomLocations[doorLocation + direction]; //if (room.roomWalls.ContainsKey(setLocation)) //{ // GameObject destroyWall = room.roomWalls[setLocation]; // room.roomWalls.Remove(setLocation); // Destroy(destroyWall); //} } RoomDoor newDoor = Instantiate(Instance?.roomDoorPrefab, room.transform); newDoor.transform.position = setLocation; newDoor.transform.position += new Vector3(0, 0, -5); newDoor.transform.rotation = Quaternion.Euler(0, 0, (direction.y != 0 ? 90 : 0)); newDoor.connectedRooms.Add(doorLocation, room); newDoor.connectedRooms.Add(doorLocation + direction, null); room.roomDoors.Add(setLocation, newDoor); } }