|
|
|
@ -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();
|
|
|
|
@ -243,7 +300,7 @@ public partial class FightInstance : Node2D //TODO: remake
|
|
|
|
|
|
|
|
|
|
|
|
private void ShowTargetButtons()
|
|
|
|
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)
|
|
|
|
public void SelectTargetAndAttack(Fighter fighter)
|
|
|
|
@ -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()))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|