diff options
Diffstat (limited to 'scripts/map/MapData.cs')
| -rw-r--r-- | scripts/map/MapData.cs | 272 |
1 files changed, 0 insertions, 272 deletions
diff --git a/scripts/map/MapData.cs b/scripts/map/MapData.cs deleted file mode 100644 index f3e193e..0000000 --- a/scripts/map/MapData.cs +++ /dev/null @@ -1,272 +0,0 @@ -using Godot; - -/// <summary> -/// Classe que cuida dos dados e da parte lógica do mapa. -/// O mapa é o cenário onde as ações do jogo ocorrem. -/// Mais especificamente, o mapa é um único andar da masmorra. -/// </summary> -public partial class MapData : RefCounted -{ - public static readonly TileDefinition wallDefinition = GD.Load<TileDefinition>("res://assets/definitions/tiles/wall.tres"); - public static readonly TileDefinition floorDefinition = GD.Load<TileDefinition>("res://assets/definitions/tiles/floor.tres"); - - [Signal] - public delegate void EntityPlacedEventHandler(Entity entity); - - /// <summary> - /// Largura do mapa. - /// </summary> - public int Width { get; private set; } - /// <summary> - /// Altura do mapa. - /// </summary> - public int Height { get; private set; } - - /// <summary> - /// Os tiles que compõem o mapa. - /// </summary> - public Godot.Collections.Array<Tile> Tiles { get; private set; } = []; - - /// <summary> - /// O jogador é especial e por isso o mapa faz questão de rastreá-lo. - /// </summary> - public Player Player { get; set; } - /// <summary> - /// Lista de todos os atores dentro do mapa. - /// </summary> - public Godot.Collections.Array<Entity> Entities { get; private set; } = []; - - public Godot.Collections.Array<ConsumableItem> Items { - get { - Godot.Collections.Array<ConsumableItem> list = []; - foreach (Entity entity in Entities) { - if (entity is ConsumableItem item) { - list.Add(item); - } - } - return list; - } - } - - private AStarGrid2D pathfinder; - /// <summary> - /// Objeto do Godot que utiliza do algoritmo A* para calcular - /// caminhos e rotas. - /// </summary> - public AStarGrid2D Pathfinder { get => pathfinder; } - /// <summary> - /// Peso do ator no pathfinder. - /// A IA irá evitar de passar por espaços com peso alto. - /// </summary> - private static readonly float EntityWeight = 10.0f; - - /// <summary> - /// Inicializa o pathfinder; - /// </summary> - public void SetupPathfinding() { - pathfinder = new AStarGrid2D - { - //A região é o mapa inteiro. - Region = new Rect2I(0, 0, Width, Height) - }; - - // Atualiza o pathfinder para a região definida. - pathfinder.Update(); - - // Define quais pontos do mapa são passáveis ou não. - for (int y = 0; y < Height; y++) { - for (int x = 0; x < Width; x++) { - Vector2I pos = new Vector2I(x, y); - Tile tile = GetTile(pos); - // Pontos sólidos são impossíveis de passar. - pathfinder.SetPointSolid(pos, !tile.IsWalkable); - } - } - - // Registra todos os atores em cena. - foreach (Entity entity in Entities) { - if (entity.BlocksMovement) { - RegisterBlockingEntity(entity); - } - } - - } - - /// <summary> - /// Define um peso na posição de uma entidade para que a IA evite de passar por lá. - /// Ênfase em evitar. Se o único caminho para o destino estiver bloqueado - /// por uma entidade, o jogo tentará andar mesmo assim. - /// </summary> - /// <param name="entity">A entidade em questão.</param> - public void RegisterBlockingEntity(Entity entity) { - pathfinder.SetPointWeightScale(entity.GridPosition, EntityWeight); - } - - /// <summary> - /// Remove o peso na posição de uma entidade. - /// Quando uma entidade move sua posição, devemos tirar o peso de sua posição anterior. - /// </summary> - /// <param name="entity">A entidade em questão.</param> - public void UnregisterBlockingEntity(Entity entity) { - pathfinder.SetPointWeightScale(entity.GridPosition, 0); - } - - public MapData(int width, int height, Player player) { - Width = width; - Height = height; - - Player = player; - // Como o jogador é criado antes do mapa, precisamos - // atualizá-lo com o novo mapa. - player.Map_Data = this; - InsertEntity(player); - - SetupTiles(); - } - - /// <summary> - /// Cria novos Tiles até preencher as dimensões do mapa. - /// É importante que estes tiles sejam paredes, o gerador de mapas - /// não cria paredes por conta própria. - /// </summary> - private void SetupTiles() { - for (int i = 0; i < Height; i++) - { - for (int j = 0; j < Width; j++) - { - Tiles.Add(new Tile(new Vector2I(j, i), wallDefinition)); - } - } - } - - /// <summary> - /// Registra uma entidade no mapa. A existência de uma entidade não é considerada se ela não - /// estiver registrada no mapa. - /// </summary> - /// <param name="entity">A entidade em questão</param> - public void InsertEntity(Entity entity) { - Entities.Add(entity); - } - - /// <summary> - /// Converte uma coordenada em um índice para acessar a lista de tiles. - /// </summary> - /// <param name="pos">Vetor posição</param> - /// <returns>Índice na lista de tiles. -1 se estiver fora do mapa.</returns> - private int GridToIndex(Vector2I pos) { - if (!IsInBounds(pos)) return -1; - - return pos.Y * Width + pos.X; - } - - /// <summary> - /// Se uma coordenada está dentro da área do mapa. - /// </summary> - /// <param name="pos">Vetor posição</param> - /// <returns>Se o vetor está dentro do mapa.</returns> - private bool IsInBounds(Vector2I pos) { - if (pos.X < 0 || pos.Y < 0) { - return false; - } - if (pos.X >= Width || pos.Y >= Height) { - return false; - } - - return true; - } - - /// <summary> - /// Obtém o tile na posição desejada. - /// </summary> - /// <param name="pos">Vetor posição</param> - /// <returns>O tile na posição, nulo se for fora do mapa.</returns> - public Tile GetTile(Vector2I pos) { - int index = GridToIndex(pos); - - if (index < 0) return null; - - return Tiles[index]; - } - - /// <summary> - /// Obtém o tile na posição desejada. - /// </summary> - /// <param name="x">x da coordenada</param> - /// <param name="y">y da coordenada</param> - /// <returns>O tile na posição, nulo se for fora do mapa.</returns> - public Tile GetTile(int x, int y) { - return GetTile(new Vector2I(x, y)); - } - - /// <summary> - /// Obtém a entidade na posição especificada. - /// </summary> - /// <param name="pos">Vetor posição</param> - /// <returns>A entidade na posição especificada, nulo se não houver.</returns> - public Entity GetBlockingEntityAtPosition(Vector2I pos) { - foreach (Entity entity in Entities) { - if (entity.GridPosition == pos && entity.BlocksMovement) { - return entity; - } - } - return null; - } - - /// <summary> - /// Obtém o primeiro item na posição especificada. - /// </summary> - /// <param name="pos">Posição</param> - /// <returns>O primeiro item na posição, nulo se não houver.</returns> - public ConsumableItem GetFirstItemAtPosition(Vector2I pos) { - foreach (ConsumableItem item in Items) { - if (item.GridPosition == pos) { - return item; - } - } - - return null; - } - - /// <summary> - /// Remove uma entidade do mapa sem dar free. - /// </summary> - /// <param name="entity">A entidade para remover</param> - public void RemoveEntity(Entity entity) { - // Eu removo a entidade do nó de entidades. - entity.GetParent().RemoveChild(entity); - // Eu removo a entidade da lista de entidades do mapa. - Entities.Remove(entity); - } - - /// <summary> - /// Obtém todas as entidades na posição especificada. - /// É possível haver mais de uma entidade na mesma posição se uma delas não bloquear movimento. - /// </summary> - /// <param name="pos">Vetor posição</param> - /// <returns>Lista com todas as entidades na posição especificada.</returns> - public Godot.Collections.Array<Entity> GetEntitiesAtPosition(Vector2I pos) { - Godot.Collections.Array<Entity> ZOfZero = []; - Godot.Collections.Array<Entity> ZOfOne = []; - Godot.Collections.Array<Entity> ZOfTwo = []; - - // Pego todos os atores - foreach (Entity entity in Entities) { - if (entity.GridPosition == pos) { - switch (entity.ZIndex) { - case 0: - ZOfZero.Add(entity); - break; - case 1: - ZOfOne.Add(entity); - break; - case 2: - ZOfTwo.Add(entity); - break; - } - } - } - - // Retorno os atores ordenados por ZIndex. - return ZOfZero + ZOfOne + ZOfTwo; - } -} |
