Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

3    0    #1
25.02.2015 11:35

Olegus t.Gl.
Участник (+1053, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2879
Вебсайт

Диалоги с выбором вариантов. Формат записи

Решил выложить наработки по данной теме.

Диалоги с выбором вариантов — головная боль автора

В хорошей приключенческой игре не обойтись без общения с персонажами. Общение подразумевает диалоги, а диалоги — это головная боль автора. Нет, ну бывают, конечно, диалоги линейные ("я сказал/он сказал/я сказал/…") или диалоги, выводимые одним блоком текста, — всё это программируется легко и, что самое важное, в них достаточно просто вносить изменения. Но вот популярный формат диалогов, когда игроку предлагается выбрать фразу из нескольких вариантов, уже куда сложнее. Причём не только для первоначального программирования, но и для дальнейшей доработки.

Особенности игровых диалогов

Если брать обычный диалог из игры, то у него есть две особенности, которые нужно учитывать:


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

Запись диалогов — ключевой момент их программирования

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

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

Основная функция для заполнения диалога: "ДобавитьФразу", в которую передаются следующие параметры:

  • Персонаж — кто произносит данную реплику.
  • Темы — параметр будет рассмотрен ниже.
  • Фраза — текст фразы.

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

Возьмём для примера небольшой диалог:
https://ifiction.ru/i/scr/dialog-01.png

Темы диалога (идентификаторы узлов) в нём помечены жёлтым цветом.

В параметре "Темы" автор должен указать, к какой теме диалога принадлежит фраза, на какую тему нужно перейти при выборе этой фразы и что нужно сделать с этой фразой при её выборе. Формат записи следующий:

Тема(Действие) -> Куда

  • Тема. Это идентификатор темы диалога, по которому будут осуществляться переходы и группировки фраз.
  • Действие. После темы можно в скобках указать действие с этой фразой после её выбора:
    (.) — после выбора фразы, она становится невидимой, пока диалог не будет запущен заново.
    (-) — после выбора фразы, она удаляется из диалога, и при его повторном запуске видна не будет.
    (=) — после выбора фразы, все фразы из темы, к которой принадлежит выбранная фраза, удаляются из диалога, и при его повторном запуске видны не будут.
    Если действие не указывать, то фраза постоянно присутствует в диалоге.
  • Куда. Это идентификатор темы, на которую нужно перейти после вывода соответствующей фразы.

Например, команда

Код:

ДобавитьФразу, "Герой", "Вопросы(.) -> Гадалка", "Куда пошла дама с собачкой?"

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

Текст приведённого выше диалога в коде игры будет следующим:

Код:

ДобавитьФразу, "Герой",  "Начало -> Ответ",       "Привет!"
ДобавитьФразу, "Кассир", "Ответ -> Вопросы",      "Ну привет."

ДобавитьФразу, "Герой",  "Вопросы(.) -> Гадалка", "Куда пошла дама с собачкой?"
ДобавитьФразу, "Герой",  "Вопросы(.) -> Время",   "Во сколько закрывается цирк?"
ДобавитьФразу, "Герой",  "Вопросы(-) -> Один",    "А можно личный вопрос?"
ДобавитьФразу, "Герой",  "Вопросы -> Ладно",      "Я прогуляюсь тут?"

ДобавитьФразу, "Кассир", "Гадалка -> Вопросы",    "В шатёр к гадалке."
ДобавитьФразу, "Кассир", "Время -> Вопросы",      "Мы круглосуточно работаем."

ДобавитьФразу, "Кассир", "Один -> Личное",        "Только один."
ДобавитьФразу, "Герой",  "Личное -> Имя",         "Как вас зовут?"
ДобавитьФразу, "Кассир", "Имя -> Конец",          "Румпельштильцхен."

ДобавитьФразу, "Кассир", "Ладно -> Конец",        "Не вопрос."

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

Пример, как выглядит подобный диалог в игре, можно посмотреть тут: https://ifiction.ru/olegus/dialog.html

Разумеется, это неполное описание. В диалогах довольно полезна команда "ДобавитьБлок", для вывода блока диалога, состоящего из текста или реплик персонажей. Также к каждой фразе можно привязать условие, по которому она включается в перечень реплик игрока (или ответов NPC), а также модуль с программным кодом, который вызывается при выборе реплики. В параметре "Темы" можно использовать несколько значений "Куда" для объединения веток. Ну и тому подобное. Если тема интересная, могу расписать подробнее. Например, алгоритм функционирования диалога по шагам (поиск начальной темы, переходы и т.п.)…

Неактивен

0    0    #2
26.02.2015 20:03

Oreolek
Модератор (+450, -169)
Откуда: Кемерово
Зарегистрирован: 02.11.2009
Сообщений: 673
Вебсайт

Re: Диалоги с выбором вариантов. Формат записи

Интересно, конечно, но есть ещё и условия на появление фраз в диалоге. Кроме того, сами ответы могут ставить свои условия ("я сказал Вейдеру, что я - его внук, Вейдер запомнит это") Так что модулям (фразам) нужно три строчки, а не две. И конечные фразы проще показывать цветом, а не сводить к одному концу (потому что конец может быть и не один).

А так советую посмотреть программку Chat Mapper.

Неактивен

0    0    #3
27.02.2015 00:25

Olegus t.Gl.
Участник (+1053, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2879
Вебсайт

Re: Диалоги с выбором вариантов. Формат записи

Oreolek написал:

Интересно, конечно, но есть ещё и условия на появление фраз в диалоге. Кроме того, сами ответы могут ставить свои условия ("я сказал Вейдеру, что я - его внук, Вейдер запомнит это") Так что модулям (фразам) нужно три строчки, а не две.

Немного подумав, я понял, что ты это говоришь про представленную блок-схему. Так вот, блок-схема это вовсе не часть представляемой мной методологии записи диалога. Это всего лишь иллюстрация того, что я имею в виду под термином "тема диалога". А так, модули условий, как и модули кода, вызываемого при выборе фразы, могут идти отдельными параметрами функции "ДобавитьФразу" (у меня так и реализовано).

Oreolek написал:

И конечные фразы проще показывать цветом, а не сводить к одному концу (потому что конец может быть и не один).

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

Oreolek написал:

А так советую посмотреть программку Chat Mapper.

Смотрел ещё в 2011 году по совету fireton. Зачем? Это слишком отстранённое от основной среды разработки (и работы над материалами) решение, к тому же платное. Которое при этом никак не решает проблемы переноса диалога в код. Не вижу смысла обсуждать данную программу в этой теме.

Неактивен

0    0    #4
27.02.2015 14:47

Agent_007
Активный URQ-шник (+39, -15)
Откуда: Россия, Москва
Зарегистрирован: 01.03.2005
Сообщений: 50
Вебсайт

Новинка 2015! Текстовые игры онлайн на платформе `Apero.ru. Удобный онлайн конструктор, адаптировано под мобильные устройства!

Re: Диалоги с выбором вариантов. Формат записи

ДобавитьФразу, "Герой", "Вопросы(.) -> Гадалка", "Куда пошла дама с собачкой?"

Почему бы Тему "Вопросы(.) -> Гадалка" не разбить на 3 отдельных параметра "Вопросы", "Гадалка" и необязательный "."
Это сделано с целью приятного визуального вида или специфика конкретного языка? Иначе строку придется парсить, лишние движения.

Отредактировано Agent_007 (27.02.2015 14:48)

Неактивен

0    0    #5
27.02.2015 21:38

Olegus t.Gl.
Участник (+1053, -249)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2879
Вебсайт

Re: Диалоги с выбором вариантов. Формат записи

Agent_007 написал:

ДобавитьФразу, "Герой", "Вопросы(.) -> Гадалка", "Куда пошла дама с собачкой?"

Почему бы Тему "Вопросы(.) -> Гадалка" не разбить на 3 отдельных параметра "Вопросы", "Гадалка" и необязательный "."
Это сделано с целью приятного визуального вида или специфика конкретного языка? Иначе строку придется парсить, лишние движения.

В моём случае — именно для внешнего вида. Хотелось разгрузить эти параметры от лишних кавычек, запятых и т.п. Но для сути записи это несущественно. Реализация может быть всякой.
Параметры парсит не автор, а модуль диалогов, поэтому проблема "лишних движений" для меня не особо актуальна.

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru