Files
Leviathan/Client/Game/game/GameSystem/SQuestMgr.cpp
T
2026-06-01 12:46:52 +02:00

877 lines
22 KiB
C++

#include "stdafx.h"
#include "SQuestMgr.h"
#include "SGame.h"
#include "SDebug_Util.h"
#include "SQuestDB.h"
#include <toolkit/XStringUtil.h>
#include "SStringDB.h"
#include <mmo/ArTime.h>
#include <toolkit/bits_scramble.h> /// 2011.08.05 - prodongi
#include "SQuestMarkFactory.h"
#include "KTypes.h"
//#include "SGameMessageUI.h"
#include "SGameManager.h"
#include "quest/SUIQuestListWnd.h"
float SQuestMgr::_QUEST::MAX_NEW_SHOW_TIME = 30.0f;
SQuestMgr & SQuestMgr::GetInstance()
{
static SQuestMgr _inst;
return _inst;
}
SQuestMgr::SQuestMgr()
{
m_markFactory = new cQuestMarkFactory(this); /// 2011.09.01 - prodongi
/// 2011.10.06 - prodongi
for (int i = 0; i < TYPE_NUM; ++i)
m_vQuestList[i].reserve(MAX_QUEST_NUM);
}
SQuestMgr::~SQuestMgr()
{
SAFE_DELETE(m_markFactory);
m_savedCheckStatus.clear();
}
void SQuestMgr::Clear()
{
for (int i = 0; i < TYPE_NUM; ++i)
{
m_vQuestList[i].clear();
m_originalQuestList[i].clear(); /// 2011.11.03 - prodongi
}
m_markFactory->clearMarkList();
}
bool SQuestMgr::IsAddQuest( QuestBase::QuestCode code )
{
return IsAddQuest(code, getQuestList(TYPE_DEFAULT));
}
void SQuestMgr::InsertQuest( QuestBase::QuestCode code, int nStatus[ QuestInstance::MAX_STATUS ], int nRandomValue[ QuestInstance::MAX_RANDOM_VALUE ],int nStartID, AR_TIME nTimeLimit, unsigned char nProgress, bool bPending )
{
InsertQuest(code, getQuestList(TYPE_DEFAULT), nStatus, nRandomValue, nStartID, nTimeLimit, nProgress, bPending);
m_markFactory->insert(code); /// 2011.09.01 - prodongi
}
void SQuestMgr::ChangeStatus( QuestBase::QuestCode code, int nStatus[ QuestInstance::MAX_STATUS ], unsigned char nProgress )
{
ChangeStatus(code, getQuestList(TYPE_DEFAULT), nStatus, nProgress);
ChangeStatus(code, getOriginalQuestList(TYPE_DEFAULT), nStatus, nProgress);
}
void SQuestMgr::FinishQuest( QuestBase::QuestCode code )
{
RemoveQuest( code );
}
void SQuestMgr::RemoveQuest( QuestBase::QuestCode code )
{
m_markFactory->remove(code); /// 2011.09.01 - prodongi
RemoveQuest(code, getQuestList(TYPE_DEFAULT));
}
QuestBase::QuestCode SQuestMgr::GetQuestCodeByIndex( size_t idx, unsigned int type )
{
return GetQuestCodeByIndex(idx, getQuestList(type));
}
bool SQuestMgr::getQuestCheckByIndex(size_t idx, unsigned int type)
{
return getQuestCheckByIndex(idx, getQuestList(type));
}
bool SQuestMgr::getQuestCheckByIndex(size_t idx, v_quest& questList)
{
return questList[idx].checkStatus.isCheck;
}
void SQuestMgr::setQuestCheckByIndex(size_t idx, bool isCheck, unsigned int type)
{
setQuestCheckByIndex(idx, isCheck, getQuestList(type));
/// 2011.11.07 m_originalQuestList는 m_vQuestList와 인덱스가 틀리기 때문에 QuestCode로 찾는다 - prodongi
setQuestCheckByIndex(GetQuestCodeByIndex(idx, type), isCheck, getOriginalQuestList(type));
}
void SQuestMgr::setQuestCheckByIndex(size_t idx, bool isCheck, v_quest& questList)
{
questList[idx].checkStatus.isCheck = isCheck;
questList[idx].checkStatus.isNew = false;
}
void SQuestMgr::setQuestCheckByIndex(QuestBase::QuestCode code, bool isCheck, v_quest& questList)
{
v_quest::size_type size = questList.size();
v_quest::size_type i = 0;
for (; i < size; ++i)
{
if (questList[i].code == code)
{
setQuestCheckByIndex(i, isCheck, questList);
return ;
}
}
}
bool SQuestMgr::getQuestIsNewByIndex(size_t idx, unsigned int type)
{
return getQuestIsNewByIndex(idx, getQuestList(type));
}
int SQuestMgr::getQuestIndexByCode(QuestBase::QuestCode code, unsigned int type)
{
v_quest const& questList = getQuestList(type);
v_quest::size_type size = questList.size();
v_quest::size_type i = 0;
for (; i < size; ++i)
{
if (questList[i].code == code)
return (int)i;
}
return -1;
}
bool SQuestMgr::getQuestIsNewByIndex(size_t idx, v_quest& questList)
{
return questList[idx].checkStatus.isNew;
}
void SQuestMgr::getSuccessList(std::vector<bool> &successList, QuestBase::QuestCode code)
{
QuestBase* base = GetQuestDB().GetQuestData(code);
if (!base)
return ;
_QUEST const* quest = getQuest(code);
if (!quest)
return ;
successList.reserve(QuestInstance::MAX_STATUS);
for (int i = 0; i < QuestInstance::MAX_STATUS; ++i)
{
bool succ = false;
unsigned int type = base->nType;
if (quest->status[i])
{
int destValue = 0;
int newIndex = i * 2 + 1;
if (QuestBase::QuestType::QUEST_KILL_INDIVIDUAL == type ||
QuestBase::QuestType::QUEST_KILL_TOTAL == type)
{
destValue = base->nValue[i * 2 + 1];
}
else if (QuestBase::QuestType::QUEST_RANDOM_KILL_INDIVIDUAL == type ||
QuestBase::QuestType::QUEST_RANDOM_COLLECT == type)
{
destValue = SQuestMgr::GetInstance().GetQuestRandomValue(code, i * 2 + 1);
}
else
{
destValue = base->nValue[i*2 + 1];
}
if (quest->status[i] == destValue)
succ = true;
}
successList.push_back(succ);
}
}
bool SQuestMgr::IsPendingQuest( QuestBase::QuestCode code )
{
return IsPendingQuest(code, getQuestList(TYPE_DEFAULT));
}
int SQuestMgr::GetQuestStartID( QuestBase::QuestCode code )
{
return GetQuestStartID(code, getQuestList(TYPE_DEFAULT));
}
AR_TIME SQuestMgr::GetQuestTimeLimit( QuestBase::QuestCode code )
{
return GetQuestTimeLimit(code, getQuestList(TYPE_DEFAULT));
}
size_t SQuestMgr::GetQuestCount(unsigned int type)
{
return getQuestList(type).size();
}
int SQuestMgr::GetQuestStatus( QuestBase::QuestCode code, size_t status_idx )
{
return GetQuestStatus(code, status_idx, getQuestList(TYPE_DEFAULT));
}
int SQuestMgr::GetQuestRandomValue( QuestBase::QuestCode code, size_t idx )
{
return GetQuestRandomValue(code, idx, getQuestList(TYPE_DEFAULT));
}
unsigned char SQuestMgr::GetQuestProgress( QuestBase::QuestCode code )
{
return GetQuestProgress(code, getQuestList(TYPE_DEFAULT));
}
void SQuestMgr::SetQuestProgress( QuestBase::QuestCode code, unsigned char nProgress, unsigned int type )
{
SetQuestProgress(code, nProgress, getQuestList(type));
SetQuestProgress(code, nProgress, getOriginalQuestList(type));
}
void SQuestMgr::Process(unsigned long time)
{
unsigned long t = time - m_time;
m_time = time;
float elapsedtime = (float)t/1000.0f;
for (int i = 0; i < TYPE_NUM; ++i)
Process(elapsedtime, m_vQuestList[i]);
}
bool SQuestMgr::isQuestMarkMob(int enc_id_value, bool checkQuestInProgress)
{
return m_markFactory->is(cQuestMarkFactory::MARK_MOB, enc_id_value, checkQuestInProgress);
}
bool SQuestMgr::isQuestMarkDropItem(int dropItemId, bool checkQuestInProgress)
{
return m_markFactory->is(cQuestMarkFactory::MARK_DROP_ITEM, dropItemId, checkQuestInProgress);
}
bool SQuestMgr::isQuestMarkNpc(int dropItemId, bool checkQuestInProgress)
{
return m_markFactory->is(cQuestMarkFactory::MARK_NPC, dropItemId, checkQuestInProgress);
}
bool SQuestMgr::isQuestMarkProp(int dropItemId, bool checkQuestInProgress)
{
return m_markFactory->is(cQuestMarkFactory::MARK_PROP, dropItemId, checkQuestInProgress);
}
void SQuestMgr::iterBeginQuestList(unsigned int type)
{
m_iterQuestList = getQuestList(type).begin();
}
bool SQuestMgr::iterIsEndQuestList(unsigned int type)
{
return m_iterQuestList == getQuestList(type).end();
}
void SQuestMgr::iterNextQuestList()
{
++m_iterQuestList;
}
QuestBase::QuestCode SQuestMgr::iterDataQuestList()
{
return m_iterQuestList->code;
}
/// 2011.09.15 - prodongi
void SQuestMgr::getMonsterList(QuestBase::QuestCode code, std::vector<int>& mobList)
{
QuestBase* base = GetQuestDB().GetQuestData(code);
if (!base)
return ;
//
struct sAddQuest
{
void addRandom(SQuestMgr* mgr, QuestBase::QuestCode code, size_t idx, std::vector<int>& mobList)
{
if (0 == code)
return ;
int mobId = mgr->GetQuestRandomValue(code, idx);
if (0 == mobId)
return ;
mobList.push_back(mobId);
}
void add(SQuestMgr* mgr, QuestBase* base, size_t idx, std::vector<int>& mobList)
{
if (!base)
return ;
int mobId = base->nValue[idx];
if (0 > mobId)
{
addRandom(mgr, base->nCode, idx, mobList);
}
else if (0 < mobId)
{
mobList.push_back( mobId );
}
}
};
sAddQuest addQuest;
unsigned int type = base->nType;
if (QuestBase::QuestType::QUEST_KILL_TOTAL == type)
{
addQuest.add(this, base, 0, mobList);
addQuest.add(this, base, 2, mobList);
addQuest.add(this, base, 4, mobList);
}
else if (QuestBase::QuestType::QUEST_KILL_INDIVIDUAL == type)
{
addQuest.add(this, base, 0, mobList);
addQuest.add(this, base, 2, mobList);
addQuest.add(this, base, 4, mobList);
}
else if (QuestBase::QuestType::QUEST_HUNT_ITEM == type)
{
addQuest.add(this, base, 6, mobList);
addQuest.add(this, base, 7, mobList);
addQuest.add(this, base, 8, mobList);
addQuest.add(this, base, 9, mobList);
addQuest.add(this, base, 10, mobList);
addQuest.add(this, base, 11, mobList);
}
else if (QuestBase::QuestType::QUEST_RANDOM_KILL_INDIVIDUAL == type)
{
addQuest.addRandom(this, code, 0, mobList);
addQuest.addRandom(this, code, 2, mobList);
addQuest.addRandom(this, code, 4, mobList);
}
else if (QuestBase::QuestType::QUEST_RANDOM_COLLECT == type)
{
addQuest.addRandom(this, code, 0, mobList);
addQuest.addRandom(this, code, 2, mobList);
addQuest.addRandom(this, code, 4, mobList);
}
}
void SQuestMgr::getItemList(QuestBase::QuestCode code, std::vector<int>& itemList)
{
QuestBase* base = GetQuestDB().GetQuestData(code);
if (!base)
return ;
if (QuestBase::QuestType::QUEST_COLLECT == base->nType)
{
if (base->nValue[0]) itemList.push_back(base->nValue[0]);
if (base->nValue[2]) itemList.push_back(base->nValue[2]);
if (base->nValue[4]) itemList.push_back(base->nValue[4]);
if (base->nValue[6]) itemList.push_back(base->nValue[6]);
if (base->nValue[8]) itemList.push_back(base->nValue[8]);
if (base->nValue[10]) itemList.push_back(base->nValue[10]);
}
}
SQuestMgr::v_quest& SQuestMgr::getQuestList(unsigned int type)
{
return m_vQuestList[type];
}
SQuestMgr::v_quest& SQuestMgr::getOriginalQuestList(unsigned int type)
{
return m_originalQuestList[type];
}
bool SQuestMgr::IsAddQuest(QuestBase::QuestCode code, v_quest& questList)
{
v_quest::iterator it;
for( it = questList.begin(); it != questList.end(); ++it )
{
if( (*it).code == code ) return true;
}
return false;
}
void SQuestMgr::InsertQuest( QuestBase::QuestCode code, v_quest& questList, int nStatus[ QuestInstance::MAX_STATUS ], int nRandomValue[ QuestInstance::MAX_RANDOM_VALUE ],int nStartID, AR_TIME nTimeLimit, unsigned char nProgress, bool bPending )
{
questList.push_back( _QUEST( code, nStatus, nRandomValue, nStartID, nTimeLimit, nProgress, bPending ) );
}
void SQuestMgr::ChangeStatus( QuestBase::QuestCode code, v_quest& questList, int nStatus[ QuestInstance::MAX_STATUS ], unsigned char nProgress )
{
v_quest::iterator it;
for( it = questList.begin(); it != questList.end(); ++it )
{
if( (*it).code != code ) continue;
memcpy( (*it).status, nStatus, sizeof((*it).status) );
(*it).nProgress = nProgress;
return;
}
}
void SQuestMgr::RemoveQuest( QuestBase::QuestCode code, v_quest& questList )
{
v_quest::iterator it;
for( it = questList.begin(); it != questList.end(); ++it )
{
if( (*it).code != code ) continue;
if( code == m_nCurrentQuest ) m_nCurrentQuest = 0;
questList.erase( it );
return;
}
}
QuestBase::QuestCode SQuestMgr::GetQuestCodeByIndex( size_t idx, v_quest const& questList ) const
{
if( idx >= questList.size() ) return -1;
return questList[idx].code;
}
bool SQuestMgr::IsPendingQuest( QuestBase::QuestCode code, v_quest& questList ) const
{
v_quest::const_iterator it;
for( it = questList.begin(); it != questList.end(); ++it )
{
if( (*it).code != code ) continue;
return (*it).bPending;
}
return false;
}
int SQuestMgr::GetQuestStartID( QuestBase::QuestCode code, v_quest& questList ) const
{
v_quest::const_iterator it;
for( it = questList.begin(); it != questList.end(); ++it )
{
if( (*it).code != code ) continue;
return (*it).nStartID;
}
return -1;
}
AR_TIME SQuestMgr::GetQuestTimeLimit( QuestBase::QuestCode code, v_quest& questList ) const
{
v_quest::const_iterator it;
for( it = questList.begin(); it != questList.end(); ++it )
{
if( (*it).code != code ) continue;
return (*it).nTimeLimit;
}
return 0;
}
int SQuestMgr::GetQuestStatus( QuestBase::QuestCode code, size_t status_idx, v_quest& questList ) const
{
if( QuestInstance::MAX_STATUS <= status_idx || status_idx < 0 ) return -1;
v_quest::const_iterator it;
for( it = questList.begin(); it != questList.end(); ++it )
{
if( (*it).code != code ) continue;
return (*it).status[ status_idx ];
}
return -1;
}
int SQuestMgr::GetQuestRandomValue( QuestBase::QuestCode code, size_t idx, v_quest& questList ) const
{
if( QuestInstance::MAX_RANDOM_VALUE <= idx || idx < 0 ) return -1;
v_quest::const_iterator it;
for( it = questList.begin(); it != questList.end(); ++it )
{
if( (*it).code != code ) continue;
return (*it).nRandomValue[ idx ];
}
return -1;
}
unsigned char SQuestMgr::GetQuestProgress( QuestBase::QuestCode code, v_quest& questList ) const
{
v_quest::const_iterator it;
for( it = questList.begin(); it != questList.end(); ++it )
{
if( (*it).code != code ) continue;
return (*it).nProgress;
}
return 0;
}
void SQuestMgr::SetQuestProgress( QuestBase::QuestCode code, unsigned char nProgress, v_quest& questList )
{
v_quest::iterator it;
for( it = questList.begin(); it != questList.end(); ++it )
{
if( (*it).code != code ) continue;
(*it).nProgress = nProgress;
}
}
void SQuestMgr::Process(float elapsedtime, v_quest& questList)
{
bool changedNew = false;
std::vector< _QUEST >::iterator it;
for( it = questList.begin(); it != questList.end(); ++it )
{
/// 2011.09.28 - prodongi
if (it->updateNew(elapsedtime))
changedNew = true;
switch ((*it).nProgress)
{
case SQuestMgr::QUEST_IN_PROGRESS:
if ((*it).nTimeLimit > 0)
{
AR_TIME nNowTime = GetArTime();
AR_TIME nTimeLimit = (*it).nTimeLimit - nNowTime;
if (nTimeLimit > 0 && (*it).nTimeLimit > nNowTime)
{
QuestBase* pBase = GetQuestDB().GetQuestData( (*it).code );
if (pBase != NULL)
{
if ((int)nTimeLimit < (pBase->nTimeLimit * 50))
{
if ((*it).isNotice == false)
{
// 남은 시간이 #@time@#초 전입니다.
int sec = nTimeLimit /100 % 60;
int min = nTimeLimit / 6000 % 60;
int hour = nTimeLimit / 360000; //100*60*60 1/100초 기준
//
std::string strRemain;
if (hour > 0)
{
strRemain = GetStringDB().GetString( 533 ); //<size:12><vcenter><hcenter><shadow><#2B79F9>퀘스트: "#@quest_name@#" 남은 시간 : #@time@#시간 #@min@#분
XStringUtil::Replace( strRemain, "#@quest_name@#", GetStringDB().GetQuestString( pBase->nQuestTextId ) );
XStringUtil::Replace( strRemain, "#@time@#", SStringDB::ToString( hour ).c_str() );
XStringUtil::Replace( strRemain, "#@min@#", SStringDB::ToString( min ).c_str() );
}
else if (min > 0)
{
strRemain = GetStringDB().GetString( 583 ); //<size:12><vcenter><hcenter><shadow><#2B79F9>퀘스트: "#@quest_name@#" 남은 시간 : #@min@#분 #@second@#초
XStringUtil::Replace( strRemain, "#@quest_name@#", GetStringDB().GetQuestString( pBase->nQuestTextId ) );
XStringUtil::Replace( strRemain, "#@min@#", SStringDB::ToString( min ).c_str() );
XStringUtil::Replace( strRemain, "#@second@#", SStringDB::ToString( sec ).c_str() );
}
else if (sec > 0)
{
strRemain = GetStringDB().GetString( 584 ); //<size:12><vcenter><hcenter><shadow><#2B79F9>퀘스트: "#@quest_name@#" 남은 시간 : #@second@#초
XStringUtil::Replace( strRemain, "#@quest_name@#", GetStringDB().GetQuestString( pBase->nQuestTextId ) );
XStringUtil::Replace( strRemain, "#@second@#", SStringDB::ToString( sec ).c_str() );
}
m_pGame->AddNoticeMessageOnly( strRemain.c_str() );
//
(*it).isNotice = true;
}
}
}
else
{
_oprint("퀘스트 정보가 없음! : ID = %d", (*it).code );
}
}
}
break;
}
}
/// 2011.10.06 퀘스트 리스트 창의 new 상태를 업데이트 한다
if (changedNew)
{
SIMSG_UI_SEND_DATA* pData = new SIMSG_UI_SEND_DATA( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_QUEST_LIST, "quest_list_update_new" );
m_pGame->GetGameManager()->PostMsgAtDynamic(pData);
}
}
/// 2011.09.20 - prodongi
bool SQuestMgr::getMarkProp(QuestBase::QuestCode code, int& type, int& id, bool& hide)
{
QuestBase* base = GetQuestDB().GetQuestData(code);
if (!base)
return false;
type = base->show_target_type;
id = base->show_target_id;
hide = base->mark_hide == 0 ? false : true;
return true;
}
void SQuestMgr::sortByCheckStatus(bool isCheck, unsigned int type)
{
saveCheckStatus();
setQuestListAtOriginalQuest(getQuestList(type), type);
restoreCheckStatus();
if (isCheck)
{
sortByCheckStatus(getQuestList(type));
}
sortByNewStatus(getQuestList(type));
}
void SQuestMgr::setQuestListAtOriginalQuest(v_quest& questList, unsigned int type)
{
v_quest const& originalQuestList = getOriginalQuestList(type);
questList.clear();
questList.reserve(originalQuestList.size());
questList.assign(originalQuestList.begin(), originalQuestList.end());
}
void SQuestMgr::sortByCheckStatus(v_quest& questList)
{
/// 새로운 리스트를 뽑는다
v_quest newList;
v_quest::iterator it_q = questList.begin();
for (; it_q != questList.end(); )
{
if (it_q->checkStatus.isCheck)
{
newList.push_back(*it_q);
it_q = questList.erase(it_q);
}
else
{
++it_q;
}
}
/// 새로운 리스트를 맨 처음으로 이동
if (!newList.empty())
{
questList.insert(questList.begin(), newList.begin(), newList.end());
newList.clear();
}
}
void SQuestMgr::sortByNewStatus(v_quest &questList)
{
/// 새로운 리스트를 뽑는다
v_quest newList;
v_quest::iterator it_q = questList.begin();
for (; it_q != questList.end(); )
{
if (it_q->checkStatus.isNew)
{
newList.push_back(*it_q);
it_q = questList.erase(it_q);
}
else
{
++it_q;
}
}
/// 새로운 리스트를 맨 처음으로 이동
if (!newList.empty())
{
questList.insert(questList.begin(), newList.begin(), newList.end());
newList.clear();
}
}
void SQuestMgr::saveData()
{
saveCheckStatus();
}
void SQuestMgr::restoreData()
{
saveOriginalQuestList();
addSavedCheckStatusAtNew();
restoreCheckStatus();
sortByNewStatus();
}
bool SQuestMgr::isNotSuccess(int id)
{
std::vector<bool> successList;
std::vector<int> contentsList;
for (int i = 0; i < TYPE_NUM; ++i)
{
v_quest& questList = m_vQuestList[i];
v_quest::iterator it = questList.begin();
for (; it != questList.end(); ++it)
{
QuestBase::QuestCode code = it->code;
QuestBase* base = GetQuestDB().GetQuestData(code);
if (!base)
continue;
bool itemType = false;
getSuccessList(successList, code);
if (QuestBase::QuestType::QUEST_COLLECT == base->nType)
{
getItemList(code, contentsList);
itemType = true;
}
else
{
getMonsterList(code, contentsList);
}
size_t num = contentsList.size();
for (size_t t = 0; t < num; ++t)
{
int value;
if (itemType)
{
value = contentsList[i];
}
else
{
ENC_INT enc = bits_scramble< int, 3 >(contentsList[t]);
value = enc.value();
}
if (id == value)
{
if (!successList[t])
{
successList.clear();
contentsList.clear();
return true;
}
}
}
successList.clear();
contentsList.clear();
}
}
return false;
}
void SQuestMgr::saveOriginalQuestList()
{
for (int i = 0; i < TYPE_NUM; ++i)
{
v_quest& questList = m_vQuestList[i];
v_quest::size_type count = questList.size();
v_quest::size_type n = 0;
m_originalQuestList[i].clear();
m_originalQuestList[i].reserve(count);
m_originalQuestList[i].assign(questList.begin(), questList.end());
}
}
void SQuestMgr::saveCheckStatus()
{
m_savedCheckStatus.clear();
for (int i = 0; i < TYPE_NUM; ++i)
{
v_quest& questList = m_vQuestList[i];
v_quest::size_type count = questList.size();
v_quest::size_type n = 0;
for (; n < count; ++n)
{
m_savedCheckStatus.insert(std::make_pair(questList[n].code, questList[n].checkStatus));
}
}
}
void SQuestMgr::restoreCheckStatus()
{
std::map<QuestBase::QuestCode, sQuestCheckStatus>::iterator it;
for (int i = 0; i < TYPE_NUM; ++i)
{
restoreCheckStatus(m_vQuestList[i]);
}
m_savedCheckStatus.clear();
}
void SQuestMgr::restoreCheckStatus(v_quest& questList)
{
std::map<QuestBase::QuestCode, sQuestCheckStatus>::iterator it;
v_quest::size_type count = questList.size();
v_quest::size_type n = 0;
for (; n < count; ++n)
{
it = m_savedCheckStatus.find(questList[n].code);
if (it != m_savedCheckStatus.end())
{
questList[n].checkStatus = it->second;
}
}
}
void SQuestMgr::addSavedCheckStatusAtNew()
{
if (SUIQuestListWnd::isFirst())
{
SUIQuestListWnd::setFirst(false);
return ;
}
std::map<QuestBase::QuestCode, sQuestCheckStatus>::iterator it_s;
for (int i = 0; i < TYPE_NUM; ++i)
{
v_quest& questList = m_vQuestList[i];
v_quest::iterator it_q = questList.begin();
for (; it_q != questList.end(); ++it_q)
{
it_s = m_savedCheckStatus.find(it_q->code);
if (it_s == m_savedCheckStatus.end())
{
sQuestCheckStatus status;
status.isNew = true;
status.elapsedNewTime = 0.0f;
m_savedCheckStatus.insert(std::make_pair(it_q->code, status));
}
}
}
}
void SQuestMgr::sortByNewStatus()
{
for (int i = 0; i < TYPE_NUM; ++i)
{
sortByNewStatus(m_vQuestList[i]);
}
}
SQuestMgr::_QUEST const* SQuestMgr::getQuest(QuestBase::QuestCode code)
{
QuestBase* base = GetQuestDB().GetQuestData(code);
if (!base)
return NULL;
v_quest const& questList = getQuestList(TYPE_DEFAULT);
v_quest::const_iterator it;
for( it = questList.begin(); it != questList.end(); ++it )
{
if( (*it).code == code )
return (_QUEST const*)&(*it);
}
return NULL;
}