From 4752002caf0181551a4d3ed42b11bb0ac152e83f Mon Sep 17 00:00:00 2001 From: cblech Date: Thu, 10 Jul 2025 18:29:18 +0200 Subject: [PATCH] Added action per round --- scripts/CSharp/Common/Fight/FightInstance.cs | 91 +++++++++++++++---- .../CSharp/Common/Fight/FightStateManager.cs | 4 +- scripts/CSharp/Common/Fight/Fighter.cs | 21 ++++- 3 files changed, 96 insertions(+), 20 deletions(-) diff --git a/scripts/CSharp/Common/Fight/FightInstance.cs b/scripts/CSharp/Common/Fight/FightInstance.cs index 3395aae..f692df9 100644 --- a/scripts/CSharp/Common/Fight/FightInstance.cs +++ b/scripts/CSharp/Common/Fight/FightInstance.cs @@ -65,10 +65,10 @@ public partial class FightInstance : Node2D //TODO: remake ReleaseCamera(); break; case FightStateManager.FightState.Input: - if (CheckWin()) - { + if (CheckWinAndSetState()) + break; + if (CheckFriendlyActionsLeftAndSetState()) break; - } ShowAttackButtons(); break; case FightStateManager.FightState.InputTargetSelect: @@ -76,19 +76,19 @@ public partial class FightInstance : Node2D //TODO: remake break; case FightStateManager.FightState.FriendAttackAnim: ExecuteAttack(); - GetTree().CreateTimer(1).Timeout += () => _fightStateManager.CurrentFightState = FightStateManager.FightState.Enemy; + GetTree().CreateTimer(1).Timeout += () => _fightStateManager.CurrentFightState = FightStateManager.FightState.Input; break; case FightStateManager.FightState.Enemy: - if (CheckWin()) - { + if (CheckWinAndSetState()) + break; + if (CheckEnemyActionsLeftAndSetState()) break; - } DecideEnemyAttack(); _fightStateManager.CurrentFightState = FightStateManager.FightState.EnemyAttackAnim; break; case FightStateManager.FightState.EnemyAttackAnim: ExecuteAttack(); - GetTree().CreateTimer(1).Timeout += () => _fightStateManager.CurrentFightState = FightStateManager.FightState.Input; + GetTree().CreateTimer(1).Timeout += () => _fightStateManager.CurrentFightState = FightStateManager.FightState.Enemy; break; case FightStateManager.FightState.PlayerWinAnim: _fightEndText.Text = "You Win!"; @@ -98,9 +98,59 @@ public partial class FightInstance : Node2D //TODO: remake _fightEndText.Text = "You Died :("; GetTree().CreateTimer(3).Timeout += () => _fightStateManager.CurrentFightState = FightStateManager.FightState.None; break; + case FightStateManager.FightState.ChangeSideToEnemy: + ResetEnemyActions(); + _fightStateManager.CurrentFightState = FightStateManager.FightState.Enemy; + break; + case FightStateManager.FightState.ChangeSideToFriendly: + ResetFriendlyActions(); + _fightStateManager.CurrentFightState = FightStateManager.FightState.Input; + break; } }; } + private void ResetEnemyActions() + { + _enemyFighters.ForEach(f => f.ResetActions()); + } + + private void ResetFriendlyActions() + { + _friendlyFighters.ForEach(f => f.ResetActions()); + } + + /** + * + * true if the state was changed + * + */ + private bool CheckFriendlyActionsLeftAndSetState() + { + var hasActionsLeft = _friendlyFighters.Where(f => !f.IsDead()).Any(f => f.HasActionsLeft()); + if (hasActionsLeft) + { + return false; + } // else + _fightStateManager.CurrentFightState = FightStateManager.FightState.ChangeSideToEnemy; + return true; + } + + /** + * + * true if the state was changed + * + */ + private bool CheckEnemyActionsLeftAndSetState() + { + var hasActionsLeft = _enemyFighters.Where(f => !f.IsDead()).Any(f => f.HasActionsLeft()); + if (hasActionsLeft) + { + return false; + } // else + _fightStateManager.CurrentFightState = FightStateManager.FightState.ChangeSideToFriendly; + return true; + } + private void CleanUp() { _enemyFighters.ForEach(f => f.QueueFree()); @@ -110,16 +160,23 @@ public partial class FightInstance : Node2D //TODO: remake } private void DecideEnemyAttack() { - var aliveEnemyFighters = _enemyFighters.Where(f => !f.IsDead()).ToList(); - var aliveFriendlyFighters = _friendlyFighters.Where(f => !f.IsDead()).ToList(); - - if (aliveEnemyFighters.Count <= 0) + var availableEnemyFighters = + _enemyFighters + .Where(f => !f.IsDead()) + .Where(f=>f.HasActionsLeft()) + .ToList(); + var aliveFriendlyFighters = + _friendlyFighters + .Where(f => !f.IsDead()) + .ToList(); + + if (availableEnemyFighters.Count <= 0) throw new InvalidOperationException("No enemy fighters available for attack."); - + if (aliveFriendlyFighters.Count <= 0) throw new InvalidOperationException("No friendly fighters available to target."); - var fighter = aliveEnemyFighters.Random(); + var fighter = availableEnemyFighters.Random(); var target = aliveFriendlyFighters.Random(); _stagedAttack = new FightAttack @@ -143,7 +200,7 @@ public partial class FightInstance : Node2D //TODO: remake throw new InvalidOperationException("No target selected for the staged attack."); _stagedAttack.target!.Health -= _stagedAttack.damage; - + _stagedAttack.attacker.DecrementActions(); _stagedAttack.attacker.AttackAnimation(_stagedAttack); UpdateHealthVisual(); @@ -243,7 +300,7 @@ public partial class FightInstance : Node2D //TODO: remake private void ShowTargetButtons() { - _enemyFighters.Where(f=>!f.IsDead()).ForEach(f => f.ShowTargetButtons()); + _enemyFighters.Where(f => !f.IsDead()).ForEach(f => f.ShowTargetButtons()); } public void SelectTargetAndAttack(Fighter fighter) @@ -256,7 +313,7 @@ public partial class FightInstance : Node2D //TODO: remake _fightStateManager.CurrentFightState = FightStateManager.FightState.FriendAttackAnim; } - public bool CheckWin() + public bool CheckWinAndSetState() { if (_enemyFighters.All(f => f.IsDead())) { diff --git a/scripts/CSharp/Common/Fight/FightStateManager.cs b/scripts/CSharp/Common/Fight/FightStateManager.cs index 9d86e2c..66bfcbc 100644 --- a/scripts/CSharp/Common/Fight/FightStateManager.cs +++ b/scripts/CSharp/Common/Fight/FightStateManager.cs @@ -19,7 +19,9 @@ public partial class FightStateManager : Node Enemy, EnemyAttackAnim, PlayerWinAnim, - EnemyWinAnim + EnemyWinAnim, + ChangeSideToEnemy, + ChangeSideToFriendly, } private FightState _fightStateBacking = FightState.None; diff --git a/scripts/CSharp/Common/Fight/Fighter.cs b/scripts/CSharp/Common/Fight/Fighter.cs index e8454d3..02a25a7 100644 --- a/scripts/CSharp/Common/Fight/Fighter.cs +++ b/scripts/CSharp/Common/Fight/Fighter.cs @@ -6,6 +6,7 @@ public partial class Fighter : Node2D [Export] public string name; [Export] public int maxHealth; [Export] public int attackStrength; + [Export] public int maxActions = 1; [ExportCategory("References")] [Export] private Node2D _attackButtons; @@ -20,6 +21,7 @@ public partial class Fighter : Node2D private int _health; + private int _actions; public FightInstance fightInstance; @@ -47,6 +49,7 @@ public partial class Fighter : Node2D { Health = maxHealth; UpdateHealthVisual(); + ResetActions(); } public void Attack() @@ -119,7 +122,7 @@ public partial class Fighter : Node2D tween.TweenCallback(Callable.From(() => attack.target?.HitAnimation(attack))); tween.TweenProperty(this, "position", new Vector2(0, 0), 0.7) .SetTrans(Tween.TransitionType.Cubic).SetEase(Tween.EaseType.Out); - + } private void HitAnimation(FightAttack attack) @@ -127,7 +130,7 @@ public partial class Fighter : Node2D EmitSignalDamageTaken(); var tween = GetTree().CreateTween(); tween.TweenProperty(this, "scale", new Vector2(1.4f, 0.6f), 0.15); - tween.TweenProperty(this, "scale", new Vector2(1,1), 0.4) + tween.TweenProperty(this, "scale", new Vector2(1, 1), 0.4) .SetTrans(Tween.TransitionType.Cubic).SetEase(Tween.EaseType.Out); } @@ -135,4 +138,18 @@ public partial class Fighter : Node2D { return Health <= 0; } + + public void ResetActions() + { + _actions = maxActions; + } + + public bool HasActionsLeft() + { + return _actions > 0; + } + public void DecrementActions() + { + _actions--; + } }