diff --git a/Scenes/Maps/Roguelike.tscn b/Scenes/Maps/Roguelike.tscn index 30861308..2428a86c 100644 --- a/Scenes/Maps/Roguelike.tscn +++ b/Scenes/Maps/Roguelike.tscn @@ -51,6 +51,7 @@ MaxBranchLength = 2 MaxKeys = 2 MaxSecrets = 1 MaxTreasures = 1 +Seed = 2 [node name="CameraController" type="Camera2D" parent="."] process_mode = 1 diff --git a/Scripts/Controllers/RogueliteRoomManager.cs b/Scripts/Controllers/RogueliteRoomManager.cs index 25759005..2c7b3ede 100644 --- a/Scripts/Controllers/RogueliteRoomManager.cs +++ b/Scripts/Controllers/RogueliteRoomManager.cs @@ -124,6 +124,8 @@ public partial class RogueliteRoomManager : Node2D RogueliteRoom lastRoom = spawnedBeginRoom; + bool lockNext = false; + for (int i = 0; i < DungeonLength; i++) { GD.Print($"Dungeon room {i}"); @@ -138,18 +140,16 @@ public partial class RogueliteRoomManager : Node2D continue; } + if (lockNext) + { + _connections.Last().IsLocked = true; + lockNext = false; + } + lastRoom = spawnedRoom; // Spawn offshoot here - - var offshootTypeToSpawn = shuffledOffshoots[currentOffshoot % shuffledOffshoots.Count()]; - - if (offshootTypeToSpawn is RoomType.Regular) - { - currentOffshoot++; - continue; - } - + // Roll whether to go left or right, if direction is full go the other, if both are full do not spawn var directions = new List(); @@ -158,11 +158,13 @@ public partial class RogueliteRoomManager : Node2D if (lastRoom.RoomResource.DoorDirections.HasFlag(DoorDirections.West)) directions.Add(Direction.Left); directions = directions.Shuffle().ToList(); - - var randOffshootStartIndex = SpawnedRooms.Count(x => x.RoomResource.Type is RoomType.Regular && x.RoomResource.HasDoors(DoorDirections.West | DoorDirections.East)); foreach (var direction in directions) { + var randOffshootStartIndex = SpawnedRooms.Count(x => x.RoomResource.Type is RoomType.Regular && x.RoomResource.HasDoors(DoorDirections.West | DoorDirections.East)); + + var offshootTypeToSpawn = shuffledOffshoots[currentOffshoot % shuffledOffshoots.Count()]; + int roomsInOffshot = offshootTypeToSpawn is RoomType.Secret or RoomType.Shop ? 0 : GD.RandRange(0, MaxBranchLength); @@ -175,7 +177,22 @@ public partial class RogueliteRoomManager : Node2D if (res) { currentOffshoot++; - break; + // Try to spawn one the other direction too + + // If key, lock the last connection + if (offshootTypeToSpawn is RoomType.Key) + { + //lastConnection.IsLocked = true; + // Need to lock the next connection + lockNext = true; + } + + if (offshootTypeToSpawn is RoomType.Key && shuffledOffshoots[currentOffshoot % shuffledOffshoots.Count()] is RoomType.Key) + { + // Stop if next room is a key + break; + } + //break; } } @@ -195,6 +212,12 @@ public partial class RogueliteRoomManager : Node2D { GD.PrintErr($"Could not spawn boss room {bossRoom}"); } + + if (lockNext) + { + _connections.Last().IsLocked = true; + lockNext = false; + } foreach (var room in SpawnedRooms) {