98 lines
2.6 KiB
C#
98 lines
2.6 KiB
C#
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<PuzzleStorage>();
|
|
}
|
|
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>(puzzle.Id) ?? New(puzzle);
|
|
|
|
private Puzzle Load(PuzzleModuleDescription puzzle) => _realm.Find<Puzzle>(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
|
|
}
|
|
} |