Files
modular-vr/Assets/Engine/Runtime/Measurements/Puzzle.cs
2022-12-15 23:29:02 +01:00

51 lines
1.7 KiB
C#

using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using EscapeRoomEngine.Engine.Runtime.Modules;
using EscapeRoomEngine.Engine.Runtime.Utilities;
using JetBrains.Annotations;
using Realms;
namespace EscapeRoomEngine.Engine.Runtime.Measurements
{
[SuppressMessage("ReSharper", "UnassignedGetOnlyAutoProperty")]
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;
public NormalDistribution Distribution => new(TimesAsSamples());
[UsedImplicitly]
public Puzzle() {}
public Puzzle(PuzzleModuleDescription puzzle)
{
ID = puzzle.Id;
}
/// <summary>
/// Estimate how long a player in the given percentile will take to solve this puzzle.
/// </summary>
public float EstimateTimeToSolve(float percentile) => Distribution.InverseCumulative(percentile);
private float[] TimesAsSamples()
{
var samples = new float[Measurements.Count];
for (var i = 0; i < Measurements.Count; i++)
{
samples[i] = Measurements[i].Time;
}
return samples;
}
public override string ToString()
{
return $"{Engine.Theme.GetPuzzle(ID)}: avg. {AverageTimeToSolve.ToTimeSpan():m':'ss} ({string.Join(", ", Measurements)})";
}
}
}