Культура, границы, настроение и беспорядки
Культура города
В 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 об историческом культурном бонусе. Его наличие говорит о работе над темой, а не о применённом исправлении. Для нашей игры нужно отдельно выбрать и проверить нужное правило возраста.
Как считается настроение
RecalculateCitizenMoods начинает с базового настроения по сложности. Затем учитывает:
- Штраф за ускорение производства населением.
- Довольство и недовольство от местных зданий.
- Эффекты зданий в других городах, включая континентальные ограничения.
- Военную полицию в рамках лимита правительства.
- Расходы на роскошь и доступные виды ресурсов роскоши.
- Усиление роскоши рынком.
Код различает переходы «недовольный → довольный» и «довольный → счастливый», поэтому единый абстрактный счётчик счастья не воспроизводит весь расчёт. При подборе роскоши можно игнорировать текущие беспорядки, чтобы прекращение коммерции не делало выход из них математически невозможным.
Что не завершено
Штраф за призыв, усталость от войны и недовольство войной с исторической родиной отмечены TODO. Поддержка сопротивления и обращения с устаревшими эффектами также требует проверки. Наличие культурного советника не означает готовую культурную победу.
Многогородские эффекты и границы проверяются отдельными случаями в EngineTests/GameData/CityTest.cs; тесты в данном исследовании только анализировались по исходникам.
Для нашей игры
Сначала реализовать культуру и границы с объяснимым порогом, затем настроение жителей и беспорядки. В UI показывать источник каждого перехода настроения. Проверочные случаи: новый житель после роста, новый ресурс роскоши, устаревшее здание, потеря города с глобальным эффектом и восстановление состояния после загрузки.