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();
}
}
}
}