From d9513f70b3a2ba9586a5b31de809743538a7e52c Mon Sep 17 00:00:00 2001 From: milan Date: Mon, 7 Nov 2022 15:41:00 +0100 Subject: [PATCH] orientation requirements --- .../Generic Door Entrance.asset | 4 ++- .../Generic Door Exit.asset | 5 +-- .../Module Descriptions/Generic Puzzle.asset | 3 +- .../Requirements/Face Space Center.asset | 14 ++++++++ .../Requirements/Face Space Center.asset.meta | 8 +++++ .../Engine/Scripts/Engine.cs | 28 +++++++++++++-- .../Engine/Scripts/Modules/Module.cs | 13 ++++++- .../Scripts/Modules/ModuleDescription.cs | 7 ++-- .../Scripts/Requirements/FaceSpaceCenter.cs | 35 +++++++++++++++++++ .../Requirements/FaceSpaceCenter.cs.meta | 3 ++ .../Requirements/OrientationRequirement.cs | 11 ++++++ .../OrientationRequirement.cs.meta | 3 ++ .../Requirements/PlaceAlongSpaceEdges.cs | 6 ++-- .../Scripts/Requirements/PlaceAnywhere.cs | 2 +- .../Requirements/PlacementRequirement.cs | 2 +- .../Engine/Scripts/Utilities/Logger.cs | 2 +- Assets/Scenes/TestScene.unity | 6 ++-- 17 files changed, 133 insertions(+), 19 deletions(-) create mode 100644 Assets/Escape Room Engine/Engine/Requirements/Face Space Center.asset create mode 100644 Assets/Escape Room Engine/Engine/Requirements/Face Space Center.asset.meta create mode 100644 Assets/Escape Room Engine/Engine/Scripts/Requirements/FaceSpaceCenter.cs create mode 100644 Assets/Escape Room Engine/Engine/Scripts/Requirements/FaceSpaceCenter.cs.meta create mode 100644 Assets/Escape Room Engine/Engine/Scripts/Requirements/OrientationRequirement.cs create mode 100644 Assets/Escape Room Engine/Engine/Scripts/Requirements/OrientationRequirement.cs.meta diff --git a/Assets/Escape Room Engine/Engine/Module Descriptions/Generic Door Entrance.asset b/Assets/Escape Room Engine/Engine/Module Descriptions/Generic Door Entrance.asset index aa684fe..fd2ac1e 100644 --- a/Assets/Escape Room Engine/Engine/Module Descriptions/Generic Door Entrance.asset +++ b/Assets/Escape Room Engine/Engine/Module Descriptions/Generic Door Entrance.asset @@ -15,6 +15,8 @@ MonoBehaviour: types: 00000000 modulePrefab: {fileID: 5399176795272327488, guid: da9b7a57e7c37d149827fe17188bdeea, type: 3} - requirements: [] + requirements: + - {fileID: 11400000, guid: ed4830127e9381245a6af07e42c52422, type: 2} + - {fileID: 11400000, guid: 1f1825b71bae09c438a1cb52603347d6, type: 2} connectedDoorDescription: {fileID: 11400000, guid: 29e2ae36585f4e65966bc9ea2f95ac4a, type: 2} diff --git a/Assets/Escape Room Engine/Engine/Module Descriptions/Generic Door Exit.asset b/Assets/Escape Room Engine/Engine/Module Descriptions/Generic Door Exit.asset index 3b76300..4b6d09d 100644 --- a/Assets/Escape Room Engine/Engine/Module Descriptions/Generic Door Exit.asset +++ b/Assets/Escape Room Engine/Engine/Module Descriptions/Generic Door Exit.asset @@ -15,7 +15,8 @@ MonoBehaviour: types: 01000000 modulePrefab: {fileID: 5399176795272327488, guid: d877ee36ba6ace440aebce2c20cf70d6, type: 3} - requirements: [] - doorType: 1 + requirements: + - {fileID: 11400000, guid: ed4830127e9381245a6af07e42c52422, type: 2} + - {fileID: 11400000, guid: 1f1825b71bae09c438a1cb52603347d6, type: 2} connectedDoorDescription: {fileID: 11400000, guid: a70cb93176094309a847f1928d6b950d, type: 2} diff --git a/Assets/Escape Room Engine/Engine/Module Descriptions/Generic Puzzle.asset b/Assets/Escape Room Engine/Engine/Module Descriptions/Generic Puzzle.asset index f9293dd..19be419 100644 --- a/Assets/Escape Room Engine/Engine/Module Descriptions/Generic Puzzle.asset +++ b/Assets/Escape Room Engine/Engine/Module Descriptions/Generic Puzzle.asset @@ -16,4 +16,5 @@ MonoBehaviour: modulePrefab: {fileID: 1780958886295268827, guid: e419cb35bd744b24ea973860d8b1405d, type: 3} requirements: - - {fileID: 11400000, guid: d34a7e9c8d3eaf946ade02be9eff0041, type: 2} + - {fileID: 11400000, guid: ed4830127e9381245a6af07e42c52422, type: 2} + - {fileID: 11400000, guid: 1f1825b71bae09c438a1cb52603347d6, type: 2} diff --git a/Assets/Escape Room Engine/Engine/Requirements/Face Space Center.asset b/Assets/Escape Room Engine/Engine/Requirements/Face Space Center.asset new file mode 100644 index 0000000..5f882db --- /dev/null +++ b/Assets/Escape Room Engine/Engine/Requirements/Face Space Center.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 872da92bb04647e3bd6e741e6bb0a976, type: 3} + m_Name: Face Space Center + m_EditorClassIdentifier: diff --git a/Assets/Escape Room Engine/Engine/Requirements/Face Space Center.asset.meta b/Assets/Escape Room Engine/Engine/Requirements/Face Space Center.asset.meta new file mode 100644 index 0000000..d77c8a4 --- /dev/null +++ b/Assets/Escape Room Engine/Engine/Requirements/Face Space Center.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1f1825b71bae09c438a1cb52603347d6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Escape Room Engine/Engine/Scripts/Engine.cs b/Assets/Escape Room Engine/Engine/Scripts/Engine.cs index 4aa4f99..0382ec2 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Engine.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Engine.cs @@ -2,6 +2,7 @@ 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; @@ -94,17 +95,40 @@ namespace Escape_Room_Engine.Engine.Scripts // place puzzle var placementCandidates = space.rrDimensions.EveryPosition; - puzzle._description.PlacementRequirements.ForEach(requirement => + puzzle._description.RequirementsOfType().ForEach(requirement => placementCandidates.IntersectWith(requirement.PlacementCandidates(puzzle, space))); + + Logger.Log($"placement candidates: {string.Join(", ", placementCandidates.ToList().ConvertAll(c => c.ToString()))}", LogType.RequirementResolution); + if (placementCandidates.Count > 0) { puzzle.Place(placementCandidates.RandomElement()); - space.AddModule(puzzle); } else { Logger.Log("Could not find suitable placement for puzzle", LogType.PuzzleGeneration); + return; } + + // orient puzzle + HashSet orientationCandidates = Module.EveryOrientation; + Logger.Log($"orientation candidatesA: {string.Join(",", orientationCandidates.ToList().ConvertAll(c => c.ToString()))}", LogType.RequirementResolution); + puzzle._description.RequirementsOfType().ForEach(requirement => + orientationCandidates.IntersectWith(requirement.OrientationCandidates(puzzle, space))); + + Logger.Log($"orientation candidates: {string.Join(",", orientationCandidates.ToList().ConvertAll(c => c.ToString()))}", LogType.RequirementResolution); + + if (orientationCandidates.Count > 0) + { + puzzle.Orient(orientationCandidates.RandomElement()); + } + else + { + Logger.Log("Could not find suitable orientation for puzzle", LogType.PuzzleGeneration); + return; + } + + space.AddModule(puzzle); } /// diff --git a/Assets/Escape Room Engine/Engine/Scripts/Modules/Module.cs b/Assets/Escape Room Engine/Engine/Scripts/Modules/Module.cs index 65dc988..1977597 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Modules/Module.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Modules/Module.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using Escape_Room_Engine.Engine.Scripts.Utilities; using UnityEngine; @@ -15,6 +16,11 @@ namespace Escape_Room_Engine.Engine.Scripts.Modules public class Module { + public static HashSet EveryOrientation => new(new[] + { + Orientation.North, Orientation.East, Orientation.South, Orientation.West + }); + /// /// Get the space relative (SR) position of this module. /// @@ -67,6 +73,11 @@ namespace Escape_Room_Engine.Engine.Scripts.Modules Logger.Log($"{this} has been placed at {srPosition} (SR)", LogType.ModulePlacement); } + internal void Orient(Orientation o) + { + orientation = o; + } + internal void InstantiateModule(Transform parent) { _moduleObject = new GameObject(ToString()); @@ -79,7 +90,7 @@ namespace Escape_Room_Engine.Engine.Scripts.Modules public override string ToString() { - return $"Module ({string.Join(',', _description.types.ToList().ConvertAll(type => type.ToString()))})"; + return $"Module ({string.Join(", ", _description.types.ToList().ConvertAll(type => type.ToString()))})"; } } } diff --git a/Assets/Escape Room Engine/Engine/Scripts/Modules/ModuleDescription.cs b/Assets/Escape Room Engine/Engine/Scripts/Modules/ModuleDescription.cs index 9f3f46d..03066d3 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Modules/ModuleDescription.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Modules/ModuleDescription.cs @@ -11,8 +11,9 @@ namespace Escape_Room_Engine.Engine.Scripts.Modules public GameObject modulePrefab; public List requirements = new(); - public List PlacementRequirements => requirements - .FindAll(requirement => requirement is PlacementRequirement) - .ConvertAll(requirement => (PlacementRequirement)requirement); + public List RequirementsOfType() where T : Requirement + { + return requirements.FindAll(requirement => requirement is T).ConvertAll(requirement => (T)requirement); + } } } \ No newline at end of file diff --git a/Assets/Escape Room Engine/Engine/Scripts/Requirements/FaceSpaceCenter.cs b/Assets/Escape Room Engine/Engine/Scripts/Requirements/FaceSpaceCenter.cs new file mode 100644 index 0000000..1eff5fd --- /dev/null +++ b/Assets/Escape Room Engine/Engine/Scripts/Requirements/FaceSpaceCenter.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using Escape_Room_Engine.Engine.Scripts.Modules; +using Unity.XR.CoreUtils; +using UnityEngine; +using Logger = Escape_Room_Engine.Engine.Scripts.Utilities.Logger; +using LogType = Escape_Room_Engine.Engine.Scripts.Utilities.LogType; + +namespace Escape_Room_Engine.Engine.Scripts.Requirements +{ + [CreateAssetMenu(menuName = "Requirements/Face Space Center")] + public class FaceSpaceCenter : OrientationRequirement + { + public override IEnumerable OrientationCandidates(Module module, Space space) + { + var orientation = new HashSet(1); + float width = space.rrDimensions.width; + float length = space.rrDimensions.length; + var xRel = module.SrPosition.x / (width - 1); + var zRel = module.SrPosition.y / (length - 1); + + Debug.Log($"{xRel}, {zRel}, {1 - xRel}"); + + if (zRel > xRel) + { + orientation.Add(zRel > 1 - xRel ? Orientation.South : Orientation.East); + } + else + { + orientation.Add(zRel > 1 - xRel ? Orientation.West : Orientation.North); + } + + return orientation; + } + } +} \ No newline at end of file diff --git a/Assets/Escape Room Engine/Engine/Scripts/Requirements/FaceSpaceCenter.cs.meta b/Assets/Escape Room Engine/Engine/Scripts/Requirements/FaceSpaceCenter.cs.meta new file mode 100644 index 0000000..d8e5d73 --- /dev/null +++ b/Assets/Escape Room Engine/Engine/Scripts/Requirements/FaceSpaceCenter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 872da92bb04647e3bd6e741e6bb0a976 +timeCreated: 1667878978 \ No newline at end of file diff --git a/Assets/Escape Room Engine/Engine/Scripts/Requirements/OrientationRequirement.cs b/Assets/Escape Room Engine/Engine/Scripts/Requirements/OrientationRequirement.cs new file mode 100644 index 0000000..975c743 --- /dev/null +++ b/Assets/Escape Room Engine/Engine/Scripts/Requirements/OrientationRequirement.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using Escape_Room_Engine.Engine.Scripts.Modules; +using UnityEngine; + +namespace Escape_Room_Engine.Engine.Scripts.Requirements +{ + public abstract class OrientationRequirement : Requirement + { + public abstract IEnumerable OrientationCandidates(Module module, Space space); + } +} \ No newline at end of file diff --git a/Assets/Escape Room Engine/Engine/Scripts/Requirements/OrientationRequirement.cs.meta b/Assets/Escape Room Engine/Engine/Scripts/Requirements/OrientationRequirement.cs.meta new file mode 100644 index 0000000..40b92cd --- /dev/null +++ b/Assets/Escape Room Engine/Engine/Scripts/Requirements/OrientationRequirement.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0704ea5393394baf921f68d2dcbdfaec +timeCreated: 1667878220 \ No newline at end of file diff --git a/Assets/Escape Room Engine/Engine/Scripts/Requirements/PlaceAlongSpaceEdges.cs b/Assets/Escape Room Engine/Engine/Scripts/Requirements/PlaceAlongSpaceEdges.cs index 3f7a960..d9c11ee 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Requirements/PlaceAlongSpaceEdges.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Requirements/PlaceAlongSpaceEdges.cs @@ -7,19 +7,19 @@ namespace Escape_Room_Engine.Engine.Scripts.Requirements [CreateAssetMenu(menuName = "Requirements/Place Along Space Edges")] public class PlaceAlongSpaceEdges : PlacementRequirement { - public override HashSet PlacementCandidates(Module module, Space space) + public override IEnumerable PlacementCandidates(Module module, Space space) { var edgePositions = new HashSet(); for (var x = 0; x < space.rrDimensions.width; x++) { edgePositions.Add(new Vector2Int(x, 0)); - edgePositions.Add(new Vector2Int(x, space.rrDimensions.length)); + edgePositions.Add(new Vector2Int(x, space.rrDimensions.length - 1)); } for (var z = 0; z < space.rrDimensions.length; z++) { edgePositions.Add(new Vector2Int(0, z)); - edgePositions.Add(new Vector2Int(space.rrDimensions.width, z)); + edgePositions.Add(new Vector2Int(space.rrDimensions.width - 1, z)); } return edgePositions; diff --git a/Assets/Escape Room Engine/Engine/Scripts/Requirements/PlaceAnywhere.cs b/Assets/Escape Room Engine/Engine/Scripts/Requirements/PlaceAnywhere.cs index 6a87b0c..db58299 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Requirements/PlaceAnywhere.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Requirements/PlaceAnywhere.cs @@ -7,7 +7,7 @@ namespace Escape_Room_Engine.Engine.Scripts.Requirements [CreateAssetMenu(menuName = "Requirements/Place Anywhere")] public class PlaceAnywhere : PlacementRequirement { - public override HashSet PlacementCandidates(Module module, Space space) + public override IEnumerable PlacementCandidates(Module module, Space space) { return space.rrDimensions.EveryPosition; } diff --git a/Assets/Escape Room Engine/Engine/Scripts/Requirements/PlacementRequirement.cs b/Assets/Escape Room Engine/Engine/Scripts/Requirements/PlacementRequirement.cs index d74c51a..4f34888 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Requirements/PlacementRequirement.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Requirements/PlacementRequirement.cs @@ -6,6 +6,6 @@ namespace Escape_Room_Engine.Engine.Scripts.Requirements { public abstract class PlacementRequirement : Requirement { - public abstract HashSet PlacementCandidates(Module module, Space space); + public abstract IEnumerable PlacementCandidates(Module module, Space space); } } \ No newline at end of file diff --git a/Assets/Escape Room Engine/Engine/Scripts/Utilities/Logger.cs b/Assets/Escape Room Engine/Engine/Scripts/Utilities/Logger.cs index 08633bd..d09d316 100644 --- a/Assets/Escape Room Engine/Engine/Scripts/Utilities/Logger.cs +++ b/Assets/Escape Room Engine/Engine/Scripts/Utilities/Logger.cs @@ -5,7 +5,7 @@ namespace Escape_Room_Engine.Engine.Scripts.Utilities { public enum LogType { - Important, ModulePlacement, PassageConnection, RoomGeneration, PuzzleGeneration + Important, ModulePlacement, PassageConnection, RoomGeneration, PuzzleGeneration, RequirementResolution } public class Logger : MonoBehaviour diff --git a/Assets/Scenes/TestScene.unity b/Assets/Scenes/TestScene.unity index 73ad702..2137f08 100644 --- a/Assets/Scenes/TestScene.unity +++ b/Assets/Scenes/TestScene.unity @@ -1233,8 +1233,8 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: roomMaterial: {fileID: 2100000, guid: 39e2ed014eda5d6408c16fbf0fa80781, type: 2} - minPuzzleCount: 2 - maxPuzzleCount: 5 + minPuzzleCount: 1 + maxPuzzleCount: 1 minRoomSize: {x: 3, y: 3} playSpace: {x: 4, y: 6} genericModule: {fileID: 11400000, guid: cba85a4318ad4750860b84245d9685c4, type: 2} @@ -1271,7 +1271,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: loggingEnabled: 1 - typeFilter: 0000000001000000020000000300000004000000 + typeFilter: 000000000100000002000000030000000400000005000000 --- !u!1 &1718957584 GameObject: m_ObjectHideFlags: 0