✨ made plants only grow when watered
This commit is contained in:
@@ -59,6 +59,7 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
|
||||
_canPlant = (FieldState == FieldState.Tilled || FieldState == FieldState.Watered) && _seedsActive;
|
||||
// fieldstate == tilled && watering can ausgewählt
|
||||
_canWater = (FieldState == FieldState.Tilled || FieldState == FieldState.Planted) && _wateringCanActive;
|
||||
|
||||
FieldInteractionArea.IsActive = _canPlant || _canWater;
|
||||
}
|
||||
|
||||
@@ -91,7 +92,7 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
|
||||
base._Ready();
|
||||
}
|
||||
|
||||
public void UpdateFieldState(FieldState state)
|
||||
public void UpdateFieldState(FieldState state, bool updateSaveAfter = true)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
@@ -119,18 +120,25 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
|
||||
break;
|
||||
}
|
||||
UpdateInteractionArea();
|
||||
UpdateSaveData();
|
||||
if(updateSaveAfter)
|
||||
UpdateSaveData();
|
||||
}
|
||||
|
||||
|
||||
public void Water()
|
||||
{
|
||||
if (WateringCanState.GetFillState() > 0)
|
||||
if (WateringCanState.GetFillState() > 0 && FieldState != FieldState.Watered)
|
||||
{
|
||||
UpdateFieldState(FieldState.Watered);
|
||||
_wateringParticles.Emitting = true;
|
||||
WateringCanState.Water();
|
||||
_wateringEvent.Raise();
|
||||
|
||||
if (_currentPlant != null)
|
||||
{
|
||||
_currentPlant.DaysWatered++;
|
||||
UpdateSaveData();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -198,6 +206,9 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
|
||||
|
||||
#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()
|
||||
{
|
||||
var payloadData = new Dictionary<string, Variant>
|
||||
@@ -211,7 +222,8 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
|
||||
"plant_data", new Dictionary<string, Variant>()
|
||||
{
|
||||
{ "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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Loads on scene enter.
|
||||
/// </summary>
|
||||
public void LoadFromSaveData()
|
||||
{
|
||||
// Get field and plant data
|
||||
@@ -229,18 +244,7 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
|
||||
|
||||
if (save.Count > 0)
|
||||
{
|
||||
if (save.TryGetValue("field_state", out Variant fieldStateVar))
|
||||
{
|
||||
int fieldStateInt = fieldStateVar.AsInt32();
|
||||
FieldState = (FieldState) fieldStateInt;
|
||||
|
||||
if (fieldStateInt != 0)
|
||||
{
|
||||
Visible = true;
|
||||
UpdateFieldState(FieldState);
|
||||
}
|
||||
}
|
||||
|
||||
// get plant first because it's also relevant for the field state
|
||||
if (save.TryGetValue("plant_data", out Variant plantDataVar))
|
||||
{
|
||||
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)
|
||||
{
|
||||
_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 int _dayPlanted;
|
||||
private int _currentDay;
|
||||
private int _daysWatered;
|
||||
|
||||
public PlantState State
|
||||
{
|
||||
@@ -66,28 +67,6 @@ public partial class PlantBehaviour2D : Node2D
|
||||
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;
|
||||
|
||||
/// <summary>
|
||||
@@ -99,6 +78,15 @@ public partial class PlantBehaviour2D : Node2D
|
||||
set => _field = value;
|
||||
}
|
||||
|
||||
public int DaysWatered
|
||||
{
|
||||
get => _daysWatered;
|
||||
set
|
||||
{
|
||||
_daysWatered = value;
|
||||
}
|
||||
}
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
if (_state == PlantState.None)
|
||||
@@ -113,13 +101,32 @@ public partial class PlantBehaviour2D : Node2D
|
||||
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()
|
||||
{
|
||||
GrowPlant();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Transitions the plant to its next growth stage.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user