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

Reading Mode

Средний

Часть 6. Расширенный <option>

Предупреждение
Теперь, когда мы разобрались с «Базой», можно переходить к самым интересным частям. С помощью информации из Частей ниже можно будет создавать квесты почти любой сложности.
Если Вы всё еще не освоили «Базу» из прошлых Частей, то крайне рекомендую вернуться к ним и побольше попрактиковаться, иначе рискуете не понять ничего из того, что будет дальше.

Опции с вложенными условиями

Далее — условный <option>, условные опции.
Помимо однострочных примитивных безусловных опций, существуют опции с условием. Суть в том, что опция отрабатывает только после выполнения ВСЕХ условий, перечисленных между <option> и </option>.

Пример:

<option auto="next_step">
  <kill enemy="Spider" count="3" />
  <collect item="Apple" count="5" />
  <reward exp="200" />
</option>

По сути, это логическое И. Вот так это работает:
1. Перейти автоматически на шаг «next_step», Если: «Убито 3 паука» И «У игрока в инвентаре есть 5 Яблок» И «Игроку выдана награда в 200 опыта».

Что делает и как работать с атрибутом «auto» и каждым из тегов (kill, collect, notify и т.д.) мы рассмотрим чуть ниже.

У условных опций есть 2 атрибута:

АтрибутЗначение
toНазвание шага
Пояснение: Кнопка. Проверяет условия только в момент нажатия кнопки.
Важно: Несовместимо с автоматическим «auto».
autoНазвание шага
Пояснение: Сам следит за выполнением условий и переходит без нажатия кнопки. Кнопки нет. Используется в скрытых обработчиках.
Атрибуты: check, start (рассмотрим позже).
Важно: Несовместимо с ручным «to», атрибут «text» не нужен.

Также важное примечание: Выдачу заданий нужно выносить в отдельные шаги (hunt_step, например).

Скрытые обработчики

Для этого и много другого мы будем использовать <option> с атрибутом auto (далее — авто-опции).
Авто-опции не показывают кнопку, им не нужен атрибут <text>. Он работает как невидимый контролёр: раз в определенное время проверяет выполнение условий и, когда они будут выполнены, сам переходит на указанный шаг.

У <auto> есть вспомогательные атрибуты:

АтрибутЗначение
startСколько секунд ждать перед первой проверкой. 0 — начинать проверять сразу.
Если атрибут не указан: неявно указывает «start=”0″».
Важно: Если вы хотите добавить таймер, то используйте обязательно start в сочетании с delay, иначе start не будет работать.
Пример: Таймер на 60 секунд, по истечение которого игрока перекидывает на шаг поражения:
<option auto="failed" start="60"><delay sec="60"/></option>
checkИнтервал между проверками (в секундах).
Если атрибут не указан: неявно указывает «check=”0.1″».
Важно: Десятичные дроби указываются только через точку (0.1; 0.5; 1.7), т.е. 0,1 не сработает, т.к. игра это прочитает как 0 и 1. Для большинства проверок рекомендую использовать «check=”0.5″». Исключение: <death /> и какие-то специфичные проверки. Слишком частая проверка, например, 0.01 могут привести к падению производительности!

Важно
Если вы хотите добавить таймер, то используйте обязательно start в сочетании с delay, иначе start не будет работать.

Пример
Таймер на 60 секунд, по истечение которого игрока перекидывает на шаг поражения

<option auto="failed" start="60">
  <delay sec="60"/>
</option>

Если просто оставить <delay /> без start или start без <delay />, то таймер работать не будет!

Теги-условия

ТегОсновной атрибутВспомогательный атрибутОписание
Боевые и смерть
<kill>enemy=”ИмяМоба”count=”СколькоУбить”
Формат: Число
По умолчанию: 1
Проверяет, убито ли указанное количество мобов определённого типа.
Пример: <kill enemy="Spider" count="5" />
<death />НетНетСрабатывает при смерти игрока.
Предметы
<collect>item=”ИмяПредмета”count=”Количество”
Формат: Число
По умолчанию: 1
Проверяет, есть ли у игрока в инвентаре указанные предметы. Не забирает их.
Пример: <collect item="Apple" count="10" />
<remove>item=”ИмяПредмета”count=”Количество”
Формат: Число
По умолчанию: 1
Проверяет, есть ли у игрока в инвентаре указанные предметы. Забирает их.
Пример: <remove item="Apple" count="10" />
Блоки
<place>item=”ИмяБлока”count=”Количество”
Формат: Число
По умолчанию: 1
Проверяет, установил ли игрок нужное количество блоков.
Пример: <place item="Stone" count="10" />
<breakblock>type=”ИмяБлока”
Если любой блок: item=”any”
count=”Количество”
Формат: Число
По умолчанию: 1
Проверяет, разрушил ли игрок нужное количество блоков.
Пример: <breakblock type="Stone" count="10" />
<craft>type=”ТипВерстака”
Верстаки: Table, Furnace, Cauldron, Player
name=”ИмяРецепта”
См. Названия Рецептов
count=”СколькоСкрафтить”
Формат: Число
По умолчанию: 1
Проверяет, скрафтил ли игрок предмет.
Пример: <craft name="Axe" type="Table" count="10" />
Питомцы и животные
<mount>type=”ИмяСущества”
См. Питомцы и Существа
НетПроверяет, оседлал ли игрок определенное существо (Питомец или Босс, например).
Пример: <mount type="Shiva" />
<consume>target=”КтоЕст”
Player или Внутреннее Имя Питомца (См. Питомцы)
item=”ИмяЕды”
См. Еда
Если не указан, то любая еда.
Не работает с <info>!!! Если нужно попросить съесть что-то, то используйте текст в «label».
count=”Количество”
Формат: Число
По умолчанию: 1
Проверяет, съел ли указанный персонаж определённую еду.
Пример: <consume target="Player" item="Apple" count="15" />
<pet>name=”ИмяПитомца”
Указывать Внутреннее Имя Питомца (См. Питомцы)
level=”Уровень”
Формат: Число
По умолчанию: Нет. Обязательно указать свое число.
Проверяет, достиг ли питомец определенного уровня.
Пример: <pet name="BabyDragon" level="50" />
Награды
<reward>3 вида наград:
exp=”Число” — Выдача опыта
item=”ИмяПредмета”
recipe=”ИмяРецепта”
Обязательны для:
Только для item: count=”Количество”
Формат: Число
По умолчанию: 1
Только для recipe: type=”ТипСтола”
Столы: Table, Player, Furnace, Cauldron
Выдача награды. Обычно используется в #end. Комбинировать в одном <reward> несколько наград нельзя. Пишите раздельно.
Пример:
<reward exp="300" />
<reward item="Axe" count="1" />
<reward recipe="BattleAxe" type="Table" />

Типы столов:
1. “Player” — инвентарь игрока
2. “Table” — верстак
3. “Furnace” — печь
4. “Cauldron” — котёл

Приоритеты

Мы помним, что в одном шаге может быть несколько опций. Они проверяются сверху вниз, поэтому важные обработчики (например, смерти) ставьте выше остальных, чтобы игра точно не проворонила нужный момент.

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

  1. Крестьянина выгнали с полей за систематическую лень. Кушать теперь ему нечего, поэтому он просит игрока принести ему 5 хлеба и 6 яблок. Сам он ничего делать не хочет, потому что ему лень. Игрок может отказаться, тогда крестьянин расстроится и квест завершиться, либо согласится и принести ему хлеб и яблоки. За это крестьянин даст ему 3 Опыта, потому что оказалось, что он еще и жадный.
  2. Паула говорит, что питомец-дракон должен питаться правильно, поэтому просит скормить ему Суп из Акульих Плавников, 7 яблок и 3 мяса. После чего игрок должен будет оседлать дракона-питомца. В награду дается 300 Опыта и 10 Монет.
  3. Аарон очень боится Арагога, который опять ошивается в пещерах. Он просит убить его. На все-провсе он дает полчаса (1800 секунд). Если игрок успевает, то Аарон дает ему 600 опыта и Сапоги Воина, если нет — просто говорит, что он теперь сомневается в силах Наездника Дракона и прощается с игроком.
3
0

Leave a Reply