using System; using Escape_Room_Engine.Engine.Scripts.Utilities; using NaughtyAttributes; namespace Escape_Room_Engine.Engine.Scripts.Modules { public enum PuzzleEventType { Restarted, Solved } public delegate void PuzzleEventHandler(PuzzleModule source, PuzzleEventType e); public class PuzzleState : ModuleState { public event PuzzleEventHandler PuzzleEvent; 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($"{Module} has been {type}", 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; } } }