Обновлено:

На этой странице

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

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

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 есть исходники соответствующих проверок, но здесь они не выполнялись.