From 90616537bc8cbaa65863d3436c9a4e8b37a1c571 Mon Sep 17 00:00:00 2001 From: kziolkowski Date: Sun, 18 May 2025 11:44:33 +0200 Subject: [PATCH] Watering fields --- prefabs/Player2D.tscn | 18 ++++-- prefabs/interaction_area_2d.tscn | 1 + scenes/Babushka_scene_farm_outside_2d.tscn | 47 +++++++++++---- .../CharacterControls/InteractionArea2D.cs | 7 ++- .../Common/Farming/FarmingControls2D.cs | 57 +++++++++++++++---- .../CSharp/Common/Farming/VesnaBehaviour2D.cs | 10 +++- 6 files changed, 111 insertions(+), 29 deletions(-) diff --git a/prefabs/Player2D.tscn b/prefabs/Player2D.tscn index d38d650..5f7aaaa 100644 --- a/prefabs/Player2D.tscn +++ b/prefabs/Player2D.tscn @@ -1205,7 +1205,7 @@ position = Vector2(0, 374) collision_layer = 3 collision_mask = 3 script = ExtResource("1_ssqtd") -_speed = 750.0 +_speed = 1500.0 _sprite = NodePath("visuals/Animated Sprites") [node name="CollisionShape2D" type="CollisionShape2D" parent="CharacterBody2D"] @@ -1233,7 +1233,7 @@ texture = ExtResource("292_28qer") region_enabled = true region_rect = Rect2(980, 179, 374, 1233) -[node name="WateringCan" type="Sprite2D" parent="CharacterBody2D/visuals"] +[node name="WateringCanEmpty" type="Sprite2D" parent="CharacterBody2D/visuals"] visible = false position = Vector2(-38, -603) scale = Vector2(0.5, 0.5) @@ -1241,14 +1241,24 @@ texture = ExtResource("293_tyqby") region_enabled = true region_rect = Rect2(-1, 1128, 417, 299) +[node name="WateringCanFull" type="Sprite2D" parent="CharacterBody2D/visuals"] +visible = false +modulate = Color(0.286, 0.16, 1, 1) +position = Vector2(-38, -603) +scale = Vector2(0.5, 0.5) +texture = ExtResource("293_tyqby") +region_enabled = true +region_rect = Rect2(-1, 1128, 417, 299) + [node name="Camera2D" type="Camera2D" parent="CharacterBody2D"] position = Vector2(26, -469) zoom = Vector2(0.3, 0.3) -[node name="FarmingControls" type="Node2D" parent="." node_paths=PackedStringArray("_hoeSprite", "_wateringCanSprite", "_movingPlayer", "_camera")] +[node name="FarmingControls" type="Node2D" parent="." node_paths=PackedStringArray("_hoeSprite", "_wateringCanEmptySprite", "_wateringCanFilledSprite", "_movingPlayer", "_camera")] script = ExtResource("291_31q85") _hoeSprite = NodePath("../CharacterBody2D/visuals/Hoe") -_wateringCanSprite = NodePath("../CharacterBody2D/visuals/WateringCan") +_wateringCanEmptySprite = NodePath("../CharacterBody2D/visuals/WateringCanEmpty") +_wateringCanFilledSprite = NodePath("../CharacterBody2D/visuals/WateringCanFull") _fieldPrefab = ExtResource("294_28qer") _movingPlayer = NodePath("../CharacterBody2D") _camera = NodePath("../CharacterBody2D/Camera2D") diff --git a/prefabs/interaction_area_2d.tscn b/prefabs/interaction_area_2d.tscn index 202e27a..d4d739a 100644 --- a/prefabs/interaction_area_2d.tscn +++ b/prefabs/interaction_area_2d.tscn @@ -3,6 +3,7 @@ [ext_resource type="Script" uid="uid://ckp413wrub5fm" path="res://scripts/CSharp/Common/CharacterControls/InteractionArea2D.cs" id="1_6svbd"] [sub_resource type="CircleShape2D" id="CircleShape2D_npluf"] +resource_local_to_scene = true radius = 300.0 [node name="InteractionArea" type="Node2D" node_paths=PackedStringArray("_area", "_label")] diff --git a/scenes/Babushka_scene_farm_outside_2d.tscn b/scenes/Babushka_scene_farm_outside_2d.tscn index 0f2b678..6a64d1a 100644 --- a/scenes/Babushka_scene_farm_outside_2d.tscn +++ b/scenes/Babushka_scene_farm_outside_2d.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=48 format=3 uid="uid://gigb28qk8t12"] +[gd_scene load_steps=51 format=3 uid="uid://gigb28qk8t12"] [ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/Player2D.tscn" id="1_7wfwe"] [ext_resource type="Texture2D" uid="uid://8sr11ex30n0m" path="res://art/mockups/Kenney_Backgrounds/Samples/uncolored_hills.png" id="2_7b2ri"] @@ -94,7 +94,7 @@ shader_parameter/brightness_add = 0.0 shader_parameter/contrast_mult = 0.913 [sub_resource type="RectangleShape2D" id="RectangleShape2D_p6n74"] -size = Vector2(5176, 1192) +size = Vector2(7632, 1192) [sub_resource type="ShaderMaterial" id="ShaderMaterial_2vojv"] shader = ExtResource("13_7p0hq") @@ -107,6 +107,18 @@ shader_parameter/contrast_mult = 1.398 [sub_resource type="RectangleShape2D" id="RectangleShape2D_0sfl7"] size = Vector2(728, 368) +[sub_resource type="CircleShape2D" id="CircleShape2D_p6n74"] +resource_local_to_scene = true +radius = 600.0 + +[sub_resource type="CircleShape2D" id="CircleShape2D_kxdmn"] +resource_local_to_scene = true +radius = 300.0 + +[sub_resource type="CircleShape2D" id="CircleShape2D_hukxv"] +resource_local_to_scene = true +radius = 300.0 + [node name="BabushkaSceneFarmOutside2d" type="Node2D"] [node name="ParallaxBackground" type="ParallaxBackground" parent="."] @@ -670,7 +682,7 @@ metadata/_custom_type_script = "uid://dhxtdhfqx3bte" position = Vector2(-48, -16) [node name="CollisionShape2D" type="CollisionShape2D" parent="Farm visuals/FieldParent/Area2D"] -position = Vector2(-2492, 2980) +position = Vector2(-1264, 2980) shape = SubResource("RectangleShape2D_p6n74") [node name="YSorted" type="Node2D" parent="."] @@ -696,6 +708,13 @@ offset = Vector2(0, -800) position = Vector2(116, -224) shape = SubResource("RectangleShape2D_0sfl7") +[node name="InteractionArea" parent="YSorted/Brünnen" instance=ExtResource("27_klb81")] +_id = 1 + +[node name="CollisionShape3D" parent="YSorted/Brünnen/InteractionArea/Area2D" index="0"] +position = Vector2(80, -368) +shape = SubResource("CircleShape2D_p6n74") + [node name="BaseField" parent="." instance=ExtResource("26_vbdb2")] position = Vector2(11280, 2560) @@ -713,24 +732,30 @@ position = Vector2(3264, 2120) rotation = 3.3074 _sprites = NodePath("SpriteSwitcher2d") +[node name="CollisionShape3D" parent="Hoe Pickup/Area2D" index="0"] +shape = SubResource("CircleShape2D_kxdmn") + [node name="SpriteSwitcher2d" parent="Hoe Pickup" instance=ExtResource("28_p6n74")] scale = Vector2(0.5, 0.5) [node name="Watercan Pickup" parent="." node_paths=PackedStringArray("_sprites") instance=ExtResource("27_klb81")] position = Vector2(6216, 2248) -_sprites = NodePath("SpriteSwitcher2d") +_sprites = NodePath("ActiveInactive") _id = 1 +[node name="CollisionShape3D" parent="Watercan Pickup/Area2D" index="0"] +shape = SubResource("CircleShape2D_hukxv") + [node name="Label" parent="Watercan Pickup" index="1"] z_index = 1 -[node name="SpriteSwitcher2d" parent="Watercan Pickup" instance=ExtResource("28_p6n74")] +[node name="ActiveInactive" parent="Watercan Pickup" instance=ExtResource("28_p6n74")] -[node name="ActiveSprite" parent="Watercan Pickup/SpriteSwitcher2d" index="0"] +[node name="ActiveSprite" parent="Watercan Pickup/ActiveInactive" index="0"] texture = ExtResource("29_p6n74") region_rect = Rect2(-2, 1135, 421, 292) -[node name="InactiveSprite" parent="Watercan Pickup/SpriteSwitcher2d" index="1"] +[node name="InactiveSprite" parent="Watercan Pickup/ActiveInactive" index="1"] texture = ExtResource("29_p6n74") region_rect = Rect2(1, 1138, 418, 288) @@ -738,9 +763,11 @@ region_rect = Rect2(1, 1138, 418, 288) [connection signal="mouse_exited" from="Farm visuals/FieldParent/Area2D" to="Farm visuals/FieldParent" method="MouseExitedAllowedArea"] [connection signal="PickedUpTool" from="YSorted/Player2d" to="Hoe Pickup" method="SetSpriteActiveState"] [connection signal="PickedUpTool" from="YSorted/Player2d" to="Watercan Pickup" method="SetSpriteActiveState"] -[connection signal="Interacted" from="Hoe Pickup" to="YSorted/Player2d" method="ActivateTool"] -[connection signal="Interacted" from="Watercan Pickup" to="YSorted/Player2d" method="ActivateTool"] +[connection signal="InteractedTool" from="YSorted/Brünnen/InteractionArea" to="YSorted/Player2d" method="TryFillWateringCan"] +[connection signal="InteractedTool" from="Hoe Pickup" to="YSorted/Player2d" method="ActivateTool"] +[connection signal="InteractedTool" from="Watercan Pickup" to="YSorted/Player2d" method="ActivateTool"] +[editable path="YSorted/Brünnen/InteractionArea"] [editable path="Hoe Pickup"] [editable path="Watercan Pickup"] -[editable path="Watercan Pickup/SpriteSwitcher2d"] +[editable path="Watercan Pickup/ActiveInactive"] diff --git a/scripts/CSharp/Common/CharacterControls/InteractionArea2D.cs b/scripts/CSharp/Common/CharacterControls/InteractionArea2D.cs index 2c541a3..cdeacd2 100644 --- a/scripts/CSharp/Common/CharacterControls/InteractionArea2D.cs +++ b/scripts/CSharp/Common/CharacterControls/InteractionArea2D.cs @@ -10,8 +10,8 @@ public partial class InteractionArea2D : Node2D [Export] private bool _showLabel = true; [Export] private int _id; - [Signal] - public delegate void InteractedEventHandler(int id); + [Signal] public delegate void InteractedToolEventHandler(int id); + [Signal] public delegate void InteractedEventHandler(); public void OnPlayerEntered(Node2D player) { @@ -29,7 +29,8 @@ public partial class InteractionArea2D : Node2D if (@event.IsAction("interact") && @event.IsPressed() && _area.HasOverlappingBodies()) { _label.Hide(); - EmitSignal(SignalName.Interacted, _id); + EmitSignal(SignalName.InteractedTool, _id); + EmitSignal(SignalName.Interacted); } } diff --git a/scripts/CSharp/Common/Farming/FarmingControls2D.cs b/scripts/CSharp/Common/Farming/FarmingControls2D.cs index 2f69da8..ec3c20a 100644 --- a/scripts/CSharp/Common/Farming/FarmingControls2D.cs +++ b/scripts/CSharp/Common/Farming/FarmingControls2D.cs @@ -7,14 +7,18 @@ namespace Babushka.scripts.CSharp.Common.Farming; public partial class FarmingControls2D : Node2D { [Export] private Sprite2D _hoeSprite; - [Export] private Sprite2D _wateringCanSprite; + [Export] private Sprite2D _wateringCanEmptySprite; + [Export] private Sprite2D _wateringCanFilledSprite; [Export] private PackedScene _fieldPrefab; [Export] private Node2D _movingPlayer; [Export] private Camera2D _camera; - public FieldService2D FieldParent; + public FieldService2D FieldService; private int _toolId = -1; + private bool _wateringCanFilled = false; + private int _currentWateringCanStep = 0; + private int _wateringCanCapacity = 3; #region Tools @@ -51,7 +55,16 @@ public partial class FarmingControls2D : Node2D _hoeSprite.Visible = activate; break; case 1: - _wateringCanSprite.Visible = activate; + if (activate) + { + _wateringCanEmptySprite.Visible = true; + GD.Print("Activating empty Watering can sprite."); + } + else + { + _wateringCanEmptySprite.Visible = false; + _wateringCanFilledSprite.Visible = false; + } break; default: _toolId = -1; @@ -75,32 +88,54 @@ public partial class FarmingControls2D : Node2D MakeField(adjustedPosition); } - if (@event.IsActionPressed("click") && _toolId == 1) + if (@event.IsActionPressed("click") && _toolId == 1 && _wateringCanFilled) { WaterTheField(adjustedPosition); } } + + public void FillWateringCan(bool fillUp) + { + if (_toolId == 1 ) + { + GD.Print("Watering can in hand, filling."); + _wateringCanEmptySprite.Visible = !fillUp; + _wateringCanFilledSprite.Visible = fillUp; + _wateringCanFilled = fillUp; + } + } private void WaterTheField(Vector2I fieldPosition) { - FieldBehaviour2D field = FieldParent.Get(fieldPosition); - if (field == null) + FieldBehaviour2D field = FieldService.Get(fieldPosition); + if (field == null || field.FieldState == FieldState.Watered) return; field.Water(); + + if (_currentWateringCanStep < _wateringCanCapacity) + { + _currentWateringCanStep++; + } + else + { + _currentWateringCanStep = 0; + FillWateringCan(false); + } + } private void MakeField(Vector2I fieldPosition) { - if(FieldParent == null || _fieldPrefab == null) + if(FieldService == null || _fieldPrefab == null) return; // only try to instantiate a field if you're in the allowed area - if (!FieldParent.FieldAllowed()) + if (!FieldService.FieldAllowed()) return; // only instantiate a field if there isn't one already. - if(FieldParent.Get(fieldPosition) == null) + if(FieldService.Get(fieldPosition) == null) { Node fieldInstance = _fieldPrefab.Instantiate(); if (fieldInstance is Node2D field2d) @@ -108,11 +143,11 @@ public partial class FarmingControls2D : Node2D // add dictionary entry for the field Array fields = field2d.FindChildren("*", nameof(FieldBehaviour2D)); if (fields.Count > 0) - FieldParent.TryAddEntry(fieldPosition, fields[0] as FieldBehaviour2D); + FieldService.TryAddEntry(fieldPosition, fields[0] as FieldBehaviour2D); // reposition and reparent the instance field2d.Position = new Vector2(fieldPosition.X, fieldPosition.Y);; - FieldParent.AddChild(fieldInstance); + FieldService.AddChild(fieldInstance); } } } diff --git a/scripts/CSharp/Common/Farming/VesnaBehaviour2D.cs b/scripts/CSharp/Common/Farming/VesnaBehaviour2D.cs index fbf04a7..a10e1ef 100644 --- a/scripts/CSharp/Common/Farming/VesnaBehaviour2D.cs +++ b/scripts/CSharp/Common/Farming/VesnaBehaviour2D.cs @@ -12,7 +12,7 @@ public partial class VesnaBehaviour2D : Node public override void _Ready() { - _farmingControls.FieldParent = _fieldParent; + _farmingControls.FieldService = _fieldParent; } #region Farming @@ -22,6 +22,14 @@ public partial class VesnaBehaviour2D : Node bool activated = _farmingControls.TryActivateTool(toolId); EmitSignal(SignalName.PickedUpTool, activated, toolId); } + + public void TryFillWateringCan(int toolId) + { + if (toolId == 1) + { + _farmingControls.FillWateringCan(true); + } + } #endregion } \ No newline at end of file