Door connections

This commit is contained in:
Marco 2025-04-16 18:18:52 +02:00
commit 700be1e207
11 changed files with 127 additions and 149 deletions

View file

@ -87,9 +87,9 @@ public partial class RogueliteRoomManager : Node2D
Vector2I origin = Vector2I.Zero;
var starterRoom = Rooms.Where(r => r.Type == RoomType.Starter).PickRandom();
SpawnRoom(starterRoom, origin);
SpawnRoom(starterRoom, origin, out var spawnedBeginRoom);
_mainPath.Add(origin);
var randomRoomsList = RegularRooms.Shuffle(DungeonLength).ToList();
var currentPos = origin;
@ -120,7 +120,7 @@ public partial class RogueliteRoomManager : Node2D
//var posWithOffset = nextPos + new Vector2I(offset, 0);
if (!SpawnRoom(roomToSpawn, nextPos))
if (!SpawnRoom(roomToSpawn, nextPos, out var spawnedRoom))
{
GD.PrintErr("Could not spawn room");
break;
@ -153,7 +153,7 @@ public partial class RogueliteRoomManager : Node2D
var bossRoom = BossRooms.PickRandom();
if (SpawnRoom(bossRoom, nextPos))
if (SpawnRoom(bossRoom, nextPos, out var spawnedBossRoom))
{
_mainPath.Add(nextPos);
@ -175,136 +175,17 @@ public partial class RogueliteRoomManager : Node2D
room.HandleDoors((doorEdge, pos) =>
{
//var neighborPos = room.GridPosition + pos;
return _connections.FirstOrDefault(x => (x.From == doorEdge && x.To == pos) || (x.From == pos && x.To == doorEdge));
return _connections.FirstOrDefault(x =>
(x.From == doorEdge && x.To == pos) || (x.From == pos && x.To == doorEdge));
//return _roomGrid.ContainsKey(neighborPos);
});
}
EmitSignalMapCreated();
//CallDeferred(MethodName.OpenStartDoorsDeferred, spawnedBeginRoom);
}
private void GenerateDungeon()
{
Vector2I origin = Vector2I.Zero;
var starterRoom = Rooms.Where(r => r.Type == RoomType.Starter).PickRandom();
SpawnRoom(starterRoom, origin);
_mainPath.Add(origin);
var currentPos = origin;
// 🔐 Reserve boss room position
var bossRoom = BossRooms.FirstOrDefault();
Vector2I? bossTargetPos = FindValidBossRoomLocation(currentPos);
if (bossRoom == null || bossTargetPos == null)
{
GD.PrintErr("Failed to place boss room!");
return;
}
// Generate path to boss room
while (currentPos != bossTargetPos.Value)
{
var nextPos = GetNextPosition(currentPos, bossTargetPos.Value);
if (!SpawnRoom(Rooms.Where(x => x.Type == RoomType.Regular).PickRandom(), nextPos)) break;
_mainPath.Add(nextPos);
_connections.Add(new RoomConnection(currentPos, nextPos));
currentPos = nextPos;
}
// Place the boss room
if (SpawnRoom(bossRoom, bossTargetPos.Value))
{
_mainPath.Add(bossTargetPos.Value);
_connections.Add(new RoomConnection(currentPos, bossTargetPos.Value));
}
}
// private void SpawnRoomsBinaryTree()
// {
// var directions = new List<Vector2I>
// {
// new Vector2I(0, -1), // North
// new Vector2I(0, 1), // South
// new Vector2I(1, 0), // East
// new Vector2I(-1, 0), // West
// };
//
// //var origin = Vector2I.Zero;
// var tileSize = new Vector2(16, 16);
// var gridRoomSizeInTiles = new Vector2(20, 10);
//
// var starterRooms = StarterRooms.ToList();
// var regularRooms = RegularRooms.ToList();
// var bossRooms = BossRooms.ToList();
// var starterRoom = starterRooms[GD.RandRange(0, starterRooms.Count - 1)];
//
// var spawnedStartRoom = SpawnRoom(starterRoom, SpawnOrigin);
//
// Vector2I currentPos = SpawnOrigin;
//
// //MarkRoom(SpawnOrigin, starterRoom.Size, starterRoom);
//
// for (int i = 0; i < DungeonLength - 2; i++)
// {
// var nextPos = GetNextPosition(currentPos);
// if (nextPos == currentPos) break;
//
// var room = regularRooms[GD.RandRange(0, regularRooms.Count - 1)];
// if (!SpawnRoom(room, nextPos)) break; // Skip on overlap
//
// _mainPath.Add(nextPos);
// _connections.Add(new RoomConnection(currentPos, nextPos));
// currentPos = nextPos;
// }
//
// // Place Boss Room
//
// var bossRoom = bossRooms[GD.RandRange(0, bossRooms.Count - 1)];
// var bossPos = GetNextPosition(currentPos);
// if (!SpawnRoom(bossRoom, bossPos)) break; // Skip on overlap
// SpawnRoom(bossRoom, bossPos);
// _mainPath.Add(bossPos);
// _connections.Add(new RoomConnection(currentPos, bossPos));
//
// // Place Shop and Secret Rooms
// //PlaceSpecialRoom(RoomType.Shop);
// //PlaceSpecialRoom(RoomType.Secret);
//
// // Optionally, add branches
// for (int i = 0; i < MaxBranches; i++)
// {
// var branchStart = _mainPath[GD.RandRange(0, _mainPath.Count -1)];
// var branchLength = GD.RandRange(1, MaxBranchLength);
// //_random.Next(1, MaxBranchLength + 1);
// var branchPos = branchStart;
//
// for (int j = 0; j < branchLength; j++)
// {
// var nextPos = GetNextPosition(branchPos);
// if (_roomGrid.ContainsKey(nextPos)) break;
//
// var room = regularRooms[GD.RandRange(0,regularRooms.Count -1)];
//
// SpawnRoom(room, nextPos);
// _connections.Add(new RoomConnection(branchPos, nextPos));
// branchPos = nextPos;
// }
// }
//
// // Spawn doors and walls
// foreach (var roomEntry in _roomGrid)
// {
// var room = roomEntry.Value;
// room.HandleDoors(pos =>
// {
// var neighborPos = room.GridPosition + pos;
// return _roomGrid.ContainsKey(neighborPos);
// });
// }
// }
private Vector2I? FindValidBossRoomLocation(Vector2I from, int maxSteps = 10)
{
var directions = new List<Vector2I> { Vector2I.Right, Vector2I.Left, Vector2I.Up, Vector2I.Down };
@ -361,10 +242,13 @@ public partial class RogueliteRoomManager : Node2D
GameManager.Instance.RebakeNavigation();
}
private bool SpawnRoom(RogueliteRoomResource room, Vector2I gridPos)
private bool SpawnRoom(RogueliteRoomResource room, Vector2I gridPos, out RogueliteRoom spawnedRoom)
{
if (!CanPlaceRoom(gridPos, room.Size))
{
spawnedRoom = null;
return false;
}
var position = gridPos * TileSize * RoomSizeInTiles;
@ -379,6 +263,7 @@ public partial class RogueliteRoomManager : Node2D
//SpawnRoom(room, origin + (room.Size * new Vector2(i, j) * tileSize));
spawnedScene.Spawn();
MarkRoom(gridPos, room.Size, spawnedScene);
spawnedRoom = spawnedScene;
return true;
}