107 lines
3.8 KiB
C#
107 lines
3.8 KiB
C#
using Godot;
|
|
using ReactorMaintenance.Godot.Controls;
|
|
using ReactorMaintenance.Godot.Data;
|
|
|
|
namespace ReactorMaintenance.Godot.Screens;
|
|
|
|
public partial class LevelScreen : ScreenBase
|
|
{
|
|
public void Configure(AppController app, CampaignLevel level, int levelNumber, int levelCount)
|
|
{
|
|
m_App = app;
|
|
m_Level = level;
|
|
|
|
var body = CreatePage(string.Empty);
|
|
var header = new LevelHeader();
|
|
body.AddChild(header);
|
|
header.SetLevel(level, levelNumber, levelCount, "Stable");
|
|
|
|
var flavor = CreateBodyText(level.FlavorText);
|
|
flavor.HorizontalAlignment = HorizontalAlignment.Left;
|
|
body.AddChild(flavor);
|
|
|
|
var split = new HSplitContainer { SizeFlagsVertical = SizeFlags.ExpandFill };
|
|
body.AddChild(split);
|
|
|
|
split.AddChild(CreateGridPlaceholder());
|
|
split.AddChild(CreateSidePanel(level));
|
|
|
|
body.AddChild(new InventoryStrip());
|
|
body.AddChild(CreateActionBar());
|
|
|
|
m_OverlayLayer = new();
|
|
AddChild(m_OverlayLayer);
|
|
}
|
|
|
|
private static PanelContainer CreateGridPlaceholder()
|
|
{
|
|
var panel = new PanelContainer { CustomMinimumSize = new(560, 360), SizeFlagsHorizontal = SizeFlags.ExpandFill, SizeFlagsVertical = SizeFlags.ExpandFill };
|
|
var label = new Label {
|
|
Text = "Level Grid Placeholder\nRobot marker, terrain, props, hazards, and underground overlays will render here.",
|
|
HorizontalAlignment = HorizontalAlignment.Center,
|
|
VerticalAlignment = VerticalAlignment.Center,
|
|
AutowrapMode = TextServer.AutowrapMode.WordSmart
|
|
};
|
|
panel.AddChild(label);
|
|
return panel;
|
|
}
|
|
|
|
private static VBoxContainer CreateSidePanel(CampaignLevel level)
|
|
{
|
|
var sidePanel = new VBoxContainer { CustomMinimumSize = new(300, 0) };
|
|
sidePanel.AddChild(new Label { Text = "Inspector" });
|
|
sidePanel.AddChild(new CellInspector());
|
|
sidePanel.AddChild(new ForecastList());
|
|
sidePanel.AddChild(new Label { Text = $"Level JSON: {level.LevelPath}", AutowrapMode = TextServer.AutowrapMode.WordSmart });
|
|
return sidePanel;
|
|
}
|
|
|
|
private HBoxContainer CreateActionBar()
|
|
{
|
|
var actions = new HBoxContainer();
|
|
actions.AddChild(CreateButton("Move", () => { }, "Quick action placeholder"));
|
|
actions.AddChild(CreateButton("Interact", () => { }, "Lengthy action placeholder"));
|
|
actions.AddChild(CreateButton("Repair", () => { }, "Lengthy action placeholder"));
|
|
actions.AddChild(CreateButton("Trigger Win", ShowWinOverlay));
|
|
actions.AddChild(CreateButton("Trigger Lose", ShowLoseOverlay));
|
|
actions.AddChild(CreateButton("Main Menu", () => m_App?.ShowMainMenu()));
|
|
return actions;
|
|
}
|
|
|
|
private void ShowLoseOverlay()
|
|
{
|
|
if (m_OutcomeVisible || m_App is null || m_Level is null || m_OverlayLayer is null)
|
|
return;
|
|
|
|
m_OutcomeVisible = true;
|
|
var overlay = new LoseOverlay();
|
|
overlay.Configure(m_Level, m_App.RetryCurrentLevel, m_App.ShowGameOver, m_App.ShowMainMenu);
|
|
AddCenteredOverlay(overlay);
|
|
}
|
|
|
|
private void ShowWinOverlay()
|
|
{
|
|
if (m_OutcomeVisible || m_App is null || m_Level is null || m_OverlayLayer is null)
|
|
return;
|
|
|
|
m_OutcomeVisible = true;
|
|
var overlay = new WinOverlay();
|
|
overlay.Configure(m_Level, m_App.CompleteCurrentLevel, m_App.ShowMainMenu);
|
|
AddCenteredOverlay(overlay);
|
|
}
|
|
|
|
private void AddCenteredOverlay(Control overlay)
|
|
{
|
|
var center = new CenterContainer {
|
|
AnchorRight = 1,
|
|
AnchorBottom = 1
|
|
};
|
|
center.AddChild(overlay);
|
|
m_OverlayLayer?.AddChild(center);
|
|
}
|
|
|
|
private AppController? m_App;
|
|
private CampaignLevel? m_Level;
|
|
private bool m_OutcomeVisible;
|
|
private CanvasLayer? m_OverlayLayer;
|
|
} |