made plants only grow when watered

pull/34/head
kziolkowski 1 month ago
parent e65330786e
commit c288af296c

@ -1061,6 +1061,7 @@ position = Vector2(145.5, -224)
shape = SubResource("RectangleShape2D_0sfl7") shape = SubResource("RectangleShape2D_0sfl7")
[node name="InteractionArea" parent="YSorted/Well" instance=ExtResource("27_klb81")] [node name="InteractionArea" parent="YSorted/Well" instance=ExtResource("27_klb81")]
_id = 1
metadata/SaveID = "b8f7b7fe-e057-4974-ba12-9134722998de" metadata/SaveID = "b8f7b7fe-e057-4974-ba12-9134722998de"
[node name="CollisionShape3D" parent="YSorted/Well/InteractionArea/Area2D" index="0"] [node name="CollisionShape3D" parent="YSorted/Well/InteractionArea/Area2D" index="0"]

@ -59,6 +59,7 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
_canPlant = (FieldState == FieldState.Tilled || FieldState == FieldState.Watered) && _seedsActive; _canPlant = (FieldState == FieldState.Tilled || FieldState == FieldState.Watered) && _seedsActive;
// fieldstate == tilled && watering can ausgewählt // fieldstate == tilled && watering can ausgewählt
_canWater = (FieldState == FieldState.Tilled || FieldState == FieldState.Planted) && _wateringCanActive; _canWater = (FieldState == FieldState.Tilled || FieldState == FieldState.Planted) && _wateringCanActive;
FieldInteractionArea.IsActive = _canPlant || _canWater; FieldInteractionArea.IsActive = _canPlant || _canWater;
} }
@ -91,7 +92,7 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
base._Ready(); base._Ready();
} }
public void UpdateFieldState(FieldState state) public void UpdateFieldState(FieldState state, bool updateSaveAfter = true)
{ {
switch (state) switch (state)
{ {
@ -119,18 +120,25 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
break; break;
} }
UpdateInteractionArea(); UpdateInteractionArea();
UpdateSaveData(); if(updateSaveAfter)
UpdateSaveData();
} }
public void Water() public void Water()
{ {
if (WateringCanState.GetFillState() > 0) if (WateringCanState.GetFillState() > 0 && FieldState != FieldState.Watered)
{ {
UpdateFieldState(FieldState.Watered); UpdateFieldState(FieldState.Watered);
_wateringParticles.Emitting = true; _wateringParticles.Emitting = true;
WateringCanState.Water(); WateringCanState.Water();
_wateringEvent.Raise(); _wateringEvent.Raise();
if (_currentPlant != null)
{
_currentPlant.DaysWatered++;
UpdateSaveData();
}
} }
} }
@ -198,6 +206,9 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
#region SAVE AND LOAD #region SAVE AND LOAD
/// <summary>
/// Update save data as prep for scene transition (when data is saved and loaded from disk).
/// </summary>
public void UpdateSaveData() public void UpdateSaveData()
{ {
var payloadData = new Dictionary<string, Variant> var payloadData = new Dictionary<string, Variant>
@ -211,7 +222,8 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
"plant_data", new Dictionary<string, Variant>() "plant_data", new Dictionary<string, Variant>()
{ {
{ "prefab_path", _currentPlant.PrefabPath }, { "prefab_path", _currentPlant.PrefabPath },
{ "plant_start_day", _currentPlant.DayPlanted } { "plant_start_day", _currentPlant.DayPlanted },
{ "plant_watered_days", _currentPlant.DaysWatered }
} }
); );
} }
@ -220,6 +232,9 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
SavegameService.AppendDataToSave(id, payloadData); SavegameService.AppendDataToSave(id, payloadData);
} }
/// <summary>
/// Loads on scene enter.
/// </summary>
public void LoadFromSaveData() public void LoadFromSaveData()
{ {
// Get field and plant data // Get field and plant data
@ -229,18 +244,7 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
if (save.Count > 0) if (save.Count > 0)
{ {
if (save.TryGetValue("field_state", out Variant fieldStateVar)) // get plant first because it's also relevant for the field state
{
int fieldStateInt = fieldStateVar.AsInt32();
FieldState = (FieldState) fieldStateInt;
if (fieldStateInt != 0)
{
Visible = true;
UpdateFieldState(FieldState);
}
}
if (save.TryGetValue("plant_data", out Variant plantDataVar)) if (save.TryGetValue("plant_data", out Variant plantDataVar))
{ {
Dictionary<string, Variant> plantDataDict = plantDataVar.AsGodotDictionary<string, Variant>(); Dictionary<string, Variant> plantDataDict = plantDataVar.AsGodotDictionary<string, Variant>();
@ -256,7 +260,39 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
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();
GD.Print($"Current plant {_currentPlant.Name} was planted on day: {_currentPlant.DayPlanted}"); }
if (plantDataDict.TryGetValue("plant_watered_days", out Variant plantDaysWatered) && _currentPlant != null)
{
_currentPlant.DaysWatered = plantDaysWatered.AsInt32();
}
// get field state
if (save.TryGetValue("field_state", out Variant fieldStateVar))
{
int fieldStateInt = fieldStateVar.AsInt32();
// if the field has been unlocked, make it visible.
if (fieldStateInt != 0)
{
Visible = true;
// if the field was watered the day before, set it to tilled or planted.
if (fieldStateInt == 3)
{
if (_currentPlant != null)
{
fieldStateInt = 2;
}
else
{
fieldStateInt = 1;
}
}
FieldState = (FieldState) fieldStateInt;
UpdateFieldState(FieldState, false);
}
} }
} }

@ -34,6 +34,7 @@ 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
{ {
@ -66,28 +67,6 @@ public partial class PlantBehaviour2D : Node2D
DayPlanted++; DayPlanted++;
} }
private void DaysGrowingChanged()
{
int _daysGrowing = _currentDay - _dayPlanted;
GD.Print($"Plant {Name} is growing for {_daysGrowing}. Day Planted was {_dayPlanted} and the current day is {_currentDay}.");
int lifecycle = _lifecycle.Payload.AsInt32();
Debug.Assert(lifecycle > 0);
float growth = (float)_daysGrowing / lifecycle;
int growthFloor = Mathf.FloorToInt(growth);
_state = growthFloor switch
{
0 => PlantState.None,
1 => PlantState.Planted,
2 => PlantState.SmallPlant,
_ => PlantState.BigPlant
};
_calledOnReady = true;
Grow();
}
public string PrefabPath => _prefabPath; public string PrefabPath => _prefabPath;
/// <summary> /// <summary>
@ -99,6 +78,15 @@ public partial class PlantBehaviour2D : Node2D
set => _field = value; set => _field = value;
} }
public int DaysWatered
{
get => _daysWatered;
set
{
_daysWatered = value;
}
}
public override void _Ready() public override void _Ready()
{ {
if (_state == PlantState.None) if (_state == PlantState.None)
@ -113,13 +101,32 @@ public partial class PlantBehaviour2D : Node2D
GrowPlant(); GrowPlant();
} }
} }
private void DaysGrowingChanged()
{
int lifecycle = _lifecycle.Payload.AsInt32();
Debug.Assert(lifecycle > 0);
float growth = (float)_daysWatered / lifecycle;
int growthFloor = Mathf.FloorToInt(growth);
_state = growthFloor switch
{
0 => PlantState.None,
1 => PlantState.Planted,
2 => PlantState.SmallPlant,
_ => PlantState.BigPlant
};
_calledOnReady = true;
Grow();
}
public void Grow() public void Grow()
{ {
GrowPlant(); GrowPlant();
} }
/// <summary> /// <summary>
/// Transitions the plant to its next growth stage. /// Transitions the plant to its next growth stage.
/// </summary> /// </summary>

Loading…
Cancel
Save