/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
SaveData/GameSaveService.cs
155 строк
5 KB
Zakhar Romashov
Добавили логику с бафами
29 апр 2026, 13:06
29 апр 2026, 13:06
7623dfb
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.Json; namespace ArmyBattleGame { class SaveEntry { public string FilePath { get; } public GameSaveData Data { get; } public SaveEntry(string filePath, GameSaveData data) { FilePath = filePath; Data = data; } } class GameSaveService { private const string SavesDirectory = "saves"; private static readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions { WriteIndented = true }; public bool HasAnySave() { if (!Directory.Exists(SavesDirectory)) return false; return Directory.GetFiles(SavesDirectory, "*.json").Length > 0; } public string Save(GameSaveData data) { Directory.CreateDirectory(SavesDirectory); data.SavedAt = DateTime.Now; string fileName = $"save_{data.SavedAt:yyyy-MM-dd_HH-mm-ss}.json"; string path = Path.Combine(SavesDirectory, fileName); File.WriteAllText(path, JsonSerializer.Serialize(data, _jsonOptions)); return path; } public void Overwrite(string filePath, GameSaveData data) { data.SavedAt = DateTime.Now; File.WriteAllText(filePath, JsonSerializer.Serialize(data, _jsonOptions)); } public GameSaveData? Load(string filePath) { try { string json = File.ReadAllText(filePath); return JsonSerializer.Deserialize<GameSaveData>(json); } catch (Exception ex) { ConsoleHelper.Error($"Ошибка загрузки: {ex.Message}"); ConsoleHelper.Error("Сохранение повреждено и будет удалено."); DeleteSave(filePath); return null; } } public void DeleteSave(string filePath) { if (File.Exists(filePath)) File.Delete(filePath); } public List<SaveEntry> ListSaves() { if (!Directory.Exists(SavesDirectory)) return new List<SaveEntry>(); var entries = new List<SaveEntry>(); foreach (string path in Directory.GetFiles(SavesDirectory, "*.json")) { try { string json = File.ReadAllText(path); var data = JsonSerializer.Deserialize<GameSaveData>(json); if (data != null) entries.Add(new SaveEntry(path, data)); } catch { // пропускаем повреждённые файлы } } return entries.OrderByDescending(e => e.Data.SavedAt).ToList(); } // Сериализация: всегда плоский список живых юнитов в порядке flatten. public List<UnitSaveData> SerializeArmy(Army army) { var result = new List<UnitSaveData>(); foreach (var unit in army.Flatten()) { if (unit is BuffedHeavyUnit bh) { result.Add(new UnitSaveData { UnitType = "Heavy", Health = bh.Health, HeavyBuffs = bh.Buffs.Select(k => k.ToString()).ToList(), }); continue; } result.Add(new UnitSaveData { UnitType = unit switch { HeavyUnit => "Heavy", LiteUnit => "Lite", ArcherUnit => "Archer", HealerUnit => "Healer", WizardUnit => "Wizard", GulyayGorodAdapter => "GulyayGorod", _ => throw new InvalidOperationException($"Неизвестный тип юнита: {unit.GetType().Name}") }, Health = unit.Health, Range = unit is ArcherUnit a ? a.Range : unit is HealerUnit uh ? uh.Range : unit is WizardUnit wz ? wz.Range : 0, Power = unit is ArcherUnit a2 ? a2.Power : unit is HealerUnit uh2 ? uh2.HealPower : unit is WizardUnit wz2 ? wz2.CloneChance : 0, }); } return result; } // Десериализация: создаёт армию и раскладывает юнитов согласно стратегии. public Army DeserializeArmy(List<UnitSaveData> data, IFormationStrategy strategy) { var army = new Army(); var units = new List<IUnit>(); foreach (var d in data) units.Add(UnitFactory.CreateFromSave(d)); int cols = strategy.ColumnCountFor(units.Count); army.RebuildFromFlat(units, cols); return army; } } }