newlon/scripts/components/level/PlantField.cs

80 lines
2.6 KiB
C#

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