From 35319be8ca5673d681a282b577d9f38da877919a Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 5 Nov 2026 17:12:10 +0100 Subject: [PATCH] =?UTF-8?q?3D:=20=D0=B4=D1=8B=D0=BC=D0=BA=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=B4=D1=91=D1=82=20=D0=B7=D0=B0=20=D0=BA=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=20(=D0=BE=D1=82=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20?= =?UTF-8?q?=D0=BD=D0=B5=20=C2=AB=D1=81=D0=B5=D1=80=D0=B5=D0=B5=D1=82=C2=BB?= =?UTF-8?q?);=20=C2=AB=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B8=D1=82=D1=8C?= =?UTF-8?q?=C2=BB=20=D0=BE=D0=B6=D0=B8=D0=B2=D0=B0=D0=B5=D1=82,=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B3=D0=B4=D0=B0=20=D1=80=D0=B5=D1=81=D1=83=D1=80=D1=81?= =?UTF-8?q?=D0=BE=D0=B2=20=D1=81=D1=82=D0=B0=D0=BB=D0=BE=20=D1=85=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D0=B0=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- Assets/Scripts/App/BuildingWindow.cs | 20 +++++++++++++++++++- Assets/Scripts/City3D/City3DCamera.cs | 9 +++++++++ Docs/Modules/Settlement.md | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Assets/Scripts/App/BuildingWindow.cs b/Assets/Scripts/App/BuildingWindow.cs index 313a940..20bdb75 100644 --- a/Assets/Scripts/App/BuildingWindow.cs +++ b/Assets/Scripts/App/BuildingWindow.cs @@ -320,7 +320,7 @@ public static class BuildingWindow } Rebuild(); }, -1, 80, 26); - b.interactable = canPay; + LiveAfford(b, canPay, () => townHall != null && townHall.CanUpgrade()); } // Каких зданий на следующем уровне Ратуши можно построить больше: "Лес 2 → 3, Дом 3 → 4" @@ -554,7 +554,25 @@ public static class BuildingWindow } Rebuild(); }, -1, 80, 26); + LiveAfford(b, canPay, () => GameServices.TryGet(out IEconomy now) && now.CanAfford(cost)); + } + + // Кнопка «Улучшить» следит за ресурсами, пока окно открыто: ресурсов стало хватать -- зелёная и нажимается, + // перестало -- серая (05.11: раньше нужно было закрыть и открыть окно) + static void LiveAfford(Button b, bool canPay, Func can) + { b.interactable = canPay; + bool shown = canPay; + live.Add(() => + { + if (b == null) return; + bool c = can(); + if (c == shown) return; + shown = c; + b.interactable = c; + var img = b.GetComponent(); + if (img != null) img.color = c ? UIKit.Theme.Green : UIKit.Theme.Gray; + }); } // ---------------- Стройка по времени (BuildTimer) ---------------- diff --git a/Assets/Scripts/City3D/City3DCamera.cs b/Assets/Scripts/City3D/City3DCamera.cs index 1211385..3e728f9 100644 --- a/Assets/Scripts/City3D/City3DCamera.cs +++ b/Assets/Scripts/City3D/City3DCamera.cs @@ -99,11 +99,20 @@ public class City3DCamera : MonoBehaviour target.y = 0; } + // Дымка начинается за городом, а не на фиксированном расстоянии от камеры: иначе при отдалении весь город + // уходил в серую дымку -- казалось, что камера не отдаляется, а сцена сереет (05.11) + public float fogStartBehind = 4f, fogEndBehind = 59f; + public void Apply() { Quaternion rot = Quaternion.Euler(pitch, yaw, 0); transform.rotation = rot; transform.position = target - rot * Vector3.forward * distance; + if (RenderSettings.fog && RenderSettings.fogMode == FogMode.Linear) + { + RenderSettings.fogStartDistance = distance + fogStartBehind; + RenderSettings.fogEndDistance = distance + fogEndBehind; + } } // Точка на плоскости земли (y = 0) под экранной точкой diff --git a/Docs/Modules/Settlement.md b/Docs/Modules/Settlement.md index 91f1330..f670ab1 100644 --- a/Docs/Modules/Settlement.md +++ b/Docs/Modules/Settlement.md @@ -119,6 +119,7 @@ | Дата | Кто | Что | | --- | --- | --- | +| 05.11.2026 | Claude (Саша) | 3D: дымка идёт за камерой (`City3DCamera.Apply`: начало и конец — от расстояния камеры), поэтому при отдалении город больше не уходит в серую дымку. Окно здания: кнопка «Улучшить» (Ратуша и уровни зданий) сама становится зелёной, когда ресурсов стало хватать (`BuildingWindow.LiveAfford`) — не нужно закрывать и открывать окно. | | 05.11.2026 | Claude (Саша) | 3D: здание, которое ещё строится, теперь видно — оно серее, над ним «Стройка 0:45» (`BuildTimer` затемнял только 2D-спрайты, поэтому Казармы выглядели готовыми, а «Войска» писали «казарм: 0»). Окно «Войска»: пока Казармы строятся — «Казармы строятся, осталось …», после стройки окно перерисовывается само; «Построить Казармы» в 3D ставит призрак Казарм (`City3DController.PlaceBuilding`). Кнопки «+ / −» справа — приближение камеры (в Device Simulator колесо мыши не доходит до игры). | | 05.11.2026 | Claude (Саша) | Интеграция 3D: (1) снимок 3D-города для сохранения до расстановки сохранённых зданий отдаёт загруженное состояние — сохранение в первом кадре (поход вернулся офлайн) больше не затирает 3D-город пустым; (2) `ISettlement.TownHallLevel` вне города — уровень Ратуши последнего открытого города (2D или 3D), а не всегда 2D-сохранения: на карте мира предел жилья, резерв и открытие войск считаются по 3D-Ратуше. | | 04.11.2026 | Claude | Решения 04.11: снос убран, остался бесплатный перенос; офлайн по временным меткам — стройка, закончившаяся офлайн, вступает в силу в момент завершения внутри расчёта добычи (`ConstructionClock`, `GameTimeSimulatedEvent`, `BuildTimer.MayComplete`); проверки таймеров из сохранения; уровень при завершении только растёт. |