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.
 
 

118 lines
3.9 KiB

[Tool]
public partial class TerrainEditingControls
: VBoxContainer
{
public (ToolMode , Button)[] ToolModeButtons { get; private set; }
public (ToolShape, Button)[] ToolShapeButtons { get; private set; }
public Slider DrawSizeSlider { get; private set; }
public Button[] PaintTextureButtons { get; private set; }
public Button RaiseLowerToggle { get; private set; }
public Button ConnectedToggle { get; private set; }
public ToolMode ToolMode { get => GetToolMode (); set => SetToolMode (value); }
public ToolShape ToolShape { get => GetToolShape(); set => SetToolShape(value); }
public int DrawSize { get => GetDrawSize (); set => SetDrawSize (value); }
public int Texture { get => GetTexture (); set => SetTexture (value); }
[Export] public Texture2D CornerTextureNormal { get; set; }
[Export] public Texture2D CornerTexturePaint { get; set; }
public override void _Ready()
{
ToolModeButtons = [
(ToolMode.Height , GetNode<Button>("Height" )),
(ToolMode.Flatten, GetNode<Button>("Flatten")),
(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}";
RaiseLowerToggle = GetNode<Button>("RaiseLower");
ConnectedToggle = GetNode<Button>("Connected");
}
ToolMode GetToolMode()
=> ToolModeButtons?.First(x => x.Item2.ButtonPressed).Item1 ?? ToolMode.Height;
void SetToolMode(ToolMode value)
{
if (ToolModeButtons == null) return;
foreach (var (mode, button) in ToolModeButtons)
button.Flat = !(button.ButtonPressed = value == mode);
foreach (var button in PaintTextureButtons)
button.Disabled = value != ToolMode.Paint;
// In paint mode, `ToolShape.Corner` affects a single tile regardless
// of `DrawSize`. This changes the button's icon to communicate that.
ToolShapeButtons[0].Item2.Icon = (value != ToolMode.Paint)
? CornerTextureNormal : CornerTexturePaint;
RaiseLowerToggle.Disabled = value is ToolMode.Flatten or ToolMode.Paint;
ConnectedToggle.Disabled = value is ToolMode.Paint;
}
ToolShape GetToolShape()
=> ToolShapeButtons?.First(x => x.Item2.ButtonPressed).Item1 ?? ToolShape.Circle;
void SetToolShape(ToolShape value)
{
if (ToolShapeButtons == null) return;
foreach (var (shape, button) in ToolShapeButtons)
button.Flat = !(button.ButtonPressed = value == shape);
DrawSizeSlider.Editable = value != ToolShape.Corner;
}
int GetDrawSize()
=> RoundToInt(-DrawSizeSlider?.Value ?? 1);
void SetDrawSize(int value)
{
if (DrawSizeSlider == null) return;
DrawSizeSlider.Value = -value;
}
int GetTexture()
=> PaintTextureButtons?
.Select((b, i) => (Index: i + 1, Button: b))
.First(x => x.Button.ButtonPressed).Index ?? 1;
void SetTexture(int value)
{
if (PaintTextureButtons == null) return;
if ((value < 1) || (value > PaintTextureButtons.Length))
throw new ArgumentOutOfRangeException(nameof(value));
foreach (var (index, button) in PaintTextureButtons.Select((b, i) => (i, b)))
button.Flat = !(button.ButtonPressed = value == index + 1);
}
}
public enum ToolMode
{
Height,
Flatten,
Paint,
}
public enum ToolShape
{
Corner,
Circle,
Square,
}