openthebox/src/OpenTheBox/Rendering/Panels/StatsPanel.cs

55 lines
1.6 KiB
C#
Raw Normal View History

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"
};
}