Статистика |
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|
|
Создание новых веток диалогов
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>
Всё.
Мы научились писать простые диалоги.
|
Категория: Все о модостроении. | Добавил: ZARK (21.10.2010)
|
Просмотров: 1504 | Комментарии: 2
| Рейтинг: 0.0/0 |
Всего комментариев: 2 | |
|
|
|
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
|
Наш Банер |
Мы будем очень благодарны если вы разместите нашу кнопку у себя на сайте!
|
|