UI/FighterCard.razor
@using System;
@using Sandbox;
@using Sandbox.UI;

@* A fighter's S&S2 flasks (energy, health, magicka) and armour shield, with their name banner. *@
<root class="@(Flip ? "flip" : "")">
	@if ( Fighter.IsValid() )
	{
		<div class="flasks">
			@foreach ( var f in Flasks )
			{
				<div class="flask @f.Kind">
					<div class="empty"></div>
					<div class="fill-clip" style="height: @(Pct( f.Value, f.Max ))%"><div class="full"></div></div>
					<div class="value">@($"{f.Value} / {f.Max}")</div>
					<div class="label">@f.Label</div>
				</div>
			}
		</div>
		<div class="banner">@Fighter.DisplayName</div>
	}
</root>

@code
{
	public Gladiator Fighter { get; set; }
	public bool Flip { get; set; }
	public bool Duel { get; set; }

	record FlaskInfo( string Kind, int Value, int Max, string Label );

	IEnumerable<FlaskInfo> Flasks
	{
		get
		{
			var g = Fighter;
			yield return new( "energy", g.Energy, g.MaxEnergy, "ENERGY" );
			// duels only hurt armour, so health doesn't matter there
			if ( !Duel ) yield return new( "health", g.Health, g.MaxHealth, "HEALTH" );
			if ( g.SpellBits != 0 ) yield return new( "magic", g.Magic, g.MaxMagic, "MAGICKA" );
			if ( g.MaxArmour > 0 || Duel ) yield return new( "armour", g.ArmourPoints, g.MaxArmour, "ARMOUR" );
		}
	}

	static int Pct( int value, int max ) => max <= 0 ? 0 : Math.Clamp( value * 100 / max, 0, 100 );

	protected override int BuildHash() => HashCode.Combine( Fighter, Fighter?.Health, Fighter?.Energy, Fighter?.ArmourPoints, Fighter?.MaxArmour, Fighter?.Magic, Fighter?.DisplayName, HashCode.Combine( Flip, Duel ) );
}