Простой квест: сходи, убей, принеси.

 
+
-
edit
 

Balancer

администратор
★★★★★
Положен в data/jbforth/quests/0-tutorial/000-seek-and-destroy

Описание и обсуждение ниже.
 
AD Реклама Google — средство выживания форумов :)
+
-
edit
 

Balancer

администратор
★★★★★
Подразумеваются две вещи:

1. Код квеста (data/jbforth/quests/0-tutorial/000-seek-and-destroy/main.f) у вас перед глазами.

2. У вас есть минимальные представления о том, что такое Форт (если нет - вопросы в студию и/или см. Принципы Форта )




Общая канва квеста такая. Подходим к главному NPC квеста. Получаем задание. Идём убиваем моба. Получаем от моба предмет. Возвращаемся к NPC. Сдаём дроп. Получаем награду.

Квест сделаем повторяемым.




По порядку из исходников:

code forth
  1. module: seek-and-destroy-v2
  2. \ ..
  3. \ ..
  4. ;module


Блоком module: .. ;module отмечаем область видимости. Чтобы наши определения не путались с другими. Подробнее - см. Упрощённая работа со словарями: MODULE: .. EXPORT .. ;MODULE

code forth
  1. quest: init

Тут происходит выполнение слова init из словаря quest: Оно делает подготовительную работу. Например, вводит уникальные квестовые сохраняемые в БД переменные пользователя, в которых хранится шаг квеста. Словом step@ можно прочитать текущий шаг, step! - записать, словом step= проверить на точное соответствие номера шага или step? проверить на превышение номера шага квеста.

По большому счёту, нам в нашем квесте не нужно помнить шаг, можно просто проверять наличие предмета, но для общей демонстрации пригодится.

Дальше описываются константы NPC, моба, списка дропа с моба и списка награды за квест.

Слово добавляемая_строчка выводит своим результатом строку, добавляемую к диалогу нужного NPC. Скажем, если ткнётся игрок, а не ГМ, то вывода не будет вообще (квест - тестовый), а если ткнётся ГМ, то будет добавлена строка на одном из двух языков, в зависимости от языка игрока.

& добавляемая_строчка  главный_npc   npc-dialog+

По порядку:
& добавляемая_строчка - получаем адрес указанного слова (ссылку на него)
главный_npc - константа есть константа
npc-dialog+ - добавляем вывод указанного слова к диалогу указанного NPC.

Предположим, что язык был русский. Тогда к диалогу будет добавлена строка:
[jbf_quests_tutorial_000-поговорить_с_npc|Тестовое задание]%%, которая оттпарсится в:
<a action="bypass -h jbf_quests_tutorial_000-поговорить_с_npc">Тестовое задание</a><br1>

Соответственно, при клике по ссылке "Тестовое задание" серверу будет послан bypass jbf_quests_tutorial_000-поговорить_с_npc. Он попробует вызвать Форт-слово bypass_quests_tutorial_000-поговорить_с_npc.

Определяем его. Обратите внимание, что определение идёт не с : , как обычно, а с forth:: , этим словом производится определение в базовый корневой словарь Форта. И поэтому имя слова должно быть уникальным.
code text
  1. forth:: bypass_quests_tutorial_000-поговорить_с_npc


Что у нас внутри слова:
code forth
  1. 0 step= if
  2.     "main.htm" show
  3.     exit
  4. then

Если это нулевой шаг квеста, то показываем диалог main.htm и выходим из слова.

Что у нас в main.html? Описание задания и приглашение принять его:
[jbf_quests_tutorial_000-accept|Согласен!]%%

Соответственно, описываем слово:
code forth
  1. forth:: bypass_quests_tutorial_000-accept
  2.     10 step!
  3.     "go.htm" show
  4. ;


В нём мы устанавливаем шаг в значение 10 и показываем диалог go.htm (в котором говорится о начале выполнения квеста).

Нумерацию шагов квеста рекомендую делать не подряд (1, 2, 3...) а кратной 10 (10, 20, 30..) - так будет проще вставить промежуточнй шаг (например, 15) без перенумерации всего квеста.

После получения задания идём к мобу (быстро переместиться можно по админкоманде //to-npc 21285) и убиваем его.

Предварительно у нас повешен обработчик смерти моба:
code text
  1. : на_смерть_моба
  2.     10 step= unless exit then
  3.     20 step!
  4.     дроп items_lists_add
  5.     "Ты сделал это!" type
  6. ;


В нём проверяется шаг квеста. Если он не равен 10, то выход (unless == not if, кто программировал на Perl - поймут)

Иначе - шаг ставится в 20 и в инвентарь убийцы (т.е. игрока) добавляется квестовый дроп. Ну и выводится текст.

После этого идём к стартовому NPC (//to-npc 31755) и получам награду. При клике по ссылке "Тестовый квест" будет вызвано всё то же слово bypass_quests_tutorial_000-поговорить_с_npc, но номер шага у нас уже другой:
20 step= unless exit then
на этой проверке идёт выход из слова, если шаг не равен 20, так сто дальше выполняется только при наличии 20-го шага. А там у нас:

Проверка на наличие дропа:
code forth
  1.    дроп have-items-to-exchange? unless
  2.         "И куда ты дел этот череп??" show
  3.         exit
  4.     then


и, наконец, награда:
code forth
  1.    дроп награда items_exchange
  2.     "done.htm" show
  3.  
  4.     0 step! \ а это - чтобы квест получился повторяемым.


...

Вот, кажется, и всё. Впоросы? :)
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru