Files
zfxaction25/DonkeysAndDroids.Godot/MetaGameScreen.cs
2026-04-19 00:43:27 +02:00

182 lines
5.7 KiB
C#

using System;
using DonkeysAndDroids;
using Godot;
using RobotAndDonkey.Game;
using RobotAndDonkey.Game.Execution.Results;
using RobotAndDonkey.Game.Utils;
public partial class MetaGameScreen : Control, IScreen
{
public override void _Ready()
{
m_SeedLineEdit = GetNode<LineEdit>("MarginContainer/MarginContainer/MainVBox/SeedRow/SeedLineEdit");
m_RandomizeButton = GetNode<Button>("MarginContainer/MarginContainer/MainVBox/SeedRow/RandomizeButton");
m_DifficultyOptionButton = GetNode<OptionButton>("MarginContainer/MarginContainer/MainVBox/DifficultyRow/DifficultyOptionButton");
m_StartButton = GetNode<Button>("%StartButton");
m_OptionsButton = GetNode<Button>("%OptionsButton");
m_RobotContainer = GetNode<HBoxContainer>("MarginContainer/MarginContainer/MainVBox/RobotsSection/RobotsContainer");
foreach (var robot in Enum.GetValues<ERobotType>())
{
var currentRobot = robot;
var robotInstance = (Robot)RobotScene.Instantiate<Button>();
robotInstance.Pressed += () => OnRobotButtonPressed(currentRobot);
robotInstance.Name = robot.ToString();
robotInstance.Texture = robot switch
{
ERobotType.Vintage => ResourceLoader.Load<Texture2D>("uid://b51acya8abb3p"),
ERobotType.Courier => ResourceLoader.Load<Texture2D>("uid://c6h1eqa6n2ca8"),
ERobotType.Analyst => ResourceLoader.Load<Texture2D>("uid://c6h1eqa6n2ca8"),
ERobotType.Ranger => ResourceLoader.Load<Texture2D>("uid://c6h1eqa6n2ca8"),
_ => throw new ArgumentOutOfRangeException()
};
m_RobotContainer.AddChild(robotInstance);
}
m_RobotButtons = new Button[m_RobotContainer.GetChildren().Count];
for (var i = 0; i < m_RobotButtons.Length; i++)
{
m_RobotButtons[i] = (Button)m_RobotContainer.GetChildren()[i];
// JAM
if (i > 0)
m_RobotButtons[i].Disabled = true;
}
m_DifficultyOptionButton.Clear();
foreach (var difficulty in Enum.GetValues<EDifficulty>())
m_DifficultyOptionButton.AddItem(difficulty.ToString(), (int)difficulty);
m_DifficultyOptionButton.Selected = 0;
m_RandomizeButton.Pressed += OnRandomizePressed;
m_StartButton.Pressed += OnStartPressed;
m_OptionsButton.Pressed += OnOptionsPressed;
m_SeedLineEdit.TextChanged += OnSeedTextChanged;
m_StartButton.Disabled = true;
OnRandomizePressed();
}
private void OnOptionsPressed()
{
Main.Instance.OptionsMenu.ShowMenu();
}
public override void _UnhandledKeyInput(InputEvent @event)
{
if (@event.IsActionPressed("options") && !m_StartButton.Disabled)
{
Main.Instance.OptionsMenu.ShowMenu();
GetViewport().SetInputAsHandled();
}
}
private void OnRandomizePressed()
{
m_Seed = m_Random.Next(int.MaxValue);
m_SeedLineEdit.Text = SeedString.ToString(m_Seed);
}
private void OnSeedTextChanged(string newText)
{
if (!SeedString.TryParse(newText, out m_Seed, true))
m_Seed = 0;
UpdateStartButtonState();
}
private void OnRobotButtonPressed(ERobotType robot)
{
m_SelectedRobot = robot;
UpdateRobotButtonsVisual();
UpdateStartButtonState();
}
private void UpdateRobotButtonsVisual()
{
var index = 0;
foreach (var node in m_RobotContainer.GetChildren())
{
var robot = (ERobotType)index++;
if (node is not Button button)
continue;
button.ButtonPressed = robot == m_SelectedRobot;
}
}
private void UpdateStartButtonState()
{
var hasSeed = m_Seed > 0;
var hasRobot = m_SelectedRobot >= 0;
m_StartButton.Disabled = !(hasSeed && hasRobot);
}
private void OnStartPressed()
{
if (m_StartButton.Disabled)
return;
var seed = m_SeedLineEdit.Text.Trim();
var difficulty = (EDifficulty)m_DifficultyOptionButton.Selected;
GD.Print($"Starting game with Seed={seed}, Difficulty={difficulty}, Robot={m_SelectedRobot}");
Main.Instance.StartCoreLoop(m_Seed, difficulty, m_SelectedRobot);
}
public void Deactivate()
{
}
public void EnableInputs()
{
m_DifficultyOptionButton.Disabled = false;
m_RandomizeButton.Disabled = false;
m_StartButton.Disabled = false;
// JAM
m_RobotButtons[0].Disabled = false;
//foreach (var button in m_RobotButtons)
// button.Disabled = false;
m_SeedLineEdit.Editable = true;
}
public void DisableInputs()
{
m_DifficultyOptionButton.Disabled = true;
m_RandomizeButton.Disabled = true;
m_StartButton.Disabled = true;
foreach (var button in m_RobotButtons)
button.Disabled = true;
m_SeedLineEdit.Editable = false;
}
public void Activate()
{
}
public bool HandleResult(Result result, Tween tween)
{
return false;
}
[Export]
public PackedScene RobotScene { get; set; }
public string StringSeed => SeedString.ToString(m_Seed);
private OptionButton m_DifficultyOptionButton;
private Button m_RandomizeButton;
private Button m_OptionsButton;
private Button m_StartButton;
private Button[] m_RobotButtons;
private HBoxContainer m_RobotContainer;
private LineEdit m_SeedLineEdit;
private SRandom m_Random = new((ulong)DateTime.UtcNow.ToFileTimeUtc());
private int m_Seed;
private ERobotType m_SelectedRobot = ERobotType.Vintage;
}