133 lines
2.8 KiB
C#

using Godot;
using System;
public class BuildMode : Mode
{
[Signal]
delegate void SelectedTileTypeChanged();
[Export]
private NodePath _gridPath;
private WorldGrid _grid;
[Export]
private NodePath _cursorPath;
private GridCursor _cursor;
[Export]
private Resource _buildableTilesResource;
public TileTypeCollection BuildableTiles { get; private set; }
public TileType SelectedTileType
{
get => _selectedTileType;
set
{
if (_selectedTileType == value)
return;
if (value != null)
{
GD.Print($"{GetType()}: selected {value} tile type");
}
else if (_selectedTileType != null)
{
GD.Print($"{GetType()}: cleared tile selection");
}
_selectedTileType = value;
EmitSignal(nameof(SelectedTileTypeChanged), _selectedTileType);
}
}
private TileType _selectedTileType = null;
public override void _Ready()
{
base._Ready();
BuildableTiles = (TileTypeCollection)_buildableTilesResource;
foreach (var tt in BuildableTiles)
{
GD.Print(tt.Name);
}
_grid = GetNode<WorldGrid>(_gridPath);
_cursor = GetNode<GridCursor>(_cursorPath);
}
private void HandleKeyInput(InputEventKey keyEvent)
{
if (!(keyEvent.Pressed))
return;
var key = (KeyList)keyEvent.Scancode;
if (key == KeyList.Escape)
{
if (SelectedTileType != null)
{
SelectedTileType = null;
return;
}
Disable();
}
foreach (var tt in BuildableTiles)
{
if (key != tt.Key)
continue;
SelectedTileType = tt;
}
}
private void HandleMouseInput(InputEventMouse mouseEvent)
{
if (!(mouseEvent is InputEventMouseButton buttonEvent))
return;
if (!buttonEvent.Pressed)
return;
var button = (ButtonList)buttonEvent.ButtonIndex;
if (button != ButtonList.Left)
return;
if (SelectedTileType == null)
return;
_grid.SetTileType(_cursor.X, _cursor.Y, SelectedTileType);
}
public override void _Input(InputEvent @event)
{
base._Input(@event);
if (!Active)
return;
if (@event is InputEventKey keyEvent)
{
HandleKeyInput(keyEvent);
return;
}
if (@event is InputEventMouse mouseEvent)
{
HandleMouseInput(mouseEvent);
return;
}
}
protected override void OnEnabled()
{
}
protected override void OnDisabled()
{
SelectedTileType = null;
}
}