Население — часть Поселения: найм из жителей, история голода; стройка на сетке

This commit is contained in:
2026-10-28 22:11:36 +03:00
parent 6567b78ecf
commit 10b58fee22
27 changed files with 1067 additions and 109 deletions
+33 -6
View File
@@ -1,11 +1,33 @@
# Поселение
Здания и развитие города: Ратуша, участки под застройку, постройка зданий, восстановление города из сохранения.
Город: его здания и люди.
- **Сборка:** `Bogatyri.Settlement`.
- **Папка:** `Assets/Scripts/Modules/Settlement`.
- **Здания** (этот документ): Ратуша, свободная стройка на сетке, постройка зданий, восстановление города из сохранения.
- **Люди** — жители, рабочие, еда, голод, прирост, жильё, найм воинов: [Поселение: население](Population.md).
- **Сборки:** `Bogatyri.Settlement` (здания, Unity), `Bogatyri.Settlement.Population` (люди, без Unity).
- **Папка:** `Assets/Scripts/Modules/Settlement`, люди — `Settlement/Population`.
- **Зависит от:** ядра. Ресурсы на стройку берёт через `IEconomy`.
## Стройка на сетке
Игрок сам выбирает, где строить. Участки (`BuildSlot`) больше не нужны: они и площадки «Застройка» прячутся при запуске, сцену менять не надо.
- **Сетка (`BuildGrid`).** Клетка — 1 единица мира, сетка прямоугольная. Область стройки — прямоугольник вокруг старых участков и Ратуши с запасом `padding` (3 клетки). Можно задать руками: поставить `BuildGrid` на сцену, `autoArea = false`, `areaMin` / `areaMax`. Объект создаётся сам, если его нет.
- **Занятые клетки:** под Ратушей и под каждым построенным зданием. Пересчёт раз в 0.3 с, пока сетка видна, и перед каждой постройкой.
- **Размер здания:** `BuildingData.footprint` (ширина × высота в клетках). `0 × 0` — посчитать по `BoxCollider2D` префаба (иначе по картинке), округлив до клеток. Размер здания задаётся там же, в карточке здания.
- **Призрак (`BuildGhost`):** полупрозрачная копия картинки здания и пятно клеток под ней — зелёное (свободно) или красное (занято / за границей). Только картинка: скриптов и коллайдеров нет, экономика его не видит.
- **Постройка:** `BuildManager.BuildAt(data, cell)` — проверяет клетки и ресурсы, списывает цену, ставит префаб так, чтобы его коллайдер лёг на клетки призрака, публикует `BuildingPlacedEvent`. `CanBuildAt(data, cell)` — та же проверка без постройки.
- **Старые сохранения:** здания встают на свои позиции, занятость считается по тому, какие клетки здание накрывает. Ничего переносить не нужно.
Управление — `Meta/Build/BuildModeController` (слой приложения):
1. «СТРОЙКА» — сетка на земле, подсказка сверху, список зданий (размер в клетках, цена; закрытые по уровню Ратуши — серые).
2. «Выбрать» — призрак встаёт в центр экрана или на ближайшее свободное место.
3. Тащить призрак пальцем (за пятно) или тапнуть по земле — призрак прыгает туда. Камера в это время стоит (`UIBlocker.WorldInputCaptured`).
4. Нижняя панель: «Поставить» (место свободно и хватает ресурсов), «Другое», «Отмена».
5. После постройки режим остаётся; «Здания» сверху — строить дальше, «Выйти» — сетка прячется.
## Контракт `ISettlement`
| Свойство | Что значит |
@@ -39,10 +61,12 @@
| Файл | Что это |
| --- | --- |
| `SettlementModule.cs` | Точка входа: `ISettlement`, сохранение города, восстановление на сцене. |
| `BuildManager.cs` | Режим стройки, список зданий, участки. |
| `BuildingData.cs` | Описание здания (ScriptableObject): префаб, цена, нужный уровень Ратуши. |
| `BuildManager.cs` | Список зданий, постройка на сетке (`BuildAt`), поиск данных здания по имени. |
| `BuildGrid.cs` | Сетка стройки: область, занятые клетки, рисунок сетки. Там же `BuildFootprint` — размер здания в клетках. |
| `BuildGhost.cs` | Призрак здания в режиме стройки. |
| `BuildingData.cs` | Описание здания (ScriptableObject): префаб, размер на сетке, цена, нужный уровень Ратуши. |
| `TownHall.cs` | Ратуша и её улучшение. Раньше файл назывался `NewEmptyCSharpScript.cs`. |
| `BuildSlot.cs` | Участок под здание и связь здания с участком. |
| `BuildSlot.cs` | Участок под здание (старая схема, участки прячутся) и связь здания с участком. |
| `PlacedBuildingId.cs` | Метка построенного здания. Раньше файл назывался `PlaceBuilding.cs`. |
В слое приложения остаются `BuildMenuUi.cs`, `Meta/Build/*` (Казармы, `BuildModeController`).
@@ -53,11 +77,14 @@
- Лимит населения = база Ратуши + сумма Домов + бонусы, значения из `EconomyConfig`.
- Уровень поселения задаёт доступные уровни и количество жилья, а также минимальный гражданский резерв.
- **Этап 3:** рабочие места в зданиях (`BuildingData`), экран распределения рабочих.
- **Стройка на сетке (27.10.2026, по просьбе Володи):** вернулись к свободной стройке — игрок сам выбирает место, сетка показывает границы и красные занятые клетки, у зданий разный размер.
- **Этап 4 (утверждён без изменений):** доступность зданий зависит от месторождений позиции.
## Журнал изменений
| Дата | Кто | Что |
| --- | --- | --- |
| 28.10.2026 | Claude | Население стало частью Поселения (`Settlement/Population`, сборка `Bogatyri.Settlement.Population`) — как на схеме Димы. Подробности — [Population.md](Population.md). |
| 27.10.2026 | Claude | Свободная стройка на сетке: `BuildGrid`, `BuildGhost`, `BuildingData.footprint`, `BuildManager.BuildAt` / `CanBuildAt` / `FindData`. Участки и площадки «Застройка» прячутся. Новый `BuildModeController` (призрак, «Поставить / Другое / Отмена»), камера не двигается, пока тащат призрак. |
| 19.10.2026 | Claude | `ResetState()` для сброса сохранений. Убранные здания помечаются, чтобы запись в том же кадре их не сохранила. |
| 19.10.2026 | Claude | Модуль выделен. Стройка и Ратуша платят через `IEconomy`. Сохранение города перенесено из `SaveManager` в `SettlementModule` (секция `"settlement"`). Восстановление защищено от двойного запуска и от освобождения занятого участка. Файлы переименованы под имена классов. |