# Культура, границы, настроение и беспорядки

## Культура города

В [C7Engine/C7GameData/City.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/City.cs) культура хранится отдельно по игрокам. Текущий доход складывается из зданий и дополнительных производственных потоков. Уровень расширения определяется как `floor(log10(max(1, culture))) + 1`: диапазоны 0–9, 10–99, 100–999 соответствуют последовательным ступеням.

Изменение уровня запускает обновление владельцев клеток и сброс кэша торговой сети. Важно различать накопленную культуру, текущий доход и геометрию границы: это три связанные, но разные части.

## Возраст зданий: спорная реализация

`AgeMultiplier` вычисляет количество полных тысячелетий и возвращает `1 << ageInMillennia`. Получается последовательность 1, 2, 4, 8, а в комментарии к отрицательному возрасту указана временная поправка. Не следует автоматически принимать это за точное правило Civ3.

На дату проверки открыт [PR #1066](https://github.com/C7-Game/OpenCiv3/pull/1066) об историческом культурном бонусе. Его наличие говорит о работе над темой, а не о применённом исправлении. Для нашей игры нужно отдельно выбрать и проверить нужное правило возраста.

## Как считается настроение

`RecalculateCitizenMoods` начинает с базового настроения по сложности. Затем учитывает:

- Штраф за ускорение производства населением.
- Довольство и недовольство от местных зданий.
- Эффекты зданий в других городах, включая континентальные ограничения.
- Военную полицию в рамках лимита правительства.
- Расходы на роскошь и доступные виды ресурсов роскоши.
- Усиление роскоши рынком.

Код различает переходы «недовольный → довольный» и «довольный → счастливый», поэтому единый абстрактный счётчик счастья не воспроизводит весь расчёт. При подборе роскоши можно игнорировать текущие беспорядки, чтобы прекращение коммерции не делало выход из них математически невозможным.

## Что не завершено

Штраф за призыв, усталость от войны и недовольство войной с исторической родиной отмечены TODO. Поддержка сопротивления и обращения с устаревшими эффектами также требует проверки. Наличие культурного советника не означает готовую культурную победу.

Многогородские эффекты и границы проверяются отдельными случаями в [EngineTests/GameData/CityTest.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/GameData/CityTest.cs); тесты в данном исследовании только анализировались по исходникам.

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

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

