Подразумеваются две вещи:
1. Код квеста (data/jbforth/quests/0-tutorial/000-seek-and-destroy/main.f) у вас перед глазами.
2. У вас есть минимальные представления о том, что такое Форт (если нет - вопросы в студию и/или см.
Принципы Форта )
Общая канва квеста такая. Подходим к главному NPC квеста. Получаем задание. Идём убиваем моба. Получаем от моба предмет. Возвращаемся к NPC. Сдаём дроп. Получаем награду.
Квест сделаем повторяемым.
По порядку из исходников:
code forth
module: seek-and-destroy-v2
\ ..
\ ..
;module
Блоком module: .. ;module отмечаем область видимости. Чтобы наши определения не путались с другими. Подробнее - см.
Упрощённая работа со словарями: MODULE: .. EXPORT .. ;MODULEcode forth
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
forth:: bypass_quests_tutorial_000-поговорить_с_npc
Что у нас внутри слова:
code forth
0 step= if
"main.htm" show
exit
then
Если это нулевой шаг квеста, то показываем диалог main.htm и выходим из слова.
Что у нас в main.html? Описание задания и приглашение принять его:
[jbf_quests_tutorial_000-accept|Согласен!]%%
Соответственно, описываем слово:
code forth
forth:: bypass_quests_tutorial_000-accept
10 step!
"go.htm" show
;
В нём мы устанавливаем шаг в значение 10 и показываем диалог go.htm (в котором говорится о начале выполнения квеста).
Нумерацию шагов квеста рекомендую делать не подряд (1, 2, 3...) а кратной 10 (10, 20, 30..) - так будет проще вставить промежуточнй шаг (например, 15) без перенумерации всего квеста.
После получения задания идём к мобу (быстро переместиться можно по админкоманде
//to-npc 21285) и убиваем его.
Предварительно у нас повешен обработчик смерти моба:
code text
: на_смерть_моба
10 step= unless exit then
20 step!
дроп items_lists_add
"Ты сделал это!" type
;
В нём проверяется шаг квеста. Если он не равен 10, то выход (unless == not if, кто программировал на Perl - поймут)
Иначе - шаг ставится в 20 и в инвентарь убийцы (т.е. игрока) добавляется квестовый дроп. Ну и выводится текст.
После этого идём к стартовому NPC (
//to-npc 31755) и получам награду. При клике по ссылке "Тестовый квест" будет вызвано всё то же слово bypass_quests_tutorial_000-поговорить_с_npc, но номер шага у нас уже другой:
20 step= unless exit then
на этой проверке идёт выход из слова, если шаг не равен 20, так сто дальше выполняется только при наличии 20-го шага. А там у нас:
Проверка на наличие дропа:
code forth
дроп have-items-to-exchange? unless
"И куда ты дел этот череп??" show
exit
then
и, наконец, награда:
code forth
дроп награда items_exchange
"done.htm" show
0 step! \ а это - чтобы квест получился повторяемым.
...
Вот, кажется, и всё. Впоросы?