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);
}
}