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