using EscapeRoomEngine.Engine.Runtime.Utilities; using NaughtyAttributes; namespace EscapeRoomEngine.Engine.Runtime.Modules { public enum DoorEventType { Locked, Unlocked } public delegate void DoorEventHandler(DoorModule source, DoorEventType e); public class DoorState : ModuleState { public event DoorEventHandler DoorEvent; private DoorModule Module { get; set; } public bool Unlocked { get => _unlocked; private set { var type = !_unlocked && value ? Some.Of(DoorEventType.Unlocked) : _unlocked && !value ? Some.Of(DoorEventType.Locked) : None.New(); _unlocked = value; type.Match(some: OnDoorEvent); } } private bool _unlocked; private void OnDoorEvent(DoorEventType type) { Logger.Log($"{Module} has been {type}", LogType.PuzzleFlow); DoorEvent?.Invoke(Module, type); } public override void SetModule(Module module) { Module = DoorModule.FromModule(module); } [Button(enabledMode: EButtonEnableMode.Playmode)] internal void Unlock() { Unlocked = true; } [Button(enabledMode: EButtonEnableMode.Playmode)] internal void Lock() { Unlocked = false; } public static DoorState FromState(ModuleState state) { if (state is DoorState doorState) { return doorState; } throw new WrongTypeException(typeof(DoorState), state.GetType(), typeof(ModuleState)); } } }