From 0ecae5a4d9037dbbc7d70b1106438861989c0700 Mon Sep 17 00:00:00 2001 From: kziolkowski Date: Wed, 3 Dec 2025 17:04:38 +0100 Subject: [PATCH] :sparkles: watering can fillstate is saving and loading --- prefabs/characters/Vesna.tscn | 78 +++++++++++++------ .../Common/Farming/FarmingControls2D.cs | 2 - .../Common/Farming/WateringCanSaveHelper.cs | 33 ++++++++ .../Farming/WateringCanSaveHelper.cs.uid | 1 + .../CSharp/Common/Farming/WateringCanState.cs | 11 +++ .../Variables/SaveableVariableNode.cs | 6 +- 6 files changed, 103 insertions(+), 28 deletions(-) create mode 100644 scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs create mode 100644 scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs.uid diff --git a/prefabs/characters/Vesna.tscn b/prefabs/characters/Vesna.tscn index cff4237..b8070d8 100644 --- a/prefabs/characters/Vesna.tscn +++ b/prefabs/characters/Vesna.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=485 format=3 uid="uid://c25udixd5m6l0"] +[gd_scene load_steps=489 format=3 uid="uid://c25udixd5m6l0"] [ext_resource type="Script" uid="uid://b05uyj001ehwi" path="res://scripts/CSharp/Common/Farming/VesnaBehaviour2D.cs" id="1_yd5ep"] [ext_resource type="Script" uid="uid://cjbclkxesh3hc" path="res://scripts/CSharp/Common/CharacterControls/PlayerMovement.cs" id="2_1vqmv"] @@ -283,6 +283,7 @@ [ext_resource type="Resource" uid="uid://tt3d166mntmi" path="res://resources/low code/farming/var_sceneNameProvider.tres" id="471_83c4i"] [ext_resource type="AudioStream" uid="uid://fihv17va3r58" path="res://audio/sfx/Footsteps/Single/Gravel/Reverb/SFX_Footstep_Gravel_02_R.wav" id="471_e04c3"] [ext_resource type="AudioStream" uid="uid://cvvjd2i6x047n" path="res://audio/sfx/Footsteps/Single/Gravel/Reverb/SFX_Footstep_Gravel_03_R.wav" id="472_g32y8"] +[ext_resource type="Script" uid="uid://dj1qjambsa4pg" path="res://scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs" id="472_kduih"] [ext_resource type="Texture2D" uid="uid://blh0t2ofqj2uq" path="res://art/animation/Vesna2D/Vesna Anims Tools/F01-Idle-Gießkanne/0016.png" id="472_wdxsr"] [ext_resource type="AudioStream" uid="uid://dymoalptxmge" path="res://audio/sfx/Footsteps/Single/Gravel/Reverb/SFX_Footstep_Gravel_04_R.wav" id="473_8hbu5"] [ext_resource type="AudioStream" uid="uid://4555a4w30tda" path="res://audio/sfx/Footsteps/Single/Gravel/Reverb/SFX_Footstep_Gravel_05_R.wav" id="474_t1d6r"] @@ -294,8 +295,11 @@ [ext_resource type="Texture2D" uid="uid://dqubvx1a08kn4" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0002.png" id="478_5myrm"] [ext_resource type="Texture2D" uid="uid://dystt4hyqad74" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0004.png" id="480_wnay3"] [ext_resource type="Resource" uid="uid://cmqapbvv0hev2" path="res://resources/low code/farming/event_watering.tres" id="481_t1d6r"] +[ext_resource type="Script" uid="uid://d27xoo1reo5gu" path="res://scripts/CSharp/Low Code/Variables/SaveableVariableNode.cs" id="482_0ptfk"] [ext_resource type="Texture2D" uid="uid://bopxv06co1osl" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0006.png" id="482_wfdif"] +[ext_resource type="Script" uid="uid://iquhbkr7pqeg" path="res://scripts/CSharp/Common/Savegame/SaveCheats.cs" id="483_kduih"] [ext_resource type="Texture2D" uid="uid://coyggdfwgkeru" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0008.png" id="484_32thn"] +[ext_resource type="Script" uid="uid://ca4s0algeij1h" path="res://scripts/CSharp/Common/Savegame/SaveIDProviderTool.cs" id="484_upuan"] [ext_resource type="Texture2D" uid="uid://du6x1h42smp6m" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0010.png" id="486_kobao"] [ext_resource type="Texture2D" uid="uid://bras5gn8ov27l" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0012.png" id="488_ygjj5"] [ext_resource type="Texture2D" uid="uid://rjmsht4g8dvp" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0014.png" id="490_6603x"] @@ -2119,38 +2123,57 @@ frame = 7 frame_progress = 0.229832 offset = Vector2(0, -450) -[node name="WateringCanUI" type="Node2D" parent="CharacterBody2D" node_paths=PackedStringArray("_slider")] -position = Vector2(0, -929) +[node name="DetectionCross" parent="CharacterBody2D" instance=ExtResource("466_e04c3")] +position = Vector2(0, -200) + +[node name="PlantCreatedEventListener" type="Node" parent="CharacterBody2D"] +script = ExtResource("467_8hbu5") +_eventResources = Array[Object]([ExtResource("468_t1d6r")]) + +[node name="PickedUpInteractableListener" type="Node" parent="CharacterBody2D"] +script = ExtResource("467_8hbu5") +_eventResources = Array[Object]([ExtResource("469_t1d6r")]) + +[node name="WateringCan" type="Node2D" parent="CharacterBody2D"] + +[node name="WateringCanFillState" type="Node" parent="CharacterBody2D/WateringCan" groups=["Saveable"]] +script = ExtResource("482_0ptfk") +Payload = 0 +metadata/SaveID = "2d2f153b-8a09-45a9-b114-79259c833f9f" + +[node name="WateringEventListener" type="Node" parent="CharacterBody2D/WateringCan"] +script = ExtResource("467_8hbu5") +_eventResources = Array[Object]([ExtResource("481_t1d6r")]) + +[node name="WateringCanUI" type="Node2D" parent="CharacterBody2D/WateringCan" node_paths=PackedStringArray("_slider")] +position = Vector2(0, -939) scale = Vector2(2, 2) script = ExtResource("467_j4m0f") _slider = NodePath("HSlider") -[node name="HSlider" type="HSlider" parent="CharacterBody2D/WateringCanUI"] +[node name="HSlider" type="HSlider" parent="CharacterBody2D/WateringCan/WateringCanUI"] visible = false modulate = Color(0.3515, 0.780425, 0.95, 1) custom_minimum_size = Vector2(150, 50) anchors_preset = 5 anchor_left = 0.5 anchor_right = 0.5 -offset_left = -43.0 -offset_right = 57.0 -offset_bottom = 64.0 +offset_left = -115.0 +offset_top = -33.999996 +offset_right = 35.0 +offset_bottom = 30.000004 grow_horizontal = 2 +scale = Vector2(1.4200003, 2.5611823) +size_flags_horizontal = 3 +size_flags_vertical = 2 max_value = 1.0 step = 0.0 editable = false scrollable = false -[node name="DetectionCross" parent="CharacterBody2D" instance=ExtResource("466_e04c3")] -position = Vector2(0, -200) - -[node name="PlantCreatedEventListener" type="Node" parent="CharacterBody2D"] -script = ExtResource("467_8hbu5") -_eventResources = Array[Object]([ExtResource("468_t1d6r")]) - -[node name="PickedUpInteractableListener" type="Node" parent="CharacterBody2D"] -script = ExtResource("467_8hbu5") -_eventResources = Array[Object]([ExtResource("469_t1d6r")]) +[node name="WateringCanSaveHelper" type="Node" parent="CharacterBody2D/WateringCan" node_paths=PackedStringArray("_wateringCanFillStateNode")] +script = ExtResource("472_kduih") +_wateringCanFillStateNode = NodePath("../WateringCanFillState") [node name="FarmingControls" type="Node2D" parent="." node_paths=PackedStringArray("_movingPlayer")] script = ExtResource("817_6nrw3") @@ -2174,18 +2197,23 @@ script = ExtResource("471_2f15g") [node name="Timer" type="Timer" parent="SFX/FootstepsAudio"] wait_time = 0.5 -[node name="WateringEventListener" type="Node" parent="."] -script = ExtResource("467_8hbu5") -_eventResources = Array[Object]([ExtResource("481_t1d6r")]) +[node name="SaveSystem" type="Node" parent="."] + +[node name="SaveGameCheat" type="Node" parent="SaveSystem"] +script = ExtResource("483_kduih") + +[node name="SaveIDProvider" type="Node" parent="SaveSystem"] +script = ExtResource("484_upuan") -[connection signal="FilledWateringCan" from="." to="CharacterBody2D/WateringCanUI" method="Refill"] -[connection signal="InventorySelectionChanged" from="." to="CharacterBody2D/WateringCanUI" method="IsWateringCanActive"] +[connection signal="FilledWateringCan" from="." to="CharacterBody2D/WateringCan/WateringCanUI" method="Refill"] +[connection signal="InventorySelectionChanged" from="." to="CharacterBody2D/WateringCan/WateringCanUI" method="IsWateringCanActive"] [connection signal="PickedUpTool" from="." to="CharacterBody2D/visuals" method="ActivateTool"] -[connection signal="PickedUpTool" from="." to="CharacterBody2D/WateringCanUI" method="IsWateringCanActive"] +[connection signal="PickedUpTool" from="." to="CharacterBody2D/WateringCan/WateringCanUI" method="IsWateringCanActive"] [connection signal="LookDirection" from="CharacterBody2D/visuals" to="CharacterBody2D/DetectionCross" method="SetDirection"] [connection signal="EventRaised" from="CharacterBody2D/PlantCreatedEventListener" to="CharacterBody2D/visuals" method="PlayFarmingAnimation"] [connection signal="EventRaised" from="CharacterBody2D/PickedUpInteractableListener" to="CharacterBody2D/visuals" method="PlayPickUpAnimation"] +[connection signal="OnLoadingComplete" from="CharacterBody2D/WateringCan/WateringCanFillState" to="CharacterBody2D/WateringCan/WateringCanSaveHelper" method="OnLoad"] +[connection signal="EventRaised" from="CharacterBody2D/WateringCan/WateringEventListener" to="CharacterBody2D/visuals" method="PlayWateringAnimation"] +[connection signal="EventRaised" from="CharacterBody2D/WateringCan/WateringEventListener" to="CharacterBody2D/WateringCan/WateringCanUI" method="Water"] [connection signal="timelineStarted" from="DialogicToggle" to="SFX/FootstepsAudio/Timer" method="stop"] [connection signal="timeout" from="SFX/FootstepsAudio/Timer" to="SFX/FootstepsAudio" method="PlayOneShot"] -[connection signal="EventRaised" from="WateringEventListener" to="CharacterBody2D/visuals" method="PlayWateringAnimation"] -[connection signal="EventRaised" from="WateringEventListener" to="CharacterBody2D/WateringCanUI" method="Water"] diff --git a/scripts/CSharp/Common/Farming/FarmingControls2D.cs b/scripts/CSharp/Common/Farming/FarmingControls2D.cs index 10014e5..163f07e 100644 --- a/scripts/CSharp/Common/Farming/FarmingControls2D.cs +++ b/scripts/CSharp/Common/Farming/FarmingControls2D.cs @@ -1,7 +1,5 @@ -using System; using Babushka.scripts.CSharp.Low_Code.Variables; using Godot; -using Godot.Collections; namespace Babushka.scripts.CSharp.Common.Farming; diff --git a/scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs b/scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs new file mode 100644 index 0000000..0086a57 --- /dev/null +++ b/scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs @@ -0,0 +1,33 @@ +using Babushka.scripts.CSharp.Low_Code.Variables; +using Godot; + +namespace Babushka.scripts.CSharp.Common.Farming; + +public partial class WateringCanSaveHelper : Node +{ + [Export] private SaveableVariableNode _wateringCanFillStateNode; + + public override void _EnterTree() + { + WateringCanState.OnFill += SetFillState; + WateringCanState.OnWater += SetFillState; + } + + public override void _ExitTree() + { + WateringCanState.OnFill -= SetFillState; + WateringCanState.OnWater -= SetFillState; + } + + + public void SetFillState() + { + _wateringCanFillStateNode.Payload = WateringCanState.GetFillState(); + } + + private void OnLoad() + { + WateringCanState.SetFillState(_wateringCanFillStateNode.Payload.AsInt32()); + } + +} \ No newline at end of file diff --git a/scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs.uid b/scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs.uid new file mode 100644 index 0000000..da908bc --- /dev/null +++ b/scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs.uid @@ -0,0 +1 @@ +uid://dj1qjambsa4pg diff --git a/scripts/CSharp/Common/Farming/WateringCanState.cs b/scripts/CSharp/Common/Farming/WateringCanState.cs index cc6bdaf..359ee6f 100644 --- a/scripts/CSharp/Common/Farming/WateringCanState.cs +++ b/scripts/CSharp/Common/Farming/WateringCanState.cs @@ -29,6 +29,7 @@ public static class WateringCanState public delegate void WateringCanDelegate(bool state); public static event WateringCanDelegate WateringCanActiveStateChanged; public static event Action? OnWater; + public static event Action? OnFill; @@ -38,6 +39,7 @@ public static class WateringCanState public static void Fill() { _fillstate = MAX_FILLSTATE; + OnFill?.Invoke(); } /// @@ -69,6 +71,15 @@ public static class WateringCanState return _fillstate; } + /// + /// Public setter. Used for saving and loading. + /// + /// + public static void SetFillState(int fillstate) + { + _fillstate = fillstate; + } + /// /// Sets the Active state of the watering can, i.e. if it is currently in hand and if the ui should be active. /// diff --git a/scripts/CSharp/Low Code/Variables/SaveableVariableNode.cs b/scripts/CSharp/Low Code/Variables/SaveableVariableNode.cs index 56d7628..4836f63 100644 --- a/scripts/CSharp/Low Code/Variables/SaveableVariableNode.cs +++ b/scripts/CSharp/Low Code/Variables/SaveableVariableNode.cs @@ -1,4 +1,3 @@ -using Babushka.scripts.CSharp.Common.Inventory; using Babushka.scripts.CSharp.Common.Savegame; using Godot; using Godot.Collections; @@ -9,6 +8,9 @@ public partial class SaveableVariableNode : VariableNode, ISaveable { [Export] private bool _debug; + [Signal] + public delegate void OnLoadingCompleteEventHandler(); + public override void _EnterTree() { LoadFromSaveData(); @@ -60,5 +62,7 @@ public partial class SaveableVariableNode : VariableNode, ISaveable GD.Print($"SaveableVariable {Name} loaded payload: {Payload}."); } } + + EmitSignal(SignalName.OnLoadingComplete); } } \ No newline at end of file