Added action per round

This commit is contained in:
cblech
2025-07-10 18:29:18 +02:00
parent 0e028a2cb9
commit 4752002caf
3 changed files with 96 additions and 20 deletions
+74 -17
View File
@@ -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());
}
/**
* <returns>
* <c>true</c> if the state was changed
* </returns>
*/
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;
}
/**
* <returns>
* <c>true</c> if the state was changed
* </returns>
*/
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()))
{