PlatformAchievementsView.razor

A Razor UI panel listing s&box platform achievements from PlatformAchievementRules.All, showing icon, localized title and description, and one of three states: unlocked in s&box, requirement met, or not earned yet. Rebuilds its hash when the game's PlatformAchievementRevision or the Russian language preference changes.

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

<root class="platform-achievements localized-text">
    <label class="platform-title">@T("Достижения s&box","s&box achievements")</label>
    <label class="platform-help">@T("Достижения сохраняются в профиле s&box. Награды клуба и сезонных заданий забираются отдельно.","Achievements belong to your s&box profile. Claim club and seasonal rewards separately.")</label>
    <div class="platform-grid">
        @foreach(var achievement in PlatformAchievementRules.All)
        {
            bool confirmed=Game?.ConfirmedPlatformAchievement(achievement.Id)==true;
            bool earned=Game?.EarnedPlatformAchievement(achievement.Id)==true;
            <div class="platform-achievement @(confirmed?"confirmed":earned?"earned":"locked")">
                <img src="@($"/ui-icons/achievements/{achievement.Id}.png")" />
                <div><label>@(GamePreferences.Russian?achievement.RussianTitle:achievement.EnglishTitle)</label><span>@(GamePreferences.Russian?achievement.RussianDescription:achievement.EnglishDescription)</span><small>@(confirmed?T("Получено в s&box","Unlocked in s&box"):earned?T("Условие выполнено","Requirement met"):T("Ещё не выполнено","Not earned yet"))</small></div>
            </div>
        }
    </div>
</root>

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