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

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

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

Перейти к: навигация, поиск
(Дополение от XiaNi)
 
(не показаны 3 промежуточных версий 3 участников)
Строка 4: Строка 4:
 
(Если где то чего то напутал исправляйте, многое писал интуитивно)
 
(Если где то чего то напутал исправляйте, многое писал интуитивно)
  
'''1)''' Списки веток диалогов содержатся в файлах вида gamedata/config/gameplay/character_desc_*.xml  
+
'''1)''' Списки веток диалогов содержатся в файлах вида '''gamedata/config/gameplay/character_desc_*.xml'''
  
 
Это например:  
 
Это например:  
character_desc_zombied.xml
+
<br>'''character_desc_zombied.xml'''
character_desc_stalker.xml
+
<br>'''character_desc_stalker.xml'''
character_desc_garbage.xml
+
<br>'''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>
 
<pre> <start_dialog>escape_trader_start_dialog</start_dialog>
Строка 24: Строка 24:
 
<actor_dialog>escape_trader_done_blockpost_box</actor_dialog></pre>
 
<actor_dialog>escape_trader_done_blockpost_box</actor_dialog></pre>
  
В свою очередь каждая ветка диалога также может ветвится.
+
В свою очередь, каждая ветка диалога также может ветвится.
  
 
'''2)''' Ветвление веток прописывается уже в других файлах.
 
'''2)''' Ветвление веток прописывается уже в других файлах.
Например ветвление веток диалога с Сидоровичем содержится в файле gamedata/config/gameplay/dialogs_escape.xml
+
Например, ветвление веток диалога с Сидоровичем содержится в файле '''gamedata/config/gameplay/dialogs_escape.xml'''
Возьмем оттуда к примеру ветвление ветки escape_trader_jobs
+
Возьмем оттуда, к примеру, ветвление ветки ''escape_trader_jobs''
  
(ветвление веток обычно очень большое поэтому я приведу только часть):
+
(ветвление веток обычно очень большое, поэтому я приведу только часть):
  
<pre><dialog id="escape_trader_talk_info">
+
<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>
Строка 51: Строка 51:
 
             </phrase>
 
             </phrase>
 
         </phrase_list>
 
         </phrase_list>
</dialog></pre>
+
</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
+
Конкретно ''<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 )
+
<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>'' в принципе выполняется всегда, т. к. функция всегда возвращает истbну и ''<dialog id="escape_trader_talk_info">'' пропускается в списке реплик.
Но для конкретной ветки может быть несколько precondition и других условий.
+
Но для конкретной ветки может быть несколько ''precondition'' и других условий.
  
Далее <has_info>tutorial_end</has_info> (если я верно понимаю) это так же своего рода проверка условия. В данном случае проверка на то закончена стадия tutorialа или нет. Т.е ветка допустится в список реплик если стадия tutorialа закончена.
+
Далее.
более детально об этом в конце данной статьи.
+
<br>''<has_info>tutorial_end</has_info>'' - это также своего рода проверка условия. В данном случае проверка на то, закончена стадия ''tutorial'а'' или нет. Т. е. ветка будет допущена в список реплик, если стадия ''tutorial'а'' закончена.
 +
более детально об этом в конце данной статьи. При окончании ''tutorial'а'' выдается инфопорция ''tutorial_end'', которая и является стержнем данной проверки. 
  
 
А далее идут конкретные фразы содержащие ссылки на вытекающие фразы
 
А далее идут конкретные фразы содержащие ссылки на вытекающие фразы
  
 
Фраза:         
 
Фраза:         
<pre><phrase id="0">
+
<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></pre>
+
</phrase></xml>
  
это основа ветки escape_trader_talk_info.  
+
это основа ветки ''escape_trader_talk_inf''o.  
(Вообще как я понял в любой основной ветке любого диалога фраза <phrase id="0"> будет основой из которой далее будет все вытекать)
+
Вообще, в любой основной ветке любого диалога фраза ''<phrase id="0">'' будет основой, из которой далее будет все вытекать.
  
<next>1</next> - это ссылка на вытекающую фразу <phrase id="1">:
+
''<next>1</next>'' - это ссылка на вытекающую фразу ''<phrase id="1">'':
  
<pre>      <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></pre>
+
         </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'''
  
<pre> <string id="escape_trader_talk_info_0">
+
<xml> <string id="escape_trader_talk_info_0">
 
<text>Есть несколько вопросов.</text>
 
<text>Есть несколько вопросов.</text>
 
</string>
 
</string>
 
<string id="escape_trader_talk_info_1">
 
<string id="escape_trader_talk_info_1">
 
<text>Спрашивай, только я ведь всего не знаю. Сам понимаешь, сижу тут целыми днями, а жизнь - она вся там, снаружи, в Зоне. Могу рассказать о Зоне вообще, а немного могу о ближайших окрестностях, где сам ходил.</text>
 
<text>Спрашивай, только я ведь всего не знаю. Сам понимаешь, сижу тут целыми днями, а жизнь - она вся там, снаружи, в Зоне. Могу рассказать о Зоне вообще, а немного могу о ближайших окрестностях, где сам ходил.</text>
</string></pre>
+
</string></xml>
  
Эти строки содержат тексты для фраз <phrase id="0"> и <phrase id="1">
+
Эти строки содержат тексты для фраз ''<phrase id="0">'' и ''<phrase id="1">''
  
 
Итого диалоги разложены по 4 а то и более файлам.
 
Итого диалоги разложены по 4 а то и более файлам.
Строка 105: Строка 106:
 
Да кстати, путь по веткам может быть зацикленным если того требует диалог. Например так:
 
Да кстати, путь по веткам может быть зацикленным если того требует диалог. Например так:
  
<pre><phrase id="0">
+
<xml><phrase id="0">
 
             <text>…</text>
 
             <text>…</text>
 
             <next>1</next>
 
             <next>1</next>
Строка 119: Строка 120:
 
             <next>1</next>  - Это возврат к фразе 1. (зацикливание)   
 
             <next>1</next>  - Это возврат к фразе 1. (зацикливание)   
 
             <next>111</next>
 
             <next>111</next>
  </phrase></pre>
+
  </phrase></xml>
  
 
===Практика:===
 
===Практика:===
Строка 135: Строка 136:
  
 
Т.е у нас получится так
 
Т.е у нас получится так
<pre> …
+
<xml> …
 
<specific_character id="escape_trader" no_random = "1">
 
<specific_character id="escape_trader" no_random = "1">
 
 
Строка 148: Строка 149:
 
                         <actor_dialog>escape_trader_letat_gusi</actor_dialog>
 
                         <actor_dialog>escape_trader_letat_gusi</actor_dialog>
 
</specific_character>
 
</specific_character>
…</pre>
+
…</xml>
Записываем изменения и с файлом character_desc_escape.xml все.
+
Записываем изменения, и с файлом '''character_desc_escape.xml''' уже все.
  
'''2)''' Теперь берем файл gamedata/config/gameplay/dialogs_escape.xml
+
'''2)''' Теперь берем файл '''gamedata/config/gameplay/dialogs_escape.xml'''
  
 
Диалогу:
 
Диалогу:
Строка 160: Строка 161:
 
Сидорович: В следующий раз, как пойдешь в зону, бери-ка  вместо водяры побольше антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился… Шутник.</pre>
 
Сидорович: В следующий раз, как пойдешь в зону, бери-ка  вместо водяры побольше антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился… Шутник.</pre>
  
который мы хотим реализовать будет соответствовать такая структура:
+
который мы хотим реализовать, будет соответствовать такая структура:
  
<pre><phrase id="0">
+
<xml><phrase id="0">
 
             <text>escape_trader_letat_gusi_0</text>
 
             <text>escape_trader_letat_gusi_0</text>
 
             <next>1</next>
 
             <next>1</next>
Строка 176: Строка 177:
 
<phrase id="3">
 
<phrase id="3">
 
             <text> escape_trader_letat_gusi_3</text>
 
             <text> escape_trader_letat_gusi_3</text>
</phrase></pre>
+
</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>
+
Т. е. берем условия   
 +
<code><precondition>escape_dialog.trader_has_talk_info_wr</precondition></code>
 +
и   
 +
<code><has_info>tutorial_end</has_info></code>
 
(Можно было конечно прописать в скрипте еще одно условие для ветки, чтоб она появилась только один раз,  
 
(Можно было конечно прописать в скрипте еще одно условие для ветки, чтоб она появилась только один раз,  
а потом больше не возникала. Но об этом как нибудь позже допишу.)
+
а потом больше не возникала. Но об этом как-нибудь позже допишу.)
  
 
В итоге у нас получилась такая структура:
 
В итоге у нас получилась такая структура:
  
<pre><dialog id="escape_trader_letat_gusi">
+
<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>
Строка 205: Строка 209:
 
                       </phrase>
 
                       </phrase>
 
         </phrase_list>
 
         </phrase_list>
   </dialog></pre>
+
   </dialog></xml>
  
Которую нужно вставить в любом месте между dialog id_шниками других веток в файле dialogs_escape.xml.
+
Ее нужно вставить в любом месте между dialog id_шниками других веток в файле '''dialogs_escape.xml'''.
  
 
Главное не промахнутся и засунуть именно между, а не внутрь одного из dialog id
 
Главное не промахнутся и засунуть именно между, а не внутрь одного из dialog id
Строка 234: Строка 238:
 
</dialog></pre>
 
</dialog></pre>
  
После сохранения внесенных изменений с файлом 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''' вставить такую конструкцию:
  
<pre> <string id="escape_trader_letat_gusi_0">
+
<xml> <string id="escape_trader_letat_gusi_0">
 
<text>Сидрыч а почему это у тебя зеленые человечки, что по столу бегают, такие худые?</text>
 
<text>Сидрыч а почему это у тебя зеленые человечки, что по столу бегают, такие худые?</text>
 
</string>
 
</string>
Строка 252: Строка 256:
 
<string id="escape_trader_letat_gusi_3">
 
<string id="escape_trader_letat_gusi_3">
 
<text>В следующий раз, как пойдешь в зону, бери-ка  вместо водяры побольше антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился… Шутник.</text>
 
<text>В следующий раз, как пойдешь в зону, бери-ка  вместо водяры побольше антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился… Шутник.</text>
</string></pre>
+
</string></xml>
  
 
в любом месте между уже существующими string id  
 
в любом месте между уже существующими string id  
Строка 276: Строка 280:
 
<pre><precondition>escape_dialog.trader_has_talk_info_wr</precondition></pre>
 
<pre><precondition>escape_dialog.trader_has_talk_info_wr</precondition></pre>
  
использование этого условия приведет к вылету  
+
Использование этого условия приведет к вылету  
  
так как со вторым патчем из файла 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.scrip'''t
  
 
либо использовать другие более мение подходящие условия, например:
 
либо использовать другие более мение подходящие условия, например:
Строка 290: Строка 294:
 
<pre><precondition>escape_dialog.trader_alredy_give_job</precondition></pre>
 
<pre><precondition>escape_dialog.trader_alredy_give_job</precondition></pre>
  
добавлено XiaNi: по поводу <precondition> в данном примере.. он тут реально вообще не нужен тем более что возвращает всегда одно и то же... тут уж или реально надо использовать функцию которая хоть чтото проверяет нужное для диалога... а так... диалог и так будет активным если убрать <precondition> (в данном случае это 100%)
+
====Дополение от XiaNi====
 +
По поводу <precondition> в данном примере.. он тут реально вообще не нужен тем более что возвращает всегда одно и то же... тут уж или реально надо использовать функцию которая хоть чтото проверяет нужное для диалога... а так... диалог и так будет активным если убрать <precondition> (в данном случае это 100%)
  
<has_info> и <dont_has_info> это условия на присутствие и соответственно отсутствие у игрока "информации" которая на самом деле всеголишь флажок что пользователь слышал о чемто или видел чтото который выдается:
+
''<has_info>'' и ''<dont_has_info>'' это условия на присутствие и соответственно отсутствие у игрока "информации" которая, на самом деле, всего лишь флажок, что пользователь слышал о чем-то или видел что-то который выдается:
 
1. условиями "логики" прописанной объектам или неписям.
 
1. условиями "логики" прописанной объектам или неписям.
 
2. скриптами
 
2. скриптами
 
3. диалогами через например "<give_info>tutorial_end</give_info>"
 
3. диалогами через например "<give_info>tutorial_end</give_info>"
  
В принципе <has_info> соответствует скриптовому аналогу функции has_alife_info
+
В принципе ''<has_info>'' соответствует скриптовому аналогу функции ''has_alife_info''
так например "<has_info>tutorial_end</has_info>" можно заменить на "<precondition>check_tutor_end</precondition>" и дописать в "escape_dialog.script" строчки :
+
так например ''<has_info>tutorial_end</has_info>'' можно заменить на ''<precondition>escape_dialog.check_tutor_end</precondition>'' и дописать в '''escape_dialog.script''' строчки :
<pre>
+
<lua>
 
function check_tutor_end(actor, npc)
 
function check_tutor_end(actor, npc)
 
if has_alife_info("tutorial_end")
 
if has_alife_info("tutorial_end")
Строка 308: Строка 313:
 
end
 
end
 
end
 
end
</pre>
+
</lua>
в которой мы проверяем есть ли информация tutorial_end у игрока.
+
в которой мы проверяем есть ли информация ''tutorial_end'' у игрока.
 +
 
 +
==Авторы==
 +
 
 +
Статья создана:
  
 +
* [[Участник:BAC9-FLCL|BAC9-FLCL]]
 +
* [[Участник:Keha|Keha]]
 +
* [[Участник:XiaNi|XiaNi]]
 
[[Категория:Конфигурационные_файлы]]
 
[[Категория:Конфигурационные_файлы]]

Текущая версия на 16:24, 3 августа 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> в принципе выполняется всегда, т. к. функция всегда возвращает истbну и <dialog id="escape_trader_talk_info"> пропускается в списке реплик. Но для конкретной ветки может быть несколько precondition и других условий.

Далее.
<has_info>tutorial_end</has_info> - это также своего рода проверка условия. В данном случае проверка на то, закончена стадия tutorial'а или нет. Т. е. ветка будет допущена в список реплик, если стадия tutorial'а закончена. более детально об этом в конце данной статьи. При окончании tutorial'а выдается инфопорция tutorial_end, которая и является стержнем данной проверки.

А далее идут конкретные фразы содержащие ссылки на вытекающие фразы

Фраза:

<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">

Итого диалоги разложены по 4 а то и более файлам.

Да кстати, путь по веткам может быть зацикленным если того требует диалог. Например так:

<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>

Записываем изменения, и с файлом character_desc_escape.xml уже все.

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

Все что находится между тегами <dialog id="***"> и </dialog> это внутенности конкретного dialog id

Т.е совать наш

<dialog id="escape_trader_letat_gusi">
 …  
</dialog>

надо

<dialog id="*** ">
…
</dialog>
здесь
<dialog id="*** ">
…
</dialog>

но

<dialog id="*** ">
не здесь
</dialog>

После сохранения внесенных изменений с файлом 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

      <string id="*** ">
	</string>
              сюда
	<string id="*** ">
	</string>

Но не внутрь одного из существующих string id

      <string id="*** ">
               не сюда
	</string>

После сохранения изменений, у нас все готово. Можно грузить игру и смотреть что получилось.

Практический пример не работает со вторым патчем - решение проблемы

По крайней мере со вторым патчем несовместимо условие

<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>

Дополение от XiaNi

По поводу <precondition> в данном примере.. он тут реально вообще не нужен тем более что возвращает всегда одно и то же... тут уж или реально надо использовать функцию которая хоть чтото проверяет нужное для диалога... а так... диалог и так будет активным если убрать <precondition> (в данном случае это 100%)

<has_info> и <dont_has_info> это условия на присутствие и соответственно отсутствие у игрока "информации" которая, на самом деле, всего лишь флажок, что пользователь слышал о чем-то или видел что-то который выдается: 1. условиями "логики" прописанной объектам или неписям. 2. скриптами 3. диалогами через например "<give_info>tutorial_end</give_info>"

В принципе <has_info> соответствует скриптовому аналогу функции has_alife_info так например <has_info>tutorial_end</has_info> можно заменить на <precondition>escape_dialog.check_tutor_end</precondition> и дописать в escape_dialog.script строчки :

 
function check_tutor_end(actor, npc)
if	has_alife_info("tutorial_end")
	then
	 return true
        else
         return false
	end
end
 

в которой мы проверяем есть ли информация tutorial_end у игрока.

Авторы

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

Другие места
LANGUAGE