CareerSaveHud.razor

Career save status banner UI for the match HUD. Shows a recovered or unsaved-progress message in Russian or English, with retry and acknowledge buttons wired to MatchController.

@using Sandbox
@using Sandbox.UI
@using Socer
@using System
@using System.Linq
@inherits PanelComponent

<root class="career-save-overlay localized-text">
@if(Game?.Career!=null && Game.PersistenceState!=CareerPersistenceState.Healthy)
{
    var recovered=Game.PersistenceState==CareerPersistenceState.Recovered;
    var blocked=Game.PersistenceState==CareerPersistenceState.RecoveryRequired;
    <div class="career-save-banner @(recovered?"recovered":"save-error") @(Game.ClubOpen?"":"in-match")">
        <div class="career-save-mark"><label>@(recovered?"✓":"!")</label></div>
        <div class="career-save-copy">
            <label class="career-save-title">@Text(recovered?"Восстановлено из резервной копии":"Прогресс не сохраняется",recovered?"Restored from backup":"Progress is not being saved")</label>
            <label class="career-save-description">@(recovered?Text("Загружена последняя рабочая копия. Недавние изменения могли не сохраниться.","The last working copy was loaded. Recent changes may be missing."):blocked?Text("Сохранение недоступно. Игра работает только в этой сессии; исходные файлы сохранены.","The save is unavailable. This session cannot be saved; the original files are preserved."):Text("Изменения пока только в этой сессии. Повторяем запись автоматически; дождитесь восстановления перед выходом.","Changes exist only in this session. Saving will retry automatically; wait for recovery before leaving."))</label>
            @if(blocked && !Game.CanRetryCareerSave){<label class="career-save-return">@Text("Вернитесь в клуб и завершите матч, чтобы повторить восстановление.","Return to the club and finish the match before retrying recovery.")</label>}
        </div>
        @if(recovered){<button class="career-save-acknowledge" onclick=@(()=>Game.AcknowledgeCareerRecovery())>@Text("Понятно","Got it")</button>}
        else{<button class="career-save-retry" disabled="@(!Game.CanRetryCareerSave)" onclick=@(()=>Game.RetryCareerSave())>@(blocked?Text("Повторить восстановление","Retry recovery"):Text("Повторить запись","Retry saving"))</button>}
    </div>
}
</root>

@code {
    MatchController cachedGame;
    MatchController Game
    {
        get
        {
            if(cachedGame?.GameObject?.IsValid!=true || cachedGame.Scene!=Scene)
                cachedGame=Scene.GetAllComponents<MatchController>().FirstOrDefault();
            return cachedGame;
        }
    }
    static string Text(string ru,string en)=>GamePreferences.Russian?ru:en;
    protected override int BuildHash()=>HashCode.Combine(Game?.CareerSaveRevision,Game?.PersistenceState,Game?.CanRetryCareerSave,Game?.ClubOpen,GamePreferences.Revision);
}