Finalized new watering can mechanic with vfx and ui
This commit is contained in:
@@ -2071,13 +2071,14 @@ script = ExtResource("1_yd5ep")
|
||||
_farmingControls = NodePath("FarmingControls")
|
||||
_player2d = NodePath("CharacterBody2D")
|
||||
|
||||
[node name="CharacterBody2D" type="CharacterBody2D" parent="." node_paths=PackedStringArray("_sprite") groups=["PlantGrowing"]]
|
||||
[node name="CharacterBody2D" type="CharacterBody2D" parent="." node_paths=PackedStringArray("_sprite", "_wateringParticles") groups=["PlantGrowing"]]
|
||||
position = Vector2(0, 374)
|
||||
collision_layer = 4
|
||||
collision_mask = 3
|
||||
script = ExtResource("2_1vqmv")
|
||||
_speed = 1500.0
|
||||
_sprite = NodePath("visuals/Animated Sprites")
|
||||
_wateringParticles = NodePath("../pouring water vfx")
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="CharacterBody2D"]
|
||||
z_index = 1
|
||||
@@ -2166,16 +2167,37 @@ visible = false
|
||||
position = Vector2(3, 12)
|
||||
texture = ExtResource("473_g32y8")
|
||||
|
||||
[node name="FarmingControls" type="Node2D" parent="." node_paths=PackedStringArray("_movingPlayer", "_camera")]
|
||||
[node name="FarmingControls" type="Node2D" parent="." node_paths=PackedStringArray("_movingPlayer", "_camera", "_wateringParticles")]
|
||||
script = ExtResource("817_6nrw3")
|
||||
_fieldPrefab = ExtResource("818_16w6h")
|
||||
_movingPlayer = NodePath("../CharacterBody2D")
|
||||
_camera = NodePath("../CharacterBody2D/Camera2D")
|
||||
_wateringParticles = NodePath("../pouring water vfx")
|
||||
_wateringCanParticlesVerticalOffset = -100.0
|
||||
|
||||
[node name="dialogic toggle" type="Node2D" parent="."]
|
||||
position = Vector2(0, 374)
|
||||
script = ExtResource("819_4na52")
|
||||
|
||||
[node name="pouring water vfx" type="CPUParticles2D" parent="."]
|
||||
position = Vector2(-652, -599)
|
||||
rotation = -0.333807
|
||||
emitting = false
|
||||
amount = 20
|
||||
texture = ExtResource("473_g32y8")
|
||||
lifetime = 0.5
|
||||
randomness = 1.0
|
||||
local_coords = true
|
||||
draw_order = 1
|
||||
emission_shape = 2
|
||||
emission_sphere_radius = 128.0
|
||||
linear_accel_min = 44.07
|
||||
linear_accel_max = 78.81
|
||||
scale_amount_min = 0.4
|
||||
scale_amount_max = 0.8
|
||||
color = Color(0.400601, 0.62444, 0.791217, 1)
|
||||
hue_variation_max = 0.4
|
||||
|
||||
[connection signal="FilledWateringCan" from="." to="CharacterBody2D/WateringCanUI" method="Refill"]
|
||||
[connection signal="InventorySelectionChanged" from="." to="CharacterBody2D/WateringCanUI" method="IsWateringCanActive"]
|
||||
[connection signal="PickedUpTool" from="." to="CharacterBody2D" method="ActivateTool"]
|
||||
|
||||
@@ -49,7 +49,6 @@ autowrap_mode = 3
|
||||
shape = SubResource("CircleShape2D_tlhp6")
|
||||
|
||||
[node name="Label" parent="InteractionArea2" index="1"]
|
||||
visible = true
|
||||
z_index = 5
|
||||
offset_left = -68.0
|
||||
offset_top = -111.0
|
||||
|
||||
@@ -127,7 +127,7 @@ size = Vector2(1041, 368)
|
||||
|
||||
[sub_resource type="CircleShape2D" id="CircleShape2D_p6n74"]
|
||||
resource_local_to_scene = true
|
||||
radius = 600.0
|
||||
radius = 371.058
|
||||
|
||||
[sub_resource type="CircleShape2D" id="CircleShape2D_2nee2"]
|
||||
resource_local_to_scene = true
|
||||
@@ -352,7 +352,7 @@ texture = ExtResource("11_vbdb2")
|
||||
[node name="background layer 4" type="ParallaxLayer" parent="ParallaxBackground"]
|
||||
position = Vector2(0, -82)
|
||||
motion_scale = Vector2(0.5, 0.5)
|
||||
motion_mirroring = Vector2(10500, 0)
|
||||
motion_mirroring = Vector2(10480, 0)
|
||||
|
||||
[node name="Kenney Assets" type="Node2D" parent="ParallaxBackground/background layer 4"]
|
||||
visible = false
|
||||
@@ -475,7 +475,7 @@ texture = ExtResource("13_0qu0h")
|
||||
|
||||
[node name="JelenaMockupBg03" type="Sprite2D" parent="ParallaxBackground/background layer 4"]
|
||||
material = SubResource("ShaderMaterial_wtdui")
|
||||
position = Vector2(7965, 728)
|
||||
position = Vector2(7923, 727)
|
||||
scale = Vector2(2.75, 2.75)
|
||||
texture = ExtResource("13_0qu0h")
|
||||
|
||||
@@ -869,7 +869,7 @@ shape = SubResource("RectangleShape2D_0sfl7")
|
||||
_id = 1
|
||||
|
||||
[node name="CollisionShape3D" parent="YSorted/Brünnen/InteractionArea/Area2D" index="0"]
|
||||
position = Vector2(80, -368)
|
||||
position = Vector2(146, -130)
|
||||
shape = SubResource("CircleShape2D_p6n74")
|
||||
|
||||
[node name="HoeGenericPickup" parent="YSorted" instance=ExtResource("25_hukxv")]
|
||||
@@ -888,6 +888,9 @@ position = Vector2(8192, 3507)
|
||||
[node name="SpawnWithItem" parent="YSorted/CanGenericPickup" index="0"]
|
||||
_blueprint = ExtResource("28_ipqaa")
|
||||
|
||||
[node name="InteractionArea2" parent="YSorted/CanGenericPickup" index="3"]
|
||||
position = Vector2(0, -159)
|
||||
|
||||
[node name="CollisionShape3D" parent="YSorted/CanGenericPickup/InteractionArea2/Area2D" index="0"]
|
||||
shape = SubResource("CircleShape2D_ipqaa")
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ public partial class Player2D : CharacterBody2D
|
||||
[Export] private float _speed = 100f;
|
||||
[Export] private AnimatedSprite2D _sprite;
|
||||
[Export] private SceneTree.GroupCallFlags _fieldFlags;
|
||||
[Export] private CpuParticles2D _wateringParticles;
|
||||
|
||||
// -1 means no tool.
|
||||
private int _toolID = -1;
|
||||
@@ -156,6 +157,7 @@ public partial class Player2D : CharacterBody2D
|
||||
_sprite.Animation = "diagonal wateringcan";
|
||||
_sprite.Play();
|
||||
_canHandleInput = false;
|
||||
_wateringParticles.Emitting = true;
|
||||
Task.Run(DelayedInputHandlerReset);
|
||||
}
|
||||
}
|
||||
@@ -163,6 +165,7 @@ public partial class Player2D : CharacterBody2D
|
||||
private async Task DelayedInputHandlerReset()
|
||||
{
|
||||
await Task.Delay(1000);
|
||||
_wateringParticles.Emitting = false;
|
||||
_canHandleInput = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@ public partial class FarmingControls2D : Node2D
|
||||
[Export] private PackedScene _fieldPrefab;
|
||||
[Export] private Node2D _movingPlayer;
|
||||
[Export] private Camera2D _camera;
|
||||
[Export] private CpuParticles2D _wateringParticles;
|
||||
[Export] private float _wateringCanParticlesVerticalOffset = 50f;
|
||||
|
||||
public FieldService2D FieldService;
|
||||
|
||||
@@ -40,6 +42,9 @@ public partial class FarmingControls2D : Node2D
|
||||
}
|
||||
|
||||
_toolId = activate ? toolId : -1;
|
||||
|
||||
WateringCanState.SetActive(_toolId == WateringCanState.WATERING_CAN_ID);
|
||||
|
||||
return activate;
|
||||
}
|
||||
|
||||
@@ -56,15 +61,18 @@ public partial class FarmingControls2D : Node2D
|
||||
MakeField(adjustedPosition);
|
||||
}
|
||||
|
||||
if (@event.IsActionPressed("click") && _toolId == 1 && _wateringCanFilled)
|
||||
if (@event.IsActionPressed("click")
|
||||
&& _toolId == WateringCanState.WATERING_CAN_ID
|
||||
&& WateringCanState.GetFillState() > 0)
|
||||
{
|
||||
WaterTheField(adjustedPosition);
|
||||
}
|
||||
}
|
||||
|
||||
#region WATERING
|
||||
public void FillWateringCan()
|
||||
{
|
||||
if (_toolId == 1 )
|
||||
if (_toolId == WateringCanState.WATERING_CAN_ID)
|
||||
{
|
||||
WateringCanState.Fill();
|
||||
}
|
||||
@@ -77,10 +85,14 @@ public partial class FarmingControls2D : Node2D
|
||||
return;
|
||||
|
||||
field.Water();
|
||||
_wateringParticles.GlobalPosition = new Vector2(field.GlobalPosition.X, field.GlobalPosition.Y + _wateringCanParticlesVerticalOffset);
|
||||
WateringCanState.Water();
|
||||
EmitSignal(SignalName.WateringField);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region FIELD CREATION
|
||||
private void MakeField(Vector2I fieldPosition)
|
||||
{
|
||||
if(FieldService == null || _fieldPrefab == null)
|
||||
@@ -120,4 +132,6 @@ public partial class FarmingControls2D : Node2D
|
||||
{
|
||||
return input.Snapped(step);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -1,29 +1,70 @@
|
||||
namespace Babushka.scripts.CSharp.Common.Farming;
|
||||
|
||||
/// <summary>
|
||||
/// Holds Information about the current state of the watering can.
|
||||
/// Since there is only one watering can, we can track this in one central static class.
|
||||
/// </summary>
|
||||
public static class WateringCanState
|
||||
{
|
||||
private static int _fillstate = 0;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// How many fields can be watered with one filling of the watering can.
|
||||
/// </summary>
|
||||
public const int MAX_FILLSTATE = 6;
|
||||
|
||||
/// <summary>
|
||||
/// The Tool ID of the watering can. Used to identify it amongst other pickup items (and things that can be held by Vesna).
|
||||
/// </summary>
|
||||
public const int WATERING_CAN_ID = 1;
|
||||
|
||||
/// <summary>
|
||||
/// Whether or not the watering can is currently active, i.e. held in hand by Vesna.
|
||||
/// Triggers animations and ui.
|
||||
/// </summary>
|
||||
public static bool Active = false;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Resets the fillstate to the max amount.
|
||||
/// </summary>
|
||||
public static void Fill()
|
||||
{
|
||||
_fillstate = MAX_FILLSTATE;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called when watering a field. Reduces the current fillstate.
|
||||
/// </summary>
|
||||
public static void Water()
|
||||
{
|
||||
if(_fillstate > 0)
|
||||
_fillstate--;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resets the watering can. Equivalent to "Empty" state.
|
||||
/// </summary>
|
||||
public static void Reset()
|
||||
{
|
||||
_fillstate = 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the current fill state of the watering can.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static int GetFillState()
|
||||
{
|
||||
return _fillstate;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the Active state of the watering can, i.e. if it is currently in hand and if the ui should be active.
|
||||
/// </summary>
|
||||
/// <param name="active"></param>
|
||||
public static void SetActive(bool active)
|
||||
{
|
||||
Active = active;
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@ public partial class WateringCanUi : Node2D
|
||||
{
|
||||
for (int i = 0; i < _stages.Length; i++)
|
||||
{
|
||||
_stages[i].Visible = i < WateringCanState.GetFillState();
|
||||
_stages[i].Visible = WateringCanState.Active && i < WateringCanState.GetFillState();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user