using System; using System.Collections; using TMPro; using UnityEngine; using System.Collections.Generic; enum KeyType { Number, MatchinDice } public class Room : MonoBehaviour { [SerializeField] private GameObject numberTextObject; [SerializeField] private List adjacentRooms; [SerializeField] private bool isEntrance; [SerializeField] private KeyType keyType; [SerializeField] private int number; public event EventHandler ValidRoomClicked; bool _isExplored = false; private bool _isClickable = true; private Color _roomNumberOriginalColor; // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { GameManager.StateChanged += HandleStateChange; if (isEntrance) { SetPropertiesOfEntrance(); } TextMeshProUGUI numberText = numberTextObject.GetComponent(); _roomNumberOriginalColor = gameObject.GetComponentInChildren().color; if (keyType == KeyType.Number) { numberText.SetText(number.ToString()); } else if (keyType == KeyType.MatchinDice) { numberText.SetText("="); } } private void OnEnable() { } public void SetRoomExplored() { _isExplored = true; UnhighlightRoomAsOption(); gameObject.GetComponent().color = ColorHelper.AddColorTint(gameObject.GetComponent().color, Color.grey, 0.5f); } public void HighlightRoomAsOption() { gameObject.GetComponentInChildren().color = Color.blue; } public 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. public 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 bool TryUnlock(DicePair pair) { switch (keyType) { case KeyType.Number: if (number == pair.Sum()) { return true; } return false; case KeyType.MatchinDice: if (pair.DoResultsMatch()) { return true; } return false; } return false; } private void HandleStateChange(GameState state) { switch (state) { case GameState.PickDiceOne: case GameState.PickDiceTwo: case GameState.RollDice: _isClickable = false; break; case GameState.PickRoomTwo: case GameState.PickRoomOne: _isClickable = true; break; } } }