PuzzleGame/PuzzleGameProject/Assets/Scripts/Rooms/Room.cs
2025-01-29 10:01:48 +01:00

132 lines
3.5 KiB
C#

using System;
using System.Collections;
using TMPro;
using UnityEngine;
using System.Collections.Generic;
using Unity.VisualScripting;
public enum KeyType
{
Number,
MatchingDice
}
public abstract class Room : MonoBehaviour
{
[SerializeField] private List<GameObject> adjacentRooms;
[SerializeField] private bool isEntrance;
[SerializeField] protected KeyType keyType;
public event EventHandler<Room> ValidRoomClicked;
private Color _roomNumberOriginalColor;
protected bool _isExplored = false;
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<TextMeshProUGUI>().color;
}
public abstract void SetRoomExplored();
protected virtual void InitializeRoom() {
if (isEntrance) {
SetPropertiesOfEntrance();
}
}
protected void HighlightRoomAsOption()
{
gameObject.GetComponentInChildren<TextMeshProUGUI>().color = Color.blue;
}
protected void UnhighlightRoomAsOption()
{
gameObject.GetComponentInChildren<TextMeshProUGUI>().color = _roomNumberOriginalColor;
}
void SetPropertiesOfEntrance() {
gameObject.GetComponent<SpriteRenderer>().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<Room>()._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();
}
}