diff options
Diffstat (limited to 'scripts/entities/actors')
| -rw-r--r-- | scripts/entities/actors/AI/HostileEnemyAI.cs | 4 | ||||
| -rw-r--r-- | scripts/entities/actors/Actor.cs | 70 | ||||
| -rw-r--r-- | scripts/entities/actors/ActorDefinition.cs | 11 | ||||
| -rw-r--r-- | scripts/entities/actors/Enemy.cs | 6 | ||||
| -rw-r--r-- | scripts/entities/actors/actions/BumpAction.cs | 2 | ||||
| -rw-r--r-- | scripts/entities/actors/actions/DirectionalAction.cs | 4 | ||||
| -rw-r--r-- | scripts/entities/actors/actions/MeleeAction.cs | 14 | ||||
| -rw-r--r-- | scripts/entities/actors/actions/MovementAction.cs | 4 |
8 files changed, 34 insertions, 81 deletions
diff --git a/scripts/entities/actors/AI/HostileEnemyAI.cs b/scripts/entities/actors/AI/HostileEnemyAI.cs index 35d6d1a..e7efd26 100644 --- a/scripts/entities/actors/AI/HostileEnemyAI.cs +++ b/scripts/entities/actors/AI/HostileEnemyAI.cs @@ -53,8 +53,8 @@ public partial class HostileEnemyAI : BaseAI if (path.Count > 0) { // Pegamos o próximo passo para o destino. Vector2I destination = (Vector2I) path[0]; - // Se tiver um outro ator no caminho, paramos o nosso turno aqui. - if (body.Map_Data.GetBlockingActorAtPosition(destination) != null) { + // Se tiver o caminho estiver bloqueado, paramos o nosso turno aqui. + if (body.Map_Data.GetBlockingEntityAtPosition(destination) != null) { action = new WaitAction(body); action.Perform(); return; diff --git a/scripts/entities/actors/Actor.cs b/scripts/entities/actors/Actor.cs index c77122a..dc8ba53 100644 --- a/scripts/entities/actors/Actor.cs +++ b/scripts/entities/actors/Actor.cs @@ -4,7 +4,7 @@ using Godot; /// A classe de ator define um personagem no jogo. /// </summary> [GlobalClass] -public partial class Actor : Sprite2D +public partial class Actor : Entity { /// <summary> /// Sinal emitido toda vez que o HP mudar. @@ -25,12 +25,7 @@ public partial class Actor : Sprite2D /// A definição do ator possui caracterísitcas padrões que definem /// o ator em questão. /// </summary> - protected ActorDefinition definition; - /// <summary> - /// É conveniente ter acesso ao mapa dentro do ator. Isto porque suas ações são feitas dentro - /// do mapa, então é necessário ter acesso à algumas informações. - /// </summary> - public MapData Map_Data { get; set; } + private ActorDefinition definition; /// <summary> /// Se o ator está vivo. @@ -66,37 +61,6 @@ public partial class Actor : Sprite2D Energy += Speed; } - private Vector2I gridPosition = Vector2I.Zero; - /// <summary> - /// Posição do ator no mapa do jogo. Diferentemente de Position, GridPosition tem como formato - /// os tiles do mapa. - /// </summary> - 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; - } - - private bool blocksMovement; - /// <summary> - /// Se o ator bloqueia movimento (não pode oculpar a mesma célula de outro ator.) - /// </summary> - public bool BlocksMovement { - get => blocksMovement; - } - - private string actorName; - /// <summary> - /// Nome do ator. - /// </summary> - public string ActorName { - get => actorName; - } - private int hp; /// <summary> /// HP máximo do ator. @@ -147,14 +111,6 @@ public partial class Actor : Sprite2D /// </summary> public int Men { get; private set; } - public override void _Ready() - { - base._Ready(); - // Quando o ator for carregado completamente, atualizamos sua posição para refletir - // sua posição real. - GridPosition = Grid.WorldToGrid(Position); - } - /// <summary> /// Move o ator para uma localização. Veja MovementAction. /// </summary> @@ -162,18 +118,15 @@ public partial class Actor : Sprite2D public void Walk(Vector2I offset) { // Cada ator tem um peso no sistema de pathfinding. // Sempre que ele se mover, removemos seu peso da posição antiga - Map_Data.UnregisterBlockingActor(this); + Map_Data.UnregisterBlockingEntity(this); GridPosition += offset; // E colocamos na próxima. - Map_Data.RegisterBlockingActor(this); + Map_Data.RegisterBlockingEntity(this); // Este peso influencia o algoritmo de pathfinding. // Atores evitam caminhos bloqueados. por outros atores. } - public Actor(Vector2I initialPosition, MapData map, ActorDefinition definition) { - GridPosition = initialPosition; - Map_Data = map; - Centered = false; + public Actor(Vector2I initialPosition, MapData map, ActorDefinition definition) : base(initialPosition, map, definition) { SetDefinition(definition); } @@ -200,11 +153,10 @@ public partial class Actor : Sprite2D /// </summary> /// <param name="definition">A definição do ator.</param> public virtual void SetDefinition(ActorDefinition definition) { + base.SetDefinition(definition); this.definition = definition; - blocksMovement = definition.blocksMovement; - actorName = definition.name; + ZIndex = 1; - Texture = definition.texture; MaxHp = definition.Hp; Hp = definition.Hp; @@ -248,16 +200,16 @@ public partial class Actor : Sprite2D if (Map_Data.Player == this) { deathMessage = "Você morreu!"; } else { - deathMessage = $"{ActorName} morreu!"; + deathMessage = $"{DisplayName} morreu!"; } MessageLogData.Instance.AddMessage(deathMessage); Texture = definition.deathTexture; - blocksMovement = false; + BlocksMovement = false; ZIndex = 0; - actorName = $"Restos mortais de {actorName}"; - Map_Data.UnregisterBlockingActor(this); + DisplayName= $"Restos mortais de {DisplayName}"; + Map_Data.UnregisterBlockingEntity(this); EmitSignal(SignalName.Died); } }
\ No newline at end of file diff --git a/scripts/entities/actors/ActorDefinition.cs b/scripts/entities/actors/ActorDefinition.cs index ab0160b..540ede0 100644 --- a/scripts/entities/actors/ActorDefinition.cs +++ b/scripts/entities/actors/ActorDefinition.cs @@ -4,23 +4,14 @@ using Godot; /// Define de forma genérica as características de um ator. /// </summary> [GlobalClass] -public partial class ActorDefinition : Resource +public partial class ActorDefinition : EntityDefinition { [ExportCategory("Visuals")] - // Nome do ator. - [Export] - public string name = "unnamed"; - // Seu sprite. - [Export] - public Texture2D texture; // Sprite de morto [Export] public Texture2D deathTexture; [ExportCategory("Mechanics")] - // Se o ator bloqueia movimento. - [Export] - public bool blocksMovement = true; [Export] public int Speed { get; set;} = 10; diff --git a/scripts/entities/actors/Enemy.cs b/scripts/entities/actors/Enemy.cs index 19bcd2c..9c06417 100644 --- a/scripts/entities/actors/Enemy.cs +++ b/scripts/entities/actors/Enemy.cs @@ -16,13 +16,15 @@ public enum AIType /// </summary> public partial class Enemy : Actor { + private EnemyDefinition definition; /// <summary> - /// A alma do ator. Gera ações que são executadas todo turno. - /// </summary> + /// A alma do ator. Gera ações que são executadas todo turno. + /// </summary> public BaseAI Soul { get; private set; } public Enemy(Vector2I initialPosition, MapData map, EnemyDefinition definition) : base(initialPosition, map, definition) { + this.definition = definition; SetDefinition(definition); } diff --git a/scripts/entities/actors/actions/BumpAction.cs b/scripts/entities/actors/actions/BumpAction.cs index 805520c..bee202b 100644 --- a/scripts/entities/actors/actions/BumpAction.cs +++ b/scripts/entities/actors/actions/BumpAction.cs @@ -19,7 +19,7 @@ public partial class BumpAction : DirectionalAction Action action; // Se houver um ator no destino, crie uma ação de ataque. - if (GetTargetActor() != null) { + if (GetTarget() != null) { action = new MeleeAction(actor, Offset); } else { // Mas se não houver, crie uma ação de movimento. diff --git a/scripts/entities/actors/actions/DirectionalAction.cs b/scripts/entities/actors/actions/DirectionalAction.cs index ca2ca95..9c7a915 100644 --- a/scripts/entities/actors/actions/DirectionalAction.cs +++ b/scripts/entities/actors/actions/DirectionalAction.cs @@ -24,7 +24,7 @@ public abstract partial class DirectionalAction : Action /// Função que obtém o alvo da ação, se houver. /// </summary> /// <returns>O ator alvo da ação, nulo se não houver.</returns> - protected Actor GetTargetActor() { - return Map_Data.GetBlockingActorAtPosition(Destination); + protected Entity GetTarget() { + return Map_Data.GetBlockingEntityAtPosition(Destination); } } diff --git a/scripts/entities/actors/actions/MeleeAction.cs b/scripts/entities/actors/actions/MeleeAction.cs index b20430a..6dfeb78 100644 --- a/scripts/entities/actors/actions/MeleeAction.cs +++ b/scripts/entities/actors/actions/MeleeAction.cs @@ -15,7 +15,15 @@ public partial class MeleeAction : DirectionalAction public override void Perform() { // Eu te disse que este método seria útil. - Actor target = GetTargetActor(); + Entity potentialTarget = GetTarget(); + + // Só podemos atacar atores. + if (potentialTarget is not Actor) { + return; + } + + Actor target = (Actor)potentialTarget; + // Se não houver um ator na direção, não podemos continuar. // Isto é uma ação gratuita. @@ -24,13 +32,13 @@ public partial class MeleeAction : DirectionalAction // não podemos ter dano negativo. int damage = actor.Atk - target.Def; - string attackDesc = $"{actor.ActorName} ataca {target.ActorName}"; + string attackDesc = $"{actor.DisplayName} ataca {target.DisplayName}"; if (damage > 0) { attackDesc += $" e remove {damage} de HP."; target.Hp -= damage; } else { - attackDesc += $" mas {target.ActorName} tem músculos de aço."; + attackDesc += $" mas {target.DisplayName} tem músculos de aço."; } MessageLogData.Instance.AddMessage(attackDesc); diff --git a/scripts/entities/actors/actions/MovementAction.cs b/scripts/entities/actors/actions/MovementAction.cs index 3608357..2c394fc 100644 --- a/scripts/entities/actors/actions/MovementAction.cs +++ b/scripts/entities/actors/actions/MovementAction.cs @@ -12,11 +12,11 @@ public partial class MovementAction : DirectionalAction public override void Perform() { // Não anda se o destino for um tile sólido. - if (!Map_Data.IsTileWalkable(Destination)) return; + if (!Map_Data.GetTile(Destination).IsWalkable) return; // Não anda se o destino for oculpado por um ator. // Na maioria dos casos, essa condição nunca é verdadeira. - if (GetTargetActor() != null) return; + if (GetTarget() != null) return; actor.Walk(Offset); actor.Energy -= cost; |
