DragonNest/Server/ServerCommon/DNQuestManager.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

267 lines
5.8 KiB
C++
Raw Permalink Blame History

#include "stdafx.h"
#include "DnQuest.h"
#include "DnQuestManager.h"
#include "DNTableFile.h"
#include "EtResourceMng.h"
#include "VarArg.h"
#include "DNUserQuest.h"
#include "DNPeriodQuestSystem.h"
CDNQuestManager* g_pQuestManager = NULL;
CDNQuestManager::CDNQuestManager()
{
}
CDNQuestManager::~CDNQuestManager()
{
RemoveAllQuest();
}
bool CDNQuestManager::LoadAllQuest(const char* szFileName, DnScriptManager* pScriptManager)
{
RemoveAllQuest();
// Quest
{
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TQUEST );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"QuestTable.ext failed\r\n");
return false;
}
for( int i = 0; i < pSox->GetItemCount() ; i++ )
{
CDNQuest::CREATE_INFO info;
info.nQuestIndex = pSox->GetItemID(i);
if( GetQuest(info.nQuestIndex) != NULL )
return false;
char szQuestName[256] = {0,};
char szTalk[256] = {0,};
char szScript[256] = {0,};
if( pSox->GetFieldFromLablePtr(info.nQuestIndex, "_Name") == NULL )
continue;
_strcpy(szQuestName, _countof(szQuestName), pSox->GetFieldFromLablePtr(info.nQuestIndex, "_Name")->GetString(), (int)strlen(pSox->GetFieldFromLablePtr(info.nQuestIndex, "_Name")->GetString()));
_strcpy(szTalk, _countof(szTalk), pSox->GetFieldFromLablePtr(info.nQuestIndex, "_QuestTalk")->GetString(), (int)strlen(pSox->GetFieldFromLablePtr(info.nQuestIndex, "_QuestTalk")->GetString()));
_strcpy(szScript, _countof(szScript), pSox->GetFieldFromLablePtr(info.nQuestIndex, "_QuestScript")->GetString(), (int)strlen(pSox->GetFieldFromLablePtr(info.nQuestIndex, "_QuestScript")->GetString()));
info.cQuestType = pSox->GetFieldFromLablePtr(info.nQuestIndex, "_QuestType")->GetInteger();
info.cRepeatable = pSox->GetFieldFromLablePtr(info.nQuestIndex, "_QuestRepeatable")->GetInteger();
info.btLevelCapReward = pSox->GetFieldFromLablePtr(info.nQuestIndex, "_LevelCapReward")->GetInteger();
WCHAR wszQuestName[256]= {0,};
MultiByteToWideChar(CP_ACP, 0, szQuestName, -1, wszQuestName, 256 );
WCHAR wszTalk[256]= {0,};
MultiByteToWideChar(CP_ACP, 0, szTalk, -1, wszTalk, 256 );
WCHAR wszScript[256]= {0,};
MultiByteToWideChar(CP_ACP, 0, szScript, -1, wszScript, 256 );
info.szQuestName = wszQuestName;
info.szTalkFileName = wszTalk;
info.szScriptFileName = wszScript;
info.bCheckRemoteComplete = true;
if( info.szQuestName.empty() || info.szTalkFileName.empty() || info.szScriptFileName.empty() )
continue;
CDNQuest* pQuest = new CDNQuest();
pQuest->Create(info);
AddQuest(info.nQuestIndex, pQuest);
AddQuest(info.szTalkFileName, pQuest);
}
}
return true;
}
void CDNQuestManager::DumpAllQuest(IN OUT std::vector<CDNQuest*>& questList)
{
questList.clear();
questList.reserve(m_QuestMap.size());
for( QUEST_MAP_ITR iter = m_QuestMap.begin() ; iter != m_QuestMap.end() ; iter++ )
{
CDNQuest* pQuest = iter->second;
if( pQuest )
{
questList.push_back(pQuest);
}
}
}
void CDNQuestManager::RemoveAllQuest()
{
QUEST_MAP_ITR it = m_QuestMap.begin();
for( it ; it != m_QuestMap.end() ; it++ )
{
CDNQuest* pQuest = it->second;
SAFE_DELETE(pQuest);
}
m_QuestMap.clear();
m_StrKeyQuestMap.clear();
m_RepeatQuests.clear();
}
bool CDNQuestManager::AddQuest(int nQuestIndex, CDNQuest* pQuest)
{
if( !pQuest )
{
ASSERT(0);
return false;
}
QUEST_MAP_ITR iter = m_QuestMap.find(nQuestIndex);
if( iter != m_QuestMap.end() )
return false;
m_QuestMap[nQuestIndex] = pQuest;
if(pQuest->GetQuestInfo().cRepeatable)
m_RepeatQuests.push_back(nQuestIndex);
return true;
}
bool CDNQuestManager::AddQuest(std::wstring& szTalkFile, CDNQuest* pQuest)
{
if( !pQuest )
return false;
STRKEY_QUEST_MAP_ITR iter = m_StrKeyQuestMap.find(szTalkFile);
if( iter != m_StrKeyQuestMap.end() )
{
return false;
}
else
{
m_StrKeyQuestMap[szTalkFile] = pQuest;
return true;
}
}
/*
bool CDNQuestManager::RemoveQuest(int nQuestIndex)
{
QUEST_MAP_ITR iter = m_QuestMap.find(nQuestIndex);
if( iter == m_QuestMap.end() )
{
return false;
}
else
{
m_QuestMap.erase(iter);
return true;
}
return false;
}
*/
CDNQuest* CDNQuestManager::GetQuest(int nQuestIndex)
{
QUEST_MAP_ITR iter = m_QuestMap.find(nQuestIndex);
if( iter == m_QuestMap.end() )
{
return NULL;
}
else
{
return iter->second;
}
}
CDNQuest* CDNQuestManager::GetQuest(std::wstring& szTalkFile)
{
STRKEY_QUEST_MAP_ITR iter = m_StrKeyQuestMap.find(szTalkFile);
if( iter == m_StrKeyQuestMap.end() )
{
return NULL;
}
else
{
return iter->second;
}
}
bool CDNQuestManager::bIsMainQuest( const int nQuestIndex )
{
CDNQuest* pQuest = GetQuest( nQuestIndex );
if( !pQuest )
return false;
return( pQuest->GetQuestInfo().cQuestType == QuestType_MainQuest );
}
bool CDNQuestManager::bIsSubQuest( const int nQuestIndex )
{
CDNQuest* pQuest = GetQuest( nQuestIndex );
if( !pQuest )
return false;
switch(pQuest->GetQuestInfo().cQuestType)
{
case QuestType_SubQuest:
case QuestType_PeriodQuest:
#if defined(PRE_ADD_REMOTE_QUEST)
case QuestType_RemoteQuest:
#endif
return true;
default:
return false;
}
return false;
}
char CDNQuestManager::GetQuestType(const int nQuestIndex)
{
CDNQuest* pQuest = GetQuest(nQuestIndex);
if(!pQuest) {
// DN_ASSERT(0, CVarArgA<64>("Invalid! <20><> !pQuest : %d", nQuestIndex));
return QuestType_Min;
}
return pQuest->GetQuestInfo().cQuestType;
}
void CDNQuestManager::ResetRepeatQuest(CDNUserQuest* pQuest)
{
if(!pQuest)
return;
for each(int index in m_RepeatQuests)
{
pQuest->SetCompleteQuestFlag(index, false);
}
}
void CDNQuestManager::MarkingConditionalQuest(CDNUserQuest* pQuest)
{
if(!pQuest)
return;
QUEST_MAP_ITR iter = m_QuestMap.begin();
int nQuestIndex = 0;
for(; iter != m_QuestMap.end(); iter++)
{
// <20>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><>ŷ<EFBFBD><C5B7> Ǯ<><C7AE><EFBFBD>ش<EFBFBD>.
if(iter->second->GetQuestInfo().cRepeatable == 1)
{
nQuestIndex = iter->second->GetQuestInfo().nQuestIndex;
pQuest->SetCompleteQuestFlag(nQuestIndex, false);
}
}
}