Еще раз полез в скрипты, отвечающие за автобойное ИИ в PoP. Понял, что не все так просто, как казалось изначально.
Итак,
разбираем автобойное ИИ:
1) У каждого (ну, или по крайней мере у 95%) из воинов имеются 4 значения, проставленных вручную. Это:
- слот 169 – условно «сила» (S)
- слот 170 – условно «слабость» (W)
- слот 171 – условно «кавалерийский бонус» (CB)
- слот 172 – условно «тип воина» (пехота (0), кавалерия (1), лучник (2), конный лучник (3))
2) Начинаем считать силу отряда.
Вариант 1. Сложный скрипт. Запрашивается во всех автобоях.
1. Умножаем S, W и CB каждого воина в отряде на число не-раненых воинов в соответствующем стеке. Если значения слотов не проставлены (например, у спутников ГГ), то за значение силы берем (Уровень*3+25), и за значение слабости берем (Уровень*2+10).
1.1. Если поле боя – открытая местность.
1.1.1. Слабость стеков конных лучников умножаем на 3/2, силу умножаем на 5/4.
1.1.2. Слабость стеков кавалерии умножаем на 3/2, силу умножаем на 3/2 и прибавляем кавалеристский бонус (который был уже умножен на число воинов в стеке).
1.1.3. Еще раз прибавляем всем отрядам к силе кавалеристский бонус (у пехоты и лучников это значение попросту равно 0).
1.2. Если поле боя – осада.
1.2.1. Силу стеков лучников и конных лучников умножаем на 3/2.
1.3. Складываем силы всех стеков в отряде.
1.4. Складываем слабости всех стеков в отряде.
Сила отряда готова.
Вариант 2. Простой скрипт. Используется в чит-меню, используется для расчета чести за битву, используется при обдумывании уникальными спавнами вопроса «Грабить или не грабить город?» и для разных грубых подсчетов.
1. Берем значение слота 169 для каждого стека воинов, умножаем на число не-раненых воинов в стеке, складываем значения всех стеков.
2. Если значение слотов не проставлены, то за значение силы берем (Уровень*3+25).
3) Рассматриваем автобой двух несвязанных с ГГ отрядов (скрипт game_event_simulate_battle).
1. Считаем значения силы и слабости защитника и нападающего.
2.1. Если защитник – замок, силу защитника умножаем на 13/10, а силу атакующего на 3/4.
2.2. Если защитник – город, силу защитника умножаем на 15/10, а силу атакующего на 3/4.
3. Умножаем силу защитника на слабость атакующего (получаем Обновленную Силу Защитника – ОСЗ), умножаем слабость защитника на силу атакующего (получаем Обновленную Силу Атакующего – ОСА).
4. Делим значения ОСЗ и ОСА на 100.
5. Если значения стали меньше 180, делим их еще на 30. Если больше – на 90.
6. Если наибольшее из двух оставшихся значений больше 100, то оба значения умножаем на 100 и делим на это наибольшее значение.
7. Если ночь, то делим оба значения на 2.
8. В обоих случаях (с ОСЗ и ОСА) берем максимальное значение из пары ОСЗ (ОСА) или 5.
9. Отвешиваем атакующему урона в размере ОСЗ, а защитнику – в размере ОСА (точный механизм отвешивания урона зашит в движок).
Рассмотрим пример автобоя ГГ с неким отрядом в открытом поле.
1. Считаем значения силы и слабости ГГ и второго отряда. Если второй отряд – нолдоры, то их силу и слабость умножаем на 2.
2. Умножаем силу отряда ГГ на слабость второго отряда, силу второго отряда на слабость отряда ГГ.
3. Делим значения на 100, а потом еще на 50.
4. Наносим отряду ГГ урон в соответствие с обновленной силой противника, а отряду противника – урон в соответствие с обновленной силой отряда ГГ.
ЗЫ. Обновил таблицу на ЯДе. Теперь основным столбцом для сотрировки в целях оптимизации гарнизонов является "Str-weakn./ wage + garris. bon".
https://yadi.sk/i/UNEPbeH6mm2A8