diff --git a/Assets/Desert/Assets/Prefabs/Desert Spawn.prefab b/Assets/Desert/Assets/Prefabs/Desert Spawn.prefab index a1d0c56..b87df73 100644 --- a/Assets/Desert/Assets/Prefabs/Desert Spawn.prefab +++ b/Assets/Desert/Assets/Prefabs/Desert Spawn.prefab @@ -9,7 +9,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 5782403741593619305} - - component: {fileID: 2398776566740968028} + - component: {fileID: 1834615596445353898} m_Layer: 0 m_Name: Desert Spawn m_TagString: Untagged @@ -30,9 +30,9 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 7 + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2398776566740968028 +--- !u!114 &1834615596445353898 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -41,7 +41,7 @@ MonoBehaviour: m_GameObject: {fileID: 615130069026427904} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 696181e3eda449d49d4c1c88b07d7b05, type: 3} + m_Script: {fileID: 11500000, guid: 404f750726904ea98f8a85feaca0df66, type: 3} m_Name: m_EditorClassIdentifier: size: {x: 1, y: 1} diff --git a/Assets/Engine/Assets/Prefabs/Spawn.prefab b/Assets/Engine/Assets/Prefabs/Spawn.prefab index 50edd58..c436ee4 100644 --- a/Assets/Engine/Assets/Prefabs/Spawn.prefab +++ b/Assets/Engine/Assets/Prefabs/Spawn.prefab @@ -5,6 +5,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 2 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 1322900129209232937, guid: da9b7a57e7c37d149827fe17188bdeea, @@ -72,5 +73,26 @@ PrefabInstance: propertyPath: m_Name value: Spawn objectReference: {fileID: 0} - m_RemovedComponents: [] + m_RemovedComponents: + - {fileID: 7146915386488129308, guid: da9b7a57e7c37d149827fe17188bdeea, type: 3} + m_AddedGameObjects: [] m_SourcePrefab: {fileID: 100100000, guid: da9b7a57e7c37d149827fe17188bdeea, type: 3} +--- !u!1 &641449049689494886 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 5399176795272327488, guid: da9b7a57e7c37d149827fe17188bdeea, + type: 3} + m_PrefabInstance: {fileID: 4758994409158878246} + m_PrefabAsset: {fileID: 0} +--- !u!114 &5940521204297009715 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 641449049689494886} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 404f750726904ea98f8a85feaca0df66, type: 3} + m_Name: + m_EditorClassIdentifier: + size: {x: 2, y: 1} diff --git a/Assets/Engine/Runtime/Editor/EngineEditor.cs b/Assets/Engine/Runtime/Editor/EngineEditor.cs index 922f52b..06914e5 100644 --- a/Assets/Engine/Runtime/Editor/EngineEditor.cs +++ b/Assets/Engine/Runtime/Editor/EngineEditor.cs @@ -43,7 +43,7 @@ namespace EscapeRoomEngine.Engine.Runtime.Editor { if (EditorApplication.isPlaying) { - Engine.DefaultEngine.HidePreviousRoom(); + Engine.DefaultEngine.CurrentRoom.Match(some: room => room.EnterRoom()); UpdateUI(); } } @@ -62,7 +62,7 @@ namespace EscapeRoomEngine.Engine.Runtime.Editor if (EditorApplication.isPlaying) { Engine.DefaultEngine.CurrentRoom.Match(some: room => room.SkipRoom()); - Engine.DefaultEngine.HidePreviousRoom(); + Engine.DefaultEngine.CurrentRoom.Match(some: room => room.EnterRoom()); UpdateUI(); } } diff --git a/Assets/Engine/Runtime/Engine.asmdef b/Assets/Engine/Runtime/Engine.asmdef index d85e8c3..a9f4fbc 100644 --- a/Assets/Engine/Runtime/Engine.asmdef +++ b/Assets/Engine/Runtime/Engine.asmdef @@ -7,8 +7,10 @@ "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], + "overrideReferences": true, + "precompiledReferences": [ + "Realm.dll" + ], "autoReferenced": true, "defineConstraints": [], "versionDefines": [], diff --git a/Assets/Engine/Runtime/Engine.asmdef.meta b/Assets/Engine/Runtime/Engine.asmdef.meta index 239cc0e..2efb6ec 100644 --- a/Assets/Engine/Runtime/Engine.asmdef.meta +++ b/Assets/Engine/Runtime/Engine.asmdef.meta @@ -1,3 +1,7 @@ -fileFormatVersion: 2 +fileFormatVersion: 2 guid: 2d68e204354e44f2a2ecf3cfa9213c5f -timeCreated: 1668940905 \ No newline at end of file +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Engine/Runtime/Engine.cs b/Assets/Engine/Runtime/Engine.cs index eb1df33..b781e5f 100644 --- a/Assets/Engine/Runtime/Engine.cs +++ b/Assets/Engine/Runtime/Engine.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using EscapeRoomEngine.Engine.Runtime.Measurements; using EscapeRoomEngine.Engine.Runtime.Modules; using EscapeRoomEngine.Engine.Runtime.Utilities; using NaughtyAttributes; @@ -38,6 +39,11 @@ namespace EscapeRoomEngine.Engine.Runtime private readonly List _rooms = new(); private GameObject _playSpaceOrigin; + private void Awake() + { + Measure.Clear(); + } + private void Start() { _playSpaceOrigin = new GameObject("Play Space Origin"); diff --git a/Assets/Engine/Runtime/EngineTheme.cs b/Assets/Engine/Runtime/EngineTheme.cs index cb7b14a..5979b7d 100644 --- a/Assets/Engine/Runtime/EngineTheme.cs +++ b/Assets/Engine/Runtime/EngineTheme.cs @@ -51,6 +51,8 @@ namespace EscapeRoomEngine.Engine.Runtime [BoxGroup("Puzzles")] public List puzzleTypes; + public PuzzleModuleDescription GetPuzzle(int id) => puzzleTypes.Find(puzzle => puzzle.Id == id); + #endregion [UsedImplicitly] diff --git a/Assets/Engine/Runtime/Measurements/IMeasurementStorage.cs b/Assets/Engine/Runtime/Measurements/IMeasurementStorage.cs deleted file mode 100644 index c82ec09..0000000 --- a/Assets/Engine/Runtime/Measurements/IMeasurementStorage.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace EscapeRoomEngine.Engine.Runtime.Measurements -{ - public interface IMeasurementStorage - { - public void Save(MeasurementCollection measurements); - public MeasurementCollection Load(int key); - } -} \ No newline at end of file diff --git a/Assets/Engine/Runtime/Measurements/IMeasurementStorage.cs.meta b/Assets/Engine/Runtime/Measurements/IMeasurementStorage.cs.meta deleted file mode 100644 index 3476f17..0000000 --- a/Assets/Engine/Runtime/Measurements/IMeasurementStorage.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 6c93e87219e64bc3ad8263da8109e51c -timeCreated: 1670750698 \ No newline at end of file diff --git a/Assets/Engine/Runtime/Measurements/Measure.cs b/Assets/Engine/Runtime/Measurements/Measure.cs index 4b36ef6..b809664 100644 --- a/Assets/Engine/Runtime/Measurements/Measure.cs +++ b/Assets/Engine/Runtime/Measurements/Measure.cs @@ -1,7 +1,44 @@ -namespace EscapeRoomEngine.Engine.Runtime.Measurements +using System.Collections.Generic; +using EscapeRoomEngine.Engine.Runtime.Modules; +using UnityEngine; +using Logger = EscapeRoomEngine.Engine.Runtime.Utilities.Logger; +using LogType = EscapeRoomEngine.Engine.Runtime.Utilities.LogType; + +namespace EscapeRoomEngine.Engine.Runtime.Measurements { - public class Measure + public static class Measure { - + private static Dictionary _runningMeasurements; + + public static void StartMeasuring(PuzzleModuleDescription puzzle) + { + _runningMeasurements[puzzle.Id] = new PuzzleMeasurement + { + TimeStarted = Time.time, + TimeSolved = Time.time + }; + + Logger.Log($"Started measuring {puzzle}", LogType.Measuring); + LogAllMeasurements(); + } + + public static void Solve(PuzzleModuleDescription puzzle) + { + var measurement = _runningMeasurements[puzzle.Id]; + + PuzzleStorage.Instance.EndMeasurement(puzzle, measurement); + + Logger.Log($"Solved {puzzle} with measurement {measurement}", LogType.Measuring); + } + + public static void LogAllMeasurements() + { + Engine.DefaultEngine.theme.puzzleTypes.ForEach(puzzle => + { + Logger.Log(PuzzleStorage.Instance.LoadOrNew(puzzle).ToString(), LogType.Measuring); + }); + } + + public static void Clear() => _runningMeasurements = new Dictionary(); } } \ No newline at end of file diff --git a/Assets/Engine/Runtime/Measurements/MeasurementCollection.cs b/Assets/Engine/Runtime/Measurements/MeasurementCollection.cs deleted file mode 100644 index cb1d3f6..0000000 --- a/Assets/Engine/Runtime/Measurements/MeasurementCollection.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace EscapeRoomEngine.Engine.Runtime.Measurements -{ - [Serializable] - public struct MeasurementCollection - { - /// - /// The module id is a - /// - public int moduleId; - } -} \ No newline at end of file diff --git a/Assets/Engine/Runtime/Measurements/MeasurementCollection.cs.meta b/Assets/Engine/Runtime/Measurements/MeasurementCollection.cs.meta deleted file mode 100644 index e207064..0000000 --- a/Assets/Engine/Runtime/Measurements/MeasurementCollection.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: e6d831555dc34776b8212a9d9de33414 -timeCreated: 1670695633 \ No newline at end of file diff --git a/Assets/Engine/Runtime/Measurements/Puzzle.cs b/Assets/Engine/Runtime/Measurements/Puzzle.cs new file mode 100644 index 0000000..444f403 --- /dev/null +++ b/Assets/Engine/Runtime/Measurements/Puzzle.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using System.Linq; +using EscapeRoomEngine.Engine.Runtime.Modules; +using EscapeRoomEngine.Engine.Runtime.Utilities; +using JetBrains.Annotations; +using Realms; + +namespace EscapeRoomEngine.Engine.Runtime.Measurements +{ + public class Puzzle : RealmObject + { + [PrimaryKey] + public int ID { get; set; } + public IList Measurements { get; } + + public float TotalTimeSpentOnPuzzle => Measurements.Sum(measurement => measurement.Time); + public float AverageTimeToSolve => Measurements.Count > 0 ? TotalTimeSpentOnPuzzle / Measurements.Count : 0f; + + [UsedImplicitly] + public Puzzle() {} + public Puzzle(PuzzleModuleDescription puzzle) + { + ID = puzzle.Id; + } + + public override string ToString() + { + return $"{Engine.DefaultEngine.theme.GetPuzzle(ID)}: avg. {AverageTimeToSolve.ToTimeSpan():m':'ss} ({string.Join(", ", Measurements)})"; + } + } +} \ No newline at end of file diff --git a/Assets/Engine/Runtime/Measurements/Puzzle.cs.meta b/Assets/Engine/Runtime/Measurements/Puzzle.cs.meta new file mode 100644 index 0000000..1796a99 --- /dev/null +++ b/Assets/Engine/Runtime/Measurements/Puzzle.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0fb9915d920c4298a8ceeba7df5112b5 +timeCreated: 1670773536 \ No newline at end of file diff --git a/Assets/Engine/Runtime/Measurements/PuzzleMeasurement.cs b/Assets/Engine/Runtime/Measurements/PuzzleMeasurement.cs index 2aa0d33..f7c1a76 100644 --- a/Assets/Engine/Runtime/Measurements/PuzzleMeasurement.cs +++ b/Assets/Engine/Runtime/Measurements/PuzzleMeasurement.cs @@ -1,15 +1,18 @@ -using System; -using System.IO; -using System.Runtime.Serialization.Formatters.Binary; +using EscapeRoomEngine.Engine.Runtime.Utilities; +using Realms; namespace EscapeRoomEngine.Engine.Runtime.Measurements { - [Serializable] - public struct PuzzleMeasurement + public class PuzzleMeasurement : EmbeddedObject { - public void a() + public float TimeStarted { get; set; } + public float TimeSolved { get; set; } + + public float Time => TimeSolved - TimeStarted; + + public override string ToString() { - new BinaryFormatter().Serialize(new MemoryStream(), this); + return $"{Time.ToTimeSpan():m':'ss}"; } } } \ No newline at end of file diff --git a/Assets/Engine/Runtime/Measurements/PuzzleStorage.cs b/Assets/Engine/Runtime/Measurements/PuzzleStorage.cs new file mode 100644 index 0000000..4ee85f7 --- /dev/null +++ b/Assets/Engine/Runtime/Measurements/PuzzleStorage.cs @@ -0,0 +1,82 @@ +using EscapeRoomEngine.Engine.Runtime.Modules; +using Realms; +using UnityEngine; +using Logger = EscapeRoomEngine.Engine.Runtime.Utilities.Logger; +using LogType = EscapeRoomEngine.Engine.Runtime.Utilities.LogType; + +namespace EscapeRoomEngine.Engine.Runtime.Measurements +{ + public class PuzzleStorage : MonoBehaviour + { + public static PuzzleStorage Instance + { + get + { + if (_foundStorage == null) + { + _foundStorage = FindObjectOfType(); + } + return _foundStorage; + } + } + private static PuzzleStorage _foundStorage; + + [SerializeField] + private string databasePath = "measurements.realm"; + + private Realm _realm; + + private void OnEnable() + { + _realm = Realm.GetInstance(databasePath); + } + + private void Start() + { + Logger.Log($"Using realm database at {_realm.Config.DatabasePath}", LogType.Measuring); + } + + private void OnDisable() + { + _realm?.Dispose(); + } + + public Puzzle New(PuzzleModuleDescription puzzle) + { + Puzzle created = null; + + _realm.Write(() => + { + created = _realm.Add(new Puzzle(puzzle)); + }); + + return created; + } + + public Puzzle LoadOrNew(PuzzleModuleDescription puzzle) => + _realm.Find(puzzle.Id) ?? New(puzzle); + + public Puzzle Load(PuzzleModuleDescription puzzle) => + _realm.Find(puzzle.Id); + + public void Delete(PuzzleModuleDescription puzzle) + { + var found = Load(puzzle); + if (found != null) + { + _realm.Write(() => _realm.Remove(found)); + } + } + + public void EndMeasurement(PuzzleModuleDescription puzzle, PuzzleMeasurement measurement) + { + var found = LoadOrNew(puzzle); + + _realm.Write(() => + { + measurement.TimeSolved = Time.time; + found.Measurements.Add(measurement); + }); + } + } +} \ No newline at end of file diff --git a/Assets/Engine/Runtime/Measurements/PuzzleStorage.cs.meta b/Assets/Engine/Runtime/Measurements/PuzzleStorage.cs.meta new file mode 100644 index 0000000..94ba0d3 --- /dev/null +++ b/Assets/Engine/Runtime/Measurements/PuzzleStorage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: adcd0bf392c89ae4da3c50e3f06735a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Engine/Runtime/Modules/DoorState.cs b/Assets/Engine/Runtime/Modules/DoorState.cs index 90dea1a..270fae6 100644 --- a/Assets/Engine/Runtime/Modules/DoorState.cs +++ b/Assets/Engine/Runtime/Modules/DoorState.cs @@ -5,7 +5,7 @@ namespace EscapeRoomEngine.Engine.Runtime.Modules { public enum DoorEventType { - Locked, Unlocked, Connected + Locked, Unlocked, Connected, ExitedFrom } public delegate void DoorEventHandler(DoorModule source, DoorEventType e); @@ -31,7 +31,7 @@ namespace EscapeRoomEngine.Engine.Runtime.Modules private bool _unlocked; - private void OnDoorEvent(DoorEventType type) + protected void OnDoorEvent(DoorEventType type) { Logger.Log($"{Module} has been {type}", LogType.PuzzleFlow); @@ -52,6 +52,9 @@ namespace EscapeRoomEngine.Engine.Runtime.Modules [Button(enabledMode: EButtonEnableMode.Playmode)] internal void Lock() => Unlocked = false; + + [Button(enabledMode: EButtonEnableMode.Playmode)] + internal void ExitFrom() => OnDoorEvent(DoorEventType.ExitedFrom); #endregion diff --git a/Assets/Engine/Runtime/Modules/PuzzleModuleDescription.cs b/Assets/Engine/Runtime/Modules/PuzzleModuleDescription.cs index 8641577..68d3408 100644 --- a/Assets/Engine/Runtime/Modules/PuzzleModuleDescription.cs +++ b/Assets/Engine/Runtime/Modules/PuzzleModuleDescription.cs @@ -9,5 +9,12 @@ namespace EscapeRoomEngine.Engine.Runtime.Modules public string puzzleName; [InfoBox("Puzzle measurements will only be combined for the same puzzle with the same version. If large changes are made to the puzzle that might influence its measurements, the version should be incremented.")] public int puzzleVersion = 1; + + public int Id => puzzleName.GetHashCode() + puzzleVersion; + + public override string ToString() + { + return $"{puzzleName} v{puzzleVersion} ({Id})"; + } } } \ No newline at end of file diff --git a/Assets/Engine/Runtime/Modules/PuzzleState.cs b/Assets/Engine/Runtime/Modules/PuzzleState.cs index b6aa7b4..09fc49e 100644 --- a/Assets/Engine/Runtime/Modules/PuzzleState.cs +++ b/Assets/Engine/Runtime/Modules/PuzzleState.cs @@ -1,4 +1,5 @@ using System; +using EscapeRoomEngine.Engine.Runtime.Measurements; using EscapeRoomEngine.Engine.Runtime.Utilities; using NaughtyAttributes; using UnityEngine; @@ -53,6 +54,14 @@ namespace EscapeRoomEngine.Engine.Runtime.Modules protected virtual void Start() { OnPuzzleEvent(PuzzleEventType.Restarted); + + PuzzleEvent += (_, type) => + { + if (type == PuzzleEventType.Solved) + { + Measure.Solve((PuzzleModuleDescription)Module.description); + } + }; } private void OnPuzzleEvent(PuzzleEventType type) diff --git a/Assets/Engine/Runtime/Modules/Spawn.cs b/Assets/Engine/Runtime/Modules/Spawn.cs new file mode 100644 index 0000000..5b4f3f3 --- /dev/null +++ b/Assets/Engine/Runtime/Modules/Spawn.cs @@ -0,0 +1,10 @@ +namespace EscapeRoomEngine.Engine.Runtime.Modules +{ + internal class Spawn : DoorState + { + private void Start() + { + ExitFrom(); + } + } +} \ No newline at end of file diff --git a/Assets/Engine/Runtime/Modules/Spawn.cs.meta b/Assets/Engine/Runtime/Modules/Spawn.cs.meta new file mode 100644 index 0000000..6a54faa --- /dev/null +++ b/Assets/Engine/Runtime/Modules/Spawn.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 404f750726904ea98f8a85feaca0df66 +timeCreated: 1670779750 \ No newline at end of file diff --git a/Assets/Engine/Runtime/Requirements/PlaceWithRelatedModule.cs b/Assets/Engine/Runtime/Requirements/PlaceWithRelatedModule.cs index 1095890..50d2724 100644 --- a/Assets/Engine/Runtime/Requirements/PlaceWithRelatedModule.cs +++ b/Assets/Engine/Runtime/Requirements/PlaceWithRelatedModule.cs @@ -1,7 +1,5 @@ using System.Collections.Generic; -using System.Linq; using EscapeRoomEngine.Engine.Runtime.Modules; -using NaughtyAttributes; using UnityEngine; namespace EscapeRoomEngine.Engine.Runtime.Requirements diff --git a/Assets/Engine/Runtime/Room.cs b/Assets/Engine/Runtime/Room.cs index 7a448d8..af31d9f 100644 --- a/Assets/Engine/Runtime/Room.cs +++ b/Assets/Engine/Runtime/Room.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using EscapeRoomEngine.Engine.Runtime.Measurements; using EscapeRoomEngine.Engine.Runtime.Modules; using UnityEngine; using Logger = EscapeRoomEngine.Engine.Runtime.Utilities.Logger; @@ -35,13 +36,17 @@ namespace EscapeRoomEngine.Engine.Runtime Logger.Log($"Skipping {this}...", LogType.PuzzleFlow); _puzzles.ForEach(puzzle => puzzle.PuzzleState.Solve()); - if (_puzzles.Count == 0) { exit.fromOut.DoorState.Unlock(); } } + public void EnterRoom() + { + entrance.toIn.DoorState.ExitFrom(); + } + internal void AddPuzzle(PuzzleModule puzzle) { _puzzles.Add(puzzle); @@ -67,9 +72,18 @@ namespace EscapeRoomEngine.Engine.Runtime private void OnDoorEvent(DoorModule door, DoorEventType type) { - if (type == DoorEventType.Unlocked && door.Equals(exit.fromOut)) + // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault + switch (type) { - Engine.DefaultEngine.GenerateRoom(); + // generate a new room as soon as the player completes all puzzles in this one + case DoorEventType.Unlocked when door.Equals(exit.fromOut): + Engine.DefaultEngine.GenerateRoom(); + break; + // start measurements on every puzzle as soon as the player enters this room + case DoorEventType.ExitedFrom when door.Equals(entrance.toIn): + _puzzles.ForEach(puzzle => Measure.StartMeasuring((PuzzleModuleDescription)puzzle.description)); + Engine.DefaultEngine.HidePreviousRoom(); + break; } } diff --git a/Assets/Engine/Runtime/Utilities/Logger.cs b/Assets/Engine/Runtime/Utilities/Logger.cs index 60ede05..2089bec 100644 --- a/Assets/Engine/Runtime/Utilities/Logger.cs +++ b/Assets/Engine/Runtime/Utilities/Logger.cs @@ -13,7 +13,8 @@ namespace EscapeRoomEngine.Engine.Runtime.Utilities RequirementResolution, PuzzleFlow, PuzzleDetail, - Portals + Portals, + Measuring } public class Logger : MonoBehaviour diff --git a/Assets/Engine/Runtime/Utilities/Utilities.cs b/Assets/Engine/Runtime/Utilities/Utilities.cs index 96e0d54..b434ba7 100644 --- a/Assets/Engine/Runtime/Utilities/Utilities.cs +++ b/Assets/Engine/Runtime/Utilities/Utilities.cs @@ -1,6 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using UnityEngine; +using Random = UnityEngine.Random; namespace EscapeRoomEngine.Engine.Runtime.Utilities { @@ -37,4 +39,10 @@ namespace EscapeRoomEngine.Engine.Runtime.Utilities public static Vector3Int ProjectAtHeight(this Vector2Int vector, int height) => new Vector3Int(vector.x, height, vector.y); } + + public static class FloatExtensions + { + public static TimeSpan ToTimeSpan(this float seconds) => + new(0, 0, 0, Mathf.RoundToInt(seconds), 0); + } } \ No newline at end of file diff --git a/Assets/Portal/Runtime/Portal.cs b/Assets/Portal/Runtime/Portal.cs index 421a673..2dc1012 100644 --- a/Assets/Portal/Runtime/Portal.cs +++ b/Assets/Portal/Runtime/Portal.cs @@ -52,6 +52,10 @@ namespace EscapeRoomEngine.Portal.Runtime StopTrackingDriver(portalDriver); linkedPortal.StartTrackingDriver(portalDriver, -1); portalDriver.Teleport(this, linkedPortal); + if (portalDriver.player) + { + linkedPortal.OnDoorEvent(DoorEventType.ExitedFrom); + } i--; // decrease the loop counter because the list is one element smaller now } } diff --git a/Assets/Portal/Runtime/PortalDriver.cs b/Assets/Portal/Runtime/PortalDriver.cs index 7d294a6..63183b7 100644 --- a/Assets/Portal/Runtime/PortalDriver.cs +++ b/Assets/Portal/Runtime/PortalDriver.cs @@ -16,6 +16,10 @@ namespace EscapeRoomEngine.Portal.Runtime /// Whether this portal driver has a clone mirroring it at other portals. Disable this for the player. /// public bool hasClone = true; + /// + /// Whether this portal driver is the player. Used by portals to tell when the player has passed to another space. + /// + public bool player; /// /// The side of the portal this became tracked on. diff --git a/Assets/Scenes/TestScene.unity b/Assets/Scenes/TestScene.unity index 15d1a45..0266171 100644 --- a/Assets/Scenes/TestScene.unity +++ b/Assets/Scenes/TestScene.unity @@ -628,6 +628,7 @@ GameObject: m_Component: - component: {fileID: 1568048335} - component: {fileID: 1568048334} + - component: {fileID: 1568048339} - component: {fileID: 1568048336} m_Layer: 0 m_Name: Engine @@ -679,4 +680,17 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: loggingEnabled: 1 - typeFilter: 00000000 + typeFilter: 0000000009000000 +--- !u!114 &1568048339 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1568048333} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: adcd0bf392c89ae4da3c50e3f06735a1, type: 3} + m_Name: + m_EditorClassIdentifier: + databasePath: measurements.realm diff --git a/Assets/VR/Assets/Prefabs/XR Origin.prefab b/Assets/VR/Assets/Prefabs/XR Origin.prefab index 64d85bd..2adb10f 100644 --- a/Assets/VR/Assets/Prefabs/XR Origin.prefab +++ b/Assets/VR/Assets/Prefabs/XR Origin.prefab @@ -458,6 +458,7 @@ MonoBehaviour: m_EditorClassIdentifier: traveller: {fileID: 419816429471595185} hasClone: 0 + player: 1 entrySide: 0 clone: {fileID: 0} --- !u!135 &419816428804372195 @@ -964,6 +965,7 @@ MonoBehaviour: m_EditorClassIdentifier: traveller: {fileID: 419816429504646916} hasClone: 1 + player: 0 entrySide: 0 clone: {fileID: 0} --- !u!1 &419816429471595190 @@ -1369,6 +1371,7 @@ MonoBehaviour: m_EditorClassIdentifier: traveller: {fileID: 419816428170395206} hasClone: 1 + player: 0 entrySide: 0 clone: {fileID: 0} --- !u!1 &2085627837412252196 diff --git a/Packages/manifest.json b/Packages/manifest.json index 42a0dbd..ec191a9 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,5 +1,6 @@ { "dependencies": { + "io.realm.unity": "10.18.0", "com.dbrizov.naughtyattributes": "https://github.com/dbrizov/NaughtyAttributes.git#upm", "com.unity.ide.rider": "3.0.17", "com.unity.ide.visualstudio": "2.0.17", @@ -43,5 +44,14 @@ "com.unity.modules.vr": "1.0.0", "com.unity.modules.wind": "1.0.0", "com.unity.modules.xr": "1.0.0" - } + }, + "scopedRegistries": [ + { + "name": "NPM", + "url": "https://registry.npmjs.org", + "scopes": [ + "io.realm.unity" + ] + } + ] } diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 838bc8d..f7f5831 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -219,6 +219,13 @@ }, "url": "https://packages.unity.com" }, + "io.realm.unity": { + "version": "10.18.0", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://registry.npmjs.org" + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset index e0b774e..24283fd 100644 --- a/ProjectSettings/PackageManagerSettings.asset +++ b/ProjectSettings/PackageManagerSettings.asset @@ -17,6 +17,7 @@ MonoBehaviour: m_AdvancedSettingsExpanded: 1 m_ScopedRegistriesSettingsExpanded: 1 m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 oneTimeWarningShown: 1 m_Registries: - m_Id: main @@ -25,11 +26,20 @@ MonoBehaviour: m_Scopes: [] m_IsDefault: 1 m_Capabilities: 7 - m_UserSelectedRegistryName: + m_ConfigSource: 0 + - m_Id: scoped:project:NPM + m_Name: NPM + m_Url: https://registry.npmjs.org + m_Scopes: + - io.realm.unity + m_IsDefault: 0 + m_Capabilities: 0 + m_ConfigSource: 4 + m_UserSelectedRegistryName: NPM m_UserAddingNewScopedRegistry: 0 m_RegistryInfoDraft: m_Modified: 0 m_ErrorMessage: - m_UserModificationsInstanceId: -846 - m_OriginalInstanceId: -848 + m_UserModificationsInstanceId: -828 + m_OriginalInstanceId: -830 m_LoadAssets: 0 diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index e76a628..c590344 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -12,7 +12,7 @@ PlayerSettings: targetDevice: 2 useOnDemandResources: 0 accelerometerFrequency: 60 - companyName: DefaultCompany + companyName: University of Basel productName: Escape Room Engine defaultCursor: {fileID: 0} cursorHotspot: {x: 0, y: 0}