Fisher-Yates shuffle

This commit is contained in:
Marco 2025-04-15 15:19:36 +02:00
commit aa838aeda1
6 changed files with 176 additions and 7 deletions

View file

@ -2,6 +2,7 @@
using System.Linq;
using Cirno.Scripts.Enums;
using Cirno.Scripts.Resources.Roguelite;
using Cirno.Scripts.Utils;
using Godot;
using Godot.Collections;
@ -79,6 +80,8 @@ public partial class RogueliteRoomManager : Node2D
var starterRoom = Rooms.Where(r => r.Type == RoomType.Starter).PickRandom();
SpawnRoom(starterRoom, origin);
_mainPath.Add(origin);
var randomRoomsList = RegularRooms.Shuffle(DungeonLength).ToList();
var currentPos = origin;
Vector2I nextPos;
@ -87,13 +90,13 @@ public partial class RogueliteRoomManager : Node2D
{
nextPos = currentPos + new Vector2I(0, 1);
var roomToSpawn = Rooms.Where(x => x.Type == RoomType.Regular).PickRandom();
//var roomToSpawn = Rooms.Where(x => x.Type == RoomType.Regular).PickRandom();
var roomToSpawn = randomRoomsList[i];
if (!SpawnRoom(roomToSpawn, nextPos)) break;
_mainPath.Add(nextPos);
if (roomToSpawn.Size.Y > 1)
{
nextPos += new Vector2I(0, roomToSpawn.Size.Y - 1);
@ -328,7 +331,7 @@ public partial class RogueliteRoomManager : Node2D
// for reference
//SpawnRoom(room, origin + (room.Size * new Vector2(i, j) * tileSize));
spawnedScene.Spawn();
MarkRoom(SpawnOrigin, room.Size, spawnedScene);
MarkRoom(gridPos, room.Size, spawnedScene);
return true;
}