diff options
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) { |
