Chessistics/Scripts/UI/LevelSelectScreen.cs

116 lines
3.5 KiB
C#
Raw Normal View History

using Godot;
using System;
namespace Chessistics.Scripts.UI;
public partial class LevelSelectScreen : Control
{
[Signal]
public delegate void LevelSelectedEventHandler(int levelIndex);
private readonly (string name, string desc)[] _levels =
[
("Premier Convoi", "Acheminez du bois de la scierie au depot."),
("Deux Clients", "Fournissez deux destinations depuis une seule scierie."),
("Le Col", "Franchissez le mur et gerez deux types de cargaison.")
];
public override void _Ready()
{
var panel = new PanelContainer();
panel.SetAnchorsPreset(LayoutPreset.FullRect);
var margin = new MarginContainer();
margin.AddThemeConstantOverride("margin_left", 60);
margin.AddThemeConstantOverride("margin_right", 60);
margin.AddThemeConstantOverride("margin_top", 60);
margin.AddThemeConstantOverride("margin_bottom", 60);
var vbox = new VBoxContainer();
var title = new Label
{
Text = "CHESSISTICS",
HorizontalAlignment = HorizontalAlignment.Center
};
title.AddThemeFontSizeOverride("font_size", 32);
title.AddThemeColorOverride("font_color", new Color("#FFD700"));
vbox.AddChild(title);
var subtitle = new Label
{
Text = "Prototype — Selectionnez un niveau",
HorizontalAlignment = HorizontalAlignment.Center
};
subtitle.AddThemeFontSizeOverride("font_size", 14);
subtitle.AddThemeColorOverride("font_color", new Color("#AAAAAA"));
vbox.AddChild(subtitle);
vbox.AddChild(new HSeparator());
var grid = new HBoxContainer();
grid.Alignment = BoxContainer.AlignmentMode.Center;
for (int i = 0; i < _levels.Length; i++)
{
var (name, desc) = _levels[i];
var card = CreateLevelCard(i, name, desc);
grid.AddChild(card);
}
vbox.AddChild(grid);
margin.AddChild(vbox);
panel.AddChild(margin);
AddChild(panel);
}
private Control CreateLevelCard(int index, string name, string description)
{
var card = new PanelContainer
{
CustomMinimumSize = new Vector2(220, 160)
};
var vbox = new VBoxContainer();
var numLabel = new Label
{
Text = $"Niveau {index + 1}",
HorizontalAlignment = HorizontalAlignment.Center
};
numLabel.AddThemeFontSizeOverride("font_size", 12);
numLabel.AddThemeColorOverride("font_color", new Color("#AAAAAA"));
vbox.AddChild(numLabel);
var nameLabel = new Label
{
Text = name,
HorizontalAlignment = HorizontalAlignment.Center
};
nameLabel.AddThemeFontSizeOverride("font_size", 18);
vbox.AddChild(nameLabel);
var descLabel = new Label
{
Text = description,
HorizontalAlignment = HorizontalAlignment.Center,
AutowrapMode = TextServer.AutowrapMode.Word
};
descLabel.AddThemeFontSizeOverride("font_size", 11);
descLabel.AddThemeColorOverride("font_color", new Color("#CCCCCC"));
vbox.AddChild(descLabel);
var playBtn = new Button
{
Text = "Jouer",
CustomMinimumSize = new Vector2(100, 32)
};
var idx = index;
playBtn.Pressed += () => EmitSignal(SignalName.LevelSelected, idx);
vbox.AddChild(playBtn);
card.AddChild(vbox);
return card;
}
}