Implemented room blocking in game.

This commit is contained in:
Max 2025-02-24 13:59:06 +01:00
parent 18908b2ae7
commit 1e95378bb1
24 changed files with 25172 additions and 65 deletions

View file

@ -1,4 +1,4 @@
namespace DungeonMapGenerator namespace DungeonMapGenerator.Rooms
{ {
public class BossRoom : MonsterRoom public class BossRoom : MonsterRoom
{ {

View file

@ -1,6 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace DungeonMapGenerator namespace DungeonMapGenerator.Rooms
{ {
public class MonsterRoom : Room public class MonsterRoom : Room
{ {

View file

@ -4,7 +4,7 @@ using System.Linq;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Converters; using Newtonsoft.Json.Converters;
namespace DungeonMapGenerator namespace DungeonMapGenerator.Rooms
{ {
public enum RoomSide public enum RoomSide
{ {
@ -71,6 +71,11 @@ namespace DungeonMapGenerator
_loot.Add(loot); _loot.Add(loot);
} }
public List<LootType> GetLoot()
{
return _loot;
}
public HashSet<int> GetAdjacentRoomIds() public HashSet<int> GetAdjacentRoomIds()
{ {
return new HashSet<int>(_adjacentRoomIds); return new HashSet<int>(_adjacentRoomIds);

View file

@ -56,7 +56,7 @@ MonoBehaviour:
litRoom: {fileID: 7153068010997067763, guid: f64f7ca52dead154780dd3ce1ef99a90, type: 3} litRoom: {fileID: 7153068010997067763, guid: f64f7ca52dead154780dd3ce1ef99a90, type: 3}
AdjacentRooms: [] AdjacentRooms: []
IsEntrance: 0 IsEntrance: 0
roomReward: {fileID: 0} roomRewards: {fileID: 0}
numberTextObject: {fileID: 8119019481281764985} numberTextObject: {fileID: 8119019481281764985}
--- !u!114 &6904757263627452010 --- !u!114 &6904757263627452010
MonoBehaviour: MonoBehaviour:
@ -70,9 +70,9 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 686125cb666fff047a08043aa1feb0a8, type: 3} m_Script: {fileID: 11500000, guid: 686125cb666fff047a08043aa1feb0a8, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
diamonds: 0 Diamonds: 0
damage: 0 Damage: 0
chest: 0 Chest: 0
--- !u!212 &1770509300873928573 --- !u!212 &1770509300873928573
SpriteRenderer: SpriteRenderer:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: bc314d02d714775469a85c4b40cca0ac
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 62ea064c9ca6e9644a9a6d448767cf86
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -14,7 +14,7 @@ public class ChestRewardSelection : MonoBehaviour
private void OnEnable() private void OnEnable()
{ {
RoomReward.ChestRewarded += HandChestRewarded; RoomRewards.ChestRewarded += HandChestRewarded;
diamondAndLifeButton.onClick.AddListener(HandleDiamondAndLifeSelected); diamondAndLifeButton.onClick.AddListener(HandleDiamondAndLifeSelected);
torchButton.onClick.AddListener(HandleTorchSelected); torchButton.onClick.AddListener(HandleTorchSelected);
blackDiceButton.onClick.AddListener(HandleBlackDiceSelected); blackDiceButton.onClick.AddListener(HandleBlackDiceSelected);

View file

@ -2,7 +2,10 @@ using UnityEngine;
public static class ColorHelper public static class ColorHelper
{ {
public static Color OkayGreen = new Color(12f, 202f, 0f); public static readonly Color OkayGreen = new Color(12f, 202f, 0f);
public const float TEXT_FADED_OPACITY = .5f;
public const float TEXT_FULL_OPACITY = 1f;
public static Color AddColorTint(Color originalColor, Color tintColor, float tintIntensity) public static Color AddColorTint(Color originalColor, Color tintColor, float tintIntensity)
{ {

View file

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using DungeonMapGenerator; using DungeonMapGenerator;
using DungeonMapGenerator.Rooms;
using Unity.VisualScripting; using Unity.VisualScripting;
using UnityEditor; using UnityEditor;
using Object = UnityEngine.Object; using Object = UnityEngine.Object;
@ -26,24 +27,31 @@ namespace DungeonGenerator
GameObject monsterRoomPrefab = Resources.Load<GameObject>(MONSTER_ROOM); GameObject monsterRoomPrefab = Resources.Load<GameObject>(MONSTER_ROOM);
GameObject normalRoomPrefab = Resources.Load<GameObject>(NORMAL_ROOM); GameObject normalRoomPrefab = Resources.Load<GameObject>(NORMAL_ROOM);
Dictionary<GameObject, DungeonMapGenerator.Rooms.Room> gameObjectRoomPairs = new Dictionary<GameObject, DungeonMapGenerator.Rooms.Room>();
GameObject bossRoomGO = PrefabUtility.InstantiatePrefab(bossRoomPrefab, gameObject.transform) as GameObject; GameObject bossRoomGO = PrefabUtility.InstantiatePrefab(bossRoomPrefab, gameObject.transform) as GameObject;
bossRoomGO.transform.position = ConvertToUnityPosition(map.GetBossRoom().GetCenterOfRoom(), map.Width, map.Height); bossRoomGO.transform.position = ConvertToUnityPosition(map.GetBossRoom().GetCenterOfRoom(), map.Width, map.Height);
AddLockToRoomObject(bossRoomGO, map.GetBossRoom().Lock.GetLock()); BossRoom bossRoom = map.GetBossRoom();
foreach (DungeonMapGenerator.Lock extraLock in map.GetBossRoom().ExtraLocks) gameObjectRoomPairs[bossRoomGO] = bossRoom;
AddLockToRoomObject(bossRoomGO, bossRoom.Lock.GetLock());
foreach (DungeonMapGenerator.Lock extraLock in bossRoom.ExtraLocks)
{ {
AddLockToRoomObject(bossRoomGO, extraLock.GetLock()); AddLockToRoomObject(bossRoomGO, extraLock.GetLock());
} }
_roomIdToGameObject[map.GetBossRoom().Id] = bossRoomGO; AddRewardsToRoomObject(bossRoomGO, bossRoom.GetLoot());
_roomIdToGameObject[bossRoom.Id] = bossRoomGO;
foreach (var monsterRoom in map.GetMonsterRooms()) foreach (var monsterRoom in map.GetMonsterRooms())
{ {
GameObject monsterRoomGO = PrefabUtility.InstantiatePrefab(monsterRoomPrefab, gameObject.transform) as GameObject; GameObject monsterRoomGO = PrefabUtility.InstantiatePrefab(monsterRoomPrefab, gameObject.transform) as GameObject;
monsterRoomGO.transform.position = ConvertToUnityPosition(monsterRoom.GetCenterOfRoom(), map.Width, map.Height); monsterRoomGO.transform.position = ConvertToUnityPosition(monsterRoom.GetCenterOfRoom(), map.Width, map.Height);
gameObjectRoomPairs[monsterRoomGO] = monsterRoom;
AddLockToRoomObject(monsterRoomGO, monsterRoom.Lock.GetLock()); AddLockToRoomObject(monsterRoomGO, monsterRoom.Lock.GetLock());
foreach (DungeonMapGenerator.Lock extraLock in monsterRoom.ExtraLocks) foreach (DungeonMapGenerator.Lock extraLock in monsterRoom.ExtraLocks)
{ {
AddLockToRoomObject(monsterRoomGO, extraLock.GetLock()); AddLockToRoomObject(monsterRoomGO, extraLock.GetLock());
} }
AddRewardsToRoomObject(monsterRoomGO, monsterRoom.GetLoot());
_roomIdToGameObject[monsterRoom.Id] = monsterRoomGO; _roomIdToGameObject[monsterRoom.Id] = monsterRoomGO;
} }
@ -51,7 +59,9 @@ namespace DungeonGenerator
{ {
GameObject normalRoomGO = PrefabUtility.InstantiatePrefab(normalRoomPrefab, gameObject.transform) as GameObject; GameObject normalRoomGO = PrefabUtility.InstantiatePrefab(normalRoomPrefab, gameObject.transform) as GameObject;
normalRoomGO.transform.position = ConvertToUnityPosition(normalRoom.GetCenterOfRoom(), map.Width, map.Height); normalRoomGO.transform.position = ConvertToUnityPosition(normalRoom.GetCenterOfRoom(), map.Width, map.Height);
gameObjectRoomPairs[normalRoomGO] = normalRoom;
AddLockToRoomObject(normalRoomGO, normalRoom.Lock.GetLock()); AddLockToRoomObject(normalRoomGO, normalRoom.Lock.GetLock());
AddRewardsToRoomObject(normalRoomGO, normalRoom.GetLoot());
_roomIdToGameObject[normalRoom.Id] = normalRoomGO; _roomIdToGameObject[normalRoom.Id] = normalRoomGO;
} }
@ -59,8 +69,10 @@ namespace DungeonGenerator
{ {
GameObject entranceRoomGO = PrefabUtility.InstantiatePrefab(normalRoomPrefab, gameObject.transform) as GameObject; GameObject entranceRoomGO = PrefabUtility.InstantiatePrefab(normalRoomPrefab, gameObject.transform) as GameObject;
entranceRoomGO.transform.position = ConvertToUnityPosition(entranceRoom.GetCenterOfRoom(), map.Width, map.Height); entranceRoomGO.transform.position = ConvertToUnityPosition(entranceRoom.GetCenterOfRoom(), map.Width, map.Height);
gameObjectRoomPairs[entranceRoomGO] = entranceRoom;
entranceRoomGO.GetComponent<Room>().IsEntrance = true; entranceRoomGO.GetComponent<Room>().IsEntrance = true;
AddLockToRoomObject(entranceRoomGO, entranceRoom.Lock.GetLock()); AddLockToRoomObject(entranceRoomGO, entranceRoom.Lock.GetLock());
AddRewardsToRoomObject(entranceRoomGO, entranceRoom.GetLoot());
_roomIdToGameObject[entranceRoom.Id] = entranceRoomGO; _roomIdToGameObject[entranceRoom.Id] = entranceRoomGO;
} }
@ -73,6 +85,14 @@ namespace DungeonGenerator
roomComponent.AdjacentRooms.Add(_roomIdToGameObject[id]); roomComponent.AdjacentRooms.Add(_roomIdToGameObject[id]);
} }
} }
foreach (var kvp in gameObjectRoomPairs)
{
if (kvp.Value.GetType() == typeof(DungeonMapGenerator.Rooms.MonsterRoom) || kvp.Value.GetType() == typeof(DungeonMapGenerator.Rooms.BossRoom))
{
AddBlockingRooms(kvp.Key.GetComponent<Room>(), (DungeonMapGenerator.Rooms.MonsterRoom)kvp.Value);
}
}
} }
private Vector3 ConvertToUnityPosition(Point dungeonPosition, int mapWidth, int mapHeight) private Vector3 ConvertToUnityPosition(Point dungeonPosition, int mapWidth, int mapHeight)
@ -112,5 +132,34 @@ namespace DungeonGenerator
break; break;
} }
} }
private void AddRewardsToRoomObject(GameObject roomGO, List<LootType> loot)
{
RoomRewards rewards = roomGO.AddComponent<RoomRewards>();
foreach (LootType type in loot)
{
switch (type)
{
case LootType.Chest:
rewards.Chest = true;
break;
case LootType.Diamond:
rewards.Diamonds++;
break;
case LootType.Damage:
rewards.Damage++;
break;
}
}
}
private void AddBlockingRooms(Room roomComponent, DungeonMapGenerator.Rooms.MonsterRoom room)
{
foreach (var blockingRoomId in room.GetBlockingRoomIds())
{
roomComponent.AddBlockingRoom(_roomIdToGameObject[blockingRoomId].GetComponent<Room>());
}
}
} }
} }

View file

@ -63,7 +63,7 @@ public class GameManager : MonoBehaviour
_dicePairTwo = new DicePair(); _dicePairTwo = new DicePair();
} }
void HandleRoomExploredByDice(object sender, Room room) { void HandleRoomExploredByDice(Room room) {
if (State == GameState.PickRoomOne) if (State == GameState.PickRoomOne)
{ {
ChangeState(GameState.PickDiceTwo); ChangeState(GameState.PickDiceTwo);

View file

@ -19,10 +19,7 @@ public class EmptyRoom : Room
public override void SetRoomExplored() { public override void SetRoomExplored() {
_isExplored = true; _isExplored = true;
UnhighlightRoomAsOption(); UnhighlightRoomAsOption();
if (roomReward != null) TriggerRoomRewards();
{
roomReward.TriggerGetReward();
}
SetExploredGUI(); SetExploredGUI();
} }

View file

@ -2,13 +2,38 @@ using System;
using Unity.VisualScripting; using Unity.VisualScripting;
using UnityEngine; using UnityEngine;
using System.Collections.Generic; using System.Collections.Generic;
using TMPro;
public abstract class Lock : MonoBehaviour public abstract class Lock : MonoBehaviour
{ {
// Room that must be explored before lock can be unlocked. // Room that must be explored before lock can be unlocked.
[SerializeField] protected Room blockingRoom; [SerializeField] protected Room blockingRoom;
private TextMeshProUGUI _lockText;
public event Action Unlocked; public event Action Unlocked;
public abstract override bool Equals(object other);
public override int GetHashCode() => GetHashCode();
public void OnEnable()
{
if (blockingRoom != null)
{
blockingRoom.ThisRoomExploredByTorch += HandleBlockingRoomExplored;
blockingRoom.RoomExploredByDice += HandleBlockingRoomExplored;
}
}
public void OnDisable()
{
if (blockingRoom != null)
{
blockingRoom.ThisRoomExploredByTorch -= HandleBlockingRoomExplored;
blockingRoom.RoomExploredByDice -= HandleBlockingRoomExplored;
}
}
public virtual bool CheckIfKeyFits(DicePair dicePair) public virtual bool CheckIfKeyFits(DicePair dicePair)
{ {
if (blockingRoom == null || blockingRoom.GetRoomExplored()) if (blockingRoom == null || blockingRoom.GetRoomExplored())
@ -27,8 +52,35 @@ public abstract class Lock : MonoBehaviour
} }
} }
public void SetBlockingRoom(Room room)
{
blockingRoom = room;
}
public virtual void AssignGUI(TextMeshProUGUI text)
{
_lockText = text;
if (blockingRoom != null)
{
_lockText.alpha = ColorHelper.TEXT_FADED_OPACITY;
}
}
private void HandleBlockingRoomExplored(Room room)
{
SetBlockingRoomExploredGUI();
}
protected virtual void OnUnlock() protected virtual void OnUnlock()
{ {
Unlocked?.Invoke(); Unlocked?.Invoke();
} }
private void SetBlockingRoomExploredGUI()
{
if (_lockText != null)
{
_lockText.alpha = ColorHelper.TEXT_FULL_OPACITY;
}
}
} }

View file

@ -1,8 +1,24 @@
using TMPro;
using Unity.VisualScripting; using Unity.VisualScripting;
using UnityEngine; using UnityEngine;
public class MatchingDiceLock : Lock public class MatchingDiceLock : Lock
{ {
public override bool Equals(object obj)
{
if (obj is MatchingDiceLock otherLock)
{
// Add meaningful comparison logic if there are properties that define equality.
return true; // Placeholder, update as needed.
}
return false;
}
public override int GetHashCode()
{
return GetType().GetHashCode(); // Update if there are meaningful properties to hash.
}
public override bool CheckIfKeyFits(DicePair dicePair) public override bool CheckIfKeyFits(DicePair dicePair)
{ {
if (base.CheckIfKeyFits(dicePair) && dicePair.CheckIfResultsMatch()) if (base.CheckIfKeyFits(dicePair) && dicePair.CheckIfResultsMatch())
@ -12,4 +28,10 @@ public class MatchingDiceLock : Lock
return false; return false;
} }
public override void AssignGUI(TextMeshProUGUI text)
{
base.AssignGUI(text);
text.SetText("=");
}
} }

View file

@ -1,9 +1,24 @@
using TMPro;
using UnityEngine; using UnityEngine;
public class NumberLock : Lock public class NumberLock : Lock
{ {
[SerializeField] private int number; [SerializeField] private int number;
public override bool Equals(object obj)
{
if (obj is NumberLock otherLock)
{
return otherLock.GetNumber() == number;
}
return false;
}
public override int GetHashCode()
{
return number.GetHashCode();
}
public override bool CheckIfKeyFits(DicePair dicePair) public override bool CheckIfKeyFits(DicePair dicePair)
{ {
if (base.CheckIfKeyFits(dicePair) && dicePair.Sum() == number) if (base.CheckIfKeyFits(dicePair) && dicePair.Sum() == number)
@ -23,4 +38,10 @@ public class NumberLock : Lock
{ {
return number; return number;
} }
public override void AssignGUI(TextMeshProUGUI text)
{
base.AssignGUI(text);
text.SetText(number.ToString());
}
} }

View file

@ -22,7 +22,7 @@ public class MonsterRoom : Room
for (int i = 1; i < _locks.Length; i++) for (int i = 1; i < _locks.Length; i++)
{ {
lockToDuplicate = DuplicateToTheLeft(lockToDuplicate, ((RectTransform)lockToDuplicate.transform).rect.width); lockToDuplicate = DuplicateToTheLeft(lockToDuplicate, ((RectTransform)lockToDuplicate.transform).rect.width);
lockToDuplicate.GetComponent<TextMeshProUGUI>().text = ((NumberLock)_locks[i]).GetNumber().ToString(); SetLockGUI(lockToDuplicate.GetComponent<TextMeshProUGUI>(), _locks[i]);
} }
_healthTicks = new GameObject[_health]; _healthTicks = new GameObject[_health];
@ -54,10 +54,7 @@ public class MonsterRoom : Room
{ {
_isExplored = true; _isExplored = true;
UnhighlightRoomAsOption(); UnhighlightRoomAsOption();
if (roomReward != null) TriggerRoomRewards();
{
roomReward.TriggerGetReward();
}
SetExploredGUI(); SetExploredGUI();
} }

View file

@ -3,6 +3,7 @@ using System.Collections;
using TMPro; using TMPro;
using UnityEngine; using UnityEngine;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using Unity.VisualScripting; using Unity.VisualScripting;
using UnityEngine.Serialization; using UnityEngine.Serialization;
@ -14,9 +15,10 @@ public abstract class Room : MonoBehaviour
[SerializeField] private Sprite litRoom; [SerializeField] private Sprite litRoom;
[FormerlySerializedAs("adjacentRooms")] [SerializeField] public List<GameObject> AdjacentRooms; [FormerlySerializedAs("adjacentRooms")] [SerializeField] public List<GameObject> AdjacentRooms;
public bool IsEntrance; public bool IsEntrance;
[SerializeField] protected RoomReward roomReward; [SerializeField] protected RoomRewards roomRewards;
public event EventHandler<Room> RoomExploredByDice; public event Action<Room> RoomExploredByDice;
public event Action<Room> ThisRoomExploredByTorch;
public static event Action<Room> RoomExploredByTorch; public static event Action<Room> RoomExploredByTorch;
private DicePair _diceSelected; private DicePair _diceSelected;
@ -54,6 +56,31 @@ public abstract class Room : MonoBehaviour
gameObject.GetComponent<SpriteRenderer>().sprite = litRoom; gameObject.GetComponent<SpriteRenderer>().sprite = litRoom;
} }
public Lock[] GetLocks()
{
if (_locks != null)
{
return _locks;
}
return gameObject.GetComponents<Lock>();
}
public void AddBlockingRoom(Room blockingRoom)
{
Lock[] locks = gameObject.GetComponents<Lock>();
foreach (Lock _lock in locks)
{
foreach (Lock blockingRoomLocks in blockingRoom.GetLocks())
{
if (blockingRoomLocks.Equals(_lock))
{
_lock.SetBlockingRoom(blockingRoom);
}
}
}
}
public abstract void SetRoomExplored(); public abstract void SetRoomExplored();
protected void SetExploredGUI() protected void SetExploredGUI()
@ -69,6 +96,7 @@ public abstract class Room : MonoBehaviour
SetPropertiesOfEntrance(); SetPropertiesOfEntrance();
} }
_locks = gameObject.GetComponents<Lock>(); _locks = gameObject.GetComponents<Lock>();
roomRewards = gameObject.GetComponent<RoomRewards>();
} }
protected void HighlightRoomAsOption() protected void HighlightRoomAsOption()
@ -115,24 +143,23 @@ public abstract class Room : MonoBehaviour
} }
protected virtual void OnRoomExploredByDice() { protected virtual void OnRoomExploredByDice() {
RoomExploredByDice?.Invoke(this, this); RoomExploredByDice?.Invoke(this);
} }
protected void SetLockGUI(TextMeshProUGUI text, Lock _lock) protected void SetLockGUI(TextMeshProUGUI text, Lock _lock)
{ {
if (_lock is NumberLock ) _lock.AssignGUI(text);
{
text.SetText(((NumberLock)_locks[0]).GetNumber().ToString());
} }
else if (_lock is MatchingDiceLock)
protected void TriggerRoomRewards()
{ {
text.SetText("="); roomRewards.TriggerGetReward();
}
} }
private void OnRoomExploredByTorch() private void OnRoomExploredByTorch()
{ {
RoomExploredByTorch?.Invoke(this); RoomExploredByTorch?.Invoke(this);
ThisRoomExploredByTorch?.Invoke(this);
} }
// Check if the room is valid to be explored. If so trigger the event. // Check if the room is valid to be explored. If so trigger the event.

View file

@ -1,31 +0,0 @@
using System;
using UnityEngine;
public class RoomReward : MonoBehaviour
{
public static event Action<int> DiamondsRewarded;
public static event Action ChestRewarded;
public static event Action<int> DamageDealt;
[SerializeField] private int diamonds;
[SerializeField] private int damage;
[SerializeField] private bool chest;
public void TriggerGetReward()
{
if (diamonds > 0)
{
DiamondsRewarded?.Invoke(diamonds);
}
if (chest)
{
ChestRewarded?.Invoke();
}
if (damage > 0)
{
DamageDealt?.Invoke(damage);
}
}
}

View file

@ -0,0 +1,31 @@
using System;
using UnityEngine;
public class RoomRewards : MonoBehaviour
{
public static event Action<int> DiamondsRewarded;
public static event Action ChestRewarded;
public static event Action<int> DamageDealt;
[SerializeField] public int Diamonds = 0;
[SerializeField] public int Damage = 0;
[SerializeField] public bool Chest = false;
public void TriggerGetReward()
{
if (Diamonds > 0)
{
DiamondsRewarded?.Invoke(Diamonds);
}
if (Chest)
{
ChestRewarded?.Invoke();
}
if (Damage > 0)
{
DamageDealt?.Invoke(Damage);
}
}
}

View file

@ -7,7 +7,7 @@ public class UIManager : MonoBehaviour
[SerializeField] private GameObject chestRewardSelectionUI; [SerializeField] private GameObject chestRewardSelectionUI;
private void OnEnable() private void OnEnable()
{ {
RoomReward.ChestRewarded += HandleChestRewarded; RoomRewards.ChestRewarded += HandleChestRewarded;
} }
private void HandleChestRewarded() private void HandleChestRewarded()