summaryrefslogtreecommitdiff
path: root/scripts/Map/Map.cs
blob: 9117bc5850eb6c8d775969b95889f3ab10816559 (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using Godot;
using TheLegendOfGustav.Entities;
using TheLegendOfGustav.Entities.Actors;

namespace TheLegendOfGustav.Map;

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

	/// <summary>
	/// raio de alcance da visão do jogador.
	/// </summary>
	[Export]
	private int FovRadius { get; set; } = 12;

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

	/// <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)
	{
		MapData = Generator.GenerateDungeon(player);

		MapData.EntityPlaced += OnEntityPlaced;

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


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

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

	private void OnEntityPlaced(Entity entity)
	{
		EntitiesNode.AddChild(entity);
	}
}