using Godot;
///
/// A parte visual do mapa.
///
public partial class Map : Node2D
{
///
/// Dados do mapa.
///
public MapData Map_Data { get; private set; }
///
/// raio de alcance da visão do jogador.
///
[Export]
private int fovRadius = 12;
///
/// Gerador de mapas.
///
private DungeonGenerator generator;
FieldOfView fieldOfView;
private Node2D tilesNode;
private Node2D entitiesNode;
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");
}
///
/// Coloca todos os tiles do mapa no mundo do jogo.
///
private void PlaceTiles() {
foreach (Tile tile in Map_Data.Tiles) {
tilesNode.AddChild(tile);
}
}
///
/// Coloca todos os tiles do mapa no mundo do jogo.
///
private void PlaceEntities() {
foreach (Actor actor in Map_Data.Entities) {
entitiesNode.AddChild(actor);
}
}
///
/// Cria um andar da masmorra utilizando o gerador de mapa.
///
/// O gerador de mapas precisa do jogador.
public void Generate(Player player)
{
Map_Data = generator.GenerateDungeon(player);
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(Map_Data, pos, fovRadius);
// Esconde ou revela atores com base no campo de visão.
foreach (Actor actor in Map_Data.Entities) {
actor.Visible = Map_Data.GetTile(actor.GridPosition).IsInView;
}
}
}