diff options
| author | Matheus <matheus.guedes.mg.m@gmail.com> | 2025-08-28 00:38:48 -0300 |
|---|---|---|
| committer | Matheus <matheus.guedes.mg.m@gmail.com> | 2025-08-28 00:38:48 -0300 |
| commit | 2fb787a744d4f7a37d81233d2913a5ef39122f73 (patch) | |
| tree | f9595d6757203146aa8201a86275c2c842bae03b /scripts/map/MapDivision.cs | |
| parent | 6c7e2ac133986efa57b43df52a5498c6f7efcf75 (diff) | |
Comentarios
Diffstat (limited to 'scripts/map/MapDivision.cs')
| -rw-r--r-- | scripts/map/MapDivision.cs | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/scripts/map/MapDivision.cs b/scripts/map/MapDivision.cs index 15a6be8..3273775 100644 --- a/scripts/map/MapDivision.cs +++ b/scripts/map/MapDivision.cs @@ -1,21 +1,34 @@ -using System.Linq; -using System.Numerics; -using System.Xml.Schema; using Godot; +/// <summary> +/// Classe utilizada pelo gerador de mapas. +/// Uma divisão é uma região retangular de espaço que pode +/// conter dentro de si duas regiões menores *ou* uma sala. +/// Uma divisão é uma árvore binária que possui espaço para salas em suas folhas. +/// </summary> public partial class MapDivision : RefCounted { + /// <summary> + /// Região retangular da divisão. + /// </summary> public Vector2I Position { get; set; } public Vector2I Size { get; set; } - + public Vector2I Center { get => new(Position.X + Size.X/2, Position.Y + Size.Y/2); } + /// <summary> + /// Filhos da árvore + /// </summary> private MapDivision left; public MapDivision Left { get => this.left; } private MapDivision right; public MapDivision Right { get => this.right; } + /// <summary> + /// Se a divisão atual for uma folha. + /// As folhas representam salas. + /// </summary> public bool IsLeaf { get => left == null && right == null; } @@ -35,6 +48,10 @@ public partial class MapDivision : RefCounted { Size = new(width, height); } + /// <summary> + /// É conveniente ter acesso à todas as folhas da árvore. + /// </summary> + /// <returns>Lista com todas as folhas da árvore.</returns> public Godot.Collections.Array<MapDivision> GetLeaves() { if (IsLeaf) { Godot.Collections.Array<MapDivision> list = []; @@ -44,10 +61,20 @@ public partial class MapDivision : RefCounted { return left.GetLeaves() + right.GetLeaves(); } + /// <summary> + /// Algoritmo para gerar as divisões. + /// O mapa começa com uma única divisão que oculpa sua extensão completa. + /// Depois disso, ela se dividirá recursivamente n vezes. + /// As divisões nas folhas representam espaços onde pode gerar uma sala. + /// </summary> + /// <param name="iterations">Número de iterações</param> + /// <param name="rng">Gerador de números</param> public void Split(int iterations, RandomNumberGenerator rng) { float SplitRatio = rng.RandfRange(0.35f, 0.65f); bool horizontalSplit = Size.X <= Size.Y; - + + // Eu defini um limite mínimo de 4 de altura e 4 de largura para divisões. + if (horizontalSplit) { int leftHeight = (int) (Size.Y * SplitRatio); if (leftHeight > 4 && Size.Y - leftHeight > 4) { |
