Added action per round

feature/fight_system
cblech 6 months ago
parent 0e028a2cb9
commit 4752002caf

@ -65,10 +65,10 @@ public partial class FightInstance : Node2D //TODO: remake
ReleaseCamera(); ReleaseCamera();
break; break;
case FightStateManager.FightState.Input: case FightStateManager.FightState.Input:
if (CheckWin()) if (CheckWinAndSetState())
{ break;
if (CheckFriendlyActionsLeftAndSetState())
break; break;
}
ShowAttackButtons(); ShowAttackButtons();
break; break;
case FightStateManager.FightState.InputTargetSelect: case FightStateManager.FightState.InputTargetSelect:
@ -76,19 +76,19 @@ public partial class FightInstance : Node2D //TODO: remake
break; break;
case FightStateManager.FightState.FriendAttackAnim: case FightStateManager.FightState.FriendAttackAnim:
ExecuteAttack(); ExecuteAttack();
GetTree().CreateTimer(1).Timeout += () => _fightStateManager.CurrentFightState = FightStateManager.FightState.Enemy; GetTree().CreateTimer(1).Timeout += () => _fightStateManager.CurrentFightState = FightStateManager.FightState.Input;
break; break;
case FightStateManager.FightState.Enemy: case FightStateManager.FightState.Enemy:
if (CheckWin()) if (CheckWinAndSetState())
{ break;
if (CheckEnemyActionsLeftAndSetState())
break; break;
}
DecideEnemyAttack(); DecideEnemyAttack();
_fightStateManager.CurrentFightState = FightStateManager.FightState.EnemyAttackAnim; _fightStateManager.CurrentFightState = FightStateManager.FightState.EnemyAttackAnim;
break; break;
case FightStateManager.FightState.EnemyAttackAnim: case FightStateManager.FightState.EnemyAttackAnim:
ExecuteAttack(); ExecuteAttack();
GetTree().CreateTimer(1).Timeout += () => _fightStateManager.CurrentFightState = FightStateManager.FightState.Input; GetTree().CreateTimer(1).Timeout += () => _fightStateManager.CurrentFightState = FightStateManager.FightState.Enemy;
break; break;
case FightStateManager.FightState.PlayerWinAnim: case FightStateManager.FightState.PlayerWinAnim:
_fightEndText.Text = "You Win!"; _fightEndText.Text = "You Win!";
@ -98,9 +98,59 @@ public partial class FightInstance : Node2D //TODO: remake
_fightEndText.Text = "You Died :("; _fightEndText.Text = "You Died :(";
GetTree().CreateTimer(3).Timeout += () => _fightStateManager.CurrentFightState = FightStateManager.FightState.None; GetTree().CreateTimer(3).Timeout += () => _fightStateManager.CurrentFightState = FightStateManager.FightState.None;
break; 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() private void CleanUp()
{ {
_enemyFighters.ForEach(f => f.QueueFree()); _enemyFighters.ForEach(f => f.QueueFree());
@ -110,16 +160,23 @@ public partial class FightInstance : Node2D //TODO: remake
} }
private void DecideEnemyAttack() private void DecideEnemyAttack()
{ {
var aliveEnemyFighters = _enemyFighters.Where(f => !f.IsDead()).ToList(); var availableEnemyFighters =
var aliveFriendlyFighters = _friendlyFighters.Where(f => !f.IsDead()).ToList(); _enemyFighters
.Where(f => !f.IsDead())
.Where(f=>f.HasActionsLeft())
.ToList();
var aliveFriendlyFighters =
_friendlyFighters
.Where(f => !f.IsDead())
.ToList();
if (aliveEnemyFighters.Count <= 0) if (availableEnemyFighters.Count <= 0)
throw new InvalidOperationException("No enemy fighters available for attack."); throw new InvalidOperationException("No enemy fighters available for attack.");
if (aliveFriendlyFighters.Count <= 0) if (aliveFriendlyFighters.Count <= 0)
throw new InvalidOperationException("No friendly fighters available to target."); throw new InvalidOperationException("No friendly fighters available to target.");
var fighter = aliveEnemyFighters.Random(); var fighter = availableEnemyFighters.Random();
var target = aliveFriendlyFighters.Random(); var target = aliveFriendlyFighters.Random();
_stagedAttack = new FightAttack _stagedAttack = new FightAttack
@ -143,7 +200,7 @@ public partial class FightInstance : Node2D //TODO: remake
throw new InvalidOperationException("No target selected for the staged attack."); throw new InvalidOperationException("No target selected for the staged attack.");
_stagedAttack.target!.Health -= _stagedAttack.damage; _stagedAttack.target!.Health -= _stagedAttack.damage;
_stagedAttack.attacker.DecrementActions();
_stagedAttack.attacker.AttackAnimation(_stagedAttack); _stagedAttack.attacker.AttackAnimation(_stagedAttack);
UpdateHealthVisual(); UpdateHealthVisual();
@ -256,7 +313,7 @@ public partial class FightInstance : Node2D //TODO: remake
_fightStateManager.CurrentFightState = FightStateManager.FightState.FriendAttackAnim; _fightStateManager.CurrentFightState = FightStateManager.FightState.FriendAttackAnim;
} }
public bool CheckWin() public bool CheckWinAndSetState()
{ {
if (_enemyFighters.All(f => f.IsDead())) if (_enemyFighters.All(f => f.IsDead()))
{ {

@ -19,7 +19,9 @@ public partial class FightStateManager : Node
Enemy, Enemy,
EnemyAttackAnim, EnemyAttackAnim,
PlayerWinAnim, PlayerWinAnim,
EnemyWinAnim EnemyWinAnim,
ChangeSideToEnemy,
ChangeSideToFriendly,
} }
private FightState _fightStateBacking = FightState.None; private FightState _fightStateBacking = FightState.None;

@ -6,6 +6,7 @@ public partial class Fighter : Node2D
[Export] public string name; [Export] public string name;
[Export] public int maxHealth; [Export] public int maxHealth;
[Export] public int attackStrength; [Export] public int attackStrength;
[Export] public int maxActions = 1;
[ExportCategory("References")] [ExportCategory("References")]
[Export] private Node2D _attackButtons; [Export] private Node2D _attackButtons;
@ -20,6 +21,7 @@ public partial class Fighter : Node2D
private int _health; private int _health;
private int _actions;
public FightInstance fightInstance; public FightInstance fightInstance;
@ -47,6 +49,7 @@ public partial class Fighter : Node2D
{ {
Health = maxHealth; Health = maxHealth;
UpdateHealthVisual(); UpdateHealthVisual();
ResetActions();
} }
public void Attack() public void Attack()
@ -135,4 +138,18 @@ public partial class Fighter : Node2D
{ {
return Health <= 0; return Health <= 0;
} }
public void ResetActions()
{
_actions = maxActions;
}
public bool HasActionsLeft()
{
return _actions > 0;
}
public void DecrementActions()
{
_actions--;
}
} }

Loading…
Cancel
Save