![](https://habrastorage.org/webt/2i/uq/ei/2iuqeisdyo448rq3ow2ukkh_fdo.jpeg)
Изучение исходного кода ИИ уже выпущенных игр — превосходный способ изучения хитростей на реальных примерах. Quake 3 Arena — интересный образец, потому что код игры полностью выложен в открытый доступ (за исключением инструментов), а сама игра стала примером архитектуры движка ИИ на рубеже веков. В коде содержится полнофункциональный ИИ ботов для deathmatch, написанный на старом добром C; если вы понимаете синтаксис языка, изучать его на удивление просто. Наряду с простой архитектурой задач в коде присутствуют серьёзные технологии Area Awareness System (AAS), а также системы поиска пути (или маршрутизации).
Загрузка и установка исходного кода
Исходный код Quake 3 был открыт в 2005 году, поэтому мы можем свободно скачивать кодовую базу при условии соблюдения лицензии GPL. Однако если вы хотите запустить игру, вам понадобятся ассеты, не включённые в состав исходного кода. Можно воспользоваться кодом и ассетами Id Software:
- Скачайте полный исходный код Quake 3. Текущая версия имеет номер 1.32b и она совместима с последним патчем.
- Чтобы игра заработала со всеми необходимыми ресурсами, то можно использовать её полную версию.
- Также есть вероятность того, что можно будет запустить демо-уровни, но это зависит от версии скомпилированного движка. Не забудьте поместить исполняемые файлы в нужную папку.
Или же можно попросить исходный код и ассеты у сообщества:
- Скачайте исходный код с ioquake3, который является текущей активной кодовой базой независимой сцены моддинга.
- Ассеты можно взять в игре OpenArena. Она позиционирует себя как совершенно бесплатная игра на основе движка Quake 3. Также на сайте ioquake3 можно найти дополнительные модели.
После завершения установки и распаковки всех файлов у вас получится папка
.\code\
, которая обычно находится в папке игры.![Quake 3 Source Code](https://habrastorage.org/getpro/habr/post_images/a10/b06/bbf/a10b06bbf1dc966183ac1444db3c4aed.png)
Пример файлов, из которых состоит исходный код ИИ Quake 3.
Разбираемся с кодовой базой
В базовой папке игры находится файл решения для Visual Studio под названием
quake3.sln
. (Можно использовать бесплатную версию Visual Studio.) Также игра собирается на многих других *nix-платформах при помощи стандартного Makefile
.Основная часть кода ИИ находится в папке
./botlib/
содержащей 56 файлов и примерно 1,1 МБ кода. ИИ имеет собственную библиотеку, но включён в основное решение. Поэтому в папке ./game/
также содержится относящаяся к ИИ логика. Примечательные аспекты ИИ Quake 3:- Код написан на старом добром ANSI C, а не на C++. Однако он написан с довольно неплохой структурой, поэтому должен быть понятен для большинства объектно-ориентированных разработчиков, знакомых с синтаксисом в стиле C. На самом деле, по сравнению со многими движками C++ код кажется гораздо менее шумным!
- Сама архитектура кода движка стала стандартным подходом; по сути, она разделила игровую логику на клиент и сервер. Но особо полезно здесь то, что структура всего движка основана на поддержке ботов как персонажей многопользовательского режима. Для этого требуется продуманное разбиение на слои кодовой базы.
- ИИ Quake 3 появился тогда, когда в компаниях-разработчиках ещё редко можно было встретить отдельную должность программиста ИИ. Это означает, что вы довольно легко сможете понять структуру кода ИИ по сравнению с кодом более современных движков.
Что касается файлов, то здесь нужно отметить следующее:
- Файлы с именами
be_aas_*.[h,c]
содержат код навигации, также называемый Area Awareness System. Он составляет более 50% строк кода всего ИИ. - Единственный файл
be_ea.c
содержит обёртку для всех элементарных действий, которые может выполнять бот. Однако реализация этих действий выполнена в самом движке, так как игроки совершают те же действия, что и боты. - В файлах с именами
be_ai*.[h,c]
содержится сама логика ИИ, но реализация разделена на папки./code/botlib/
и./code/game/
. - Похоже, что код библиотеки поддержки находится в файлах с именами
l_*.[h,c]
, и эта схема используется во всём движке. В частности, в таких файлах находится код для сериализации структур данных и загрузки простых параметров из скриптов.
![](https://habrastorage.org/getpro/habr/post_images/8c4/44d/31d/8c444d31d74cf64cef9bef6d01c393f6.jpg)
Скоростной deathmatch в Quake 3 Arena.
Самое важное
В процессе просмотра кода особенное внимание уделите следующим компонентам:
Area Awareness System
Боты Quake 3 известны тем, что используют систему навигации AAS. По сути, эта система анализирует структуру уровней, которая используется для определения объёмов пространства, по которым можно выполнять навигацию (например, поверхности, по которым можно ходить, и области, в которых можно плавать). Затем процесс анализирует соединения этих областей, симулируя потенциальное движение между каждыми из них, а затем группирует области, чтобы обеспечить возможность иерархического поиска пути.
Маршрутизация с кэшированием
В Quake 3 используется разновидность поиска пути (в файлах
be_aas_route.[h,c]
) по графу AAS, в котором применяются группы областей. В пределах этих групп заранее вычисляются пути к общим областям и сохраняются для дальнейшего использования.Стековая архитектура задач
В файлах
be_ai_goal.[h,c]
находится реализация динамических задач с использованием стека. В частности, каждая задача имеет нечёткое значение активации (которое можно оптимизировать при помощи генетических алгоритмов). Стек применяется для хранения выполняемых целей, что позволяет ИИ с лёгкостью решать простые головоломки и назначать приоритеты поведениям.Основная процедура ИИ
На верхнем уровне системы находится традиционная машина состояний, построенная на основе стека задач. Его логика хранится в части
game
проекта под именем файла ai_dmq3.[h,c]
. Удивительно, что даже если вы привыкли к объектно-ориентированному подходу C++, всё кажется таким простым и явным; в коде есть одна структура bot_state_t
и множество глобальных функций, реализующих различные части машины состояний.В целом, Quake 3 — это отличный начальный проект для разработчиков, желающих исследовать ИИ коммерческого уровня. Его реализация определённо не тривиальна, но, вероятно, максимально проста, чтобы при этом представлять собой полнофункциональный ИИ, выпущенный в составе готовой игры.