From 56094e89a034de744a90bbe5ce89315cf839fc75 Mon Sep 17 00:00:00 2001 From: Marco Date: Mon, 21 Apr 2025 12:12:27 +0200 Subject: [PATCH] Room spawn collision prevention --- Scenes/Maps/Roguelike.tscn | 2 +- Scripts/Controllers/RogueliteRoomManager.cs | 36 +++++++++++++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/Scenes/Maps/Roguelike.tscn b/Scenes/Maps/Roguelike.tscn index d3ba81e1..654c38ab 100644 --- a/Scenes/Maps/Roguelike.tscn +++ b/Scenes/Maps/Roguelike.tscn @@ -38,7 +38,7 @@ process_mode = 1 y_sort_enabled = true script = ExtResource("4_jtlua") Rooms = Array[Object]([ExtResource("5_gwtv6"), ExtResource("6_gwtv6"), ExtResource("7_wbqvu"), ExtResource("8_3fyis"), ExtResource("9_go1yg"), ExtResource("5_pfafs"), ExtResource("11_68lig"), ExtResource("12_83bvc"), ExtResource("13_y651a"), ExtResource("14_vhvs2"), ExtResource("15_6gk3e"), ExtResource("16_4gy5m")]) -DungeonLength = 4 +DungeonLength = 6 [node name="CameraController" type="Camera2D" parent="."] process_mode = 1 diff --git a/Scripts/Controllers/RogueliteRoomManager.cs b/Scripts/Controllers/RogueliteRoomManager.cs index 08e363ae..713c8910 100644 --- a/Scripts/Controllers/RogueliteRoomManager.cs +++ b/Scripts/Controllers/RogueliteRoomManager.cs @@ -162,17 +162,39 @@ public partial class RogueliteRoomManager : Node2D var leftPosition = spawnedRoom.GridPosition; + + + // Roll whether to go left or right, if direction is full go the other, if both are full do not spawn + for (int j = 0; j < roomsInOffshot; j++) { - var room = randomOffshootRoomsList.Shuffle().FirstOrDefault(); - - var offshootCoord = leftPosition - new Vector2I(room.Size.X, 0); - - SpawnRoom(room, offshootCoord, out var spanwedOffshooot); + var shuffledOffshootRoomsList = randomOffshootRoomsList.Shuffle().ToList(); - _connections.Add(new RoomConnection(leftPosition, offshootCoord + new Vector2I(room.Size.X -1, 0))); + foreach (var shuffledOffshoot in shuffledOffshootRoomsList) + { + var offShootCoord = leftPosition - new Vector2I(shuffledOffshoot.Size.X, 0); + + if (!CanPlaceRoom(offShootCoord, shuffledOffshoot.Size)) + { + GD.Print($"Could not place room {shuffledOffshoot.RoomName} {shuffledOffshoot.Size}"); + // Try next in list + continue; + } + + var offshootCoord = leftPosition - new Vector2I(shuffledOffshoot.Size.X, 0); + + SpawnRoom(shuffledOffshoot, offshootCoord, out var spawnedOffshoot); - leftPosition = offshootCoord; + _connections.Add(new RoomConnection(leftPosition, offshootCoord + new Vector2I(shuffledOffshoot.Size.X -1, 0))); + + leftPosition = offshootCoord; + + // Stop because we spawned the room we needed to + break; + } + + + //var room = randomOffshootRoomsList.Shuffle().FirstOrDefault(); // Get a random room with the required doors