From 2023ac3fa6477142299115b056b4ad380a9a9f7a Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 1 Sep 2025 19:41:25 -0300 Subject: Implementado sistema de ações gratuitas. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/Time/TurnManager.cs | 1 + scripts/actors/AI/BaseAI.cs | 2 ++ scripts/actors/AI/HostileEnemyAI.cs | 8 ++++++++ scripts/actors/actions/MeleeAction.cs | 3 ++- scripts/actors/actions/MovementAction.cs | 2 +- 5 files changed, 14 insertions(+), 2 deletions(-) (limited to 'scripts') diff --git a/scripts/Time/TurnManager.cs b/scripts/Time/TurnManager.cs index af721ee..cbf1176 100644 --- a/scripts/Time/TurnManager.cs +++ b/scripts/Time/TurnManager.cs @@ -63,6 +63,7 @@ public partial class TurnManager : RefCounted if (Player.Energy <= 0) { // Depois computamos os turnos dos outros atores. HandleEnemyTurns(); + map.UpdateFOV(Player.GridPosition); } // Por fim, se o jogador mudou de lugar, atualizamos seu campo de visão. if (Player.GridPosition != previousPlayerPos) { diff --git a/scripts/actors/AI/BaseAI.cs b/scripts/actors/AI/BaseAI.cs index 23cdcf6..733a61a 100644 --- a/scripts/actors/AI/BaseAI.cs +++ b/scripts/actors/AI/BaseAI.cs @@ -19,6 +19,8 @@ public abstract partial class BaseAI : Node { /// /// Computa um único turno para o ator controlado. + /// Aviso: NPCs não possuem ações gratuitas. + /// A IA SEMPRE precisa executar uma ação que custe energia. /// public abstract void Perform(); diff --git a/scripts/actors/AI/HostileEnemyAI.cs b/scripts/actors/AI/HostileEnemyAI.cs index af87360..35d6d1a 100644 --- a/scripts/actors/AI/HostileEnemyAI.cs +++ b/scripts/actors/AI/HostileEnemyAI.cs @@ -25,6 +25,14 @@ public partial class HostileEnemyAI : BaseAI // Só faz sentido atacar o jogador se o inimigo estiver visível. if (body.Map_Data.GetTile(body.GridPosition).IsInView) { + // Se o inimigo consegue ver que o jogador está morto, + // IT'S OVER. + if (!target.IsAlive) { + action = new WaitAction(body); + action.Perform(); + return; + } + // Se estiver do lado do jogador, ataque. if (distance <= 1) { action = new MeleeAction(body, offset); diff --git a/scripts/actors/actions/MeleeAction.cs b/scripts/actors/actions/MeleeAction.cs index ae94eff..b20430a 100644 --- a/scripts/actors/actions/MeleeAction.cs +++ b/scripts/actors/actions/MeleeAction.cs @@ -14,11 +14,11 @@ public partial class MeleeAction : DirectionalAction /// public override void Perform() { - actor.Energy -= cost; // Eu te disse que este método seria útil. Actor target = GetTargetActor(); // Se não houver um ator na direção, não podemos continuar. + // Isto é uma ação gratuita. if (target == null) return; // não podemos ter dano negativo. @@ -34,5 +34,6 @@ public partial class MeleeAction : DirectionalAction } MessageLogData.Instance.AddMessage(attackDesc); + actor.Energy -= cost; } } diff --git a/scripts/actors/actions/MovementAction.cs b/scripts/actors/actions/MovementAction.cs index 7d0c93b..3608357 100644 --- a/scripts/actors/actions/MovementAction.cs +++ b/scripts/actors/actions/MovementAction.cs @@ -11,7 +11,6 @@ public partial class MovementAction : DirectionalAction public override void Perform() { - actor.Energy -= cost; // Não anda se o destino for um tile sólido. if (!Map_Data.IsTileWalkable(Destination)) return; @@ -20,5 +19,6 @@ public partial class MovementAction : DirectionalAction if (GetTargetActor() != null) return; actor.Walk(Offset); + actor.Energy -= cost; } } -- cgit v1.2.3