Added minigame to attack action

This commit is contained in:
jonathan
2025-10-02 15:49:24 +02:00
parent 96df233496
commit ff8e4a85d2
6 changed files with 92 additions and 6 deletions
@@ -0,0 +1,26 @@
using System.Collections.Generic;
namespace Babushka.scripts.CSharp.Common.Fight.ActionDetails;
public class MinigameActionDetail : FighterAction.FighterActionDetail
{
// settings
// result
public List<int>? damageHits = null;
public MinigameActionDetail()
{
}
public override bool DetailComplete()
{
return damageHits != null;
}
public void ResetResult()
{
damageHits = null;
}
}
@@ -1,4 +1,5 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Babushka.scripts.CSharp.Common.Fight.ActionDetails;
using Babushka.scripts.CSharp.Common.Util;
@@ -15,6 +16,8 @@ public class AllyAttackAction : FighterAction
selectAlly = false
};
public MinigameActionDetail minigameDetail = new();
public override Variant<float, Func<bool>> GetAnimationEnd()
{
return 1;
@@ -22,12 +25,12 @@ public class AllyAttackAction : FighterAction
public override bool NextDetail()
{
return !targetSelect.DetailComplete();
return !targetSelect.DetailComplete() || !minigameDetail.DetailComplete();
}
public override FighterActionDetail CurrentDetail()
{
return targetSelect;
return targetSelect.DetailComplete() ? minigameDetail : targetSelect;
}
public override AllyActionButton BindToActionButton()
@@ -38,11 +41,13 @@ public class AllyAttackAction : FighterAction
public override void Reset()
{
targetSelect.ResetResult();
minigameDetail.ResetResult();
}
public override void ExecuteAction()
{
targetSelect.GetTarget().AddHealth(-5);
var totalDamage = minigameDetail.damageHits!.Sum(dh => dh);
targetSelect.GetTarget().AddHealth(-totalDamage);
}
public override async Task AnimateAction(AllFightersVisual allFightersVisual)
@@ -52,7 +57,7 @@ public class AllyAttackAction : FighterAction
var currentFighterVisual = allFightersVisual.GetVisualForFighter(currentFighter);
var targetFighterVisual = allFightersVisual.GetVisualForFighter(targetFighter);
await currentFighterVisual.AnimatePosToTarget(targetFighterVisual);
_ = targetFighterVisual.AnimateHit();
await currentFighterVisual.AnimatePosToBase();
@@ -0,0 +1,43 @@
using Godot;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Babushka.scripts.CSharp.Common.Fight;
using Babushka.scripts.CSharp.Common.Fight.ActionDetails;
using Babushka.scripts.CSharp.Common.Minigame;
public partial class FightMinigameHandler : Node
{
#region Shortcuts
private FightWorld.FightHappeningData HappeningData => FightWorld.Instance.fightHappeningData ?? throw new NoFightHappeningException();
#endregion
[Export] private MinigameController _minigameController;
public void OnStateEnter(FightHappening.FightState to)
{
if(to!=FightHappening.FightState.InputActionDetail) return;
var currentDetail = HappeningData.actionStaging!.CurrentDetail();
if(currentDetail is not MinigameActionDetail minigameDetail) return;
_minigameController.Run(new MinigameController.Builder<int>()
.AddRegion(4)
.AddRegion(0).RegionWithProportion(1.5f)
.AddRegion(8).RegionWithProportion(0.5f)
.AddRegion(0).RegionWithProportion(1.5f)
.AddRegion(3)
.AddRegion(5)
.WithHitCount(3)
).ContinueWith(task =>
{
minigameDetail.damageHits = task.Result;
//FightHappening.Instance.DetailFilled();
// Apparently ContinueWith spawn a new Thread, but methods on a node only want to be called from the main thread
FightHappening.Instance.CallDeferred("DetailFilled");
});
}
}
@@ -0,0 +1 @@
uid://bwm0nhvt1083k