Интеграция 3D: сохранение в первом кадре не затирает 3D-город; Ратуша на карте мира -- из последнего открытого города

CaptureState до ApplySaved отдаёт загруженное состояние (поход, вернувшийся офлайн, сохранял пустой город).
ISettlement.TownHallLevel вне города -- уровень Ратуши последнего открытого города (2D или 3D).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Alexander
2026-11-05 16:22:23 +01:00
co-authored by Claude Opus 5.5
parent a03098ffe0
commit 56b66af0c3
3 changed files with 17 additions and 2 deletions
@@ -135,6 +135,9 @@ public class City3DController : MonoBehaviour, City3DSave.ILive
public City3DSave.Data CaptureState()
{
// Сохранённый город ещё не поставлен (сохранение в первом кадре -- например, поход вернулся офлайн):
// отдаём то, что было загружено, иначе пустая сцена затёрла бы весь 3D-город
if (!stateApplied || map == null) return City3DSave.Cached;
var d = new City3DSave.Data { nextId = nextBuildingId };
foreach (var b in map.Buildings)
{
@@ -44,11 +44,13 @@ public static class SettlementModule
{
cached = null;
appliedToBuildManager = null;
lastTownHallLevel = 0;
GameServices.Register<ISettlement>(service);
SaveRegistry.Register(service);
}
static bool CityLoaded => BuildManager.Instance != null;
static int lastTownHallLevel; // уровень Ратуши последнего открытого города (0 -- ещё не открывали)
// ---------------- Сцена города <-> данные ----------------
@@ -185,8 +187,16 @@ public static class SettlementModule
class Service : ISettlement, ISaveParticipant
{
public int TownHallLevel =>
TownHall.Instance != null ? TownHall.Instance.currentLevel : (cached?.townHallLevel ?? 1);
// Ратуша открытого города -- 2D или 3D. Вне города (карта мира) -- последнего открытого: в 3D-поселении
// уровень Ратуши свой (секция settlement3d), и 2D-сохранение показывало бы на карте чужой уровень (05.11)
public int TownHallLevel
{
get
{
if (TownHall.Instance != null) lastTownHallLevel = TownHall.Instance.currentLevel;
return lastTownHallLevel > 0 ? lastTownHallLevel : (cached?.townHallLevel ?? 1);
}
}
public int BuildingCount =>
CityLoaded
@@ -208,6 +218,7 @@ public static class SettlementModule
public void ResetState()
{
cached = new SettlementSaveData();
lastTownHallLevel = 0;
if (!CityLoaded) return;
ClearPlacedBuildings();