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