private void ConnectDoorsAt(Vector2Int position) { RoomConnectionBehaviour room = _grid[position]; HashSet <Direction> requiredDirections = FindRequiredDirectionsFor(position); foreach (DoorConnectionBehaviour door in room.Doors) { if (requiredDirections.Contains(door.Direction)) { Vector2Int neighbouringPosition = position + door.Direction.ToVector2Int(); RoomConnectionBehaviour neighbouringRoom = _grid[neighbouringPosition]; DoorConnectionBehaviour neighbouringDoor = neighbouringRoom.GetDoorFacing(door.Direction.Opposite()); DoorConnectionBehaviour.Connect(door, neighbouringDoor); } } }
public void OnTriggerStay2D(Collider2D other) { DoorConnectionBehaviour doorConnectionBehaviour = other.GetComponent <DoorConnectionBehaviour>(); if (doorConnectionBehaviour != null && doorConnectionBehaviour.IsOpen) { Direction direction = doorConnectionBehaviour.Direction; float dotproduct = Vector2.Dot(direction.ToVector2(), _playerMovementBehaviour.Direction); float angle = Extensions.MapBetween(dotproduct, -1.0f, 1.0f, 180, 0); if (angle < 50) { GetComponent <PlayerMovementBehaviour>().Velocity = Vector2.zero; _levelTraversalBehaviour.ChangeRoom(doorConnectionBehaviour); } } }
private static void VerifyAllDoorsConnect() { // create room grid Dictionary <Vector2Int, RoomConnectionBehaviour> roomGrid = new Dictionary <Vector2Int, RoomConnectionBehaviour>(); RoomConnectionBehaviour[] roomConnectionBehaviours = GameObject.FindObjectsOfType <RoomConnectionBehaviour>(); foreach (RoomConnectionBehaviour roomConnectionBehaviour in roomConnectionBehaviours) { Vector2 position = roomConnectionBehaviour.transform.localPosition; Vector2Int roomPosition = Vector2Int.RoundToInt(position / LevelGenerator.RoomPlacementOffset); if (roomGrid.ContainsKey(roomPosition)) { continue; } roomGrid.Add(roomPosition, roomConnectionBehaviour); } // ensure that all doors in the grid connect to eachother foreach (var pair in roomGrid) { Vector2Int roomPosition = pair.Key; RoomConnectionBehaviour room = pair.Value; foreach (DoorConnectionBehaviour door in room.Doors) { Vector2Int neighbouringPosition = roomPosition + door.Direction.ToVector2Int(); if (!roomGrid.ContainsKey(neighbouringPosition)) { Error($"Detected door(s) that lead nowhere. Room {Log.Red(room.name)} located at {Log.Red(roomPosition * LevelGenerator.RoomPlacementOffset)} requires a {Log.Red(door.Direction)} neighbouring room.", room.transform.position); return; } RoomConnectionBehaviour neighbouringRoom = roomGrid[neighbouringPosition]; DoorConnectionBehaviour neighbouringDoor = neighbouringRoom.GetDoorFacing(door.Direction.Opposite()); if (neighbouringDoor == null) { Error($"Detected door(s) that lead into a wall. Room {Log.Red(room.name)} located at {Log.Red(roomPosition * LevelGenerator.RoomPlacementOffset)} has a {Log.Red(door.Direction)} neighbouring room that does not contain a {Log.Red(door.Direction.Opposite())} door.", room.transform.position); return; } } } }
private static void ConnectDoors(Dictionary <Vector2Int, RoomConnectionBehaviour> roomGrid) { foreach (var pair in roomGrid) { Vector2Int position = pair.Key; RoomConnectionBehaviour room = pair.Value; foreach (DoorConnectionBehaviour door in room.Doors) { Vector2Int neighbouringPosition = position + door.Direction.ToVector2Int(); // expected to error if neighbouring room does not exist RoomConnectionBehaviour neighbouringRoom = roomGrid[neighbouringPosition]; DoorConnectionBehaviour neighbouringDoor = neighbouringRoom.GetDoorFacing(door.Direction.Opposite()); // expected to error if neighbouring door does not exist DoorConnectionBehaviour.Connect(door, neighbouringDoor); } } }