summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/DungeonGenerator.cs19
-rw-r--r--scripts/Game.cs10
-rw-r--r--scripts/actors/Actor.cs2
-rw-r--r--scripts/map/DungeonGenerator.cs118
-rw-r--r--scripts/map/DungeonGenerator.cs.uid (renamed from scripts/DungeonGenerator.cs.uid)0
-rw-r--r--scripts/map/Map.cs (renamed from scripts/Map.cs)15
-rw-r--r--scripts/map/Map.cs.uid (renamed from scripts/Map.cs.uid)0
-rw-r--r--scripts/map/MapData.cs16
-rw-r--r--scripts/map/Tile.cs4
9 files changed, 136 insertions, 48 deletions
diff --git a/scripts/DungeonGenerator.cs b/scripts/DungeonGenerator.cs
deleted file mode 100644
index 99b8aac..0000000
--- a/scripts/DungeonGenerator.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using Godot;
-using System;
-
-public partial class DungeonGenerator : Node
-{
- private TileMapLayer map;
-
- [ExportCategory("Parametres")]
- [Export]
- private int width = 80;
- [Export]
- private int height = 60;
-
- public override void _Ready()
- {
- base._Ready();
- map = GetParent().GetNode<TileMapLayer>("Dungeon");
- }
-}
diff --git a/scripts/Game.cs b/scripts/Game.cs
index 836af84..06ef018 100644
--- a/scripts/Game.cs
+++ b/scripts/Game.cs
@@ -14,12 +14,10 @@ public partial class Game : Node {
Map Map = GetNode<Map>("Map");
- Map_Data = Map.Map_Data;
-
inputHandler = GetNode<InputHandler>("InputHandler");
actorsNode = GetNode<Node2D>("Actors");
- player = new Player(Vector2I.Zero, Map_Data, playerDefinition);
+ player = new Player(Vector2I.Zero, null, playerDefinition);
Camera2D camera = GetNode<Camera2D>("Camera2D");
RemoveChild(camera);
@@ -27,11 +25,9 @@ public partial class Game : Node {
actorsNode.AddChild(player);
- Enemy Skeleton = new Enemy(Vector2I.Zero, Map_Data, skeletonDefinition);
- actorsNode.AddChild(Skeleton);
+ Map.Generate(player);
- Map_Data.InsertActor(new Vector2I(1, 1), player);
- Map_Data.InsertActor(new Vector2I(3, 4), Skeleton);
+ Map_Data = Map.Map_Data;
}
public override void _PhysicsProcess(double delta) {
diff --git a/scripts/actors/Actor.cs b/scripts/actors/Actor.cs
index a759fef..e8d728a 100644
--- a/scripts/actors/Actor.cs
+++ b/scripts/actors/Actor.cs
@@ -5,7 +5,7 @@ public abstract partial class Actor : Sprite2D
{
private ActorDefinition definition;
private Vector2I gridPosition = Vector2I.Zero;
- public MapData Map_Data { get; private set; }
+ public MapData Map_Data { get; set; }
public Actor(Vector2I initialPosition, MapData map, ActorDefinition definition) {
GridPosition = initialPosition;
diff --git a/scripts/map/DungeonGenerator.cs b/scripts/map/DungeonGenerator.cs
new file mode 100644
index 0000000..75b375d
--- /dev/null
+++ b/scripts/map/DungeonGenerator.cs
@@ -0,0 +1,118 @@
+using Godot;
+using System;
+using System.Linq;
+using System.Net.NetworkInformation;
+
+public partial class DungeonGenerator : Node
+{
+ [ExportCategory("Dimension")]
+ [Export]
+ private int width = 80;
+ [Export]
+ private int height = 60;
+
+ [ExportCategory("RNG")]
+ private RandomNumberGenerator rng = new();
+ [Export]
+ private ulong seed;
+ [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;
+
+ public override void _Ready()
+ {
+ base._Ready();
+ if (useSeed) {
+ rng.Seed = seed;
+ }
+ }
+
+ private static void CarveTile(MapData data, Vector2I pos)
+ {
+ Tile tile = data.GetTile(pos);
+ if (tile == null) return;
+
+ tile.SetDefinition(MapData.floorDefinition);
+ }
+
+ 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 x = inner.Position.X; x <= inner.End.X; x++)
+ {
+ CarveTile(data, new Vector2I(x, y));
+ }
+ }
+ }
+
+ public MapData GenerateDungeon(Player player)
+ {
+ 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);
+
+ int x = rng.RandiRange(0, data.Width - 1 - roomWidth);
+ int y = rng.RandiRange(0, data.Height - 1 - roomHeight);
+
+ Rect2I newRoom = new(x, y, roomWidth, roomHeight);
+
+ bool intersects = false;
+ foreach (Rect2I room in rooms) {
+ if (newRoom.Intersects(room)) {
+ intersects = true;
+ break;
+ }
+ }
+ if (intersects) {
+ continue;
+ }
+
+ CarveRoom(data, newRoom);
+ if (rooms.Count <= 0) {
+ player.GridPosition = newRoom.GetCenter();
+ } else {
+ TunnelBetween(data, rooms.Last().GetCenter(), newRoom.GetCenter());
+ }
+ rooms.Add(newRoom);
+ }
+
+ return data;
+ }
+
+ private static void HorizontalCorridor(MapData data, int y, int xBegin, int xEnd) {
+ int begin = (xBegin < xEnd) ? xBegin : xEnd;
+ int end = (xEnd > xBegin) ? xEnd : xBegin;
+ for (int i = begin; i <= end; i++) {
+ CarveTile(data, new Vector2I(i, y));
+ }
+ }
+
+ private static void VerticalCorridor(MapData data, int x, int yBegin, int yEnd) {
+ int begin = (yBegin < yEnd) ? yBegin : yEnd;
+ int end = (yEnd > yBegin) ? yEnd : yBegin;
+ for (int i = begin; i <= end; i++) {
+ CarveTile(data, new Vector2I(x, i));
+ }
+ }
+
+ private void TunnelBetween(MapData data, Vector2I start, Vector2I end) {
+ HorizontalCorridor(data, start.Y, start.X, end.X);
+ VerticalCorridor(data, end.X, start.Y, end.Y);
+ }
+}
diff --git a/scripts/DungeonGenerator.cs.uid b/scripts/map/DungeonGenerator.cs.uid
index 15aeef6..15aeef6 100644
--- a/scripts/DungeonGenerator.cs.uid
+++ b/scripts/map/DungeonGenerator.cs.uid
diff --git a/scripts/Map.cs b/scripts/map/Map.cs
index 6bdd4a4..683ae45 100644
--- a/scripts/Map.cs
+++ b/scripts/map/Map.cs
@@ -5,10 +5,7 @@ public partial class Map : Node2D
{
public MapData Map_Data { get; private set; }
- [Export]
- public int Height;
- [Export]
- public int Width;
+ DungeonGenerator generator;
private void PlaceTiles() {
foreach (Tile tile in Map_Data.Tiles) {
@@ -16,11 +13,15 @@ public partial class Map : Node2D
}
}
- public override void _Ready()
+ public void Generate(Player player)
{
- base._Ready();
+ generator = GetNode<DungeonGenerator>("Generator");
- Map_Data = new MapData(Width, Height);
+ Map_Data = generator.GenerateDungeon(player);
+
+ Map_Data.InsertActor(player);
+
+ player.Map_Data = Map_Data;
PlaceTiles();
}
diff --git a/scripts/Map.cs.uid b/scripts/map/Map.cs.uid
index 7306888..7306888 100644
--- a/scripts/Map.cs.uid
+++ b/scripts/map/Map.cs.uid
diff --git a/scripts/map/MapData.cs b/scripts/map/MapData.cs
index 25d6e09..c580aa8 100644
--- a/scripts/map/MapData.cs
+++ b/scripts/map/MapData.cs
@@ -22,24 +22,16 @@ public partial class MapData : RefCounted
}
private void SetupTiles() {
- for (int i = 0; i < Width; i++)
+ for (int i = 0; i < Height; i++)
{
- for (int j = 0; j < Height; j++)
+ for (int j = 0; j < Width; j++)
{
- Tile tile;
- if (i == 0 || j == 0 || i == (Width - 1) || j == (Height - 1)) {
- tile = new Tile(new Vector2I(i, j), wallDefinition);
- } else {
- tile = new Tile(new Vector2I(i, j), floorDefinition);
- }
-
- Tiles.Add(tile);
+ Tiles.Add(new Tile(new Vector2I(j, i), wallDefinition));
}
}
}
- public void InsertActor(Vector2I pos, Actor actor) {
- actor.GridPosition = pos;
+ public void InsertActor(Actor actor) {
Actors.Add(actor);
}
diff --git a/scripts/map/Tile.cs b/scripts/map/Tile.cs
index c910b01..865cbbd 100644
--- a/scripts/map/Tile.cs
+++ b/scripts/map/Tile.cs
@@ -5,7 +5,7 @@ public partial class Tile : Sprite2D
{
private TileDefinition definition;
- public bool IsWalkable { get; set; }
+ public bool IsWalkable { get; private set; }
public Tile(Vector2I pos, TileDefinition definition)
{
@@ -17,6 +17,6 @@ public partial class Tile : Sprite2D
public void SetDefinition(TileDefinition definition) {
this.definition = definition;
Texture = definition.Texture;
- this.IsWalkable = definition.IsWalkable;
+ IsWalkable = definition.IsWalkable;
}
}