using System; using System.Linq; using System.Threading.Tasks; using Babushka.scripts.CSharp.Common.Fight.ActionDetails; using Babushka.scripts.CSharp.Common.Util; using Godot; namespace Babushka.scripts.CSharp.Common.Fight.Actions; public class AllyAttackAction : FighterAction { // details public TargetSelectActionDetail targetSelect = new() { selectEnemy = true, selectAlly = false, aliveOnly = true }; public MinigameActionDetail minigameDetail = new(); public override Variant> GetAnimationEnd() { return 1; } public override bool NextDetail() { return !targetSelect.DetailComplete() || !minigameDetail.DetailComplete(); } public override FighterActionDetail CurrentDetail() { return targetSelect.DetailComplete() ? minigameDetail : targetSelect; } public override AllyActionButton BindToActionButton() { return AllyActionButton.Attack; } public override void Reset() { targetSelect.ResetResult(); minigameDetail.ResetResult(); } public override void ExecuteAction() { var totalDamage = minigameDetail.damageHits!.Sum(dh => dh); targetSelect.GetTarget().ChangeHealth(-totalDamage); } public override async Task AnimateAction(AllFightersVisual allFightersVisual, FightHappeningAnimationContext animationContext) { var currentFighter = HappeningData.fighterTurn.Current; var targetFighter = targetSelect.GetTarget(); var currentFighterVisual = allFightersVisual.GetVisualForFighter(currentFighter); var targetFighterVisual = allFightersVisual.GetVisualForFighter(targetFighter); await currentFighterVisual.AnimatePosToTarget(targetFighterVisual); _ = targetFighterVisual.AnimateHit(); foreach (var hit in minigameDetail.damageHits!) { targetFighterVisual.SpawnDamageIndicatorNumber($"-{hit}"); } await currentFighterVisual.AnimatePosToBase(); } }