Gamedev Дмитрий Мучкин
9 575

В голове у демона: устройство искусственного интеллекта в DOOM

Наследие Rage и новые технологии.

В закладки

DOOM 2016 года многими был признан одним из лучших шутеров за последние несколько лет — на DTF его выбрали лучшей игрой 2016-го. id Software проделала отличную работу, адаптировав классический геймплей серии для современных игроков.

Одна из ключевых составляющих игрового процесса DOOM — это искусственный интеллект врагов. Демоны должны быть достаточно умными, чтобы не разрушать эффект погружения, но при этом не наступать на игрока слишком яростно — иначе играть будет невозможно. Автор YouTube-канала AI and Games подробно изучил, как устроен искусственный интеллект врагов в шутере.

Основа геймплея DOOM — это push forward combat, боевая система, в которой игрок не отсиживается в укрытии, а идёт напролом. Она состоит из четырёх элементов: скорость передвижения игрока и врагов, индивидуальность демонов, своеобразие оружия и «власть» игрока. Это столпы, на которые ориентировались разработчики при создании игры.

Авторы DOOM хотели, чтобы в своей основе игровой процесс был простым и интуитивно понятным, но усложнялся по мере прохождения. То есть, чтобы игроку приходилось прямо в гуще боя выбирать, какие цели уничтожить в первую очередь и какое оружие для этого использовать.

Технологии

Как ютуберу рассказали его источники внутри студии, технологии искусственного интеллекта DOOM 2016-го унаследовал от Doom 4, которую отменили где-то в 2013 году, и Rage — постапокалиптического шутера от id, который был неоднозначно принят аудиторией.

Система принятия решений в этих играх состоит из иерархических конечных автоматов (абстрактных моделей, содержащих некоторое число состояний чего-то) — это одна из разновидностей классической технологии искусственного интеллекта, позволяющая контролировать последовательность состояний и их поведение.

Эта система основана на состояниях, в рамках которых ИИ может выполнять определённые действия или инициировать переходы в другие состояния при изменении условий. К примеру, когда имп видит игрока, то атакует его фаерболами. Стоит игроку скрыться из поля зрения демона, и тот переходит в состояние смены позиции.

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

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

Это отличает DOOM от большинства современных шутеров, потому что сейчас более популярны другие технологии: к примеру, деревья поведения и иерархические сети задач.

При разработке Rage конечные автоматы создавались программистами, но поведение врагов настраивали геймдизайнеры. Работая над DOOM, дизайнеры пользовались уже специальным редактором, который взаимодействовал с кодом игры, написанном на C++.

Помимо технологии ИИ DOOM заимствовала из Rage ещё две системы: укрытий и анимации. Система анимации AnimWeb — это конечный автомат, в котором каждое состояние отвечает за отдельную анимацию, а переходы между состояниями — за переходы между анимациями.

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

Система укрытий в Rage была вдохновлена первыми частями Halo, в которых слабые юниты прятались в укрытиях, а сильные шли прямо на игрока. Она высчитывала расстояние до главного героя и укрытий, видимость врагов и много других вещей вроде оптимальных траекторий для броска гранаты. Несмотря на то, что укрытий в DOOM нет, эта система нашла своё применение в шутере.

Дизайн

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

Скорость

Чем выше скорость героя, тем менее точными становятся броски и выстрелы демонов — это побуждает игрока двигаться. Помимо этого, демоны специально не взрывают бочки, чтобы ими мог пользоваться игрок.

Также враги меняют своё положение во время боя с помощью «перевёрнутой» системы укрытий из Rage: они не прячутся от игрока, а наоборот, находят точки, с которых их будет лучше всего видно.

Индивидуальность демонов

В DOOM 16 архетипов ИИ — демонов, — каждый со своим уникальным набором характеристик и поведением. Каждый из архетипов настроен так, чтобы игрок мог легко различать их в гуще боя: Пинки пытаются протаранить игрока, а импы издалека кидаются фаерболами.

С этой же целью созданы и анимации, отражающие характеры противников. AnimWeb не только генерирует плавные переходы между анимациями, но и следит, чтобы длительность анимации совпадала с длительностью движения, а модели не проходили сквозь стены. Также в игре есть технология Focus Tracking, которая контролирует вращение головы, груди и ног, чтобы враги реалистично поворачивались в сторону игрока.

Помимо этого, демоны поделены на «фракции», которые могут враждовать между собой. В системе ИИ есть целый набор правил, регулирующий, насколько быстро представители одной фракции могут «разозлиться» на демонов из другой. Импам достаётся от манкубов и баронов, но ещё сложнее приходится одержимым: их презирают все.

Своеобразие оружия

Разные противники в DOOM по-разному реагируют на одни и те же пушки. Это достигается с помощью продуманных систем DPS (урона в секунду) и боевых состояний, которые определяют, насколько сильно противник должен «пошатнуться» (stagger) от выстрела из определённого оружия.

Также поведение демонов меняется при попадании в них из отдельных пушек. Импы останавливаются, если стрелять по ним из штурмовой винтовки, а одержимые быстрее переходят в режим, когда их можно убить с помощью glory kill, если попасть по ним из дробовика.

«Власть» игрока

Чтобы игрок чувствовал себя всесильным, он должен всегда оставаться в «потоке» геймплея. Для этого в DOOM реализована система, которая заставляет демонов «спрашивать разрешения» на атаку. Игра выдаёт демонам ограниченное количество «жетонов» на разные виды атак единовременно: ближнего боя, дальнего и так далее. Чтобы атаковать, демон берёт «жетон», а после возвращает его обратно системе. Количество «жетонов» на каждом уровне сложности разное.

Противники могут также «красть» друг у друга право на атаку, чтобы не было ситуаций, когда демон, находящийся прямо перед героем, просто стоял. Более того, разработчики не хотели, чтобы противники атаковали героя, когда тот не может ответить. Поэтому новый жетон на атаку не выдаётся, пока игрок, например, делает glory kill.

Также id Software сделала так, чтобы количество здоровья, выдаваемое за glory kill, зависело от размера демона. Но при убийстве бензопилой выдаётся одно и то же количество патронов вне зависимости от того, кого именно ты убил. Всё это для того, чтобы игрок не испытывал ограничений при освоении своего арсенала оружия и мог использовать любую доступную пушку в любой момент.

#геймдизайн #doom

{ "author_name": "Дмитрий Мучкин", "author_type": "self", "tags": ["doom","\u0433\u0435\u0439\u043c\u0434\u0438\u0437\u0430\u0439\u043d"], "comments": 52, "likes": 170, "favorites": 94, "is_advertisement": false, "subsite_label": "gamedev", "id": 24496, "is_wide": false, "is_ugc": true, "date": "Tue, 07 Aug 2018 19:50:06 +0300" }
{ "id": 24496, "author_id": 6322, "diff_limit": 1000, "urls": {"diff":"\/comments\/24496\/get","add":"\/comments\/24496\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/24496"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954, "possessions": [] }

52 комментария 52 комм.

Популярные

По порядку

Написать комментарий...
13

Работая над DOOM, дизайнеры пользовались уже специальным редактором, который взаимодействовал с кодом игры, написанном на C++.

Такое чувство, будто автор или не сильно понимает устройство игры, или просто запихивает разные термины, чтобы выглядело солинее

Ответить
19

Здесь, в принципе, все понятно. Был создан редактор нодов, с помощью которого можно было задать переходы между состояниями. И дизайнеры пользовались им, вместо того чтобы писать код вручную на C++. В чем проблема-то?

Ответить
2

В том, как это написано. "Специальный редактор взаимодействовал с кодом игры, написанном на C++". У меня претензии к языку, а не к мысли

Ответить
3

Что CPP не нравится?

Ответить
0

К языку письма, которым выражена мысль.

Ответить
1

Тю ты! к трактовке проблема, так и говори.

Ответить
3

Скорей к тому, что:
1) Исходников id Tech 6 я не видел, но скорее всего, редактор с КОДОМ ИГРЫ как раз и не взаимодействует.
2) Упоминание плюсов тут вообще ни к месту, и выглядит, как желание запихнуть известный-своей-сложностью-язык в текст для солидности

Ответить
2

Да банальный скриптокод для редактора уровней имеется ввиду. С настройками - откуда куда бегать демонам. Геймдизайнер в - скорее там "веса" на цепочки принятия решений тупо раскидывали. Ну и запреты прописывали : из разряда : только один враг имеет право атаковать героя со спины раз в 5сеунд.

Ответить
0

Ну, C++ не сложный язык так-то. Обычный ООП язык. Вот Haskell - да, он сложный.

Ответить
2

Ну, во-первых, C++ сильно разросся, и в нем есть много вещей, которыми многие не пользуются, или не знают особенностей работы этих вещей (и не все там подчиняется понятным принципам). Во-вторых, под сложностью языка тут выступает скорее сложность решаемых задач в совокупности с широкими возможностями выстрелить себе в ногу, от которых язык не страхует)
Так-то любой широко используемый сейчас язык программирования не сложный. Даже Haskell - он только поначалу кажется непривычным и непонятным.

Ответить
0

Сразу оговорюсь вот по этой части, чтобы не было споров ненужных:
сложность решаемых задач

Ясен хрен, что приличную часть того, что сейчас делают на C++, можно делать и на C#/Java/выбери свой язык. Я имел ввиду то, что мало кто сейчас выберет C++ для нового проекта, если только совсем не припирает к стенке ТЗ

Ответить
0

Верно, но так же верно, что мало кто будет переписывать движок, написанный на C++ на какой-то другой язык.

Как бы разработчики ненавидели C++ он будет жить.

Ответить
2

так а кто собирался движки переписывать? Из высокоуровневых языков мало кто подходит для создания движков просто потому, что C++ один из самых быстрых, если не самый.

Речь шла о том, что разработка движка с нуля занимает очень много времени и сжигает очень много денег, но это к данному кейсу отношения не имеет

Ответить
0

C и Rust не уступают по скорости, но сильно сомневаюсь, что это не является определяющим фактором

Ответить
–4

Только бы доёбы совершать и умника строить

Ответить
1

Наверно в том что это везде так сделано. Но наезда я и сам не понял.

Ответить
5

с помощью «перевёрнутой» системы укрытий из Rage

Не лучше ли сказать "инвертированной"?

Ответить
1

Это одно и тоже :)
Придирка из разряда : а почему статья на русском , а не английском.

Ответить
4

Это одно и тоже :)

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

Ответить
10

"Перевёрнутый" и "инвертированный".

Ответить
0

А чего ты мне кидаешь, я как раз и говорю, что это не одно и то же

Ответить
4

Вы оба не правы. 1. Это не одно и то же. 2. "Инвертированной" не лучше.

Ответить
3

Если ты слева направо зеркально отобразишь - это тоже будет "инвертировано". Если сверху вниз отобразишь, как ты это сделал - тоже "инвертировано".

А то, что ты назвал "Инвертировано" - просто инвертирован цвет. А инвертировать можно не только его

Ответить
0

В контексте тут инверсия, так что подходит идеально.

Ответить
0

Не увидел потрясающего интеллекта.
Я просто херачил их с двухстволки, было весело, мне иногда хлопали по жопе, а я орал как петух.
Но это всё крайне стандартно. Стандартнейший AI для шутанов. Они вроде и двигаются, но я их йебу. Статья перехваливает. Не важно, что там использовалось, важен результат. А он, для меня, повторюсь - стандартнейший шутан.

Ответить
16

Поздравляю, ты ничего не понял)

Их "интеллект" как раз и заключается в том, чтобы ты как можно эффективнее расстреливал их и никогда не скучал, но при этом чувствовал сопротивление.

Ответить
0

Так мне и террористов в Call of Duty было интересно валить. Сомневаюсь, что это заслуга одного только AI, а не всех систем игры в целом, вкупе с ситуациями.

Ответить
4

Ну, в любом случае, на кошмаре времени на размышления как то нет

Ответить
3

Спасибо большое за перевод, если еще и по предыдущим его выпускам пройдете, будет совсем хорошо (:

Ответить
0

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

Ответить
10

Как я понял, жетон не дается именно пока идет анимация, но если он был выдан до этого, то они им могут пользоваться.

Ответить
2

Не во время, а за момент до или в момент после. Некоторым атакам нужно мало времени и можно отъехать едва успеет закончится анимация.

Ответить
0

Так высокая сложность. На них эти "запреты для искусственных идиотов" где компу нужно красиво проиграть - по большей части снимаются

Ответить
0

Не знаю за интеллект
но глори килс должны быть в каждом шутере, это реально делает игру драйвовей и добровольно принуждает бегать на врагов
все по заветом game makers toolkit, где упоминали, что эффективней поощрять игрока за нужные действия, чем наказывать за ненужные

Ответить
2

Неправда. Всё зависит от задачи и геймплея в целом

Ответить
1

Автор YouTube-канала AI and Games подробно изучил

Он просто пересказал лекцию разработчиков с GDC

Ответить
–4

При всем своем великолепии авторы так и не смогли решить главную из ожидаемых проблем: то что игра "останавливалась" во время скриптовых добиваний. Много же я спорил на эту тему на разных форумах, меня уверяли что IDs не лажанется в этом, да и сам я надеялся на что-то более совершенное чем заранее смонтированные сценки... но в итоге получилось то что получилось. Выглядит фальшиво и глупо.

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

Ответить
2

"Смонтированные сценки". Хуясе.

Ответить
1

тем не менее, на кошмаре глори кил это очень частая причина смерти от импа или долетевшего фаербола...

Ответить
0

Вопрос в том что это справедливо только для низких уровней сложности - как и должно быть by design. На высоких уровнях смерть во время глорикилла - абсолютно типичное дело и по сути является "пародией на dark souls" по уровню давления на игрока

Ответить
0

Так это же специально сделано, ты статью читал?

Ответить
0

>разработчики не хотели, чтобы противники атаковали героя, когда тот не может ответить

Неуязвимость во время перекатов в одной из хардкорнейших игр десятилетия. Не, я не против.

Ответить
0

В Дарк соулсах - это ломает боевку по сети. Очень не хватает приемов атак рассчитанных именно на ловлю врагов во время перекатов. Так как часто встречаются попрыгунчики - у которых выносливость почему то просто не заканчивается.

Ответить
0

Вот из-за такого ИИ и торжествует Battle Royal. Для многих игроков поведение ИИ становится предсказуемым и очевидным. А ведь еще несколько лет назад могло обрадовать столкновение монстров с friendly fire или рикошеты гранат во врагов просто из-за особенностей геометрии уровней.

Ответить
0

Вроде бы уже в по мобильном фортнайте (или чем то таком с королевскими битвами)) был скандал когда выяснили, что часто проигрывающим игрокам(и новичкам) - система начинала подсовывать сражения не с игроками, а ботами - задачами которых показать криворукость и просто проиграть.

Так что даже в роял бэтле ты не можешь быть уверен что победил не бота.

Ответить
0

Можешь. Просто не надо играть в мобильное. Игроки просто были невнимательные. Если твои враги сильные, то стоит записывать их имена и анализировать. Если не сильные - то не имеет значения.

Ответить
0

Я нашел инфу. Это пубг мобайл.

На днях издание The Verge сообщило о том, что разработчики пускают новичков в PUBG Mobile в своих первых матчах сражаться с ботами . Количество же настоящих соперников возрастает, в зависимости от личных результатов игрока, так же боты подсовываются если игрок долго не мог одержать победу или на сервере не достаточно игроков.

Ответить
0

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

Ответить
0

Посмотрел щас в FEAR SDK.
https://pastebin.com/0WaiK8ie
154669 строк. И это просто Runtime. Без скриптов и редактора. Автор реально не в теме вообще.....

Ответить
0

Интересно

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
Пять простых способов разогнать свой ПК
с помощью соли и чайной ложки
Подписаться на push-уведомления