Создание квестов
Материал из Mod Wiki.
Версия 05:56, 6 июля 2008 (править) Don Reba (Обсуждение | вклад) (форматирование; замена английских кавычек на универсальные) ← К предыдущему изменению |
Текущая версия (01:56, 29 августа 2008) (править) (отменить) Dusty79 (Обсуждение | вклад) (→Внесённые изменения) |
||
(3 промежуточные версии не показаны) | |||
Строка 23: | Строка 23: | ||
Для того, чтобы добавить в игру диалог предусмотрены так называемые тэги. В данном случае, тэгами являются такие конструкции: | Для того, чтобы добавить в игру диалог предусмотрены так называемые тэги. В данном случае, тэгами являются такие конструкции: | ||
- | '''1.''' <game_dialogs> и закрывающий к нему - </game_dialogs> | + | '''1.''' <tt><game_dialogs></tt> и закрывающий к нему - <tt></game_dialogs></tt> |
- | '''2.''' <dialog id = | + | '''2.''' <tt><dialog id = ""> закрывающий - </dialog></tt> |
- | '''3.''' <phrase_list> - </phrase_list> | + | '''3.''' <tt><phrase_list> - </phrase_list></tt> |
- | '''4.''' <phrase id = | + | '''4.''' <tt><phrase id = ""> - </phrase></tt> |
- | '''5.''' <text> </text> | + | '''5.''' <tt><text> </text></tt> |
- | '''6.''' <next> </next> | + | '''6.''' <tt><next> </next></tt> |
В принципе, этих конструкций уже достаточно для того, чтобы создать диалог. Но, диалог, созданный на основе этих конструкций, не сможет стать основой для нового квеста. Для того, чтобы во время диалога вам выдавался квест, есть соответствующий тэг. Но об этом – чуть позже. | В принципе, этих конструкций уже достаточно для того, чтобы создать диалог. Но, диалог, созданный на основе этих конструкций, не сможет стать основой для нового квеста. Для того, чтобы во время диалога вам выдавался квест, есть соответствующий тэг. Но об этом – чуть позже. | ||
Строка 41: | Строка 41: | ||
'''1.''' Определяет содержимое файла (в данном случае, говорит о том, что файл содержит диалоги); | '''1.''' Определяет содержимое файла (в данном случае, говорит о том, что файл содержит диалоги); | ||
- | '''2.''' Определяет новый диалог с id = | + | '''2.''' Определяет новый диалог с <tt>id = ""</tt>. Где содержимое кавычек есть идентификатор диалога. Идентификатор диалога задается в файлах типа character_description_***.xml ; |
- | '''3.''' Этот тэг говорит XML-парсеру игры о том, что далее следуют фразы диалога. Иными словами, между <phrase_list> и </phrase_list> содержатся фразы диалога; | + | '''3.''' Этот тэг говорит XML-парсеру игры о том, что далее следуют фразы диалога. Иными словами, между <tt><phrase_list></tt> и <tt></phrase_list></tt> содержатся фразы диалога; |
- | '''4.''' Этот тэг определяет фразу с id = | + | '''4.''' Этот тэг определяет фразу с <tt>id = ""</tt>. Внутри кавычек содержится идентификатор фразы (ВНИМАНИЕ: идентификатором в данном случае могут быть ТОЛЬКО цифры); |
'''5.''' Внутри этих двух тэгов содержится ссылка на соответствующий данной фразе текст (пример, esc_trader_talk_info_123). Сам текст берется из файлов типа stable_dialogs_*****.xml, в котором содержатся все фразы в текстовом виде. О создании текста фразы поговорим позже; | '''5.''' Внутри этих двух тэгов содержится ссылка на соответствующий данной фразе текст (пример, esc_trader_talk_info_123). Сам текст берется из файлов типа stable_dialogs_*****.xml, в котором содержатся все фразы в текстовом виде. О создании текста фразы поговорим позже; | ||
Строка 53: | Строка 53: | ||
Теперь приступим к тэгам, позволяющим производить какие-то действия во время диалога. | Теперь приступим к тэгам, позволяющим производить какие-то действия во время диалога. | ||
- | <precondition> </precondition>. Представляет собой предусловие, в случае выполнения которого (то есть предусловие вернуло ИСТИНУ) данный диалог, или фраза будут появляться в списке доступных во время игры у NPC. | + | <tt><precondition> </precondition></tt>. Представляет собой предусловие, в случае выполнения которого (то есть предусловие вернуло ИСТИНУ) данный диалог, или фраза будут появляться в списке доступных во время игры у NPC. |
- | <action> </action>. Данный тэг позволяет производить какое-либо действие во время диалога (например, передачу предметов между общающимися... так же позволяет производить более сложные действия). Внутри тэга располагается ссылка на какую-либо функцию (например, dialogs. actor_set_dolg сделает игрока членом группировки Долг). | + | <tt><action> </action></tt>. Данный тэг позволяет производить какое-либо действие во время диалога (например, передачу предметов между общающимися... так же позволяет производить более сложные действия). Внутри тэга располагается ссылка на какую-либо функцию (например, dialogs. actor_set_dolg сделает игрока членом группировки Долг). |
- | <give_info> </give_info>. Позволяет выдавать игроку во время диалога так называемые info_portion'ы (кстати, инфопоршны можно выдавать так же и через <action>, только это потребует создания специальной функции). info_portion – является основой для квестов, info_portion’ы определяются в файлах типа info****.xml. Инфопоршны могут, как начинать квест, так и заканчивать (завершать) его. Так же, с помощью инфопоршнов можно отслеживать действия игрока, для того, чтобы, например, вывести в нужное время диалог. | + | <tt><give_info> </give_info></tt>. Позволяет выдавать игроку во время диалога так называемые info_portion'ы (кстати, инфопоршны можно выдавать так же и через <action>, только это потребует создания специальной функции). info_portion – является основой для квестов, info_portion’ы определяются в файлах типа info****.xml. Инфопоршны могут, как начинать квест, так и заканчивать (завершать) его. Так же, с помощью инфопоршнов можно отслеживать действия игрока, для того, чтобы, например, вывести в нужное время диалог. |
- | <has_info> </has_info> и <dont_has_info> </dont_has_info> являются предусловиями для текущей фразы/диалога. Первый тэг проверяет наличие данного инфопоршна у игрока, второй – отсутствие. | + | <tt><has_info> </has_info></tt> и <tt><dont_has_info> </dont_has_info></tt> являются предусловиями для текущей фразы/диалога. Первый тэг проверяет наличие данного инфопоршна у игрока, второй – отсутствие. |
Ну что, теперь мы можем создать диалог, в котором нам будет выдаваться квест. Но мы не создали самих info_portion'оф, которые позволяет активировать квест. | Ну что, теперь мы можем создать диалог, в котором нам будет выдаваться квест. Но мы не создали самих info_portion'оф, которые позволяет активировать квест. | ||
Строка 67: | Строка 67: | ||
В данном файле нас интересуют только два тэга: | В данном файле нас интересуют только два тэга: | ||
+ | <source lang="xml"> | ||
<info_portion id = ""> </info_portion> | <info_portion id = ""> </info_portion> | ||
+ | </source> | ||
- | <task > </task> | + | <source lang="xml"> |
+ | <task> </task> | ||
+ | </source> | ||
Первый объявляет сам info_portion. Второй – объявляет задание (идентификатор задания id содержится внутри тэга <task>) | Первый объявляет сам info_portion. Второй – объявляет задание (идентификатор задания id содержится внутри тэга <task>) | ||
Строка 75: | Строка 79: | ||
Для примера, создадим 3 info_portion, которые понадобятся нам для будущего квеста: | Для примера, создадим 3 info_portion, которые понадобятся нам для будущего квеста: | ||
+ | <source lang="xml"> | ||
<info_portion id = "new_task_started"> | <info_portion id = "new_task_started"> | ||
+ | </source> | ||
+ | <source lang="xml"> | ||
<task>new_task</task> | <task>new_task</task> | ||
+ | </source> | ||
+ | <source lang="xml"> | ||
</info_portion> | </info_portion> | ||
+ | </source> | ||
Это инфопоршн с именем new_task_started. Он активирует квест с именем new_task. | Это инфопоршн с именем new_task_started. Он активирует квест с именем new_task. | ||
+ | <source lang="xml"> | ||
<info_portion id = "player_talked_with_wolf"> | <info_portion id = "player_talked_with_wolf"> | ||
- | |||
</info_portion> | </info_portion> | ||
+ | </source> | ||
+ | <source lang="xml"> | ||
<info_portion id = "player_complete_new_task"> | <info_portion id = "player_complete_new_task"> | ||
- | |||
</info_portion> | </info_portion> | ||
+ | </source> | ||
===Создание нового квеста=== | ===Создание нового квеста=== | ||
Строка 127: | Строка 139: | ||
По кусочкам: | По кусочкам: | ||
+ | <source lang="xml"> | ||
<game_task id="esc_help_wounded_from_raid" prio="485"> | <game_task id="esc_help_wounded_from_raid" prio="485"> | ||
</game_task> | </game_task> | ||
+ | </source> | ||
Задает имя (id) нового квеста. В данном случае, esc_help_wounded_from_raid. prio = "" задает приоритет задачи. Чем выше приоритет, тем больше вероятность того, что текущий маркер квеста будет переключен на ваше задание. | Задает имя (id) нового квеста. В данном случае, esc_help_wounded_from_raid. prio = "" задает приоритет задачи. Чем выше приоритет, тем больше вероятность того, что текущий маркер квеста будет переключен на ваше задание. | ||
+ | <source lang="xml"> | ||
<title>esc_help_wounded_from_raid</title> | <title>esc_help_wounded_from_raid</title> | ||
+ | </source> | ||
- | + | Задает заголовок квеста. Т. е. его название. Название можно прописать в виде текста, либо в виде ссылки. В данном случае используется ссылка на текст, который хранится в файле string_table_tasks_escape.xml. | |
+ | <source lang="xml"> | ||
<function_complete>escape_tasks.task_fox_complete</function_complete> | <function_complete>escape_tasks.task_fox_complete</function_complete> | ||
+ | </source> | ||
- | + | Вызывает функцию из файла escape_tasks.script под именем task_fox_complete. При выполнении данной функции дается info_portion, который завершает данную подзадачу, в случае, если все условия функции соблюдаются. | |
+ | <source lang="xml"> | ||
<infoportion_complete>escape_fox_heal</infoportion_complete> | <infoportion_complete>escape_fox_heal</infoportion_complete> | ||
+ | </source> | ||
Текущее подзадание будет завершено в случае, если игроку будет дан этот info_portion. | Текущее подзадание будет завершено в случае, если игроку будет дан этот info_portion. | ||
+ | <source lang="xml"> | ||
<infoportion_fail>esc_dogs_return</infoportion_fail> | <infoportion_fail>esc_dogs_return</infoportion_fail> | ||
+ | </source> | ||
Текущее подзадание будет провалено в случае, если игроку будет дан этот info_portion. | Текущее подзадание будет провалено в случае, если игроку будет дан этот info_portion. | ||
+ | <source lang="xml"> | ||
<map_location_type hint="esc_fox">green_location</map_location_type> | <map_location_type hint="esc_fox">green_location</map_location_type> | ||
+ | </source> | ||
Создает указатель на карте с подсказкой esc_fox и типом green_location. | Создает указатель на карте с подсказкой esc_fox и типом green_location. | ||
+ | <source lang="xml"> | ||
<object_story_id>Escape_stalker_from_raid</object_story_id> | <object_story_id>Escape_stalker_from_raid</object_story_id> | ||
+ | </source> | ||
Указывает на sid из файла gamedata\config\game_story_ids.ltx | Указывает на sid из файла gamedata\config\game_story_ids.ltx | ||
+ | <source lang="xml"> | ||
<infoportion_set_complete>garbage_meetstalker_start</infoportion_set_complete> | <infoportion_set_complete>garbage_meetstalker_start</infoportion_set_complete> | ||
+ | </source> | ||
- | Автоматически | + | Автоматически выдаёт этот info_portion, если функция, указанная в поле <function_complete> вернула истину, то есть подзадание выполнено. |
+ | <source lang="xml"> | ||
<text>esc_help_wounded_from_raid_0</text> | <text>esc_help_wounded_from_raid_0</text> | ||
+ | </source> | ||
Содержит описание подзадачи. Может содержать внутри как текст, так и ссылку на текст. | Содержит описание подзадачи. Может содержать внутри как текст, так и ссылку на текст. | ||
Строка 267: | Строка 297: | ||
Теперь бежим в файл character_desc_escape.xml | Теперь бежим в файл character_desc_escape.xml | ||
- | Ищем там NPC с id = "escape_trader" и добавляем два новых <actor_dialog></actor_dialog>: | + | Ищем там NPC с <tt>id = "escape_trader"</tt> и добавляем два новых <tt><actor_dialog></actor_dialog></tt>: |
<source lang="xml"> | <source lang="xml"> | ||
Строка 279: | Строка 309: | ||
</source> | </source> | ||
- | Примечание: <actor_dialog> является диалогом, который активируется самим игроком по желанию. А <start_dialog> активируется только при выполнении определенных условий, заданных в нем, и обычно недоступен. | + | Примечание: <tt><actor_dialog></tt> является диалогом, который активируется самим игроком по желанию. А <tt><start_dialog></tt> активируется только при выполнении определенных условий, заданных в нем, и обычно недоступен. |
Осталось только добавить текст трех диалогов, чтобы наш квест стал полноценным. Открываем файл stable_dialogs_escape.xml и добавляем в него новый текст в таком виде: | Осталось только добавить текст трех диалогов, чтобы наш квест стал полноценным. Открываем файл stable_dialogs_escape.xml и добавляем в него новый текст в таком виде: | ||
Строка 323: | Строка 353: | ||
== Внесённые изменения == | == Внесённые изменения == | ||
*[[Участник:BerSerK™|BerSerK™]] | *[[Участник:BerSerK™|BerSerK™]] | ||
+ | *[[Участник:Dusty79|Dusty79]] | ||
- | + | [[en:Quest creation]] | |
[[Категория:Статьи участников]] | [[Категория:Статьи участников]] |
Текущая версия
Создание квестов и диалогов
Создание базового диалога
Итак, приступим к созданию диалога, в котором нам будет выдаваться новый квест. Участвующие лица: Сидорович (С) и Меченый (М)
М: Здравствуй, Сидорыч! Есть работенка?
С: О, неужели заглянул к нам на огонек, Меченый? Ладно... ближе к телу... эээ, к делу. У меня к тебе следующая просьба: сбегай к Волку, у него что-то намечалось.
М: Без проблем! Уже бегу.
Будем считать, определились с фразами базового диалога. Теперь необходимо добавить его в соответствующем виде, чтобы игре он был «понятен».
Создание «скелета» диалога.
Для того, чтобы добавить наш диалог, необходимо открыть для редактирования файл gamedata\config\gameplay\dialogs_escape.xml
Для тех, кто знаком с языком XML структура данного файла будет ясна с первого взгляда. Но, поподробнее об этом.
Для того, чтобы добавить в игру диалог предусмотрены так называемые тэги. В данном случае, тэгами являются такие конструкции:
1. <game_dialogs> и закрывающий к нему - </game_dialogs>
2. <dialog id = ""> закрывающий - </dialog>
3. <phrase_list> - </phrase_list>
4. <phrase id = ""> - </phrase>
5. <text> </text>
6. <next> </next>
В принципе, этих конструкций уже достаточно для того, чтобы создать диалог. Но, диалог, созданный на основе этих конструкций, не сможет стать основой для нового квеста. Для того, чтобы во время диалога вам выдавался квест, есть соответствующий тэг. Но об этом – чуть позже.
Поясню, что обозначает каждый тэг в отдельности.
1. Определяет содержимое файла (в данном случае, говорит о том, что файл содержит диалоги);
2. Определяет новый диалог с id = "". Где содержимое кавычек есть идентификатор диалога. Идентификатор диалога задается в файлах типа character_description_***.xml ;
3. Этот тэг говорит XML-парсеру игры о том, что далее следуют фразы диалога. Иными словами, между <phrase_list> и </phrase_list> содержатся фразы диалога;
4. Этот тэг определяет фразу с id = "". Внутри кавычек содержится идентификатор фразы (ВНИМАНИЕ: идентификатором в данном случае могут быть ТОЛЬКО цифры);
5. Внутри этих двух тэгов содержится ссылка на соответствующий данной фразе текст (пример, esc_trader_talk_info_123). Сам текст берется из файлов типа stable_dialogs_*****.xml, в котором содержатся все фразы в текстовом виде. О создании текста фразы поговорим позже;
6. Внутри этого тэга содержится ссылка (в числовом формате) на следующую (или следующие) фразы.
Теперь приступим к тэгам, позволяющим производить какие-то действия во время диалога.
<precondition> </precondition>. Представляет собой предусловие, в случае выполнения которого (то есть предусловие вернуло ИСТИНУ) данный диалог, или фраза будут появляться в списке доступных во время игры у NPC.
<action> </action>. Данный тэг позволяет производить какое-либо действие во время диалога (например, передачу предметов между общающимися... так же позволяет производить более сложные действия). Внутри тэга располагается ссылка на какую-либо функцию (например, dialogs. actor_set_dolg сделает игрока членом группировки Долг).
<give_info> </give_info>. Позволяет выдавать игроку во время диалога так называемые info_portion'ы (кстати, инфопоршны можно выдавать так же и через <action>, только это потребует создания специальной функции). info_portion – является основой для квестов, info_portion’ы определяются в файлах типа info****.xml. Инфопоршны могут, как начинать квест, так и заканчивать (завершать) его. Так же, с помощью инфопоршнов можно отслеживать действия игрока, для того, чтобы, например, вывести в нужное время диалог. <has_info> </has_info> и <dont_has_info> </dont_has_info> являются предусловиями для текущей фразы/диалога. Первый тэг проверяет наличие данного инфопоршна у игрока, второй – отсутствие.
Ну что, теперь мы можем создать диалог, в котором нам будет выдаваться квест. Но мы не создали самих info_portion'оф, которые позволяет активировать квест.
Создание info_portion'ов
Итак, открываем файл gamedata\config\gameplay\ info_l01escape.xml. Что мы там видим? Правильно, все ту же структуру XML. В данном файле нас интересуют только два тэга:
<info_portion id = ""> </info_portion>
<task> </task>
Первый объявляет сам info_portion. Второй – объявляет задание (идентификатор задания id содержится внутри тэга <task>)
Для примера, создадим 3 info_portion, которые понадобятся нам для будущего квеста:
<info_portion id = "new_task_started">
<task>new_task</task>
</info_portion>
Это инфопоршн с именем new_task_started. Он активирует квест с именем new_task.
<info_portion id = "player_talked_with_wolf"> </info_portion>
<info_portion id = "player_complete_new_task"> </info_portion>
Создание нового квеста
Сами квесты содержаться в файлах типа tasks_*****.xml
Откроем файл gamedata\config\gameplay\tasks_escape.xml. Структура – все тот же XML.
Для примера исследуем уже существующий квест:
<game_task id="esc_help_wounded_from_raid" prio="485"> <title>esc_help_wounded_from_raid</title> <objective> <text>esc_help_wounded_from_raid_0</text> <icon>ui_iconsTotal_esc_help_wounded_from_raid</icon> <function_complete>escape_tasks.task_fox_complete</function_complete> <infoportion_set_complete>garbage_meetstalker_start</infoportion_set_complete> <article>esc_fox_help</article> </objective> <objective> <text>esc_help_wounded_from_raid_1</text> <map_location_type hint="esc_fox">green_location</map_location_type> <object_story_id>Escape_stalker_from_raid</object_story_id> <infoportion_complete>escape_fox_heal</infoportion_complete> <infoportion_fail>esc_dogs_return</infoportion_fail> </objective> <objective> <text>esc_help_wounded_from_raid_2</text> <map_location_type hint="esc_fox">green_location</map_location_type> <object_story_id>Escape_stalker_from_raid</object_story_id> <infoportion_complete>escape_stalker_done</infoportion_complete> </objective> </game_task>
По кусочкам:
<game_task id="esc_help_wounded_from_raid" prio="485"> </game_task>
Задает имя (id) нового квеста. В данном случае, esc_help_wounded_from_raid. prio = "" задает приоритет задачи. Чем выше приоритет, тем больше вероятность того, что текущий маркер квеста будет переключен на ваше задание.
<title>esc_help_wounded_from_raid</title>
Задает заголовок квеста. Т. е. его название. Название можно прописать в виде текста, либо в виде ссылки. В данном случае используется ссылка на текст, который хранится в файле string_table_tasks_escape.xml.
<function_complete>escape_tasks.task_fox_complete</function_complete>
Вызывает функцию из файла escape_tasks.script под именем task_fox_complete. При выполнении данной функции дается info_portion, который завершает данную подзадачу, в случае, если все условия функции соблюдаются.
<infoportion_complete>escape_fox_heal</infoportion_complete>
Текущее подзадание будет завершено в случае, если игроку будет дан этот info_portion.
<infoportion_fail>esc_dogs_return</infoportion_fail>
Текущее подзадание будет провалено в случае, если игроку будет дан этот info_portion.
<map_location_type hint="esc_fox">green_location</map_location_type>
Создает указатель на карте с подсказкой esc_fox и типом green_location.
<object_story_id>Escape_stalker_from_raid</object_story_id>
Указывает на sid из файла gamedata\config\game_story_ids.ltx
<infoportion_set_complete>garbage_meetstalker_start</infoportion_set_complete>
Автоматически выдаёт этот info_portion, если функция, указанная в поле <function_complete> вернула истину, то есть подзадание выполнено.
<text>esc_help_wounded_from_raid_0</text>
Содержит описание подзадачи. Может содержать внутри как текст, так и ссылку на текст.
Создадим задание, которое потребуется нам для диалога:
<game_task id="new_task"> <title>Поговорить с Волком</title> <objective> <text>Вернуться к Сидорычу</text> <map_location_type hint="escape_trader">blue_location</map_location_type> <object_story_id>Escape_Trader</object_story_id> <infoportion_complete>player_complete_new_task</ infoportion_complete> </objective> <objective> <text>Поговорить с Волком</text> <icon>ui_iconsTotal_find_item</icon> <map_location_type hint="volk">green_location</map_location_type> <object_story_id>Escape_novice_lager_volk</object_story_id> <infoportion_complete>player_talked_with_wolf</ 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>player_complete_new_task</ infoportion_complete> </objective> </game_task>
Здесь же необходимо обязательно указать ссылку на иконку из файла ui_iconstotal, иначе при попытке заглянуть в раздел "Задания" в ПДА при взятии квеста будет происходить вылет. Для примера я проставил иконку поиска предмета.
Теперь создадим скелеты диалогов для нашего квеста. Потребуется три: один для Волка и два для Сидорыча.
<dialog id = "volk_new_quest"> <has_info>new_task_started</has_info> <dont_has_info>player_talked_with_wolf</dont_has_info> <dont_has_info> player_complete_new_task </dont_has_info> <phrase_list> <phrase id = "0"> <text>esc_volk_new_quest_0</text> <next>1</next> </phrase> <phrase id = "1"> <text>esc_volk_new_quest_1</text> <give_info>player_talked_with_wolf</give_info> <next>2</next> </phrase> <phrase id = "2"> <text>esc_volk_new_quest_2</text> <action>dialogs.break_dialog</action> </phrase> </phrase_list> </dialog> <dialog id = "esc_trader_new_quest"> <dont_has_info>player_complete_new_task</dont_has_info> <dont_has_info>player_talked_with_wolf</dont_has_info> <phrase_list> <phrase id = "0"> <text>esc_trader_new_quest_0</text> <next>1</next> </phrase> <phrase id = "1"> <text>esc_trader_new_quest_1</text> <give_info>new_task_started</give_info> <next>2</next> </phrase> <phrase id = "2"> <text>esc_trader_new_quest_2</text> <action>dialogs.break_dialog</action> </phrase> </phrase_list> </dialog> <dialog id = "esc_trader_new_quest_complete"> <dont_has_info>player_complete_new_task</dont_has_info> <phrase_list> <phrase id = "0"> <text>esc_trader_new_quest_complete_0</text> <next>1</next> </phrase> <phrase id = "1"> <text>esc_trader_new_quest_complete_1</text> <give_info>player_complete_new_task</give_info> <next>2</next> </phrase> <phrase id = "2"> <text>esc_trader_new_quest_complete_2</text> <action>dialogs.break_dialog</action> </phrase> </phrase_list> </dialog>
Все «скелеты» добавляем в файл dialogs_escape.xml. Между <game_dialogs> и <dialog id=...>!
Внимательно следите за правильностью написания тэгов и ОДИНАКОВЫМ написанием идентификаций - как в файле с вашим новым диалогом, так и во всех других файлах, где используются тэги или ваши идентификации(например, идентификации фраз в файле с диалогом должны быть такими же, как и идентификации этих же фраз в файле с текстом). Иначе кроме серии вылетов с не всем понятными логами вы ничего не получите. У меня самого были проблемы при попытке активировать квест, выложеный в этой статье, так что пришлось кое-что поправить - и в тэгах, и в идентификаторах.
Примечание: посмотрите на уже готовые диалоги, которые создали разработчики игры – это облегчит вам жизнь.
Теперь бежим в файл character_desc_escape.xml
Ищем там NPC с id = "escape_trader" и добавляем два новых <actor_dialog></actor_dialog>:
<actor_dialog>esc_trader_new_quest_complete </actor_dialog> <actor_dialog>esc_trader_new_quest </actor_dialog>
Там же ищем NPC с id = "esc_wolf" и добавляем один актор_диалог:
<actor_dialog> volk_new_quest </actor_dialog>
Примечание: <actor_dialog> является диалогом, который активируется самим игроком по желанию. А <start_dialog> активируется только при выполнении определенных условий, заданных в нем, и обычно недоступен.
Осталось только добавить текст трех диалогов, чтобы наш квест стал полноценным. Открываем файл stable_dialogs_escape.xml и добавляем в него новый текст в таком виде:
<string id="esc_trader_new_quest_complete_0"> <text>Все, я выполнил поручение Волка!</text> </string> <string id="esc_trader_new_quest_complete_1"> <text>Молодец, Меченый. На тебя можно положиться.</text> </string> <string id="esc_trader_new_quest_complete_2"> <text>Рад был помочь, Сидорыч.</text> </string> <string id="esc_trader_new_quest_0"> <text> Здравствуй, Сидорыч! Есть работенка?</text> </string> <string id="esc_trader_new_quest_1"> <text>О, неужели заглянул к нам на огонек, Меченый? Ладно… ближе к телу… эээ, к делу. У меня к тебе следующая просьба: сбегай к Волку, у него что-то намечалось.</text> </string> <string id=" esc_trader_new_quest_2"> <text>Без проблем! Уже бегу.</text> </string> <string id="esc_volk_new_quest_0"> <text>Здорово, Волк. Меня тут Сидорыч послал, говорит у тебя работа есть.</text> </string> <string id="esc_volk_new_quest_1"> <text>Привет, Меченый. Верь ты ему больше, этому старому маразматику! Все спокойно сейчас. Так что иди к нему и скажи, что все хорошо.</text> </string> <string id="esc_volk_new_quest_2"> <text>Все, ухожу.</text> </string>
Все! Поздравляю! Вы только что написали новый квест.
Авторы
Статья создана: Fr3nzy