SoC. Создание диалогов — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
Eragorn (обсуждение | вклад) м (→Авторы) |
|||
(не показаны 8 промежуточные версии 6 участников) | |||
Строка 2: | Строка 2: | ||
===Теория=== | ===Теория=== | ||
− | 1) Списки веток диалогов содержатся в файлах вида gamedata/config/gameplay/character_desc_*.xml | + | 1) Списки веток диалогов содержатся в файлах вида '''gamedata/config/gameplay/character_desc_*.xml''' |
Это, например: | Это, например: | ||
− | character_desc_zombied.xml | + | '''character_desc_zombied.xml |
character_desc_stalker.xml | character_desc_stalker.xml | ||
− | character_desc_garbage.xml | + | character_desc_garbage.xml''' |
... | ... | ||
− | Файлы character_desc_*.xml можно сравнить со стволом дерева диалогов. | + | Файлы '''character_desc_*.xml''' можно сравнить со стволом дерева диалогов. |
В них перечисляется названия прикрепляемых веток диалогов | В них перечисляется названия прикрепляемых веток диалогов | ||
− | Например вот список веток диалога с Сидоровичем взятый из файла character_desc_escape.xml | + | Например вот список веток диалога с Сидоровичем взятый из файла '''character_desc_escape.xml''' |
− | < | + | <xml> <start_dialog>escape_trader_start_dialog</start_dialog> |
<actor_dialog>escape_trader_talk_info</actor_dialog> | <actor_dialog>escape_trader_talk_info</actor_dialog> | ||
<actor_dialog>escape_trader_jobs</actor_dialog> | <actor_dialog>escape_trader_jobs</actor_dialog> | ||
<actor_dialog>tm_trader_dialog</actor_dialog> | <actor_dialog>tm_trader_dialog</actor_dialog> | ||
<actor_dialog>tm_trader_reward</actor_dialog> | <actor_dialog>tm_trader_reward</actor_dialog> | ||
− | <actor_dialog>escape_trader_done_blockpost_box</actor_dialog></ | + | <actor_dialog>escape_trader_done_blockpost_box</actor_dialog></xml> |
В свою очередь каждая ветка диалога также может ветвится. | В свою очередь каждая ветка диалога также может ветвится. | ||
Строка 27: | Строка 27: | ||
2) Ветвление диалогов прописывается уже в других файлах. | 2) Ветвление диалогов прописывается уже в других файлах. | ||
− | Например, ветвление диалога с Сидоровичем содержится в файле gamedata/config/gameplay/dialogs_escape.xml | + | Например, ветвление диалога с Сидоровичем содержится в файле '''gamedata/config/gameplay/dialogs_escape.xml''' |
− | Возьмем оттуда, например, ветвление escape_trader_jobs. | + | Возьмем оттуда, например, ветвление '''escape_trader_jobs'''. |
Ветвление имеет довольно большие масштабы, поэтому приведу только часть: | Ветвление имеет довольно большие масштабы, поэтому приведу только часть: | ||
− | < | + | <xml><dialog id="escape_trader_talk_info"> |
<precondition>escape_dialog.trader_has_talk_info_wr</precondition> | <precondition>escape_dialog.trader_has_talk_info_wr</precondition> | ||
<has_info>tutorial_end</has_info> | <has_info>tutorial_end</has_info> | ||
Строка 48: | Строка 48: | ||
</phrase> | </phrase> | ||
</phrase_list> | </phrase_list> | ||
− | </dialog></ | + | </dialog></xml> |
− | Здесь <precondition>…</precondition> - это проверка выполнения условия. Ветка появится в диалоге, только если условие выполняется. | + | Здесь ''<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 | + | Конкретно: |
+ | <code><precondition>escape_dialog.trader_has_talk_info_wr</precondition></code> | ||
+ | из ветки ''escape_trader_talk_info'' - это обращение к функции ''trader_has_talk_info_wr'', находящейся в файле скрипте '''gamedata/scripts/escape_dialog.script'''. | ||
Функция выглядит так: | Функция выглядит так: | ||
− | < | + | <lua>function trader_has_talk_info_wr( trader, actor ) |
return true | return true | ||
− | end</ | + | end</lua> |
− | То есть, судя по его структуре, <precondition>escape_dialog.trader_has_talk_info_wr</precondition> выполняется всегда, т.к. функция всегда возвращает истину и <dialog id="escape_trader_talk_info"> пропускается в списк реплик. | + | То есть, судя по его структуре, ''<precondition>escape_dialog.trader_has_talk_info_wr</precondition>'' |
+ | выполняется всегда, т.к. функция всегда возвращает истину и ''<dialog id="escape_trader_talk_info">'' пропускается в списк реплик. | ||
Но для конкретной ветки может быть несколько precondition и других условий. | Но для конкретной ветки может быть несколько precondition и других условий. | ||
− | Далее, <has_info>tutorial_end</has_info> - это еще одна проверка, на этот раз на наличие у игрока так называемых infoportions, выдаваемы в процессе ключевых диалогов. В данном случае это проверка на то, закончена ли определенная стадия туториала, или нет. Т.е. ветка допустится в список реплик если стадия туториала закончена. | + | Далее, ''<has_info>tutorial_end</has_info>'' - это еще одна проверка, на этот раз на наличие у игрока так называемых infoportions, выдаваемы в процессе ключевых диалогов. В данном случае это проверка на то, закончена ли определенная стадия туториала, или нет. Т.е. ветка допустится в список реплик если стадия туториала закончена. |
Более детально мы это разберем в конце статьи. | Более детально мы это разберем в конце статьи. | ||
Строка 69: | Строка 72: | ||
А далее идут конкретные фразы, содержащие ссылки на вытекающие фразы, например: | А далее идут конкретные фразы, содержащие ссылки на вытекающие фразы, например: | ||
− | < | + | <xml><phrase id="0"> |
<text>escape_trader_talk_info_0</text> | <text>escape_trader_talk_info_0</text> | ||
<next>1</next> | <next>1</next> | ||
− | </phrase></ | + | </phrase></xml> |
− | Это основа ветки escape_trader_talk_info. | + | Это основа ветки ''escape_trader_talk_info''. |
− | '''Важно!''' В любой основной ветке любого диалога фраза <phrase id="0"> будет основой, из которой далее будет все вытекать. Она должна обязательно присутствовать и в вашем диалоге. | + | '''Важно!''' В любой основной ветке любого диалога фраза ''<phrase id="0">'' будет основой, из которой далее будет все вытекать. Она должна обязательно присутствовать и в вашем диалоге. |
− | <next>1</next> - это ссылка на вытекающую фразу <phrase id="1">: | + | ''<next>1</next>'' - это ссылка на вытекающую фразу ''<phrase id="1">'': |
− | < | + | <xml> <phrase id="1"> |
<text>escape_trader_talk_info_1</text> | <text>escape_trader_talk_info_1</text> | ||
<next>100</next> | <next>100</next> | ||
<next>99</next> | <next>99</next> | ||
<next>9995</next> | <next>9995</next> | ||
− | </phrase></ | + | </phrase></xml> |
− | В свою очередь <next>100</next>, <next>99</next>, <next>9995</next> это ссылки на фразы веточки растущие из фразы <phrase id="1">. | + | В свою очередь ''<next>100</next>, <next>99</next>, <next>9995</next>'' - это ссылки на фразы веточки растущие из фразы ''<phrase id="1">''. |
− | 3) Текст каждой фразы содержится в третьем файле. Для диалога с Сидоровичем тексты лежат в файле gamedata/config/text/rus/stable_dialogs_escape.xml | + | 3) Текст каждой фразы содержится в третьем файле. Для диалога с Сидоровичем тексты лежат в файле '''gamedata/config/text/rus/stable_dialogs_escape.xml'''. Вот сама текстовая составляющая диалога: |
− | < | + | <xml> <string id="escape_trader_talk_info_0"> |
<text>Есть несколько вопросов.</text> | <text>Есть несколько вопросов.</text> | ||
</string> | </string> | ||
Строка 99: | Строка 102: | ||
могу о ближайших окрестностях, где сам ходил.</text> | могу о ближайших окрестностях, где сам ходил.</text> | ||
</string> | </string> | ||
− | ...</ | + | ...</xml> |
Эти строки содержат тексты для фраз <phrase id="0"> и <phrase id="1"> | Эти строки содержат тексты для фраз <phrase id="0"> и <phrase id="1"> | ||
Строка 107: | Строка 110: | ||
Да кстати, путь по веткам может быть зацикленным, если того требует диалог. Например так: | Да кстати, путь по веткам может быть зацикленным, если того требует диалог. Например так: | ||
− | < | + | <xml><phrase id="0"> |
<text>...</text> | <text>...</text> | ||
<next>1</next> | <next>1</next> | ||
Строка 121: | Строка 124: | ||
<next>1</next> - Это возврат к фразе №1 (зацикливание) | <next>1</next> - Это возврат к фразе №1 (зацикливание) | ||
<next>111</next> | <next>111</next> | ||
− | </phrase></ | + | </phrase></xml> |
===Практика=== | ===Практика=== | ||
Строка 135: | Строка 138: | ||
Для этого: | Для этого: | ||
− | 1) В файле gamedata/config/gameplay/character_desc_escape.xml в конце списка веток для trader припишем свою ветку с произвольным названием. Это будет, например, <actor_dialog>escape_trader_letat_gusi</actor_dialog>. | + | 1) В файле '''gamedata/config/gameplay/character_desc_escape.xml''' в конце списка веток для ''trader'' припишем свою ветку с произвольным названием. Это будет, например, ''<actor_dialog>escape_trader_letat_gusi</actor_dialog>''. |
Т.е у нас получится так: | Т.е у нас получится так: | ||
− | < | + | <xml><specific_character id="escape_trader" no_random = "1"> |
... | ... | ||
<start_dialog>escape_trader_start_dialog</start_dialog> | <start_dialog>escape_trader_start_dialog</start_dialog> | ||
Строка 149: | Строка 152: | ||
<actor_dialog>escape_trader_letat_gusi</actor_dialog> | <actor_dialog>escape_trader_letat_gusi</actor_dialog> | ||
</specific_character> | </specific_character> | ||
− | …</ | + | …</xml> |
Записываем изменения, с этим файлом пока всё. | Записываем изменения, с этим файлом пока всё. | ||
− | 2) Теперь берем файл gamedata/config/gameplay/dialogs_escape.xml | + | 2) Теперь берем файл '''gamedata/config/gameplay/dialogs_escape.xml''' |
Диалогу: | Диалогу: | ||
Строка 164: | Строка 167: | ||
Будет соответствовать такая структура: | Будет соответствовать такая структура: | ||
− | < | + | <xml><phrase id="0"> |
<text>escape_trader_letat_gusi_0</text> | <text>escape_trader_letat_gusi_0</text> | ||
<next>1</next> | <next>1</next> | ||
Строка 178: | Строка 181: | ||
<phrase id="3"> | <phrase id="3"> | ||
<text> escape_trader_letat_gusi_3</text> | <text> escape_trader_letat_gusi_3</text> | ||
− | </phrase></ | + | </phrase></xml> |
Условия наличия ветки в диалоге можно взять из ветки <dialog id="escape_trader_talk_info">. | Условия наличия ветки в диалоге можно взять из ветки <dialog id="escape_trader_talk_info">. | ||
− | Т.е берем условия <precondition>escape_dialog.trader_has_talk_info_wr</precondition> и <has_info>tutorial_end</has_info>. | + | Т.е берем условия ''<precondition>escape_dialog.trader_has_talk_info_wr</precondition>'' и ''<has_info>tutorial_end</has_info>''. |
Можно было, конечно, прописать в скрипте еще одно условие для ветки, чтобы она появилась только один раз, а потом больше не возникала. Но об этом как-нибудь позже. | Можно было, конечно, прописать в скрипте еще одно условие для ветки, чтобы она появилась только один раз, а потом больше не возникала. Но об этом как-нибудь позже. | ||
В итоге у нас получилась такая структура: | В итоге у нас получилась такая структура: | ||
− | < | + | <xml><dialog id="escape_trader_letat_gusi"> |
<precondition>escape_dialog.trader_has_talk_info_wr</precondition> | <precondition>escape_dialog.trader_has_talk_info_wr</precondition> | ||
<has_info>tutorial_end</has_info> | <has_info>tutorial_end</has_info> | ||
Строка 207: | Строка 210: | ||
</phrase> | </phrase> | ||
</phrase_list> | </phrase_list> | ||
− | </dialog></ | + | </dialog></xml> |
− | Её нужно вставить в любом месте между dialog id'ами других веток в файле dialogs_escape.xml. Главное - не промахнутся и засунуть именно между, а не внутрь одного из dialog id. | + | Её нужно вставить в любом месте между dialog id'ами других веток в файле '''dialogs_escape.xml'''. Главное - не промахнутся и засунуть именно между, а не внутрь одного из dialog id. |
− | После сохранения внесенных изменений с файлом dialogs_escape.xml все. | + | После сохранения внесенных изменений с файлом '''dialogs_escape.xml''' все. |
− | 3) Теперь вбиваем сами текстовички в файле gamedata/config/text/rus/stable_dialogs_escape.xml | + | 3) Теперь вбиваем сами текстовички в файле '''gamedata/config/text/rus/stable_dialogs_escape.xml''' |
− | Т.е нам надо в файле stable_dialogs_escape.xml вставить такую конструкцию: | + | Т.е нам надо в файле '''stable_dialogs_escape.xml''' вставить такую конструкцию: |
− | < | + | <xml> <string id="escape_trader_letat_gusi_0"> |
<text>Сидрыч, а чего это у тебя зеленые человечки, что по столу бегают, такие худые?</text> | <text>Сидрыч, а чего это у тебя зеленые человечки, что по столу бегают, такие худые?</text> | ||
</string> | </string> | ||
Строка 230: | Строка 233: | ||
антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился... | антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился... | ||
Шутник.</text> | Шутник.</text> | ||
− | </string></ | + | </string></xml> |
В любом месте между уже существующими string id. | В любом месте между уже существующими string id. | ||
После сохранения изменений, у нас все готово. Можно загружать игру и смотреть что получилось. | После сохранения изменений, у нас все готово. Можно загружать игру и смотреть что получилось. | ||
+ | <!!!ВНИМАНИЕ!!!> | ||
+ | Если вы сделали всё правильно,но при обращении к НПЦ вылетает с таким логом | ||
+ | |||
+ | <pre>Expression : no_assert | ||
+ | Function : CXML_IdToIndex<class CInfoPortion>::GetById | ||
+ | File : e:\stalker\patch_1_0004\xr_3da\xrgame\xml_str_id_loader.h | ||
+ | Line : 112 | ||
+ | Description : item not found, id | ||
+ | Arguments : escape_trader_letat_gusi</pre> | ||
+ | |||
+ | Создайте свой файл и назовите его как душе угодно,пример: '''letat_gusi_my_test.xml''' | ||
+ | Впишите туда: | ||
+ | <xml><?xml version="1.0" encoding="windows-1251" standalone="yes" ?> | ||
+ | <game_dialogs> | ||
+ | <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> | ||
+ | </game_dialogs></xml> | ||
+ | Сохраните.Далее в '''gamedata\config\system.ltx''' | ||
+ | добавьть в секцию [dialogs] название файла,который мы создали.Пример: | ||
+ | <pre>[dialogs] | ||
+ | files = ..., letat_gusi_my_test ,где ... список других файлов,letat_gusi_my_test - название вашего,нового файла.</pre> | ||
===Дополнительно=== | ===Дополнительно=== | ||
Строка 240: | Строка 283: | ||
'''Внимание!''' После патча 1.002 данный урок перестал работать. Причина - со вторым патчем несовместимо это условие: | '''Внимание!''' После патча 1.002 данный урок перестал работать. Причина - со вторым патчем несовместимо это условие: | ||
− | < | + | <xml><precondition>escape_dialog.trader_has_talk_info_wr</precondition></xml> |
Дело в том, что во втором патче из файла escape_dialog.script была удалена функция: | Дело в том, что во втором патче из файла escape_dialog.script была удалена функция: | ||
− | < | + | <lua>function trader_has_talk_info_wr( trader, actor ) |
return true | return true | ||
− | end</ | + | end</lua> |
Можно либо записать эту функцию обратно в escape_dialog.script, либо использовать другие более-менее подходящие условия, например: | Можно либо записать эту функцию обратно в escape_dialog.script, либо использовать другие более-менее подходящие условия, например: | ||
− | < | + | <xml><precondition>escape_dialog.trader_alredy_give_job</precondition></xml> |
+ | |||
+ | Так-же при построении диалогов в версии 1.004 стоит учитывать длину названия диалога, а также имен ссылок на текстовое содержание. | ||
+ | Если превысить порог (не проверял количество символом в строке) допустимых значений диалог по росту не будет отображаться целиком | ||
+ | а лиш та часть которую он может отобразить. При попытке продолжить диалог он попросту не выводится что приводит к невозможности его завершения. | ||
+ | Данная проблема была замечена при прохождении мода Р.М.А. 1.0.1 на 1.004 патче что на 1.006 с этим не возникало проблем | ||
+ | Каких либо вылетов в этом случае не замечалось... | ||
+ | |||
Всё. Мы научились писать простые диалоги. | Всё. Мы научились писать простые диалоги. | ||
Строка 260: | Строка 310: | ||
* [[Участник:BAC9-FLCL|BAC9-FLCL]] | * [[Участник:BAC9-FLCL|BAC9-FLCL]] | ||
* [[Участник:Keha|Keha]] | * [[Участник:Keha|Keha]] | ||
+ | |||
+ | Статью дополнил: | ||
+ | * джЭдай | ||
+ | * Eragorn | ||
+ | [[Категория:Конфигурационные_файлы]] |
Текущая версия на 05:06, 26 сентября 2018
Создание новых веток диалогов
Теория
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.
После сохранения изменений, у нас все готово. Можно загружать игру и смотреть что получилось.
<!!!ВНИМАНИЕ!!!>
Если вы сделали всё правильно,но при обращении к НПЦ вылетает с таким логом
Expression : no_assert Function : CXML_IdToIndex<class CInfoPortion>::GetById File : e:\stalker\patch_1_0004\xr_3da\xrgame\xml_str_id_loader.h Line : 112 Description : item not found, id Arguments : escape_trader_letat_gusi
Создайте свой файл и назовите его как душе угодно,пример: letat_gusi_my_test.xml Впишите туда:
<?xml version="1.0" encoding="windows-1251" standalone="yes" ?> <game_dialogs> <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> </game_dialogs>
Сохраните.Далее в gamedata\config\system.ltx добавьть в секцию [dialogs] название файла,который мы создали.Пример:
[dialogs] files = ..., letat_gusi_my_test ,где ... список других файлов,letat_gusi_my_test - название вашего,нового файла.
Дополнительно
Внимание! После патча 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>
Так-же при построении диалогов в версии 1.004 стоит учитывать длину названия диалога, а также имен ссылок на текстовое содержание. Если превысить порог (не проверял количество символом в строке) допустимых значений диалог по росту не будет отображаться целиком а лиш та часть которую он может отобразить. При попытке продолжить диалог он попросту не выводится что приводит к невозможности его завершения. Данная проблема была замечена при прохождении мода Р.М.А. 1.0.1 на 1.004 патче что на 1.006 с этим не возникало проблем Каких либо вылетов в этом случае не замечалось...
Всё. Мы научились писать простые диалоги.
Авторы
Статья создана:
Статью дополнил:
- джЭдай
- Eragorn