using Godot; public partial class PlantField : Node2D { private Sprite2D _plantSetter; private readonly Vector2 tile = new Vector2(Utility.TileWidth, Utility.TileHeight); private PlantResource _resource; private PlantSlot _slot; public override void _Ready() { LevelController.Instance.PlantField = this; _plantSetter = GetChild(0); } public void SetPlant(PlantSlot slot, PlantResource plant) { _resource = plant; _slot = slot; } public override void _Process(double delta) { // Getting and storing global mouse position, setting plant-poiner to it var mouse_pos = GetGlobalMousePosition(); _plantSetter.GlobalPosition = mouse_pos; // Getting position in grid coordinates var expected_pos = (_plantSetter.GlobalPosition / tile).Ceil() * tile - new Vector2(20, 14); // Checking for boundaries bool inBoundary = expected_pos.X > Utility.LeftFieldBoundary.X && expected_pos.X < Utility.RightFieldBoundary.X && expected_pos.Y > Utility.LeftFieldBoundary.Y && expected_pos.Y < Utility.RightFieldBoundary.Y; bool _canPlace = _resource != null && inBoundary && LevelController.Instance.Pools.EntityField[_resource.Layer].ContainsKey(expected_pos) == false && LevelController.Instance.LevelData.CheckSpendSun(_resource.Cost); // Setting visuals if (_canPlace) { Material.Set("shader_parameter/amount", 0); Cursor.Instance.SetPlantCursor(); _plantSetter.GlobalPosition = expected_pos; } else { Cursor.Instance.SetDefaultCursor(); Material.Set("shader_parameter/amount", 1); } _plantSetter.Texture = _resource == null ? null : _resource.Preview; // Spawning plant if (Input.IsMouseButtonPressed(MouseButton.Left) && _canPlace ) { var plant = _resource.Scene.Instantiate(); LevelController.Instance.Pools.Plants.AddChild(plant); plant.GlobalPosition = expected_pos; LevelController.Instance.Pools.EntityField[_resource.Layer].Add(expected_pos, plant as IEntity); LevelController.Instance.LevelData.SpendSun(_resource.Cost); // Unfocusing and recharging slot _slot.Recharge(); } } public override void _Input(InputEvent @event) { if (@event.IsActionPressed("cancel_plant")) { _slot.ReleaseFocus(); } } }