using System; using System.Collections.Generic; using UnityEngine; // МОДУЛЬ ПОСЕЛЕНИЯ: точка входа. Реализует ISettlement и сам сохраняет город (секция "settlement"). // Документ: Docs/Modules/Settlement.md // // 2D-город (сцена MVP1) удалён 06.11: город -- 3D-поселение, его сохраняет City3D/City3DSave (секция "settlement3d"). // Здесь -- контракт ISettlement (уровень Ратуши, число зданий) и старая секция "settlement": она читается и // сохраняется как есть, без изменений, -- по ней 3D-поселение один раз переносит здания игрока (MoveFrom2D). public static class SettlementModule { [Serializable] public class PlacedBuildingSaveEntry { public string buildingName; // имя здания игры ("Казармы", "Лес"...) -- City3DGameplay.Type3DFor public float posX; public float posY; public int level; // Стройка или улучшение, которое ещё идёт (01.11): 0 -- нет, 1 -- постройка, 2 -- улучшение public int timerKind; public long timerStartMs; public long timerEndMs; public int timerTargetLevel; } // Имена полей совпадают со старым save.json -- старые сохранения читаются без переделки [Serializable] public class SettlementSaveData { public int townHallLevel = 1; // Улучшение Ратуши, которое ещё идёт (01.11): timerEndMs 0 -- нет public long townHallTimerStartMs; public long townHallTimerEndMs; public int townHallTimerTargetLevel; public List placedBuildings = new List(); } static SettlementSaveData cached; // 2D-город из файла (сцены 2D-города больше нет) // 2D-город из сохранения -- только для чтения: по нему 3D-поселение один раз переносит здания игрока (05.11). // null -- 2D-города в сохранении нет. Сами данные 2D не меняются и остаются в файле public static SettlementSaveData Saved2D => cached; static readonly Service service = new Service(); [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)] static void Init() { cached = null; lastTownHallLevel = 0; GameServices.Register(service); SaveRegistry.Register(service); } // Город открыт: в сцене есть Ратуша (3D-поселение вешает TownHall на свою Ратушу) static bool CityLoaded => TownHall.Instance != null; static int lastTownHallLevel; // уровень Ратуши последнего открытого города (0 -- ещё не открывали) // ---------------- Контракты ---------------- class Service : ISettlement, ISaveParticipant { // Ратуша открытого города. Вне города (карта мира) -- последнего открытого; ни разу не открывали -- из старого 2D-сохранения public int TownHallLevel { get { if (TownHall.Instance != null) lastTownHallLevel = TownHall.Instance.currentLevel; return lastTownHallLevel > 0 ? lastTownHallLevel : (cached?.townHallLevel ?? 1); } } public int BuildingCount => CityLoaded ? UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None).Length : (cached?.placedBuildings.Count ?? 0); public bool IsCityLoaded => CityLoaded; public string SaveKey => "settlement"; // Старая секция 2D-города -- как есть (для переноса в 3D); нет её -- ничего не пишем public string Capture() => cached != null ? JsonUtility.ToJson(cached) : null; // Новая игра: старого 2D-города нет (3D-поселение сбрасывает City3DSave) public void ResetState() { cached = new SettlementSaveData(); lastTownHallLevel = 0; } public void Restore(string json) { cached = JsonUtility.FromJson(json) ?? new SettlementSaveData(); if (cached.placedBuildings == null) cached.placedBuildings = new List(); } } }