SoC. Создание диалогов — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

SoC. Создание диалогов — различия между версиями

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
м Создание диалогов» переименована в «SoC. Создание диалогов»: prefix)
(оформление, орфография)
Строка 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'''
  
<pre> <start_dialog>escape_trader_start_dialog</start_dialog>
+
<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></pre>
+
<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'''.
  
 
Ветвление имеет довольно большие масштабы, поэтому приведу только часть:
 
Ветвление имеет довольно большие масштабы, поэтому приведу только часть:
Строка 50: Строка 50:
 
</dialog></xml>
 
</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'''.
  
 
Функция выглядит так:
 
Функция выглядит так:
  
<pre>function trader_has_talk_info_wr( trader, actor )
+
<lua>function trader_has_talk_info_wr( trader, actor )
 
return true
 
return true
end</pre>
+
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, выдаваемы в процессе ключевых диалогов. В данном случае это проверка на то, закончена ли определенная стадия туториала, или нет. Т.е. ветка допустится в список реплик если стадия туториала закончена.
  
 
Более детально мы это разберем в конце статьи.
 
Более детально мы это разберем в конце статьи.
Строка 74: Строка 77:
 
</phrase></xml>
 
</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">
 
<xml>      <phrase id="1">
Строка 87: Строка 90:
 
         </phrase></xml>
 
         </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">
 
<xml> <string id="escape_trader_talk_info_0">
Строка 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>''.
  
 
Т.е у нас получится так:
 
Т.е у нас получится так:
Строка 152: Строка 155:
 
Записываем изменения, с этим файлом пока всё.
 
Записываем изменения, с этим файлом пока всё.
  
2) Теперь берем файл gamedata/config/gameplay/dialogs_escape.xml
+
2) Теперь берем файл '''gamedata/config/gameplay/dialogs_escape.xml'''
  
 
Диалогу:
 
Диалогу:
Строка 182: Строка 185:
 
Условия наличия ветки в диалоге можно взять из ветки <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>''.
 
Можно было, конечно, прописать в скрипте еще одно условие для ветки, чтобы она появилась только один раз, а потом больше не возникала. Но об этом как-нибудь позже.
 
Можно было, конечно, прописать в скрипте еще одно условие для ветки, чтобы она появилась только один раз, а потом больше не возникала. Но об этом как-нибудь позже.
  
Строка 209: Строка 212:
 
   </dialog></xml>
 
   </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">
 
<xml> <string id="escape_trader_letat_gusi_0">
Строка 245: Строка 248:
 
Arguments : escape_trader_letat_gusi</pre>
 
Arguments : escape_trader_letat_gusi</pre>
  
Создайте свой файл и назовите его как душе угодно,пример: letat_gusi_my_test.xml
+
Создайте свой файл и назовите его как душе угодно,пример: '''letat_gusi_my_test.xml'''
 
Впишите туда:  
 
Впишите туда:  
<pre><?xml version="1.0" encoding="windows-1251" standalone="yes" ?>
+
<xml><?xml version="1.0" encoding="windows-1251" standalone="yes" ?>
 
<game_dialogs>
 
<game_dialogs>
<xml><dialog id="escape_trader_letat_gusi">
+
    <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>
Строка 270: Строка 273:
 
         </phrase_list>
 
         </phrase_list>
 
     </dialog>
 
     </dialog>
</game_dialogs></pre>
+
</game_dialogs></xml>
Сохраните.Далее в gamedata\config\system.ltx
+
Сохраните.Далее в '''gamedata\config\system.ltx'''
 
добавьть в секцию [dialogs] название файла,который мы создали.Пример:
 
добавьть в секцию [dialogs] название файла,который мы создали.Пример:
 
<pre>[dialogs]
 
<pre>[dialogs]
Строка 284: Строка 287:
 
Дело в том, что во втором патче из файла escape_dialog.script была удалена функция:  
 
Дело в том, что во втором патче из файла escape_dialog.script была удалена функция:  
  
<pre>function trader_has_talk_info_wr( trader, actor )  
+
<lua>function trader_has_talk_info_wr( trader, actor )  
 
   return true  
 
   return true  
end</pre>
+
end</lua>
  
 
Можно либо записать эту функцию обратно в escape_dialog.script, либо использовать другие более-менее подходящие условия, например:
 
Можно либо записать эту функцию обратно в escape_dialog.script, либо использовать другие более-менее подходящие условия, например:

Версия 15:55, 31 июля 2013

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

Теория

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>

Всё. Мы научились писать простые диалоги.

Авторы

Статья создана:

Статью дополнил:

  • джЭдай
Другие места
LANGUAGE