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