Compare commits

..

1 Commits

Author SHA1 Message Date
kziolkowski 996470f5e6 🐛 fixed beets double spawning bug 2025-12-04 23:45:35 +01:00
7 changed files with 46 additions and 89 deletions
@@ -54,7 +54,6 @@ _minigameController = NodePath("Minigame")
[node name="Minigame" parent="MinigameHandler" instance=ExtResource("8_2b3cf")] [node name="Minigame" parent="MinigameHandler" instance=ExtResource("8_2b3cf")]
process_mode = 4 process_mode = 4
visible = false visible = false
position = Vector2(23, -29)
[node name="SwitchSceneOnFightEnd" type="Node" parent="." node_paths=PackedStringArray("_fightSceneSwitcher")] [node name="SwitchSceneOnFightEnd" type="Node" parent="." node_paths=PackedStringArray("_fightSceneSwitcher")]
script = ExtResource("10_qqd8u") script = ExtResource("10_qqd8u")
+8
View File
@@ -1760,6 +1760,7 @@ metadata/SaveID = "7a8210bf-479d-4b4c-9758-98d23e59d5d7"
[node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")] [node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")]
_state = 2 _state = 2
_field = NodePath("../..") _field = NodePath("../..")
_daysWatered = 6
[node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField" index="7"] [node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField" index="7"]
visible = false visible = false
@@ -1780,6 +1781,7 @@ metadata/SaveID = "a1d8a0a2-c51c-4410-83c3-0edb31cbf2de"
[node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField2/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")] [node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField2/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")]
_state = 2 _state = 2
_field = NodePath("../..") _field = NodePath("../..")
_daysWatered = 6
[node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField2" index="7"] [node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField2" index="7"]
visible = false visible = false
@@ -1800,6 +1802,7 @@ metadata/SaveID = "79a65532-cb2b-4268-8eb0-8c41a3935cbb"
[node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField3/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")] [node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField3/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")]
_state = 2 _state = 2
_field = NodePath("../..") _field = NodePath("../..")
_daysWatered = 5
[node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField3" index="7"] [node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField3" index="7"]
visible = false visible = false
@@ -1821,6 +1824,7 @@ metadata/SaveID = "13fa64a3-01dc-4fd8-822e-0839c0da3163"
[node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField4/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")] [node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField4/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")]
_state = 2 _state = 2
_field = NodePath("../..") _field = NodePath("../..")
_daysWatered = 7
[node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField4" index="7"] [node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField4" index="7"]
visible = false visible = false
@@ -1842,6 +1846,7 @@ metadata/SaveID = "414ecdb9-f3c4-4fb9-81bd-6ca575784f78"
[node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField5/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")] [node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField5/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")]
_state = 2 _state = 2
_field = NodePath("../..") _field = NodePath("../..")
_daysWatered = 6
[node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField5" index="7"] [node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField5" index="7"]
visible = false visible = false
@@ -1863,6 +1868,7 @@ metadata/SaveID = "b235febb-b231-4f8c-94e9-1f9d9f115b08"
[node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField6/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")] [node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField6/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")]
_state = 1 _state = 1
_field = NodePath("../..") _field = NodePath("../..")
_daysWatered = 5
[node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField6" index="7"] [node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField6" index="7"]
visible = false visible = false
@@ -1884,6 +1890,7 @@ metadata/SaveID = "9ccdba91-812a-4c13-9ee0-12472e174fc9"
[node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField7/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")] [node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField7/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")]
_state = 2 _state = 2
_field = NodePath("../..") _field = NodePath("../..")
_daysWatered = 6
[node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField7" index="7"] [node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField7" index="7"]
visible = false visible = false
@@ -1905,6 +1912,7 @@ metadata/SaveID = "da44e54a-0b76-4888-ad8b-782a9d146fa3"
[node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField8/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")] [node name="Beet2" parent="YSorted/Farm visuals/FieldParent/BaseField8/FieldBehaviour/PlantPlaceholder" index="0" node_paths=PackedStringArray("_field") instance=ExtResource("41_vyqmy")]
_state = 2 _state = 2
_field = NodePath("../..") _field = NodePath("../..")
_daysWatered = 6
[node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField8" index="7"] [node name="FieldActivator" parent="YSorted/Farm visuals/FieldParent/BaseField8" index="7"]
visible = false visible = false
@@ -244,6 +244,9 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
Dictionary<string, Variant> save = SavegameService.GetSaveData(id); Dictionary<string, Variant> save = SavegameService.GetSaveData(id);
// if we already have a plant, don't instantiate another one
int plantCount = PlantingPlaceholder.GetChildCount();
if (save.Count > 0) if (save.Count > 0)
{ {
// get plant first because it's also relevant for the field state // get plant first because it's also relevant for the field state
@@ -253,12 +256,16 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
if (plantDataDict.TryGetValue("prefab_path", out Variant prefabPathVar)) if (plantDataDict.TryGetValue("prefab_path", out Variant prefabPathVar))
{ {
if(plantCount == 0)
InstantiatePlant(prefabPathVar.AsString()); InstantiatePlant(prefabPathVar.AsString());
else
_currentPlant = PlantingPlaceholder.GetChild(0) as PlantBehaviour2D;
} }
else else
{ {
return; return;
} }
if (plantDataDict.TryGetValue("plant_start_day", out Variant plantStartDay) && _currentPlant != null) if (plantDataDict.TryGetValue("plant_start_day", out Variant plantStartDay) && _currentPlant != null)
{ {
_currentPlant.DayPlanted = plantStartDay.AsInt32(); _currentPlant.DayPlanted = plantStartDay.AsInt32();
@@ -27,6 +27,7 @@ public partial class PlantBehaviour2D : Node2D
[ExportGroup("PlantConfig")] [ExportGroup("PlantConfig")]
[Export] private string _prefabPath; [Export] private string _prefabPath;
[Export] private VariableNode _lifecycle; [Export] private VariableNode _lifecycle;
[Export] private int _daysWatered;
private string _magicWordDialogicEventName = "MagicWord"; private string _magicWordDialogicEventName = "MagicWord";
private Sprite2D? _currentPlantSprite = null; private Sprite2D? _currentPlantSprite = null;
@@ -34,7 +35,6 @@ public partial class PlantBehaviour2D : Node2D
private bool _calledOnReady = false; private bool _calledOnReady = false;
private int _dayPlanted; private int _dayPlanted;
private int _currentDay; private int _currentDay;
private int _daysWatered;
public PlantState State public PlantState State
{ {
@@ -1,44 +1,36 @@
using Godot;
using System;
using System.Collections.Generic; 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.Fight.ActionDetails;
using Babushka.scripts.CSharp.Common.Minigame; 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 public partial class FightMinigameHandler : Node
{ {
#region Shortcuts #region Shortcuts
private FightWorld.FightHappeningData HappeningData => private FightWorld.FightHappeningData HappeningData => FightWorld.Instance.fightHappeningData ?? throw new NoFightHappeningException();
FightWorld.Instance.fightHappeningData ?? throw new NoFightHappeningException();
#endregion #endregion
[Export] private MinigameController _minigameController = null!; [Export] private MinigameController _minigameController;
public void OnStateEnter(FightHappening.FightState to) public void OnStateEnter(FightHappening.FightState to)
{ {
if (to != FightHappening.FightState.InputActionDetail) return; if(to!=FightHappening.FightState.InputActionDetail) return;
var currentDetail = HappeningData.actionStaging!.CurrentDetail(); var currentDetail = HappeningData.actionStaging!.CurrentDetail();
if (currentDetail is not MinigameActionDetail minigameDetail) return; 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>() _minigameController.Run(new MinigameController.Builder<int>()
.AddRegion(region1).RegionWithProportion(R(0.7, 1.3)).RegionWithText(region1.ToString()).RegionWithTheme(Normal) .AddRegion(4).RegionWithText("4").RegionWithTheme(MinigameController.RegionTheme.Normal)
.AddRegion(region2).RegionWithProportion(R(1, 1.8)).RegionWithText(region2.ToString()).RegionWithTheme(Bad) .AddRegion(0).RegionWithProportion(1.5f).RegionWithText("0").RegionWithTheme(MinigameController.RegionTheme.Bad)
.AddRegion(region3).RegionWithProportion(R(0.3, 1)).RegionWithText(region3.ToString()).RegionWithTheme(VeryGood) .AddRegion(8).RegionWithProportion(0.5f).RegionWithText("8").RegionWithTheme(MinigameController.RegionTheme.VeryGood)
.AddRegion(region4).RegionWithProportion(R(1, 1.8)).RegionWithText(region4.ToString()).RegionWithTheme(Bad) .AddRegion(0).RegionWithProportion(1.5f).RegionWithText("0").RegionWithTheme(MinigameController.RegionTheme.Bad)
.AddRegion(region5).RegionWithProportion(R(0.7, 1.3)).RegionWithText(region5.ToString()).RegionWithTheme(NormalAlt1) .AddRegion(3).RegionWithText("3").RegionWithTheme(MinigameController.RegionTheme.NormalAlt1)
.AddRegion(region6).RegionWithProportion(R(0.7, 1.3)).RegionWithText(region6.ToString()).RegionWithTheme(NormalAlt2) .AddRegion(5).RegionWithText("5").RegionWithTheme(MinigameController.RegionTheme.NormalAlt2)
.WithHitCount(3) .WithHitCount(3)
).ContinueWith(task => ).ContinueWith(task =>
{ {
@@ -48,25 +40,4 @@ public partial class FightMinigameHandler : Node
FightHappening.Instance.CallDeferred("DetailFilled"); 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
} }
@@ -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();
});
} }
} }
+7 -22
View File
@@ -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)