Гость
Статистика Форума
Последнии темы Популярные темы Лучшии пользователи Новые пользователи
» [02.12.2018] Hardcore pack for SGM 2.2 (0)
» [02.12.2018] Geonezis Addon for SGM 2.0 (0)
» [02.12.2018] F.A.Q по прохождению модификации Ф.О.Т.О.Г.Р.А.... (5)
» [02.12.2018] Лечение вылетов "Ф.О.Т.О.Г.Р.А.Ф" (0)
» [02.12.2018] "Ф.О.Т.О.Г.Р.А.Ф" (0)
» [02.12.2018] Закоулки правды (0)
» [02.12.2018] NLС7: "я - Меченый" (оригинал+финал) (0)
» [02.12.2018] [NLC7] NLC 7: Hardcore Balance Mode (0)
» [02.12.2018] Дополнения для "Вариант Омега" (0)
» [02.12.2018] Гид по прохождению Вариант Омега (9)
» Тайники и подсказки (82)
» FAQ прохождения по локациям DOPPELGANGER 7.63 Time Gap (50)
» Русскоязычное руководство по моду Frackin' Universe... (38)
» Фоны для сталкерского сайта (32)
» [DMX] Народное творчество (24)
» Capital-Rp Wikia Code (22)
» ГИД Прохождение остальных квестов ОП - 2 (21)
» CoC Вылеты и их решение (21)
» Личные сообщения (18)
» Редактирование мода «Народная солянка Объединенный пак ... (18)
» Xemordio (3018)
» NL-Vincenz (12)
» Duzeppa26 (5)
» Ghosteron (4)
» Бармен (1)
» ZION (1)
» gromgold (1)
» Glomar (1)
» Даниил_Хороший (1)
» AleksStal (0)
» [07.12.2018] Ne_NuJeN
» [07.12.2018] gorelov
» [06.12.2018] prist12332
» [06.12.2018] jorik501
» [04.12.2018] колючий
» [03.12.2018] iozef32
» [02.12.2018] kaldunich
» [26.11.2018] igorjmakarov
» [26.11.2018] sejidovamarina
» [26.11.2018] gromgold

  • Страница 1 из 1
  • 1
Форум » Игры // games » S.T.A.L.K.E.R. » Модостроение сталкер » Создание диалогов
Создание диалогов
Xemordio Offline Дата: Вторник, 18.09.2018, 19:07 | Сообщение # 1
Администратор
Звание: Маршал [?]
Сообщений: 3018
Для начала немного теории и общих сведений.

Все диалоги создаются в файлах типа «dialogs_локация», а регистрируются в профилях НПС (файлы типа «character_desc_локация).
Прежде чем создавать диалог нужно его зарегистрировать, ведь так? Если вы уже знаете, что означают все тэги в профиле НПС, то уже знаете как прописать диалог. Если нет, то читайте ниже как это сделать.

Открываем файл к примеру character_desc_escape. Находим профиль Сидора (trader) и находим тэги <start_dialog> и <actor_dialog>. Отличаются они тем, что start_dialog начинается фразой НПС, а actor_dialog начинается фразой ГГ. Сейчас вы учитесь, так что лучше выбрать второе.

И так, пропишем наш диалог в профиль Сидорыча – среди различных actor_dialog-ов создадим свой (в данном случае <actor_dialog>trader_quest_1</actor_dialog>).

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

Вот как выглядит простейший диалог в файлах игры:
Код
<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). Каждая текстова фраза там прописана в таком виде:
Код
<string id="esc_bridge_soldiers_start_11">
        <text>Здесь проход воспрещён, сталкер.</text>
</string>

Тут думаю и так все понятно. string id это id текстовой фразы. Он может быть любым на ваше усмотрение. <text>, ну тут как и раньше пишется текст, на этот раз уже любой величины. А в самой структуре диалога в тэге <text> пишем esc_bridge_soldiers_start_11 без всяких кавычек.
Т.е. фраза в самом диалоге будет выглядеть так:
Код
<phrase id="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 и начинаем создавать первый диалог.
Создаем базовую структуру и прописываем нужное количество фраз:
<dialog id="prinesi_vodky">
        <phrase_list>
                <phrase id="0">
                        <text>prinesi_vodky_0</text>
                        <next>1</next>
                </phrase>
                <phrase id="1">                         
                        <text>prinesi_vodky_1</text>
                        <next>2</next>
                </phrase>
                <phrase id="2">
                        <text>prinesi_vodky_2</text>
                        <next>3</next>
                </phrase>
                <phrase id="3">
                        <text>prinesi_vodky_3</text>
                        <next>4</next>
                </phrase>
                <phrase id="4">
                        <text>prinesi_vodky_4</text>
                </phrase>
        </phrase_list>
</dialog>

Теперь нам понадобится инфопоршень, чтобы сделать пропажу этого диалога. Заходим в файл info_l01escape и создаем новый инфопоршень:
Код
<info_portion id="info_new_vodka"></info_portion>

Теперь прописываем этот инфопоршень в качестве изчезновения диалога:
Код
<dialog id="prinesi_vodky">
<dont_has_info>info_new_vodka</dont_has_info>
        <phrase_list>
И поставим саму выдачу этого инфопоршня в самый конец диалога:
<phrase id="4">
        <text>prinesi_vodky_4</text>
        <give_info>info_new_vodka</give_info>
</phrase>


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

Пропишем ему условие появления, но теперь не через функцию, а через инфопоршень. Возьмем тот, который использовали для исчезновения первого диалога (так будет логично):
Код
<dialog id="oday_vodky">
<has_info>info_new_vodka</has_info>
        <phrase_list>

Теперь точно так же создадим новый инфопоршень с названием info_new_vodka2 и поставим его на пропажу этого диалога:
Код
<dialog id="oday_vodky">
<has_info>info_new_vodka</has_info>
<dont_has_info>info_new_vodka2</dont_has_info>
        <phrase_list>

И:
Код
<phrase id="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) и создаем нужный нам прекондишен:
Код
<phrase id="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

И прописываем ее использование в нужную нам фразу:
Код
<phrase id="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 в нужном нам месте:
Код
<phrase id="31">
        <text>oday_vodky_31</text>
        <action>dialogs.transfer_2000</action>
        <give_info>info_new_vodka2</give_info>
</phrase>

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

Вот и все. Как видите мы использовали все изученные нами тэги и сделали может и не совсем логичный, но технически развернутый диалог.
Дата регистрации: 22.07.2017
Форум » Игры // games » S.T.A.L.K.E.R. » Модостроение сталкер » Создание диалогов
  • Страница 1 из 1
  • 1
Поиск:

01:44