using System; using Escape_Room_Engine.Engine.Scripts.Utilities; using NaughtyAttributes; using Logger = Escape_Room_Engine.Engine.Scripts.Utilities.Logger; using LogType = Escape_Room_Engine.Engine.Scripts.Utilities.LogType; namespace Escape_Room_Engine.Engine.Scripts.Modules { public enum PuzzleEventType { Restarted, Solved, WrongInput } public static class PuzzleEventExtensions { public static string Description(this PuzzleEventType type, PuzzleModule module) { return type switch { PuzzleEventType.Restarted => $"{module} has been restarted", PuzzleEventType.Solved => $"{module} has been solved", PuzzleEventType.WrongInput => $"Wrong input for {module}", _ => throw new ArgumentOutOfRangeException(nameof(type), type, null) }; } } public delegate void PuzzleEventHandler(PuzzleModule source, PuzzleEventType e); public class PuzzleState : ModuleState { public event PuzzleEventHandler PuzzleEvent; public EngineTheme theme; private new PuzzleModule Module { get; set; } public bool Solved { get => _solved; private set { var type = !_solved && value ? Some.Of(PuzzleEventType.Solved) : _solved && !value ? Some.Of(PuzzleEventType.Restarted) : None.New(); _solved = value; type.Match(some: OnPuzzleEvent); } } private bool _solved; private void OnPuzzleEvent(PuzzleEventType type) { Logger.Log(type.Description(Module), LogType.PuzzleFlow); PuzzleEvent?.Invoke(Module, type); } public override void SetModule(Module module) { if (module is PuzzleModule puzzleModule) { Module = puzzleModule; } else { throw new Exception("Tried to set wrong type of module."); } } [Button(enabledMode: EButtonEnableMode.Playmode)] public void Solve() { Solved = true; } [Button(enabledMode: EButtonEnableMode.Playmode)] public void Restart() { Solved = false; } [Button("Trigger Wrong Input", EButtonEnableMode.Playmode)] public void WrongInput() { if (!Solved) { OnPuzzleEvent(PuzzleEventType.WrongInput); } } } }