diff --git a/Assets/Escape Room Engine/Engine/Scripts/Engine.cs b/Assets/Escape Room Engine/Engine/Scripts/Engine.cs index 71a7fd3..6b8a6f4 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Engine.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Engine.cs @@ -2,12 +2,10 @@ using System; using System.Collections.Generic; using System.Linq; using Escape_Room_Engine.Engine.Scripts.Modules; -using Escape_Room_Engine.Engine.Scripts.Requirements; using Escape_Room_Engine.Engine.Scripts.Utilities; using UnityEngine; using Logger = Escape_Room_Engine.Engine.Scripts.Utilities.Logger; using LogType = Escape_Room_Engine.Engine.Scripts.Utilities.LogType; -using Random = UnityEngine.Random; namespace Escape_Room_Engine.Engine.Scripts { @@ -68,8 +66,7 @@ namespace Escape_Room_Engine.Engine.Scripts Logger.Log("Generating space...", LogType.RoomGeneration); // create space - var rrDimensions = GenerateSpaceDimensions(entrance.rrPosition); - var space = new Space(rrDimensions, entrance); + var space = new Space(entrance); // add exit var exitDoor = new DoorModule(space, exitDoorTypes.RandomElement()); @@ -86,37 +83,6 @@ namespace Escape_Room_Engine.Engine.Scripts room.AddSpace(space, exit); } - /// - /// Generate space dimensions that fit the required size constraints and cover the position of the entrance. - /// - /// The room relative (RR) position of the entrance. - /// The generated room relative (RR) dimensions. - private Dimensions GenerateSpaceDimensions(Vector2Int entranceRrPosition) - { - var xMin = Utilities.Utilities.RandomInclusive( - 0, - Math.Min(entranceRrPosition.x, playSpace.x - minRoomSize.x) - ); - var xMax = Utilities.Utilities.RandomInclusive( - Math.Max(entranceRrPosition.x + 1, xMin + minRoomSize.x), - playSpace.x - ); - var zMin = Utilities.Utilities.RandomInclusive( - 0, - Math.Min(entranceRrPosition.y, playSpace.y - minRoomSize.y) - ); - var zMax = Utilities.Utilities.RandomInclusive( - Math.Max(entranceRrPosition.y + 1, zMin + minRoomSize.y), - playSpace.y - ); - - var dimensions = new Dimensions(xMax - xMin, zMax - zMin, xMin, zMin); - - Logger.Log($"Generated space dimensions {dimensions} from entrance position {entranceRrPosition}", LogType.RoomGeneration); - - return dimensions; - } - public void HideOldestRoom() { if (NumberOfRooms > 0) diff --git a/Assets/Escape Room Engine/Engine/Scripts/Space.cs b/Assets/Escape Room Engine/Engine/Scripts/Space.cs index b68388a..70f2800 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Space.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Space.cs @@ -1,7 +1,10 @@ +using System; using System.Collections.Generic; using Escape_Room_Engine.Engine.Scripts.Modules; using Escape_Room_Engine.Engine.Scripts.Requirements; using UnityEngine; +using LogType = Escape_Room_Engine.Engine.Scripts.Utilities.LogType; +using Object = UnityEngine.Object; namespace Escape_Room_Engine.Engine.Scripts { @@ -15,9 +18,9 @@ namespace Escape_Room_Engine.Engine.Scripts private GameObject _spaceObject; - internal Space(Dimensions rrDimensions, Passage entrance) + internal Space(Passage entrance) { - this.rrDimensions = rrDimensions; + rrDimensions = GenerateSpaceDimensions(entrance, Engine.DefaultEngine.minRoomSize, Engine.DefaultEngine.playSpace); // connect the space to its passage entrance.ConnectTo(new DoorModule(this, @@ -109,5 +112,58 @@ namespace Escape_Room_Engine.Engine.Scripts { Object.Destroy(_spaceObject); } + + /// + /// Generate space dimensions that fit the required size constraints and cover the position of the entrance. + /// + /// The generated room relative (RR) dimensions. + private static Dimensions GenerateSpaceDimensions(Passage entrance, Vector2Int minSize, Vector2Int availableSpace) + { + var xMin = -1; + var xMax = -1; + var zMin = -1; + var zMax = -1; + var position = entrance.rrPosition; + var door = entrance.fromOut; + + // fix the side the door is facing away from + switch (door.orientation) + { + case Orientation.North: + zMin = position.y; + zMax = Utilities.Utilities.RandomInclusive(zMin + minSize.y, availableSpace.y); + break; + case Orientation.East: + xMin = position.x; + xMax = Utilities.Utilities.RandomInclusive(xMin + minSize.x, availableSpace.x); + break; + case Orientation.South: + zMax = position.y + 1; + zMin = Utilities.Utilities.RandomInclusive(0, zMax - minSize.y); + break; + case Orientation.West: + xMax = position.x + 1; + xMin = Utilities.Utilities.RandomInclusive(0, xMax - minSize.x); + break; + default: + throw new ArgumentOutOfRangeException(); + } + + // calculate remaining values if they haven't been covered by the switch statement yet + if(xMin == -1) + xMin = Utilities.Utilities.RandomInclusive(0, Math.Min(position.x, availableSpace.x - minSize.x)); + if(xMax == -1) + xMax = Utilities.Utilities.RandomInclusive(Math.Max(position.x + 1, xMin + minSize.x), availableSpace.x); + if(zMin == -1) + zMin = Utilities.Utilities.RandomInclusive(0, Math.Min(position.y, availableSpace.y - minSize.y)); + if(zMax == -1) + zMax = Utilities.Utilities.RandomInclusive(Math.Max(position.y + 1, zMin + minSize.y), availableSpace.y); + + var dimensions = new Dimensions(xMax - xMin, zMax - zMin, xMin, zMin); + + Utilities.Logger.Log($"Generated space dimensions {dimensions} from entrance position {position}", LogType.RoomGeneration); + + return dimensions; + } } }