/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
gameUI-clean
PPAGameUI/ViewModels/MainMenuViewModel.cs
134 строки
4 KB
Artemiy Ivanov
PPAGame + PPAGameUI Avalonia UI
02 июн 2026, 13:42
02 июн 2026, 13:42
c122c02
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Windows.Input; using ArmyBattleGame; namespace PPAGameUI.ViewModels; public class MainMenuViewModel : INotifyPropertyChanged { private readonly MainWindowViewModel _main; private readonly GameSaveService _saveService = new(); public List<SaveEntryViewModel> Saves { get; private set; } = new(); public bool HasSaves => Saves.Count > 0; private SaveEntryViewModel? _selectedSave; public SaveEntryViewModel? SelectedSave { get => _selectedSave; private set { _selectedSave = value; OnPropertyChanged(); OnPropertyChanged(nameof(PreviewLog)); OnPropertyChanged(nameof(HasPreviewLog)); OnPropertyChanged(nameof(ShowUnitRef)); } } public bool HasPreviewLog => _selectedSave != null; public bool ShowUnitRef => _selectedSave == null; public List<string> PreviewLog => _selectedSave?.BattleLog ?? new List<string>(); public string PreviewTitle => _selectedSave?.DisplayText ?? ""; public ICommand NewGameCommand { get; } public ICommand LoadGameCommand { get; } public ICommand DeleteSaveCommand { get; } public ICommand SelectSaveCommand { get; } public ICommand ExitCommand { get; } public MainMenuViewModel(MainWindowViewModel main) { _main = main; NewGameCommand = new RelayCommand(_main.ShowSetup); LoadGameCommand = new RelayCommand<SaveEntryViewModel>(LoadGame); DeleteSaveCommand = new RelayCommand<SaveEntryViewModel>(DeleteSave); SelectSaveCommand = new RelayCommand<SaveEntryViewModel>(vm => SelectedSave = vm); ExitCommand = new RelayCommand(_main.Exit); RefreshSaves(); } private void RefreshSaves() { SelectedSave = null; Saves = new List<SaveEntryViewModel>(); foreach (var entry in _saveService.ListSaves()) Saves.Add(new SaveEntryViewModel(entry)); OnPropertyChanged(nameof(Saves)); OnPropertyChanged(nameof(HasSaves)); } private void LoadGame(SaveEntryViewModel? entry) { if (entry == null) return; var save = _saveService.Load(entry.FilePath); if (save == null) return; var strategy = ArmyBattleGame.Game.CreateStrategy(save.FormationStrategy); var army1 = _saveService.DeserializeArmy(save.Army1, strategy); var army2 = _saveService.DeserializeArmy(save.Army2, strategy); var observers = new BattleObservers(); observers.Attach(army1); observers.Attach(army2); var logger = new GuiBattleLogger(LogMode.Full); var battle = new BattleField(army1, army2, logger, save.TurnCounter, save.IsArmy1Turn, strategy); var battleVm = new BattleViewModel( battle, _saveService, save.Budget, observers, save.Army1Name, save.Army2Name, entry.FilePath, save.BattleLog); battleVm.ConnectLogger(logger); battleVm.ExitRequested += () => { RefreshSaves(); _main.ShowMainMenu(); }; _main.ShowBattle(battleVm); } private void DeleteSave(SaveEntryViewModel? entry) { if (entry == null) return; _saveService.DeleteSave(entry.FilePath); RefreshSaves(); } public event PropertyChangedEventHandler? PropertyChanged; private void OnPropertyChanged([CallerMemberName] string? name = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } public class SaveEntryViewModel { private readonly SaveEntry _entry; public SaveEntryViewModel(SaveEntry entry) => _entry = entry; public string FilePath => _entry.FilePath; public string DisplayText => $"{_entry.Data.SavedAt:dd.MM HH:mm} | " + $"Ход {_entry.Data.TurnCounter} | " + $"{_entry.Data.Army1Name} vs {_entry.Data.Army2Name} | " + $"{_entry.Data.Army1.Count} vs {_entry.Data.Army2.Count} юн."; // Лог хранится с новыми записями в начале (Insert(0,...)), выводим в хронологическом порядке public List<string> BattleLog => _entry.Data.BattleLog.AsEnumerable().Reverse().ToList(); }