using System.Collections.Generic; using EscapeRoomEngine.Engine.Runtime.Modules; using EscapeRoomEngine.Engine.Runtime.Modules.State; using EscapeRoomEngine.Engine.Runtime.Utilities; using NaughtyAttributes; using Station46.Runtime; using UnityEngine; namespace Station46.Holes.Scripts { /// /// The main component for the orb grid module. /// public class Holes : StatePuzzle { [BoxGroup("Internal")] [SerializeField] private Emission frameLight; private List _holes; private Dispenser.Scripts.Dispenser _dispenser; protected override void Awake() { base.Awake(); _holes = new List(GetComponentsInChildren()); } protected override void Start() { base.Start(); PuzzleEvent += (_, type) => { // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (type) { case PuzzleEventType.Restarted: var color = EscapeRoomEngine.Engine.Runtime.Engine.Theme.puzzleColor; _holes.ForEach(hole => { hole.Enable(); hole.Emission.color = color.hdr; }); frameLight.color = color.hdr; _dispenser.Reset(); break; case PuzzleEventType.Solved: var solvedColor = EscapeRoomEngine.Engine.Runtime.Engine.Theme.solvedColor; var activeColor = EscapeRoomEngine.Engine.Runtime.Engine.Theme.activeColor; _holes.ForEach(hole => { hole.Disable(); hole.Emission.color = solution[hole.number] == 1 ? activeColor.hdr : solvedColor.hdr; }); frameLight.color = solvedColor.hdr; _dispenser.Solve(); break; } }; _holes.ForEach(hole => hole.ButtonEvent += (_, type) => { // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (type) { case ButtonEventType.Pressed: SetState(hole.number, 1, true); break; case ButtonEventType.Released: SetState(hole.number, 0, true); break; } }); frameLight.active = true; } public override void SetModule(Module module) { base.SetModule(module); // The holes require a related dispenser module var firstRelatedModule = Module.relatedModules[0]; if (firstRelatedModule.State is Dispenser.Scripts.Dispenser dispenser) { _dispenser = dispenser; } else { throw new EngineException("Holes were not assigned a related Dispenser."); } } } }