using System; using Babushka.scripts.CSharp.Common.CharacterControls; 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 } /// /// Determines the behaviour of a plant in Babushka. /// 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; [Export] private FieldBehaviour2D _field; [Export] private ItemOnGround2D _harvestablePlant; [Export] private CpuParticles2D _magicEffect; private string _magicWordDialogicEventName = "MagicWord"; private Sprite2D _currentPlantSprite = null; private bool _magicWordSaid; /// /// Transitions the plant to its next growth stage. /// public void Grow() { if (_field.FieldState != FieldState.Watered || !_magicWordSaid) return; 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); _harvestablePlant.IsActive = true; _currentPlantSprite.Visible = true; break; case PlantState.Ready: _state = PlantState.None; _currentPlantSprite.Visible = false; _currentPlantSprite = null; break; default: break; } _field.UpdateFieldState(FieldState.Tilled); _magicWordSaid = false; } private Sprite2D GetRandomSprite(Sprite2D[] sprites) { Random rand = new Random(); return sprites[rand.Next(sprites.Length)]; } public void SayMagicWord(string wordEvent) { GD.Print("Calling Dialogic event: " + wordEvent); if (_magicWordDialogicEventName != wordEvent) return; _magicEffect.Emitting = true; _magicEffect.OneShot = true; _magicWordSaid = true; Grow(); } }