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

+
-
edit
 

Balancer

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

Описание и обсуждение ниже.
... чтобы понять рекурсию, нужно сперва понять рекурсию ...  
+
-
edit
 

Balancer

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

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

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




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

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




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

module: seek-and-destroy-v2
\ ..
\ ..
;module
code, type 'forth'


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

quest: init
code, type 'forth'

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

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

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

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

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


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

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

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

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


Что у нас внутри слова:
0 step= if
    "main.htm" show
    exit
then
code, type 'forth'

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

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


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


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

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

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

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


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

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

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

на этой проверке идёт выход из слова, если шаг не равен 20, так сто дальше выполняется только при наличии 20-го шага. А там у нас:

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


и, наконец, награда:
   дроп награда items_exchange
    "done.htm" show

    0 step! \ а это - чтобы квест получился повторяемым.
code, type 'forth'


...

Вот, кажется, и всё. Впоросы? :)
... чтобы понять рекурсию, нужно сперва понять рекурсию ...  

Поиск
Настройки
Персональное
Новости сайта
Популярные темы
На Facebook
География форума




АвиаТОП


 
Сайт работает на сервере ETegro Technologies