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();
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();
var availableEnemyFighters =
_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.");
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();
@ -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()))
{

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

@ -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()
@ -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--;
}
}

Loading…
Cancel
Save