summaryrefslogtreecommitdiff
path: root/scripts/map/Map.cs
blob: f4f07837bb35ca3609271159e02e74d8f56ad112 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using Godot;

/// <summary>
/// A parte visual do mapa.
/// </summary>
public partial class Map : Node2D
{
	/// <summary>
    /// Dados do mapa.
    /// </summary>
	public MapData Map_Data { get; private set; }

	/// <summary>
    /// raio de alcance da visão do jogador.
    /// </summary>
	[Export]
	private int fovRadius = 12;

	/// <summary>
    /// Gerador de mapas.
    /// </summary>
	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<DungeonGenerator>("Generator");
		fieldOfView = GetNode<FieldOfView>("FieldOfView");
		tilesNode = GetNode<Node2D>("Tiles");
		entitiesNode = GetNode<Node2D>("Entities");
	}

	/// <summary>
    /// Coloca todos os tiles do mapa no mundo do jogo.
    /// </summary>
	private void PlaceTiles() {
		foreach (Tile tile in Map_Data.Tiles) {
			tilesNode.AddChild(tile);
		}
	}

	/// <summary>
    /// Coloca todas as entidades do mapa no mundo do jogo.
    /// </summary>
	private void PlaceEntities() {
		foreach (Entity entity in Map_Data.Entities) {
			entitiesNode.AddChild(entity);
		}
	}

	/// <summary>
    /// Cria um andar da masmorra utilizando o gerador de mapa.
    /// </summary>
    /// <param name="player">O gerador de mapas precisa do jogador.</param>
	public void Generate(Player player)
	{
		Map_Data = generator.GenerateDungeon(player);

		PlaceTiles();
		PlaceEntities();
	}

	/// <summary>
    /// Atualiza o campo de visão do mapa com base em uma coordenada.
    /// </summary>
    /// <param name="pos">Centro de visão, normalmente é a posição do jogador.</param>
	public void UpdateFOV(Vector2I pos) {
		fieldOfView.UpdateFOV(Map_Data, pos, fovRadius);
		// Esconde ou revela entidades com base no campo de visão.
		foreach (Entity entity in Map_Data.Entities) {
			entity.Visible = Map_Data.GetTile(entity.GridPosition).IsInView;
		}
	}
}