Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 44 additions & 1 deletion JotunnLib/Entities/CustomRoom.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ public class CustomRoom : CustomEntity
/// </summary>
public string ThemeName { get; set; }

/// <summary>
/// Indicator if room is added from SoftReferenceableAssets.<br />
/// Used to delay mocking prefabs until DungeonGenerator loads the room.
/// </summary>
public bool SoftReference { get; set; }

/// <summary>
/// Associated <see cref="DungeonDB.RoomData"/> holding data used during generation.
/// </summary>
Expand Down Expand Up @@ -116,7 +122,44 @@ public CustomRoom(GameObject prefab, bool fixReference, RoomConfig roomConfig) :
m_enabled = Room.m_enabled,
m_theme = GetRoomTheme(ThemeName)
};
}
}

/// <summary>
/// Custom room from a SoftReference prefab with a <see cref="RoomConfig"/> attached. Using SoftReference system.<br />
/// The prefab is not loaded until the DungeonGenerator needs it during generation.
/// </summary>
/// <param name="softReferencePrefab">A <see cref="SoftReference{T}"/> to the room prefab registered in a SoftRef manifest.</param>
/// <param name="fixReference">If true references for <see cref="Entities.Mock{T}"/> objects get resolved at runtime by Jötunn.</param>
/// <param name="roomConfig">The config for this custom room.</param>
public CustomRoom(SoftReference<GameObject> softReferencePrefab, bool fixReference, RoomConfig roomConfig) : base(Assembly.GetCallingAssembly())
{
if (!softReferencePrefab.IsValid)
{
Logger.LogError($"SoftReference invalid for room prefab: {softReferencePrefab.Name}");
return;
}

AssetManager.Instance.ResolveMocksOnLoad(softReferencePrefab, DungeonManager.Instance.DungeonRoomContainer.transform, OnRoomResolve);

Name = softReferencePrefab.Name;
ThemeName = roomConfig.ThemeName;
FixReference = fixReference;
SoftReference = true;

RoomData = new DungeonDB.RoomData()
{
m_prefab = softReferencePrefab,
m_loadedRoom = null,
m_enabled = roomConfig.Enabled ?? true,
m_theme = GetRoomTheme(ThemeName)
};
}

private void OnRoomResolve(GameObject gameObject)
{
// Mock references resolved by MockResolutionContext.
// Room component lazy-loaded by vanilla's RoomData.RoomInPrefab.
}

/// <summary>
/// Helper method to determine if a prefab with a given name is a custom room created with Jötunn.
Expand Down
18 changes: 11 additions & 7 deletions JotunnLib/Managers/DungeonManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public class DungeonManager : IManager
/// <summary>
/// Container for Jötunn's DungeonRooms in the DontDestroyOnLoad scene.
/// </summary>
private GameObject DungeonRoomContainer;
internal GameObject DungeonRoomContainer;

/// <summary>
/// Hide .ctor
Expand Down Expand Up @@ -127,8 +127,12 @@ public bool AddCustomRoom(CustomRoom customRoom)
return false;
}

customRoom.Prefab.transform.SetParent(DungeonRoomContainer.transform);
customRoom.Prefab.SetActive(true);
if (!customRoom.SoftReference)
{
customRoom.Prefab.transform.SetParent(DungeonRoomContainer.transform);
customRoom.Prefab.SetActive(true);
}

Rooms.Add(customRoom.Name, customRoom);
return true;
}
Expand Down Expand Up @@ -230,7 +234,7 @@ private void GenerateHashes()

foreach (CustomRoom room in Rooms.Values)
{
int stableHashCode = room.Prefab.name.GetStableHashCode();
int stableHashCode = room.Name.GetStableHashCode();
if (hashToName.ContainsKey(stableHashCode))
{
Logger.LogWarning($"Room {room.Name} is already registered with hash {stableHashCode}");
Expand Down Expand Up @@ -272,7 +276,7 @@ private void OnDungeonDBStarted()
try
{
Logger.LogDebug($"Adding custom room {customRoom.Name} with {customRoom.ThemeName} theme");
if (customRoom.FixReference)
if (customRoom.FixReference && !customRoom.SoftReference)
{
customRoom.Prefab.FixReferences(true);
customRoom.FixReference = false;
Expand Down Expand Up @@ -314,7 +318,7 @@ private void OnDungeonGeneratorSetupAvailableRooms(DungeonGenerator self)
Logger.LogDebug($"This dungeon generator has a custom theme = {proxy.m_themeName}, adding available rooms");

var selectedRooms = Rooms.Values
.Where(r => r.Room.m_enabled)
.Where(r => r.RoomData.m_enabled)
.Where(r => r.ThemeName == proxy.m_themeName);

foreach (var room in selectedRooms)
Expand All @@ -329,7 +333,7 @@ private void OnDungeonGeneratorSetupAvailableRooms(DungeonGenerator self)
Logger.LogDebug($"Adding additional rooms of type {self.m_themes} to available rooms");

var selectedRooms = Rooms.Values
.Where(r => r.Room.m_enabled)
.Where(r => r.RoomData.m_enabled)
.Where(r => Enum.TryParse(r.ThemeName, false, out Room.Theme theme) ? theme != Room.Theme.None && self.m_themes.HasFlag(theme) : false);

foreach (var room in selectedRooms)
Expand Down
Loading