Добавлен , опубликован

Задания (квесты)

Содержание:
Как вы уже поняли из первого урока, квестовая система Корсаров хоть и основана на обработке условий, но на некоторые события все-таки реагирует. Ознакомиться с ними можно в файле quests.c:
#event_handler("LocationWaitNihgtEnd","WaitDatePostEventControl");  // что это тут делает - не понятно
#event_handler("evntQuestCameraRestore","QuestCameraRestore");      // 
#event_handler("QuestDelayExit","DoQuestDelayExit");
#event_handler("QuitFromWorldMap","ReloadFromWMtoL_complete");
#event_handler(FORT_DESTROYED,"QuestFortDestroyed");
#event_handler(FORT_CAPTURED,"QuestFortCaptured");
#event_handler(SHIP_CAPTURED,"QuestShipCaptured");
#event_handler(EVENT_CHARACTER_GROUPDEAD,"QuestGroupDeath");
#event_handler("wdmCreateMap","QuestsCheck");
#event_handler("evntQuestsCheck","QuestsCheck");
#event_handler("evntQuestComplete","procEvntQuestComplete");
#event_handler("evntQuestUserData","GetQuestUserData");

void QuestsInit()
{
	aref postEvDelay, arTmp;
	makearef(postEvDelay,pchar.PostEventQuest.questDelay);
	int q = GetAttributesNum(postEvDelay);
	for(int i=0; i<q; i++)
	{
		arTmp = GetAttributeN(postEvDelay,i);
		DoQuestCheckDelay(arTmp.qname, stf(arTmp.delay));
	}

	SetEventHandler(EVENT_CHARACTER_DEAD,"CharacterDeadProcess",0);
	SetEventHandler(EVENT_LOCATION_LOAD,"QuestsCheck_forLocEnter",0);
	SetEventHandler(EVENT_LOCATION_LOAD,"ExecuteLocationEntryActivity",0);
	SetEventHandler(EVENT_LOCATION_UNLOAD,"QC_DoUnloadLocation",0);
	SetEventHandler(EVENT_SEA_LOGIN,"QuestsCheck",0);
	SetEventHandler(EVENT_DIALOG_EXIT,"QuestDialogExitProcedure",0);
	SetEventHandler("NextDay","QuestsCheck",0);
	SetEventHandler(SHIP_DEAD,"QuestsCheck",0);
	SetEventHandler(ABORDAGE_START_EVENT,"QuestAbordageStartEvent",0);
}
Все функции, которые по этим события вызываются, находятся в этом же файле - вы можете с ними ознакомиться. Глобально всё сводится либо к прямому вызову QuestsCheck(), либо сначала отрабатывает переданный в событие кейс, а затем QuestsCheck().
Особое внимание мы уделим только одному событию из этого списка - #event_handler("QuestDelayExit","DoQuestDelayExit");
Функция, которую оно вызывает, тоже приводит нас в QuestsCheck() - здесь ничего нового. Нас интересует сам процесс срабатывания этого события. А срабатывает оно по таймеру, который устанавливается при помощи функции DoQuestCheckDelay():
void DoQuestCheckDelay(string questCheckName, float delayInSecond)
{
    // флаг удаления такого же квеста в обычном пуле
	bool deleteOldQuest=false;

    // проверяем, что такой квест там есть
	if( CheckAttribute(pchar,"quest."+questCheckName) )	deleteOldQuest=true;

    // вешаем нашу задержку и название квеста в отдельный пул "PostEventQuest"
	pchar.PostEventQuest.questDelay.(questCheckName).delay = delayInSecond;
	pchar.PostEventQuest.questDelay.(questCheckName).qname = questCheckName;

    // вызываем ивент с задержкой
	PostEvent("QuestDelayExit",makeint(delayInSecond*1000),"sl",questCheckName,deleteOldQuest);
}
Мы передаем название квеста (кейс) и задержку в секундах, по истечению которой будет вызван этот самый кейс. Таким образом реализуется отложенный вызов каких-нибудь квестовых действий. В некоторых моментах, на персонаже уже может висеть кейс, который мы, по каким-то причинам, хотим вызвать раньше - в таких случаях данный кейс удаляется из стандартного пула "pchar.quest" во избежание дублирования вызовов.
Интересным может еще показаться событие #event_handler("evntQuestUserData","GetQuestUserData");, но его мы будем рассматривать на следующем уроке, полностью посвященному работе с квестбуком (судовым журналом).

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...