Как сделать диалог в сталкере

SoC. Создание диалогов

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

Содержание

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

Теория

1) Списки веток диалогов содержатся в файлах вида gamedata/config/gameplay/character_desc_*.xml

Файлы character_desc_*.xml можно сравнить со стволом дерева диалогов. В них перечисляется названия прикрепляемых веток диалогов

Например вот список веток диалога с Сидоровичем взятый из файла character_desc_escape.xml

В свою очередь каждая ветка диалога также может ветвится.

2) Ветвление диалогов прописывается уже в других файлах.

Например, ветвление диалога с Сидоровичем содержится в файле gamedata/config/gameplay/dialogs_escape.xml Возьмем оттуда, например, ветвление escape_trader_jobs.

Ветвление имеет довольно большие масштабы, поэтому приведу только часть:

Функция выглядит так:

То есть, судя по его структуре,

Это основа ветки escape_trader_talk_info.

Важно! В любой основной ветке любого диалога фраза

будет основой, из которой далее будет все вытекать. Она должна обязательно присутствовать и в вашем диалоге.

3) Текст каждой фразы содержится в третьем файле. Для диалога с Сидоровичем тексты лежат в файле gamedata/config/text/rus/stable_dialogs_escape.xml. Вот сама текстовая составляющая диалога:

Эти строки содержат тексты для фраз

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

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

Практика

Добавим в диалог с Сидоровичем ветку своего собственного изготовления.Например такую:

Т.е у нас получится так:

Записываем изменения, с этим файлом пока всё.

2) Теперь берем файл gamedata/config/gameplay/dialogs_escape.xml

Будет соответствовать такая структура:

После сохранения внесенных изменений с файлом dialogs_escape.xml все.

3) Теперь вбиваем сами текстовички в файле gamedata/config/text/rus/stable_dialogs_escape.xml

Т.е нам надо в файле stable_dialogs_escape.xml вставить такую конструкцию:

В любом месте между уже существующими string id. После сохранения изменений, у нас все готово. Можно загружать игру и смотреть что получилось. Если вы сделали всё правильно,но при обращении к НПЦ вылетает с таким логом

Создайте свой файл и назовите его как душе угодно,пример: letat_gusi_my_test.xml Впишите туда:

Сохраните.Далее в gamedata\config\system.ltx добавьть в секцию [dialogs] название файла,который мы создали.Пример:

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

Дело в том, что во втором патче из файла escape_dialog.script была удалена функция:

Можно либо записать эту функцию обратно в escape_dialog.script, либо использовать другие более-менее подходящие условия, например:

Так-же при построении диалогов в версии 1.004 стоит учитывать длину названия диалога, а также имен ссылок на текстовое содержание. Если превысить порог (не проверял количество символом в строке) допустимых значений диалог по росту не будет отображаться целиком а лиш та часть которую он может отобразить. При попытке продолжить диалог он попросту не выводится что приводит к невозможности его завершения. Данная проблема была замечена при прохождении мода Р.М.А. 1.0.1 на 1.004 патче что на 1.006 с этим не возникало проблем Каких либо вылетов в этом случае не замечалось.

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

Источник

Создание диалогов (полный обзор)

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

Статья в процессе написания.

Содержание

Общие данные

В них нам важны, соотвественно, списки присвоения диалогов персонажам, структуры диалогов и текстовые массивы для фраз.

Структура фраз

В общем виде диалог выглядит так:

фраза 0
«Так, чего хотел-то?»
следующие фразы: 1

фраза 1
«Задание для тебя есть. Возьмешься?»
следующие фразы: 21, 22

фраза 22
«Не, иди к черту.»
следующие фразы: нет
действие: выйти из диалога

[фраза 3 и дальнейшее продолжение. ]

В файлах эта структура записывается следующим образом:

Во-первых, принадлежность фраз. Они могут принадлежать или игроку, или NPC, причем:

Впрочем, и у фразы игрока можно сделать несколько вариантов ответов, но поскольку компьютер не обладает способностью самостоятельно выбирать, то каждый из вариантов должен быть заранее определен по условиям выбора (например, по наличию у игрока какого-нибудь предмета, или количества денег, или репутации и т.д.), причем условия выбора различных вариантов никогда не должны одновременно становиться подходящими. Это мы разберем позднее.

Во-вторых, структура фразы. Простейшая фраза выглядит так:

Но есть возможность строить и такие фразы (в данном случае она принадлежит NPC, а игрок на неё будет давать ответ):

Как видите, фраза, в которой некий NPC выдает игроку пропуск, позволяющий пройти дальше, достаточно сложна.

Вот еще один пример (здесь она принадлежит игроку):

Итак, что у нас есть:

Текстовые (строковые) массивы

Мы упустили один важный нюанс, критичный для крупных диалогов.

Поэтому нужно использовать не тексты, а ссылки на них. Работает это так:

Как сделать диалог в сталкере. Смотреть фото Как сделать диалог в сталкере. Смотреть картинку Как сделать диалог в сталкере. Картинка про Как сделать диалог в сталкере. Фото Как сделать диалог в сталкере

То есть фразу мы записываем так:

Запись текста происходит в такой форме:

Диалоги

Далее добавим в любой диалоговый файл, например, в dialogs_escape.xml, следующий диалог:

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

«Динамические диалоги»

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

Вообще урок это копия предыдущей статьи, с той лишь небольшой разницей, что у как и у ГГ, так и у НПС будет несколько вариантов ответов. Получившаяся структура диалога:

Ну вот как-то так. Рассмотрим наиболее интересную часть:

Здесь мы предоставляем выбор дальнейшего диалога для НПС, причём в этой структуре его выбор получается абсолютно рандомным. Скриншоты: Как сделать диалог в сталкере. Смотреть фото Как сделать диалог в сталкере. Смотреть картинку Как сделать диалог в сталкере. Картинка про Как сделать диалог в сталкере. Фото Как сделать диалог в сталкере

Как сделать диалог в сталкере. Смотреть фото Как сделать диалог в сталкере. Смотреть картинку Как сделать диалог в сталкере. Картинка про Как сделать диалог в сталкере. Фото Как сделать диалог в сталкере

Можно прописать установки и проверки для ответов, например, можно реализовать возможность отдавания ненужных вещей какому-нибудь нпс, тогда структура будет выглядеть примерно так(писать полностью не буду, только фразы):

То вероятность ответа «3» будет составлять 75%

Пример реализации динамического диалога

А теперь я(Ким) покажу, как выглядит вышеописанный диалог в игре(точнее в файлах конфигурации). На самом деле это не так уж и сложно и такой диалог можно сделать минут за 15(я сам сделал за 5 минут). Диалоги такого типа активно используются всё в том же Oblivion Lost. Начнём. Сам диалог:

Источник

Создание диалогов

#1 Отшель[НИК]

Для начала немного теории и общих сведений.

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

Вот как выглядит простейший диалог в файлах игры:
Ничего не понятно? Тогда давайте разберем каждую строчку поподробней.

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

Как не трудно догадаться из названия – это список фраз нашего диалога. Т.е. внутри этого тэга содержаться все фразы нашего диалога.

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

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

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

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

Данный тэг пишется в самом начале диалога или фразы. К примеру здесь:
Или здесь:
Внутри тэга («info_new_quest») пишется название инфопоршня. Тэг проверяет наличие определенного инфопоршня (что это такое и где их создавать читать здесь). Если этот инфопоршень был выдан, то диалог/фраза появляются. Если данный инфопоршень вы еще не получили, то диалог/фраза не появятся.

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

Этот тэг вызывает определенную функцию из указанного скрипта (к примеру спавн НПС или передача награды). Внутри тэга перед точкой пишется название файла-скрипта (gamedata/scripts), после точки пишется название функции из этого скрипта. В данном примере будет производится передача аптечки.
Пишется она внутри какой либо фразы. К примеру:

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

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

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

Теперь перечислю небольшие нюансы и правила, которым нужно следовать.

Первое.
Почти в самом начале я говорил о том, что в тэг

можно вставлять только короткие фразы. Если фраза довольно большая, то лучше использовать ссылки на текст. Каким образом это делается.
Все обширные тексты хранятся в файлах типа «stable_dialogs_локация»(config/text/rus). Каждая текстова фраза там прописана в таком виде:
Тут думаю и так все понятно. string id это id текстовой фразы. Он может быть любым на ваше усмотрение.

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

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

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

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

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

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

Создаем второй диалог:
Пропишем ему условие появления, но теперь не через функцию, а через инфопоршень. Возьмем тот, который использовали для исчезновения первого диалога (так будет логично):
Теперь точно так же создадим новый инфопоршень с названием info_new_vodka2 и поставим его на пропажу этого диалога:
И:
Теперь нужно сделать условия появления ответов ГГ. Для этого нам понадобится функция, на проверку того есть в инвентаре ГГ водка или нет. Вот данная функция:
Прописываем ее в любой файл со скриптами (я выбрал dialogs.script) и создаем нужный нам прекондишен:
Далее нужно создать «отбирание» водки, если она имеется. Используем такую функцию:
И прописываем ее использование в нужную нам фразу:
Теперь нужно прописать выдачу награды (в данном случае 2000 рублей). Используется такая функция:
Прописываем эту функцию в тот же файл dialogs.script, и делаем его активацию (выдачу награды/передачу денег) через action в нужном нам месте:
С конструкцией диалога закончили. Теперь нужно прописать сам текст диалогов. Заходим в файл stable_dialogs_escape и прописываем все наши тексты:

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

#2 Asdolg

Так-так. Меченый собственой персоной?

Да, как видишь. Откуда знаешь то меня?

О тебе вся деревня знает. Ладно перейдем к делу. Я разузнал кое-что о твоем прошлом. Ты помогал «Долгу»

Хм. Звучит хорошо. И сейчас вам снова нужна помощь?

Да. МНЕ нужна твоя помощь. А пока принеси-ка мне водочки.

#3 Asdolg

* phase time: 15 ms
* phase cmem: 294367 K
* [win32]: free[1033292 K], reserved[254652 K], committed[809144 K]
* [ D3D ]: textures[260046 K]
* [x-ray]: crt heap[294367 K], process heap[387827 K], game lua[22096 K], engine lua[231 K], render[0 K]
* [x-ray]: economy: strings[3645 K], smem[28221 K]
* MEMORY USAGE: 315418 K
[0]=[gar_dolg_bribe]
́=[stalker_wounded_friend]
[2]=[optional_dialog_test]
[3]=[dm_hello_dialog]
[4]=[dm_trade_info_dialog]
[5]=[dm_action_info_dialog]
[6]=[dm_cool_info_dialog]
[7]=[dm_help_wounded_medkit_dialog]
[8]=[tm_trader_dialog]
[9]=[tm_trader_reward]
[10]=[tm_barman_dialog]
[11]=[tm_barman_reward]
[12]=[tm_ecolog_dialog]
[13]=[tm_ecolog_reward]
[14]=[tm_dolg_dialog]
[15]=[tm_dolg_reward]
[16]=[tm_freedom_dialog]
[17]=[tm_freedom_reward]
[18]=[tm_shustriy_dialog]
[19]=[tm_shustriy_reward]
[20]=[tm_wolf_dialog]
[21]=[tm_wolf_reward]
[22]=[tm_lisiy_dialog]
[23]=[tm_lisiy_reward]
[24]=[tm_mercenary_dialog]
[25]=[tm_mercenary_reward]
[26]=[tm_drunk_dolg_dialog]
[27]=[tm_drunk_dolg_reward]
[28]=[tm_hunter_dialog]
[29]=[tm_hunter_reward]
[30]=[tm_petrenko_dialog]
[31]=[tm_petrenko_reward]
[32]=[tm_zastava_commander_dialog]
[33]=[tm_zastava_commander_reward]
[34]=[hello_dialog]
[35]=[actor_help_wounded]
[36]=[actor_break_dialog]
[37]=[tutorial_wounded_give_medkit]
[38]=[escape_factory_assault_start]
[39]=[esc_stalker_talk_level]
[40]=[escape_trader_talk_level]
[41]=[esc_provodnik_start]
[42]=[escape_lager_guard_start_dialog]
[43]=[escape_lager_leader_hello]
[44]=[esc_lager_no_talk]
[45]=[escape_shustryi_start]
[46]=[escape_trader_done_blockpost_box]
[47]=[escape_trader_talk_info]
[48]=[escape_trader_jobs]
[49]=[escape_trader_start_dialog]
[50]=[escape_fox_hello_dialog]
[51]=[esc_bridge_soldiers_start]
[52]=[escape_lager_volk_info]
[53]=[escape_lager_volk_talk]
[54]=[ekspantor]
[55]=[lol]
[56]=[lol_1]
[57]=[hello_st]
[58]=[gar_seryi_about_garbage]
[59]=[gar_dramm_novice_start]
[60]=[gar_stalker_about_level]
[61]=[gar_hellcar_start]
[62]=[gar_seriy_start]
[63]=[gar_dolg_blokpost]
[64]=[agr_krot_about_agroprom]
[65]=[agr_stalker_talk_about_ratcatcher1]
[66]=[agr_stalker_esc]
[67]=[agr_stalker_talk_about_ratcatcher]
[68]=[agr_stalker_talk_level]
[69]=[agr_swamp_ratcatcher_talks1]
[70]=[agr_krot_actor_hasnot_met_seriy]
[71]=[agr_factory_stalker_about]
[72]=[agr_krot_help]
[73]=[agr_factory_stalker_start]
[74]=[agr_swamp_ratcatcher_talks]
[75]=[agr_ratcatcher_start]
[76]=[agr_krot_actor_met_seriy]
[77]=[agr_factory_krot_start]
[78]=[quest_cit_reward]
[79]=[cit_doctor_main_dialog]
[80]=[cit_doctor_hello_dialog]
[81]=[cit_doctor_escape_dialog]
[82]=[val_sos_dialog]
[83]=[val_prisoner_hello]
[84]=[val_rob_dialog]
[85]=[val_escort_captive_dialog]
[86]=[val_escort_nap1_dialog]
[87]=[pri_followers_start_dlg]
[88]=[bar_bar_visitors_7_start]
[89]=[bar_bar_visitors_5_start]
[90]=[bar_bar_visitors_4_start]
[91]=[bar_bar_visitors_3_start]
[92]=[bar_bar_visitors_12_start]
[93]=[bar_bar_visitors_10_start]
[94]=[bar_bar_visitors_13_start]
[95]=[bar_bar_visitors_14_start]
[96]=[bar_bar_barman_ecolog_flash_done]
[97]=[bar_bar_barmen_talk_info]
[98]=[bar_bar_visitors_1_start]
[99]=[bar_dolg_guard_bunker_start]
[100]=[bar_dolg_base_guard_talk]
[101]=[bar_dolg_veteran_start]
[102]=[bar_dolg_zastava]
[103]=[bar_dolg_zastava_talk]
[104]=[bar_dolg_zavskald_reward]
[105]=[bar_ecolog_crush_professor_give_info_dp]
[106]=[bar_ecolog_dialog]
[107]=[bar_ecolog_crush_professor_start]
[108]=[bar_bar_barman_veterans_finish]
[109]=[bar_arena_man_start]
[110]=[bar_bar_hunter_quest_finish]
[111]=[bar_bar_osvedomitel_start]
[112]=[bar_bar_osvedomitel_talk]
[113]=[bar_bar_osvedomitel_talk_about_freedom]
[114]=[bar_bar_osvedomitel_trade_info]
[115]=[bar_dolg_zastava_about_zastava]
[116]=[bar_bar_barman_killer_ambush]
[117]=[bar_bar_barmen_jobs]
[118]=[bar_dolg_base_guard_acces]
[119]=[bar_dolg_base_guard_rules]
[120]=[bar_bar_hunter_start]
[121]=[bar_dolg_petrenko_start]
[122]=[bar_dolg_novice_start]
[123]=[bar_dolg_newbie_start]
[124]=[bar_dolg_base_guard_start]
[125]=[bar_bar_visitors_9_start]
[126]=[bar_bar_visitors_8_start]
[127]=[bar_bar_visitors_6_start]
[128]=[bar_bar_visitors_2_start]
[129]=[bar_bar_drunk_dolg_start]
[130]=[bar_bar_barmen_start]
[131]=[bar_arena_man_job]
[132]=[bar_bar_hunter_quest_start]
[133]=[bar_dolg_ivancov_start]
[134]=[bar_dolg_leader_prisyaga]
[135]=[bar_dolg_leader_join]
[136]=[bar_dolg_leader_job]
[137]=[bar_bar_osvedomitel_reward]
[138]=[bar_dolg_leader_quest_rg6_finish]
[139]=[bar_dolg_leader_start]
[140]=[yantar_wounded_scientist]
[141]=[yantar_help_scientist]
[142]=[yantar_general_ucheniy_talk_start]
[143]=[mil_screw_dialog]
[144]=[mil_zoneguard_common1]
[145]=[mil_zoneguard_dialog]
[146]=[mil_patrol_dialog1]
[147]=[mil_zoneguard_common2]
[148]=[mil_patrol_dialog2]
[149]=[mil_cook_drunk_question_about_rg6_2]
[150]=[mil_cook_drunk_question_about_rg6_3]
[151]=[mil_cook_common6]
[152]=[mil_cook_common1]
[153]=[mil_cook_common2]
[154]=[mil_cook_common3]
[155]=[mil_cook_common4]
[156]=[mil_cook_common5]
[157]=[mil_cook_drunk_question_about_rg6_1]
[158]=[mil_cook_drink_for_rg6_2]
[159]=[mil_cook_drink_for_rg6_3]
[160]=[mil_cook_drink_for_rg6_1]
[161]=[mil_max_dialog]
[162]=[mil_dolg_skull_dialog]
[163]=[mil_dolg_soldier_dialog]
[164]=[mil_freedom_commander]
[165]=[mil_freedom_commander_common2]
[166]=[mil_guard_arsenal_dialog]
[167]=[mil_hunter_dialog]
[168]=[mil_leader_start_dialog]
[169]=[mil_bodyguard_dialog]
[170]=[mil_cook_dialog]
[171]=[mil_trader_dialog]
[172]=[dar_explorer_dialog]
[173]=[rad_find_stalkers_dialog_3]
[174]=[rad_find_stalkers_dialog_1]
[175]=[rad_find_stalkers_dialog_2]
[176]=[rad_found_stalkers_dialog_2]
[177]=[rad_find_stalkers_dialog_4]
[178]=[rad_chief_start_dialog]
[179]=[rad_find_deputy_dialog_1]
[180]=[rad_found_stalkers_dialog_1]
[181]=[rad_found_deputy_dialog_2]
[182]=[rad_found_deputy_dialog_1]
[183]=[oso_chernobyl_crush]
[184]=[oso_death_truck]
[185]=[oso_no]
[186]=[oso_osoznanie_start]
[187]=[oso_stalker]
[188]=[oso_what_about_me]
[189]=[oso_what_is_the_zone]
[190]=[oso_what_next]
[191]=[oso_who_are_you]
[192]=[oso_why_chernobyl]
[193]=[oso_yes]

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *