#include "StdAfx.h" //C_NA_0_20100520_ACSYSTEM_CHANGED #include ".\AchievementManager.h" #include ".\RewardManager.h" #include "ItemManager.h" #include "EquipmentSlotContainer.h" AchievementManager::AchievementManager(void) #ifdef _NA_008069_20150210_ADD_SPA_SYSTEM : is_initialize_levelup_ac_(FALSE) #endif //_NA_008069_20150210_ADD_SPA_SYSTEM { achievement_search_ = AchievementSearch::Instance(); } AchievementManager::~AchievementManager(void) { } void AchievementManager::Init( Player * player ) { achievement_.Init(this); player_ = player; } void AchievementManager::Release() { is_initialize_levelup_ac_ = FALSE; } BOOL AchievementManager::IncCurseTowerValue( WORD object_key) { Achievement_SearchInfo* search_info = NULL; achievement_search_->SetFirst(); while(achievement_search_->GetNext(&search_info)) { if(search_info->parser_info_->obejcts_[0].object_code_ == object_key) { achievement_.SetAchievementValue(search_info->parser_info_, search_info->index_, 1, ACHIEVEMENT_VALUE_APPEND); } } return TRUE; } BOOL AchievementManager::IncMissionValue( WORD object_code) { return IncConditionValue(OBJECT_TYPE_CODE, 0, object_code); } BOOL AchievementManager::IncConditionValue( BYTE type ,WORD object_key, WORD object_code ) { Achievement_SearchInfo* achievement_parserInfo = NULL; if(type == OBJECT_TYPE_KEY) achievement_parserInfo = achievement_search_->GetAchievement_SearchInfo(object_key); else if(type == OBJECT_TYPE_CODE) achievement_parserInfo = achievement_search_->GetAchievement_SearchInfo(object_code); else return FALSE; if(achievement_parserInfo == NULL) { SUNLOG(eCRITICAL_LOG, "Not Found ObjectCode (%d)", object_key); return FALSE; } //_NA_001990_ACSYSTEM_ADD return SetAchievementValue(achievement_parserInfo, 1, ACHIEVEMENT_VALUE_APPEND); } BOOL AchievementManager::AddConditionValue( BYTE type ,WORD object_key ,WORD object_value ) { Achievement_SearchInfo* achievement_parserInfo = achievement_search_->GetAchievement_SearchInfo(object_key); if(achievement_parserInfo == NULL) { SUNLOG(eCRITICAL_LOG, "Not Found ObjectCode (%d)", object_key); return FALSE; } return achievement_.SetAchievementValue(achievement_parserInfo->parser_info_, achievement_parserInfo->index_, object_value, ACHIEVEMENT_VALUE_APPEND); } BOOL AchievementManager::SetConditionValue( WORD location ,WORD index ,BYTE object_index, WORD value) { return achievement_.SetAchievementValue(location, index, object_index, value, ACHIEVEMENT_VALUE_SET); } BOOL AchievementManager::ClearAC( WORD location_code ) { return achievement_.InitAchievementPart(location_code); } BOOL AchievementManager::CanCollectTreasureBox(const int location_code) { return achievement_.CanCollectTreasureBox((WORD)location_code); } void AchievementManager::Serialize( Character_Achievements& achievement_info, ACHIEVEMENT_SERIALIZE eType ) { achievement_.Serialize(achievement_info, eType); } void AchievementManager::RewardAchievement(WORD index_number) { Achievement_ParserInfo* achievement_parserinfo = \ AchievementParser::Instance()->GetAchievement_ParserInfo(index_number); if (achievement_parserinfo == NULL) { return; } WORD location_code = achievement_parserinfo->location_code_; //À¯ÀúÀÇ ±â·ÏÀ» °¡Á®¿Í¼­ AchievementPart* achievement_part = achievement_.GetAchievementPart(location_code); if(!achievement_part) return; //À¯ÀúÀÇ ±â·ÏÀ» °¡Á®¿Í¼­ AchievementInfo* achievementinfo = achievement_part->GetAchievement(index_number); if(!achievementinfo) return; // ÀÌ¹Ì º¸»óÀ» ¹Þ¾ÒÀ½ if (achievementinfo->IsReward() == true) { SUNLOG(eCRITICAL_LOG, "[%s:%d] already got rewarded - %d, %s", \ __FUNCTION__, __LINE__, index_number, player_->GetCharName()); return; } ////////////////////////////////////////////////////////////////////////// // if(!achievement_.RewardAchievement(index_number, location_code, TRUE)) { SendRewardFail(RC::RC_AC_FAILED); return; } } void AchievementManager::OnCanCollectTreasureBox() { player_->SendAllFieldCollectionInfo(); } void AchievementManager::OnValueChanged(WORD index, WORD location_code, BYTE object_index, WORD previous_value, WORD current_value) { char add_info_string[MAX_ADDINFO_SIZE+1]; _sntprintf( add_info_string, MAX_ADDINFO_SIZE, "index:%d, object_Index:%d, previous_value:%d, current_value:%d", index, object_index, previous_value, current_value ); bool write_log = true; #ifdef _NA_000000_20131031_GAMELOG_REDUCE Achievement_SearchInfo* achievement_parserInfo = achievement_search_->GetAchievement_SearchInfo(index); if (achievement_parserInfo) { BYTE object_type = achievement_parserInfo->parser_info_->object_type_; if ( object_type == ACHIEVEMENT_OBJECT_KILL_ALL && current_value % 10 != 0) { write_log = false; } } #endif //_NA_000000_20131031_GAMELOG_REDUCE if (write_log) { GAMELOG->LogSimpleAction(ACT_ACHIEVEMENT_VALUE_CHANGED, player_, add_info_string); } MSG_CG_AREACONQUEST_VALUE_CHANGE_CMD msg; msg.index_number_ = index; msg.location_code = location_code; msg.object_index_ = object_index; msg.object_value_ = current_value; player_->SendPacket( &msg, sizeof(msg) ); } void AchievementManager::Onreward(WORD index, WORD location_code, Achievement_ParserInfo_Reward rewards_[MAX_ACHIEVEMENT_REWARD], bool is_reward, RC::eAC_RESULT rc) { if(is_reward) { if(rc == RC::RC_AC_SUCCESS) { //º¸»óÇØ ÁÖÀÚ for(int i = 0 ; i < MAX_ACHIEVEMENT_REWARD ; ++i) { Reward(index, location_code, rewards_[i].reward_type_, rewards_[i].reward_code_); } } else { SendRewardFail(rc); } } else //º¸»ó ¾È¹Þ±â·Î º¯°æÇÑ °æ¿ì (GM ¸í·É¾î ó¸® »©°í´Â ¾÷´Â °æ¿ì~ { SUNLOG(eCRITICAL_LOG, "[%s:%d] AC reward get reverted - GM or abuser %d,%s", __FUNCTION__, __LINE__, player_->GetCharGuid(), player_->GetCharName()); } } void AchievementManager::Reward(WORD index, WORD location_code, WORD reward_type, WORD reward_code) { if(reward_type == ACHIEVEMENT_REWARD_NONE) {} //º¸»ó ¾øÀ½ else//rewardinfo.txt º¸»ó { MSG_CG_AREACONQUEST_REWARD_ACK msg; msg.index_ = index; msg.location_code_ = location_code; msg.m_accomplishment_ratio = 0; msg.m_ItemInfo.Clear(); msg.m_ItemInfo.m_InvenCount = 0; msg.m_ItemInfo.m_TmpInvenCount = 0; msg.m_i64Exp = 0; msg.m_Money = 0; #ifdef _NA_003027_20111013_HONOR_SYSTEM msg.honor_title = 0; #endif //_NA_003027_20111013_HONOR_SYSTEM if(reward_type == ACHIEVEMENT_REWARD_ACCOMPLISHMENT) //´Þ¼º·ü º¸»ó { achievement_.AddAccomplishmentRation(location_code, reward_code); msg.m_accomplishment_ratio = reward_code; if(msg.m_accomplishment_ratio <= 0) { SUNLOG(eCRITICAL_LOG, "Achievement accomplishemnt reward fail"); return ; } } else //reward_type = ACHIEVEMENT_REWARD_CODE { MONEY PreMoney = player_->GetMoney(); EXPTYPE OldExp = player_->GetExp(); GAMELOG->SetAchievementInfo(location_code, index); RC::eREWARD_RESULT rt = g_RewardManager.RewardItem( RewardManager::eREWARD_AC, reward_code, 0, player_, msg.m_ItemInfo ); if( rt != RC::RC_REWARD_SUCCESS ) { // TODO: need result code converter to support convert reward result to ac result. SendRewardFail(RC::RC_AC_INSUFFICIENT_SPACE); if(!achievement_.RewardAchievement(index, location_code, false)) { SUNLOG(eCRITICAL_LOG, "reward rollback fail"); } return; } rt = g_RewardManager.RewardExp( reward_code, player_, msg.m_i64Exp ); ASSERT( rt == RC::RC_REWARD_SUCCESS ); rt = g_RewardManager.RewardHime( reward_code, player_, msg.m_Money ); ASSERT( rt == RC::RC_REWARD_SUCCESS ); rt = g_RewardManager.RewardSkill( reward_code, player_, msg.m_SkillCode ); ASSERT( rt == RC::RC_REWARD_SUCCESS ); if( (msg.m_Money-PreMoney) != 0 ) GAMELOG->LogMoney( MONEY_REWARD_AC, player_, (msg.m_Money-PreMoney) ); if( (msg.m_i64Exp-OldExp) != 0 ) GAMELOG->LogExp( EXP_AC, player_, msg.m_i64Exp, OldExp ); #ifdef _NA_003027_20111013_HONOR_SYSTEM rt = g_RewardManager.RewardHonorTitle(reward_code, player_, msg.honor_title); #endif //_NA_003027_20111013_HONOR_SYSTEM GAMELOG->SetAchievementInfo(0, 0); // AC log info clear... } player_->SendPacket( &msg, msg.GetSize() ); } } void AchievementManager::SendRewardFail(RC::eAC_RESULT rc) { MSG_CG_AREACONQUEST_REWARD_NAK msg; msg.m_byErrorCode = rc; player_->SendPacket( &msg, sizeof(msg) ); } BOOL AchievementManager::ProcessItemUse(SLOTCODE Code, WORD ACCode, BYTE ACReferenceID) { return IncConditionValue(ACHIEVEMENT_OBJECT_ITEM, (ACCode == OBJECT_TYPE_CODE) ? Code : ACReferenceID); } BOOL AchievementManager::ProcessItemObtain(SLOTCODE Code, WORD ACCode, BYTE ACReferenceID, WORD count) { return IncConditionValue(ACHIEVEMENT_OBJECT_ITEM_GET, (ACCode == OBJECT_TYPE_CODE) ? Code : ACReferenceID, count); } BOOL AchievementManager::ProcessItemEquip( SLOTCODE Code, WORD ACCode, BYTE ACReferenceID ) { WORD keycode = (ACCode == OBJECT_TYPE_CODE) ? Code : ACReferenceID; AchievementSearch::ACVectorElem* achievement_parserInfo_vector = achievement_search_->GetSearchInfoVector_find(ACHIEVEMENT_OBJECT_ITEM_EQUIP, keycode); if (!achievement_parserInfo_vector) return FALSE; CEquipmentSlotContainer* const equip_container = static_cast( player_->GetItemManager()->GetItemSlotContainer(SI_EQUIPMENT)); const ns_formula::EquipSlotsManageInfo* manage_info = equip_container->GetEquipmentManageInfo(); WORD equipcount = (ACCode == OBJECT_TYPE_CODE) ? manage_info->GetEquipCount(keycode) : manage_info->GetEquipACGroupCount(keycode); AchievementSearch::ACVectorElem::iterator elem = (*achievement_parserInfo_vector).begin(), elem_end = (*achievement_parserInfo_vector).end(); for( ; elem != elem_end; ++elem) { Achievement_SearchInfo* pinfo = &(*elem); AchievementObjectInfo objectInfo; if( GetAchievement(pinfo, objectInfo) ) { WORD script_value = objectInfo.Achievement_; WORD user_record = objectInfo.value_; WORD user_value = min(script_value, equipcount); if( user_record != user_value) SetAchievementValue( pinfo, user_value, ACHIEVEMENT_VALUE_SET ); } } return TRUE; } BOOL AchievementManager::ProcessPerkLevel( WORD id, WORD level ) { SetValueMax_if(ACHIEVEMENT_OBJECT_PERK_LEVEL, id, level); return TRUE; } BOOL AchievementManager::ProcessMissionClearTime( WORD missioncode, WORD cleartime ) { SetValueMax_if(ACHIEVEMENT_OBJECT_MISSION_CLEAR_TIME, missioncode, cleartime); return TRUE; } BOOL AchievementManager::ProcessLevelUp( WORD level ) { #ifdef _NA_008166_20150330_MODIFY_AC_LEVELUP if (GetFlag_InitializeLevelUpAC() == FALSE) { _SetFlag_InitializeLevelUpAC(); } return IncConditionValue_LevelUpAC( level ); #else return IncConditionValue( ACHIEVEMENT_OBJECT_LEVELUP, level ); #endif //_NA_008166_20150330_MODIFY_AC_LEVELUP } BOOL AchievementManager::ProcessSkillStepUp( WORD line ) { const ACHIEVEMENT_OBJECT_TYPE type = ACHIEVEMENT_OBJECT_SKILL_STEP; AchievementSearch::ACMapElem* rack = achievement_search_->GetSearchInfo_find(type); if (!rack) return FALSE; AchievementSearch::ACMapElem::iterator elem = (*rack).begin(), elem_end = (*rack).end(); for( ; elem != elem_end; ++elem) { WORD keycode = elem->first; if(keycode <= line) IncConditionValue( type, keycode ); } return TRUE; } BOOL AchievementManager::ProcessACClear( WORD index ) { return IncConditionValue( ACHIEVEMENT_OBJECT_AC_CLEARE, index ); } BOOL AchievementManager::ProcessQuest(QCODE Code, WORD ACCode, BYTE ACReferenceID) { return IncConditionValue(ACHIEVEMENT_OBJECT_QUEST, (ACCode == OBJECT_TYPE_CODE) ? Code : ACReferenceID); } void AchievementManager::SetValueZero_if(ACHIEVEMENT_OBJECT_TYPE type, WORD keycode) { // º¸»óÀ» ¹ÞÁö ¾ÊÀº AC¿¡ ´ëÇÏ¿© // ´Þ¼º ¸ñÇ¥°ª¿¡ µµ´ÞÇÏÁö ¸øÇßÀ» °æ¿ì, °ªÀ» ÃʱâÈ­ÇÑ´Ù. AchievementSearch::ACVectorElem* achievement_parserInfo_vector = achievement_search_->GetSearchInfoVector_find(type, keycode); if (!achievement_parserInfo_vector) return; AchievementSearch::ACVectorElem::iterator elem = (*achievement_parserInfo_vector).begin(), elem_end = (*achievement_parserInfo_vector).end(); for( ; elem != elem_end; ++elem) { Achievement_SearchInfo* pinfo = &(*elem); AchievementObjectInfo objectInfo; if( GetAchievement(pinfo, objectInfo) ) { WORD script_value = objectInfo.Achievement_; WORD user_record = objectInfo.value_; if( user_record < script_value) SetAchievementValue( pinfo, 0, ACHIEVEMENT_VALUE_SET ); } } } void AchievementManager::SetValueMax_if(ACHIEVEMENT_OBJECT_TYPE type, WORD keycode, DWORD value, WORD scale) { // º¸»óÀ» ¹ÞÁö ¾ÊÀº AC¿¡ ´ëÇÏ¿© // value¸¦ scale·Î ³ª´«µÚ, ´Þ¼º ¸ñÇ¥°ªº¸´Ù Å©¸é ¸ñÇ¥°ªÀ¸·Î ¼³Á¤ // 3 argument : type, keycode, value. AchievementSearch::ACVectorElem* achievement_parserInfo_vector = achievement_search_->GetSearchInfoVector_find(type, keycode); if (!achievement_parserInfo_vector) return; AchievementSearch::ACVectorElem::iterator elem = (*achievement_parserInfo_vector).begin(), elem_end = (*achievement_parserInfo_vector).end(); for( ; elem != elem_end; ++elem) { Achievement_SearchInfo* pinfo = &(*elem); AchievementObjectInfo objectInfo; if( GetAchievement(pinfo, objectInfo) ) { WORD script_value = objectInfo.Achievement_; WORD user_record = objectInfo.value_; value = value / scale; if( user_record != script_value && value >= script_value) { SetAchievementValue( pinfo, script_value, ACHIEVEMENT_VALUE_SET ); } } } } void AchievementManager::SetValue_if(ACHIEVEMENT_OBJECT_TYPE type, /*WORD keycode,*/ WORD value) { // 2 argument : type, value. (no keycode) AchievementSearch::ACMapElem* rack = achievement_search_->GetSearchInfo_find(type); if (!rack) return; AchievementSearch::ACMapElem::iterator elem = (*rack).begin(), elem_end = (*rack).end(); for( ; elem != elem_end; ++elem) // for every keycode... { AchievementSearch::ACVectorElem::iterator \ elem2 = (elem->second).begin(), elem2_end = (elem->second).end(); for( ; elem2 != elem2_end; ++elem2) { Achievement_SearchInfo* pinfo = &(*elem2); AchievementObjectInfo objectInfo; if( GetAchievement(pinfo, objectInfo) ) { WORD script_value = objectInfo.Achievement_; WORD user_record = objectInfo.value_; if( user_record != script_value && value <= script_value) { SetAchievementValue( pinfo, value, ACHIEVEMENT_VALUE_SET ); } //!~ ¹Ì¿Ï·á ó¸®µÈ AC¸¦ ¿Ï·á ÇØÁØ´Ù. arycoat - 2012.03.29 if (user_record != script_value && value > script_value) { SetAchievementValue( pinfo, script_value, ACHIEVEMENT_VALUE_SET ); } //~! } } } } void AchievementManager::ProcessBattleEnter(WORD mapcode) { SetValueZero_if(ACHIEVEMENT_OBJECT_PC_KILL, mapcode); // PC Kill ÃʱâÈ­ SetValueZero_if(ACHIEVEMENT_OBJECT_NPC_KILL, mapcode); // NPC Kill ÃʱâÈ­ SetValueZero_if(ACHIEVEMENT_OBJECT_KILL, mapcode); // Àüü Kill ÃʱâÈ­ } void AchievementManager::ProcessBattleResult(WORD mapcode, DWORD heal, WORD maxDamage, DWORD damageToMonster, DWORD damageByMonster, WORD countKill, WORD countDead) { SetValueMax_if(ACHIEVEMENT_OBJECT_BATTLE_HEAL, mapcode, heal, 1000); SetValueMax_if(ACHIEVEMENT_OBJECT_BATTLE_DAMAGE_TOP, mapcode, maxDamage); SetValueMax_if(ACHIEVEMENT_OBJECT_BATTLE_DAMAGE_TO_MONSTER, mapcode, damageToMonster, 1000); SetValueMax_if(ACHIEVEMENT_OBJECT_BATTLE_DAMAGE_BY_MONSTER, mapcode, damageByMonster, 1000); SetValueMax_if(ACHIEVEMENT_OBJECT_BATTLE_KILL, mapcode, countKill); SetValueMax_if(ACHIEVEMENT_OBJECT_BATTLE_DEAD, mapcode, countDead); } BOOL AchievementManager::IncConditionValue( ACHIEVEMENT_OBJECT_TYPE actype, WORD key, WORD count ) { AchievementSearch::ACVectorElem* achievement_parserInfo_vector = achievement_search_->GetSearchInfoVector_find( actype, key ); if (!achievement_parserInfo_vector) return FALSE; AchievementSearch::ACVectorElem::iterator elem = (*achievement_parserInfo_vector).begin(), elem_end = (*achievement_parserInfo_vector).end(); for( ; elem != elem_end; ++elem) { Achievement_SearchInfo* pinfo = &(*elem); AchievementObjectInfo objectInfo; if( GetAchievement(pinfo, objectInfo) ) { WORD script_value = objectInfo.Achievement_; WORD user_record = objectInfo.value_; if( user_record != script_value) { SetAchievementValue(pinfo, count, ACHIEVEMENT_VALUE_APPEND); } } } return TRUE; } BOOL AchievementManager::GetAchievement(Achievement_SearchInfo* achievement_parserInfo, OUT AchievementObjectInfo& object_info) { Achievement_ParserInfo* parser_info = achievement_parserInfo->parser_info_; WORD& location_code = parser_info->location_code_; WORD& index_number = parser_info->index_; BYTE& object_index = achievement_parserInfo->index_; AchievementPart* achievement_part = achievement_.GetAchievementPart(location_code); if(!achievement_part) return FALSE; //À¯ÀúÀÇ ±â·ÏÀ» °¡Á®¿Í¼­ AchievementInfo* achievementinfo = achievement_part->GetAchievement(index_number); if(!achievementinfo) return FALSE; if(achievementinfo->IsReward()) // º¸»ó ¹Þ¾ÒÀ¸¹Ç·Î ´õÀÌ»ó ÁøÇàÇÒ Çʿ䰡 ¾ø´Ù. return FALSE; //////////////////////////////////////////////////////////////////////////// // ¼±Çà Á¶°Ç °Ë»ç // 1. Ŭ·¡½º °Ë»ç if(parser_info->class_type_ > 0) { if( player_->GetCharType() != parser_info->class_type_ ) return FALSE; } // 2. ¼±Çà AC¿Ï·á ¿©ºÎ °Ë»ç // ¼±Çà AC¿Ï·á ¿©ºÎ °Ë»ç´Â Áö±Ý Àû¿ë ¾ÈÇÔ...¤Ì¤Ì; /*for(int i = 0 ; i < MAX_ACHIEVEMENT_PARENT_CODE ; ++i) { if (parser_info->parent_ac_code_[i] > 0 && !achievement_.IsAccomplishmentByIndex(parser_info->parent_ac_code_[i])) { return FALSE; } }*/ object_info = achievementinfo->GetObjectInfo(object_index); return TRUE; } BOOL AchievementManager::SetAchievementValue(Achievement_SearchInfo* achievement_parserInfo, WORD value, ACHIEVEMENT_VALUE_CHANGE_TYPE type) { BOOL ret = achievement_.SetAchievementValue(achievement_parserInfo->parser_info_, achievement_parserInfo->index_, value, type); if( ret ) { if( achievement_.IsAccomplishment(achievement_parserInfo->parser_info_) ) { //º¸»ó¾ø´Â AC°¡ ¿Ï·á µÇ¾úÀ»°æ¿ì if (achievement_parserInfo->parser_info_->rewards_count_ == 0) { WORD index = achievement_parserInfo->parser_info_->index_; WORD location_code = achievement_parserInfo->parser_info_->location_code_; achievement_.Force_RewardAchievement( index, location_code, true); MSG_CG_AREACONQUEST_REWARD_ACK msg; msg.index_ = index; msg.location_code_ = location_code; msg.m_accomplishment_ratio = 0; msg.m_ItemInfo.Clear(); msg.m_ItemInfo.m_InvenCount = 0; msg.m_ItemInfo.m_TmpInvenCount = 0; msg.m_i64Exp = player_->GetExp(); msg.m_Money = player_->GetMoney(); #ifdef _NA_003027_20111013_HONOR_SYSTEM msg.honor_title = 0; #endif //_NA_003027_20111013_HONOR_SYSTEM player_->SendPacket(&msg, msg.GetSize()); } ProcessACClear(achievement_parserInfo->parser_info_->index_); } } return ret; } #ifdef _NA_003027_20111013_HONOR_SYSTEM BOOL AchievementManager::ProcessFameRepute( BYTE type, WORD code ) { int grade = player_->GetHonorManager()->GetFameReputeGrade(type, code); if (grade > 0) { ACHIEVEMENT_OBJECT_TYPE ac_object_type = ACHIEVEMENT_OBJECT_NOT_DEFINE; if(type == HONOR_POINT_INFO::FAME) ac_object_type = ACHIEVEMENT_OBJECT_FAME; else if(type == HONOR_POINT_INFO::REPUTE) ac_object_type = ACHIEVEMENT_OBJECT_REPUTE; SetValueMax_if( ac_object_type, code, grade ); ProcessFameReputeCount(type, grade); } return TRUE; } BOOL AchievementManager::ProcessFameReputeCount( BYTE type, WORD grade ) { int count = player_->GetHonorManager()->GetFameReputeGradeCount(type, grade); ACHIEVEMENT_OBJECT_TYPE ac_object_type = ACHIEVEMENT_OBJECT_NOT_DEFINE; if(type == HONOR_POINT_INFO::FAME) ac_object_type = ACHIEVEMENT_OBJECT_FAME_COUNT; else if(type == HONOR_POINT_INFO::REPUTE) ac_object_type = ACHIEVEMENT_OBJECT_REPUTE_COUNT; SetValueMax_if( ac_object_type, grade, count ); return TRUE; } BOOL AchievementManager::ProcessQuestCount(WORD normalQ_count, WORD dailyQ_count) { SetValue_if( ACHIEVEMENT_OBJECT_COMPLETE_NORMALQUEST, normalQ_count ); SetValue_if( ACHIEVEMENT_OBJECT_COMPLETE_DAILYQUEST, dailyQ_count ); return TRUE; } BOOL AchievementManager::ProcessLotto( int lotto_rank ) { return IncConditionValue(ACHIEVEMENT_OBJECT_LOTTO, lotto_rank); } BOOL AchievementManager::ProcessDailyQuest(BOOL success) { const ACHIEVEMENT_OBJECT_TYPE type = ACHIEVEMENT_OBJECT_COMPLETE_DAILYQUEST_CONTINOUS; AchievementSearch::ACMapElem* rack = achievement_search_->GetSearchInfo_find(type); if (!rack) return FALSE; AchievementSearch::ACMapElem::iterator elem = (*rack).begin(), elem_end = (*rack).end(); for( ; elem != elem_end; ++elem) { WORD keycode = elem->first; if(success) { IncConditionValue(type, keycode); } else { SetValueZero_if(type, keycode); } } return TRUE; } #endif //_NA_003027_20111013_HONOR_SYSTEM //_NA_002935_20110704_ITEM_SCORE BOOL AchievementManager::ProcessItemScore(const int item_score) { const AchievementSearch::ACMapElem* const score_map = achievement_search_->GetSearchInfo_find(ACHIEVEMENT_OBJECT_ITEM_SCORE); if (score_map == NULL) { return FALSE; } AchievementSearch::ACMapElem::const_iterator it = score_map->begin(); for (; it != score_map->end(); ++it) { const WORD condition_score = it->first; if (condition_score <= item_score) { IncConditionValue(ACHIEVEMENT_OBJECT_ITEM_SCORE, condition_score); } } return TRUE; } bool AchievementManager::ProcessEnchant(const SLOTCODE item_code, const uint8_t enchant) { SetValueMax_if(ACHIEVEMENT_OBJECT_ENCHANT, item_code, enchant); return true; } #ifdef _NA_008166_20150330_MODIFY_AC_LEVELUP BOOL AchievementManager::IncConditionValue_LevelUpAC( WORD data, WORD count /*= 1*/ ) { //·¹º§¾÷ °ü·Ã AC AchievementSearch::ACMapElem* level_ac_map = achievement_search_->GetSearchInfo_find( ACHIEVEMENT_OBJECT_LEVELUP ); if (level_ac_map == NULL) return FALSE; AchievementSearch::ACMapElem::iterator map_itr = (*level_ac_map).begin(); for (map_itr; map_itr != (*level_ac_map).end(); ++map_itr) { // dataº¯¼ö´Â Ç÷¹À̾îÀÇ ÇöÀç ·¹º§ // Ç÷¹À̾îÀÇ ·¹º§º¸´Ù ³·Àº ·¹º§AC¿¡ ´ëÇØ¼­¸¸ ó¸® if ((map_itr->first) > data) { continue; } AchievementSearch::ACVectorElem::iterator vec_itr = (map_itr->second).begin(); for (vec_itr; vec_itr != (map_itr->second).end(); ++vec_itr) { Achievement_SearchInfo* pinfo = &(*vec_itr); AchievementObjectInfo objectInfo; if( GetAchievement(pinfo, objectInfo) ) { WORD script_value = objectInfo.Achievement_; WORD user_record = objectInfo.value_; if( user_record != script_value) { SetAchievementValue(pinfo, count, ACHIEVEMENT_VALUE_APPEND); } } } } return TRUE; } #endif //_NA_008166_20150330_MODIFY_AC_LEVELUP