133 lines
2.8 KiB
C#
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;
|
|
}
|
|
}
|