/
Landilf
/
2413_Ryumin_CourseWork
Обзор
Документация
Войти
/
Landilf
/
2413_Ryumin_CourseWork
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
project
CourseWork/GUI/ViewModels/VictoryViewModel.cs
219 строк
5 KB
Landilf
add project
27 янв 2026, 13:57
27 янв 2026, 13:57
753b3e7
Код
Авторство
О чём код?
using GameCore.Resources; using ReactiveUI; using System.Collections.ObjectModel; namespace GUI.ViewModels; /// <summary> /// Модель представления экрана победы. /// </summary> public class VictoryViewModel : ViewModelBase { #region Поля /// <summary> /// Ссылка на главную модель. /// </summary> private readonly MainViewModel _mainViewModel; /// <summary> /// Имя пользователя. /// </summary> private string _username = "Player"; /// <summary> /// Индекс выбранной кнопки. /// </summary> private int _selectedIndex; #endregion #region Свойства /// <summary> /// Время игры. /// </summary> public TimeSpan GameTime { get; } /// <summary> /// Строковое представление времени игры. /// </summary> public string GameTimeStr => $"{GameTime:mm\\:ss}"; /// <summary> /// Имя игрока. /// </summary> public string Username { get => _username; set => this.RaiseAndSetIfChanged(ref _username, value); } /// <summary> /// Попал ли игрок в топ-10. /// </summary> public bool IsInTop { get; } /// <summary> /// Находится ли фокус на вводе имени. /// </summary> private bool _isTypingName; /// <summary> /// Находится ли фокус на вводе имени. /// </summary> public bool IsTypingName { get => _isTypingName; set => this.RaiseAndSetIfChanged(ref _isTypingName, value); } /// <summary> /// Сообщение о рекорде. /// </summary> public string TopScoreMessage => IsInTop ? Strings.VictoryNewRecord : Strings.VictoryNotTop10; /// <summary> /// Индекс выбранной кнопки. /// </summary> public int SelectedIndex { get => _selectedIndex; set { this.RaiseAndSetIfChanged(ref _selectedIndex, value); UpdateSelection(); } } /// <summary> /// Кнопки меню. /// </summary> public ObservableCollection<MenuItemVm> MenuItems { get; } #endregion #region Конструкторы /// <summary> /// Конструктор. /// </summary> /// <param name="parMainViewModel">Главная модель.</param> /// <param name="parGameTime">Время игры.</param> public VictoryViewModel(MainViewModel parMainViewModel, TimeSpan parGameTime) { _mainViewModel = parMainViewModel; GameTime = parGameTime; IsInTop = _mainViewModel.Controller.IsTopScore((int)parGameTime.TotalSeconds); IsTypingName = IsInTop; // Сразу ставим фокус на ввод, если попали в топ MenuItems = new ObservableCollection<MenuItemVm>(); MenuItems.Add(new MenuItemVm { Title = Strings.VictoryToMenu }); if (IsInTop) { MenuItems.Add(new MenuItemVm { Title = Strings.VictorySave }); } MenuItems.Add(new MenuItemVm { Title = Strings.MainMenuNewGame }); SelectedIndex = IsInTop ? 1 : 0; } #endregion #region Методы /// <summary> /// Обновляет выделение. /// </summary> private void UpdateSelection() { for (int i = 0; i < MenuItems.Count; i++) { MenuItems[i].IsSelected = (i == SelectedIndex); } } /// <summary> /// Перемещение влево. /// </summary> public void MoveLeft() { if (SelectedIndex > 0) { SelectedIndex--; } else { SelectedIndex = MenuItems.Count - 1; } } /// <summary> /// Перемещение вправо. /// </summary> public void MoveRight() { if (SelectedIndex < MenuItems.Count - 1) { SelectedIndex++; } else { SelectedIndex = 0; } } /// <summary> /// Выбор действия. /// </summary> public void Select() { var choice = MenuItems[SelectedIndex].Title; if (choice == Strings.VictoryToMenu) { _mainViewModel.GoToMenu(); } else if (choice == Strings.VictorySave) { if (_mainViewModel.Controller.HasScore(Username)) { _mainViewModel.ShowConfirmation(Strings.PromptOverwriteScore, () => { OverwriteScore(); _mainViewModel.GoToHighScores(); }); } else { SaveScore(); _mainViewModel.GoToHighScores(); } } else if (choice == Strings.MainMenuNewGame) { _mainViewModel.GoToGame(); } } /// <summary> /// Перезаписывает рекорд. /// </summary> private void OverwriteScore() { _mainViewModel.Controller.OverwriteScore(Username, (int)GameTime.TotalSeconds); } /// <summary> /// Сохраняет рекорд через движок. /// </summary> private void SaveScore() { _mainViewModel.Controller.SubmitScore(Username); } #endregion }