Вступление
Перед изучением этого урока советую освоить находящийся несколько выше урок "Создание новых веток диалогов".
Небольшие правила, следуя которым, можно сберечь себе много нервов:
- всегда сохраняйте резервные копии модифицируемых файлов - старайтесь почаще тестировать внесенные изменения - так проще понять, в чем вы ошиблись (если активно работать пару часов без остановки, не разу не протетировав внесенные изменения, то потом будет очень сложно понять - почему же, черт возьми, игра вылетает при попытке поговорить с Сидоровичем?) - перед началом работы создайте новую папку gamedata, а свои моды спрячьте подальше: работать с "чистой" версией игры не в пример удобнее и проще; особенно противопоказан Repair Mod, который с новыми диалогами часто конфликтует*
* о том, как создать диалоги и квесты, исключающие возможность конфликта с другими подобными модами, см. часть 4.
Создание базового диалога
Начнем создание квеста с написания небольшого линейного диалога. Это будет выглядеть примерно так:
Меченый: Сидрыч, давай поговорим о... водке. Сидорович: О водке? Да о какой водке сейчас можно говорить? Вокруг оглянись. Видишь хоть одну бутылку?! Вот. Именно. Кончилась она у меня, родимая, кончилась... помоги, принесешь, а? Вроде у Волка на чердаке была, что-то он однажды об этом упоминал... Меченый: Да сбегаю я сейчас, сбегаю... алкоголик, блин. Сидорович: Беги, беги... сил уж нет ждать, давай, родимый.
После третьей фразы у нас будет активироваться квест "Принеси водки Сидоровичу".
Открываем файл gamedata\config\gameplay\character_desc_escape.xml и проводим такие манипуляции:
- находим строку "<actor_dialog>escape_trader_done_blockpost_box</actor_dialog>" - добавляем после нее новую - "<actor_dialog>escape_trader_oops</actor_dialog>" - сохраняем изменения
Мы добавили к Диалогу с Сидоровичем новую ветку, вернее, только ссылку на неё. Сама внутренняя структура ветки хранится в файле gamedata\config\gameplay\dialogs_escape.xml, который мы открываем и производим:
- находим в любом месте файла промежуток между </dialog> и <dialog id="..."> - засовываем туда такую конструкцию:
<dialog id="escape_trader_oops">
<precondition>escape_dialog.trader_alredy_give_job</precondition>
<has_info>tutorial_end</has_info>
<phrase_list>
<phrase id="0">
<text>escape_trader_oops_0</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>escape_trader_oops_1</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>escape_trader_oops_2</text>
<next>1</next>
</phrase>
<phrase id="3">
<text>escape_trader_oops_3</text>
</phrase>
</phrase_list>
</dialog>
- сохраняем изменения
Теперь у нас прописана структура новой ветки диалога. Осталось сделать еще одну вещь - прописать строки, которые будут отображаться вместо "escape_trader_oops_...".
Для этого откроем файл gamedata\config\text\rus\stable_dialogs_escape.xml и сделаем следующее:
- находим любой удобный промежуток между </string> и <string id="..."> - прописываем туда следующие строки:
<string id="escape_trader_oops_0">
<text>Сидрыч, давай поговорим о... водке.</text>
</string>
<string id="escape_trader_oops_1">
<text>О водке? Да о какой водке сейчас можно говорить? Вокруг оглянись. Видишь хоть одну бутылку?!
Вот. Именно. Кончилась она у меня, родимая, кончилась... помоги, принесешь, а?
Вроде у Волка на чердаке была, что-то он однажды об этом упоминал...</text>
</string>
<string id="escape_trader_oops_2">
<text>Да сбегаю я сейчас, сбегаю... алкоголик, блин.</text>
</string>
<string id="escape_trader_oops_3">
<text>Беги, беги... сил уж нет ждать, давай, родимый.</text>
</string>
- сохраняем изменения
Всё. Диалог готов. Можно грузить игру и смотреть, работает ли новая ветка. А теперь будем прикреплять к этому безобразию квест ""Принеси водки Сидоровичу".
Создание базового квеста
Активацию квеста в диалог прикрепить достаточно просто. Проводим с файлом gamedata\config\gameplay\ dialogs_escape.xml следующие манипуляции:
- добавляем содержимое фразы <phrase id="2"> следующим:
<phrase id="2">
<text>escape_trader_oops_2</text>
<give_info>kvest_vodka_started</give_info>
<next>3</next>
</phrase>
- сохраняем изменения
Теперь после фразы Меченого "Да сбегаю я сейчас, сбегаю..." Сидорович таки всучивает нам квест "Принеси водку". Но не спешите тестировать изменения. Мы добавили в диалог упоминание о квесте, хотя он еще не создан.
Исправим это недоразумение. Откройте файл gamedata\config\gameplay\tasks_escape.xml и в начале файла создайте такую конструкцию:
<game_task id="esc_test_vodka_task">
<title>Принести водки</title> <!-- заголовок квеста -->
<objective>
<text>Принести водки Сидоровичу</text>
<icon>ui_iconsTotal_find_item</icon>
<infoportion_complete>test_quest_vodka_otdana</infoportion_complete> </objective>
<objective>
<text>Вернуться с водкой обратно</text>
<map_location_type hint="esc_dinamit_to_volk">green_location</map_location_type>
<object_story_id>Escape_novice_lager_volk</object_story_id>
<infoportion_complete>test_quest_vodka_otdana</infoportion_complete>
</objective>
<objective>
<text>Найти водку на чердаке</text>
<map_location_type hint="escape_trader">blue_location</map_location_type>
<object_story_id>Escape_Trader</object_story_id>
<infoportion_complete>test_quest_vodka_otdana</infoportion_complete>
</objective>
</game_task>
Мы прописали данные о квесте: название, иконку, строки заданий, расположение маркеров и т.д.
К этому файлу мы еще вернемся, т.к. в этом варианте многое проставлялось не иначе как от балды. Я еще подумаю, как заставить задание "Вернуться с водкой обратно" появиться в PDA, а то оно что-то не желает явить себя народу... впрочем, ладно, главное, что все работает и не вылетает. А исправление столь мелких багов - дело десятое. Продолжим.
Откроем файл gamedata\config\gameplay\info_l01escape.xml и зарегистрируем до того отсутствовавшие в игре типы условий (они нам еще пригодятся для завершения работы над квестом):
- после строки <game_information_portions> прописываем:
<info_portion id="test_quest_vodka_otdana"></info_portion>
<info_portion id="kvest_vodka_started">
<task>esc_test_vodka_task</task>
</info_portion>
<info_portion id="otkazalsya_prinesty_vodku"></info_portion>
С прописыванием условий - всё.
Теперь займемся одной небольшой, но нужной вещью - прописыванием экранных подсказок, которые высвечиваются при получении/выполнении этапа/завершении задания.
Для этого откроем файл gamedata\config\text\rus\string_table_tasks_escape.xml и пропишем там:
<string id="esc_test_prinesti_vodku">
<text>Принести бутылку водки</text>
</string>
<string id="esc_test_prinesti_vodku_1">
<text>Найти водку на чердаке у Волка</text>
</string>
<string id="esc_test_prinesti_vodku_2">
<text>Принести бутылку водки Сидоровичу</text>
</string>
Теперь можно тестировать, что получилось. Сверяем результаты:
- по окончанию разговора про водку у вас появляется новое задание - в задании маркером отмечен Волк (ближайший к чердаку маркер, потому и отмечен) - при получении задания на экране высвечивается уведомление
Можно приступать к третьей стадии. Что мы забыли? Правильно - возможность выполнить квест.
Реализация возможности выполнить квест
На самом деле - все просто. Все условия и т.д. уже нами созданы, осталось только применить их в диалоге. Давайте несколько изменим его структуру, сделаем его ветвистым и функциональным:
0. Сидрыч, давай поговорим о... водке. ( переход к 1) 1. О водке? Да о какой водке сейчас можно говорить? Вокруг оглянись. Видишь хоть одну бутылку?! Вот. Именно. Кончилась она у меня, родимая, кончилась... помоги, принесешь, а? Вроде у Волка на чердаке была, что-то он однажды об этом упоминал... ( выбор - переход к 2, 4, 5; изначально доступен только 2 вариант ) 2. Да сбегаю я сейчас, сбегаю... алкоголик, блин. ( получение квеста, переход к 3, после этого перестает быть доступен ) 3. Беги, беги... сил уж нет ждать, давай, родимый. ( конец, переход к списку веток Сидоровича ) 4. Вот она, твоя бутылка водки. Ну, вернее, не твоя, а Волка... ( появляется только при наличии водки в инвентаре, при выборе водка передается Сидоровичу, квест выполняется, идет переход к 7 ) 5. Извини, Сидрыч, я пока еще не раздобыл, терпи... ( появляется только если взять квест, переход к 6 ) 6. А ну марш отсюда! Без бутылки пришел... ууу, вражина... ( переход к 8 ) 7. Теперь моя будет, Меченый! Ты так Волку и передай. Спасибо, выручил... держи награду. Нееет, это не водка, обойдешься... денег дам. ( выдача награды, переход к 8 ) 8. Ну тебя в пень... ( конец, переход к списку веток Сидоровича )
А вот так это будет выглядеть в файле gamedata\config\gameplay\dialogs_escape.xml:
<dialog id="escape_trader_oops">
<precondition>escape_dialog.trader_alredy_give_job</precondition>
<has_info>tutorial_end</has_info>
<phrase_list>
<phrase id="0">
<text>escape_trader_oops_0</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>escape_trader_oops_1</text>
<next>2</next>
<next>4</next>
<next>5</next>
</phrase>
<phrase id="2">
<dont_has_info>kvest_vodka_started</dont_has_info>
<text>escape_trader_oops_2</text>
<give_info>kvest_vodka_started</give_info>
<next>3</next>
</phrase>
<phrase id="3">
<text>escape_trader_oops_3</text>
<action>dialogs.break_dialog</action>
</phrase>
<phrase id="4">
<text>escape_trader_oops_4</text>
<precondition>escape_dialog.have_a_vodka</precondition>
<action>escape_dialog.otday_vodku</action>
<next>7</next>
</phrase>
<phrase id="5">
<has_info>kvest_vodka_started</has_info>
<text>escape_trader_oops_5</text>
<next>6</next>
</phrase>
<phrase id="6">
<text>escape_trader_oops_6</text>
<next>8</next>
</phrase>
<phrase id="7">
<text>escape_trader_oops_7</text>
<give_info>test_quest_vodka_otdana</give_info>
<action>escape_dialog.transfer_deneg</action>
<next>8</next>
</phrase>
<phrase id="8">
<text>escape_trader_oops_8</text>
</phrase>
</phrase_list>
</dialog>
Теперь добавим в игру скрипты "передача денег" и "передача водки". Откройте файл gamedata\scripts\escape_dialog.script и перед разделителем "Trader" добавьте туда следующие строки:
function transfer_deneg (npc, actor)
dialogs.relocate_money(stalker, 8000, "in")
end
function otday_vodku (npc, actor)
dialogs.relocate_item_section(npc, "vodka", "out")
end
function have_a_vodka (stalker, player)
return stalker:object ("vodka") ~= nil
end
Готово. Запускайте игру и любуйтесь.
Есть несколько багов, кто исправит, тому пирожок =) Итак:
- второй пункт задания в PDA не отображается - задание не обновляется при подборе бутылки водки (как это реализовать, в принципе понятно, но это как-нибудь в другой раз, сейчас лень) - премиальные не перечисляются Меченому (уу, Сидорович, жид такой)
- премиальные не перечисляются Меченому (уу, Сидорович, жид такой) Это потому, что функцию надо писать так
function transfer_deneg (first_speaker, second_speaker)
dialogs.relocate_money(second_speaker, 8000, "in")
end
Для тех, кто еще с нами - сейчас мы модифицируем квест так, чтобы исключить конфликты с другими подобными модами.
[править] Реализация совместимости
Из-за чего наш мод не может работать вместе с аналогичными ему модами? Да потому, что файлы dialogs_escape.xml и некоторые другие у них пересекаются. Поэтому выделим их отдельно от основных диалогов:
Вместо dialogs_escape.xml мы будем испольховать новый - dialogs_new.xml Вместо stable_dialogs_escape.xml мы будем использовать файл stable_dialogs_new.xml (важно! не знаю почему, но он должен лежать в text\..., а не в text\rus\...)
Соответственно, весь реализованный нами новый контент перекидываем в пустые файлы (соблюдая форматирование), подчистив за собой на старом месте.
Единственное, что останется сделать после установки того же Repair Mod'а - заново добавить ветку диалога Сидоровичу в файле character_desc_escape.xml. Остальное в новом варианте нашего мода переписывать не придется - для диалогов отведено три файла.
Остальные файлы относятся уже к квестовой части и ни с чем пересекаться не могут - где вы видели другие моды с новыми квестами? Я - нет.
Откройте файл gamedata\config\localization.ltx и зарегистрируйте там stable_dialogs_escape.ltx. Потом откройте файл gamedata\config\system.ltx и в разделе "Dialogs" в конце строки (после dialogs_aes) пропишите dialogs_new (без ".ltx"!).
Все. Теперь ваши диалоги будут подгружаться из сторонних файлов.
Отдельное спасибо:
XiaNi - за страшный и непричесанный, но работающий пример квеста, на основе которого я и освоил принципы квестостроения =) Keha – за урок по созданию новых диалогов Dйja Vu – за создание wiki-ресурса
Дополнения
1. Если изменить шапку нашего диалога в файле dialogs_escape.xml со старого варианта на такой, то ветка исчезнет после выполнения задания:
<dialog id="escape_trader_oops">
<precondition>escape_dialog.trader_alredy_give_job</precondition>
<has_info>tutorial_end</has_info>
<dont_has_info>test_quest_vodka_otdana</dont_has_info>
<phrase_list>
...
Не тестировал. Дело за вами =)
2. Разнообразить речь обычных сталкеров не так просто, как кажется – они не выделены в отдельных людей, а используют один и тот же набор реплик, зависящий от локации/мастерства сталкера. Но при этом в пункте "Что можешь интересного рассказать" у каждого сталкера история разная.
Кто сможет разузнать, откуда берутся тексты для этих реплик, тому буду очень благодарен...
3. Неплохо бы добавить реплики гопникам, но это уже на стадии предположений. На данный момент реплик у них нет, так что если вы, например, играете с модом "Улучшенные взаимоотношения" (или как там его) или какими-либо иными способами добились нейтрального/дружеского отношения с их стороны, то при потытке заговорить игра вылетит.
В принципе, можно зарегистрировать новые базы диалогов для бандитов (как было описано выше), созданные по образцу таковых у сталкеров. Но как эти наборы диалогов связать с гуляющими по карте гопниками - вопрос.(ответ от ЖуКа надо редактировать файл character_desc_simulation.xml он используется при респавне неписей)
У меня есть подозрения, что набор диалогов прописывается персонажу в его свойствах в файле all.spawn. Прошу специалистов по spawn-ресурсам посмотреть, имеются у NPC такие свойства или нет.
Фух, вроде всё...
Всем спасибо, занавес =)
Авторы
Статья создана: BAC9-FLCL