Files
Sun1602/Achievement/AchievementSearch.cpp
T
2022-10-26 12:25:11 +08:00

247 lines
10 KiB
C++

#include "StdAfx.h"
#include ".\AchievementSearch.h"
AchievementSearch::AchievementSearch(void)
{
achievement_infos_.clear();
achievement_cursetower_.clear();
}
AchievementSearch::~AchievementSearch(void)
{
achievement_infos_.clear();
achievement_cursetower_.clear();
}
void AchievementSearch::AddAchievementParserInfo(Achievement_ParserInfo* parser_info)
{
for( int i = 0 ; i < MAX_ACHIEVEMENT_OBJECT ; ++i)
{
if(parser_info->object_type_ == ACHIEVEMENT_OBJECT_ACCOMPLISHMENT)
{
if(parser_info->obejcts_[i].object_number_ > 0)
{
Achievement_SearchInfo search_info;
search_info.index_ = i;
search_info.parser_info_ = parser_info;
ACHIEVEMENT_ACCOMPLISHMENT_RESULT result;
DWORD accomplishment_key = MAKEDWORD(parser_info->location_code_,parser_info->obejcts_[i].object_number_);
result = achievement_accomplishment_.insert(ACHIEVEMENT_ACCOMPLISHMENT_MAP::value_type(
accomplishment_key,
search_info));
if(!result.second)
{
SUNLOG(eCRITICAL_LOG, "ACScript.txt 에 중복된 키가 존재 합니다. (index: %u, %u 번째 objectcode)",parser_info->index_, i+1);
ASSERT(!"ACScript.txt 鑒앴唐댄轎. 로그를 확인하세요");
}
}
}
else if(parser_info->object_type_ == ACHIEVEMENT_OBJECT_CURSETOWER)
{
if(parser_info->obejcts_[i].object_code_ > 0)
{
Achievement_SearchInfo search_info;
search_info.index_ = i;
search_info.parser_info_ = parser_info;
achievement_cursetower_.push_back(search_info);
}
}
//_NA_001990_ACSYSTEM_ADD
else if(parser_info->object_type_ == ACHIEVEMENT_OBJECT_ITEM ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_QUEST ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_ITEM_GET ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_ITEM_EQUIP ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_PC_KILL ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_PC_KILL_ACCUMULATED ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_NPC_KILL ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_NPC_KILL_ACCUMULATED ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_KILL ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_KILL_ACCUMULATED ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_WIN ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_FALL ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_LEVELUP ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_MISSION_CLEAR_TIME ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_AC_CLEARE ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_BATTLE_HEAL ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_BATTLE_DAMAGE_TOP ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_BATTLE_DAMAGE_TO_MONSTER ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_BATTLE_DAMAGE_BY_MONSTER ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_BATTLE_KILL ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_BATTLE_DEAD ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_SKILL_STEP ||
parser_info->object_type_ == ACHIEVEMENT_OBJECT_PERK_LEVEL
#ifdef _NA_003027_20111013_HONOR_SYSTEM
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_FAME
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_REPUTE
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_FAME_COUNT
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_REPUTE_COUNT
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_COMPLETE_NORMALQUEST
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_COMPLETE_DAILYQUEST
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_COMPLETE_DAILYQUEST_CONTINOUS
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_KILL_ALL
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_DEAD_ALL
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_LOTTO
#endif //_NA_003027_20111013_HONOR_SYSTEM
//_NA_002935_20110704_ITEM_SCORE
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_ITEM_SCORE
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_ENCHANT
#ifdef _NA_006593_20130327_ADD_ACHIEVEMENT_BATTLEGROUND
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_BATTLEGROUND_STRONGPOINT_ATTACK
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_BATTLEGROUND_WIN
|| parser_info->object_type_ == ACHIEVEMENT_OBJECT_BATTLEGROUND_STRONGPOINT_DEFENSE
#endif
)
{
if((parser_info->obejcts_[i].object_code_ == 0 && parser_info->obejcts_[i].object_number_ > 0) ||
parser_info->obejcts_[i].object_code_ != 0 && parser_info->obejcts_[i].object_number_ == 0 )
{
SUNLOG(eCRITICAL_LOG, "ACScript.txt에 키값에 오류가 존재 합니다. (index: %u, %u 번째 objectcode)",
parser_info->index_, i+1);
ASSERT(!"ACScript.txt 鑒앴唐댄轎. (code == 0 and number > 0)");
return;
}
if(/*parser_info->obejcts_[i].object_code_ == 0 ||*/ parser_info->obejcts_[i].object_number_ == 0)
return;
ACHIEVEMENT_OBJECT_TYPE object_type = (ACHIEVEMENT_OBJECT_TYPE)parser_info->object_type_;
ACHIEVEMENT_INFO_RACK_OF_VECTOR::iterator iter = achievement_info_rack_of_vector_.find(object_type);
if(iter == achievement_info_rack_of_vector_.end())
{
std::pair<ACHIEVEMENT_INFO_RACK_OF_VECTOR::iterator, bool> pr = \
achievement_info_rack_of_vector_.insert( \
ACHIEVEMENT_INFO_RACK_OF_VECTOR::value_type( \
object_type, ACHIEVEMENT_INFO_MAP_OF_VECTOR()));
if(!pr.second)
{
SUNLOG(eCRITICAL_LOG, "ACScript.txt 에 중복된 키가 존재 합니다. (index: %u, %u 번째 objectcode)",
parser_info->index_, i+1);
ASSERT(!"ACScript.txt 鑒앴唐댄轎. 로그를 확인하세요");
return;
}
iter = pr.first;
}
WORD object_code = parser_info->obejcts_[i].object_code_;
ACHIEVEMENT_INFO_MAP_OF_VECTOR::iterator iter2 = (iter->second).find(object_code);
if(iter2 == (iter->second).end())
{
std::pair<ACHIEVEMENT_INFO_MAP_OF_VECTOR::iterator, bool> pr2 = \
(iter->second).insert( \
ACHIEVEMENT_INFO_MAP_OF_VECTOR::value_type( \
object_code, ACHIEVEMENT_INFO_VECTOR()));
if(!pr2.second)
{
SUNLOG(eCRITICAL_LOG, "ACScript.txt 에 중복된 키가 존재 합니다. (index: %u, %u 번째 objectcode)",
parser_info->index_, i+1);
ASSERT(!"ACScript.txt 鑒앴唐댄轎. 로그를 확인하세요");
return;
}
iter2 = pr2.first;
}
Achievement_SearchInfo search_info;
search_info.index_ = i;
search_info.parser_info_ = parser_info;
(iter2->second).push_back(search_info);
}
#ifdef _NA_003027_20111013_HONOR_SYSTEM
else if(parser_info->object_type_ >= ACHIEVEMENT_OBJECT_MAX)
{
}
#endif //_NA_003027_20111013_HONOR_SYSTEM
else
{
if(parser_info->obejcts_[i].object_code_ > 0)
{
Achievement_SearchInfo search_info;
search_info.index_ = i;
search_info.parser_info_ = parser_info;
ACHIEVEMENT_INFO_RESULT result;
result = achievement_infos_.insert(ACHIEVEMENT_INFO_MAP::value_type(
parser_info->obejcts_[i].object_code_,
search_info));
if(!result.second)
{
SUNLOG(eCRITICAL_LOG, "ACScript.txt 에 중복된 키가 존재 합니다. (index: %u, %u 번째 objectcode)",
parser_info->index_, i+1);
ASSERT(!"ACScript.txt 鑒앴唐댄轎. 로그를 확인하세요");
}
}
}
}
}
void AchievementSearch::SetFirst()
{
achievement_cursetower_iter_ = achievement_cursetower_.begin();
}
bool AchievementSearch::GetNext(Achievement_SearchInfo** search_info)
{
if(achievement_cursetower_iter_ == achievement_cursetower_.end())
return false;
*search_info = (Achievement_SearchInfo*)(&(*achievement_cursetower_iter_));
++achievement_cursetower_iter_;
return true;
}
Achievement_SearchInfo* AchievementSearch::GetAchievement_SearchInfo(WORD object_key)
{
ACHIEVEMENT_INFO_ITER iter = achievement_infos_.find(object_key);
if(iter == achievement_infos_.end())
return NULL;
return (Achievement_SearchInfo*)&iter->second;
}
Achievement_SearchInfo* AchievementSearch::GetAccomplishment_SearchInfo(DWORD object_key)
{
ACHIEVEMENT_ACCOMPLISHMENT_ITER iter = achievement_accomplishment_.find(object_key);
if(iter == achievement_accomplishment_.end())
return NULL;
return (Achievement_SearchInfo*)&iter->second;
}
//_NA_001990_ACSYSTEM_ADD
AchievementSearch::ACMapElem* AchievementSearch::GetSearchInfo_find( ACHIEVEMENT_OBJECT_TYPE object_type )
{
ACHIEVEMENT_INFO_RACK_OF_VECTOR::iterator iter = achievement_info_rack_of_vector_.find(object_type);
if( iter == achievement_info_rack_of_vector_.end() )
return NULL;
return &iter->second;
}
AchievementSearch::ACVectorElem* AchievementSearch::GetSearchInfoVector_find( ACHIEVEMENT_OBJECT_TYPE object_type, WORD object_key )
{
ACHIEVEMENT_INFO_RACK_OF_VECTOR::iterator iter = achievement_info_rack_of_vector_.find(object_type);
if( iter == achievement_info_rack_of_vector_.end() )
return NULL;
ACHIEVEMENT_INFO_MAP_OF_VECTOR::iterator iter2 = (iter->second).find(object_key);
if( iter2 == (iter->second).end() )
return NULL;
return &iter2->second;
}