Центральные темы





Статистика Форума
Последние обновленные темы Самые популярные темы Самые активные / 6-ка лучших Новые участники / 6-ка новичков
Архив ссыл...   Ответов [ 0 ]
Персональн...   Ответов [ 4 ]
Склад с ун...   Ответов [ 0 ]
РП-шим в F...   Ответов [ 12 ]
Создание /...   Ответов [ 6 ]
Снаряжение...   Ответов [ 3 ]
Бар FireZ...   Ответов [ 89 ]
Игра в гор...   Ответов [ 61 ]
Считаем до...   Ответов [ 49 ]
Скрипт зал...   Ответов [ 21 ]
История зо...   Ответов [ 21 ]
Проблемы с...   Ответов [ 19 ]
Dosegear   Постов [ 9483 ]
Крестоносец   Постов [ 426 ]
CM_Punk   Постов [ 256 ]
Воробей   Постов [ 170 ]
XemorDio   Постов [ 160 ]
Бармен   Постов [ 106 ]
belyhvitko  [24.09.2017]
bautochkovova  [14.07.2017]
mosey  [02.07.2017]
SR®  [16.06.2017]
NATOSoldier  [16.04.2017]
джива  [05.04.2017]
Страница 1 из 11
Форум » S.T.A.L.K.E.R Shadow of Chernobyl » Модостроение / Создание модов » Создание диалогов (Наиболее удобный способ создания диалогов.)
Создание диалогов
Dosegear Дата: Воскресенье, 27.04.2014, 20:14 | Сообщение # 1

Thorin Oakenshield
DoseMan
О-Сознание
Сообщений: 9483
Карма:
537
Для начала немного теории и общих сведений.

Все диалоги создаются в файлах типа «dialogs_локация», а регистрируются в профилях НПС (файлы типа «character_desc_локация).
Прежде чем создавать диалог нужно его зарегистрировать, ведь так? Если вы уже знаете, что означают все тэги в профиле НПС, то уже знаете как прописать диалог. Если нет, то читайте ниже как это сделать.
Открываем файл к примеру character_desc_escape. Находим профиль Сидора (trader) и находим тэги и . Отличаются они тем, что start_dialog начинается фразой НПС, а actor_dialog начинается фразой ГГ. Сейчас вы учитесь, так что лучше выбрать второе.
И так, пропишем наш диалог в профиль Сидорыча – среди различных actor_dialog-ов создадим свой (в данном случае trader_quest_1).

Теперь беремся за создание самой структуры диалога.

Вот как выглядит простейший диалог в файлах игры:
Код
<dialog id="trader_quest_1">
          <phrase_list>
                  <phrase id="0">
                          <text>Привет сталкер.</text>
                          <next>1</next>
                  </phrase>
                  <phrase id="1">
                          <text>Ну привет, коли не шутишь.</text>
                          <next>2</next>
                  </phrase>
                  <phrase id="2">
                          <text>Есть работенка какая-нибудь?</text>
                          <next>3</next>
                  </phrase>
                  <phrase id="3">
                          <text>Притащи мне артефакт Медуза. Оплата соотвествующая.</text>
                  </phrase>
          </phrase_list>
</dialog>

Ничего не понятно? Тогда давайте разберем каждую строчку поподробней.
Код
<dialog id="trader_quest_1">
</dialog>

Это собственно и есть наш диалог, внутри которого прописывается все остальное. trader_quest_1 является идентификатором или попросту названием диалога в файлах игры(оно должно совпадать с тем названием, которое прописали в профиле НПС).
Код
<phrase_list>
</phrase_list>

Как не трудно догадаться из названия – это список фраз нашего диалога. Т.е. внутри этого тэга содержаться все фразы нашего диалога.
Код
<phrase id="0">
</phrase>

Это одна единственная фраза. У нее есть собственный номер (id) по которому ее определяет игра.
Код
<text></text>

Собственно сам текст, который будет отображаться в игре. Тут есть небольшой нюанс. Если вы используете короткие фразы (как в данном примере), то можете писать текст прямо в этом же файле. Если вы используете достаточно большие фразы, то нужно использовать немного другой способ, который расписан ниже.
Код
<next></next>

Тэг, который отправляет игру к следующей фразе. Next-ов может быть несколько (об этом позже). Есть одно очень важно правило – next всегда пишется в конце фразы:
Код
<phrase id="0">
          <text>Здравствуй сталкер!</text>
          <next>1</next>
</phrase>


Прежде чем двигаться дальше, попробуйте создать такой незамысловатый и очень простой диалог, не обремененный никакими функциями и дополнительными тэгами ( ВАЖНО: id фразы может быть ТОЛЬКО числом!). Думаю у вас все получится.

Двигаемся дальше. Как вы понимаете для полноценного диалога этого не достаточно. Очень часто используются и другие тэги, которые выполняют различные полезные функции. Сейчас я их перечислю:
Код
<has_info>info_new_quest</has_info>

Данный тэг пишется в самом начале диалога или фразы. К примеру здесь:
Код
<dialog id="trader_quest_1">
<has_info>info_new_quest</hs_info>
          <phrase_list>

Или здесь:
Код
<phrase id="0">
<has_info>info_new_quest</has_info>
          <text>Здравствуй сталкер!</text>

Внутри тэга ("info_new_quest") пишется название инфопоршня. Тэг проверяет наличие определенного инфопоршня (что это такое и где их создавать читать здесь). Если этот инфопоршень был выдан, то диалог/фраза появляются. Если данный инфопоршень вы еще не получили, то диалог/фраза не появятся.
Код
<don’t_has_info>info_new_quest</don’t_has_info>

Тэг очень похож на предыдущий. Ставится он там же, где и предыдущий, но функцию выполняет немного другую. Этот тэг так же проверяет наличие или не наличие инфопоршня, но на этот раз если инфопоршень был выдан, то данный диалог/фраза пропадут (обычно используют для того, чтобы квестовый диалог после окончания пропал и больше не появлялся, но естественно можно использовать и для других случаев).
Код
<action>escape_dialog.transfer_medikit_to_fox</action>

Этот тэг вызывает определенную функцию из указанного скрипта (к примеру спавн НПС или передача награды). Внутри тэга перед точкой пишется название файла-скрипта (gamedata/scripts), после точки пишется название функции из этого скрипта. В данном примере будет производится передача аптечки.
Пишется она внутри какой либо фразы. К примеру:
Код
<phrase id="2">
          <text>Есть работенка какая-нибудь?</text>
          <action>escape_dialog.transfer_medikit</action>
          <next>3</next>
</phrase>

Код
<precondition>escape_dialog.trader_alredy_give_job</precondition>

Назначение у этого тэга такое же, как и у has_info. Это условие появления диалога, но теперь не через инфопоршень, а через скриптовую функцию. Прописывается она так же как и в action. Ставится этот тэг по таким же правилам, как и has_info.
Код
<give_info>info_new_quest</give_info>

Этот тэг используется для выдачи в диалоге определенного инфопоршня. К примеру вы выбрали определенную фразу, следовательно вам выдался инфопоршень. Пишется точно так же внутри фразы, как и action.
Код
<disable_info>info_new_quest</disable_info>

Используется соотвественно для "отбирания" инфопоршня. Сам я им пока еще не пользовался (не было необходимости), но возможно вам пригодится.

Теперь перечислю небольшие нюансы и правила, которым нужно следовать.
Первое.
Почти в самом начале я говорил о том, что в тэг можно вставлять только короткие фразы. Если фраза довольно большая, то лучше использовать ссылки на текст. Каким образом это делается.
Все обширные тексты хранятся в файлах типа «stable_dialogs_локация»(config/text/rus). Каждая текстова фраза там прописана в таком виде:
Код
<stringid="esc_bridge_soldiers_start_11">
          <text>Здесь проход воспрещён, сталкер.</text>
</string>Тут думаю и так все понятно. string id это id текстовой фразы. Он может быть любым на ваше усмотрение. <text>, ну тут как и раньше пишется текст, на этот раз уже любой величины. А в самой структуре диалога в тэге <text> пишем esc_bridge_soldiers_start_11 без всяких кавычек.
Т.е. фраза в самом диалоге будет выглядеть так:
<phraseid="2">
          <text>esc_bridge_soldiers_start_11</text>
          <next>3</next>
</phrase>

Второе.
Разделение на различные файлы по локациям, что dialogs_локация, что и stable_dialogs_локация, чисто формальное и сделано только для удобства. На деле же игра сканирует ВСЕ эти файлы, так что особо не важно в какой из таких файлов вы пропишете свой диалог. НО! Если собрались создавать собственный файл с диалогами, то прочитайте эту статью(ссылка).

Третье.
Теперь поподробней разберем next-ы. Как я уже говорил этот тэг отсылает нас к следующей фразе. Если в какой-либо фразе этот тэг отсутствует, то диалог заканчивается. Если несколько next-ов стоит в фразе НПС, следовательно эта фраза ссылается на несколько фраз ГГ (т.е. все эти ответы ГГ отобразятся в игре, если конечно вы не поставили им условия появления, которое еще не выполнено). Если же вы ставите несколько next-ов в фразу ГГ, то следовательно НПС должен дать вам несколько ответов. Но тупая машина не может выбирать ответы сама по себе, поэтому если вы делаете несколько вариантов ответа НПС, то ОБЯЗАТЕЛЬНО нужно прописать условия появления каждой фразы.

С общей структурой диалога мы думаю разобрались. Теперь попробуйте создать более сложный диалог (или видоизменить тот, который вы сделали вначале). Попробуйте добавить инфопоршни, сделать появление диалога при определенных действиях и его пропажу. Попробуйте через action передать предмет и т.д. (если вы не разбираетесь в скриптах, то все полезные функции вроде передачи предмета, денег и т.д. написаны здесь.ссылка). Надеюсь, у вас все получилось.

С обучением мы по сути закончили. Но если вам до сих пор что то осталось не понятно, то сейчас я подробно распишу что, где и как я делаю, для создания своих диалогов.
В этом примере постараюсь использовать все тэги и приемы, о которых мы узнали.


Прежде чем приступать к внедрению диалога непосредственно в игру, нужно хотя бы мысленно его себе представить. Хотя бы в общих чертах о чем он будет, основные фразы и т.д. Предположим, я собираюсь добавить такой диалог:
- Здравствуй Сидорыч! Как бизнес? Процветает?
- Да живем потихоньку. Чего пришел? По делу, аль так - потрепаться?
- Да просто скучно стало с новичками в деревне. Ничего полезного да интересного рассказать не могут. Может с тобой диалог заладится?
- Ах вот ты по какому делу. Хорошо, но что то у меня в горле пересохло. Принеси бутылочку Казаков, авось и поговорим.
- Договорились.
После этого у Сидора появится такой диалог:
- Принес я тебе водку Сидор. Теперь можем поговорить?
- Давай ее сюда.
- (если водка есть) Держи. Разливай… (если водки нет) Эээ…я сейчас принесу ее…
- 1. Отлично. Возьми. Заработал. 2. Ишь ты! Сначала принес, теперь не принес…
Примерный план действий составили. Теперь начнем внедрять все это в игру.

Открываем файл character_desc_escape и прописываем нужные нам диалоги Сидорычу:
Код
<actor_dialog>prinesi_vodky</actor_dialog>
<actor_dialog>oday_vodky</actor_dialog>Открываем файл dialogs_escape и начинаем создавать первый диалог.
Создаем базовую структуру и прописываем нужное количество фраз:
<dialogid="prinesi_vodky">
          <phrase_list>
                  <phraseid="0">
                          <text>prinesi_vodky_0</text>
                          <next>1</next>
                  </phrase>
                  <phraseid="1">                           
                          <text>prinesi_vodky_1</text>
                          <next>2</next>
                  </phrase>
                  <phraseid="2">
                          <text>prinesi_vodky_2</text>
                          <next>3</next>
                  </phrase>
                  <phraseid="3">
                          <text>prinesi_vodky_3</text>
                          <next>4</next>
                  </phrase>
                  <phraseid="4">
                          <text>prinesi_vodky_4</text>
                  </phrase>
          </phrase_list>
</dialog>

Теперь нам понадобится инфопоршень, чтобы сделать пропажу этого диалога. Заходим в файл info_l01escape и создаем новый инфопоршень:
Теперь прописываем этот инфопоршень в качестве изчезновения диалога:

info_new_vodka
И поставим саму выдачу этого инфопоршня в самый конец диалога:

prinesi_vodky_4
info_new_vodka

Создаем второй диалог:
Код
<dialog id="oday_vodky">
                  <phrase_list>
                          <phraseid="0">
                     <text>oday_vodky_0</text>
                     <next>1</next>
                          </phrase>
                          <phraseid="1">
                     <text>oday_vodky_1</text>
                     <next>21</next>
                     <next>22</next>
                          </phrase>
                          <phraseid="21">
                     <text>oday_vodky_21</text>
                     <next>31</next>
                          </phrase>
                          <phraseid="22">
                     <text>oday_vodky_22</text>
                     <next>32</next>
                          </phrase>
                          <phraseid="31">
                     <text>oday_vodky_31</text>
                          </phrase>
                          <phraseid="32">
                     <text>oday_vodky_32</text>
                          </phrase>
                  </phrase_list>
          </dialog>

Пропишем ему условие появления, но теперь не через функцию, а через инфопоршень. Возьмем тот, который использовали для исчезновения первого диалога (так будет логично):
Код
<dialogid="oday_vodky">
<has_info>info_new_vodka</has_info>
          <phrase_list>Теперь точно так же создадим новый инфопоршень с названием info_new_vodka2 и поставим его на пропажу этого диалога:
<dialogid="oday_vodky">
<has_info>info_new_vodka</has_info>
<dont_has_info>info_new_vodka2</dont_has_info>
          <phrase_list>И:
<phraseid="31">
          <text>oday_vodky_31</text>
          <give_info>info_new_vodka2</give_info>
</phrase>

Теперь нужно сделать условия появления ответов ГГ. Для этого нам понадобится функция, на проверку того есть в инвентаре ГГ водка или нет. Вот данная функция:
Код
function have_a_vodka (stalker, player)
          return db.actor:object("vodka")~=nil
end

Прописываем ее в любой файл со скриптами (я выбрал dialogs.script) и создаем нужный нам прекондишен:
Код
<phraseid="21">
<precondition>dialogs.have_a_vodka</precondition>
          <text>oday_vodky_21</text>
          <next>31</next>
</phrase>

Далее нужно создать «отбирание» водки, если она имеется. Используем такую функцию:
Код
function transfer_vodka(first_speaker, second_speaker)
          dialogs.relocate_item_section(second_speaker,"vodka","out")
end

И прописываем ее использование в нужную нам фразу:
Код
<phraseid="21">
<precondition>dialogs.have_a_vodka</precondition>
          <text>oday_vodky_21</text>
          <action>dialogs.transfer_vodka</action>
          <next>31</next>
</phrase>

Теперь нужно прописать выдачу награды (в данном случае 2000 рублей). Используется такая функция:
Код
function transfer_2000 (fs, ss)
          dialogs.relocate_money(fs,2000,"in")
end

Прописываем эту функцию в тот же файл dialogs.script, и делаем его активацию (выдачу награды/передачу денег) через action в нужном нам месте:
Код
<phraseid="31">
          <text>oday_vodky_31</text>
          <action>dialogs.transfer_2000</action>
          <give_info>info_new_vodka2</give_info>
</phrase>

С конструкцией диалога закончили. Теперь нужно прописать сам текст диалогов. Заходим в файл stable_dialogs_escape и прописываем все наши тексты:
Код
<stringid="prinesi_vodky_0">
                  <text>Здравствуй Сидорыч! Как бизнес? Процветает?</text>
          </string>
          <stringid="prinesi_vodky_1">
                  <text>Да живем потихоньку. Чего пришел? По делу, аль так - потрепаться?</text>
          </string>
          <stringid="prinesi_vodky_2">
                  <text>Да просто скучно стало с новичками в деревне. Ничего полезного да интересного рассказать не могут. Может с тобой диалог заладится?</text>
          </string>
          <stringid="prinesi_vodky_3">
                  <text>Ах вот ты по какому делу. Хорошо, но что то у меня в горле пересохло. Принеси бутылочку Казаков, авось и поговорим.</text>
          </string>
          <stringid="prinesi_vodky_4">
                  <text>Договорились.</text>
          </string>
            
          <stringid="oday_vodky_0">
                  <text>Принес я тебе водку Сидор. Теперь можем поговорить?</text>
          </string>
          <stringid="oday_vodky_1">
                  <text>Давай ее сюда.</text>
          </string>
          <stringid="oday_vodky_21">
                  <text>Держи. Разливай… </text>
          </string>
          <stringid="oday_vodky_22">
                  <text>Эээ…я сейчас принесу ее…</text>
          </string>
          <stringid="oday_vodky_31">
                  <text>Отлично. Возьми. Заработал. </text>
          </string>
          <stringid="oday_vodky_32">
                  <text>Ишь ты! Сначала принес, теперь не принес…</text>
          </string>

Вот и все. Как видите мы использовали все изученные нами тэги и сделали может и не совсем логичный, но технически развернутый диалог. Также вы можете приписать диалог к нашему НПС, который мы создавали в этой теме. Всем спасибо!


Say my name, falles!
Форум » S.T.A.L.K.E.R Shadow of Chernobyl » Модостроение / Создание модов » Создание диалогов (Наиболее удобный способ создания диалогов.)
Страница 1 из 11
Поиск:
12:30
Обновить
Пользователи, посетившие форум за текущий день




Design by Dosegear
Бесплатный конструктор сайтов - uCoz © 2014
Любое копирование графических материалов форума
Приведет в быстрому или медленному наказанию!

Яндекс.Метрика