You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
4.8 KiB
146 lines
4.8 KiB
using System;
|
|
using Babushka.scripts.CSharp.Common.CharacterControls;
|
|
using Babushka.scripts.CSharp.Common.Inventory;
|
|
using Babushka.scripts.CSharp.Low_Code.Variables;
|
|
using Godot;
|
|
|
|
namespace Babushka.scripts.CSharp.Common.Farming;
|
|
|
|
[GlobalClass]
|
|
public partial class FieldBehaviour2D : Sprite2D
|
|
{
|
|
[Export] private Sprite2D _fieldSprite;
|
|
[Export] private Sprite2D _maskSprite;
|
|
[Export] private Sprite2D _outlineSprite;
|
|
[Export] private Texture2D[] _maskOutlineTextures;
|
|
[Export] private Texture2D[] _maskTexture;
|
|
[Export] private Texture2D Tilled;
|
|
[Export] private Texture2D Watered;
|
|
[Export] public FieldState FieldState = FieldState.Tilled;
|
|
[Export] public InteractionArea2D PlantingInteraction;
|
|
[Export] public Node2D PlantingPlaceholder;
|
|
[Export] public ItemRepository ItemRepository;
|
|
[Export] public InteractionArea2D FieldInteractionArea;
|
|
[Export] public VariableResource _sceneKeyProvider;
|
|
[Export] private VariableNode _fieldIndex;
|
|
|
|
|
|
public Vector2 FieldPosition;
|
|
|
|
private bool _seedsActive;
|
|
private bool _wateringCanActive;
|
|
|
|
[Signal] public delegate void PlantedEventHandler();
|
|
|
|
private void UpdateInteractionArea()
|
|
{
|
|
// fieldstate == tilled / watered && samen im Inventar
|
|
bool canPlant = (FieldState == FieldState.Tilled || FieldState == FieldState.Watered) && _seedsActive;
|
|
// fieldstate == tilled && watering can ausgewählt
|
|
bool canWater = FieldState == FieldState.Tilled && _wateringCanActive;
|
|
FieldInteractionArea.IsActive = canPlant || canWater;
|
|
}
|
|
|
|
public void ActivatedSeedInInventory(bool activated)
|
|
{
|
|
_seedsActive = activated;
|
|
UpdateInteractionArea();
|
|
}
|
|
|
|
public void ActivateWateringCanInInventory(bool activated)
|
|
{
|
|
_wateringCanActive = activated;
|
|
UpdateInteractionArea();
|
|
}
|
|
|
|
public override void _Ready()
|
|
{
|
|
UpdateFieldState(FieldState);
|
|
FieldService.Instance.TryAddEntry(_sceneKeyProvider.Payload.AsString(),_fieldIndex.Payload.AsInt32(), this);
|
|
int randomIndex = new Random().Next(0, _maskTexture.Length);
|
|
_maskSprite.Texture = _maskTexture[randomIndex];
|
|
_outlineSprite.Texture = _maskOutlineTextures[randomIndex];
|
|
base._Ready();
|
|
}
|
|
|
|
public void UpdateFieldState(FieldState state)
|
|
{
|
|
switch (state)
|
|
{
|
|
case FieldState.Empty:
|
|
FieldState = FieldState.Empty;
|
|
PlantingInteraction.IsActive = false;
|
|
break;
|
|
case FieldState.Tilled:
|
|
FieldState = FieldState.Tilled;
|
|
_fieldSprite.Texture = Tilled;
|
|
PlantingInteraction.IsActive = true;
|
|
break;
|
|
case FieldState.Watered:
|
|
FieldState = FieldState.Watered;
|
|
_fieldSprite.Texture = Watered;
|
|
PlantingInteraction.IsActive = true;
|
|
break;
|
|
case FieldState.Planted:
|
|
FieldState = FieldState.Planted;
|
|
_fieldSprite.Texture = Tilled;
|
|
PlantingInteraction.IsActive = false;
|
|
break;
|
|
default:
|
|
FieldState = FieldState.NotFound;
|
|
break;
|
|
}
|
|
UpdateInteractionArea();
|
|
}
|
|
|
|
|
|
public void Water()
|
|
{
|
|
UpdateFieldState(FieldState.Watered);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Called when the player enters the field's interaction area and presses <E> or clicks.
|
|
/// </summary>
|
|
public void Farm()
|
|
{
|
|
if (TryPlant())
|
|
{
|
|
EmitSignal(SignalName.Planted);
|
|
UpdateFieldState(FieldState.Planted);
|
|
}
|
|
}
|
|
|
|
private bool TryPlant()
|
|
{
|
|
bool success = false;
|
|
int currentSlotIndex = InventoryManager.Instance.CurrentSelectedSlotIndex;
|
|
ItemInstance? item = InventoryManager.Instance.playerInventory.Slots[currentSlotIndex].itemInstance;
|
|
|
|
if (item == null || PlantingPlaceholder.GetChildCount() > 0 || item.amount == 0)
|
|
return success;
|
|
|
|
string prefabPath = ItemRepository.TryGetPrefabPath(item.blueprint);
|
|
|
|
if (prefabPath != null)
|
|
{
|
|
PackedScene prefab = ResourceLoader.Load<PackedScene>(prefabPath, nameof(PackedScene));
|
|
Node2D plant2d = prefab.Instantiate<Node2D>();
|
|
PlantingPlaceholder.AddChild(plant2d);
|
|
plant2d.GlobalPosition = PlantingPlaceholder.GlobalPosition;
|
|
PlantBehaviour2D? plantBehaviour = plant2d as PlantBehaviour2D;
|
|
|
|
if (plantBehaviour != null)
|
|
{
|
|
plantBehaviour.Field = this;
|
|
}
|
|
|
|
InventoryManager.Instance.playerInventory.RemoveItem(currentSlotIndex);
|
|
success = true;
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
|
|
} |