summaryrefslogtreecommitdiff
path: root/scripts/map/DungeonGenerator.cs
diff options
context:
space:
mode:
authorMatheus <matheus.guedes.mg.m@gmail.com>2025-08-25 13:42:29 -0300
committerMatheus <matheus.guedes.mg.m@gmail.com>2025-08-25 13:42:29 -0300
commit832fe5e98842123bcc9d0c3245babf172bb10578 (patch)
tree4a787f44d5e960748e95a0f2f6b3177158e8d886 /scripts/map/DungeonGenerator.cs
parentefb712cb70ca1d0913bb69456ac2344fbaacad0e (diff)
Gerador melhorado.
Diffstat (limited to 'scripts/map/DungeonGenerator.cs')
-rw-r--r--scripts/map/DungeonGenerator.cs72
1 files changed, 35 insertions, 37 deletions
diff --git a/scripts/map/DungeonGenerator.cs b/scripts/map/DungeonGenerator.cs
index 75b375d..0d94724 100644
--- a/scripts/map/DungeonGenerator.cs
+++ b/scripts/map/DungeonGenerator.cs
@@ -1,5 +1,6 @@
using Godot;
using System;
+using System.Drawing;
using System.Linq;
using System.Net.NetworkInformation;
@@ -18,15 +19,7 @@ public partial class DungeonGenerator : Node
[Export]
private bool useSeed = true;
[Export]
- private int maxRooms = 10;
- [Export]
- private int roomMaxWidth = 10;
- [Export]
- private int roomMinWidth = 3;
- [Export]
- private int roomMaxHeight = 10;
- [Export]
- private int roomMinHeight = 2;
+ private int iterations = 3;
public override void _Ready()
{
@@ -46,11 +39,9 @@ public partial class DungeonGenerator : Node
private static void CarveRoom(MapData data, Rect2I room)
{
- Rect2I inner = room.Grow(-1);
-
- for (int y = inner.Position.Y; y <= inner.End.Y; y++)
+ for (int y = room.Position.Y; y < room.End.Y; y++)
{
- for (int x = inner.Position.X; x <= inner.End.X; x++)
+ for (int x = room.Position.X; x < room.End.X; x++)
{
CarveTile(data, new Vector2I(x, y));
}
@@ -61,35 +52,32 @@ public partial class DungeonGenerator : Node
{
MapData data = new MapData(width, height);
- Godot.Collections.Array<Rect2I> rooms = [];
-
- for (int tryroom = 0; tryroom < maxRooms; tryroom++) {
- int roomWidth = rng.RandiRange(roomMinWidth, roomMaxWidth);
- int roomHeight = rng.RandiRange(roomMinHeight, roomMaxHeight);
+ MapDivision root = new MapDivision(0, 0, width, height);
- int x = rng.RandiRange(0, data.Width - 1 - roomWidth);
- int y = rng.RandiRange(0, data.Height - 1 - roomHeight);
+ root.Split(iterations, rng);
- Rect2I newRoom = new(x, y, roomWidth, roomHeight);
+ bool first = true;
- bool intersects = false;
- foreach (Rect2I room in rooms) {
- if (newRoom.Intersects(room)) {
- intersects = true;
- break;
- }
- }
- if (intersects) {
- continue;
- }
+ TunnelDivisions(data, root);
- CarveRoom(data, newRoom);
- if (rooms.Count <= 0) {
- player.GridPosition = newRoom.GetCenter();
- } else {
- TunnelBetween(data, rooms.Last().GetCenter(), newRoom.GetCenter());
+ foreach(MapDivision division in root.GetLeaves())
+ {
+ Rect2I room = new(division.Position, division.Size);
+
+ room = room.GrowIndividual(
+ -rng.RandiRange(1, 2),
+ -rng.RandiRange(1, 2),
+ -rng.RandiRange(1, 2),
+ -rng.RandiRange(1, 2)
+ );
+
+ GD.Print($"Division {room}");
+ CarveRoom(data, room);
+ if (first)
+ {
+ first = false;
+ player.GridPosition = room.GetCenter();
}
- rooms.Add(newRoom);
}
return data;
@@ -115,4 +103,14 @@ public partial class DungeonGenerator : Node
HorizontalCorridor(data, start.Y, start.X, end.X);
VerticalCorridor(data, end.X, start.Y, end.Y);
}
+
+ private void TunnelDivisions(MapData data, MapDivision root) {
+ if (root.IsLeaf) {
+ return;
+ }
+
+ TunnelBetween(data, root.Right.Center, root.Left.Center);
+ TunnelDivisions(data, root.Left);
+ TunnelDivisions(data, root.Right);
+ }
}