Типы инициатив NPC

Материал из IFВики
Перейти к навигации Перейти к поиску

О статье

автор Эмили Шорт, перевод darren_ward

Перевод впервые опубликован в журнале IFPrint, выпуск 4. Оригинал опубликован 22.07.2009

Моделирование диалогового потока – типы инициатив NPC

В игре «Galatea» одним из моментов, которые мне хотелось сделать, но плохо удалось, была возможность Галатеи продолжать разговор самостоятельно, если вы остановились, чтобы послушать её, но не разговариваете с ней. Однако набор её фраз был очень ограничен, поэтому не было смысла останавливаться после каждого хода и ждать, к тому же не всегда было понятно, будет ли она продолжать. Более того, сам механизм был очень неудобен и не позволял запланировать более одной реплики за раз.

В «Alabaster» это сделано гораздо лучше.

Вместо того, чтобы речь NPC была частью действия игрока, NPC имеет собственное действие и обладает списком фраз, которые он скажет дальше. Он продолжит говорить фразы из списка, если игрок молчит, или если текущая ветвь диалога исчерпана, и пора менять тему, чтобы разговор продолжался (в «Galatea» также не было модели на тот случай, когда ветвь диалога заканчивалась). Новые реплики, добавляющиеся в список, имеют два вида приоритета — они могут быть помечены как «обязательные» либо «опциональные», а также как «немедленные» либо «отложенные».

Обязательные реплики – это те, что NPC в любом случае скажет рано или поздно, даже если игрок прервет его другими комментариями.

Опциональные – те, что он может сказать, но может и пропустить, если разговор пойдет в другом направлении.

Точно так же, «немедленные» означает, что он скажет их на следующем ходе (они ставятся на первую позицию), даже если в списке еще есть другие фразы, а «отложенные» значит, что фраза ставится в конец списка.

Комбинациями этих приоритетов и определяются различные способы, которыми NPC может продолжить разговор:

Реакция на непосредственный стимул

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

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

Продолжение предыдущего разговора

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

Оба вида опциональных реплик чаще всего добавляются в список NPC на основе того, что сказал сам NPC. Например, у нас есть последовательность:

  • игрок спрашивает об убийстве [план: немедленный ответ о мисс Данбар]
  • NPC отвечает, что он подозревает мисс Данбар [план: немедленный опциональный комментарий о манере мисс Данбар одеваться]
  • на следующем шаге игрок молчит, возможно, выполняет другое действие
  • NPC упоминает манеру мисс Данбар одеваться

Запланированные последовательности

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

Вопросы игрока могут изменить порядок элементов последовательности, если автор это позволит – например, NPC может запланировать фразу о перстне с ядом после разговора о том, почему герцог Орсини должен умереть, и игрок может изменить эту последовательность, спросив о перстне сначала.

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

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

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

Эти механизмы можно обойти.

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

Чтобы Пол не говорил о потайной двери, пока не будет доверять игроку, скажем:

Пол отводит взгляд. «Я не хотел бы это обсуждать».

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

Чтобы Пол не говорил о потайной двери, пока не будет доверять игроку, скажем:

«Похоже, ему не по себе. [Прокрутить обзац]»;

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

Получается следующее:

«Слушай, Пол, не странно ли, что за камином как будто есть пустое пространство?»
Похоже, ему не по себе.
«...скажи, ты не смотрел игру вчера вечером?»

Таким образом, игрок имеет возможность задать Полу вопрос, даже если пока не может получить ответ. Реплика не будет считаться «использованной» до тех пор, пока Пол не будет доверять игроку достаточно, чтобы ответить. (Как правило, я считаю это более предпочтительным, чем скрывать реплики до тех пор, пока NPC не сможет дать ответ: так игрок знает, что позже эти ветви разговора будут более плодотворны, даже если вначале они не дают результата. Но, конечно, никто не запрещает просто скрывать реплики).

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

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

Ссылки