using OpenTheBox.Core; using OpenTheBox.Core.Enums; using Spectre.Console; using Spectre.Console.Rendering; namespace OpenTheBox.Rendering.Panels; /// /// Renders the player stat values in a framed panel. /// public static class StatsPanel { /// /// Builds a renderable stats display from the current game state. /// Only stats present in are shown. /// public static IRenderable Render(GameState state) { var rows = new List(); 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" }; }