A game where you get to play as a slime, made with Godot.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

101 lines
2.7 KiB

[Tool]
public partial class TerrainEditingControls
: VBoxContainer
{
public (ToolMode , Button)[] ToolModeButtons { get; private set; }
public (ToolShape, Button)[] ToolShapeButtons { get; private set; }
public Button[] PaintTextureButtons { get; private set; }
public Slider DrawSizeSlider { get; private set; }
ToolMode _toolMode;
ToolShape _toolShape;
int _texture;
public ToolMode ToolMode { get => _toolMode ; set => SetToolMode (value); }
public ToolShape ToolShape { get => _toolShape; set => SetToolShape(value); }
public int Texture { get => _texture ; set => SetTexture (value); }
public int DrawSize {
get => RoundToInt(-DrawSizeSlider?.Value ?? 1);
set => DrawSizeSlider.Value = -value;
}
public override void _Ready()
{
ToolModeButtons = [
(ToolMode.Height, GetNode<Button>("Height")),
(ToolMode.Paint , GetNode<Button>("Paint" )),
];
ToolShapeButtons = [
(ToolShape.Corner, GetNode<Button>("Corner")),
(ToolShape.Circle, GetNode<Button>("Circle")),
(ToolShape.Square, GetNode<Button>("Square")),
];
PaintTextureButtons = [
GetNode<Button>("Grass"),
GetNode<Button>("Dirt"),
GetNode<Button>("Rock"),
GetNode<Button>("Sand"),
];
foreach (var (mode, button) in ToolModeButtons)
button.Pressed += () => SetToolMode(mode);
foreach (var (shape, button) in ToolShapeButtons)
button.Pressed += () => SetToolShape(shape);
foreach (var (i, button) in PaintTextureButtons.Select((b, i) => (i, b)))
button.Pressed += () => SetTexture(i + 1);
var drawSizeLabel = GetNode<Label>("SizeLabel");
DrawSizeSlider = GetNode<Slider>("SizeSlider");
DrawSizeSlider.ValueChanged += (_) => drawSizeLabel.Text = $"{DrawSize}";
SetToolMode(ToolMode.Height);
SetToolShape(ToolShape.Circle);
SetTexture(1);
OnEditingReady();
}
void SetToolMode(ToolMode value)
{
foreach (var (mode, button) in ToolModeButtons)
button.Flat = button.ButtonPressed = value != mode;
foreach (var button in PaintTextureButtons)
button.Disabled = value != ToolMode.Paint;
_toolMode = value;
}
void SetToolShape(ToolShape value)
{
foreach (var (shape, button) in ToolShapeButtons)
button.Flat = button.ButtonPressed = value != shape;
DrawSizeSlider.Editable = value != ToolShape.Corner;
_toolShape = value;
}
void SetTexture(int value)
{
if ((value < 1) || (value > PaintTextureButtons.Length))
throw new ArgumentOutOfRangeException(nameof(value));
foreach (var (i, button) in PaintTextureButtons.Select((b, i) => (i, b)))
button.Flat = button.ButtonPressed = value != i + 1;
_texture = value;
}
}
public enum ToolMode
{
Height,
Paint,
}
public enum ToolShape
{
Corner,
Circle,
Square,
}