AI в Age of Empires 2: Definitive Edition и The Conquerors.

17.04.2021 Автор: GamesGod

Приветствую всех любителей Age of Empires 2. Сегодня я расскажу вам, как устроен искусственный интеллект в различных версиях игры, речь зайдет в частности о версии Age of Empires 2: The Definitive Edition, как наиболее популярной версии в Steam, а так же немного затрону версию The Conquerors.

Данная статья носит исключительно познавательный характер и может содержать некоторые исторические ошибки и неточности, однако бОльшая часть статьи полностью соответствует реальности.

Какие AI существуют в игре ?

Age of Empires 2: The Conquerors.

В версии The Conquerors по умолчанию существует один единственный компьютерный игрок, разработанный компанией Microsoft (точнее Ensemble Studios) в 1999 г. который взял своё начало из версии игры  Age of Empires 2: The Age of Kings и был незначительно улучшен. 

В целом данный ИИ неплох, и подходит для игрока, который впервые играет в Age of Empires 2. На сложности Hard, слабому игроку он может доставить много проблем и одержать победу, даже 1х1, обычно быстро переходя в эпоху Замков и начиная нападать на игрока небольшими группами войск. На других более легких сложностях (medium, easy, и т.п.) он играет менее агрессивно и может напасть даже в эпоху Феодалов, однако конечно все эти атаки достаточно легко отбиваются даже игроком, который особо не умеет играть в игры жанра “Стратегия”. На сложности Hardest данный ИИ использует читы, а именно – прибавку к каждому типу ресурса +500, по таймеру (обычно каждый раз при переходе в новую эпоху). Так же, на любой сложности этот ИИ всегда “видит” то, что видит другой компьютерный игрок, через “туман войны”. Т.е. как будто он изначально изучил “Картографию”.

Шло время, стали появляться патчи для версии The Conquerors – 1.0с, 1.3, 1.4 и наконец последний на текущий момент патч – 1.5 RC. С каждым новым патчем в версию игры вносились корректировки в баланс игры, а так же новые возможности для ИИ. На текущее время (2021 год) существует очень много разных ИИ для этих версий игры, особенно для версии The Conquerors, все они созданы разными разработчиками, обычными любителями игры. Каждый из этих ботов разрабатывает обычно 1-3 чел, а не какая-то крупная компания. 

Один из первых сторонних ИИ – это AllianceThundaEmpire, разработанный Lutz Menzel-ом в 2004 году. Он использует некоторые новые возможности добавленные в патчах к игре (патч 1.0с) и превосходит по силе стандартный AI. Однако имеет свои недостатки … всегда атакует одним типом войск, ну например рыцарями или воинами-орлами. Лишь иногда может напасть лучниками, но крайне редко. В связи с чем он доставляет сложности в победе лишь на первых играх против него. Так же он не использует весь потенциал от последующих патчей к игре, особенно от патча 1.5 RC.

Далее стали появляться другие боты, которые уже больше использовали возможности каждого патча. Такие как Promi, Horde, Tribal_Warrior, Barbarian и ещё много разных (хотя разработчики у них есть те же, что и например Tribal_Warrior).

На текущий момент, по моей оценке, сильнейшим на планете ботом является Barbarian, разработанный предположительно 2 людьми – II2N/TheMax в 2011 году, и до 2018 года периодически улучшался. О его возможностях вы можете узнать при игре с ним, где его найти опишу далее. Я же опишу о его “грехах”, т.к. и он не отличается честностью игры (в прочем это зато даёт ему преимущество в силе игры). Итак, грехи… Он так же как и обычный компьютер “видит” то, что “увидел” союзник, не исследуя “Картографию”. Более того он “видит” когда игрок начинает переходить из эпохи в эпоху и после этого меняет тактику игры. Он “видит” все постройки и юнитов через “туман войны”. Он не нападает на игрока до тех пор, пока либо не получит явное преимущество в исследованиях, либо если “увидит”, что у врага слабее/меньше армия, так же начинает атаку, если полностью развит. В плане ресурсов на Hardest сложности тоже использует доп ресурсы, но там хитрые схемы их активации. В основном на карте “Nomad (Кочевник)” использует. 

Данный AI играет в Age of Empires 2: The Conquerors в полную силу, но необходим патч 1.5 RC. О возможностях игры бота Barbarian в DE версии, читайте ниже.

Age of Empires 2: The Definitive Edition.

В версии Definitive Edition по умолчанию встроено 3 ИИ.

  1. Оригинальный ИИ (это всё тот же бот от Microsoft-a, который играет в Age of Empires 2: The Conquerors, The Age of Kings).
  2. ИИ из HD версии игры (Сложно сказать, что это за бот и кто его разработал, но он сильнее играет, чем стандартный комп).
  3. ИИ (это Promi, который был создан изначально для версии Age of Empires 2: The Conquerors).

Из этих 3х ботов сильнее всех конечно же 3. Сейчас распишу об этом ИИ подробнее, если кому-то интересно.

Он играет почти без читов. У него есть лишь “Картография” и “видит” постройки игрока, юнитов врага “не видит”, атакует в любое время, спонтанно. Но то, что он это видит постройки врага никак не влияет на его развитие и он всё-равно продолжит развиваться по своему плану, т.е.  если у него по плану сделать рыцарей и напасть, то даже если у игрока будет кучу копейщиков – ничего принципиально не меняет. Он все-равно нападет рыцарями, но просто скорее всего не в эпохе Замков, а в эпохе Империй, после того, как улучшит их до паладинов. Если по плану у него заложено сделать 15 лучников в феодалке, то он их сделает, но напасть может либо например пока у него 5 лучников, а остальных приведет следом, либо напасть когда сделаются все 15 лучников.

Что касается разнообразия игры этого ИИ… Если нажать на кнопку “Сначала”. То тактика игры бота останется той же, с точностью до типа юнитов атаки, и общего развития. Лишь может быть время атаки от него – немного произвольным.

Плюсы этого AI:

  1. Хорошее и достаточно быстрое развитие, на уровне хорошо играющего игрока.
  2. Есть несколько разных вариантов, которыми бот умеет играть – атака в Феодалке, атака в Замках, разными типами юнитов может нападать, однако преимущественно, если Феодалка, то это атака – лучниками/застрельщиками. Если атака в Замках, то это рыцари, воины-орлы или лучники и совсем редко – замковым типом юнита.
  3. Умеет делать юнитов в противовес, т.е. если на него нападаешь скаутами, он сделает копейщиков в ответ. Если нападаешь рыцарями, он сделает еще и верблюдов например.
  4. Умеет отбегать юнитами от атак башнями, тц или замком. (кораблями плохо отплывает)
  5. У него достаточно хорошая экономика.
  6. Умеет помогать союзнику с помощью команд, либо сам (редко).

Минусы этого AI:

  1. “Подсматривает” постройки врага через туман войны (хотя не знаю на что это особо влияет).
  2. Малое количество “Тактик” прописано, фактически 2 – атака в феодалке – лучниками/застрельщиками, и атака в замках – лучниками, рыцарями или воинами-орлами (иногда замковым типом юнита).
  3. Иногда крайне сильно тупит при сборе ресурсов – бежит через всю карту крестьянами чтобы добыть золото/камень не строя шахту. Иногда их не добывает совсем, т.к. они как бы слишком далеко от базы.
  4. Не может играть на всех картах версии Definitive Edition. (например на Дельта Нила, Городище и т.п.) В основном полноценно играет только на картах которые были в версии The Conquerors. Например аравия, реки, острова и т.п. 
  5. Имеет серьезные ошибки развития на картах типа Мегарандом и Континент. Т.к. не может оценить точно где он играет, где враг, где союзник и т.п. К примеру если “Континент” сгенерировал его на острове, он может вовсе не делать флот и делать при этом торговые телеги для торговли с союзником 🙂 
  6. Преимущественно играет при максимуме населения 200 юнитов. С другим количеством максимума может совершать много ошибок в развитии. Например не делать каких-то юнитов вовсе, а других наоброт наделать целую кучу, забив лимит. 
  7. Почти всегда сливает скаута в феодалке, нападая на тц зачем-то. Из-за этого меньше разведывает карту, может из-за этого вообще не найти ни одного реликта, т.к. потом другими юнитами бывает не открывает карту совсем, особенно если находится под атакой.

Так же существуют и другие ИИ, которые работают в версии Definitive Edition,  например Tribal_Warrior, Forthwind, Odette_AI и т.п., но работают они в целом хуже, чем Promi. 

Что касается работы бота Barbarian в DE версии игры, то он работает, только если вы установили версию 2.18b, отсюда http://forums.aiscripters.com/viewtopic.php?f=8&t=2522&start=600 . Однако Barbarian не все новые исследования изучает, не всеми новыми юнитами новых рас пользуется, за инков не делает воинов-орлов, не пользуется копейщиками-степняками и т.п., т.е. не использует весь боевой потенциал той или иной нации, кроме того, он иногда плохо развивается на новых картах DE, либо не развивается вовсе. На классических картах типа Аравия, Реки и т.п., и обычными нациями, которые были до DE версии – он играет, и играет лучше любого другого ИИ. Обычными юнитами (которые были в версии The Conquerors) выиграть может очень быстро – кучей лучников например или кучей паладинов, кучей боевых слонов или воинов-орлов. Это да, все работает. У него отлично прописан микро-контроль лучников, “ваншот” одной цели и переключение на другую цель работает почти безупречно, в большинстве случае играет этой тактикой.

Ну и конечно же, не могу упомянуть разработанный мной ИИ – GamesGod. Начал его создание я ещё в 2017 году. Создавал его для версии The Conquerors, сначала под одни патчи, потом модернизировал, чтобы он работал и на других патчах игры. Как только вышла в свет версия Definitive Edition, то решил делать апгрейд и под эту версию, но это отняло много сил и времени учитывая то, что разработка этого ИИ, это просто хобби, в свободное от работы время. Но теперь, в этом году, я смог довести разработку до определенного уровня, и получился более менее нормальный продукт, о котором уже можно показать людям 🙂  По силе я его приравниваю к Promi. На некоторых картах и в некоторых условиях он существенно сильнее Promi. 

+ моего ИИ :

  1. Имеет различные “тактики” развития, может нападать в феодалке, любым типом армии, может нападать в замках любым типом армии (преимущественно теми, кто выгоден конкретной нации).
  2. Хорошо торгует с союзником
  3. Единственный ИИ, умеющий играть на карте Дельта Нила.
  4. Умеет играть на любом лимите населения.
  5. Честный, он “не видит” армию, постройки врага через “туман войны”, но из-за этого слабее играет, т.к. он как человек – может случайно наткнуться на замки, на большую армию и т.п. 🙂
  6. Честный и в отношении союзника, “видит” то, что и союзник только после исследования “Картографии”. Исключение – он в любом случае “видит” то, что “видит” человек. Это встроено в саму игру и это невозможно изменить.
  7. Честный в плане дополнительных ресурсов, он их не получает на любой сложности игры, при этом играет всегда как Hard, какую сложность игрок бы не выбрал.
  8. Умеет делать противовес армии врага. Например, если он разведал, что у врага много лучников, он постарается сделать застрельщиков, онагры, конницу. Если увидел копейщиков, то сделает лучников и т.п.
  9. Немного может застроить башнями 🙂
  10. Умеет адаптироваться под любой тип карты, гораздо лучше чем любой другой ИИ. Т.е. если например создалась карта “Континент” или “Мегарандом”, он постарается оценить где он, на острове или нет, есть ли на его острове враг, где находятся союзники, и т.п. Он не будет делать торговые телеги находясь с союзником на разных островах 🙂
  11. Он гораздо более непредсказуемый чем любой другой ИИ, даже в плане атаки игрока. Он может напасть на любого игрока, а не только на ближайшего к нему (как большинство ИИ). 
  12. Использует все исследования и все юниты (кроме подрывников и соваров).
  13. Может отбегать от выстрелов башен, тц, замков. (флотом хуже отплывает, онаграми пока не хочет отъезжать совсем:))
  14. Может по-разному реагировать на предложение мира, если не выбирать команду 🙂
  15. Умеет донатить союзника, по запросу союзника и без его запроса.
  16. Умеет нападать с разных сторон, выбирать разные цели для атаки. Может например напасть преимущественно на торговлю врага и попытаться перебить все торговые лодки/тележки.
  17. Умеет играть затяжные сражения (когда закончились все ресурсы на карте).

Но конечно же есть и – :

  1. Мог бы быстрее развиваться, но из-за производства армии, развитие медленнее чем могло бы быть.
  2. Может слить большое количество флота (особенно любит сливать транспортники, как и любой другой ИИ) об замки врага.
  3. Не на всех режимах игры может играть (ну верней он на них играет, но так же, как и например в режиме игры “случайная карта”, “защита чуда света” и т.п. не вызывает у него никаких особенностей :))
  4. Есть проблемы с разведкой врага (иногда), бывает долго не может его найти.
  5. Так же как и любой другой ИИ – плохо защищается от тактик застройки башнями, забором, налетов конными лучниками.
  6. Плохо высаживается армией на картах типа “острова”. Может высадить 20 юнитов за раз, а может высадить 1-2 и еще 30 будет на базе тереться.

Что же такое AI ?

Это банально 2 файла (минимум 2, максимума нет). Первый файл xxx.ai, а второй xxx.per.

Из первого файла игра понимает о том, что в игру добавили файл, который относится к категории ИИ и он содержит всего лишь 1 строчку – AI.txt. Ну а второй файл xxx.per содержит в себе непосредственно функции, которые необходимы для работы бота. Второй файл можно разбить на много разных файлов, в которых будут функции работы бота, каждый файл можно сделать для определенных задач, ну например в одном прописать то, что компьютер должен строить, в другом файле прописать производство юнитов, в третьем например прописать функции атаки и наступления бота. Но все эти файлы должны быть только с расширением PER. Например yyy.per. При этом их можно поместить в отдельную папку.

Что же такое AI внутри этого файла .PER ?

ИИ внутри – это набор функций, которые выполняются игрой сверху вниз, построчно. Примерно 2-3 раза в секунду. Никакого знания языков программирования не требуется. Все функции “вшиты” в игру и никаким изменениям не подлежат. Только лишь патчами добавляются те или иные функции.

Функции состоят из :

  1. Заголовок (строчка которая даёт знать игре, что начинается функция)
  2. Условие (строчка которая задаёт то, при каких условиях эта функция должна исполняться)
  3. Символ => (он отделяет Условия от Действий)
  4. Действия (строчка, в которой нужно написать, что необходимо делать.)

Функции выглядят примерно так :

(defrule
(true)
=>
(up-modify-sn sn-mill-max-distance c:= 20))

Где : 

(defrule – это строчка говорит игре о начале функции

(true) – это Условие (их может быть несколько), в данном случае оно означает, что всегда исполнять функцию

=> – разделитель между Условиями и Действиями

(up-modify-sn sn-mill-max-distance c:= 20) – Действие (их может быть несколько), в данном случае оно устанавливает максимальное расстояние установки мельниц относительно ТЦ.

Всего строк Условий + Действий может быть не более 16 суммарно.

Перед всеми функциями должны быть описаны переменные, которые будут использоваться далее в функциях. Все эти переменные имеют свою константу “c:” и переменное значение “g:” Игрой задумано так, что переменные значения можно менять только у переменных, которые начинаются с 41 и до 510, при этом каждая переменная должна быть упомянута один раз. Переменные описываются так :

(defconst game-time 0)

Это означает, что есть переменная “game-time”, она имеет следующие значения… константу “c:” будет равным 0, а переменное значение этой переменной “g:” будет равным -1. 

Если переменная записана так :

(defconst Random 47) 

Это означает, что есть переменная “Random”, она имеет значение константу “c:” равным 47, а переменное значение “g:” будет равным -1. Однако 47 –  входит в число разрешенных переменных значений (41-510). Это означает, что я могу задать для переменного значения “g:”, любое значение, от -32768 до 32767. При этом нельзя, чтобы у какой-то переменной была та же константа “c:”(в данном случае 47),

т.е. нельзя чтобы было дальше записано (defconst Naselenie 47)

для другой переменной я должен задать другой “константный” номер, ну например 48. 

В игре если честно, крайне не удобно сделана эта система переменных. Лучше, чтобы вы при перечислении переменных, просто руководствовались простым правилом – новая переменная – новое константное значение, это больше даже на идентификатор переменной похоже. Который должен быть у каждой переменной – свой.

Так же есть специальные операторы, внутри которых функции или работают или не работают. Например 

#load-if-defined DE-AVAILABLE

…. тут набор функций….

#end-if

Этот оператор означает, что все функции которые расположены внутри него будут выполняться только если запущена игра версии Definitive Edition.

А если вы разбили работу своего бота на папки и файлы, то потребуется вот такая примерно строчка :

(load “Barbarian\DMConstants”)

Эта строчка запустит файл “DMConstants.per”, который расположен в папке Barbarian. Естественно, что если этого файла там не будет, то эта строчка не выполнится и бот не запустится, выдав в игре ошибку.

Вот так и создаётся ИИ для Age of Empires 2 🙂

Прописывать эти функции можно в обычном блокноте. Но удобнее использовать специальную программу “ScriptEd”.

Так же, для более быстрого тестирования работы функций ИИ можно немного “читерить” в игре, включив “SpeedHack” в программе “Cheat Engine” 🙂 Она увеличит скорость игры, что очень помогает если вы хотите посмотреть, что ваш ИИ делает на 30-й, или 50-й минуте игры 😉

Полезные ссылки

А теперь насчёт ссылок :

  1. http://forums.aiscripters.com/viewtopic.php?f=8&t=4090&sid=5854edfea26be3a79d157432e3fdaee5 (здесь можно скачать мой ИИ – GamesGod)
  2. http://forums.aiscripters.com/viewforum.php?f=8 (здесь можно скачать другие ИИ для разных версий игры, однако там не написано, какие боты на каких версиях запускаются). Но я написал в статье, какие хорошие и  которые гарантированно запускаются.
  3. http://forums.aiscripters.com/viewtopic.php?f=16&t=2607 (здесь программа “ScriptEd”в которой удобно прописывать функции ИИ).
  4. https://www.voobly.com/gamemods/mod/1119/v15-RC (здесь патч 1.5 RC, для версии The Conquerors, который необходим для работы большинства существующих AI, включая мой).
  5. https://disk.yandex.ru/d/RRcqk7Et1-hdAQ (здесь у меня архив с файлами .pdf, в которых расписаны все Условия, все Действия которые можно использовать при создании ИИ, а так же руководство по написанию функций на английском языке, для версии игры The Age of Kings, там изложены основные принципы написания функций, но они там перечислены далеко не все. Патчами и другими версиями игры было добавлено много новых функций, которые все перечислены в других файлах).
  6. http://forums.aiscripters.com/viewforum.php?f=27 (тоже самое, что и в 5 пункте, но просто на форуме, т.е. есть описание всех Действий, Условий, переменных и т.п.)

Куда устанавливать скачанные файлы с новыми AI ?

Если у вас версия Definitive Edition, то примерно сюда – D:\Steam\SteamApps\common\AoE2DE\resources\_common\ai

Если у вас версия The Conquerors, то примерно сюда –                             D:\Games\Age2\AI


Вот собственно и всё, что хотел Вам рассказать, надеюсь кому-то эта информация будет полезна и интересна, если есть вопросы по работе моего ИИ или создании Вашего ИИ, или любые другие вопросы о AI в игре, то можете писать их в комментариях или мне в личку ВК – https://vk.com/id3992468

Комментарии

Авторизируйтесь, что бы оставлять комментарии и оценивать посты

  • Corn, 2021-07-21 в 21:08

    Привет создателю AI GamesGod! Как-то тестировали твой ИИ на Вубли 2в2 с каким-то иностранцем, если помнишь. Круто, что он не читерит с cc-командами.
    На Дельте Нила стандартный DE-ИИ (Promi) удивил меня на днях, построив ТЦ на большой земле. И на Миграции он к моему удивлению мигрировал вполне успешно (но не в начале игры). Кстати, а в UP1.5 можно научить ИИ перевозить поселенцев через воду в транспортах и развиваться на другом острове?

    • GamesGod, 2021-07-22 в 22:59

      Извиняюсь – привет 🙂

    • GamesGod, 2021-07-22 в 22:42

      Что касается версии UP 1.5, да, в этой версии появились доп функции, которые позволяют достаточно детально управлять юнитами, особенно объединяя их в группы, ну вот как игрок, когда жмет ctrl+1. Благодаря этим функциям можно необходимых юнитов объединить в группу, дать им какую-то команду и управлять группой как угодно. Не затрагивая остальных юнитов на карте. Раньше, без групп, это было невозможно.
      Что касается высадки на другие острова, высадка на основной остров на карте Дельта Нила – прописать не сложно. Высадка например 1 или пачки крестьян на остров к союзнику – не сложно. (и это реализовано частично у встроенного ИИ в DE версии эпохи).
      Зато есть одна проблема, которую пока никто из разработчиков не смог прописать. (и я в том числе, но я пытаюсь:)) А именно – высадка крестьян на свободный остров, на котором есть ресурсы, построить там тц или шахты с лесопилками и если необходимо защитить это всё дело башнями или замком, и как только ресурсы на острове закончатся – всех оттуда забрать =) Вот этот алгоритм прописать как оказалось – крайне тяжело 🙂 т.к. всё надо делать со множеством условий….
      Сначала определить координаты острова, затем определить есть ли на нём ресурсы, затем определить есть ли возможность на нём построить тц шахты и т.п., затем прописать – собрать крестьян, посадить в транспортник (определив сначала – есть ли он вообще) 🙂 затем выделить этот транспортник с крестами, направить его на координаты острова, затем чтобы он там высадил крестов, затем этими же крестами надо пытаться строить возле ресурсов тц или шахты, а это значит, что ещё определить координаты этих ресурсов =) если не получается там построить – расширять область возможной постройки, если так и не получается, то по таймеру – посадить крестов обратно в транспортник и вернуться на базу ))) ну вот как-то так…. и это лишь часть логики, там ещё есть, и всё это нужно функциями прописать, но это тяжко 🙂

Авторизация
*
*
Регистрация
*
*
*
Генерация пароля