Глава 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"/><removeitem="Apple" count="1"/></info><option auto="after_hunt_step"><kill enemy="Spider" count="2"/><removeitem="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
Задания на закрепление
- Сделайте задание для Аарона (
Warrior), в котром он будет просить принести ему 3 булки хлеба - Сделайте квест для Болтливого Скелета (
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>
Отличный гайд, но осталось несколько вопросов:
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 только что обновил, просто изначально забыл добавить
Из нюансов: У них пока что нет своего портрета, поэтому будет видно просто имя