From c6bbb834f7758027c0df338f1520f34fad3befea Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 9 Sep 2025 19:09:34 -0300 Subject: Organização MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/Entities/Entity.cs | 127 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 scripts/Entities/Entity.cs (limited to 'scripts/Entities/Entity.cs') diff --git a/scripts/Entities/Entity.cs b/scripts/Entities/Entity.cs new file mode 100644 index 0000000..412bd7a --- /dev/null +++ b/scripts/Entities/Entity.cs @@ -0,0 +1,127 @@ +using Godot; +using TheLegendOfGustav.Map; +using TheLegendOfGustav.Utils; + +namespace TheLegendOfGustav.Entities; + +/// +/// Defino aqui que o jogo irá desenhar +/// atores em cima de itens e itens acima de corpos. +/// +public enum EntityType +{ + CORPSE, + ITEM, + ACTOR +}; + +/// +/// Classe para elementos móveis que o jogador pode interagir. +/// +public abstract partial class Entity : Sprite2D +{ + private Vector2I gridPosition = Vector2I.Zero; + + private EntityType type; + private bool blocksMovement; + private string displayName; + + public Entity(Vector2I initialPosition, MapData map, EntityDefinition definition) + { + GridPosition = initialPosition; + MapData = map; + Centered = false; + + SetDefinition(definition); + } + + /// + /// Usado para definir a camada da entidade no mapa. + /// + public EntityType Type + { + get => type; + set + { + type = value; + ZIndex = (int)type; + } + } + + /// + /// É conveniente ter acesso ao mapa dentro da entidade. Isto porque ela existe dentro + /// do mapa, então é necessário ter acesso à algumas informações. + /// + public MapData MapData { get; set; } + + /// + /// Posição da entidade no mapa do jogo. Diferentemente de Position, GridPosition tem como formato + /// os tiles do mapa. + /// + public Vector2I GridPosition + { + set + { + gridPosition = value; + // O sistema de coordenadas do Godot é em pixels, mas faz mais sentido para o jogo utilizar coordenadas em tiles. + // Esta propriedade converte um sistema para o outro automaticamente. + Position = Grid.GridToWorld(value); + } + get => gridPosition; + } + + /// + /// Se a entidade bloqueia movimento (não pode oculpar a mesma célula de outra entidade.) + /// + public bool BlocksMovement + { + get => blocksMovement; + protected set + { + blocksMovement = value; + } + } + + /// + /// Nome da entidade. + /// + public string DisplayName + { + get => displayName; + protected set + { + displayName = value; + } + } + + /// + /// A definição da entidade possui caracterísitcas padrões que definem + /// a entidade em questão. + /// + private EntityDefinition Definition; + + public override void _Ready() + { + base._Ready(); + // Quando a entidade for carregada completamente, atualizamos sua posição para refletir + // sua posição real. + GridPosition = Grid.WorldToGrid(Position); + } + + + + /// + /// Aplica uma definição de NPC para o ator. + /// Se o ator for um boneco de barro, este método é como um + /// sopro de vida. + /// + /// A definição do ator. + public virtual void SetDefinition(EntityDefinition definition) + { + Definition = definition; + BlocksMovement = definition.blocksMovement; + DisplayName = definition.name; + Type = definition.Type; + Texture = definition.texture; + } +} \ No newline at end of file -- cgit v1.2.3