Added theme-based region colors

test/music_setup
jonathan 3 months ago
parent 7d35c991f3
commit 224863f891

@ -21,6 +21,16 @@ script = ExtResource("1_4ymj8")
_sliceSprite = NodePath("Sprite2D") _sliceSprite = NodePath("Sprite2D")
_textLabel = NodePath("LabelPivot/Label") _textLabel = NodePath("LabelPivot/Label")
_labelPivot = NodePath("LabelPivot") _labelPivot = NodePath("LabelPivot")
_fillColors = Dictionary[int, Color]({
0: Color(0.427493, 0.427493, 0.427493, 1),
1: Color(0.675735, 0.105671, 0.0799616, 1),
2: Color(0.645128, 0.346481, 0.215967, 1),
3: Color(0.754619, 0.665655, 0.384568, 1),
4: Color(0.365769, 0.400285, 0.598083, 1),
5: Color(0.222174, 0.457454, 0.45483, 1),
6: Color(0.316126, 0.448834, 0.312852, 1),
7: Color(0.244391, 0.640687, 0.283315, 1)
})
[node name="Sprite2D" type="Sprite2D" parent="."] [node name="Sprite2D" type="Sprite2D" parent="."]
material = SubResource("ShaderMaterial_86pvs") material = SubResource("ShaderMaterial_86pvs")

@ -25,12 +25,12 @@ public partial class FightMinigameHandler : Node
if(currentDetail is not MinigameActionDetail minigameDetail) return; if(currentDetail is not MinigameActionDetail minigameDetail) return;
_minigameController.Run(new MinigameController.Builder<int>() _minigameController.Run(new MinigameController.Builder<int>()
.AddRegion(4).RegionWithText("4") .AddRegion(4).RegionWithText("4").RegionWithTheme(MinigameController.RegionTheme.Normal)
.AddRegion(0).RegionWithProportion(1.5f).RegionWithText("0") .AddRegion(0).RegionWithProportion(1.5f).RegionWithText("0").RegionWithTheme(MinigameController.RegionTheme.Bad)
.AddRegion(8).RegionWithProportion(0.5f).RegionWithText("8") .AddRegion(8).RegionWithProportion(0.5f).RegionWithText("8").RegionWithTheme(MinigameController.RegionTheme.VeryGood)
.AddRegion(0).RegionWithProportion(1.5f).RegionWithText("0") .AddRegion(0).RegionWithProportion(1.5f).RegionWithText("0").RegionWithTheme(MinigameController.RegionTheme.Bad)
.AddRegion(3).RegionWithText("3") .AddRegion(3).RegionWithText("3").RegionWithTheme(MinigameController.RegionTheme.NormalAlt1)
.AddRegion(5).RegionWithText("5") .AddRegion(5).RegionWithText("5").RegionWithTheme(MinigameController.RegionTheme.NormalAlt2)
.WithHitCount(3) .WithHitCount(3)
).ContinueWith(task => ).ContinueWith(task =>
{ {

@ -10,6 +10,18 @@ namespace Babushka.scripts.CSharp.Common.Minigame;
public partial class MinigameController : Node2D public partial class MinigameController : Node2D
{ {
public enum RegionTheme
{
Disabled,
VeryBad,
Bad,
Normal,
NormalAlt1,
NormalAlt2,
God,
VeryGood
}
public class Builder<T> public class Builder<T>
{ {
internal class Region internal class Region
@ -17,6 +29,7 @@ public partial class MinigameController : Node2D
public required T value; public required T value;
public float proportion = 1f; public float proportion = 1f;
public string text = ""; public string text = "";
public RegionTheme theme = RegionTheme.Normal;
} }
public enum DoubleHitHandling public enum DoubleHitHandling
@ -46,7 +59,7 @@ public partial class MinigameController : Node2D
regions.Last().proportion = proportion; regions.Last().proportion = proportion;
return this; return this;
} }
public Builder<T> RegionWithText(string text) public Builder<T> RegionWithText(string text)
{ {
if (regions.Count == 0) if (regions.Count == 0)
@ -56,6 +69,15 @@ public partial class MinigameController : Node2D
return this; return this;
} }
public Builder<T> RegionWithTheme(RegionTheme theme)
{
if (regions.Count == 0)
throw new InvalidOperationException("No region to set theme for");
regions.Last().theme = theme;
return this;
}
// general settings // general settings
public Builder<T> WithDoubleHitHandling(DoubleHitHandling handling) public Builder<T> WithDoubleHitHandling(DoubleHitHandling handling)
{ {
@ -161,7 +183,7 @@ public partial class MinigameController : Node2D
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, _baseRegionColor.RandomHue(),region.text); regionVisual.Setup(normalAngles, _baseRegionColor.RandomHue(), region.text, region.theme);
regionSum += region.proportion; regionSum += region.proportion;

@ -1,5 +1,7 @@
using Godot; using Godot;
using System; using System;
using Babushka.scripts.CSharp.Common.Minigame;
using Godot.Collections;
public partial class RegionVisual : Node public partial class RegionVisual : Node
{ {
@ -7,17 +9,19 @@ public partial class RegionVisual : Node
[Export] private Label _textLabel; [Export] private Label _textLabel;
[Export] private Node2D _labelPivot; [Export] private Node2D _labelPivot;
[Export(PropertyHint.DictionaryType)] private Dictionary<MinigameController.RegionTheme, Color> _fillColors = new();
public override void _EnterTree() public override void _EnterTree()
{ {
//_sliceSprite.Material = new Material() //_sliceSprite.Material = new Material()
} }
public void Setup(Vector2 normalAngles, Color color, string regionText) public void Setup(Vector2 normalAngles, Color color, string regionText, MinigameController.RegionTheme regionTheme)
{ {
var mat = (_sliceSprite.Material as ShaderMaterial)!; var mat = (_sliceSprite.Material as ShaderMaterial)!;
mat.SetShaderParameter("angles", normalAngles); mat.SetShaderParameter("angles", normalAngles);
mat.SetShaderParameter("fillColor", color); mat.SetShaderParameter("fillColor", GetFillColor(regionTheme));
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; // '/ 2' from the average and '* 2' from the radians cancel out
_labelPivot.Rotation = averageAngleRadians; _labelPivot.Rotation = averageAngleRadians;
@ -25,4 +29,10 @@ public partial class RegionVisual : Node
_textLabel.Text = regionText; _textLabel.Text = regionText;
} }
private Color GetFillColor(MinigameController.RegionTheme theme)
{
if (_fillColors.TryGetValue(theme, out var color)) return color;
throw new InvalidOperationException($"No fill color for theme {theme}");
}
} }
Loading…
Cancel
Save