using System; using System.Collections; using TMPro; using UnityEngine; using System.Collections.Generic; using Unity.VisualScripting; public abstract class Room : MonoBehaviour { [SerializeField] private List adjacentRooms; [SerializeField] private bool isEntrance; public event EventHandler ValidRoomClicked; private Color _roomNumberOriginalColor; protected bool _isExplored = false; protected Lock[] _locks; private bool _isClickable = true; private void OnEnable() { GameManager.StateChanged += HandleStateChange; GameManager.DiceSelected += HandleDiceSelected; GameManager.DiceUnselected += HandDiceUnselected; } private void OnDisable() { GameManager.StateChanged -= HandleStateChange; GameManager.DiceSelected -= HandleDiceSelected; GameManager.DiceUnselected -= HandDiceUnselected; } // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { InitializeRoom(); _roomNumberOriginalColor = gameObject.GetComponentInChildren().color; } public abstract void SetRoomExplored(); protected virtual void InitializeRoom() { if (isEntrance) { SetPropertiesOfEntrance(); } _locks = gameObject.GetComponents(); } protected void HighlightRoomAsOption() { gameObject.GetComponentInChildren().color = Color.blue; } protected void UnhighlightRoomAsOption() { gameObject.GetComponentInChildren().color = _roomNumberOriginalColor; } void SetPropertiesOfEntrance() { gameObject.GetComponent().color = Color.green; isEntrance = true; } void OnMouseDown() { if (!_isClickable) return; if (IsValidRoomToExplore()) { OnValidRoomClicked(); } } protected virtual void OnValidRoomClicked() { ValidRoomClicked?.Invoke(this, this); } // Check if the room is valid to be explored. If so trigger the event. private bool IsValidRoomToExplore() { if (_isExplored) { return false; } if (isEntrance) { // All entrance rooms are valid to be explored. return true; } else if (HasExploredAdjacentRooms()) { // Otherwise the room must have an adjacent room explored. return true; } return false; } bool HasExploredAdjacentRooms() { foreach (GameObject adjacentRoom in adjacentRooms) { if (adjacentRoom.GetComponent()._isExplored) { return true; } } return false; } public abstract bool TryUnlock(DicePair pair); private void HandleStateChange(GameState state) { UnhighlightRoomAsOption(); switch (state) { case GameState.PickDiceOne: case GameState.PickDiceTwo: case GameState.RollDice: _isClickable = false; break; case GameState.PickRoomTwo: case GameState.PickRoomOne: _isClickable = true; break; } } private void HandleDiceSelected(DicePair pair) { if (TryUnlock(pair) && IsValidRoomToExplore()) { HighlightRoomAsOption(); } } private void HandDiceUnselected() { UnhighlightRoomAsOption(); } }