Files

86 lines
2.7 KiB
C#
Raw Permalink Normal View History

using System;
2025-05-19 23:49:00 +02:00
using Babushka.scripts.CSharp.Common.CharacterControls;
2025-05-24 23:16:41 +02:00
using Babushka.scripts.CSharp.Common.Inventory;
using Godot;
namespace Babushka.scripts.CSharp.Common.Farming;
public enum PlantState
{
None = 0,
Planted = 1,
SmallPlant = 2,
BigPlant = 3,
Ready = 4
}
/// <summary>
/// Determines the behaviour of a plant in Babushka.
/// </summary>
public partial class PlantBehaviour2D : Node2D
{
[Export] private Sprite2D[] _seeds;
[Export] private Sprite2D[] _smallPlants;
[Export] private Sprite2D[] _bigPlants;
[Export] private Sprite2D[] _readyPlants;
[Export] private PlantState _state = PlantState.None;
2025-05-18 12:32:56 +02:00
[Export] private FieldBehaviour2D _field;
2025-05-24 23:16:41 +02:00
[Export] private ItemOnGround2D _harvestablePlant;
2025-05-19 23:49:00 +02:00
private Sprite2D _currentPlantSprite = null;
2025-05-19 23:49:00 +02:00
/// <summary>
2025-05-18 12:32:56 +02:00
/// Transitions the plant to its next growth stage.
/// </summary>
2025-05-18 12:32:56 +02:00
public void Grow()
{
2025-05-18 12:32:56 +02:00
if (_field.FieldState != FieldState.Watered)
return;
2025-05-19 23:49:00 +02:00
GetTree().CallGroup("PlantGrowing", Player2D.MethodName.PlayFarmingAnimation);
switch (_state)
{
case PlantState.None:
_state = PlantState.Planted;
_currentPlantSprite = GetRandomSprite(_seeds);
_currentPlantSprite.Visible = true;
break;
case PlantState.Planted:
_state = PlantState.SmallPlant;
_currentPlantSprite.Visible = false;
_currentPlantSprite = GetRandomSprite(_smallPlants);
_currentPlantSprite.Visible = true;
break;
case PlantState.SmallPlant:
_state = PlantState.BigPlant;
_currentPlantSprite.Visible = false;
_currentPlantSprite = GetRandomSprite(_bigPlants);
_currentPlantSprite.Visible = true;
break;
case PlantState.BigPlant:
_state = PlantState.Ready;
_currentPlantSprite.Visible = false;
_currentPlantSprite = GetRandomSprite(_readyPlants);
2025-05-24 23:16:41 +02:00
_harvestablePlant.IsActive = true;
_currentPlantSprite.Visible = true;
break;
case PlantState.Ready:
_state = PlantState.None;
_currentPlantSprite.Visible = false;
_currentPlantSprite = null;
break;
default:
break;
}
2025-05-19 23:49:00 +02:00
2025-05-18 12:32:56 +02:00
_field.UpdateFieldState(FieldState.Tilled);
}
private Sprite2D GetRandomSprite(Sprite2D[] sprites)
{
Random rand = new Random();
return sprites[rand.Next(sprites.Length)];
}
}