Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b7d1f9d8d5 | |||
| 12bf632932 | |||
| 0d985e5bf6 | |||
| e86b3e81dd | |||
| aa4f1c55b5 | |||
| aad6c44567 |
@@ -1,36 +1,44 @@
|
||||
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;
|
||||
using Godot;
|
||||
using static Babushka.scripts.CSharp.Common.Minigame.MinigameController.RegionTheme;
|
||||
|
||||
namespace Babushka.scripts.CSharp.Common.Fight;
|
||||
|
||||
public partial class FightMinigameHandler : Node
|
||||
{
|
||||
#region Shortcuts
|
||||
|
||||
private FightWorld.FightHappeningData HappeningData => FightWorld.Instance.fightHappeningData ?? throw new NoFightHappeningException();
|
||||
private FightWorld.FightHappeningData HappeningData =>
|
||||
FightWorld.Instance.fightHappeningData ?? throw new NoFightHappeningException();
|
||||
|
||||
#endregion
|
||||
|
||||
[Export] private MinigameController _minigameController;
|
||||
|
||||
[Export] private MinigameController _minigameController = null!;
|
||||
|
||||
|
||||
public void OnStateEnter(FightHappening.FightState to)
|
||||
{
|
||||
if(to!=FightHappening.FightState.InputActionDetail) return;
|
||||
|
||||
var currentDetail = HappeningData.actionStaging!.CurrentDetail();
|
||||
if(currentDetail is not MinigameActionDetail minigameDetail) return;
|
||||
if (to != FightHappening.FightState.InputActionDetail) return;
|
||||
|
||||
var currentDetail = HappeningData.actionStaging!.CurrentDetail();
|
||||
if (currentDetail is not MinigameActionDetail minigameDetail) return;
|
||||
|
||||
var region1 = R(2, 4);
|
||||
var region2 = R([0, 1, 1, 2]);
|
||||
var region3 = R([7, 8, 9, 9]);
|
||||
var region4 = R([0, 1, 1, 2]);
|
||||
var region5 = R(2, 4);
|
||||
var region6 = R(4, 6);
|
||||
|
||||
_minigameController.Run(new MinigameController.Builder<int>()
|
||||
.AddRegion(4).RegionWithText("4").RegionWithTheme(MinigameController.RegionTheme.Normal)
|
||||
.AddRegion(0).RegionWithProportion(1.5f).RegionWithText("0").RegionWithTheme(MinigameController.RegionTheme.Bad)
|
||||
.AddRegion(8).RegionWithProportion(0.5f).RegionWithText("8").RegionWithTheme(MinigameController.RegionTheme.VeryGood)
|
||||
.AddRegion(0).RegionWithProportion(1.5f).RegionWithText("0").RegionWithTheme(MinigameController.RegionTheme.Bad)
|
||||
.AddRegion(3).RegionWithText("3").RegionWithTheme(MinigameController.RegionTheme.NormalAlt1)
|
||||
.AddRegion(5).RegionWithText("5").RegionWithTheme(MinigameController.RegionTheme.NormalAlt2)
|
||||
.AddRegion(region1).RegionWithProportion(R(0.7, 1.3)).RegionWithText(region1.ToString()).RegionWithTheme(Normal)
|
||||
.AddRegion(region2).RegionWithProportion(R(1, 1.8)).RegionWithText(region2.ToString()).RegionWithTheme(Bad)
|
||||
.AddRegion(region3).RegionWithProportion(R(0.3, 1)).RegionWithText(region3.ToString()).RegionWithTheme(VeryGood)
|
||||
.AddRegion(region4).RegionWithProportion(R(1, 1.8)).RegionWithText(region4.ToString()).RegionWithTheme(Bad)
|
||||
.AddRegion(region5).RegionWithProportion(R(0.7, 1.3)).RegionWithText(region5.ToString()).RegionWithTheme(NormalAlt1)
|
||||
.AddRegion(region6).RegionWithProportion(R(0.7, 1.3)).RegionWithText(region6.ToString()).RegionWithTheme(NormalAlt2)
|
||||
.WithHitCount(3)
|
||||
).ContinueWith(task =>
|
||||
{
|
||||
@@ -40,4 +48,25 @@ public partial class FightMinigameHandler : Node
|
||||
FightHappening.Instance.CallDeferred("DetailFilled");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#region Utils
|
||||
|
||||
// this is to make the minigame set up a bit less convoluted
|
||||
private static int R(int min, int max)
|
||||
{
|
||||
return GD.RandRange(min, max);
|
||||
}
|
||||
|
||||
private static float R(double min, double max)
|
||||
{
|
||||
return (float)GD.RandRange(min, max);
|
||||
}
|
||||
|
||||
private static int R(List<int> list)
|
||||
{
|
||||
return list[GD.RandRange(0, list.Count - 1)];
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -21,7 +21,7 @@ public partial class MinigameController : Node2D
|
||||
God,
|
||||
VeryGood
|
||||
}
|
||||
|
||||
|
||||
public class Builder<T>
|
||||
{
|
||||
internal class Region
|
||||
@@ -108,6 +108,8 @@ public partial class MinigameController : Node2D
|
||||
|
||||
[Signal] public delegate void ArmMovedEventHandler(float newPos);
|
||||
|
||||
[Signal] public delegate void RegionHitEventHandler(int regionIndex);
|
||||
|
||||
public override void _EnterTree()
|
||||
{
|
||||
HideMinigame();
|
||||
@@ -125,6 +127,7 @@ public partial class MinigameController : Node2D
|
||||
ShowMinigame();
|
||||
Setup(builder);
|
||||
await _minigameComplete!.Task;
|
||||
await ToSignal(GetTree().CreateTimer(.3), "timeout");
|
||||
var returnValue = _hits!.Select(h => builder.regions[h].value).ToList();
|
||||
Reset();
|
||||
HideMinigame();
|
||||
@@ -145,6 +148,7 @@ public partial class MinigameController : Node2D
|
||||
}
|
||||
|
||||
_hits.Add(i);
|
||||
EmitSignalRegionHit(i);
|
||||
|
||||
_armSpeed = -_armSpeed;
|
||||
|
||||
@@ -174,16 +178,18 @@ public partial class MinigameController : Node2D
|
||||
|
||||
// spawn regions
|
||||
var regionSum = 0f;
|
||||
foreach (var region in builder.regions)
|
||||
foreach (var (region, i) in builder.regions.Select((region, i) => (region, i)))
|
||||
{
|
||||
var regionVisual = _regionVisualPrefab.Instantiate<RegionVisual>();
|
||||
_regionsParent.AddChild(regionVisual);
|
||||
|
||||
RegionHit += regionVisual.HitAnimation;
|
||||
|
||||
var normalisedAngleStart = regionSum / totalRegionProportion;
|
||||
var normalisedAngleEnd = (regionSum + region.proportion) / totalRegionProportion;
|
||||
var normalAngles = new Vector2(normalisedAngleStart, normalisedAngleEnd);
|
||||
|
||||
regionVisual.Setup(normalAngles, _baseRegionColor.RandomHue(), region.text, region.theme);
|
||||
regionVisual.Setup(normalAngles, region.text, region.theme, i);
|
||||
|
||||
regionSum += region.proportion;
|
||||
|
||||
@@ -207,6 +213,13 @@ public partial class MinigameController : Node2D
|
||||
{
|
||||
_minigameComplete = null;
|
||||
_hits = null;
|
||||
_regionsParent.GetChildren().ForEach(c => c.QueueFree());
|
||||
_regionsParent.GetChildren().ForEach(c =>
|
||||
{
|
||||
if (c is RegionVisual rv)
|
||||
{
|
||||
RegionHit -= rv.HitAnimation;
|
||||
}
|
||||
c.QueueFree();
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,27 +1,42 @@
|
||||
using Godot;
|
||||
using System;
|
||||
using Babushka.scripts.CSharp.Common.Minigame;
|
||||
using Godot;
|
||||
using Godot.Collections;
|
||||
|
||||
namespace Babushka.scripts.CSharp.Common.Minigame;
|
||||
|
||||
public partial class RegionVisual : Node
|
||||
{
|
||||
[Export] private Sprite2D _sliceSprite;
|
||||
[Export] private Label _textLabel;
|
||||
[Export] private Node2D _labelPivot;
|
||||
[Export] private Sprite2D _sliceSprite = null!;
|
||||
[Export] private Label _textLabel = null!;
|
||||
[Export] private Node2D _labelPivot = null!;
|
||||
|
||||
[Export(PropertyHint.DictionaryType)] private Dictionary<MinigameController.RegionTheme, Color> _fillColors = new();
|
||||
|
||||
public void Setup(Vector2 normalAngles, Color color, string regionText, MinigameController.RegionTheme regionTheme)
|
||||
private int _index;
|
||||
|
||||
public void Setup(Vector2 normalAngles, string regionText, MinigameController.RegionTheme regionTheme, int index)
|
||||
{
|
||||
var mat = (_sliceSprite.Material as ShaderMaterial)!;
|
||||
mat.SetShaderParameter("angles", normalAngles);
|
||||
mat.SetShaderParameter("fillColor", GetFillColor(regionTheme));
|
||||
|
||||
var averageAngleRadians = (normalAngles.X + normalAngles.Y) * float.Pi; // '/ 2' from the average and '* 2' from the radians cancel out
|
||||
// '/ 2' from the average and '* 2' from the radians cancel out
|
||||
var averageAngleRadians = (normalAngles.X + normalAngles.Y) * float.Pi;
|
||||
_labelPivot.Rotation = averageAngleRadians;
|
||||
_textLabel.Rotation = -averageAngleRadians;
|
||||
|
||||
_textLabel.Text = regionText;
|
||||
|
||||
_index = index;
|
||||
}
|
||||
|
||||
public void HitAnimation(int regionIndex)
|
||||
{
|
||||
if(regionIndex != _index) return;
|
||||
|
||||
var tween = GetTree().CreateTween();
|
||||
tween.TweenProperty(_sliceSprite, "scale", new Vector2(1.5f, 1.5f), 0.1f);
|
||||
tween.TweenProperty(_sliceSprite, "scale", new Vector2(1f, 1f), 0.2f);
|
||||
}
|
||||
|
||||
private Color GetFillColor(MinigameController.RegionTheme theme)
|
||||
|
||||
Reference in New Issue
Block a user