diff --git a/prefabs/farm/plants/base_plant.tscn b/prefabs/farm/plants/base_plant.tscn index d20e588..eea69a7 100644 --- a/prefabs/farm/plants/base_plant.tscn +++ b/prefabs/farm/plants/base_plant.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3 uid="uid://gishbn0a8eke"] +[gd_scene load_steps=12 format=3 uid="uid://gishbn0a8eke"] [ext_resource type="Script" uid="uid://cms357f23fmfy" path="res://scripts/CSharp/Common/Farming/PlantBehaviour2D.cs" id="1_66p1c"] [ext_resource type="Texture2D" uid="uid://mrnc81ukugh6" path="res://art/farm/farming/farmobjekte/plant_template.png" id="2_oyl0t"] @@ -6,6 +6,7 @@ [ext_resource type="PackedScene" uid="uid://cqc72e4hq6bcd" path="res://prefabs/interactions/interaction_area_2d.tscn" id="5_3j24b"] [ext_resource type="PackedScene" uid="uid://dpbbroif2tnil" path="res://prefabs/interactions/generic_item_on_ground_2d.tscn" id="6_gdrin"] [ext_resource type="Resource" uid="uid://blr8tine5m0ma" path="res://resources/items/tomato.tres" id="7_vjw4j"] +[ext_resource type="Script" uid="uid://j2mhvb45egej" path="res://scripts/CSharp/Low Code/Variables/VariableNode.cs" id="8_3og52"] [ext_resource type="Texture2D" uid="uid://bleimj6jr1jka" path="res://art/general/rectangle.png" id="9_vjw4j"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_u4cty"] @@ -28,7 +29,7 @@ radius = 300.0 resource_local_to_scene = true radius = 300.0 -[node name="BasePlant" type="Node2D" node_paths=PackedStringArray("_seeds", "_smallPlants", "_bigPlants", "_readyPlants", "_harvestablePlant", "_magicEffect")] +[node name="BasePlant" type="Node2D" node_paths=PackedStringArray("_seeds", "_smallPlants", "_bigPlants", "_readyPlants", "_harvestablePlant", "_magicEffect", "_lifecycle")] z_index = 1 y_sort_enabled = true script = ExtResource("1_66p1c") @@ -38,6 +39,7 @@ _bigPlants = [NodePath("BigPlant/01"), NodePath("BigPlant/02"), NodePath("BigPla _readyPlants = [NodePath("ReadyPlantInventoryItem/ReadyPlant/01"), NodePath("ReadyPlantInventoryItem/ReadyPlant/02"), NodePath("ReadyPlantInventoryItem/ReadyPlant/03")] _harvestablePlant = NodePath("ReadyPlantInventoryItem") _magicEffect = NodePath("magic vfx") +_lifecycle = NodePath("LifeCycle") [node name="Seeds" type="Node2D" parent="."] position = Vector2(0, 0.5) @@ -206,6 +208,10 @@ scale_amount_max = 0.1 color = Color(0.400601, 0.62444, 0.791217, 1) hue_variation_max = 0.4 +[node name="LifeCycle" type="Node" parent="."] +script = ExtResource("8_3og52") +Payload = 3 + [connection signal="Interacted" from="GrowingInteractionArea" to="." method="Grow"] [connection signal="SuccessfulPickUp" from="ReadyPlantInventoryItem" to="." method="queue_free"] diff --git a/scripts/CSharp/Common/DayAndNight/CalendarController.cs b/scripts/CSharp/Common/DayAndNight/CalendarController.cs index 33185e2..ecea54b 100644 --- a/scripts/CSharp/Common/DayAndNight/CalendarController.cs +++ b/scripts/CSharp/Common/DayAndNight/CalendarController.cs @@ -14,6 +14,7 @@ public partial class CalendarController : Node int days = _dayCounter.Payload.AsInt32(); days++; _dayCounter.Payload = days; + } } } \ No newline at end of file diff --git a/scripts/CSharp/Common/Farming/FieldBehaviour2D.cs b/scripts/CSharp/Common/Farming/FieldBehaviour2D.cs index 52b02a5..6fe2a18 100644 --- a/scripts/CSharp/Common/Farming/FieldBehaviour2D.cs +++ b/scripts/CSharp/Common/Farming/FieldBehaviour2D.cs @@ -195,7 +195,7 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable { { "prefab_path", _currentPlant.PrefabPath }, { "plant_state", (int)_currentPlant.State }, - { "plant_days_growing", _currentPlant.DaysGrowing } + { "plant_start_day", _currentPlant.DayPlanted } } ); } @@ -243,11 +243,18 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable _currentPlant.GrowPlant(); } - if (plantDataDict.TryGetValue("plant_days_growing", out Variant plantDaysGrowingVar) && _currentPlant != null) + if (plantDataDict.TryGetValue("plant_start_day", out Variant plantDaysGrowingVar) && _currentPlant != null) { - _currentPlant.DaysGrowing = plantDaysGrowingVar.AsInt32(); + _currentPlant.DayPlanted = plantDaysGrowingVar.AsInt32(); } - + + if (_currentPlant != null) + { + //todo: find out how to load the current day from save and provide it to the plant script + _currentPlant.CurrentDayInCalendar = GD.RandRange(0, 12); + GD.Print($"Set current Day in calendar for plant {_currentPlant.Name} to {_currentPlant.CurrentDayInCalendar}"); + } + } } } diff --git a/scripts/CSharp/Common/Farming/PlantBehaviour2D.cs b/scripts/CSharp/Common/Farming/PlantBehaviour2D.cs index 82cdeaf..35c7166 100644 --- a/scripts/CSharp/Common/Farming/PlantBehaviour2D.cs +++ b/scripts/CSharp/Common/Farming/PlantBehaviour2D.cs @@ -1,6 +1,9 @@ using System; +using System.Diagnostics; using Babushka.scripts.CSharp.Common.Inventory; +using Babushka.scripts.CSharp.Low_Code.Variables; using Godot; +using Godot.Collections; namespace Babushka.scripts.CSharp.Common.Farming; @@ -9,7 +12,8 @@ namespace Babushka.scripts.CSharp.Common.Farming; /// public partial class PlantBehaviour2D : Node2D { - [Export] private string _prefabPath; + + [ExportGroup("Plant State")] [Export] private Sprite2D[] _seeds; [Export] private Sprite2D[] _smallPlants; [Export] private Sprite2D[] _bigPlants; @@ -19,11 +23,17 @@ public partial class PlantBehaviour2D : Node2D [Export] private ItemOnGround2D _harvestablePlant; [Export] private CpuParticles2D _magicEffect; [Export] private bool _magicWordNeeded = true; + + [ExportGroup("PlantConfig")] + [Export] private string _prefabPath; + [Export] private VariableNode _lifecycle; private string _magicWordDialogicEventName = "MagicWord"; private Sprite2D? _currentPlantSprite = null; private bool _magicWordSaid = false; private bool _calledOnReady = false; + private int _dayPlanted; + private int _currentDay; public PlantState State { @@ -31,8 +41,45 @@ public partial class PlantBehaviour2D : Node2D set => _state = value; } - public int DaysGrowing { get; set; } - + public int DayPlanted { get; set; } + + public int CurrentDayInCalendar + { + get => _currentDay; + set + { + if (_currentDay == value) return; + _currentDay = value; + DaysGrowingChanged(); + } + } + + public void IncrementDaysGrowing() + { + DayPlanted++; + } + + private void DaysGrowingChanged() + { + int _daysGrowing = _currentDay - _dayPlanted; + int lifecycle = _lifecycle.Payload.AsInt32(); + Debug.Assert(lifecycle > 0); + + float growth = (float)_daysGrowing / lifecycle; + int growthFloor = Mathf.FloorToInt(growth); + + _state = growthFloor switch + { + 0 => PlantState.Planted, + 1 => PlantState.SmallPlant, + 2 => PlantState.BigPlant, + _ => PlantState.Ready + }; + + _calledOnReady = true; + Grow(); + } + public string PrefabPath => _prefabPath; ///