CardSkillView.razor

A Razor UI panel that displays a skill info card: icon badge, localized name, grade, role, passive/active type, effect description, bonus, trigger, stamina cost and cooldown, plus linked synergy skills. Reads from `SkillInstance` passed in as a parameter and localizes text via `GamePreferences.Russian`.

@using Sandbox
@using Sandbox.UI
@using Socer
@using System
@inherits Panel

@if(Instance!=null && UniqueSkills.Get(Instance.Skill) is { } ability)
{
    <root class="skill-info-card [email protected] localized-text">
        <div class="skill-info-heading"><SkillBadgeView Skill="@Instance.Skill" Grade="@Instance.Grade" CssClass="skill-info-icon" /><div class="skill-info-copy"><label class="skill-info-name">@ability.Name(GamePreferences.Russian)</label><label class="skill-info-grade">@($"{UniqueSkills.GradeName(Instance.Grade,GamePreferences.Russian)} · {ability.Role(GamePreferences.Russian)}")</label></div><label class="skill-info-type">@(ability.IsPassive?T("Постоянный","Passive"):T("Приём","Active"))</label></div>
        <label class="skill-info-description">@UniqueSkills.EffectDescription(Instance,GamePreferences.Russian)</label>
        @if(!string.IsNullOrEmpty(ability.Bonus(GamePreferences.Russian,Instance.Grade))){<label class="skill-info-bonus">@ability.Bonus(GamePreferences.Russian,Instance.Grade)</label>}
        <label class="skill-info-trigger">@ability.Trigger(GamePreferences.Russian)</label>
        @if(!ability.IsPassive){<div class="skill-info-cost"><label>@T($"Стамина −{ability.StaminaCost*100:0}% · требуется {ability.MinimumStamina*100:0}%",$"Stamina −{ability.StaminaCost*100:0}% · requires {ability.MinimumStamina*100:0}%")</label><label>@T($"Перезарядка {ability.CooldownSeconds/4:0.#} мин. матча",$"Cooldown {ability.CooldownSeconds/4:0.#} match minutes")</label></div>}
        @if(UniqueSkills.LinkedSkills(Instance.Skill).Count>0 || !string.IsNullOrEmpty(ability.Synergy(GamePreferences.Russian)))
        {
            <div class="skill-info-synergy">
                <label>@T("Связка","Combination")</label>
                @if(UniqueSkills.LinkedSkills(Instance.Skill).Count>0)
                {
                    <div class="skill-info-links">
                        @foreach(var linkedSkill in UniqueSkills.LinkedSkills(Instance.Skill))
                        {
                            @if(UniqueSkills.Get(linkedSkill) is { } linkedAbility)
                            {
                                <div class="skill-info-linked"><div class="skill-info-linked-icon" style="@($"background-image:url('{UniqueSkills.ArtPath(linkedSkill,1)}');")"></div><label class="skill-info-linked-name">@linkedAbility.Name(GamePreferences.Russian)</label></div>
                            }
                        }
                    </div>
                }
                @if(!string.IsNullOrEmpty(ability.Synergy(GamePreferences.Russian))){<label>@ability.Synergy(GamePreferences.Russian)</label>}
            </div>
        }
    </root>
}

@code {
    [Parameter] public SkillInstance Instance {get;set;}
    static string T(string ru,string en)=>GamePreferences.Russian?ru:en;
    protected override int BuildHash()=>HashCode.Combine(Instance?.Skill,Instance?.Grade,GamePreferences.Russian);
}