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(); } #region Session public void EndSession(Session session, float time) { session.Time = time; _realm.Write(() => { _realm.Add(session); }); } #endregion #region Puzzles private Puzzle New(PuzzleModuleDescription puzzle) { Puzzle created = null; _realm.Write(() => created = _realm.Add(new Puzzle(puzzle))); return created; } private Puzzle LoadOrNew(PuzzleModuleDescription puzzle) => _realm.Find(puzzle.Id) ?? New(puzzle); private 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(Session session, PuzzleModuleDescription puzzle, PuzzleMeasurement measurement) { var found = LoadOrNew(puzzle); _realm.Write(() => { measurement.TimeSolved = Time.time; found.Measurements.Add(measurement); // add solved puzzle to session session.PuzzlesSolved.Add(found); }); } #endregion } }