# Ход партии и условия победы

## Фактическая последовательность

В [AdvanceTurn](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/EntryPoints/TurnHandling.cs) сначала выполняется фаза действий игроков: человек, затем обычные AI, затем варвары. Уже сыгравшие и побеждённые игроки пропускаются; имеются отдельные условия первого хода. При достижении управляемого UI игрока отправляется `MsgStartTurn`, и выполнение возвращается интерфейсу.

После окончания действий всех игроков:

1. Очищается очередь отложенных юнитов и создаются варвары.
2. Увеличивается номер хода.
3. Для каждого игрока обрабатываются бонусные юниты, штрафы недовольства, настроение и коррупция.
4. Рассчитываются финансы и наука.
5. Обновляются города и история.
6. Проверяется победа; подготавливаются юниты и флаги следующего хода.

Рабочие вносят прогресс в `OnEndTurn` своего владельца. В `Player.HandleCityUpdates` порядок внутри города: культура и границы, рост, производство. Источник: [C7Engine/C7GameData/Player.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/Player.cs).

## Почему порядок — правило игры

Содержание начисляется до производства: только что построенный юнит не создаёт неожиданный расход в уже закончившемся ходе. Настроение рассчитывается до роста: у игрока появляется время отреагировать на нового недовольного жителя. Границы расширяются до назначения нового горожанина на клетку.

Восстановление save не должно заново сбрасывать `hasPlayedThisTurn`: иначе часть сторон получает повторный ход. Код прямо поясняет это разделение.

## Какие победы подключены

В [ConvertVictoryConditions](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/Save/SaveGame.cs) создаются обработчики доминирования и завоевания при соответствующих переключателях, а также очков и лимита времени. Доминирование использует жёстко заданные **66% площади и 66% населения**. Это значения этой реализации, не извлечённые параметры всех сценариев.

`ConquestVictory` проверяет отсутствие живых соперников. `TimeLimitVictory` — достижение лимита. `ScoreVictory.HasVictory` всегда возвращает false: очки нужны для показа и разрешения совпадений. При нескольких победителях выбирается игрок с наибольшим последним историческим счётом.

Источники: [C7Engine/C7GameData/Victory/ConquestVictory.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/Victory/ConquestVictory.cs), [C7Engine/C7GameData/Victory/DominationVictory.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/Victory/DominationVictory.cs), [C7Engine/C7GameData/Victory/ScoreVictory.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/Victory/ScoreVictory.cs), [C7Engine/C7GameData/Victory/TimeLimitVictory.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/Victory/TimeLimitVictory.cs).

## Пределы и применение

Поля культурной, космической и дипломатической побед есть в [C7Engine/C7GameData/Victory/VictoryConditions.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/Victory/VictoryConditions.cs), но они не создают обработчики в изученном пути. Нельзя считать их работающими по одному переключателю.

Для нашей игры стоит сначала закрепить единый порядок фаз и ограниченную победу по завоеванию. Проверочный сценарий: сохраниться после хода одной стороны, загрузиться и убедиться, что ни производство, ни AI, ни списание золота не выполняются дважды.

