PuzzleMeasurement, add Realm, door ExitedFrom event

This commit is contained in:
2022-12-05 18:11:00 +01:00
parent 5449283e5d
commit b776e6744e
34 changed files with 344 additions and 63 deletions

View File

@@ -1,8 +0,0 @@
namespace EscapeRoomEngine.Engine.Runtime.Measurements
{
public interface IMeasurementStorage
{
public void Save(MeasurementCollection measurements);
public MeasurementCollection Load(int key);
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 6c93e87219e64bc3ad8263da8109e51c
timeCreated: 1670750698

View File

@@ -1,7 +1,44 @@
namespace EscapeRoomEngine.Engine.Runtime.Measurements
using System.Collections.Generic;
using EscapeRoomEngine.Engine.Runtime.Modules;
using UnityEngine;
using Logger = EscapeRoomEngine.Engine.Runtime.Utilities.Logger;
using LogType = EscapeRoomEngine.Engine.Runtime.Utilities.LogType;
namespace EscapeRoomEngine.Engine.Runtime.Measurements
{
public class Measure
public static class Measure
{
private static Dictionary<int, PuzzleMeasurement> _runningMeasurements;
public static void StartMeasuring(PuzzleModuleDescription puzzle)
{
_runningMeasurements[puzzle.Id] = new PuzzleMeasurement
{
TimeStarted = Time.time,
TimeSolved = Time.time
};
Logger.Log($"Started measuring {puzzle}", LogType.Measuring);
LogAllMeasurements();
}
public static void Solve(PuzzleModuleDescription puzzle)
{
var measurement = _runningMeasurements[puzzle.Id];
PuzzleStorage.Instance.EndMeasurement(puzzle, measurement);
Logger.Log($"Solved {puzzle} with measurement {measurement}", LogType.Measuring);
}
public static void LogAllMeasurements()
{
Engine.DefaultEngine.theme.puzzleTypes.ForEach(puzzle =>
{
Logger.Log(PuzzleStorage.Instance.LoadOrNew(puzzle).ToString(), LogType.Measuring);
});
}
public static void Clear() => _runningMeasurements = new Dictionary<int, PuzzleMeasurement>();
}
}

View File

@@ -1,13 +0,0 @@
using System;
namespace EscapeRoomEngine.Engine.Runtime.Measurements
{
[Serializable]
public struct MeasurementCollection
{
/// <summary>
/// The module id is a
/// </summary>
public int moduleId;
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: e6d831555dc34776b8212a9d9de33414
timeCreated: 1670695633

View File

@@ -0,0 +1,31 @@
using System.Collections.Generic;
using System.Linq;
using EscapeRoomEngine.Engine.Runtime.Modules;
using EscapeRoomEngine.Engine.Runtime.Utilities;
using JetBrains.Annotations;
using Realms;
namespace EscapeRoomEngine.Engine.Runtime.Measurements
{
public class Puzzle : RealmObject
{
[PrimaryKey]
public int ID { get; set; }
public IList<PuzzleMeasurement> Measurements { get; }
public float TotalTimeSpentOnPuzzle => Measurements.Sum(measurement => measurement.Time);
public float AverageTimeToSolve => Measurements.Count > 0 ? TotalTimeSpentOnPuzzle / Measurements.Count : 0f;
[UsedImplicitly]
public Puzzle() {}
public Puzzle(PuzzleModuleDescription puzzle)
{
ID = puzzle.Id;
}
public override string ToString()
{
return $"{Engine.DefaultEngine.theme.GetPuzzle(ID)}: avg. {AverageTimeToSolve.ToTimeSpan():m':'ss} ({string.Join(", ", Measurements)})";
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 0fb9915d920c4298a8ceeba7df5112b5
timeCreated: 1670773536

View File

@@ -1,15 +1,18 @@
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using EscapeRoomEngine.Engine.Runtime.Utilities;
using Realms;
namespace EscapeRoomEngine.Engine.Runtime.Measurements
{
[Serializable]
public struct PuzzleMeasurement
public class PuzzleMeasurement : EmbeddedObject
{
public void a()
public float TimeStarted { get; set; }
public float TimeSolved { get; set; }
public float Time => TimeSolved - TimeStarted;
public override string ToString()
{
new BinaryFormatter().Serialize(new MemoryStream(), this);
return $"{Time.ToTimeSpan():m':'ss}";
}
}
}

View File

@@ -0,0 +1,82 @@
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();
}
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>(puzzle.Id) ?? New(puzzle);
public 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(PuzzleModuleDescription puzzle, PuzzleMeasurement measurement)
{
var found = LoadOrNew(puzzle);
_realm.Write(() =>
{
measurement.TimeSolved = Time.time;
found.Measurements.Add(measurement);
});
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: adcd0bf392c89ae4da3c50e3f06735a1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: