Сповіщення
Очистити все

SoC. Створення квестів


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 

Створення квестів та діалогів

Створення базового діалогу

Отже, приступимо до створення діалогу, в якому нам видаватиметься новий квест. Приймаючі особи: Сидорович (С) та Мічений (М)

М: Привіт, Сидорич! Є робітка?

З: О, невже заглянув до нас на вогник, Мічений? Гаразд... ближче до тіла... еээ, до діла. У мене до тебе наступне прохання: збігай до Вовка, у нього щось намічалося.

М: Без проблем! Вже біжу.

Вважатимемо, визначилися із фразами базового діалогу. Тепер необхідно додати його у відповідному вигляді, щоб грі він був «зрозумілий».

Створення «скелету» діалогу.

Для того, щоб додати наш діалог, необхідно відкрити для редагування файл 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_es >
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 _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 >
<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. Якщо всі умови функції дотримуються, то при виконанні цієї функції підзавдання стає виконаною.

<function_call_complete>agroprom_tasks.agr_trader_documents</function_call_complete>

виконує функцію, після завершення підзавдання.

<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. Є такі типи маркерів:
green_location – зелений маркер. Служить зазвичай позначення неживих предметів. Скажімо чийсь труп 🙂
blue_location - синій маркер. Служить метою на людину.
crlc_big – зразкове місце. Наприклад, зона пошуку предмета.

<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. //!!!!!!Не впевнений - не користувався неодноразово. Є ще версія, що видає поршень, як тільки завдання стає виконаним.

<text>esc_help_wounded_from_raid_0</text>

Містить опис підзавдання. Може містити як текст, так і посилання на текст.

Створимо завдання, яке буде потрібно нам для діалогу:

<game_task id="new_task"> 
<title>Поговорити з Вовком</title>
<objective>
<text>Повернутися до Сидорича</text>
<icon>ui_iconsTotal_find_item</icon>
<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>
<map_location_type hint="volk">
green >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> 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>

Всі! Вітаю! Ви щойно написали новий квест.


   
Цитата