Ход партии и условия победы
Фактическая последовательность
В AdvanceTurn сначала выполняется фаза действий игроков: человек, затем обычные AI, затем варвары. Уже сыгравшие и побеждённые игроки пропускаются; имеются отдельные условия первого хода. При достижении управляемого UI игрока отправляется MsgStartTurn, и выполнение возвращается интерфейсу.
После окончания действий всех игроков:
- Очищается очередь отложенных юнитов и создаются варвары.
- Увеличивается номер хода.
- Для каждого игрока обрабатываются бонусные юниты, штрафы недовольства, настроение и коррупция.
- Рассчитываются финансы и наука.
- Обновляются города и история.
- Проверяется победа; подготавливаются юниты и флаги следующего хода.
Рабочие вносят прогресс в OnEndTurn своего владельца. В Player.HandleCityUpdates порядок внутри города: культура и границы, рост, производство. Источник: C7Engine/C7GameData/Player.cs.
Почему порядок — правило игры
Содержание начисляется до производства: только что построенный юнит не создаёт неожиданный расход в уже закончившемся ходе. Настроение рассчитывается до роста: у игрока появляется время отреагировать на нового недовольного жителя. Границы расширяются до назначения нового горожанина на клетку.
Восстановление save не должно заново сбрасывать hasPlayedThisTurn: иначе часть сторон получает повторный ход. Код прямо поясняет это разделение.
Какие победы подключены
В ConvertVictoryConditions создаются обработчики доминирования и завоевания при соответствующих переключателях, а также очков и лимита времени. Доминирование использует жёстко заданные 66% площади и 66% населения. Это значения этой реализации, не извлечённые параметры всех сценариев.
ConquestVictory проверяет отсутствие живых соперников. TimeLimitVictory — достижение лимита. ScoreVictory.HasVictory всегда возвращает false: очки нужны для показа и разрешения совпадений. При нескольких победителях выбирается игрок с наибольшим последним историческим счётом.
Источники: C7Engine/C7GameData/Victory/ConquestVictory.cs, C7Engine/C7GameData/Victory/DominationVictory.cs, C7Engine/C7GameData/Victory/ScoreVictory.cs, C7Engine/C7GameData/Victory/TimeLimitVictory.cs.
Пределы и применение
Поля культурной, космической и дипломатической побед есть в C7Engine/C7GameData/Victory/VictoryConditions.cs, но они не создают обработчики в изученном пути. Нельзя считать их работающими по одному переключателю.
Для нашей игры стоит сначала закрепить единый порядок фаз и ограниченную победу по завоеванию. Проверочный сценарий: сохраниться после хода одной стороны, загрузиться и убедиться, что ни производство, ни AI, ни списание золота не выполняются дважды.