using Escape_Room_Engine.Engine.Scripts.Utilities; using UnityEngine; 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 { Reset, Solved } public delegate void PuzzleEventHandler(PuzzleModule source, PuzzleEventType e); public class PuzzleModule : Module { internal event PuzzleEventHandler PuzzleEvent; internal bool Solved { get => _solved; private set { var type = !_solved && value ? Some.Of(PuzzleEventType.Solved) : _solved && value ? Some.Of(PuzzleEventType.Reset) : None.New(); _solved = value; type.Match(some: OnPuzzleEvent); } } private bool _solved; internal PuzzleModule(Space space, PuzzleModuleDescription description) : base(space, description) { srDimensions.Size = Vector2Int.one; // TODO: larger modules } protected virtual void OnPuzzleEvent(PuzzleEventType type) { Logger.Log($"{this} has been {type}", LogType.PuzzleFlow); PuzzleEvent?.Invoke(this, type); } public void Solve() { Solved = true; } public override string ToString() { return $"Puzzle module ({(Solved ? "" : "not ")}solved)"; } } }