Files
MVP1/Assets/Scripts/Modules/Settlement/SettlementModule.cs
T

99 lines
4.8 KiB
C#
Raw Normal View History

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<PlacedBuildingSaveEntry> placedBuildings = new List<PlacedBuildingSaveEntry>();
}
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<ISettlement>(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<PlacedBuildingId>(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<SettlementSaveData>(json) ?? new SettlementSaveData();
if (cached.placedBuildings == null) cached.placedBuildings = new List<PlacedBuildingSaveEntry>();
}
}
}