Создание сложных квестов и диалогов

Материал из MODFAQ.RU — моддинг игр серии S.T.A.L.K.E.R., The Elder Scrolls и Fallout
Перейти к: навигация, поиск

Создание сложных квестов и диалогов

Дата публикации

2 октября 2007 (16 лет) [1]

Автор Эдуард Клишин
Связанная статья
Создание типовых квестов

В статье «S.T.A.L.K.E.R. — создание типовых квестов», которая притаилась на страницах «Мастерской» нынешнего выпуска журнала, мы поговорили о разработке несложных, точнее говоря, простейших типовых заданий для игры.

Ну а раз основы изучены, фундамент заложен, можно и нужно двигаться дальше и приступать к освоению неизведанного. Что мы, собственно, сегодня и сделаем. Итак, в настоящей статье речь пойдет о сборке сложных нелинейных квестов для игры и написании многоступенчатых диалогов. Готовы? Защитный костюм и противогаз на месте? Тогда вперед — осваивать бескрайние «модные» просторы...

Дар речи

Итак, решили вы написать оригинальную миссию для игры[2]. С чего начать? Бросаться писать скрипты? Приниматься за конструирование разветвленных диалогов? Или вообще все это отложить в сторону и сделать кое-какие наброски на бумаге. Первым делом, разумеется, нужно сделать кое-какие выкладки — подобрать действующих лиц, придумать крайне интересный и дух захватывающий сюжет, наконец, продумать, как будут выглядеть диалоги между NPC и будут ли они вообще фигурировать в игре. После этого уже можно приступать к чисто технической части — реализации задуманного.

Если кто-то подумал, что работать мы будем в редакторе уровней и по неосторожности его запустил, пусть покинет программу — она нам сегодня не пригодится. Писать миссии и диалоги для S.T.A.L.K.E.R. мы будем исключительно в «Блокноте». Нет, вовсе не оттого, что недолюбливаем официальный инструментарий, а лишь потому, что официальный модмейкерский набор пока не позволяет править ни одиночные карты, ни квесты.

1.jpg
Нелегкое это дело — писать квесты в «Блокноте». С другой стороны, выбирать не приходится: официальный редактор на данный момент не позволяет редактировать и создавать новые квесты.


Краткий брифинг проведен. Время действовать. Начнем, пожалуй, с написания разветвленных диалогов. Запустите «Блокнот» и подгрузите в него файл character_desc_escape.xml, который проживает в директории gamedata\config\gameplay\ установленной игры (прим. — все архивы «Сталкера» должны быть «распечатаны»). Данный документ, по сути, содержит множество ссылок на определенные ветви диалогов, т.е. фактически служит лишь для объявления или инициализации разговорных блоков, но не более того. Давайте вживим в тело данного файла ссылку на новый диалог с торговцем — Сидоровичем (впрочем, никто не мешает вам создать новых персонажей, например канонического Ктулху, и закрепить за ними определенные диалоги). Для этого выполните следующие действия. Отыщите строку <actor_dialog>escape_trader_done_blockpost_box</actor_dialog> (прим. — меню поиска в «Блокноте» активируется при помощи горячих клавиш Ctrl + F, если кто не знает) и сразу же после нее (с новой строки) поместите следующую конструкцию:

<actor_dialog>escape_trader_igromania</actor_dialog>

Где escape_trader_igromania — название будущего диалога.

Инициализация произведена. Двигаемся дальше — приступаем к внедрению кода диалога в файл dialogs_escape.xml из каталога gamedata\config\gameplay\ игры, в котором прописаны практически все игровые тексты в общем виде. Итак. Откройте «Блокнотом» файл dialogs_escape.xml и добавьте в конец документа — перед ключевым словом </game_dialogs> следующий блок:

<dialog id="escape_trader_igromania">
<precondition>escape_dialog.trader_alredy_give_job</precondition>
<has_info>tutorial_end</has_info>
<phrase_list>
<phrase id="0">
<text>escape_trader_igromania0</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>escape_trader_igromania1</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>escape_trader_igromania2</text>
<next>3</next>
</phrase>
<phrase id="3">
<text>escape_trader_igromania3</text>
</phrase>
</phrase_list>
</dialog>

Давайте рассмотрим структуру данного диалога. В первой строке блока указывается название диалога, соответствующее определенной записи в файле character_desc_escape.xml. В нашем случае — это escape_trader_igromania. Последующие две строки отвечают за так называемое предварительное условие (precondition) и специальную информационную справку. Тег <phrase_list> открывает огромный список фраз диалога, а </phrase_list>, соответственно, его замыкает. Между ними, как мы уже сказали, размещаются различные реплики в общем виде. Каждая новая запись состоит из трех ключевых строк, содержащих так называемые теги phrase id, text и next. В первой из них указывается специальный идентификационный номер, указывающий на номер реплики. Нумерация начинается с нуля. Т.е., скажем, для первой записи значение параметра phrase id = 0, для второй — 1 и так далее. Во второй строке между тегами <text> и </text> содержится ключевое слово или «ключворд», которое представляет собой название строки — сам же текст вбивается в документ gamedata\config\text\rus\stable_dialogs_escape.xml.

Ну и, наконец, между тегами <next> и </next> помещается номер следующего узла или реплики. Таким образом, зная структуру диалогов, вы можете конструировать блоки, состоящие из 10, 100, 1000 записей. Лимит не установлен.

2.jpg
Файлы диалогов игры можно редактировать и при помощи Microsoft Excel — по сути-то, мы имеем дело с банальными XML-документами. Правда, в таком случае могут возникнуть серьезные трудности при переводе «электронной книги» в XML-формат «Сталкера».


Полдела сделано. Осталось лишь насадить на сформированный каркас полноценные текстовые реплики NPC — не ключевые слова, не ссылки, а саму «начинку» в духе: «Эээй, Меченый...! Водки, водки давай... И побыстрее там, сколько уже можно ждать». Первым делом откройте «Блокнотом» файл stable_dialogs_escape.xml из директории gamedata\config\text\rus\ с установленной игрой и внедрите в конец документа перед тегом </string_table> следующую конструкцию:

<string id="escape_trader_igromania_0">
<text>Слушай, Сидорович, есть у тебя какая-нибудь интересная работенка для меня? Что-нибудь экзотическое. Понимаешь, о чем я? Надоели убийства, надоели ограбления... Скукотища...</text>
</string>
<string id="escape_trader_igromania_1">
<text> Ну, Меченый, повеселил ты меня. Давно я такого бреда не слышал. Ну, иди, иди и найди снежного человека, поговори с Ктулху...</text>
</string>
<string id="escape_trader_igromania_2">
<text>Ктулху, говоришь?! А может быть, он есть, на самом деле есть. Ты об этом не думал. Сейчас пойду его поищу, ведь должен же он существовать: в зоне про него тоже немало слышал!</text>
</string>
<string id="escape_trader_igromania_3">
<text>Ну, иди, иди, только вот будь добр — прихвати для меня по пути несколько дельных вещиц — что найдешь: консервы, части местных животин, ценные артефакты. В долгу не останусь.</text>
</string>

Нетрудно заметить, что данный блок почти полностью копирует ранее написанный нами диалог в общем виде, с той лишь разницей, что между тегами <text> и </text> заключены уже не краткие названия строк на английском, а полноценные текстовые реплики на родном русском языке.

Квестострой

Диалог написан, а следовательно — первый этап работы по созданию новой миссии выполнен. Движемся дальше и приступаем к написанию самого задания. Вновь откройте текстовым редактором XML-документ dialogs_escape.xml из каталога gamedata\config\gameplay\ с установленной игрой. Отыщите свой диалог (прим. — если вы действовали согласно нашей инструкции, то проживать он должен в конце документа). И после строки <text>escape_trader_igromania2</text> поместите следующий код:

<give_info>igromania_quest</give_info>

Данная команда приведет к старту квеста с незатейливым названием igromania_quest после появления на экране третьей записи диалога (прим. — помните, что отсчет-то ведется с нуля, а не с 1?). Итак, что же мы имеем на данный момент? Диалог есть, ссылка на квест есть, самого квеста... нету. Надо срочно эту проблему решить. Что ж, приступим. Подгрузите в «Блокнот» файл tasks_escape.xml из каталога gamedata\config\gameplay\ со «Сталкером» и вставьте в самое начало документа следующую конструкцию:

<game_task id="igromania_quest">
<title>Типично русский квест</title>
<objective>
<text>Поговорить с Ктулху</text>
<icon>ui_iconsTotal_storyline_eliminate_gunslinger</icon>
<infoportion_complete>igromania_quest_done</infoportion_complete></objective>
<objective>
<text>Раздобыть ценные артефакты и просто полезные в хозяйстве вещицы</text>
<map_location_type hint="esc_fox">green_location</map_location_type>
<object_story_id>Escape_Tutorial_Artefact</object_story_id>
<infoportion_complete>igromania_quest_done</infoportion_complete>
</objective>
<objective>
<text>Встретиться со снежным человеком =)</text>
<map_location_type hint="escape_trader">blue_location</map_location_type>
<object_story_id>Escape_stalker_from_raid</object_story_id>
<infoportion_complete>igromania_quest_done</infoportion_complete>
</objective>
</game_task>

Так, давайте посмотрим, что здесь к чему. Параметр, точнее говоря, тег с ключевым словом game_task id отвечает за идентификационный номер (правда, текстовый, а не цифровой) или название миссии. Между тегами <title> </title> проживает заголовок задания на русском, в нашем случае — Типично русский квест. Далее в пределах от элемента <text> до </text> содержится краткий текст квеста на чистейшем русском языке. Между тегами <icon> и </icon> задается определенный тип маркера или иконки, который будет отображаться на карте местности, в нашем примере — ui_iconsTotal_storyline_eliminate_gunslinger. В теле тега <infoportion_complete> проживает ссылка на определенную запись в файле gamedata\config\gameplay\info_l01escape.xml с текстом условия. Тег типа <map_location_type hint> включает в себя информацию о графической подсказке на радаре, а <object_story_id> — о квестовом объекте. Вот, в принципе, и все. Что? Зачем мы вживили в тело миссии несколько <objective>-блоков? Все просто. Три части задания, три независимых группы — Поговорить с Ктулху, сгонять за артефактами и встретиться со снежным человеком.

С созданием квестовой основы покончено. Следующий шаг — обозначение целей и прописывание экранных подсказок. Передохнули, сил набрались? Тогда снова в бой! В очередной раз вооружитесь «Блокнотом». Откройте файл info_l01escape.xml из папки gamedata\config\gameplay\ со S.T.A.L.K.E.R., отыщите в нем тег <game_information_portions> и после него поместите следующую незатейливую конструкцию:

<info_portion id="igromania_quest_done"></info_portion>
<info_portion id="ktulxu_start_igro">
<task>igromania_quest</task>
</info_portion>
<info_portion id="no_ktulxu_no"></info_portion>

Если внимательно приглядеться, то несложно обнаружить, что в теле каждого тега типа info_portion id прописывается определенное условие, название которого было ранее задано в файле tasks_escape.xml. Между тегами <task> и </task> указывается название квеста, для которого обозначаются условия, в нашем случае — igromania_quest. Так, с прописыванием условий разобрались.

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

Откройте файл string_table_tasks_escape.xml из директории gamedata\config\text\rus\ с игрой и скопируйте в начало или конец файла следующий текстовый блок:

<string id="igromania_quest">
<text>Поговори с Ктулху</text>
</string>
<string id="igromania_quest_1">
<text>Найди полезные предметы и артефакты</text>
</string>
<string id="igromania_quest_2">
<text>Встреться со снежным человеком</text>
</string>

Приведенная выше структура состоит из трех блоков, каждый из которых, в свою очередь, содержит ровно по три строки. В первой строке, которая начинается с «кейворда» string_id, указывается определенное идентификационное имя строки на английском (без пробелов), во второй — между тегами <text> и </text> — начинка, текст подсказки, ну и, наконец, в третьей — тег </string>, который закрывает блок подсказки.

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

<phrase id="13">
<text>escape_trader_igromania_12</text>
<next>2</next>
<next>4</next>
<next>6</next>
<next>8</next>

Из этого примера отчетливо видно, что игрок может сам сделать выбор — к какому звену диалога перейти: 2,4, 6 или 8.

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

После этого встройте в тело конечных «разговорных» блоков ссылки для активации нужных игровых скриптов, скажем:

<phrase id="18">
<text>escape_igromania_17</text>
<give_info>igromania_quest_done</give_info>
<action>artifacts_and_obj</action>
<action>give_gold</action>
<next>23</next></phrase>

Последние штрихи. Осталось лишь написать скрипты, ответственные за «выписку гонорара» игроку, а также передачу ценного предмета определенному NPC. Откройте файл gamedata\scripts\escape_dialog.script при помощи «Блокнота» и вживите перед ключевым словом Trader следующий функциональный блок, точнее говоря — два блока:

function give_gold (first_speaker, second_speaker)
dialogs.relocate_money(second_speaker, 84000, "in")
end

function artifacts_and_obj (npc, actor)
dialogs.relocate_item_section (npc, "object", "out") -- здесь слово object необходимо заменить названием того элемента, который игрок должен передать шефу, например, vodka или conserva.
end

Первая функция в приведенном примере отвечает за выдачу золотых игроку в сумме 84000, вторая — за изымание ценных артефактов и вещиц у Меченого.

« Ура — квест готов! Отправляемся на поиски канонического Ктулху, снежного человека и полезных в хозяйстве вещиц...
Эдуард Клишин
»

***

Сегодня мы научились писать сложные квесты для «Сталкера» с чистого листа, а также прошли хорошую школу написания диалогов, экранных подсказок и вникли в тонкости редактирования XML-документов игры. На этом тема редактирования S.T.A.L.K.E.R. не закрыта — мы вернемся к ней в одном из ближайших номеров «Игромании». Ну а пока традиционно прощаемся с вами и желаем удачных модостроительских будней. До скорого!

Источники