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"; public Session Session { get; private set; } 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 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))); 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); // add solved puzzle to session Session.PuzzlesSolved.Add(found); }); } #endregion } }