# Дипломатия, сделки и торговая сеть

## Модель отношений

[C7Engine/C7GameData/PlayerRelationship.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/PlayerRelationship.cs) представляет отношения двух цивилизаций. Отсутствие записи означает, что стороны ещё не встретились. В существующих отношениях отсутствие длительных соглашений означает войну: мир сам представлен соглашением.

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

Длительные сделки существуют в отношениях обоих игроков; для направленных потоков копируется встречная запись. Мир не отменяется автоматически при истечении первоначального срока. Комментарии отмечают незавершённую репутацию, уведомления об истечении и повторные переговоры.

## Обмен

[C7Engine/C7GameData/TradeOffer.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/TradeOffer.cs) содержит золото, список технологий и признак мирного договора. Денежный эквивалент технологий зависит от стоимости исследования для оценивающего игрока.

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

Наличие более богатой модели `MultiTurnDeal` не означает, что все её типы можно полноценно согласовать в этом интерфейсе. В частности, минимальный TradeOffer не содержит полноценного выбора всех потоков ресурсов и золота за ход.

## Доступ города к ресурсам

[C7Engine/AI/Pathing/TradeNetwork.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/AI/Pathing/TradeNetwork.cs) один раз строит компоненты дорожной сети flood fill, затем сопоставляет города и ресурсы компонентам. Учитываются владение ресурсом и открывающая его технология. Это экономичнее повторного поиска пути от каждого города к каждому ресурсу.

Ограничения перечислены прямо: гавани, аэропорты, проход через территорию воюющего соперника и инвалидирование при смене войны. Доступность ресурса — свойство связности, не только культурной территории.

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

Для первого этапа удобнее явное отношение `unknown / peace / war` и отдельный реестр договоров. Любая сделка должна проверяться и применяться целиком: нельзя передать золото, а затем провалить выдачу технологии.

Кэш торговой сети должен сбрасываться при изменениях дорог, границ, владельцев городов, дипломатии и доступных транспортных технологий. Проверочные случаи: разрыв единственной дороги, ресурс под городом, истечение договора, война во время сделки и загрузка в середине срока. В [EngineTests/GameData/MultiTurnDealsTest.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/GameData/MultiTurnDealsTest.cs) есть исходники соответствующих проверок, но здесь они не выполнялись.

