using System; using System.Collections; using TMPro; using UnityEngine; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine.Serialization; public abstract class Room : MonoBehaviour { [FormerlySerializedAs("adjacentRooms")] [SerializeField] public List AdjacentRooms; public bool IsEntrance; [SerializeField] protected RoomReward roomReward; public event EventHandler RoomExploredByDice; public static event Action RoomExploredByTorch; private Color _roomNumberOriginalColor; private DicePair _diceSelected; protected bool _isExplored = false; protected Lock[] _locks; private bool _usingTorchAbility = false; private void OnEnable() { GameManager.StateChanged += HandleStateChange; GameManager.DiceSelected += HandleDiceSelected; GameManager.DiceUnselected += HandDiceUnselected; TorchAbility.TorchAbilityUsed += HandleTorchAbilityUsed; RoomExploredByTorch += HandleRoomExploredByTorch; } private void OnDisable() { GameManager.StateChanged -= HandleStateChange; GameManager.DiceSelected -= HandleDiceSelected; GameManager.DiceUnselected -= HandDiceUnselected; TorchAbility.TorchAbilityUsed -= HandleTorchAbilityUsed; } // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { InitializeRoom(); _roomNumberOriginalColor = gameObject.GetComponentInChildren().color; } public bool GetRoomExplored() { return _isExplored; } 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 (!CheckIfValidRoomToExplore()) return; switch (GameManager.State) { case GameState.PickRoomOne: case GameState.PickRoomTwo: if (TryUnlock(_diceSelected)) { OnRoomExploredByDice(); SetRoomExplored(); } else if(_usingTorchAbility && CheckIfValidRoomToExplore()) { SetRoomExplored(); OnRoomExploredByTorch(); } break; default: if (_usingTorchAbility && CheckIfValidRoomToExplore()) { SetRoomExplored(); OnRoomExploredByTorch(); } break; } } protected virtual void OnRoomExploredByDice() { RoomExploredByDice?.Invoke(this, this); } private void OnRoomExploredByTorch() { RoomExploredByTorch?.Invoke(this); } // Check if the room is valid to be explored. If so trigger the event. private bool CheckIfValidRoomToExplore() { 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: _diceSelected = null; break; } } private void HandleDiceSelected(DicePair pair) { _diceSelected = pair; if (TryUnlock(pair) && CheckIfValidRoomToExplore()) { HighlightRoomAsOption(); } } private void HandDiceUnselected() { _diceSelected = null; UnhighlightRoomAsOption(); } private void HandleTorchAbilityUsed() { if (CheckIfValidRoomToExplore()) { _usingTorchAbility = true; HighlightRoomAsOption(); } } private void HandleRoomExploredByTorch(Room roomExploredByTorch) { _usingTorchAbility = false; if (_diceSelected != null && TryUnlock(_diceSelected)) { return; } UnhighlightRoomAsOption(); } }