Сообщество Империал: Правка поведения ИИ на страт карте, часть 1. - Моддинг Medieval 2: Total War - Medieval 2: Total War - Библиотека - Сообщество Империал




Imperial

Информация об авторе

bitterhowl
  • Автор: bitterhowl

Информация по статье

  • Добавлено: 21 дек 2020, 03:09
  • Просмотры: 253

Последние Статьи

  Тяжёлый 2020-й позади, но что дальше?

Тяжёлый 2020-й позади, но что дальше?Count Bagatur RF · 21 янв 2021, 20:56

  Total Bananas 1.0 - краткий обзор мода

Total Bananas 1.0 - краткий обзор модаCount Bagatur RF · 21 янв 2021, 18:02

  DLC Total War Saga: TROY – AJAX & DIOMEDES

DLC Total War Saga: TROY – AJAX & DIOMEDESТатарин · 15 янв 2021, 08:12

  Дневники разработчиков Dwarf Fortress

Дневники разработчиков Dwarf FortressAlexander_NSK · 05 дек 2020, 20:40

  Однажды в Армении

Однажды в АрменииLaziale · 20 ноя 2020, 19:40

  Готовится проект Hyboria Total War

Готовится проект Hyboria Total WarCount Bagatur RF · 17 ноя 2020, 23:05

Правка поведения ИИ на страт карте, часть 1.

Описание: Оптимизация параметров ИИ на стратегическом уровне.
Приветствую, Империал.

Решил поделиться наработками по правкам страт ИИ, чтобы не пропадать добру. Все это взято из материалов с твцентра и rtw.heavengames.com, сам я тут абсолютно ничего не открыл.

Оптимизация расчета пути.

Там самая пресловутая «дальность хода». Из файла descr_character.txt нам нужен первый параметр,
starting_action_points	150	; default value for all characters and pathfinding calculations


Это параметр для общего обсчета пути при создании карты, он самый важный. Чем он выше, тем больше вариантов у ИИ при выборе пути до целей, и тем больше целей он может считать достижимыми, становясь благодаря этому активней.
Этот параметр не имеет прямого эффекта на персонажей, он делает общую «разметку» при генерации карты, по которой уже потом пойдут персонажи. Представим ситуацию, когда из-за трейтов персонаж получает дальность хода 220 при собственной изначальной 150 и общем числе starting_action_points 150. Это значит, что за пределами линии в 150 пикселей ему «не видна» дорога, т.к. нет разметки, и фактически он не может эффективно считать перемещение дальше 150 точек. Такая "близорукость на 150".

Создавая значение в 300-500 мы а) предотвращаем конкретно такой сценарий б) - и это более важно, размечаем путь на карте так, что ИИ эффективно находит обходные варианты, если путь блокирован.
Но от starting_action_points зависит и общее быстродействие, чем больше эта цифра, тем больше вариантов пути у ИИ и тем медленнее ходы, т.к. движок долго высчитывает пути персонажей. На твц писали и про значение starting_action_points 10000, это запредельно.

Для эффективного использования фракцией ИИ флота адмиралу starting_action_points надо ставить в районе 250, не меньше.

Дополнительно есть смысл дать генералу ИИ бонус в перемещении, вот таким скромным трейтом:
Level GeneralAI_Bonus
Description GeneralAI_Bonus _desc
EffectsDescription GeneralAI_Bonus _effects_desc
Threshold 1 

Effect MovementPoints +50 (значение на выбор, можно и 100)

Триггер для него – начало хода генерала, который не принадлежит фракции игрока.

Одно это совершенно копеечное усовершенствование оказывает значительный эффект на поведение ИИ. Даже с ванильным descr_campaign_ai_db.xml он уже ведет себя совсем иначе, чем в оригинальной игре, а там параметр starting_action_points имеет очень скромное значение – 80. Да, 80, Карл. По неизвестной причине разрабы натурально стреножили и ослепили всех персонажей. В этом месте передаем горячий привет сторонникам утверждения, что ванильные версии – это предел совершенства, а моды - говно ерунда.

Расчет нападения на поселение.

В config_ai_battle.xml есть такой параметр –
<sally-out-ratio>2.0</sally-out-ratio>

Он отвечает за соотношение сил, при котором гарнизон ИИ предпримет вылазку, в данном случае число осажденных должно быть в 2 раза больше, чем осаждающих. По некоторым сведениям, этот же параметр влияет и на размер стека, который атакующий ИИ собирает для нападения на поселение. Чем выше параметр, тем больший стек соберет ИИ. Указанное значение – ванильное, его лучше повысить до 2.5
Расчет нападения на поселение производится по параметру автобоя, ИИ исходит из этих цифр. Здесь он превосходит игрока, т.к. «знает» все таблицы и может точно рассчитать значение потерь.

Отдельной строкой хочется упомянуть гарнизонный скрипт ИИ против ИИ. Ведь рассчитывая параметры осады, движок считает одно соотношение сил. И тут бац - при штурме внезапно все меняется. Это конечно не глобальный уровень, но на поведение конкретного стека при конкретной осаде влияет радикально. Несколько провальных осад - уже и стратегические потери. Возможно, есть смысл пересмотреть политику использования этого варианта гарнизонного скрипта.

О роли ребелов.

Фракция ребелов является особенной из-за того, что исходно враждует со всеми остальными фракциями. Движок по умолчанию включает ее в калькуляции параметра free_strength_balance файла descr_campaign_ai_db.xml Что это значит на практике – когда две фракции воюют, этот параметр определяет соотношение стеков на линии соприкосновения. При этом по умолчанию ребельные стеки прибавляются движком к силам противника. То есть если в зоне боевых действий есть регион с сильным гарнизоном ребелов, или тем более полевой стек ребелов – он плюсуется движком к силам противника. Таким образом, из-за ребелов ИИ считает фракцию противника более сильной, чем она есть. В целом – при больших гарнизонах ребелов ИИ будет вести себя пассивнее. Ребелы – зло.

Пару ласковых слов о пользе скриптовых стеков и диких донатов фракциям ИИ.

Сразу предупреждение - данные умозаключения в значительной части носят предположительный характер, т.к. напрямую движок не виден и доказательств привести не могу.
Однозначно то, что ИИ не видит игру так, как мы, и не думает так, как мы. Он вообще не думает, если уж на то пошло. Он механически перебирает параметры по заданному алгоритму. Скрипт Германикуса дает хорошее представление о том, как это происходит для тактики - это тот код, что я лично видел сам, иншалла. В нем каждый юнит на поле боя получает четкие пошаговые инструкции в зависимости от расстояния до противника, общего количества потерь у противника и у себя, морали соседних отрядов и т.д. Движок механически перебирает условия и при совпадении нужных дает юниту команду.

Я не могу посмотреть код страт ИИ, но уверен, что принцип там такой же. То есть, для каждого персонажа на карте измеряется расстояние хода, наличие целей в зоне досягаемости, сравнивается сила, возможно - наличие подкреплений по соседству, дипломатический статус, стратегия фракции и Бог знает что еще.
Вот запись лога ИИ для одной фракции мода King of Rivers ans Hills по Вестеросу на 353 ходу.
Спойлер (раскрыть)

Пояснение - перед началом хода фракции движок выполняет вот такие вычисления по принципу данная фракция vs каждая фракция на карте. Против каждой фракции выбирается стратегия защиты, потом стратегия нападения. (Я подчеркнул две такие строки в самом конце для примера). По результату выносится итоговое решение, оно под спойлером выделено жирным. Определяется регион для вторжения и тип вторжения - сухопутное или морское. В данном случае запланирован морской десант из региона №32 в регион №56, т.к. он имеет максимальный рейтинг приоритета из 3 перечисленных.

Нас в случае спауна стеков интересуют параметры military_balance, military_balance_plus_enemies, alliance_military_balance, free_strength_balance, strongest_neighbour, target_weakest_neighbour, в случае дачи денег - production_balance.

Если у нас война с фракцией и ей прилетает стек-другой-третий, то параметр military_balance резко меняется. Это понятно, баланс двух воюющих фракций ожидаемо изменился. Казалось бы, ну и что.
Во-первых, на параметр military_balance завязаны триггеры в descr_campaign_ai_db для данных фракций. Резкое изменение с высокой вероятностью приведет к резкой смене стратегии - ну на это и расчет, что ИИ бросит эти стеки в бой. То же самое и с free_strength_balance, в случае со спауном он драматически меняется. При этом в логе у нас космические параметры free_strength_balance, за 1000. ИИ просто отказывается работать при таких цифрах, если рабочие параметры в диапазоне 1-10 даже в ПитерАИ, который смелее оперирует параметрами, чем ваниль. Как ИИ должен отличить 10 от 1000? Для него это уже один фиг, он в ступоре. Кроме этого - free_strength_balance не делает разницы в поле войска или на корабле. При этом движок с багами считает конкретно этот параметр, и из-за корабля с десантом 1000 может превратиться в 0.00001.

Во-вторых, есть другие фракции на карте. И есть параметры, которые связывают их с нашими воюющими - military_balance_plus_enemies (если та фракция, кому кинули стеки, является врагом кому-то еще), alliance_military_balance (если фракция, которой кинули стеки чей-то союзник), strongest_neighbour, target_weakest_neighbour (для всех соседей фракции, которой кинули стеки).
Одномоментно все эти параметры для многих фракций меняются, и ИИ механически считает новый расклад, иногда мгновенно меняя прежнюю стратегию поведения. Отсюда могут быть эти непонятные шатания стеков по карте, снятие осад и т.д.
В третьих - production_balance, с подкидыванием сумм в 30-40 тысяч все выглядит достаточно сурово. Ведь после спауна стеки мгновенно не рассасываются, после однократного пикового скачка параметров, ходов на 15-20-30 все идет планомерно (если мы рассматриваем однократный спаун у одной фракции). Но с деньгами, как известно, все иначе - ИИ во время войны впуливает все в найм, и график изменений параметра production_balance при неограниченной денежной помощи ИИ нередко скачет как зубцы пилы. А это один из важных параметров страт уровня.

Вывод - минимум скриптовых армий на карте дает ИИ адекватно оценивать обстановку и вести последовательные действия.

Явно я что-то упустил, поэтому, если вспомню – будет продолжение.


    Воспользуйтесь одной из соц-сетей для входа:
    [ Регистрация ]Для скрытия рекламы, зарегистрируйтесь на форуме[ Вход на форум
    © 2020 «Империал» · Условия использования · Ответственность · Визитка Сообщества · 23 янв 2021, 10:41 · Счётчики