Бой, оборонительный огонь и обстрел
Обычный бой
В Fight рассчитываются эффективные атака A и защита D с модификаторами. Вероятность успеха атакующего в одном раунде равна A / (A + D). Каждый успешный раунд снимает один HP с проигравшей стороны. Затем проверяются смерть, отступление и повышение опыта.
Это вероятность раунда, не всей битвы. Общий шанс победы зависит от здоровья, отступления и предварительного оборонительного огня. Делать UI-подсказку «шанс победы = A/(A+D)» было бы ошибкой.
ListStrengthBonusesVersus учитывает укрепление, местность, улучшения, город и пересечение реки. Выбор защитника сравнивает эффективную защиту, умноженную на оставшиеся HP, с учётом враждебности. Это эвристика реализации, не доказательство полного алгоритма выбора Civ3.
Оборонительный обстрел и отступление
Перед раундами выбирается подходящий бомбардирующий защитник на клетке. Он имеет ограничение оставшихся оборонительных выстрелов; против атакующего с 1 HP такой выстрел не запускается.
Отступление проверяется перед смертельным ударом с учётом возможностей и опыта юнита. Для защитника город исключает этот путь; поиск клетки отступления ограничен выбранным направлением. В коде прямо оставлена ссылка на недоработку #274.
Активный обстрел
C7Engine/C7GameData/MapUnit_Bombard.cs проверяет дальность, силу, допустимые цели и locked peace. При выполнении приоритет таков: стены, вражеский юнит, город, улучшение клетки.
По юнитам число попыток определяется rate of fire. Несмертельный обстрел останавливается на 1 HP; отдельно заданы смертельность по суше и морю. Выстрел расходует движение, но не перемещает атакующего на цель. В городах возможны потери населения или здания; улучшение может быть уничтожено либо понижено.
Где реализация приблизительна
В комментариях обстрела прямо отмечены предположения: защита стен 8, здания 16, населения 12, улучшения 3; выбор между зданием и населением — 0.5. Значения не следует выдавать за проверенные формулы оригинала. Ядерный удар и полный набор авиационных миссий наличием обычного обстрела не подтверждены.
Для нашей игры
Разделить расчёт боя и воспроизведение анимации; сохранять протокол бросков и причин бонусов. Наше текущее сражение нельзя незаметно заменить этим балансом: у нашего прототипа другие HP и характеристики.
Проверочные случаи: равные юниты с разным здоровьем, последний HP, оборонительный выстрел, отступление без свободной клетки, несколько защитников, смерть на маршруте, несмертельный обстрел и потеря последнего жителя. Неизвестные параметры вынести в профиль правил.