Простота Radiant AI или как сделать живой мир

Простота Radiant AI или как сделать живой мир

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

Но это иллюзия, и сейчас мы развеем ее. А для этого рассмотрим Radiant AI от BGS.

Для этого применим reverse engineering при рассмотрении системы интеллекта ТЕS и Fallout.

Для этого нам понадобится заглянуть в Редактор карт для создания модификаций к Забвению. И посмотреть как создаются НПС и задается их расписание.

Для этого нужно создать график событий в виде таблицы в редакторе карт:

В рамках возможных действий - нужно задать активности для НПС:

В нем указываем время с расписанием на день, неделю или месяц (потом повторяется) и ...именная локация и собственно набор активностей, на локации.

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

При жесткой активости NPC будет заниматься только своей задачей, при мягкой - NPC будет свободно ходить по локации и выбирать активности по своему характеру. Например активность можно задать в процентном соотношении. Так то основные активности для персонажей :

Сон, Еда, Чтение, Торговля, Тренировка, Уборка, Копание грядок и т д....

Естественно приоритет активностей сбрасывается при переходе НПС с гражданского режима в боевое. (если не поставлен иной флаг)

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

То есть ИИ НПС и локации напрямую связаны внутри движка

И в этом весь ответ и заключается. Редактор ИИ у НПС это работает не сколько с самим НПС. А с понятием Локации, для которой создается таблица со списком НПС, в которую записываются ID НПС, и время присутствия на локации.

Редактор ИИ внутри НПС - это лишь часть интерфейса которое работает в первую очередь со списком спавна НПС на локации.

НПС и ИИ в других ячейках не считаются в TESах.

СЮРПРИЗ. Это только в Космических Рейнджерах ИИ в других солнечных системах обсчитывается по упрощенной схеме .

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

Когда вы задаете график и список посещенных локаций у NPC - это одновременно приводит к записи в специальную таблицу ID у этой именной локации. А так же проверки - не заблокирован ли НПС по причине смерти или квеста.

И когда игрок заходит в локацию - движок игры проверяет жив ли NPC, сравнивает время - и заранее спавнит персонажа с нужным ID внутри локации рядом с местом активности, если он должен присутствовать там в это время.

Если же время прибытия НПС наступает когда игрок уже внутри зоны, то тогда движок спавнит NPC со стороны входа(или дорог), после чего он на основе локального ИИ идет к месту своей активности.

В этом и заключается вся фишка Лучистого ИИ от Бетезды. Оно во всю использует особенности движка игры с разделенным на ячейки миром. И работает уже напрямую с ними. Активируя ту ячейку в которой находится игрок.

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

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

На других движках, например Unreal аналог Radiant AI можно реализовать через Volumes Reference'ы, которые будут подгружаться с NPC по мере приближения к ним.
Нужно лишь с сначала сделать подходящий плагин для движка на С++ или сложную БП систему которая будет нормально запоминать локаций, NPC и расписание спавна нужных нам актеров.

Вариации от Skyrim'a

В Skyrim систему несколько усложнили сделав возможность "делегации поведения" в случае смерти персонажа. Например случайной гибели в случае налета дракона.

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

Забавные факты о костылях Лучистостого ИИ

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

Залы Мертвых

Из за особенностей игрового движа Геймбрио, который Тодд упорно просит не называть геймбрио изначальным именем - игры BGS не могут без слома скриптов нормально обрабатывать погибших НПС.
В игре буквально нет понятие смерти для именных НПС.

Поэтому для мертвых НПС добавлена специальная локация с могилой (Dead Body Cleanup Cell).

Нахождение тел НПС в этой локации делает их недоступными для радиант АИ в большинстве квестов, кроме ... свадьбы, на которую игра вытащит некоторых NPC с меткой "друг" даже с того света. Этот костыль так же сделан для того что бы не выдавала ошибку - когда NPC с привязанными на нем скриптами, удалялся из игры с концами.

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

CoolStory

Вы наверное спросите, а где истории про НПС с низкой социальной ответственностью убивающих за яблоко или наличие садового инвентаря?

А ИХ И НЕТ - это все байки от отдела маркетинга:

Not so Radiant AI examples Some of the unexpected behavior of NPCs that were discovered while testing the Radiant AI system were rather humorous. One character was given a rake and the goal "rake leaves"; another was given a broom and the goal "sweep paths," and this worked smoothly. Then they swapped the items, so that the raker was given a broom and the sweeper was given the rake. In the end, one of them killed the other so he could get the proper item. Another test had an on-duty NPC guard become hungry. The guard went into the forest to hunt for food. The other guards also left to arrest the truant guard, leaving the town unprotected. The villager NPCs then looted all of the shops, due to the lack of law enforcement.

Кулстори про Radiant AI

В одном из квестов тёмного братства в Oblivion нужно было встретиться с продавцом скумы. Во время плейтестов этого продавца иногда находили мёртвым: дело было в том, что NPC, у которых была зависимость от скумы, не хватало на неё денег. Так что в стремлении заполучить напиток они убивали продавца.

Эмиль Паглиаруло, геймдизайнер Fallout

Сцена с E3 с "These NPCs are NOT scripted" с собакой и НПС была полным обманом. Все было на скриптах, часть следов которых до сих пор можно найти в игре.

Огороженные города

Другим известным костылем игр BGS с 2006го - являются огороженные города.

Движок бетезды отличается тем что все локации делятся на открытую карту мира и закрытую.

Огораживание городов в Oblivion возникло не просто так, а как способ оптимизировать работу с локациями для NPC. В отличие от морровинда где грузилось 8 ячеек мира ближайших к игроку, Обливион по упрошенной схеме грузил весь мир до горизонта.

Так как избыток НПС на открытой локации и просчет поиска путей НПС мог вещать ПК.
А так как NPC на глобальной карте перемещались более менее честно по дорогам, что позволяло игроку там встретить некоторых персонажей в роде М'аика. То вопрос сокращения популяции НПС в открытом мире- вставал ребром.

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

Отказ от Радиант АИ в Starfield

Интересна особенность, что видно что BGS в какой то момент отказалась от своей системы ИИ и отключило его. Что позволило им сделать открытые города, но в которых НИЧЕГО не происходит.

Именные НПС стоят на месте, а безымянные болванчики - гененрируються в одной точки идут в другую и исчезают.

Что дальше? Куда развивать?

После того как мы поняли как скопировать Радиант АИ - можно подумать и о том, какие дополнения можно внести в него, что бы улучшить уже имеющиеся решение.

А теперь перейдем к моим вкусным предложениям:

Набор Ролей

Вместо уникальной настройки одного отдельного персонажа.

Например вместо индивидуальной работы с конкретным расписанием НПС, добавить РОЛИ. И вместо ручной отправки на активность, конкретного NPC - отправить одного или нескольких из множества персонажей с соответствующей РОЛЬЮ.

В конечном счете речь идет об РПГ, и работа с миром игры это очень важно. Это может позволить заполнять города персонажами довольно быстро, создавая иллюзию живого мира.

Например у НПС будет роль члена какой то семьи, роль помощника трактирщика, и роль сектанта культа - и у трактирщика будет с пяток помощников, из которых постоянно работать будет только 2е каждый день и лишь один из них сектант, а так же у каждого из помощников будет своя семья и будет проводить часть времени с ней

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

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

Это решение позволит расширить численность поселений в сравнение с типичными хуторами бетезды на 10-20 NPC, без нужды отключать Радиант АИ как в Старфилде, и при сохранении активностей НПС у которым будет чем заняться в городах.

Это позволит создать сложные детективные сюжеты, и разнообразить реиграбельность, так как роли NPC встречаемых по квестам будут чередоваться у разных игроков. А так же дать возможность игроку потерять часть НПС в мире, в ходе мировых эвентов, вроде налетевших драконов. Система Cкайрима предполагает прямое наследование у одного персонажа.


Случайный кандидат

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

Это может помочь с реиграбельностью сюжета, когда в каждой NEW GAME будет свой НПС связанный с квестом. Причем вероятности можно раскинуть по разному, что обеспечит занятную реакцию у любителей проходить по интернете гайдам, когда выпадет 10% вероятность на другого персонажа.

Так же можно добавить Ложные роли.

Когда персонаж будет действовать ОЧЕНЬ похоже на подозреваемого, что может быть интересно реализовано в детективных квестах. Если сценаристы ленится не будут.

Схожая идея была в игре про Blade Runners из 90х, там определялось кто будет репликантом при старте игры, и в зависимости от этого менялось содержание писем и улик, и невнимательный игрок в финале получал BAD ENDING.

Роли которые задаются отношением к протагониста или через квесты

В Skyrim у NPC есть список друзей и недругов. Если герой вредит друзьям - это NPC это огорчает и они могут потребовать принести извинения или даже прислать убийц.

Если герой вредит их врагам - они присылают благодарственное письмо.

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

Или податься в бандиты если какой либо квест выполненный со стороны игрока приведет к разорению?

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

Предметы в комплекте с ролью

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

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

Пул NPC на замену

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

Кажется в некоторых случаях выгоднее добавить десяток а то сотню НПС бродяжничить между локаций и бухать в тавернах , но которые смогут занять место чей то роли по одной из специализации(воин/маг/вор), в случае если конкретные НПС в конкретном поселение ... просто закончатся?!

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

Так как игры серии TES имеют тенденции к массовом вымиранию населения по мере продвижения героя по квестам.

Рандомизатор в расписании.

Для удобства восприятия НПС нужно не забыть добавьте величину разброс по времени в расписание НПС что бы они начинали активность не одновременно, а с небольшим разбросом в 5-10-15 минут, возможно в зависимости от пунктуальности конкретного НПС.

Что бы не было одновременного спавна NPC со стороны локации в одной точке. Как это было в Обливионе когда в таверну вваливались сразу десяток НПС ровно в 18.00

Почему больше никто так не делает?

Это тоже очень интересный вопрос.

Для создания системы а-ля Скайрим вам понадобится буквально пара мидлов и месяц-два работы, кода на С++ над движком.

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

Собственно BGS хотела ввести аналог Радиант АИ еще в ТЕС3 Морровинде, но там материнская компания Зенимакс поставила жесткие сроки по выходу игры. Но получив приказ все бросать и шлифовать что готово, а ИИ в морровинде, так и остался максимально простой системы ИИ, который все что умел - это бродить по карте.

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


Применять или нет полученные сведения - зависит только от вас.

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

А так же усилить и функционал использовать в квестах, усилив возможную реиграбельность.
Единственное же условие по его внедрению - с него и нужно начинать разработку ИИ, что отработав поведение н прототипах - построить цельную игру.

15
286

Комментарии

СЮРПРИЗ. Это только в Космических Рейнджерах ИИ в других солнечных системах обсчитывается по упрощенной схеме.

Не только в КР, но еще и в DF

-На счет остального надо потом чуть-подробнее почитать

СЮРПРИЗ. Это только в Космических Рейнджерах ИИ в других солнечных системах обсчитывается по упрощенной схеме.Не только в КР, но еще и в DF-На счет о…
PikaFun
СЮРПРИЗ. Это только в Космических Рейнджерах ИИ в других солнечных системах обсчитывается по упрощенной схеме.Не только в КР, но еще и в DF-На счет о…

ИИ в КР2 обчитывался по упрощенной схеме - в том плане что там "эффективность выстрела не учитывало AOE и то что ракеты можно сбивать.
Так как механика ракет была своеобразной и приводила к спавну сотен ракет .. Так вот в ситсемах без игрока - корабли летали как будто у них не ракеты - а просто пушки. По сути ракеты выпускались в тот ход пока игрок был в гипере.