Files
MVP1/Docs/Modules/Settlement.md
T

9.7 KiB
Raw Blame History

Поселение

Город: его здания и люди.

  • Здания (этот документ): Ратуша, свободная стройка на сетке, постройка зданий, восстановление города из сохранения.

  • Люди — жители, рабочие, еда, голод, прирост, жильё, найм воинов: Поселение: население.

  • Сборки: 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

Свойство Что значит
TownHallLevel Уровень Ратуши (если город не открыт — из сохранения).
BuildingCount Сколько построек.
IsCityLoaded Открыта ли сейчас сцена города.

Получить: GameServices.Get<ISettlement>().

События

Публикует:

  • BuildingPlacedEvent — здание построено (имя здания);
  • TownHallLevelChangedEvent — Ратуша улучшена (новый уровень);
  • SettlementRestoringEvent — город начинает восстанавливаться из сохранения. На него App/GameModules добавляет Казармы в список стройки.

Слушает: ничего.

Сохранение

Секция "settlement": { "townHallLevel", "placedBuildings": [ { "buildingName", "posX", "posY", "level" } ] }.

Сброс (ResetState): Ратуша 1 уровня, постройки убраны, участки освобождены, память модуля очищена. Иначе при следующем входе в город вернулись бы старые здания.

Модуль помнит последнее состояние города, поэтому сохранение на карте мира не стирает постройки. При каждом входе в город (BuildManager.Start) здания восстанавливаются один раз. Уровень здания берётся у любого компонента с ILeveledBuilding.

Файлы

Файл Что это
SettlementModule.cs Точка входа: ISettlement, сохранение города, восстановление на сцене.
BuildManager.cs Список зданий, постройка на сетке (BuildAt), поиск данных здания по имени.
BuildGrid.cs Сетка стройки: область, занятые клетки, рисунок сетки. Там же BuildFootprint — размер здания в клетках.
BuildGhost.cs Призрак здания в режиме стройки.
BuildingData.cs Описание здания (ScriptableObject): префаб, размер на сетке, цена, нужный уровень Ратуши.
TownHall.cs Ратуша и её улучшение. Раньше файл назывался NewEmptyCSharpScript.cs.
BuildSlot.cs Участок под здание (старая схема, участки прячутся) и связь здания с участком.
PlacedBuildingId.cs Метка построенного здания. Раньше файл назывался PlaceBuilding.cs.

В слое приложения остаются BuildMenuUi.cs, Meta/Build/* (Казармы, BuildModeController).

Решения и план

  • Решение команды от 19.10.2026 (этап 2): Ратуша даёт базовую вместимость жителей, новое здание «Дом» — дополнительные места.
    • Лимит населения = база Ратуши + сумма Домов + бонусы, значения из EconomyConfig.
    • Уровень поселения задаёт доступные уровни и количество жилья, а также минимальный гражданский резерв.
  • Этап 3: рабочие места в зданиях (BuildingData), экран распределения рабочих.
  • Стройка на сетке (27.10.2026, по просьбе Володи): вернулись к свободной стройке — игрок сам выбирает место, сетка показывает границы и красные занятые клетки, у зданий разный размер.
  • Этап 4 (утверждён без изменений): доступность зданий зависит от месторождений позиции.

Журнал изменений

Дата Кто Что
28.10.2026 Claude Население стало частью Поселения (Settlement/Population, сборка Bogatyri.Settlement.Population) — как на схеме Димы. Подробности — 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"). Восстановление защищено от двойного запуска и от освобождения занятого участка. Файлы переименованы под имена классов.