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