UI/HUD/RoundRecapMenu.razor
@namespace Sandbox.UI
@using System;
@using System.Collections.Generic;
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
<root>
<style>
RoundRecapMenu {
position: absolute;
inset: 0;
pointer-events: none;
justify-content: center;
align-items: center;
font-family: sans-serif;
}
.recap-backdrop {
position: absolute;
inset: 0;
background-color: rgba(0, 0, 0, 0.85);
justify-content: center;
align-items: center;
pointer-events: all;
}
.recap-box {
width: 620px;
max-height: 85%;
background-color: rgba(14, 16, 22, 0.98);
border: 2px solid #e5a93c;
border-radius: 4px;
box-shadow: 0 24px 60px rgba(0, 0, 0, 0.95);
padding: 28px;
flex-direction: column;
}
.recap-header {
flex-direction: column;
align-items: center;
border-bottom: 1px solid rgba(229, 169, 60, 0.3);
padding-bottom: 16px;
margin-bottom: 16px;
}
.recap-title {
font-size: 24px;
font-weight: 900;
color: #ffd57e;
letter-spacing: 4px;
text-transform: uppercase;
}
.stats-summary {
flex-direction: row;
justify-content: space-around;
padding: 14px 0;
background-color: rgba(255, 255, 255, 0.03);
border-radius: 3px;
margin-bottom: 16px;
}
.stat-block {
flex-direction: column;
align-items: center;
}
.stat-val {
font-size: 22px;
font-weight: 900;
color: #f8fafc;
font-family: monospace;
}
.stat-lbl {
font-size: 9px;
font-weight: 800;
color: #94a3b8;
letter-spacing: 1.5px;
text-transform: uppercase;
margin-top: 3px;
}
.scroll-list {
flex-direction: column;
max-height: 200px;
overflow-y: scroll;
gap: 4px;
padding-right: 8px;
margin-bottom: 24px;
}
.feat-row {
flex-direction: row;
justify-content: space-between;
padding: 6px 10px;
background-color: rgba(255, 255, 255, 0.04);
border-radius: 2px;
font-size: 11px;
font-weight: 800;
color: #e2e8f0;
text-transform: uppercase;
}
.btn-continue {
align-self: center;
width: 280px;
text-align: center;
}
</style>
@if ( GameManager.Instance?.CurrentPhase == GamePhase.RoundRecap )
{
<div class="recap-backdrop">
<div class="recap-box">
<div class="recap-header">
<span class="recap-title">Round @(GameManager.Instance.CurrentRoundIndex + 1) Debrief</span>
</div>
<div class="stats-summary">
<div class="stat-block">
<span class="stat-val">@(RoundTracker.Instance?.KillsCount ?? 0)</span>
<span class="stat-lbl">Gladiators Slain</span>
</div>
<div class="stat-block">
@{
int gain = GameManager.Instance?.LastRoundFanGain ?? 0;
string gainColor = gain >= 0 ? "#4ade80" : "#ef4444";
string gainText = (gain >= 0 ? "+" : "") + gain;
}
<span class="stat-val" style="color: @gainColor;">@gainText</span>
<span class="stat-lbl">Fans Gained</span>
</div>
<div class="stat-block">
<span class="stat-val" style="color: #ffd57e;">
@($"{GameManager.Instance?.TotalFans ?? 0} / {GameManager.TargetFans}")
</span>
<span class="stat-lbl">Total Support</span>
</div>
</div>
<div class="scroll-list">
@if ( RoundTracker.Instance != null )
{
@foreach ( var kvp in RoundTracker.Instance.PlayerActionsCount )
{
if ( kvp.Value <= 0 ) continue;
var display = GetActionDisplay( kvp.Key );
<div class="feat-row">
<span>@display.Title</span>
<span style="color: @display.ColorHex;">x @kvp.Value</span>
</div>
}
}
</div>
<button class="btn-roman btn-continue" @onclick=@OnContinuePressed>Return to Camp</button>
</div>
</div>
}
</root>
@code {
protected override void OnUpdate()
{
if ( GameManager.Instance?.CurrentPhase == GamePhase.RoundRecap )
{
UIStateManager.RequestFocus( this );
}
}
private void OnContinuePressed()
{
UIStateManager.ReleaseFocus( this );
GameManager.Instance?.AdvanceToNextRoundOrBuffer();
}
private (string Title, string ColorHex) GetActionDisplay( CrowdAction action )
{
var def = CrowdEvaluator.Instance?.Config?.GetDefinition( action );
if ( def != null && !string.IsNullOrWhiteSpace( def.Title ) )
{
return (def.Title, def.DisplayColor.Hex);
}
var fallback = CrowdEventDisplay.GetMetadata( action );
return (fallback.Title, fallback.DisplayColor.Hex);
}
protected override int BuildHash()
{
return HashCode.Combine(
RoundTracker.Instance?.KillsCount,
GameManager.Instance?.TotalFans,
GameManager.Instance?.LastRoundFanGain,
GameManager.Instance?.CurrentPhase
);
}
}