55 lines
1.6 KiB
C#
55 lines
1.6 KiB
C#
|
|
using OpenTheBox.Core;
|
||
|
|
using OpenTheBox.Core.Enums;
|
||
|
|
using Spectre.Console;
|
||
|
|
using Spectre.Console.Rendering;
|
||
|
|
|
||
|
|
namespace OpenTheBox.Rendering.Panels;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Renders the player stat values in a framed panel.
|
||
|
|
/// </summary>
|
||
|
|
public static class StatsPanel
|
||
|
|
{
|
||
|
|
/// <summary>
|
||
|
|
/// Builds a renderable stats display from the current game state.
|
||
|
|
/// Only stats present in <see cref="GameState.VisibleStats"/> are shown.
|
||
|
|
/// </summary>
|
||
|
|
public static IRenderable Render(GameState state)
|
||
|
|
{
|
||
|
|
var rows = new List<IRenderable>();
|
||
|
|
|
||
|
|
foreach (var statType in state.VisibleStats.OrderBy(s => s.ToString()))
|
||
|
|
{
|
||
|
|
if (!state.Stats.TryGetValue(statType, out int value))
|
||
|
|
continue;
|
||
|
|
|
||
|
|
string label = statType.ToString();
|
||
|
|
string color = GetStatColor(statType);
|
||
|
|
|
||
|
|
rows.Add(new Markup($" [{color}]{Markup.Escape(label)}:[/] [bold]{value}[/]"));
|
||
|
|
}
|
||
|
|
|
||
|
|
if (rows.Count == 0)
|
||
|
|
{
|
||
|
|
rows.Add(new Markup("[dim]No stats visible yet.[/]"));
|
||
|
|
}
|
||
|
|
|
||
|
|
// Add total boxes opened as a bonus stat
|
||
|
|
rows.Add(new Markup($" [silver]Boxes Opened:[/] [bold]{state.TotalBoxesOpened}[/]"));
|
||
|
|
|
||
|
|
return new Panel(new Rows(rows))
|
||
|
|
.Header("[bold magenta]Stats[/]")
|
||
|
|
.Border(BoxBorder.Rounded);
|
||
|
|
}
|
||
|
|
|
||
|
|
private static string GetStatColor(StatType type) => type.ToString().ToLowerInvariant() switch
|
||
|
|
{
|
||
|
|
"strength" or "power" => "red",
|
||
|
|
"defense" or "armor" => "blue",
|
||
|
|
"speed" or "agility" => "green",
|
||
|
|
"luck" => "gold1",
|
||
|
|
"intelligence" or "wisdom" => "purple",
|
||
|
|
_ => "silver"
|
||
|
|
};
|
||
|
|
}
|