using Babushka.scripts.CSharp.Common.CharacterControls; using Babushka.scripts.CSharp.Common.Savegame; using Godot; using Godot.Collections; namespace Babushka.scripts.CSharp.Common.Farming; /// /// Enables a preset field in the scene sothat it can be used for farming. /// public partial class FieldActivator : Node, ISaveable { [Export] private FieldBehaviour2D _field; [Export] private InteractionArea2D _activatorArea; private bool _used = false; private bool _rakeInHand; [Signal] public delegate void FieldCreatedEventHandler(); public override void _Ready() { LoadFromSaveData(); ToggleInteractionArea(); } /// /// Activates the fieldbehaviour node and sets it to the tilled state. /// public void ActivateField() { if (!_used && _rakeInHand) { _field.Visible = true; _field.UpdateFieldState(FieldState.Tilled); EmitSignal(SignalName.FieldCreated, _field); _used = true; ToggleInteractionArea(); UpdateSaveData(); } } /// /// Reacts to changes in the inventory. /// If setup correctly, the field activator interactable should only trigger when using the rake. /// /// public void RakeActivated(bool activated) { if (_used || ProcessMode == ProcessModeEnum.Disabled) return; _rakeInHand = activated; ToggleInteractionArea(); } private void ToggleInteractionArea() { _activatorArea.IsActive = !_used && _rakeInHand; } public void UpdateSaveData() { var payloadData = new Dictionary { { "field_activator_used", _used } }; string id = GetMeta("SaveID").AsString(); SavegameService.AppendDataToSave( id, payloadData); } public void LoadFromSaveData() { string id = GetMeta("SaveID").AsString(); Dictionary save = SavegameService.GetSaveData(id); if (save.Count > 0) { if (save.TryGetValue("field_activator_used", out Variant usedVar)) { _used = usedVar.AsBool(); } } } }