Система создания квестов (Quests API)

Назначение системы: Создание единого интерфейса взаимодействия игроков с квестами в игре. Создание единой базы квестов, которую можно использовать в том числе на справочном сайте по всем квестам, предметам и тп. Возможность создания некой рейтинговой системы вида "2е место - Линдир 400/700 квестов". Упрощение создания общеупотребительных квестов до минимального конфига на языке yaml. Создание фреймворка на базе которого можно строить квесты произвольной сложности и логики с помощью скриптового языка типа dg scripts.

Особенности

* - помечены пункты исключенные из первой версии

  1. специальный журнал квестов у чара (макс 25 квестов одновременно). Команда задание, задания, quest
  1. список квестов подсвеченных разными цветами в зависимости от уровня (серый, зеленый, желтый, красный). Состояние выполнения (выполнен). Признак того, что квест периодический.
  2. Возможность посмотреть подробности о квесте, что требуется сделать, на каком этапе находимся, что еще надо собрать/сделать, какую награду дают.
  3. *список уже выполненных квестов
  1. Возможность отменить выполнение любого квеста и взять его заново
  2. Автоматизация частоупотребительных квестов
  1. убить N таких то мобов, M мобов другого вида и тп
  2. собрать столько-то квест итемов из трупов мобов
  1. квест итем грузится для случайного игрока с этим квестом, принимавшем участие в убийстве моба (пока по группе). При этом квест-итем автоматически привязывается к этому игроку.
  2. Квест-итем грузится для всех игроков с квестом, кто принимал участие в убийстве (группа). Т.е взять может каждый, например, голова шелоб.
  1. отнести предмет
  2. сбор каких-то ингов и сдача их по набору N штук
  3. сказать нужную фразу
  4. сходить поговорить с мобом, чтобы получить следующий квест
  5. *квест итем выпадает из мобов и дает квест
  6. *собрать итемы которые сами появляются в нужных местах и доступны только тем у кого квест.
  7. *охранять моба, проводить моба к выходу (guarding)
  8. *проэксплорить область
  1. Автоматизация выдачи и сдачи квестов у мобов
  1. специальный знак [!] или [?] перед мобом означает, что он дает или принимает квест. Желый знак - квест одноразовый, синий знак - квест повторяемый. Серый восклицательный означает, что тут можно будет взять квест через несколько уровней. Серый вопрос означает, что квест тут сдается, но он еще не выполнен (не выполнены objectives). Приоритет: желтый ?, желтый !, серый ? (одноразового квеста), серый ! (одноразового квеста), синий ?, синий !, серый ? многоразового квеста, серый ! многоразового квеста
  2. команды работы с квестами у мобов
  1. Автоматизация награды
  1. автоматический расчет кол-ва денег в зависимости от уровня и типа квеста (можно указать ручное значение)
  2. автоматический расчет экспы аналогично (можно указать ручное значение)
  3. автоматический расчет славы аналогично (можно указать ручное значение)
  4. возможность выбрать из N предметов свою награду
  5. возможность получить N предметов в награду сразу
  6. возможность не давать награду
  7. автоматизация замакса экспы, славы, денег
  8. *радужные медали в награду
  1. Возможность расшарить квест согрупникам (если у них выполнены требования)
  2. Возможность автопредложения квеста (процедура предложения описана в отдельной главе) в следующих ситуациях:
  1. Возможность после завершения квеста сразу предложить следующий квест из серии (если моб его имеет)
  2. Возможность предложить квест при заходе чара в комнату (если чар ему соответствует)
  3. Шаринг квеста согрупникам
  4. При взятии квеста типа РазВРесетЗоны автоматически шарить согрупникам
  1. Возможность автоматически добавить квест игроку, если есть место, не спрашивая его согласия.
  2. Возможность создавать серии связанных квестов (по сути 1 квест = 1 шаг)
  3. Повторяемые квесты (daily) - выполнить которые можно раз в день с возможностью замакса славы/денег и экспы если они в награде. За первое выполнение дейли квеста можно давать другую награду (оформить можно  в виде серии: 1й шаг обычный квест, 2й шаг дейли квест который для взятия требует сделанного обычного)
  4. Описание квестов в yaml для каждой зоны (типа 441.quest)
  5. Триггерное API
  1. Возможность триггерно реализовывать quest objectives и контроль их выполнения.
  1. Заранее создаем список задач в виде идентификатора задачи и описания
  2. Можно ставить задаче completed/progress (Для выполнения квеста вцелом надо поставить всем objectives status = completed)
  1. Возможность автоматически добавить новый квест игроку в журнал заданий
  2. Возможность триггернуть событие квеста, например greeting (только у моба который выдает этот квест)
  3. новый тип триггера QuestEvent. По аналогии с Reset Var, приходят переменные: event, quest_vnum, actor. В определении параметров триггера можно через запятую задать номера квестов или *

Формат квеста

Необязательные блоки и поля отмечены курсивом. Обязательные жирным цветом (если секция куда вложены параметры не отмечена жирным, то отмеченные жирным параметры обязательны в пределах этой секции, т.е если она указана). Варианты значений отделены знаком ‘|’. Знаком # - помечены комменты. Подчеркнуты значения по умолчанию.

- vnum: номер квеста (vnum)

 *extends: номер базового квеста

 level: уровень квеста

 title: название квеста

 description: Описание квеста. Предистория, что нужно сделать, где.

 type: Соло|Группа|Рейд

 period: Одноразовый|РазВДень|ПоМереСбора|РазВРесетЗоны

 begin_mob_vnum: vnum моба который выдает квест

 end_mob_vnum: vnum моба который принимает квест

 sharable: 1|0

 events:

   greeting:

     speech: [line1, line2, ..., lineN]

     offer:

       type: Соло|Группа

       quest: номер квеста|Этот|Следующий

       ask: Спрашивать|НеСпрашивать

   progress: аналогично

   completion: аналогично

   start: аналогично

 timeout: время в секундах на выполнение квеста

 prerequisites:

   quests: [quest1, quest2, ..., questN]

   classes: [class1, class2, ...,classN]

   align: [СВЕТ, ТЬМА]

 provided:

   - vnum: номер предмета1

   - vnum: номер предмета2

   #...

 automate:

   death:

     - obj_vnum: номер предмета

       mob_vnum: номер моба

       percent: <процент загрузки>|100

       loot: Случайному|Всем

#...

 objectives:

   type: УбитьМоба|ПринестиКвестПредметы|ПринестиЛюбойИлиВсеПредметы| ОтнестиПредмет|Ручной|Фраза|Поговорить

   tasks:

     # блоки далее зависят от objectives.type

     # УбитьМоба

     - vnum: номер моба которого надо убить

       count: сколько убить|1

       #...

     # ПринестиКвестПредметы, ПринестиЛюбойИлиВсеПредметы

     - vnum: номер предмета

       corpse_mob_vnum: номер моба из которого труп (vnum должно быть -1)

       count: кол-во предметов|1

     #...

     # ОтнестиПредмет - без параметров

     # Ручной - objectives задаются описательно. Автоматической проверки на выполнение не проиходит.

     # Нужно для реализации произвольной логики выполнения квеста в триггерах.

     - name: objective1 (Название задачи для ссылки в триггерах)

       description: Описание задачи, отображается в блоке Задачи информации о квесте

     #...  

     # Фраза

     - phrase: строка|regexp

     # ...

     # Поговорить – без параметров

 reward:

   money: кол-во денег|Авто

   exp: кол-во экспы|Авто

   slava: кол-во славы|Авто

   maxing:

     money: число до макса|5 + уровень

     slava: число до макса|5 + уровень

     exp: число до макса|5 + уровень

   items:

     type: ОдинИз|Случайный|Все

     # ОдинИз, Все

     items:

       - vnum: номер предмета в награду

       #...

     # Случайный

     percent: процент получения вообще предмета|100

     items:

       - vnum: номер предмета в награду

       #...

Описание полей и блоков квеста

vnum

обязательное

Уникальный номер квеста. Обычно формируется как номер_зоны + порядковый номер.

Используется в частности для создания цепочек квестов.

extends

Конструкция для наследования квеста. Чтобы в серии похожих квестов не надо было каждый раз указывать повторяющиеся поля, а только переопределить нужные.

Номер может быть только один и квест должен быть загружен ДО наследования.

level

обязательное

Уровень квеста. Взять квест можно на уровне (level-3). Также определяет цвет квеста:

красный: текущий левел меньше уровня квеста более чем на 4 (оч. высокая сложность)

желтый: текущий левел -3..+3 от уровня квеста (нормальная сложность)

зеленый: текущий левел +4..+10 от уровня квеста (легкий)

серый: текущий левел +11 и выше от уровня квеста (элементарный)

От уровня также зависит кол-во награды в виде монет и экспы если не задано вручную.

Также: зеленые и серые квесты не предлагаются игрокам по событиям и секции offer.

title

обязательное

Название квеста. Длина не более 5-8 слов.

description

обязательное

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

type

Тип квеста. Значение одно из: Соло|Группа|*Рейд (по умолчанию Соло)

От типа квеста зависит пока только автоматический расчет награды.

period

Переодичность выполнения квеста. Значения: Одноразовый|РазВДень|ПоМереСбора|РазВРесетЗоны (по умолчанию Одноразовый)

Одноразовый - выполнить можно единожды за жизнь персонажа

РазВДень - Периодический. Выполнять можно раз в день (время с выполнения предыдущего должно быть больше 24 часов). Одновременно можно делать не более 1 периодического квеста у одного квестодателя (если есть квест за предыдущий день, нельзя взять новые, нужно отменить старый)

ПоМереСбора - Периодический. В objectives надо указавать, что надо приносить, чтобы получить награду. Для реализации квестов типа “За каждые 10 трупов бабочек  я дам тебе 1 монету”.

РазВРесетЗоны - Периодический. Квест автоматически фейлится если ресетится зона. Квест данного типа взять можно только 1 квест на зону. При взятии кем-то, всем в группе предлагается этот квест если sharable=1 и type = Группа (процедура автопредложения квеста в соотвествующем разделе). Квест такого типа не сохраняется в ренте.

begin_mob_vnum

vnum моба который выдает данный квест. Если вы указываете greeting и прочие события, то убедитесь, что квест выдает тот, кто может говорить :)

Если это поле не указано, то квест никем не выдается. *Выдавать его можно с помощью, например, триггеров.

end_mob_vnum

vnum моба принимающего выполнение квеста. Если это поле не указано, то считается равным begin_mob_vnum. *В случае если не указано ни end ни begin, квест заканчивать надо триггерно.

sharable

Значение: 0|1

Можно ли расшарить данный квест согрупнику (если он соотвествует требованиям)

По умолчанию 1

events

Блок с событиями и *callback функциями (пока не реализовано). Используется для интерактивного привествия квестодателем, реакции на некоторые события. Описание событий:

  1. greeting - Событие срабатывает когда игрок входит или телепортируется к квестодателю и при этом он не выполнял ранее этого квеста, соответствует требованиям и не выполняет в данный момент этот квест. Также квест для игрока не серый. В случае если у квестодателя несколько квестов у которых выполняется событие greeting, то оно выполнится только у первого в списке (с меньшим vnum)
  1. speech: список строк, которые квестодатель скажет напрямую игроку(имя сказал вам: “”). Параметры act(): ch=моб, obj=NULL, vict_obj=actor. Пример строчки: Привет тебе $N!. Больше примеров можно посмотреть в разделе Тестовые квесты.
  2. offer – Секция автопредложения квеста при срабатывании события. Может быть указана для любого события квеста.
  1. type: Соло|Группа, Кому предлагается квест. Соло – только одному игроку (кто триггернул событие). Группа – игроку и его группе. По умолчанию Соло
  2. quest: номер|Этот|Следующий – Идентификация квеста для автопредложения. Номер – vnum квеста, Этот – текущий квест (чье событие), Следующий – следующий в цепочке.
  3. ask: Спрашивать/НеСпрашивать, Спрашивать - нужно согласие игрока. НеСпрашивать – добавляется без согласия если есть место. По умолчанию Спрашивать.
  1. progress - Событие срабатывает когда игрок пытается сдать невыполненный квест. Значения аналогично.
  2. completion - Событие срабатывает когда игрок успешно сдал квест. Здесь можно его поздравить с выполнением и тп. Значения аналогично.
  3. start - Событие наступает, когда игрок взял квест на выполнение. Значения аналогично.

timeout

Значение число больше 0. Собственно время в течение которого необходимо выполнить квест. Если не успеть, квест будет автоматически провален. Время задается в секундах, но работает как абсолютное смещение. Т.е зайдя на ренту и выйдя на следующий день квест будет автоматически профейлен. В описании квеста пишется сколько времени будет на выполнение или сколько осталось если квест взят.

prerequisites

Требования для взятия этого квеста. Чтобы взять квест, нужно удовлетворять всем требованиям плюс требованию по уровню (см level)

  1. quests - Список квестов которые необходимо сделать, чтобы взять данный. Для создания цепочек квестов. По умолчанию выполнять других квестов не надо.
  2. classes - Список классов, которые могут взять данный квест. По умолчанию любой класс: Маг, Лекарь, Вор, Воин, Паладин, Следопыт, Друид, Варвар, Рыцарь смерти, Лучник
  3. align - Список. Направленность персонажа для взятия квеста, одна из: СВЕТ, ТЬМА. По умолчанию пустой список - взять может любой.

provided

Список предметов, которые даются игроку вместе с взятием этого квеста. Например, письмо, ключ и тп. Для квестов отличных от РазВРесетЗоны нельзя делать в качестве предметов предметы удаляемые с ресетом зоны и не рентящиеся.

automate

Секция автоматизации стандартных действий в квестах.

  1. death - Секция описывает автоматически загружаемые предметы в мобов при их смерти. Параметры одного элемента списка:
  1. obj_vnum - номер квестового предмета. Обязательное если есть секция,
  2. mob_vnum - номер моба в труп которого будет загружен предмет. Обязательное если есть секция.
  3. percent - вероятность загрузки. По умолчанию 100
  4. loot: Случайному|Всем Каким способом лутится предмет (по умолчанию Случайному):
  1. Случайному – после того как взяли предмет из трупа, из трупа он исчезает.  При загрузке предмет автоматически привязывается к случайному игроку из тех, кто принимал участие в убийстве моба,  у кого есть этот квест и у кого еще не выполнены objectives на этот предмет.
  2. Всем – предмет остается в трупе и взять его может каждый из группы. Для реализации квестов типа убить шелоб и отнести ее голову кому-то. У предмета обязательно должен быть установлен флаг ITEM_UNIQUE и ITEM_SOULBOUND, чтобы один  игрок не мог взять более одного предмета.

objectives

обязательное

Задачи квеста. Что необходимо сделать, чтобы квест автоматически выполнился и его можно было сдать.

  1. type - тип заданий которые надо выполнить. Один из: УбитьМоба|ПринестиКвестПредметы|ПринестиЛюбойИлиВсеПредметы| ОтнестиПредмет|Ручной|Фраза|Поговорить
  1. УбитьМоба - Необходимо убить заданных мобов в необходимом количестве. Моб засчитывается, если последний удар нанесен игроком или петом, согрупником находящимся в той же комнате. Список tasks:
  1. vnum - vnum моба, которого нужно убить
  2. count - сколько мобов нужно убить (по умолчанию 1)
  1. ПринестиКвестПредметы - Для выполнения квеста нужно иметь в инвентаре(или в контейнерах в инвентаре, экипировке) необходимое кол-во квест предметов. Список:
  1. vnum - номер предмета. Может быть -1 для трупов и вещей без пототипов.
  2. corpse_mob_vnum - vnum моба из которого труп. Нужно указать, если предмет является трупом.
  3. count - Количество предметов, которые надо иметь. Стеки считаются. По умолчанию 1.
  1. ПринестиЛюбойИлиВсеПредметы - Для выполнения квеста необходимо выполнить любой (не обязательно все) из objectives (собрать нужное кол-во ингредиентов). Например, собрать 5 шишек или 10 еловых шишек. Список аналогично списку ПринестиКвестПредметы.
  2. ОтнестиПредмет - Для выполнения квеста нужно отнести предметы указанные в секции provided мобу end_mob_vnum. Параметров нет.
  3. Ручной - Выполнение objectives проверяется и меняется триггерно. Список:
  1. name: Идентификатор задачи, нужен для ссылки на эту задачу в триггерах. Например, objectives1, objectives_get_item и тп. У других типов задач это поле формируется автоматически.
  2. description: Описание задачи для отображения в информации о квесте, например, “Разрублен кокон”. У других типов задач это поле формируется автоматически.
  1. Фраза - Для выполнения квеста необходимо сказать ключевую фразу или одну из фраз. Задать можно в виде строки или регулярного выражения. В случае строки проверка происходит по полному совпадению без учета регистра. Список:
  1. phrase: строка или регулярное выражение (строка в //)
  1. Поговорить – Нужно найти нужного моба и “поговорить” с ним. Т.е сдать ему квест. Моб, к которому нужно сходить задается параметром end_mob_vnum.

reward

Секция награды за выполнение квеста. Награда дается _каждому_, кто выполнил и сдал этот квест. Если нужно дать, например, одну буку на всю группу это делается через триггер типа QuestEvent на событие completion.

money: кол-во монет|Авто, 0 – не выдаются деньги. Авто – автоматический расчет.

exp: кол-во экспы|Авто, 0 – не дается экспа. Авто – автоматический расчет.

slava: кол-во славы|Авто. 0 - не дается слава. Авто – автоматический расчет.

Значения по умолчанию зависят от периодичности квеста:

  1. Одноразовый
  1. money:  Авто
  2. exp: Авто
  3. slava: 0
  1. РазВДень
  1. money: Авто
  2. exp: 0
  3. slava: 0
  1. ПоМереСбора
  1. money: 0
  2. exp: 0
  3. slava: 0
  1. РазВРесетЗоны
  1. money: Авто
  2. exp: 0
  3. slava: 0

maxing – Секция конфигурирования параметров  замакса награды в квесте

  1. money – Количество выполнений квеста после чего начнется замакс этой награды (замаксенная награда не выдается). Если указан 0, то замакса не будет. По умолчанию 5 + уровень квеста.
  2. exp -  Замакс выдаваемой экспы. По умолчанию 5 + уровень квеста.
  3. slava – Замакс выдаваемой славы. По умолчанию 5 + уровень квеста.

items - Если этот блок указан, то за выполнение квеста полагается предмет или несколько предметов.

  1. type: ОдинИз|Случайный|Все – тип выбора предмета (по умолчанию ОдинИз)
  1. ОдинИз – Нужно выбрать один из предложенных предметов. При этом предмет помещается в инвентарь. Если мест недостаточно или вес слишком велик выводится сообщение и сдача квеста не выполняется.
  2. Случайный – Случайный предмет из списка. В информации о квесте не показывается конкретный предмет и нельзя сделать опознание. Фраза типа “Неизвестная награда”.
  1. percent – вероятность вообще получить предмет (по умолчанию 100). Вещественое число, может быть 0.001%
  1. Все – Аналогично типу ОдинИз, только выбирать не надо, даются все предметы в награду.
  1. items – секция со списком предметов в награду:
  1. vnum – номер предмета в награду

Триггерное API

К char/mob добавляется набор новых функций:

  1. %actor.is_on_quest(номер задания)%
  1. return: 0 или 1
  2. Выполняет ли actor в данный момент это задание. Если actor - моб, всегда 0
  3. Пример: if %actor.is_on_quest(4000)% ...
  1. %actor.eligible_for_quest(номер задания)%
  1. return:
  2. 0 – чар удовлетворяет требованиям задания и может его взять на выполнение
  3. -1 - задание не найдено
  4. значения больше нуля - чар не удовлетворяет требованиям задания. Значения:
  1. 1 - уже выполняет данное задание
  2. 2 - уже выполнено (доложено) задание
  3. 3 - не хватает уровня
  4. 4 - не правильный класс
  5. 5 - не выполнен один из предшествующих квестов
  6. 6 - пауза на выполнение (кулдаун)
  7. 7 - направленность (align) не та
  1. Пример:
  1. if (%actor.eligible_for_quest(4000)% == 4)
  1. %actor.get_quest_status(номер задания)%
  1. return: status задания
  2. Возвращает текущий статус задания или пустую строку если такого задания нет у чара. Статусы:
  1. в работе - в процессе выполнения
  2. выполнено
  3. провалено
  1. Пример: if %actor.get_quest_status(4000)% == “выполнено”
  1. %actor.trigger_quest_event(“номер задания” “событие” “actor”)%
  1. событие: идентификатор события. См. секцию events.
  2. actor: кто как-бы активирует событие, кому будут сообщения высылаться. Должен быть игрок (UID или в крайнем случае алиас)
  3. return: 0 или 1. 0 – если произошла какая-то ошибка выполения
  4. Вызывать функцию необходимо у моба выдающего или принимащего квесты, у других чаров вызов вернет ошибку.
  5. Пример:
  1. %self.trigger_quest_event(4000 greeting %actor%)%
  1. %actor.offer_quest(“номер задания” “спрашивать” “тип”)%
  1. Предложить задание игроку. Можно не спрашивать его согласия и сразу добавить задание в журнал если есть место.
  1. спрашивать – параметры аналогичные events.offer.ask (не обязательный параметр, по умолчанию - Спрашивать)
  2. тип – тип шаринга: одно из значений events.offer.type (не обязательный параметр, по умолчанию Соло)
  3. return: 1 - все ок, 0 - ошибка (задание не предложено)
  4. Примеры:
  1. %actor.offer_quest(4000 Спрашивать Соло)%
  2. %actor.offer_quest(“4000” “НеСпрашивать” “Группа”)%
  3. %actor.offer_quest(4000)%
  1. %actor.set_quest_task_status(“номер задания” “идентификатор задачи” “status”)%
  1. идентификатор задачи: это objectives.task[i].name
  2. status: один из возможных статусов для задачи:
  1. в работе
  2. выполнено
  3. провалено
  1. return: 0 не удалось выполнить операцию, 1 – все ок
  2. Изменение статуса задачи автоматически вызывает общую проверку на выполнение задания, т.е может изменится поле status задания. Также выводится сообщение игроку вида Журнал заданий обновлен: Задание “fddff” провалено. Для того, чтобы задание было в состоянии выполнено нужно выполнить все подзадачи, т.е вызвать функцию сколько нужно раз.

Триггер типа QuestEvent

Флаг: q

Тип триггера: монстр

Описание: Триггер этого типа вызывается у моба выдающего квест или у моба принимающего квест, когда срабатывает событие квеста. Т.е аттачить триггер к другим мобам смысла нет.

Аргумент: Не используется

Числовой аргумент: Шанс, что триггер будет запущен (0-100)

Возвращаемое значение: Не используется

Переменные:

quest_vnum – номер квеста

event - тип события (одно из events)

self – моб выдающий или принимающий задание

actor - персонаж который вызвал событие квеста

Советы для билдеров

Некоторые пока общие советы по созданию квестов.

Все новые квесты ДОЛЖНЫ проходить через новую систему. По возможности также необходимо переделывать старые квесты, чтобы они были под контролем этой системы.

Квесты должны быть по большей части локальные, т.е находится недалеко от места их выполнения, к примеру:

  1. Перед входом в зону стоит старик и выдает квесты
  2. В начале зоны располагается лагерь неких мобов, где несколько мобов выдают квесты

Квесты должны быть на 90% одноразовыми и состоять из нескольких шагов. На последнем шаге выдавать награду получше: вещи

По возможности все квесты “РазВДень” должны открываться цепочками одноразовых.

Общие советы

1. Большой квест  в зоне необходимо разбивать на несколько мелких частей, каждая из которых  выполняет задачи одного типа

2. уровень квеста задается как уровень самого старшего моба в квесте минус 2

3. тип=группа ставится на квесты если  в них надо убить босса и где в одиночку даже зеленый квест не сделать (большие гопы мобов и тп). В частности все зоны для 30х являются групповыми.

4. Один моб-квестодатель дает одновременно только один периодический квест игроку. Т.е у одного моба можно только по очереди делать повторяемые квесты.

5. Один моб-квестодатель не должен одновременно давать более 3-4х квестов

Примеры

Это не совсем рабочие примеры, многие параметры проставлены пока от фонаря.

Рабочие примеры можно посмотреть в файле 040.quest в серверной версии для билдеров.

0. Минимальный квест

Убить бабочку на дереве. Моб 2105 не выдает никаких привествий. При сдаче квеста получаем немного денег и экспы.

- vnum: 2100

 begin_mob_vnum: 2105

 level: 3

 title: "Убить бабочку на дереве"

 description:

   "На дереве живет большая бабочка, которая прилетает на грядки с капустой

   и откладывает яйца из которых потом появляются гусеницы и

   едят мою капусту.\n\n

   Иди и убей эту бабочку.

   Найти ее можно на севере от площади, в ветвях дерева."

 objectives:

   type: УбитьМоба

   tasks:

     - vnum: 2106

1. мальчик на дереве

Реализация квеста по новой системе (без триггеров) с некоторой модификацией логики. За первый сданный квест дается большая награда:

- vnum: 2100

 begin_mob_vnum: 2109

 level: 4

 title: "Очищение дерева от насекомых"

 period: Одноразовый

 events:

   greeting:

     speech:

       - Привет, $n!

         Отец велел мне перебить этих противных насекомых!

         Он обещал мне по 2 монеты за каждого! Но я сломал свою рогатку...

         ВО! ЗНАЧИТ ТАК!

         Ты мне приносишь труп жучка, червяка или паучка

         А я даю тебе 1 монету за каждого! По рукам?!

       - Как брать и сдавать задание - СПРАВКА ЗАДАНИЕ

   progress:

     speech:

       - |

         Но ты еще не убил$k нужного количества!

         

         Иди и поторопись!

   completion:

     speech: ["Спасибо! Ты мне сильно помог$y! Можешь теперь приносить мне любое кол-во трупов этих насекомых и я будут тебе давать 1 монету за каждого!"]

 description: |

   Мальчик на дереве дает 1 монету за каждый труп жучка, червяка или паучка.

 objectives:

   type: ПринестиКвестПредметы

   tasks:

     - vnum: -1

       corpse_mob_vnum: 2108

     - vnum: -1

       corpse_mob_vnum: 2109

     - vnum: -1

       corpse_mob_vnum: 2110

 reward:

   money: 15

- vnum: 2101

 begin_mob_vnum: 2109

 level: 5

 period: ПоМереСбора

 title: "Очищение дерева от насекомых"

 description: "Мальчик на дереве дает 1 монету за каждый труп жучка, червяка или паучка."

 prerequsites:

   quests: [2100]

 objectives:

   type: ПринестиЛюбойИлиВсеПредметы

   tasks:

     - vnum: -1

       corpse_mob_vnum: 2108

     - vnum: -1

       corpse_mob_vnum: 2109

     - vnum: -1

        corpse_mob_vnum: 2110

 reward:

   money: 1

Как работает:

- В комнату с мальчиком заходит или телепортируется игрок

- Если игрок не делал квеста 2100, то перед мальчиком горит желтый восклицательный знак и мальчик выдает привествие (greeting event)

- мальчик перестает что либо брать себе в инвентарь

- если игрок соглашается на квест, то пишет “взять или получить” и получает задание:

Ваш журнал заданий обновлен: Новое задание “Очищение дерева от насекомых”

- задания список:

#2100 “Очищение дерева от насекомых”

- задания инф 2100

Задание: Очищение дерева от насекомых

Описание: ...

Задачи:

1. Принести 1 труп жучка

2. Принести 1 труп паучка

3. Принести 1 труп червяка

Награда:

15 монет

- Идем убиваем мобов, собираем нужные трупы. После сбора необходимого числа трупов появляются надпись:

Журнал задний обновлен: Задание “Очищение дерева” выполнено

задания список

#2100 “Очищение дерева от насекомых” (Выполнен)

задания инф 2100

Задание: Очищение дерева от насекомых

Описание: ...

Задачи:

1. Принести 1 труп жучка (выполнено)

2. Принести 1 труп паучка (выполнено)

3. Принести 1 труп червяка (выполнено)

Награда:

15 монет

- Идем к мальчику. У мальчика перед именем появляется желтый знак вопроса. Пишем “сдать”. Мальчик говорит:

        Спасибо! Ты мне сильно помог$y! Можешь теперь приносить мне любое кол-во трупов этих насекомых и я будут тебе давать 1 монету за каждого!

  1. Теперь нам доступен квест 2101. У мальчика перед именем горит серый вопрос.
  2. Если набрать список, то в списке будет виден квест 2101 Очищение дерева от насекомых, можно набрать информация 2101

- Собираем трупы, приносим, пишем сдать, получаем награду. Взять квест с типом “ПоМереСбора” нельзя.

2.  Вы должны найти и убить Драконицу молнию

Все автоквесты конвертируются в список, типа такого (без триггеров):

- vnum: 3001

 type: Группа

 level: 30

 begin_mob_vnum: <квестер_мт_vnum>

 period: РазВДень

 title: "Убить драконицу Молнию"

 description: |

   Огненно-красная драконица начала совершать

   нападения на наши стада. Она безжалостно убила

   пастухов, защищающих стада. Надо убить драконицу прежде,

   чем она обречет нас на голодную зиму."

 objectives:

   type: УбитьМоба

   tasks:

     - vnum: 21013

 reward:

   slava: Авто

 

 

Как работает:

- Приходим к автоквестеру. У него горит синий [!]

- пишем “список”. Получаем список заданий которые можно взять.

- берем задание, например, получить 7855 или получить убить драконицу молнию

Журнал заданий обновлен: Новое задание “Убить драконицу молнию”.

- Выполнять его можно любое кол-во времени, но не чаще раза в день. Т.е после выполнения, этот квест нельзя взять в течение дня.

- Убиваем драконицу.

Журнал заданий обновлен: Задание “Убить драконицу молнию” выполнено.

- Идем к автоквестеру. Перед ним горит синий знак [?]

- пишем доложить, получаем награду.

3.  сова

убиваешь сову, с нее выпадает камушек

несеш камушек старику

он дает 100 монет

Реализация по новой системе (без триггеров):

- vnum: <vnum квеста>

 end_mob_vnum: <vnum_старика>

 level: 5

 period: ПоМереСбора

 title: "Необычный камушек"

 description: "Вы нашли необычный камушек? Отдайте его знающему старику, может быть его это заинтересует."

 events:

   completion:

    speech: ["Благодарю тебя $N! Это весьма интеерсный камушек, вот держи награду."]

 objectives:

   type: ПринестиЛюбойИлиВсеПредметы

   tasks:

     - vnum: <номер камушка>

 reward:

   money: 100

   exp: 0

Как работает:

- выбиваем из совы камушек

- идем к старику, перед ним горит синий знак [?] (если камушка нет, горит серый знак вопроса)

- пишем сдать

Старик сказал: Благодарю тебя Линдир! Это весьма интеерсный камушек, вот держи награду.”

Вы получили 100 монет.

- у старика перед именем теперь горит серый знак вопроса

- если набрать список

#vnum “Необычный камушек”

- информация #vnum

Задание: Необычный камушек

Описание: Вы нашли необычный камушек? Отдайте его знающему старику, может быть его это заинтересует.

Награда: 100 монет, 0 опыта