# Города: население, рост, производство и чудеса

## Состояние города

[C7Engine/C7GameData/City.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/City.cs) хранит жителей, их работу и настроение, еду и щиты, предмет производства, здания, культуру по игрокам и коррупцию. Центр города даёт доход отдельно от назначенных жителей. Специалист и работающий на клетке горожанин представлены через `CityResident` и `CitizenType`.

Доступные предметы производства строятся через общие проверки. Важны технология, ресурсы, владелец, здания-предпосылки, свойства юнита и особенности города. Наличие записи в ruleset ещё не делает предмет доступным в меню.

## Еда и рост

Потребление в изученном коде равно **2 еды на жителя**; исключение сопротивляющихся отмечено TODO. За ход запас меняется на чистый доход. Отрицательный запас удаляет последнего жителя и обнуляется. Достижение порога создаёт одного жителя, если позволяют ограничения роста.

В базовых правилах пороги пищи — **20, 40, 60**, границы размеров — **6 и 12**. Для перехода выше первого уровня нужна пресная вода либо подходящее здание; для третьего уровня — соответствующее разрешение здания. После успешного роста амбар сохраняет половину порога, иначе запас обнуляется. Излишек сверх порога перед этим обрезается.

Источники параметров: [C7/Lua/civ3/ruleset.json](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7/Lua/civ3/ruleset.json); рост: `HandleCityGrowth`, `CanGrowPopulationByOne`.

## Производство

`ComputeTurnProduction` добавляет полезные щиты. Завершение требует одновременно достаточных щитов и `residents.Count > populationCost`. Таким образом, поселенец с ценой населения 2 не может завершиться в городе размера 2. Пока населения недостаточно, щиты сохраняются не выше стоимости заказа.

При завершении запас щитов сбрасывается в 0, расходуется население, создаётся объект; затем выбирается следующий заказ. Излишки не переносятся. Нельзя объявлять production rollover работающей возможностью по списку идей wiki.

Великое чудо отмечается в общем наборе построенных чудес; конкурирующие города соперников переводятся на наиболее дорогой доступный предмет. В коде есть TODO: выбор должен быть предложен игроку, а не выполняться автоматически. Эффекты, доступность и устаревание зданий требуют отдельной проверки. Дополнительный источник: [C7Engine/C7GameData/Building.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/Building.cs).

## Основание и военные действия

[C7Engine/EntryPoints/CityInteractions.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/EntryPoints/CityInteractions.cs) создаёт и уничтожает города. В [OnEnterTile](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/MapUnit_Actions.cs) вход обычного врага вызывает `DestroyCity`, а варвары забирают четверть золота владельца и удаляются. Это важное отличие от нашего уже существующего захвата города и от полноценного режима присоединения Civ3.

## Для нашей игры

Сначала добавить еду, население и один производственный заказ, затем жителей, здания и многогородские эффекты. Критерии: объяснимый прогноз роста, сохранение незавершённого заказа, невозможность нулевого населения и отсутствие повторной выдачи юнита после загрузки.

