Veliri. Дневник разработки 3

искусственный интеллект

Veliri. Дневник разработки 3

Приветствую DTF. Я все еще продолжаю делать ММО игру.)

Расскажу про ток как устроен ИИ в моей игре. Конечно ИИ не является полноценным ИИ и это просто набор правил для описания поведения нпс в мире.

Так как я делаю игру в жанре privateer то мне важно симулировать “живой мир” где нпс не просто стоят на месте и ждут игроков, а чего-то делают, имеют какую то цель, общаются между собой и всячески могут взаимодействовать друг с другом. Ярким представителем такого мира для меня является мир космический рейнджеров 2и т.к. наши игры немного похожи то я сделал примерно так же.

Базовая реализация

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

В общем в основе моего алгоритма лежит бинарный граф из проверок и действий. Если нарисовать, то это выглядит так:

Veliri. Дневник разработки 3

Проверки могут быть самые разнообразные начиная анализом боевой ситуации до проверки полный у бота трюм или можно еще копать. Например конфигурацию простейшего разведчика кодом:

Veliri. Дневник разработки 3

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

Проверка выглядит так:

Veliri. Дневник разработки 3

А действие это вызов функции api движка, иногда действия могут идти вместе с проверкой на реализацию этого действия (в данном случае если проверка успешна то мы вызываем метод FastMove() для того чтобы бот начал куда-то ехать, дальнейшие действия на себя уже берёт движок, типо расчет пути и физики, что уже не относится к ИИ с:).

Veliri. Дневник разработки 3

Работу этих правил можно наблюдать в сессионной игре:

Для многих игр этого уже достаточно, но не для открытого мира и тут наступает самое интересное)

Экосистема

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

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

В данном примере транспорт уже не просто рандомно шатается из точки А в точку Б, а имитирует какую то деятельность.

Для системы запросов в правилах ИИ есть свои методы проверки.

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

Veliri. Дневник разработки 3

Из выше описанного можно сделать несколько выводов:

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

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

  • боты делятся по ролям, включая роль “универсал”, но если все будут универсалами то кол-во игровых ситуаций будет меньше.

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

Отношения

Для того чтобы боты начали имитировать страх хватило всего одной проверки анализа боевой ситуации, но этот анализ специально упрощен до 2х параметров хп и дпс, не учитывается броня, точность, снаряжение и тд. По сути нпс видит столько же сколько и игрок из-за чего боту может сначала казаться что он победит, а в итоге он начнет проигрывать. Каждый нпс имеет разный коэффициент страха. Например транспорт начнет убегать даже если он считает что немного сильнее, а боец будет стоять даже против более сильного противника.

Помимо страха у каждого бота есть “HatePoints” я уже писал когда-то о них ранее их цель заключалась в том чтобы приоритизировать цель по очкам ненависти. То есть по сути очки “агра”. Но теперь я расширил их функционал до полноценного отношения одного бота к другому (или игроку):

Это позволило ботам запоминать обидчиков и мстить им даже в мирных секторах.

Но не хватало ещё одного асоциального элемента который бы наводил суету в мирных секторах и вносил немного хаоса в происходящее вокруг.

Пираты, запросы и динамичное поведение

А для асоциального элемента нужно было сделать запросы с требованиями выкинуть груз или заплатить. Так я сделал “запросы” которые позволяли ботам общаться друг с другом.

Но запросы это не только диалоговые окошки, они влияют на поведение причём очень сильно. Дабы решить эту проблему я обвязал все правила всех ботов, родительским правилом и это позволило динамически изменять поведения бота без тонны конфигов и костылей с сохранением предыдущего состояни.

Выглядит это так:

Veliri. Дневник разработки 3

Если мы имеем специальные правила поведения,то мы идем по ним, а если нет работаем в штатном режиме, все просто :)

И вот какие запросы для нпс я сделал:

Атака:

  • Запрос на совместное нападение на цель. Меняет поведение бота на поведение "Киллера" Пока цель не будет убита или они договорятся одним из правил "вымогательства"/"защиты" или киллер "испугается"

Вымогательства:

  • Требование отдать кредиты

  • Требование выкинуть груз

Защита:

  • Просьба о заключение перемирия, если инициатор слабее то может перерасти в вымогательство

  • Сопровождение, некоторые боты могут просить сопроводить их и в случае успеха ответчик поменяет своё поведение на поведение "Телохранителя"

  • Предложение, мир за деньги.

  • Предложение мир за груз из трюма

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

Veliri. Дневник разработки 3

А для того чтобы в секторе всегда происходил какой-то экшон я ввёл 2 роли:

  • Пират: в основном занимается тем, что грабит мирные мехи.

  • Спецагент: путешествует по всему миру, занимается зачисткой пустоши и терроризирует ботов другой фракции.

Небольшой видос из жизни сектора:

Ну вот как то вот так оно и работает. ¯\_(ツ)_/¯

2323
9 комментариев

Странно, что нет комментариев, интересно же пишешь. Может добавлять в заголовок к статье вопрос «Что лучше, XBox или PS?” чтобы поднять активность? Или вставлять гифку «ржака, мужик с велосипеда на кота упал, смотреть». 

6
Ответить

Люди не привыкли к статьям по геймдеву на пикабу.

2
Ответить
2
Ответить

Как насчёт сисечек? 

Ответить

Так лучше не делать. Иначе нпс будут разбегаться и круги наворачивать пока убегающего не зажмут в угле. 

Иммтация жизни достигается более сложными алгоритмами. 
Во первых нападать на врага или нет : должно регулироваться приоритетами. 
Во вторых "понятие собственной слабости" должно учитывать наличие союзников вокруг. 
В третьих не учен момент ~ примерно равных сил. 

3
Ответить

Вы правы картинка упрощена для лучшего понятия происходящего)

Приоритеты выстраиваются из отношений и анализа силы относительно врага, ну и союзники тоже учитываются)
Ну и про примерно равные силы я тож описал в подразделе "Отношения"

Ответить

Немного дополню свой коммент:
Тут все немного сложнее я не стал это в статью писать что бы не усложнять ее, но дополню тут)

1) Отношения к ботам:
каждый бот имеет "очки ненависти" к другим ботам от 200 (вражда) до -200 (друзья)
— по умолчанию бот имеет отношение к другому боту нейтральное отношение (0), но в зависимости от поведения оно меняется

кто является врагом?
— в безопасной/свободной зоне враг это бот отношение с которым находится на уровне "вражда" (200)
— в боевой зоне, работает тоже правило + все боты противоположной фракции.

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

2) Нападать на врага или нет?
Когда бот видит другого бота или игрока враждебно настроенного он прикидывает на анализе хп/дпс свои и своих союзников против хп/дпс всех врагов которые находятся в поле зрения.

Если коэффициент == 0 то это значит равные силы, если > 0 то мы имеем большую силу, < 0 мы проигрываем. Он может меняться во время боя т.к. не учитывает кучу параметров.

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

 ...тут у меня кончились буквы и пришлось удалить половину... :С

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

Ответить