Версия 12:16, 25 июля 2007 (править) BAC9-FLCL (Обсуждение | вклад)
← К предыдущему изменению |
Текущая версия (12:17, 25 июля 2007) (править) (отменить) BAC9-FLCL (Обсуждение | вклад) |
Строка 1: |
Строка 1: |
- | __TOC__ | + | #REDIRECT [[Создание диалогов]] |
- | | + | |
- | ==Создание новых веток диалогов== | + | |
- | ===Теория=== | + | |
- | | + | |
- | 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 | + | |
- | | + | |
- | <pre> <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></pre> | + | |
- | | + | |
- | В свою очередь каждая ветка диалога также может ветвится. | + | |
- | | + | |
- | 2) Ветвление диалогов прописывается уже в других файлах. | + | |
- | | + | |
- | Например, ветвление диалога с Сидоровичем содержится в файле gamedata/config/gameplay/dialogs_escape.xml | + | |
- | Возьмем оттуда, например, ветвление escape_trader_jobs. | + | |
- | | + | |
- | Ветвление имеет довольно большие масштабы, поэтому приведу только часть: | + | |
- | | + | |
- | <pre><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></pre> | + | |
- | | + | |
- | Здесь <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 | + | |
- | | + | |
- | Функция выглядит так: | + | |
- | | + | |
- | <pre>function trader_has_talk_info_wr( trader, actor ) | + | |
- | return true | + | |
- | end</pre> | + | |
- | | + | |
- | То есть, судя по его структуре, <precondition>escape_dialog.trader_has_talk_info_wr</precondition> выполняется всегда, т.к. функция всегда возвращает истину и <dialog id="escape_trader_talk_info"> пропускается в списк реплик. | + | |
- | | + | |
- | Но для конкретной ветки может быть несколько precondition и других условий. | + | |
- | | + | |
- | Далее, <has_info>tutorial_end</has_info> - это еще одна проверка, на этот раз на наличие у игрока так называемых infoportions, выдаваемы в процессе ключевых диалогов. В данном случае это проверка на то, закончена ли определенная стадия туториала, или нет. Т.е. ветка допустится в список реплик если стадия туториала закончена. | + | |
- | | + | |
- | Более детально мы это разберем в конце статьи. | + | |
- | | + | |
- | А далее идут конкретные фразы, содержащие ссылки на вытекающие фразы, например: | + | |
- | | + | |
- | <pre><phrase id="0"> | + | |
- | <text>escape_trader_talk_info_0</text> | + | |
- | <next>1</next> | + | |
- | </phrase></pre> | + | |
- | | + | |
- | Это основа ветки escape_trader_talk_info. | + | |
- | | + | |
- | '''Важно!''' В любой основной ветке любого диалога фраза <phrase id="0"> будет основой, из которой далее будет все вытекать. Она должна обязательно присутствовать и в вашем диалоге. | + | |
- | | + | |
- | <next>1</next> - это ссылка на вытекающую фразу <phrase id="1">: | + | |
- | | + | |
- | <pre> <phrase id="1"> | + | |
- | <text>escape_trader_talk_info_1</text> | + | |
- | <next>100</next> | + | |
- | <next>99</next> | + | |
- | <next>9995</next> | + | |
- | </phrase></pre> | + | |
- | | + | |
- | В свою очередь <next>100</next>, <next>99</next>, <next>9995</next> это ссылки на фразы веточки растущие из фразы <phrase id="1">. | + | |
- | | + | |
- | 3) Текст каждой фразы содержится в третьем файле. Для диалога с Сидоровичем тексты лежат в файле gamedata/config/text/rus/stable_dialogs_escape.xml | + | |
- | | + | |
- | <pre> <string id="escape_trader_talk_info_0"> | + | |
- | <text>Есть несколько вопросов.</text> | + | |
- | </string> | + | |
- | <string id="escape_trader_talk_info_1"> | + | |
- | <text>Спрашивай, только я ведь всего не знаю. Сам понимаешь, сижу тут целыми днями, а жизнь - она вся там, | + | |
- | снаружи, в Зоне. Могу рассказать о Зоне вообще, а немного могу о ближайших окрестностях, где сам ходил.</text> | + | |
- | </string> | + | |
- | ...</pre> | + | |
- | | + | |
- | Эти строки содержат тексты для фраз <phrase id="0"> и <phrase id="1"> | + | |
- | | + | |
- | Итого диалоги разложены по трем, а то и более файлам. | + | |
- | | + | |
- | Да кстати, путь по веткам может быть зацикленным, если того требует диалог. Например так: | + | |
- | | + | |
- | <pre><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></pre> | + | |
- | | + | |
- | ===Практика=== | + | |
- | Добавим в диалог с Сидоровичем ветку своего собственного изготовления.Например такую: | + | |
- | | + | |
- | <pre> | + | |
- | Меченый: Сидрыч, а чего это у тебя зеленые человечки, что по столу бегают, такие худые? | + | |
- | Сидорович: Чего?! | + | |
- | Меченый: Ты их совсем, совсем не кормишь? | + | |
- | Сидорович: В следующий раз, как пойдешь в зону, бери-ка вместо водяры побольше антирада. А то мало что таким перегаром дышишь, уже | + | |
- | до зеленых человечков долечился... Шутник.</pre> | + | |
- | | + | |
- | Для этого: | + | |
- | | + | |
- | 1) В файле gamedata/config/gameplay/character_desc_escape.xml в конце списка веток для trader припишем свою ветку с произвольным названием. Это будет, например, <actor_dialog>escape_trader_letat_gusi</actor_dialog>. | + | |
- | | + | |
- | Т.е у нас получится так: | + | |
- | | + | |
- | <pre><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> | + | |
- | …</pre> | + | |
- | Записываем изменения, с этим файлом пока всё. | + | |
- | | + | |
- | 2) Теперь берем файл gamedata/config/gameplay/dialogs_escape.xml | + | |
- | | + | |
- | Диалогу: | + | |
- | | + | |
- | <pre>Меченый: Сидрыч а почему это у тебя зеленые человечки, что по столу бегают, такие худые? | + | |
- | Сидорович: Чего?!! | + | |
- | Меченый: Ты их совсем, совсем не кормишь? | + | |
- | Сидорович: В следующий раз, как пойдешь в зону, бери-ка вместо водяры побольше антирада. А то мало что таким перегаром дышишь, уже | + | |
- | до зеленых человечков долечился… Шутник.</pre> | + | |
- | | + | |
- | Будет соответствовать такая структура: | + | |
- | | + | |
- | <pre><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></pre> | + | |
- | | + | |
- | Условия наличия ветки в диалоге можно взять из ветки <dialog id="escape_trader_talk_info">. | + | |
- | | + | |
- | Т.е берем условия <precondition>escape_dialog.trader_has_talk_info_wr</precondition> и <has_info>tutorial_end</has_info>. | + | |
- | Можно было, конечно, прописать в скрипте еще одно условие для ветки, чтобы она появилась только один раз, а потом больше не возникала. Но об этом как-нибудь позже. | + | |
- | | + | |
- | В итоге у нас получилась такая структура: | + | |
- | | + | |
- | <pre><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></pre> | + | |
- | | + | |
- | Её нужно вставить в любом месте между dialog id'ами других веток в файле dialogs_escape.xml. Главное - не промахнутся и засунуть именно между, а не внутрь одного из dialog id. | + | |
- | | + | |
- | После сохранения внесенных изменений с файлом dialogs_escape.xml все. | + | |
- | | + | |
- | 3) Теперь вбиваем сами текстовички в файле gamedata/config/text/rus/stable_dialogs_escape.xml | + | |
- | | + | |
- | Т.е нам надо в файле stable_dialogs_escape.xml вставить такую конструкцию: | + | |
- | | + | |
- | <pre> <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></pre> | + | |
- | | + | |
- | | + | |
- | В любом месте между уже существующими string id. | + | |
- | После сохранения изменений, у нас все готово. Можно загружать игру и смотреть что получилось. | + | |
- | | + | |
- | ===Дополнительно=== | + | |
- | | + | |
- | '''Внимание!''' После патча 1.002 данный урок перестал работать. Причина - со вторым патчем несовместимо это условие: | + | |
- | | + | |
- | <pre><precondition>escape_dialog.trader_has_talk_info_wr</precondition></pre> | + | |
- | | + | |
- | Дело в том, что во втором патче из файла escape_dialog.script была удалена функция: | + | |
- | | + | |
- | <pre>function trader_has_talk_info_wr( trader, actor ) | + | |
- | return true | + | |
- | end</pre> | + | |
- | | + | |
- | Можно либо записать эту функцию обратно в escape_dialog.script, либо использовать другие более-менее подходящие условия, например: | + | |
- | | + | |
- | <pre><precondition>escape_dialog.trader_alredy_give_job</precondition></pre> | + | |
- | | + | |
- | Всё. Мы научились писать простые диалоги. | + | |
- | | + | |
- | ==Авторы== | + | |
- | | + | |
- | Статья создана: | + | |
- | | + | |
- | * [[Участник:BAC9-FLCL|BAC9-FLCL]] | + | |
- | * [[Участник:Keha|Keha]] | + | |
- | | + | |
- | [[Категория:Статьи участников]] | + | |