Назад

[Saga]Как реализовывать квесты. v2

Автор: Sanasol: Дата: 04.30.2010

[COLOR="SeaGreen"][FONT="Comic Sans MS"]

Так как старые гайды от Сергея устарели. Перевожу новые из документации.


Небольшое отступление. Сами по себе квесты писать не трудно. Трудно их запихнуть в клиент. С этой точки зрения тему стоило бы назвать 'Как писать квесты'.
Но т.к. квесты имеющиеся не все доделаны, то это просто гайд как их доделать.



Приступим.
1. [LIST][*]Качаем последнюю ревизию(75) или сборку Саги от рус-еа(74).
[*]Заходим в папку Quests
[*]Открываем квест 174
[/LIST]
2. Вы увидите что квест начинается так:

-- Saga is Licensed under Creative Commons Attribution-NonCommerial-ShareAlike 3.0 License
-- http://creativecommons.org/licenses/by-nc-sa/3.0/
-- Generated By Quest Extractor on 2/8/2008 3:46:15 PM

local QuestID = 174;
local ReqClv = 16;
local ReqJlv = 0;
local NextQuest = 175;
local RewZeny = 300;
local RewCxp = 1700;
local RewJxp = 680;
local RewWxp = 0;
local RewItem1 = 1700113;
local RewItem2 = 0;
local RewItemCount1 = 3;
local RewItemCount2 = 0;
local StepID = 0;

-- Modify steps below for gameplay


Это его так называемая шапка. В ней собрана вся основная конфигурация квеста. Это делает управление ВСЕМИ квестами более легким. Все нужные переменные вынесены из 'тела' скрипта что делает их доступными для быстрого изменения.


Если мы посмотрим на квест, то увидим 4 основных момента.

QUEST_START(cid) Эта функция вызывается когда квест начинается 
QUEST_FINISH(cid) Эта функция вызывается когда игрок нажимает кнопку 'Закончить квест'
QUEST_CANCEL(cid) Эта функция если игрок отменил квест
QUEST_CHECK(cid) Эта функция вызывается ту или иную проверку во время выполнения квеста.


3. Наш квест : 17401 - Поговорите с Фолькер Станвуд; 17402 - Убейте Spore(7); 17403 - передать в Совет Кафры почтовых ящиков(?). Мы видим запрос на три этапа. Таким образом, мы добавим следующие три действия для проверки квеста и функции начала квеста. Код ниже для них:

function QUEST_START(cid)    
Saga.AddStep(cid, QuestID, 17401);
Saga.AddStep(cid, QuestID, 17402);
Saga.AddStep(cid, QuestID, 17403);
Saga.InsertQuest(cid, QuestID, 1);
return 0;
end

function QUEST_CHECK(cid)
local CurStepID = Saga.GetStepIndex(cid, QuestID );
StepID = CurStepID;
local ret = -1;

if CurStepID == 17401 then
ret = QUEST_STEP_1(cid);
elseif CurStepID == 17402 then
ret = QUEST_STEP_2(cid);
elseif CurStepID == 17403 then
ret = QUEST_STEP_3(cid);
end

if ret == 0 then
QUEST_CHECK(cid)
end

return ret;
end


4. Как вы заметили мы добавляем каждый шаг с помощью 'QUEST_STEP_ (п)', где п числовое значение, в каком порядке квест будет выполняться. Если возвращается -1 в шаге функция его прерывает. Однако, если возвращается 0 прерывает его и перепроверяет. Так что вы завершили действие и вернется 0 не перепроверяет шаг, но проверяет след. шаг .

function QUEST_STEP_1(cid)  
-- Поговорить с Volker Stanwood
Saga.AddWaypoint(cid, QuestID, StepID, 1,1009);

-- Проверка на выполнение
local ret = Saga.GetNPCIndex(cid);
if ret == 1009 then
Saga.GeneralDialog(cid, 3936);
Saga.SubstepComplete(cid, QuestID, StepID, 1);
end

-- Проверка все ли под-шаги выполнены
for i = 1, 1 do
if Saga.IsSubStepCompleted(cid,QuestID,StepID, i) == false then
return -1;
end
end

Saga.StepComplete(cid, QuestID, StepID);
Saga.ClearWaypoints(cid, QuestID);
return 0;
end


5. Код выше для первого шага. Ранее мы отмечали, что наш первый шаг был поговорить с Фолькер Станвуд.

А вот остальные проверки.

function QUEST_STEP_2(cid)
-- Убить Spore (7)
Saga.Eliminate(cid, QuestID, StepID, 10081, 7, 1);
Saga.Eliminate(cid, QuestID, StepID, 10082, 7, 1);

-- Проверка все ли под-шаги выполнены
for i = 1, 1 do
if Saga.IsSubStepCompleted(cid,QuestID,StepID, i) == false then
return -1;
end
end

Saga.StepComplete(cid, QuestID, StepID);
return 0;
end

function QUEST_STEP_3(cid)
-- Hand in to Kafra Board Mailbox
local ret = Saga.GetActionObjectIndex(cid);
if ret == 1123 then
Saga.SubstepComplete(cid, QuestID, StepID, 1);
end

-- Проверка все ли под-шаги выполнены
for i = 1, 1 do
if Saga.IsSubStepCompleted(cid,QuestID,StepID, i) == false then
return -1;
end
end

Saga.StepComplete(cid, QuestID, StepID);
Saga.ClearWaypoints(cid, QuestID);
Saga.QuestComplete(cid, QuestID);
return -1;
end


Суть такова в каком-то файле айди Фолькёра 1009. И проверка именно на айди идет. Если надо поговорить с несколькими нпц, следует добавлять AddWaypoint с айди тех нпц.

Это немного урезанная версия из документации. Т.к. эмулятор весьма
неполный и некоторых описанных файлов попросту нету. Еле-еле сам въехал как переводить этот гайд. Всё ужасно запутано.

Перевел Я только что копировать строго разрешается мне не жалко
[/FONT][/COLOR]

Автор: : Дата: 01.01.1970