using Godot; using Godot.Collections; namespace Babushka.scripts.CSharp.Common.Farming; [GlobalClass] public partial class FarmingControls2D : Node2D { [Export] private Sprite2D _hoeSprite; [Export] private Sprite2D _wateringCanSprite; [Export] private PackedScene _fieldPrefab; [Export] private Node2D _movingPlayer; [Export] private Camera2D _camera; public FieldService2D FieldParent; private int _toolId = -1; #region Tools public bool ActivateTool(bool activate, int toolId) { if(_toolId < 0) return false; switch (toolId) { case 0: _hoeSprite.Visible = activate; break; case 1: _wateringCanSprite.Visible = activate; break; default: _toolId = -1; break; } _toolId = toolId; return !activate; } #endregion public override void _Input(InputEvent @event) { Vector2 mousePosition = GetViewport().GetMousePosition(); Vector2I adjustedPosition = new Vector2I(AdjustValue(mousePosition.X), AdjustValue(mousePosition.Y)); if (@event.IsActionPressed("click") && _toolId == 0) { MakeField(adjustedPosition); } if (@event.IsActionPressed("click") && _toolId == 1) { WaterTheField(adjustedPosition); } } private void WaterTheField(Vector2I fieldPosition) { FieldBehaviour2D field = FieldParent.Get(fieldPosition); if (field == null) return; field.Water(); } private void MakeField(Vector2I fieldPosition) { if(FieldParent == null || _fieldPrefab == null) return; // only instantiate a field if there isn't one already. if(FieldParent.Get(fieldPosition) == null) { Node fieldInstance = _fieldPrefab.Instantiate(); if (fieldInstance is Node2D field2d) { // add dictionary entry for the field Array fields = field2d.FindChildren("*", nameof(FieldBehaviour2D)); if (fields.Count > 0) FieldParent.TryAddEntry(fieldPosition, fields[0] as FieldBehaviour2D); // reposition and reparent the instance field2d.Position = new Vector2(fieldPosition.X, fieldPosition.Y);; FieldParent.AddChild(fieldInstance); } } } private int AdjustValue(float value) { return (int) Mathf.Floor(value); } }