Создание новых веток диалогов
Теория
1) Списки веток диалогов содержатся в файлах вида gamedata/config/gameplay/character_desc_*.xml
Это, например:
character_desc_zombied.xml
character_desc_stalker.xml
character_desc_garbage.xml
...
Файлы character_desc_*.xml можно сравнить со стволом дерева диалогов.
В них перечисляется названия прикрепляемых веток диалогов
Например вот список веток диалога с Сидоровичем взятый из файла character_desc_escape.xml
<start_dialog>escape_trader_start_dialog</start_dialog> <actor_dialog>escape_trader_talk_info</actor_dialog> <actor_dialog>escape_trader_jobs</actor_dialog> <actor_dialog>tm_trader_dialog</actor_dialog> <actor_dialog>tm_trader_reward</actor_dialog> <actor_dialog>escape_trader_done_blockpost_box</actor_dialog>
В свою очередь каждая ветка диалога также может ветвится.
2) Ветвление диалогов прописывается уже в других файлах.
Например, ветвление диалога с Сидоровичем содержится в файле gamedata/config/gameplay/dialogs_escape.xml
Возьмем оттуда, например, ветвление escape_trader_jobs.
Ветвление имеет довольно большие масштабы, поэтому приведу только часть:
<dialog id="escape_trader_talk_info"> <precondition>escape_dialog.trader_has_talk_info_wr</precondition> <has_info>tutorial_end</has_info> <phrase_list> <phrase id="1"> <text>escape_trader_talk_info_1</text> <next>100</next> <next>99</next> <next>9995</next> </phrase> ... <phrase id="0"> <text>escape_trader_talk_info_0</text> <next>1</next> </phrase> </phrase_list> </dialog>
Здесь <precondition>…</precondition> - это проверка
выполнения условия. Ветка появится в диалоге, только если условие
выполняется.
Конкретно
<precondition>escape_dialog.trader_has_talk_info_wr</precondition>
из ветки escape_trader_talk_info - это обращение к функции
trader_has_talk_info_wr, находящейся в файле скрипте
gamedata/scripts/escape_dialog.script
Функция выглядит так:
function trader_has_talk_info_wr( trader, actor ) return true end
То есть, судя по его структуре,
<precondition>escape_dialog.trader_has_talk_info_wr</precondition>
выполняется всегда, т.к. функция всегда возвращает истину и <dialog
id="escape_trader_talk_info"> пропускается в списк реплик.
Но для конкретной ветки может быть несколько precondition и других условий.
Далее, <has_info>tutorial_end</has_info> - это еще
одна проверка, на этот раз на наличие у игрока так называемых
infoportions, выдаваемы в процессе ключевых диалогов. В данном случае
это проверка на то, закончена ли определенная стадия туториала, или
нет. Т.е. ветка допустится в список реплик если стадия туториала
закончена.
Более детально мы это разберем в конце статьи.
А далее идут конкретные фразы, содержащие ссылки на вытекающие фразы, например:
<phrase id="0"> <text>escape_trader_talk_info_0</text> <next>1</next> </phrase>
Это основа ветки escape_trader_talk_info.
Важно! В любой основной ветке любого диалога фраза
<phrase id="0"> будет основой, из которой далее будет все
вытекать. Она должна обязательно присутствовать и в вашем диалоге.
<next>1</next> - это ссылка на вытекающую фразу <phrase id="1">:
<phrase id="1"> <text>escape_trader_talk_info_1</text> <next>100</next> <next>99</next> <next>9995</next> </phrase>
В свою очередь <next>100</next>,
<next>99</next>, <next>9995</next> это ссылки
на фразы веточки растущие из фразы <phrase id="1">. 3) Текст каждой фразы содержится в третьем файле. Для диалога
с Сидоровичем тексты лежат в файле
gamedata/config/text/rus/stable_dialogs_escape.xml
<string id="escape_trader_talk_info_0"> <text>Есть несколько вопросов.</text> </string> <string id="escape_trader_talk_info_1"> <text>Спрашивай, только я ведь всего не знаю. Сам понимаешь, сижу тут целыми днями, а жизнь - она вся там, снаружи, в Зоне. Могу рассказать о Зоне вообще, а немного могу о ближайших окрестностях, где сам ходил.</text> </string> ...
Эти строки содержат тексты для фраз <phrase id="0"> и <phrase id="1">
Итого диалоги разложены по трем, а то и более файлам.
Да кстати, путь по веткам может быть зацикленным, если того требует диалог. Например так:
<phrase id="0"> <text>...</text> <next>1</next> <next>2</next> </phrase> <phrase id="1"> <text>...</text> <next>11</next> <next>12</next> </phrase> <phrase id="11"> <text>...</text> <next>1</next> - Это возврат к фразе №1 (зацикливание) <next>111</next> </phrase>
Практика
Добавим в диалог с Сидоровичем ветку своего собственного изготовления.Например такую:
Меченый: Сидрыч, а чего это у тебя зеленые человечки, что по столу бегают, такие худые? Сидорович: Чего?! Меченый: Ты их совсем, совсем не кормишь? Сидорович: В следующий раз, как пойдешь в зону, бери-ка вместо водяры побольше антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился... Шутник.
Для этого:
1) В файле gamedata/config/gameplay/character_desc_escape.xml в
конце списка веток для trader припишем свою ветку с произвольным
названием. Это будет, например,
<actor_dialog>escape_trader_letat_gusi</actor_dialog>.
Т.е у нас получится так:
<specific_character id="escape_trader" no_random = "1"> ... <start_dialog>escape_trader_start_dialog</start_dialog> <actor_dialog>escape_trader_talk_info</actor_dialog> <actor_dialog>escape_trader_jobs</actor_dialog> <actor_dialog>tm_trader_dialog</actor_dialog> <actor_dialog>tm_trader_reward</actor_dialog> <actor_dialog>escape_trader_done_blockpost_box</actor_dialog> <actor_dialog>escape_trader_letat_gusi</actor_dialog> </specific_character> …
Записываем изменения, с этим файлом пока всё.
2) Теперь берем файл gamedata/config/gameplay/dialogs_escape.xml
Диалогу:
Меченый: Сидрыч а почему это у тебя зеленые человечки, что по столу бегают, такие худые? Сидорович: Чего?!! Меченый: Ты их совсем, совсем не кормишь? Сидорович: В следующий раз, как пойдешь в зону, бери-ка вместо водяры побольше антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился... Шутник.
Будет соответствовать такая структура:
<phrase id="0"> <text>escape_trader_letat_gusi_0</text> <next>1</next> </phrase> <phrase id="1"> <text>escape_trader_letat_gusi_1</text> <next>2</next> </phrase> <phrase id="2"> <text> escape_trader_letat_gusi_2</text> <next>3</next> </phrase> <phrase id="3"> <text> escape_trader_letat_gusi_3</text> </phrase>
Условия наличия ветки в диалоге можно взять из ветки <dialog id="escape_trader_talk_info">.
Т.е берем условия
<precondition>escape_dialog.trader_has_talk_info_wr</precondition>
и <has_info>tutorial_end</has_info>.
Можно было, конечно, прописать в скрипте еще одно условие для ветки,
чтобы она появилась только один раз, а потом больше не возникала. Но об
этом как-нибудь позже.
В итоге у нас получилась такая структура:
<dialog id="escape_trader_letat_gusi"> <precondition>escape_dialog.trader_has_talk_info_wr</precondition> <has_info>tutorial_end</has_info> <phrase_list> <phrase id="0"> <text>escape_trader_letat_gusi_0</text> <next>1</next> </phrase> <phrase id="1"> <text>escape_trader_letat_gusi_1</text> <next>2</next> </phrase> <phrase id="2"> <text> escape_trader_letat_gusi_2</text> <next>3</next> </phrase> <phrase id="3"> <text> escape_trader_letat_gusi_3</text> </phrase> </phrase_list> </dialog>
Её нужно вставить в любом месте между dialog id'ами других веток в
файле dialogs_escape.xml. Главное - не промахнутся и засунуть именно
между, а не внутрь одного из dialog id.
После сохранения внесенных изменений с файлом dialogs_escape.xml все.
3) Теперь вбиваем сами текстовички в файле gamedata/config/text/rus/stable_dialogs_escape.xml
Т.е нам надо в файле stable_dialogs_escape.xml вставить такую конструкцию:
<string id="escape_trader_letat_gusi_0"> <text>Сидрыч, а чего это у тебя зеленые человечки, что по столу бегают, такие худые?</text> </string> <string id="escape_trader_letat_gusi_1"> <text>Чего?!</text> </string> <string id="escape_trader_letat_gusi_2"> <text>Ты их совсем, совсем не кормишь?</text> </string> <string id="escape_trader_letat_gusi_3"> <text>В следующий раз, как пойдешь в зону, бери-ка вместо водяры побольше антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился... Шутник.</text> </string>
В любом месте между уже существующими string id.
После сохранения изменений, у нас все готово. Можно загружать игру и смотреть что получилось.
Дополнительно
Внимание! После патча 1.002 данный урок перестал работать. Причина - со вторым патчем несовместимо это условие:
<precondition>escape_dialog.trader_has_talk_info_wr</precondition>
Дело в том, что во втором патче из файла escape_dialog.script была удалена функция:
function trader_has_talk_info_wr( trader, actor ) return true end
Можно либо записать эту функцию обратно в escape_dialog.script, либо
использовать другие более-менее подходящие условия, например:
<precondition>escape_dialog.trader_alredy_give_job</precondition>
Всё. Мы научились писать простые диалоги.
Авторы
Статья создана:
|