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--;
+ }
}