📄 questmanager.cpp
字号:
// 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 + -