From b3c53031c1f1ac14ddf7abb98c189f865928eecc Mon Sep 17 00:00:00 2001 From: milan Date: Thu, 8 Dec 2022 10:24:00 +0100 Subject: [PATCH] sessions --- .../Assets/Prefabs/Gamemaster Canvas.prefab | 12 +++--- Assets/Engine/Runtime/Engine.cs | 2 - Assets/Engine/Runtime/GameControl.cs | 40 +++++++++---------- Assets/Engine/Runtime/Measurements/Measure.cs | 10 +++++ Assets/Engine/Runtime/Measurements/Puzzle.cs | 2 + .../Runtime/Measurements/PuzzleStorage.cs | 28 +++++++++---- Assets/Engine/Runtime/Measurements/Session.cs | 29 ++++++++++++++ .../Runtime/Measurements/Session.cs.meta | 3 ++ 8 files changed, 90 insertions(+), 36 deletions(-) create mode 100644 Assets/Engine/Runtime/Measurements/Session.cs create mode 100644 Assets/Engine/Runtime/Measurements/Session.cs.meta diff --git a/Assets/Engine/Assets/Prefabs/Gamemaster Canvas.prefab b/Assets/Engine/Assets/Prefabs/Gamemaster Canvas.prefab index e4b83b6..e670013 100644 --- a/Assets/Engine/Assets/Prefabs/Gamemaster Canvas.prefab +++ b/Assets/Engine/Assets/Prefabs/Gamemaster Canvas.prefab @@ -123,7 +123,7 @@ MonoBehaviour: m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: +1min + m_Text: +10sec --- !u!1 &4522052737580626021 GameObject: m_ObjectHideFlags: 0 @@ -352,7 +352,7 @@ GameObject: - component: {fileID: 4522052738465728852} - component: {fileID: 4522052738465728855} m_Layer: 8 - m_Name: Add Minute Button + m_Name: Add Time Button m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -469,7 +469,7 @@ MonoBehaviour: m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 60 + m_IntArgument: 10 m_FloatArgument: 0 m_StringArgument: m_BoolArgument: 0 @@ -1484,7 +1484,7 @@ MonoBehaviour: m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: -1min + m_Text: -10sec --- !u!1 &4522052739295172462 GameObject: m_ObjectHideFlags: 0 @@ -1498,7 +1498,7 @@ GameObject: - component: {fileID: 4522052739295172461} - component: {fileID: 4522052739295172460} m_Layer: 8 - m_Name: Remove Minute Button + m_Name: Remove Time Button m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1615,7 +1615,7 @@ MonoBehaviour: m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: -60 + m_IntArgument: -10 m_FloatArgument: 0 m_StringArgument: m_BoolArgument: 0 diff --git a/Assets/Engine/Runtime/Engine.cs b/Assets/Engine/Runtime/Engine.cs index fbce279..e6e3b2f 100644 --- a/Assets/Engine/Runtime/Engine.cs +++ b/Assets/Engine/Runtime/Engine.cs @@ -49,8 +49,6 @@ namespace EscapeRoomEngine.Engine.Runtime _playSpaceOrigin = new GameObject("Play Space Origin"); _playSpaceOrigin.transform.SetParent(transform); _playSpaceOrigin.transform.localPosition = new Vector3(-theme.playSpace.x / 2f, 0, -theme.playSpace.y / 2f); - - GenerateRoom(); } public void GenerateRoom() diff --git a/Assets/Engine/Runtime/GameControl.cs b/Assets/Engine/Runtime/GameControl.cs index 81b8f52..9c8be00 100644 --- a/Assets/Engine/Runtime/GameControl.cs +++ b/Assets/Engine/Runtime/GameControl.cs @@ -1,4 +1,5 @@ using System; +using EscapeRoomEngine.Engine.Runtime.Measurements; using UnityEngine; using UnityEngine.UI; @@ -11,20 +12,16 @@ namespace EscapeRoomEngine.Engine.Runtime public class GameControl : MonoBehaviour { - private const int InitialTime = 5 * 60; - [SerializeField] private Button startButton, stopButton, pauseButton, resumeButton, addMinuteButton, removeMinuteButton; [SerializeField] private Text timeText; [HideInInspector] public GameState gameState = GameState.Stopped; - public float TimeRemaining => _totalTime - _timeElapsed; - - private float _timeElapsed, _totalTime; + private float _timeElapsed; private void Start() { - SetGamemasterTimeText(_totalTime); + SetGamemasterTimeText(_timeElapsed); } private void Update() @@ -32,17 +29,9 @@ namespace EscapeRoomEngine.Engine.Runtime // Update time if (gameState == GameState.Running) { - if (Time.deltaTime <= TimeRemaining) - { - _timeElapsed += Time.deltaTime; - } - else - { - _timeElapsed = _totalTime; - StopGame(); - } + _timeElapsed += Time.deltaTime; - SetGamemasterTimeText(TimeRemaining); + SetGamemasterTimeText(_timeElapsed); } // Enable or disable buttons @@ -51,7 +40,7 @@ namespace EscapeRoomEngine.Engine.Runtime pauseButton.interactable = gameState == GameState.Running; resumeButton.interactable = gameState == GameState.Paused; addMinuteButton.interactable = gameState != GameState.Stopped; - removeMinuteButton.interactable = gameState != GameState.Stopped && TimeRemaining >= 60; + removeMinuteButton.interactable = gameState != GameState.Stopped && _timeElapsed >= 10; } #region Time Controls @@ -60,12 +49,23 @@ namespace EscapeRoomEngine.Engine.Runtime { gameState = GameState.Running; - _totalTime = InitialTime; _timeElapsed = 0; + + // generate the first room if it hasn't been generated yet + Engine.DefaultEngine.CurrentRoom.Match(none: () => Engine.DefaultEngine.GenerateRoom()); + + // start a new session + Measure.StartSession(); } public void StopGame() { + if (gameState != GameState.Stopped) + { + // was running + Measure.EndSession(_timeElapsed); + } + gameState = GameState.Stopped; } @@ -85,9 +85,9 @@ namespace EscapeRoomEngine.Engine.Runtime /// The amount of seconds that will be added to the time. Can be negative to remove time. public void ChangeTime(int seconds) { - if (_totalTime + seconds >= 0) + if (_timeElapsed + seconds >= 0) { - _totalTime += seconds; + _timeElapsed += seconds; } } diff --git a/Assets/Engine/Runtime/Measurements/Measure.cs b/Assets/Engine/Runtime/Measurements/Measure.cs index b809664..2f219b6 100644 --- a/Assets/Engine/Runtime/Measurements/Measure.cs +++ b/Assets/Engine/Runtime/Measurements/Measure.cs @@ -31,12 +31,22 @@ namespace EscapeRoomEngine.Engine.Runtime.Measurements Logger.Log($"Solved {puzzle} with measurement {measurement}", LogType.Measuring); } + public static void StartSession() => PuzzleStorage.Instance.StartSession(); + + public static void EndSession(float time) + { + PuzzleStorage.Instance.EndSession(time); + + Logger.Log(PuzzleStorage.Instance.Session.ToString(), LogType.Measuring); + } + public static void LogAllMeasurements() { Engine.DefaultEngine.theme.puzzleTypes.ForEach(puzzle => { Logger.Log(PuzzleStorage.Instance.LoadOrNew(puzzle).ToString(), LogType.Measuring); }); + Logger.Log(PuzzleStorage.Instance.Session.ToString(), LogType.Measuring); } public static void Clear() => _runningMeasurements = new Dictionary(); diff --git a/Assets/Engine/Runtime/Measurements/Puzzle.cs b/Assets/Engine/Runtime/Measurements/Puzzle.cs index 444f403..b8d2531 100644 --- a/Assets/Engine/Runtime/Measurements/Puzzle.cs +++ b/Assets/Engine/Runtime/Measurements/Puzzle.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using EscapeRoomEngine.Engine.Runtime.Modules; using EscapeRoomEngine.Engine.Runtime.Utilities; @@ -7,6 +8,7 @@ using Realms; namespace EscapeRoomEngine.Engine.Runtime.Measurements { + [SuppressMessage("ReSharper", "UnassignedGetOnlyAutoProperty")] public class Puzzle : RealmObject { [PrimaryKey] diff --git a/Assets/Engine/Runtime/Measurements/PuzzleStorage.cs b/Assets/Engine/Runtime/Measurements/PuzzleStorage.cs index 4ee85f7..282ce18 100644 --- a/Assets/Engine/Runtime/Measurements/PuzzleStorage.cs +++ b/Assets/Engine/Runtime/Measurements/PuzzleStorage.cs @@ -24,6 +24,8 @@ namespace EscapeRoomEngine.Engine.Runtime.Measurements [SerializeField] private string databasePath = "measurements.realm"; + public Session Session { get; private set; } + private Realm _realm; private void OnEnable() @@ -41,23 +43,28 @@ namespace EscapeRoomEngine.Engine.Runtime.Measurements _realm?.Dispose(); } + #region Session + + public void StartSession() => _realm.Write(() => Session = _realm.Add(new Session())); + + public void EndSession(float time) =>_realm.Write(() => Session.Time = time); + + #endregion + + #region Puzzles + public Puzzle New(PuzzleModuleDescription puzzle) { Puzzle created = null; - _realm.Write(() => - { - created = _realm.Add(new Puzzle(puzzle)); - }); + _realm.Write(() => created = _realm.Add(new Puzzle(puzzle))); return created; } - public Puzzle LoadOrNew(PuzzleModuleDescription puzzle) => - _realm.Find(puzzle.Id) ?? New(puzzle); + public Puzzle LoadOrNew(PuzzleModuleDescription puzzle) => _realm.Find(puzzle.Id) ?? New(puzzle); - public Puzzle Load(PuzzleModuleDescription puzzle) => - _realm.Find(puzzle.Id); + public Puzzle Load(PuzzleModuleDescription puzzle) => _realm.Find(puzzle.Id); public void Delete(PuzzleModuleDescription puzzle) { @@ -76,7 +83,12 @@ namespace EscapeRoomEngine.Engine.Runtime.Measurements { measurement.TimeSolved = Time.time; found.Measurements.Add(measurement); + + // add solved puzzle to session + Session.PuzzlesSolved.Add(found); }); } + + #endregion } } \ No newline at end of file diff --git a/Assets/Engine/Runtime/Measurements/Session.cs b/Assets/Engine/Runtime/Measurements/Session.cs new file mode 100644 index 0000000..487ab72 --- /dev/null +++ b/Assets/Engine/Runtime/Measurements/Session.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using EscapeRoomEngine.Engine.Runtime.Utilities; +using JetBrains.Annotations; +using MongoDB.Bson; +using Realms; + +namespace EscapeRoomEngine.Engine.Runtime.Measurements +{ + [SuppressMessage("ReSharper", "UnassignedGetOnlyAutoProperty")] + public class Session : RealmObject + { + [PrimaryKey] + public ObjectId ID { get; set; } + public float Time { get; set; } + public IList PuzzlesSolved { get; } + + [UsedImplicitly] + public Session() + { + ID = ObjectId.GenerateNewId(); + } + + public override string ToString() + { + return $"Session {ID}: {PuzzlesSolved.Count} puzzles solved in {Time.ToTimeSpan():m':'ss}"; + } + } +} \ No newline at end of file diff --git a/Assets/Engine/Runtime/Measurements/Session.cs.meta b/Assets/Engine/Runtime/Measurements/Session.cs.meta new file mode 100644 index 0000000..a366afa --- /dev/null +++ b/Assets/Engine/Runtime/Measurements/Session.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 94ad8a288d6b4794b6485f026e94267e +timeCreated: 1670892444 \ No newline at end of file