Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a736adaafb |
@@ -307,6 +307,11 @@ public partial class FightHappening : Node
|
|||||||
HappeningData.enemyFighterFormation.SetFighterAtPosition(emptySlotIndex, fighter);
|
HappeningData.enemyFighterFormation.SetFighterAtPosition(emptySlotIndex, fighter);
|
||||||
HappeningData.fighterTurn.AddAsLast(fighter);
|
HappeningData.fighterTurn.AddAsLast(fighter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GD.RandRange(0, 2) != 0) // 2/3 chance for vesna to start
|
||||||
|
{
|
||||||
|
HappeningData.fighterTurn.SpinBack();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ExecuteNextFighter()
|
private void ExecuteNextFighter()
|
||||||
|
|||||||
@@ -99,6 +99,23 @@ public class FighterTurn : IEnumerable<FightWorld.Fighter>
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets the current one back
|
||||||
|
/// This is an expensive operation, because the entire data structure needs to be circled
|
||||||
|
/// </summary>
|
||||||
|
public void SpinBack()
|
||||||
|
{
|
||||||
|
if (_currentNode == null) return;
|
||||||
|
|
||||||
|
var node = _currentNode;
|
||||||
|
while (node.next != _currentNode)
|
||||||
|
{
|
||||||
|
node = node.next;
|
||||||
|
}
|
||||||
|
|
||||||
|
_currentNode = node;
|
||||||
|
}
|
||||||
|
|
||||||
public IEnumerator<FightWorld.Fighter> GetEnumerator()
|
public IEnumerator<FightWorld.Fighter> GetEnumerator()
|
||||||
{
|
{
|
||||||
if (_currentNode == null) return Enumerable.Empty<FightWorld.Fighter>().GetEnumerator();
|
if (_currentNode == null) return Enumerable.Empty<FightWorld.Fighter>().GetEnumerator();
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public partial class MinigameController : Node2D
|
|||||||
God,
|
God,
|
||||||
VeryGood
|
VeryGood
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Builder<T>
|
public class Builder<T>
|
||||||
{
|
{
|
||||||
internal class Region
|
internal class Region
|
||||||
@@ -108,8 +108,6 @@ public partial class MinigameController : Node2D
|
|||||||
|
|
||||||
[Signal] public delegate void ArmMovedEventHandler(float newPos);
|
[Signal] public delegate void ArmMovedEventHandler(float newPos);
|
||||||
|
|
||||||
[Signal] public delegate void RegionHitEventHandler(int regionIndex);
|
|
||||||
|
|
||||||
public override void _EnterTree()
|
public override void _EnterTree()
|
||||||
{
|
{
|
||||||
HideMinigame();
|
HideMinigame();
|
||||||
@@ -127,7 +125,6 @@ public partial class MinigameController : Node2D
|
|||||||
ShowMinigame();
|
ShowMinigame();
|
||||||
Setup(builder);
|
Setup(builder);
|
||||||
await _minigameComplete!.Task;
|
await _minigameComplete!.Task;
|
||||||
await ToSignal(GetTree().CreateTimer(.3), "timeout");
|
|
||||||
var returnValue = _hits!.Select(h => builder.regions[h].value).ToList();
|
var returnValue = _hits!.Select(h => builder.regions[h].value).ToList();
|
||||||
Reset();
|
Reset();
|
||||||
HideMinigame();
|
HideMinigame();
|
||||||
@@ -148,7 +145,6 @@ public partial class MinigameController : Node2D
|
|||||||
}
|
}
|
||||||
|
|
||||||
_hits.Add(i);
|
_hits.Add(i);
|
||||||
EmitSignalRegionHit(i);
|
|
||||||
|
|
||||||
_armSpeed = -_armSpeed;
|
_armSpeed = -_armSpeed;
|
||||||
|
|
||||||
@@ -178,18 +174,16 @@ public partial class MinigameController : Node2D
|
|||||||
|
|
||||||
// spawn regions
|
// spawn regions
|
||||||
var regionSum = 0f;
|
var regionSum = 0f;
|
||||||
foreach (var (region, i) in builder.regions.Select((region, i) => (region, i)))
|
foreach (var region in builder.regions)
|
||||||
{
|
{
|
||||||
var regionVisual = _regionVisualPrefab.Instantiate<RegionVisual>();
|
var regionVisual = _regionVisualPrefab.Instantiate<RegionVisual>();
|
||||||
_regionsParent.AddChild(regionVisual);
|
_regionsParent.AddChild(regionVisual);
|
||||||
|
|
||||||
RegionHit += regionVisual.HitAnimation;
|
|
||||||
|
|
||||||
var normalisedAngleStart = regionSum / totalRegionProportion;
|
var normalisedAngleStart = regionSum / totalRegionProportion;
|
||||||
var normalisedAngleEnd = (regionSum + region.proportion) / totalRegionProportion;
|
var normalisedAngleEnd = (regionSum + region.proportion) / totalRegionProportion;
|
||||||
var normalAngles = new Vector2(normalisedAngleStart, normalisedAngleEnd);
|
var normalAngles = new Vector2(normalisedAngleStart, normalisedAngleEnd);
|
||||||
|
|
||||||
regionVisual.Setup(normalAngles, region.text, region.theme, i);
|
regionVisual.Setup(normalAngles, _baseRegionColor.RandomHue(), region.text, region.theme);
|
||||||
|
|
||||||
regionSum += region.proportion;
|
regionSum += region.proportion;
|
||||||
|
|
||||||
@@ -213,13 +207,6 @@ public partial class MinigameController : Node2D
|
|||||||
{
|
{
|
||||||
_minigameComplete = null;
|
_minigameComplete = null;
|
||||||
_hits = null;
|
_hits = null;
|
||||||
_regionsParent.GetChildren().ForEach(c =>
|
_regionsParent.GetChildren().ForEach(c => c.QueueFree());
|
||||||
{
|
|
||||||
if (c is RegionVisual rv)
|
|
||||||
{
|
|
||||||
RegionHit -= rv.HitAnimation;
|
|
||||||
}
|
|
||||||
c.QueueFree();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,42 +1,27 @@
|
|||||||
using System;
|
|
||||||
using Godot;
|
using Godot;
|
||||||
|
using System;
|
||||||
|
using Babushka.scripts.CSharp.Common.Minigame;
|
||||||
using Godot.Collections;
|
using Godot.Collections;
|
||||||
|
|
||||||
namespace Babushka.scripts.CSharp.Common.Minigame;
|
|
||||||
|
|
||||||
public partial class RegionVisual : Node
|
public partial class RegionVisual : Node
|
||||||
{
|
{
|
||||||
[Export] private Sprite2D _sliceSprite = null!;
|
[Export] private Sprite2D _sliceSprite;
|
||||||
[Export] private Label _textLabel = null!;
|
[Export] private Label _textLabel;
|
||||||
[Export] private Node2D _labelPivot = null!;
|
[Export] private Node2D _labelPivot;
|
||||||
|
|
||||||
[Export(PropertyHint.DictionaryType)] private Dictionary<MinigameController.RegionTheme, Color> _fillColors = new();
|
[Export(PropertyHint.DictionaryType)] private Dictionary<MinigameController.RegionTheme, Color> _fillColors = new();
|
||||||
|
|
||||||
private int _index;
|
public void Setup(Vector2 normalAngles, Color color, string regionText, MinigameController.RegionTheme regionTheme)
|
||||||
|
|
||||||
public void Setup(Vector2 normalAngles, string regionText, MinigameController.RegionTheme regionTheme, int index)
|
|
||||||
{
|
{
|
||||||
var mat = (_sliceSprite.Material as ShaderMaterial)!;
|
var mat = (_sliceSprite.Material as ShaderMaterial)!;
|
||||||
mat.SetShaderParameter("angles", normalAngles);
|
mat.SetShaderParameter("angles", normalAngles);
|
||||||
mat.SetShaderParameter("fillColor", GetFillColor(regionTheme));
|
mat.SetShaderParameter("fillColor", GetFillColor(regionTheme));
|
||||||
|
|
||||||
// '/ 2' from the average and '* 2' from the radians cancel out
|
var averageAngleRadians = (normalAngles.X + normalAngles.Y) * float.Pi; // '/ 2' from the average and '* 2' from the radians cancel out
|
||||||
var averageAngleRadians = (normalAngles.X + normalAngles.Y) * float.Pi;
|
|
||||||
_labelPivot.Rotation = averageAngleRadians;
|
_labelPivot.Rotation = averageAngleRadians;
|
||||||
_textLabel.Rotation = -averageAngleRadians;
|
_textLabel.Rotation = -averageAngleRadians;
|
||||||
|
|
||||||
_textLabel.Text = regionText;
|
_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)
|
private Color GetFillColor(MinigameController.RegionTheme theme)
|
||||||
|
|||||||
Reference in New Issue
Block a user