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

Reading Mode

Глава 11. Сбор и сдача предметов

В прошлых Главах мы науичились делать диалоги, кнопки, работать с авто-опциями и даже добавлять задания в Журнал.

Но квесты – это не только убийства и разговоры (удивительно, правда?). В официальных квестах, очень часто NPC просят что-нибудь принести.

Для того, чтобы сделать также мы можем использовать два тега:

Отличия collect/remove

ШагЧто делаетЗабирает ли предмет?Атрибуты
<collect>Проверяет наличие предмета у игрокаНетitem – Имя Предмета
count – Количество (целое число)
<remove>Проверяет наличие предмета у игрока И забирает егоДаitem – Имя Предмета
count – Количество (целое число)

Грубо говоря:

<collect> – охранник, который проверяет наличие у тебя определенной вещи. «Покажи, что у тебя это есть»

<remove> – гопник, который любезно изымает у тебя определенную вещь. «Отдай это мне»

Где брать имена предметов?

Имена предметов ищите в таблице GigaList.xlsx, которая представлена в начале гайда.

В этой Главе будут использоваться эти предметы:

Системное имяРусский перевод
BreadХлеб
AppleЯблоко
BoneКость

Напомню, что Системное имя – это внутреннее имя предмета в игре. В коде используем только его, иначе получите пустой экран и сломаете квест

Шаг 1. Добавим <collect/>

Сначала протестируем collect, проверим как он работает в авто-опциях и как отображается в Журнале, в конце Главы наглядно сравним его с <remove>

Давайте добавим еще одну цель в авто-опции и блок info у шага spider_hunt_step:

Было:

    <step id="spider_hunt_step">
      <desc>Хорошо. Попробуй убить парочку пауков для разминки</desc>

        <option to="#close" text="Ок"/>

      <info>
          <kill enemy="Spider" count="2"/>
      </info>

      <option auto="after_hunt_step">
          <kill enemy="Spider" count="2"/>
      </option>
    </step>

Стало:

    <step id="spider_hunt_step">
      <desc>Хорошо. Попробуй убить парочку пауков для разминки</desc>

        <option to="#close" text="Ок"/>

      <info>
          <kill enemy="Spider" count="2"/>
          <collect item="Apple" count="1"/>
        </info>

      <option auto="after_hunt_step">
          <kill enemy="Spider" count="2"/>
          <collect item="Apple" count="1"/>
      </option>
    </step>

Шаг 2. Адаптируем <desc>

Теперь нужно немного доработать <desc>, чтобы он соответсвовал измененным Целям:

Было:

    <step id="spider_hunt_step">
      <desc>Хорошо. Попробуй убить парочку пауков для разминки.</desc>

        <option to="#close" text="Ок"/>

      <info>
      . . .
        </info>

      <option auto="after_hunt_step">
      . . .
      </option>
    </step>

Стало:

    <step id="spider_hunt_step">
      <desc>Хорошо. Попробуй убить парочку пауков для разминки. Также принеси мне яблочко, а то я уж больно проголодался</desc>

        <option to="#close" text="Ок"/>

      <info>
      . . .
        </info>

      <option auto="after_hunt_step">
      . . .
      </option>
    </step>

Шаг 3. Проверяем

Как видите, после выполнения квеста, яблоки у нас никто не забрал, а квест автоматически пошел дальше

Шаг 4. Работаем с <remove/>

Теперь заменим collect на remove и проверим, что измениться

    <step id="spider_hunt_step">
      <desc>Хорошо. Попробуй убить парочку пауков для разминки</desc>

        <option to="#close" text="Ок"/>

      <info>
          <kill enemy="Spider" count="2"/>
          <remove item="Apple" count="1"/>
        </info>

      <option auto="after_hunt_step">
          <kill enemy="Spider" count="2"/>
          <remove item="Apple" count="1"/>
      </option>
    </step>

Шаг 5. Тестируем

Как видите, образовалась проблема: Как только игрок выполнит все Цели у авто-опции (2 паука и 1 яблоко), то 1 яблоко автоматически удаляется из инвентаря, что выглядит немного странно.

Шаг 6. Шаг-прокладка для <remove/>

Исправить пробелему с автоудалением предмета из инвентаря можно с помощью шага-прокладки. Этим шагом-прокладкой станет after_hunt_step, который мы немного измениим.
Работает так: шаг spider_hunt_step только проверяет выполнение Целей. Как только они выполнены, игрока перебрасывает на шаг after_hunt_step, который уже через обычную кнопку будет забирать предметы через remove

Дорабатываем after_hunt_step

Было:

    <step id="after_hunt_step">
      <desc>Отлично! Ты справился</desc>
        <option to="#end" text="Ок"/>

     <info>
        <label>Вернись к Волшебнику и скажи, что ты убил всех пауков</label>
      </info>

  </step>

 

Стало:

    <step id="after_hunt_step">
      <desc>Отлично! Ты справился</desc>
        <option to="#end" text="Ок">
          <remove item="Apple" count="1"/>
        </option>

     <info>
        <label>Вернись к Волшебнику и скажи, что ты убил всех пауков</label>
      </info>

  </step>

 

Шаг 7. Добавим кнопку Выхода

Кнопка «Ок» будет нажиматься только, если если у игрока будет яблоко в инвентаре. И в этом есть скрытая проблема: что если игрко по пути до NPC потеряет нужный предмет? Тогда игрок просто застрянет в диалоге, так как не сможет банально нажать кнопку.

Как раз для этого мы добавим вторую кнопку «Уйти», чтобы игрок в случае чего мог уйти и собрать по-новой нужные предметы (нашем случае, яблоко).

Помним, что счетчик убийств у каждого шага НЕ сбрасывается при возврате обратно, этим мы и воспользуемся. Кнопка «Уйти» будет возвращать игрока на шаг spider_hunt_step, чтобы напомнить сколько и чего собрать. На счетчик убийств это никак не повлияет и он останется 2/2

    <step id="after_hunt_step">
     <desc>Отлично! Ты справился</desc>

     <option to="spider_hunt_step" text="Уйти"/>
       <option to="#end" text="Ок">
         <remove item="Apple" count="1"/>
     </option>

     <info>
        <label>Вернись к Волшебнику и скажи, что ты убил всех пауков</label>
     </info>

  </step>

 

Шаг 8. Дорабатываем spider_hunt_step

Также нужно исправить spider_hunt_step, иначе квест продолжит удалять предмет из инвентаря игрока. Для этого обратно заменим remove на collect:

    <step id="spider_hunt_step">
      <desc>Хорошо. Попробуй убить парочку пауков для разминки</desc>

        <option to="#close" text="Ок"/>

      <info>
          <kill enemy="Spider" count="2"/>
          <collect item="Apple" count="1"/>
        </info>

      <option auto="after_hunt_step">
          <kill enemy="Spider" count="2"/>
          <collect item="Apple" count="1"/>
      </option>
    </step>

Шаг 9. Проверяем доработки

Теперь, если игрок выполнит все Цели (2 паука + яблоко), его перебросит на after_hunt_step. Яблоки забираются только через кнопку «Ок».

Если игрок, имея яблоко в инвентаре, попробует нажать «Уйти», то его моментально будет перебрасывать обратно. Если же игрок утеряет яблоко по пути к NPC, то он не сможет нажать кнопку «Ок», но при этом, когда нажмет «Уйти», его перебросит обратно на spider_hunt_step и ему обратно добавятся все Цели в Журнал. Счетчики убийств, как мы помним, не сбрасываются при возврате обратно на шаг.

В нашем MyQuest.xml оставим вариант с remove и шагом прокладкой, так как он сочетает в себе сразу и remove, и collect

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

  1. Сделайте задание для Аарона (Warrior), в котром он будет просить принести ему 3 булки хлеба
  2. Сделайте квест для Болтливого Скелета (SkeletonNormal), который будет просить убить 2 скелетовв-магов (SkeletonMage) и 2 скелетов-потрошителей (SkeletonFresh), а также принести их кости (3 шт)

Заключение

В этой Главе мы научились работать с remove/collect, наглядно увидели в чем их отличия, а также узнали “красивый” способ решить сразу несколько проблем. В дальнейшем мы рассмотрим интересный способ, с помощью которого можно будет избавиться от текущего “монстра”, оставив только 1 кнопку «Ок».

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

<?xml version="1.0" encoding="UTF-8"?>
<quest npc="Wizard" title="Мой Первый Квест">
  <step id="#start">
      <intro>Привет, как дела?</intro>
      <desc>Рад тебя снова видеть! Как дела?</desc>
     
      <option to="bad_mood_step" text="Плохо"/>
      <option to="good_mood_step" text="Норм"/>
  </step>

  <!-- Хорошее настроение -->

  <step id="good_mood_step">
      <intro>Это хорошо, что хорошо. У меня есть одно плёвое заданьеце для тебя. Готов ли его выполнить?</intro>
      <desc>Снова ты? Моё предложение всё ещё актуально. Готов приступить?</desc>

      <option to="spider_hunt_step"text="Да">
          <journal/>
        </option>

      <option to="#start" text="Назад"/>
    </step>

  <step id="spider_hunt_step">
      <desc>Хорошо. Попробуй убить парочку пауков для разминки. Также принеси мне яблочко, а то я уж больно проголодался</desc>
      <option to="#close" text="Ок"/>

      <info>
          <kill enemy="Spider" count="2"/>
          <collect item="Apple" count="1"/>
      </info>

      <option auto="after_hunt_step">
          <kill enemy="Spider" count="2"/>
          <collect item="Apple" count="1"/>
      </option>
    </step>

  <step id="after_hunt_step">
      <desc>Отлично! Ты справился</desc>

        <option to="spider_hunt_step" text="Уйти"/>

      <option to="#end" text="Ок">
          <remove item="Apple" count="1"/>
        </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="#end_dark_side" text=":("/>
      <option to="#start" text="Назад"/>
    </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