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

📄 questmanager.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// QuestManager.cpp: implementation of the CQuestManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "QuestManager.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

#include "MHFile.h"
#include "..\[CC]Quest\QuestScriptLoader.h"
#include "..\[CC]Quest\QuestString.h"
#include "..\[CC]Quest\QuestInfo.h"
#include "..\[CC]Quest\SubQuestInfo.h"
#include "..\[CC]Quest\QuestNpc.h"
#include "..\[CC]Quest\QuestNpcData.h"
#include "Quest.h"
#include "QuestUpdater.h"
#include "ObjectManager.h"
#include "ChatManager.h"
#include "QuestItemManager.h"

//
#include "GameIn.h"
#include "ItemManager.h"
#include "InventoryExDialog.h"
#include "WindowIdEnum.h"
#include "./Interface/cWindowManager.h"
#include "cDivideBox.h"
#include "QuickManager.h"
#include "Npc.h"
#include "MHMap.h"

#include "MainBarDialog.h"
#include "QuestDialog.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
GLOBALTON(CQuestManager);

CQuestManager::CQuestManager()
{
	m_QuestInfoTable.Initialize(MAX_QUEST);
	m_QuestStringTable.Initialize(200);
	m_QuestTable.Initialize(MAX_QUEST);
	m_QuestNpcTable.Initialize(100);

	m_QuestUpdater = new CQuestUpdater;

	memset( m_pNpcArray, 0, sizeof(CNpc*)*32 );
	m_dwMaxNpc = 0;
}

CQuestManager::~CQuestManager()
{
	Release();
}

void CQuestManager::Release()
{
	// quest info
	CQuestInfo* pQuestInfo = NULL;
	m_QuestInfoTable.SetPositionHead();
	while( pQuestInfo = m_QuestInfoTable.GetData() )
	{
		delete pQuestInfo;
	}
	m_QuestInfoTable.RemoveAll();

	// quest string
	CQuestString* pQuestString = NULL;
	m_QuestStringTable.SetPositionHead();
	while( pQuestString = m_QuestStringTable.GetData() )
	{
		delete pQuestString;
	}
	m_QuestStringTable.RemoveAll();

	// quest
	CQuest* pQuest = NULL;
	m_QuestTable.SetPositionHead();
	while( pQuest = m_QuestTable.GetData() )
	{
		delete pQuest;
	}
	m_QuestTable.RemoveAll();

	// quest npcinfo
	QUESTNPCINFO* pData = NULL;
	m_QuestNpcTable.SetPositionHead();
	while( pData = m_QuestNpcTable.GetData() )
	{
		delete pData;
	}
	m_QuestNpcTable.RemoveAll();

	// updater
	if( m_QuestUpdater )
		delete m_QuestUpdater;	
}

BOOL CQuestManager::LoadQuestScript( char* strFileName )
{
	CMHFile file;
#ifdef _FILE_BIN_
	if( !file.Init( strFileName, "rb") )
		return FALSE;
#else
	if( !file.Init( strFileName, "rt") )
		return FALSE;
#endif

	char Token[256];
	DWORD dwQuestNum = 0;
	while( !file.IsEOF() )
	{
		file.GetString( Token );
		if( strcmp(Token,"$QUEST") == 0 )
		{
			dwQuestNum = file.GetDword();
			m_QuestInfoTable.Add( CQuestScriptLoader::LoadQuestInfo( &file, dwQuestNum ), dwQuestNum );
		}
	}

	CreateAllQuestFromScript();

	return TRUE;
}

BOOL CQuestManager::LoadQuestString(char* strFileName)
{
	CMHFile file;
#ifdef _FILE_BIN_
	if( !file.Init( strFileName, "rb") )
		return FALSE;
#else
	if( !file.Init( strFileName, "rt") )
		return FALSE;
#endif

	char Token[256];
	DWORD Key=0;
	DWORD Key_1=0;
	DWORD Key_2=0;
	CQuestString* pQuestString = NULL;
	
	while( !file.IsEOF() )
	{
		file.GetString(Token);

		if(strcmp(Token,"$SUBQUESTSTR") == 0)	
		{
			Key_1 = file.GetDword();
			Key_2 = file.GetDword();
			COMBINEKEY(Key_1, Key_2, Key);
			pQuestString = CQuestScriptLoader::LoadQuestString(&file);
			if(pQuestString)
			{
				m_QuestStringTable.Add(pQuestString, Key);
				pQuestString->SetIndex(Key_1, Key_2);				
			}
		}
	}

	//
	m_QuestItemMGR.QuestItemInfoLoad();

	return TRUE;
}

void CQuestManager::LoadNewbieGuide( char* strFileName )
{
	m_NewbieGuide.LoadNewbieGuide( strFileName );
}

void CQuestManager::LoadQuestNpc( char* strFileName )
{
	CMHFile file;
#ifdef _FILE_BIN_
	if( !file.Init( strFileName, "rb") )
		return;
#else
	if( !file.Init( strFileName, "rt") )
		return;
#endif

	while( !file.IsEOF() )
	{
		QUESTNPCINFO* pData = new QUESTNPCINFO;
		pData->dwObjIdx = 0;
		pData->wMapNum = file.GetWord();
		pData->wNpcKind = file.GetWord();
		file.GetString( pData->sName );
		pData->wNpcIdx = file.GetWord();
		pData->vPos.x = file.GetFloat();
		pData->vPos.y = 0;
		pData->vPos.z = file.GetFloat();
		pData->fDir = file.GetFloat();

		m_QuestNpcTable.Add( pData, pData->wNpcIdx );
	}
}

void CQuestManager::CreateAllQuestFromScript()
{
	CQuestInfo* pQuestInfo = NULL;
	m_QuestInfoTable.SetPositionHead();
	while( pQuestInfo = m_QuestInfoTable.GetData() )
	{
		CQuest* pQuest = new CQuest( pQuestInfo );
		m_QuestTable.Add( pQuest, pQuestInfo->GetQuestIdx() );
	}
}

void CQuestManager::InitializeQuest()
{
	CQuest* pQuest = NULL;
	m_QuestTable.SetPositionHead();
	while( pQuest = m_QuestTable.GetData() )
	{
		pQuest->Initialize();
	}
	m_dwMaxNpc = 0;
}

void CQuestManager::SetMainQuestData( DWORD dwQuestIdx, DWORD dwSubQuestFlag, DWORD dwData, DWORD dwTime )
{
	if( dwQuestIdx == 0 )	// Newbieguide
	{
		m_NewbieGuide.SetFlagData( dwSubQuestFlag, dwData, dwTime );
		return;
	}
	else
	{
		CQuest* pQuest = m_QuestTable.GetData( dwQuestIdx );
		if( pQuest )
		{
			pQuest->SetMainQuestData( dwSubQuestFlag, dwData, dwTime );
			
			if(pQuest->GetEndParam() == 0)
			{
				DWORD Key = 0;
				COMBINEKEY(dwQuestIdx, 0, Key);
				m_QuestUpdater->ProcessQuestAdd(m_QuestStringTable.GetData(Key));
			}
		}
	}
}

void CQuestManager::SetSubQuestData( DWORD dwQuestIdx, DWORD dwSubQuestIdx, DWORD dwData, DWORD dwTime )
{
	CQuest* pQuest = m_QuestTable.GetData( dwQuestIdx );
	if( pQuest )
	{
		pQuest->SetSubQuestData( dwSubQuestIdx, dwData, dwTime );
		AddQuestNpc( pQuest->GetSubQuestInfo( dwSubQuestIdx ) );

		//
		int Key = 0;
		COMBINEKEY( dwQuestIdx, dwSubQuestIdx, Key );
		m_QuestUpdater->ProcessQuestAdd( m_QuestStringTable.GetData(Key) ); 
	}
}

void CQuestManager::StartQuest( DWORD dwQuestIdx, DWORD dwSubQuestFlag, DWORD dwData, DWORD dwTime )
{
	CQuest* pQuest = m_QuestTable.GetData( dwQuestIdx );
	if( pQuest )
	{
		pQuest->StartQuest( dwSubQuestFlag, dwData, dwTime );

		//
		int Key = 0;
		COMBINEKEY( dwQuestIdx, 0, Key );
		m_QuestUpdater->ProcessQuestAdd( m_QuestStringTable.GetData(Key) ); 

		// title
		CQuestString* pQString = m_QuestStringTable.GetData(Key);
		cPtrList* p = pQString->GetTitle();
		QString* string = (QString*)p->GetHead();
		
		CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(575), string->Str );
	}	
}

void CQuestManager::EndQuest( DWORD dwQuestIdx, DWORD dwSubQuestFlag, DWORD dwData, DWORD dwTime )
{
	CQuest* pQuest = m_QuestTable.GetData( dwQuestIdx );
	if( pQuest )
	{
		pQuest->EndQuest( dwSubQuestFlag, dwData, dwTime );

		//
		DWORD Key = 0;
		COMBINEKEY(dwQuestIdx, 0, Key);
		if(dwSubQuestFlag == 0)
			m_QuestUpdater->CompleteQuestDelete(m_QuestStringTable.GetData(Key));

		stTIME stime;
		stime.value = dwTime;
		
		char buf[16] = { 0, };
		sprintf(buf, "20%02d.%02d.%02d", stime.GetYear(), stime.GetMonth(), stime.GetDay());
		
		JOURNALINFO pItem;
		pItem.Kind = eJournal_Quest;
		pItem.Param = dwQuestIdx;
		pItem.Param_2 = 0;				// SubQuestIdx啊 0父 扁废(皋牢涅胶飘父 扁废)
		pItem.Param_3 = 1;				// bCompleted
		strncpy(pItem.RegDate, buf, 11);
		m_QuestUpdater->JournalItemAdd(&pItem);
		
		
		// title
		CQuestString* pQString = m_QuestStringTable.GetData(Key);
		cPtrList* p = pQString->GetTitle();
		QString* string = (QString*)p->GetHead();
		
		CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(576), string->Str );
	}
}

void CQuestManager::StartSubQuest( DWORD dwQuestIdx, DWORD dwSubQuestIdx, DWORD dwSubQuestFlag, DWORD dwSubData, DWORD dwSubTime )
{
	CQuest* pQuest = m_QuestTable.GetData( dwQuestIdx );
	if( pQuest )
	{
		pQuest->StartSubQuest( dwSubQuestIdx, dwSubQuestFlag, dwSubData, dwSubTime );
		AddQuestNpc( pQuest->GetSubQuestInfo( dwSubQuestIdx ) );

		//
		int Key = 0;
		COMBINEKEY( dwQuestIdx, dwSubQuestIdx, Key );
		m_QuestUpdater->ProcessQuestAdd( m_QuestStringTable.GetData(Key) );
		
		CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(580));
		if( !GAMEIN->GetQuestDialog()->IsActive() )
		{
			GAMEIN->GetMainInterfaceDialog()->SetAlram( OPT_QUESTDLGICON, TRUE );
		}
	}
}

void CQuestManager::EndSubQuest( DWORD dwQuestIdx, DWORD dwSubQuestIdx, DWORD dwSubQuestFlag, DWORD dwSubData, DWORD dwSubTime )
{
	CQuest* pQuest = m_QuestTable.GetData( dwQuestIdx );
	if( pQuest )
	{
		pQuest->EndSubQuest( dwSubQuestIdx, dwSubQuestFlag, dwSubData, dwSubTime );

		//
		int Key = 0;
		COMBINEKEY( dwQuestIdx, dwSubQuestIdx, Key );
		m_QuestUpdater->ProcessQuestDelete(m_QuestStringTable.GetData(Key));
	}
}

void CQuestManager::UpdateSubQuestData( DWORD dwQuestIdx, DWORD dwSubQuestIdx, DWORD dwMaxCount, DWORD dwSubData, DWORD dwSubTime )
{
	CQuest* pQuest = m_QuestTable.GetData( dwQuestIdx );
	if( pQuest )
	{
		pQuest->UpdateSubQuestData( dwSubQuestIdx, dwMaxCount, dwSubData, dwSubTime );

		//
		m_QuestUpdater->UpdateSubQuestData();
	}
}

void CQuestManager::QuestItemAdd( DWORD dwItemIdx, DWORD dwCount )
{
	QUEST_ITEM_INFO* pData = m_QuestItemMGR.GetQuestItem( dwItemIdx );
	if( !pData ) return;

	m_QuestUpdater->QuestItemAdd( pData, dwCount );

	// itemname
	CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(578), pData->ItemName );
}

void CQuestManager::QuestItemDelete( DWORD dwItemIdx )
{
	// itemname
	QUEST_ITEM_INFO* pData = m_QuestItemMGR.GetQuestItem( dwItemIdx );
	if( !pData ) return;
	CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(579), pData->ItemName );

	m_QuestUpdater->QuestItemDelete( dwItemIdx );
}

void CQuestManager::QuestItemUpdate( DWORD dwType, DWORD dwItemIdx, DWORD dwCount )
{
	m_QuestUpdater->QuestItemUpdate( dwType, dwItemIdx, dwCount);

	// itemname
	QUEST_ITEM_INFO* pData = m_QuestItemMGR.GetQuestItem( dwItemIdx );
	if( !pData ) return;
	CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(578), pData->ItemName );
}

void CQuestManager::DeleteQuest( DWORD dwQuestIdx )
{
	CQuest* pQuest = m_QuestTable.GetData( dwQuestIdx );
	if( pQuest )
	{
		pQuest->Initialize();
		m_QuestUpdater->DeleteQuest( dwQuestIdx );

		//
		int Key = 0;
		COMBINEKEY( dwQuestIdx, 0, Key );
		CQuestString* pQString = m_QuestStringTable.GetData(Key);
		cPtrList* p = pQString->GetTitle();
		QString* string = (QString*)p->GetHead();
		CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(577), string->Str );
	}
}

BOOL CQuestManager::IsNpcRelationQuest( DWORD dwNpcIdx )
{
	CQuest* pQuest = NULL;
	m_QuestTable.SetPositionHead();
	while( pQuest = m_QuestTable.GetData() )
	{

⌨️ 快捷键说明

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