Files
2022-10-26 12:25:11 +08:00

316 lines
8.8 KiB
C++

#include "StdAfx.h"
#include ".\Achievement.h"
#include <algorithm>
//==================================================================================================
// CHANGES: f110526.5L, changes to shared pool each AchievementInfo
namespace util {
struct AchievementPartPool
{
private:
AchievementPartPool()
{
part_pool_.Initialize(10, 10);
}
~AchievementPartPool()
{
part_pool_.Release();
}
public:
CMemoryPoolFactory<AchievementPart> part_pool_;
static AchievementPartPool* Instance()
{
static AchievementPartPool instance;
return &instance;
}
}; // AchievementPartPool
} // util
AchievementPart* Achievement::AllocPart()
{
return reinterpret_cast<AchievementPart*>(
util::AchievementPartPool::Instance()->part_pool_.Alloc());
}
BOOL Achievement::FreePart(AchievementPart* delete_pointer)
{
return util::AchievementPartPool::Instance()->part_pool_.Free(delete_pointer);
};
//==================================================================================================
Achievement::Achievement(void) : notify_(NULL)
{
achievement_parser_ = AchievementParser::Instance();
}
Achievement::~Achievement(void)
{
Init();
}
void Achievement::Init(AchievementNotify* notify)
{
notify_ = notify;
ACHIEVEMENT_PART_ITER iter = Begin();
for(; iter != End() ; ++iter)
{
iter->second->Init(NULL);
FreePart(iter->second);
}
achievement_part_.clear();
}
AchievementPart* Achievement::GetAchievementPart(WORD location_code)
{
ACHIEVEMENT_PART_ITER part_iter = achievement_part_.find(location_code);
if(part_iter == End())
{
AchievementPart* achievement_part = AllocPart();
achievement_part->Init(notify_);
achievement_part->SetLocationCode(location_code);
ACHIEVEMENT_PART_RESULT part_result;
part_result = achievement_part_.insert(ACHIEVEMENT_PART_MAP::value_type(
location_code, achievement_part));
if(!part_result.second) return NULL;
return achievement_part;
}
return part_iter->second;
}
bool Achievement::AddAchievement(Achievement_ParserInfo* achievement_parser_info)
{
AchievementPart* achievement_part = GetAchievementPart(achievement_parser_info->location_code_);
if(achievement_part == NULL) return false;
return achievement_part->AddAchievement(achievement_parser_info) == NULL ? false : true;
}
void Achievement::AddAllAchievement()
{
ACHIEVEMENTINFO_ITERATOR achievement_info = achievement_parser_->Begin();
for(; achievement_info != achievement_parser_->End() ; ++achievement_info)
{
AddAchievement((*achievement_info));
}
}
bool Achievement::SetAchievementValue(WORD location_code, WORD index_number,
BYTE object_index, WORD object_value,
ACHIEVEMENT_VALUE_CHANGE_TYPE type)
{
AchievementPart* achievement_part = GetAchievementPart(location_code);
if(achievement_part == NULL) return false;
return achievement_part->SetAchievementValue(index_number, object_index,
object_value, type);
}
bool Achievement::SetAchievementValue(Achievement_ParserInfo* achievement_parser_info,
BYTE index, WORD value,
ACHIEVEMENT_VALUE_CHANGE_TYPE type)
{
AchievementPart* achievement_part = GetAchievementPart(achievement_parser_info->location_code_);
if(achievement_part == NULL) return false;
return achievement_part->SetAchievementValue(achievement_parser_info->index_, index,
value, type);
}
bool Achievement::SetAchievementValue(Character_Achievement& char_achievement_info)
{
Achievement_ParserInfo* achievement_parser =
achievement_parser_->GetAchievement_ParserInfo(char_achievement_info.index_number_);
if(achievement_parser == NULL)
{
return false;
}
AchievementPart* achievement_part = GetAchievementPart(achievement_parser->location_code_);
if(achievement_part == NULL) return false;
return achievement_part->SetAchievementValue(char_achievement_info, ACHIEVEMENT_VALUE_INIT);
}
void Achievement::InitAccomplishmentRatio()
{
ACHIEVEMENT_PART_ITER iter = Begin();
for(; iter != End() ; ++iter)
{
iter->second->InitAccomplishmentRatio();
}
}
void Achievement::Serialize( Character_Achievements& achievement_info, ACHIEVEMENT_SERIALIZE eType )
{
if(eType == ACHIEVEMENT_SAVE)
{
Init(notify_);
AddAllAchievement();
#if !defined(_SERVER) && defined(_SCJ_ACSYSTEM_OVERLAP_PARENT)
SetAchievementParentMap();
#endif //#if !defined(_SERVER) && defined(_SCJ_ACSYSTEM_OVERLAP_PARENT)
#ifdef _SERVER
AddTreasureConditionInfo();
#endif
for(int i = 0 ; i < achievement_info.achievement_count_ ; ++i)
{
SetAchievementValue(achievement_info.achievement_info_[i]);
}
InitAccomplishmentRatio();
}
else//ACSERIALIZE_CLIENT_LOAD ACSERIALIZE_CLIENT_LOAD
{
#ifndef _SERVER
ASSERT(FALSE);
#endif
achievement_info.achievement_count_ = 0;
ACHIEVEMENT_PART_ITER iter = Begin();
for(; iter != End() ; ++iter)
{
iter->second->LoadAchievement(achievement_info.achievement_count_, achievement_info, eType);
}
}
}
bool Achievement::InitAchievementPart(WORD location_code)
{
AchievementPart* achievement_part = GetAchievementPart(location_code);
if(achievement_part == NULL) return false;
achievement_part->InitAchievement();
return true;
}
bool Achievement::IsAccomplishment(WORD location_code, WORD index_number)
{
AchievementPart* achievement_part = GetAchievementPart(location_code);
if(achievement_part == NULL) return false;
return achievement_part->IsAccomplishment(index_number);
}
bool Achievement::IsAccomplishment(Achievement_ParserInfo* achievement_parser_info)
{
AchievementPart* achievement_part = GetAchievementPart(achievement_parser_info->location_code_);
if(achievement_part == NULL) return false;
return achievement_part->IsAccomplishment(achievement_parser_info->index_);
}
//_NA_001990_ACSYSTEM_ADD
bool Achievement::IsAccomplishmentByIndex(WORD index)
{
Achievement_ParserInfo* achievement_parserinfo;
achievement_parserinfo = achievement_parser_->GetAchievement_ParserInfo(index);
if (achievement_parserinfo != NULL && IsAccomplishment(achievement_parserinfo))
{
return true;
}
return false;
}
bool Achievement::RewardAchievement(WORD index_number, WORD location_code,bool is_reward)
{
AchievementPart* achievement_part = GetAchievementPart(location_code);
if(achievement_part == NULL) return false;
return achievement_part->RewardAchievement(index_number, is_reward);
}
bool Achievement::Force_RewardAchievement(WORD index_number, WORD location_code,bool is_reward)
{
AchievementPart* achievement_part = GetAchievementPart(location_code);
if(achievement_part == NULL) return false;
return achievement_part->Force_RewardAchievement(index_number, is_reward);
}
WORD Achievement::AddAccomplishmentRation(WORD location_code, WORD accomplishment_ration)
{
AchievementPart* achievement_part = GetAchievementPart(location_code);
if(achievement_part == NULL) return false;
return achievement_part->AddAccomplishmentRation(accomplishment_ration);
}
void Achievement::AccomplishAchievement()
{
ACHIEVEMENT_PART_ITER iter = Begin();
for(; iter != End() ; ++iter)
{
iter->second->AccomplishAchievement();
}
}
#ifdef _SERVER
bool Achievement::CanCollectTreasureBox(WORD location_code)
{
AchievementPart* achievement_part = GetAchievementPart(location_code);
if(achievement_part == NULL) return false;
return achievement_part->CanCollectTreasureBox();
}
void Achievement:: AddTreasureConditionInfo()
{
ACHIEVEMENT_PART_ITER iter = Begin();
for(; iter != End() ; ++iter)
{
AchievementPart* achievement_part = iter->second;
Collect_Condition_Info* collect_condition_info =
CollectTreasureBoxInfo::Instance()->GetCollectCondition(achievement_part->GetLocationCode());
if(collect_condition_info)
{
achievement_part->SetTreasureBoxConditionInfo(collect_condition_info);
}
}
}
#endif
#if !defined(_SERVER)
//_SCJ_ACSYSTEM_OVERLAP_PARENT
AchievementInfo* Achievement::FindAchievementToIndex(WORD index_number)
{
Achievement_ParserInfo* achievement_parser =
achievement_parser_->GetAchievement_ParserInfo(index_number);
if(achievement_parser == NULL)
{
return 0;
}
AchievementPart* achievement_part = GetAchievementPart(achievement_parser->location_code_);
if(achievement_part == NULL)
{
return 0;
}
return achievement_part->FindAchievementInfoToIndex(index_number);
}
void Achievement::SetAchievementParentMap()
{
// 선행코드 리스트를 셋팅한다.
ACHIEVEMENT_PART_ITER part_iterator = Begin();
for(; part_iterator != End() ; ++part_iterator)
{
AchievementPart* achievement_part = part_iterator->second;
if (achievement_part)
{
achievement_part->SetAchievementPartParentMap(this);
}
}
}
#endif //!defined(_SERVER)