/
expens1ve
/
project_war
Обзор
Документация
Войти
/
expens1ve
/
project_war
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
solid
UI/Core/SaveLoadDialogs.cs
92 строки
5 KB
Vadim
ref: ui, gameservice
27 мар 2026, 03:05
27 мар 2026, 03:05
01746b6
Код
Авторство
О чём код?
using System; using System.IO; namespace project_war.UI.Core { /// <summary> /// Утилитарный статический класс для интерактивной работы с файлами сохранений через консоль. /// </summary> public static class SaveLoadDialogs { private const string SavedGamesFolderName = "saved_games"; /// <summary> /// Запрашивает у пользователя путь или имя для сохранения текущей игры. /// Поддерживает автоматическую генерацию имени на основе текущей даты и времени. /// </summary> /// <returns>Абсолютный путь к файлу .json для записи сохранения.</returns> public static string PromptForSaveFilePath() { var savedGamesDir = GetSavedGamesDir(); if (!Directory.Exists(savedGamesDir)) Directory.CreateDirectory(savedGamesDir); Console.WriteLine(); Console.Write($"Введите имя файла сохранения (папка '{SavedGamesFolderName}', Enter = автоимя): "); var input = Console.ReadLine(); if (string.IsNullOrWhiteSpace(input)) input = $"save_{DateTime.Now:yyyyMMdd_HHmmss}"; input = input.Trim(); if (Path.IsPathRooted(input)) { var dir = Path.GetDirectoryName(input); if (string.IsNullOrWhiteSpace(dir)) dir = Directory.GetCurrentDirectory(); if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); var fileName = EnsureJsonExtension(SanitizeFileName(Path.GetFileName(input))); return Path.Combine(dir, fileName); } return Path.Combine(savedGamesDir, EnsureJsonExtension(SanitizeFileName(Path.GetFileName(input)))); } /// <summary> /// Ищет существующие сохранения в директории '<c>saved_games</c>' /// и запрашивает у пользователя номер файла для загрузки. /// </summary> /// <returns>Абсолютный путь к выбранному файлу, либо <c>null</c>, если загрузка отменена.</returns> public static string? PromptForExistingSaveFilePath() { var savedGamesDir = GetSavedGamesDir(); if (!Directory.Exists(savedGamesDir)) return null; var files = Directory.GetFiles(savedGamesDir, "*.json"); if (files.Length == 0) return null; Console.WriteLine(); Console.WriteLine("Найденные сохранения:"); for (int i = 0; i < files.Length; i++) Console.WriteLine($"{i + 1}. {Path.GetFileNameWithoutExtension(files[i])}"); Console.Write("Выберите номер сохранения для загрузки (Enter = назад): "); var sel = Console.ReadLine(); if (string.IsNullOrWhiteSpace(sel)) return null; if (int.TryParse(sel.Trim(), out int idx) && idx >= 1 && idx <= files.Length) return files[idx - 1]; return null; } /// <summary> /// Возвращает путь к папке сохранений (использует текущую рабочую директорию). /// </summary> private static string GetSavedGamesDir() => Path.Combine(Directory.GetCurrentDirectory(), SavedGamesFolderName); /// <summary> /// Гарантирует наличие расширения .json на конце файла. /// </summary> private static string EnsureJsonExtension(string fileName) => fileName.EndsWith(".json", StringComparison.OrdinalIgnoreCase) ? fileName : fileName + ".json"; /// <summary> /// Очищает имя файла от недопустимых символов (заменяя их на нижнее подчеркивание). /// </summary> private static string SanitizeFileName(string fileName) { if (string.IsNullOrWhiteSpace(fileName)) return "save"; var invalid = Path.GetInvalidFileNameChars(); var chars = new char[fileName.Length]; int idx = 0; foreach (var ch in fileName) chars[idx++] = Array.IndexOf(invalid, ch) >= 0 ? '_' : ch; var sanitized = new string(chars, 0, idx).Trim(); return string.IsNullOrWhiteSpace(sanitized) ? "save" : sanitized; } } }