⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 questscriptloader.cpp

📁 墨香最新私服
💻 CPP
字号:
// QuestScriptLoader.cpp: implementation of the CQuestScriptLoader class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "QuestScriptLoader.h"

#include "MHFile.h"
#include "QuestInfo.h"
#include "SubQuestInfo.h"
#include "QuestString.h"
#include "QuestEvent.h"

#include "QuestLimit.h"
#include "QuestLimitKind.h"
#include "QuestLimitKind_Level.h"
#include "QuestLimitKind_Quest.h"

#include "QuestTrigger.h"
#include "QuestCondition.h"
#include "QuestExecute.h"
#include "QuestExecute_Quest.h"
#include "QuestExecute_Count.h"
#include "QuestExecute_Item.h"
#include "QuestExecute_RandomItem.h"

#include "QuestNpcScript.h"
#include "QuestNpcScriptData.h"
#include "QuestNpc.h"
#include "QuestNpcData.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define LOADUNIT(ekind,strkind,classname,questidx,subquestidx)	\
		if( strcmp(strKind,strkind) == 0 )						\
			return new classname(ekind,pTokens,questidx,subquestidx);

CQuestScriptLoader::CQuestScriptLoader()
{
}

CQuestScriptLoader::~CQuestScriptLoader()
{
}

CQuestInfo* CQuestScriptLoader::LoadQuestInfo( CMHFile* pFile, DWORD dwQuestIdx )
{
	CQuestInfo* pQuestInfo = new CQuestInfo( dwQuestIdx );
	CSubQuestInfo* pSub;
	char tok[256];
	DWORD dwSubQuestIdx = 0;
	while( !pFile->IsEOF() )
	{
		pFile->GetString( tok ); 
		if( tok[0] == '}' )
			break;
		if( strcmp( tok, "$SUBQUEST" ) == 0 )
		{
			dwSubQuestIdx = pFile->GetDword();
			pSub = LoadSubQuestInfo( pFile, dwQuestIdx, dwSubQuestIdx );
			ASSERT(pSub);
			pQuestInfo->AddSubQuestInfo( dwSubQuestIdx, pSub );
		}
	}

	return pQuestInfo;
}

CSubQuestInfo* CQuestScriptLoader::LoadSubQuestInfo( CMHFile* pFile, DWORD dwQuestIdx, DWORD dwSubQuestIdx )
{
	CSubQuestInfo* pSub = new CSubQuestInfo;
	
	char buf[1024];
	char Token[256];
	while( !pFile->IsEOF() )
	{
		pFile->GetString( Token );
		if( Token[0] == '}' )
			break;

		if( strcmp(Token,"#LIMIT") == 0 )
		{
			pFile->GetLine( buf, 1024 );
			CStrTokenizer tok( buf, " \t\n" );
			pSub->AddQuestLimit( new CQuestLimit( &tok, dwQuestIdx, dwSubQuestIdx ) );
		}
#ifdef _MAPSERVER_
		else if( strcmp(Token,"#TRIGGER") == 0 )
		{
			pFile->GetLine( buf, 1024 );
			CStrTokenizer tok( buf, " \t\n" );
			pSub->AddQuestTrigger( new CQuestTrigger( &tok, dwQuestIdx, dwSubQuestIdx ) );
		}		
#else
		else if( strcmp(Token,"#NPCSCRIPT") == 0 )
		{
			pFile->GetLine( buf, 1024 );
			CStrTokenizer tok( buf, " \t\n" );
			pSub->AddQuestNpcScipt( new CQuestNpcScript( &tok, dwQuestIdx, dwSubQuestIdx ) );
		}
		else if( strcmp(Token,"#NPCADD") == 0 )
		{
			pFile->GetLine( buf, 1024 );
			CStrTokenizer tok( buf, " \t\n" );
			pSub->AddQuestNpc( new CQuestNpc( &tok, dwQuestIdx, dwSubQuestIdx ) );
		}		
		else if( strcmp(Token, "#MAXCOUNT") == 0 )
		{
			pSub->SetMaxCount( pFile->GetDword() );
		}
#endif
	}

	return pSub;
}

CQuestString* CQuestScriptLoader::LoadQuestString(CMHFile* pFile)
{
	CQuestString* pQStr = new CQuestString;

	char buf[1024];
	char Token[256];
	int	tline=0;
	int dline=0;

	while( !pFile->IsEOF() )
	{
		pFile->GetString(Token);

		if(Token[0] ==  '}')
			break;
		
		if(strcmp(Token,"#TITLE") == 0)
		{
			pFile->GetLine(buf, 1024);
			pQStr->AddLine(buf, tline, TRUE);
		}
		if(strcmp(Token,"#DESC") == 0)
		{
			while( !pFile->IsEOF() ) 
			{
				pFile->GetLine(buf, 1024);

				if( buf[1] == '{' )				continue;
				else if( buf[1] == '}' )		break;

				pQStr->AddLine(buf, dline);
				++dline;
			}
		}
	}

	return pQStr;
}

CQuestLimitKind* CQuestScriptLoader::LoadQuestLimitKind( char* strKind, CStrTokenizer* pTokens, DWORD dwQuestIdx, DWORD dwSubQuestIdx )
{
	LOADUNIT( eQuestLimitKind_Level, "&LEVEL", CQuestLimitKind_Level, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestLimitKind_Money, "&MONEY", CQuestLimitKind_Level, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestLimitKind_Quest, "&QUEST", CQuestLimitKind_Quest, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestLimitKind_SubQuest, "&SUBQUEST", CQuestLimitKind_Quest, dwQuestIdx, dwSubQuestIdx );
	return NULL;
}

CQuestCondition* CQuestScriptLoader::LoadQuestCondition( char* strKind, CStrTokenizer* pTokens, DWORD dwQuestIdx, DWORD dwSubQuestIdx )
{
	CQuestEvent* pEvent = LoadQuestEvent( strKind, pTokens, dwQuestIdx, dwSubQuestIdx );
	ASSERT(pEvent);
	CQuestCondition* pCondition = new CQuestCondition( pEvent, dwQuestIdx, dwSubQuestIdx );

	return pCondition;
}

CQuestEvent* CQuestScriptLoader::LoadQuestEvent( char* strKind, CStrTokenizer* pTokens, DWORD dwQuestIdx, DWORD dwSubQuestIdx )
{
	LOADUNIT( eQuestEvent_NpcTalk, "@TALKTONPC", CQuestEvent, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestEvent_Hunt, "@HUNT", CQuestEvent, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestEvent_Count, "@COUNT", CQuestEvent, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestEvent_GameEnter, "@GAMEENTER", CQuestEvent, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestEvent_Level, "@LEVEL", CQuestEvent, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestEvent_UseItem, "@USEITEM", CQuestEvent, dwQuestIdx, dwSubQuestIdx );
	return NULL;
}

CQuestExecute* CQuestScriptLoader::LoadQuestExecute( char* strKind, CStrTokenizer* pTokens, DWORD dwQuestIdx, DWORD dwSubQuestIdx )
{
	LOADUNIT( eQuestExecute_EndQuest, "*ENDQUEST", CQuestExecute_Quest, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestExecute_StartSub, "*STARTSUB", CQuestExecute_Quest, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestExecute_EndSub, "*ENDSUB", CQuestExecute_Quest, dwQuestIdx, dwSubQuestIdx );
	
	LOADUNIT( eQuestExecute_AddCount, "*ADDCOUNT", CQuestExecute_Count, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestExecute_MinusCount, "*MINUSCOUNT", CQuestExecute_Count, dwQuestIdx, dwSubQuestIdx );

	LOADUNIT( eQuestExecute_GiveQuestItem, "*GIVEQUESTITEM", CQuestExecute_Item, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestExecute_TakeQuestItem, "*TAKEQUESTITEM", CQuestExecute_Item, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestExecute_GiveItem, "*GIVEITEM", CQuestExecute_Item, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestExecute_GiveMoney, "*GIVEMONEY", CQuestExecute_Item, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestExecute_TakeItem, "*TAKEITEM", CQuestExecute_Item, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestExecute_TakeMoney, "*TAKEMONEY", CQuestExecute_Item, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestExecute_TakeExp, "*TAKEEXP", CQuestExecute_Item, dwQuestIdx, dwSubQuestIdx );
	
	LOADUNIT( eQuestExecute_RandomTakeItem, "*RANDOMTAKEITEM", CQuestExecute_RandomItem, dwQuestIdx, dwSubQuestIdx );

	LOADUNIT( eQuestExecute_TakeQuestItemFQW, "*TAKEQUESTITEMFQW", CQuestExecute_Item, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestExecute_AddCountFQW, "*ADDCOUNTFQW", CQuestExecute_Count, dwQuestIdx, dwSubQuestIdx );

	LOADUNIT( eQuestExecute_TakeQuestItemFW, "*TAKEQUESTITEMFW", CQuestExecute_Item, dwQuestIdx, dwSubQuestIdx );
	LOADUNIT( eQuestExecute_AddCountFW, "*ADDCOUNTFW", CQuestExecute_Count, dwQuestIdx, dwSubQuestIdx );
	
	return NULL;
}

CQuestNpcScriptData* CQuestScriptLoader::LoadQuestNpcScriptData( char* strKind, CStrTokenizer* pTokens, DWORD dwQuestIdx, DWORD dwSubQuestIdx )
{
	LOADUNIT( 0, "@NPC", CQuestNpcScriptData, dwQuestIdx, dwSubQuestIdx );
	return NULL;
}

CQuestNpcData* CQuestScriptLoader::LoadQuestNpcData( char* strKind, CStrTokenizer* pTokens, DWORD dwQuestIdx, DWORD dwSubQuestIdx )
{
	LOADUNIT( 0, "@NPC", CQuestNpcData, dwQuestIdx, dwSubQuestIdx );
	return NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -