[13.5] Создание Своих Квестов для Игры

Reading Mode

Глава 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 типа верстака (стола):

  1. Player – 2×2 поле крафта в инвентаре игрока
  2. Table – Верстак
  3. Furnace – Печка
  4. 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 на конце) можно показать игроку, что он получит.

Не путайте:

  1. reward (без S) – ставится в опции и выдает награду
  2. 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>

Запомним:

  1. Display (Ты получишь: ) – Показывается ДО выдачи квеста. Демонстрация, что игрок получит после выполнения квеста
  2. 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>

Задания на закрепление

  1. Сделайте квест для Теда (Viking), в котором он выдает награду: 150 опыта и 3 Боевых Топора. Игрок видит награду до и после выполния квеста
  2. Сделайте квест, где Алхимик (ShadowHunter) дарит игроку рецепт Зелья Маны и Зелья Здоровья (изначально эти рецепты у игрока закрыты), а затем просит приготовить их и принести ему. За это он дает игроку несколько Зелий и немного опыта

Заключение

В этой Главе мы научились:

  1. Выдавать награды через reward
  2. Показывать игроку список наград До и После выполнения квеста

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

Итоговый код Главы

<?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>

 

2
0

Comments

  1. Northern_77
    Northern_77

    Отличный гайд, но осталось несколько вопросов:
    1) Куда делся раздел с кастомным магазином из прошлой версии руководства. В 13.5.0? Его больше нельзя кастомизировать?
    2) У Фуза в 13.5.0 есть свой магазин, следовательно, они тоже стали квестовыми НПС и для них можно делать кастомные квесты. Или нельзя?

    1
    0
    • Da-Damych
      Da-Damych

      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 только что обновил, просто изначально забыл добавить
      Из нюансов: У них пока что нет своего портрета, поэтому будет видно просто имя

      1
      0

Leave a Reply