increase room diversity, improve ui

This commit is contained in:
2023-05-13 13:06:08 +02:00
parent ec094f410f
commit 033989a85e
21 changed files with 736 additions and 83 deletions

View File

@@ -9,6 +9,7 @@ using NaughtyAttributes;
using UnityEngine;
using Logger = EscapeRoomEngine.Engine.Runtime.Utilities.Logger;
using LogType = EscapeRoomEngine.Engine.Runtime.Utilities.LogType;
using Range = EscapeRoomEngine.Engine.Runtime.Utilities.Range;
namespace EscapeRoomEngine.Engine.Runtime
{
@@ -108,7 +109,7 @@ namespace EscapeRoomEngine.Engine.Runtime
Passage exit;
// choose a puzzle from the plan and remove it from both the plan and later available puzzles (so it is only chosen once)
var puzzle = _plannedPuzzles.PopRandomElement();
var puzzle = Measure.PreferLessPlayed ? _plannedPuzzles.Pop() : _plannedPuzzles.PopRandomElement();
_availablePuzzles.Remove(puzzle);
GameControl.Instance.CurrentPuzzle = puzzle;
@@ -173,6 +174,11 @@ namespace EscapeRoomEngine.Engine.Runtime
_plannedPuzzles.Add(_availablePuzzles[i]);
}
if (Measure.PreferLessPlayed)
{
_plannedPuzzles.Sort((a, b) => Measure.TimesPlayed(a).CompareTo(Measure.TimesPlayed(b)));
}
EstimatedTimeRemaining = Measure.EstimateTime(_plannedPuzzles);
GameControl.Instance.PlannedPuzzles = _plannedPuzzles;
}

View File

@@ -17,6 +17,7 @@ namespace EscapeRoomEngine.Engine.Runtime.Measurements
/// Whether to store the taken measurements in the database. Disable for test runs.
/// </summary>
public static bool Store { get; set; }
public static bool PreferLessPlayed => GameControl.Instance.preferLessPlayed.Value;
private static Dictionary<int, PuzzleMeasurement> _runningMeasurements;
private static Session _currentSession;
@@ -52,6 +53,12 @@ namespace EscapeRoomEngine.Engine.Runtime.Measurements
/// <remarks>This only counts puzzles already placed in a room.</remarks>
public static float EstimateTime(Room room) =>
room.puzzles.Sum(puzzle => EstimateTime((PuzzleModuleDescription)puzzle.description));
/// <summary>
/// How often a specific puzzle has been played before.
/// </summary>
public static int TimesPlayed(PuzzleModuleDescription puzzle) =>
PuzzleStorage.Instance.LoadOrNew(puzzle).Measurements.Count;
/// <summary>
/// The estimated percentile the current player is placed in.

View File

@@ -1,14 +1,10 @@
using System;
using System.Collections.Generic;
using EscapeRoomEngine.Engine.Runtime.Modules;
using EscapeRoomEngine.Engine.Runtime.Modules.Description;
using EscapeRoomEngine.Engine.Runtime.UI;
using EscapeRoomEngine.Engine.Runtime.Utilities;
using UnityEngine;
using Logger = EscapeRoomEngine.Engine.Runtime.Utilities.Logger;
using LogType = EscapeRoomEngine.Engine.Runtime.Utilities.LogType;
using Object = UnityEngine.Object;
using Range = EscapeRoomEngine.Engine.Runtime.Utilities.Range;
namespace EscapeRoomEngine.Engine.Runtime
{

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: c13c76161df849bfb0bd769d1756a66f
timeCreated: 1683591920

View File

@@ -19,7 +19,7 @@ namespace EscapeRoomEngine.Engine.Runtime.UI
/// </summary>
public class GameControl : MonoBehaviour
{
public static readonly Vector2Int DefaultRoomSize = new Vector2Int(2, 4);
private const string TargetTimeKey = "target_time";
/// <summary>
/// The active instance of the game control.
@@ -35,13 +35,15 @@ namespace EscapeRoomEngine.Engine.Runtime.UI
[BoxGroup("Internal")] [SerializeField]
private Button startButton, stopButton, pauseButton, addTimeButton, removeTimeButton;
[BoxGroup("Internal")] [SerializeField]
private Text timeText, roomTimeText, estimateTimeText, targetTimeText, percentileText, widthText, lengthText;
private Text timeText, roomTimeText, estimateTimeText, targetTimeText, percentileText;
[BoxGroup("Internal")] [SerializeField]
private Slider roomWidth, roomLength;
private PersistedSlider roomWidth, roomLength;
[BoxGroup("Internal")] [SerializeField]
private Transform roomSizeElement;
[BoxGroup("Internal")] [SerializeField]
private PuzzlePlan puzzlePlan;
[BoxGroup("Internal")] public PersistedToggle preferLessPlayed;
[HideInInspector] public GameState gameState = GameState.Stopped;
public PuzzleModuleDescription CurrentPuzzle
@@ -73,21 +75,20 @@ namespace EscapeRoomEngine.Engine.Runtime.UI
/// The estimated total time the player will spend in the experience.
/// </summary>
public float EstimatedTime { get; private set; }
public Vector2Int RoomSize { get; private set; }
public Vector2Int RoomSize => new(roomWidth.Value, roomLength.Value);
private float _previousUIUpdate, _previousPlanUpdate;
private void Awake()
{
Instance = this;
RoomSize = DefaultRoomSize;
}
private void Start()
{
TargetTime = Engine.Instance.initialTargetTime;
// read preferences
TargetTime = PlayerPrefs.GetFloat(TargetTimeKey, Engine.Instance.initialTargetTime);
SetTimeText();
}
@@ -121,10 +122,7 @@ namespace EscapeRoomEngine.Engine.Runtime.UI
startButton.interactable = gameState == GameState.Stopped;
stopButton.interactable = gameState != GameState.Stopped;
pauseButton.interactable = gameState is GameState.Running or GameState.Paused;
addTimeButton.interactable = gameState is GameState.Running or GameState.Paused;
removeTimeButton.interactable = gameState is GameState.Running or GameState.Paused && TargetTime >= TimeElapsed + 60;
roomWidth.interactable = gameState == GameState.Stopped;
roomLength.interactable = gameState == GameState.Stopped;
removeTimeButton.interactable = TargetTime >= TimeElapsed + 60;
}
#region Time Controls
@@ -191,6 +189,8 @@ namespace EscapeRoomEngine.Engine.Runtime.UI
if (TargetTime + seconds >= TimeElapsed)
{
TargetTime += seconds;
PlayerPrefs.SetFloat(TargetTimeKey, TargetTime);
PlayerPrefs.Save();
}
}
@@ -230,13 +230,6 @@ namespace EscapeRoomEngine.Engine.Runtime.UI
#endregion
public void SetRoomSize()
{
RoomSize = new Vector2Int((int)roomWidth.value, (int)roomLength.value);
widthText.text = RoomSize.x.ToString();
lengthText.text = RoomSize.y.ToString();
}
public void ExitGame()
{
StopGame();

View File

@@ -0,0 +1,35 @@
using UnityEngine;
using UnityEngine.UI;
namespace EscapeRoomEngine.Engine.Runtime.UI
{
public class PersistedSlider : PersistedUI<int>
{
[SerializeField] private Slider slider;
[SerializeField] private Text label;
protected override void Start()
{
base.Start();
slider.wholeNumbers = true;
slider.onValueChanged.AddListener(value =>
{
Value = (int) value;
DisplayValue();
PlayerPrefs.SetInt(key, Value);
PlayerPrefs.Save();
});
}
protected override int RetrieveValue() => PlayerPrefs.GetInt(key, defaultValue);
protected override void DisplayValue()
{
slider.value = Value;
label.text = Value.ToString();
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2efb00aece2e423ba5e141ebf2f7111a
timeCreated: 1683968307

View File

@@ -0,0 +1,31 @@
using System;
using UnityEngine;
using UnityEngine.UI;
namespace EscapeRoomEngine.Engine.Runtime.UI
{
public class PersistedToggle : PersistedUI<bool>
{
[SerializeField] private Toggle toggle;
protected override void Start()
{
base.Start();
toggle.onValueChanged.AddListener(value =>
{
Value = value;
PlayerPrefs.SetInt(key, Convert.ToInt32(Value));
PlayerPrefs.Save();
});
}
protected override bool RetrieveValue() => PlayerPrefs.GetInt(key, Convert.ToInt32(defaultValue)) != 0;
protected override void DisplayValue()
{
toggle.isOn = Value;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 9a4faeb3634c42e38fb0c2b5f26bdd5d
timeCreated: 1683969579

View File

@@ -0,0 +1,21 @@
using UnityEngine;
namespace EscapeRoomEngine.Engine.Runtime.UI
{
public abstract class PersistedUI<T> : MonoBehaviour
{
public string key;
public T defaultValue;
public T Value { get; protected set; }
protected virtual void Start()
{
Value = RetrieveValue();
DisplayValue();
}
protected abstract T RetrieveValue();
protected abstract void DisplayValue();
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b629c5229b954b5d847e58f9b439607a
timeCreated: 1683965075

View File

@@ -27,7 +27,7 @@ namespace EscapeRoomEngine.Engine.Runtime.UI.Elements
set
{
puzzleName.text = value.puzzleName;
estimatedTime.text = $"Time Estimate: {Measure.EstimateTime(value).ToTimeSpan():mm':'ss}";
estimatedTime.text = $"Est. {Measure.EstimateTime(value).ToTimeSpan():mm':'ss}";
}
}
}

View File

@@ -33,6 +33,16 @@ namespace EscapeRoomEngine.Engine.Runtime.Utilities
public static class ListExtensions
{
/// <summary>
/// remove the first element from a list and return it.
/// </summary>
public static T Pop<T>(this List<T> list)
{
var element = list[0];
list.RemoveAt(0);
return element;
}
/// <summary>
/// remove a random element from a list and return it.
/// </summary>