Дипломатия, сделки и торговая сеть
Модель отношений
C7Engine/C7GameData/PlayerRelationship.cs представляет отношения двух цивилизаций. Отсутствие записи означает, что стороны ещё не встретились. В существующих отношениях отсутствие длительных соглашений означает войну: мир сам представлен соглашением.
Сохраняются объявления войны, нарушения права прохода, внезапная атака и срок отказа от переговоров. Объявление войны очищает соглашения с обеих сторон. Такой способ представления требует сильных инвариантов: случайное удаление последнего договора не должно непреднамеренно менять войну и мир.
Длительные сделки существуют в отношениях обоих игроков; для направленных потоков копируется встречная запись. Мир не отменяется автоматически при истечении первоначального срока. Комментарии отмечают незавершённую репутацию, уведомления об истечении и повторные переговоры.
Обмен
C7Engine/C7GameData/TradeOffer.cs содержит золото, список технологий и признак мирного договора. Денежный эквивалент технологий зависит от стоимости исследования для оценивающего игрока.
В WouldAcceptDealFrom AI принимает обмен, если ценность предложения не ниже отдаваемого. Репутация и более глубокая оценка мира отмечены TODO. ExecuteDeal переводит золото, заключает мир и выдаёт технологии через общий путь приобретения.
Наличие более богатой модели MultiTurnDeal не означает, что все её типы можно полноценно согласовать в этом интерфейсе. В частности, минимальный TradeOffer не содержит полноценного выбора всех потоков ресурсов и золота за ход.
Доступ города к ресурсам
C7Engine/AI/Pathing/TradeNetwork.cs один раз строит компоненты дорожной сети flood fill, затем сопоставляет города и ресурсы компонентам. Учитываются владение ресурсом и открывающая его технология. Это экономичнее повторного поиска пути от каждого города к каждому ресурсу.
Ограничения перечислены прямо: гавани, аэропорты, проход через территорию воюющего соперника и инвалидирование при смене войны. Доступность ресурса — свойство связности, не только культурной территории.
Для нашей игры
Для первого этапа удобнее явное отношение unknown / peace / war и отдельный реестр договоров. Любая сделка должна проверяться и применяться целиком: нельзя передать золото, а затем провалить выдачу технологии.
Кэш торговой сети должен сбрасываться при изменениях дорог, границ, владельцев городов, дипломатии и доступных транспортных технологий. Проверочные случаи: разрыв единственной дороги, ресурс под городом, истечение договора, война во время сделки и загрузка в середине срока. В EngineTests/GameData/MultiTurnDealsTest.cs есть исходники соответствующих проверок, но здесь они не выполнялись.