116 lines
3.5 KiB
C#
116 lines
3.5 KiB
C#
|
|
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;
|
||
|
|
}
|
||
|
|
}
|