From c6bbb834f7758027c0df338f1520f34fad3befea Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 9 Sep 2025 19:09:34 -0300 Subject: Organização MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/Map/Map.cs | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 scripts/Map/Map.cs (limited to 'scripts/Map/Map.cs') diff --git a/scripts/Map/Map.cs b/scripts/Map/Map.cs new file mode 100644 index 0000000..9117bc5 --- /dev/null +++ b/scripts/Map/Map.cs @@ -0,0 +1,98 @@ +using Godot; +using TheLegendOfGustav.Entities; +using TheLegendOfGustav.Entities.Actors; + +namespace TheLegendOfGustav.Map; + +/// +/// A parte visual do mapa. +/// +public partial class Map : Node2D +{ + /// + /// Dados do mapa. + /// + public MapData MapData { get; private set; } + + /// + /// raio de alcance da visão do jogador. + /// + [Export] + private int FovRadius { get; set; } = 12; + + /// + /// Gerador de mapas. + /// + private DungeonGenerator Generator { get; set; } + + FieldOfView FieldOfView { get; set; } + + private Node2D TilesNode { get; set; } + private Node2D EntitiesNode { get; set; } + + public override void _Ready() + { + base._Ready(); + // Começamos obtendo nós relevantes para o mapa. + Generator = GetNode("Generator"); + FieldOfView = GetNode("FieldOfView"); + TilesNode = GetNode("Tiles"); + EntitiesNode = GetNode("Entities"); + } + + /// + /// Cria um andar da masmorra utilizando o gerador de mapa. + /// + /// O gerador de mapas precisa do jogador. + public void Generate(Player player) + { + MapData = Generator.GenerateDungeon(player); + + MapData.EntityPlaced += OnEntityPlaced; + + PlaceTiles(); + PlaceEntities(); + } + + /// + /// Atualiza o campo de visão do mapa com base em uma coordenada. + /// + /// Centro de visão, normalmente é a posição do jogador. + public void UpdateFOV(Vector2I pos) + { + FieldOfView.UpdateFOV(MapData, pos, FovRadius); + // Esconde ou revela entidades com base no campo de visão. + foreach (Entity entity in MapData.Entities) + { + entity.Visible = MapData.GetTile(entity.GridPosition).IsInView; + } + } + + + /// + /// Coloca todos os tiles do mapa no mundo do jogo. + /// + private void PlaceTiles() + { + foreach (Tile tile in MapData.Tiles) + { + TilesNode.AddChild(tile); + } + } + + /// + /// Coloca todas as entidades do mapa no mundo do jogo. + /// + private void PlaceEntities() + { + foreach (Entity entity in MapData.Entities) + { + EntitiesNode.AddChild(entity); + } + } + + private void OnEntityPlaced(Entity entity) + { + EntitiesNode.AddChild(entity); + } +} -- cgit v1.2.3