PuzzleMeasurement, add Realm, door ExitedFrom event
This commit is contained in:
@@ -1,8 +0,0 @@
|
||||
namespace EscapeRoomEngine.Engine.Runtime.Measurements
|
||||
{
|
||||
public interface IMeasurementStorage
|
||||
{
|
||||
public void Save(MeasurementCollection measurements);
|
||||
public MeasurementCollection Load(int key);
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6c93e87219e64bc3ad8263da8109e51c
|
||||
timeCreated: 1670750698
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e6d831555dc34776b8212a9d9de33414
|
||||
timeCreated: 1670695633
|
||||
31
Assets/Engine/Runtime/Measurements/Puzzle.cs
Normal file
31
Assets/Engine/Runtime/Measurements/Puzzle.cs
Normal 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)})";
|
||||
}
|
||||
}
|
||||
}
|
||||
3
Assets/Engine/Runtime/Measurements/Puzzle.cs.meta
Normal file
3
Assets/Engine/Runtime/Measurements/Puzzle.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0fb9915d920c4298a8ceeba7df5112b5
|
||||
timeCreated: 1670773536
|
||||
@@ -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}";
|
||||
}
|
||||
}
|
||||
}
|
||||
82
Assets/Engine/Runtime/Measurements/PuzzleStorage.cs
Normal file
82
Assets/Engine/Runtime/Measurements/PuzzleStorage.cs
Normal 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);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/Engine/Runtime/Measurements/PuzzleStorage.cs.meta
Normal file
11
Assets/Engine/Runtime/Measurements/PuzzleStorage.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: adcd0bf392c89ae4da3c50e3f06735a1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user