Глава 14. Награды
В прошлых Главах мы давали задания, украшали диалоги, выводили текст на экран. Но согласитесь, что немного странно получается: Игрок взял квест, убил пауков и принес яблоко, а в ответ получил лишь «Прощай, Наездник Дракона!», даже спасибо не сказали. Поматросили и бросили, что называется. Конечно, в задания от Теда это вписалось бы идеально, но мы все же делаем квесты для всех NPC, поэтому нам надо бы как-то “заплатить” игроку за его труды. В этой Главе этому как-таки научимся.
Шаг 1. Выдача награды <reward/>
Тег <reward/> – это, грубо говоря, «кошелёк» из которого игра высыпает игроку всё причитающееся. Мы, как квестоделы, лишь кладем туда нужные награды
Размещается он внутри опций (кнопки ли авто). Всего есть 3 вида наград:
| Атрибут | Что дает | Пример использования |
|---|---|---|
| exp | Опыт | <reward exp="СколькоОпыта"/> |
| item + count | Какой-то предмет | <reward item="ИмяПредмета" count="Количество"/> |
| recipe + type | Открывает заблокированный рецепт в Книге Рецептов | <reward recipe="ИмяРецепта" type="ТипВерстака"/> |
Важно! В одном <reward/> можно указать только один тип награды. Нельзя написать: <reward exp="300" item="Apple" count="10"/>. Если наград несколько, то пишите каждую отдельную награду в отдельном <reward/>:
<reward exp="3000"/><reward item="Bone" count="20"/><reward recipe="Sunshard Paula" type="Table"/>
Напомню, что существует 4 типа верстака (стола):
- Player – 2×2 поле крафта в инвентаре игрока
- Table – Верстак
- Furnace – Печка
- Cauldron – Котёл
Шаг 2. Куда ставить награды
Обычно, награды выдают в конце квеста (#end/#end_dark_side), но по факту можете выдавать презент на любом шаге. Сам же тег <reward/> с атрибутами ставится в любую опцию (кнопка или авто)
Добавим награду в #end ветки Хорошего Настроения. Будет выдаваться: 300 опыта, 5 топоров и рецепт Осколка Солнца от Паулы
Было:
<step id="#end"><desc>Прощай, Наездник Дракона! Рад был повидаться</desc><option to="#start" text="Назад"/><option to="#close" text="Пока"/></step>
Стало:
<step id="#end"><desc>Прощай, Наездник Дракона! Рад был повидаться</desc><option to="#start" text="Назад"/><option to="#close" text="Пока"><reward exp="300"/><reward item="Axe" count="5"/><reward recipe="Sunshard Paula" type="Table"/></option></step>
Шаг 3. Проверяем
Чтобы не растягивать хронометраж, на видео был пропущен момент убийства пауков и сбора яблок. Сути для демонстрации не меняет, просто имейте в виду
Шаг 4. Показываем награды
Награды мы выдавать научились, но сейчас это как черный ящик: мало того, что игрок берет задание, не зная, что он за это получит, так еще и в конце ему молча отсыпают награду и прощаются. Всё. Какую именно награду и в каком количестве получил – точно неизвестно, сиди и догадывайся. Непорядок, давайте это исправим.
С помощью тега <rewards> (с S на конце) можно показать игроку, что он получит.
Не путайте:
reward(без S) – ставится в опции и выдает наградуrewards(с S) – ставится в тело (внутрь) шага и показывает список наград
У <rewards> есть атрибут type. От его значения зависит заголовок списка наград, который увидит игрок:
| Атрибут | Значение |
|---|---|
| Award | Показывает заголовок «Награды: »![]() Код: <rewards type="Award">ㅤ<reward item="Axe" count="100"/>ㅤ<reward exp="50"/></rewards> |
| Display | Показывает заголовок «Ты получишь: »![]() Код: <rewards type="Display">ㅤ<reward item="Axe" count="100"/>ㅤ<reward exp="50"/></rewards> |
Запомним:
Display(Ты получишь: ) – Показывается ДО выдачи квеста. Демонстрация, что игрок получит после выполнения квестаAward(Награды: ) – Показывается ПОСЛЕ выполнения квеста. Демонстрация, что игроку сейчас выдадут
Внутри rewards может быть только награды (reward), всё остальное (например, label) будет проигнорировано и не отобразиться
Шаг 5. Добавляем отображение наград
Добавим отображение наград до и после выполнения квеста. Для этого добавим rewards в шаги spider_hunt_step и after_hunt_step с type = Award и Display соответственно:
<step id="spider_hunt_step"><desc>Хорошо. Попробуй убить парочку пауков для разминки. Также принеси мне яблочко, а то я уж больно проголодался</desc><item name="Apple" count="1"/><option to="#close" text="Ок"/><rewards type="Display"><reward exp="300"/><reward item="Axe" count="5"/><reward recipe="Sunshard Paula" type="Table"/></rewards><label location="HUD"><persist/><position x="-200" y="-300"/><scale x="24" y="24"/>[FFAA00]Цель:[-] 2 паука и яблоко</label><info><kill enemy="Spider" count="2"/><collect item="Apple" count="1"/><label>Яблоко: </label><item name="Apple" count="1"/></info><option auto="after_hunt_step"><kill enemy="Spider" count="2"/><collect item="Apple" count="1"/><notify>[00FF00]Задание выполнено![-] \nВернись к Волшебнику!</notify></option></step><step id="after_hunt_step"><desc>Отлично! Ты справился</desc><rewards type="Award"><reward exp="300"/><reward item="Axe" count="5"/><reward recipe="Sunshard Paula" type="Table"/></rewards><option to="spider_hunt_step" text="Уйти"/><option to="#end" text="Ок"><remove item="Apple" count="1"/><reward exp="300"/><reward item="Axe" count="5"/><reward recipe="Sunshard Paula" type="Table"/>
</option><info><label>Вернись к Волшебнику и скажи, что ты убил всех пауков</label></info></step>


Награды отображаются и выдаются, все работает
Шаг 6. Группировка наград
Награды внутри rewards можно группировать через уже известный нам row:
<step id="spider_hunt_step"><desc>Хорошо. Попробуй убить парочку пауков для разминки. Также принеси мне яблочко, а то я уж больно проголодался</desc><item name="Apple" count="1"/><option to="#close" text="Ок"/><rewards type="Display"><reward exp="300"/><row><reward item="Axe" count="5"/><reward recipe="Sunshard Paula" type="Table"/></row></rewards>. . .</step><step id="after_hunt_step"><desc>Отлично! Ты справился</desc><rewards type="Award"><reward exp="300"/><row><reward item="Axe" count="5"/><reward recipe="Sunshard Paula" type="Table"/></row></rewards>. . .</step>


Задания на закрепление
- Сделайте квест для Теда (
Viking), в котором он выдает награду: 150 опыта и 3 Боевых Топора. Игрок видит награду до и после выполния квеста - Сделайте квест, где Алхимик (
ShadowHunter) дарит игроку рецепт Зелья Маны и Зелья Здоровья (изначально эти рецепты у игрока закрыты), а затем просит приготовить их и принести ему. За это он дает игроку несколько Зелий и немного опыта
Заключение
В этой Главе мы научились:
- Выдавать награды через
reward - Показывать игроку список наград До и После выполнения квеста
Теперь, имея все знания из этой и прошлых Глав, вы можете создавать квесты на уровне официальных. Дальнейшие этапы будут рассматривать способы упрощения разработки и сокращения кода (шаблонные шаги), а также работу с изображениями, спецэфектами и анимациями
Итоговый код Главы
<?xml version="1.0" encoding="UTF-8"?><quest npc="Wizard"title="Мой Первый Квест"><step id="#start"><intro>Привет, [FFAA00]как дела[-]?</intro><desc>[FFAA00]Рад[-] тебя снова видеть! Как дела?</desc><option to="bad_mood_step" text="[FF0000]Плохо[-]"/><option to="good_mood_step" text="[00FF00]Норм[-]"/></step><!-- Хорошее настроение --><step id="good_mood_step"><intro>Это хорошо, что хорошо.У меня есть одно плёвое заданьеце для тебя.Готов ли его выполнить?</intro><desc>Снова ты?\nМоё предложение всё ещё актуально.\nГотов приступить?</desc><option to="spider_hunt_step" text="Да"><journal/></option><option to="#start" text="Назад"/></step><step id="spider_hunt_step"><desc>Хорошо. Попробуй убить парочку пауков для разминки. Также принеси мне яблочко, а то я уж больно проголодался</desc><item name="Apple" count="1"/><option to="#close" text="Ок"/><rewards type="Display"><reward exp="300"/><row><reward item="Axe" count="5"/><reward recipe="Sunshard Paula" type="Table"/></row></rewards><label location="HUD"><persist/><position x="-200" y="-300"/><scale x="24" y="24"/>[FFAA00]Цель:[-] 2 паука и яблоко</label><info><kill enemy="Spider" count="2"/><collect item="Apple" count="1"/><label>Яблоко: </label><item name="Apple" count="1"/></info><option auto="after_hunt_step"><kill enemy="Spider" count="2"/><collect item="Apple" count="1"/><notify>[00FF00]Задание выполнено![-] \nВернись к Волшебнику!</notify></option></step><step id="after_hunt_step"><desc>Отлично! Ты справился</desc><rewards type="Award"><reward exp="300"/><row><reward item="Axe" count="5"/><reward recipe="Sunshard Paula" type="Table"/></row></rewards><option to="spider_hunt_step" text="Уйти"/><option to="#end" text="Ок"><remove item="Apple" count="1"/><reward exp="300"/><reward item="Axe" count="5"/><reward recipe="Sunshard Paula" type="Table"/></option><info><label>Вернись к Волшебнику и скажи, что ты убил всех пауков</label></info></step><step id="#end"><desc>Прощай, Наездник Дракона! Рад был повидаться</desc><option to="#start" text="Назад"/><option to="#close" text="Пока"/></step><!-- Плохое настроение --><step id="bad_mood_step" ><intro>Очень жаль! Крепись там</intro><desc>Понимаю, что тебе сейчас не хорошо, крепись там!</desc><option to="brew_health_potion_step" text=":("><journal/></option><option to="#start" text="Назад"/></step><step id="brew_health_potion_step"><desc>Могу предложить тебе сварить Зелье Здоровья. Это должно помочь поднять тебе настроение.</desc><option to="#close" text="Понял"/><label>Вот рецепт:</label><recipe name="Health Potion" type="Cauldron" /><label><scale x="1000" y="8"/>[FFFF00]_[-]</label><row><label>Скрафти Котел</label><item name="Cauldron" count="0"/><label>и помести:</label></row><row><item name="Lilia Flower" count="1"/><item name="water" count="1"/><item name="Energy" count="1"/></row><info><label>Свари Зелье Здоровья по рецепту: </label><recipe name="Health Potion" type="Cauldron" /><label>Относить Волшебнику его [FF0000]не нужно[-]</label><label>Для приготовления потребуются: </label><item name="Cauldron" count="1"/><item name="Lilia Flower" count="1"/><item name="water" count="1"/><item name="Energy" count="1"/></info></step><step id="#end_dark_side"><desc>Я... я тебя понимаю, Наездник Дракона. Крепись, я верю в тебя, а теперь прощай!</desc><option to="#start" text="Назад"/><option to="#close" text=". . ."/></step></quest>


Отличный гайд, но осталось несколько вопросов:
1) Куда делся раздел с кастомным магазином из прошлой версии руководства. В 13.5.0? Его больше нельзя кастомизировать?
2) У Фуза в 13.5.0 есть свой магазин, следовательно, они тоже стали квестовыми НПС и для них можно делать кастомные квесты. Или нельзя?
1) Кастомные магазины полностью убраны (даже для Алхимика, Фуза и Крестьян). Теперь игра не будет подгружать квесты, содержащие в коде тег <store>
В логах будет писать:
Skipped custom quest ‘ИмяКвеста’ from file [Путь до XML-файла квеста]: NPC stores are not allowed in custom quests
UnityEngine.DebugLogHandler:Internal_Log(LogType, LogOption, String, Object)
UnityEngine.Logger:Log(LogType, Object)
UnityEngine.Debug:LogWarning(Object)
QuestManager:AddUserQuests(XmlSerializer, String)
d__77:MoveNext()
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
2) Да, для Фуза можно теперь тоже делать квесты. Список Квестовых NPC только что обновил, просто изначально забыл добавить
Из нюансов: У них пока что нет своего портрета, поэтому будет видно просто имя