using System; using System.Collections.Generic; // Всё, что сохраняется в progress.json (отдельно от save.json с ресурсами и зданиями). // JsonUtility умеет: числа, строки, bool, массивы, List<> из [Serializable]-классов. [Serializable] public class MailItem { public int id; public string title; public string body; public long sentTicks; public bool read; public bool claimed; public List rewards = new List(); public bool HasRewards { get { return rewards != null && rewards.Count > 0; } } } [Serializable] public class TrainingOrder { public int troopIndex; public int count; public long startTicks; public long endTicks; } [Serializable] public class ArenaOpponent { public string name; public int power; public int rating; } [Serializable] public class ProgressData { // --- Профиль --- public string playerName = "Командир"; public string playerId = ""; public int avatarIndex = 0; public int level = 1; public int xp = 0; public long firstLaunchTicks = 0; public int daysPlayed = 0; public int lastLoginDay = -1; // --- Настройки --- public float musicVolume = 0.8f; public float soundVolume = 0.8f; public bool vibration = true; public bool notifications = true; public int quality = 1; // 0 низкое, 1 среднее, 2 высокое public bool fps60 = true; // --- Статистика (для профиля и заданий) --- public float[] collected = new float[8]; // индекс = (int)ResourceType public int battlesWon; public int battlesLost; public int troopsTrained; public int arenaFights; public int arenaWins; public int questsDone; // --- Задания --- public List claimedQuests = new List(); public int dailyDay = -1; public List claimedDaily = new List(); public float[] dailyCollected = new float[8]; public int dailyBattles; public int dailyTroops; public int dailyArena; public int dailyMarches; // --- Награда за вход --- public int loginRewardIndex = 0; // какой день из 7 следующий public int lastLoginRewardDay = -1; // --- Почта --- public List mail = new List(); public int nextMailId = 1; public bool starterMailSent; // --- Магазин --- public int shopDay = -1; public List shopIds = new List(); public List shopCounts = new List(); // --- Герой --- public int heroLevel = 1; // --- Войска --- // Войска теперь хранит модуль Армии (save.json, секция "army"). Это поле -- только для переноса // из старых сохранений: при первой загрузке его читает App/GameModules, потом оно обнуляется. public int[] troops = new int[4]; public bool armyInModule; // войска уже перенесены в модуль Армии public List training = new List(); // --- Бой (кампания) --- public int battleStage = 1; // --- Арена --- public int arenaRating = 1000; public int arenaTickets = 5; public long arenaTicketTicks = 0; public List arenaOpponents = new List(); // --- Карта мира (статистика для заданий; походы ведёт модуль Мира) --- // Старая маленькая карта (панель "МИР", Meta/World) удалена 19.10.2026 -- осталась одна большая карта. // marches оставлено только для переноса: солдаты из её походов возвращаются в город при загрузке. public List marches = new List(); public int marchesSent; public int worldWins; public int worldLosses; // --- Карта мира (сцена WorldMap) --- public List sashaMarches = new List(); public List sashaMarchUnits = new List(); // только для переноса в модуль Армии // --- Событие --- public int eventWeek = -1; public int eventPoints; public int eventTroopRemainder; public List eventClaimed = new List(); } // Поход старой маленькой карты -- только чтобы при загрузке вернуть солдат в город (см. GameProgress.FixData) [Serializable] public class LegacyWorldMarch { public int[] units = new int[4]; // отправлено public int[] survivors = new int[4]; // вернутся домой public bool returning; } // Состав похода из старого progress.json (раньше хранил мост ArmyBridge) -- только для переноса в модуль Армии [Serializable] public class LegacyMarchUnits { public int marchId; public int[] units = new int[4]; }