Сповіщення
Очистити все

SoC. Створення діалогів


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 

Створення нових гілок діалогів

Теорія

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 > 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_ /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> виконується завжди. функція завжди повертає істину і пропускається до списку реплік.

Але для конкретної гілки може бути кілька попередніхумов і інших умов.

Далі, <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/ukr/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/ukr/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 >

Також при побудові діалогів у версії 1004 варто враховувати довжину назви діалогу, а також імен посилань на текстовий зміст. Якщо перевищити поріг (не перевіряв кількість символом у рядку) допустимих значень діалог по зростанню не буде відображатися повністю, а надмірна частина, яку він може відобразити. При спробі продовжити діалог він просто не виводиться, що призводить до неможливості його завершення. Ця проблема була помічена під час проходження моди Р.М.А. 1.0.1 на 1.004 патчі що на 1.006 з цим не виникало проблем Якихсь вильотів у цьому випадку не помічалося...

Всі. Ми навчилися писати прості діалоги.


   
Цитата