Files
Sun1602/RankingLib/MissionRankingRecord.cpp
2022-10-26 12:25:11 +08:00

240 lines
7.1 KiB
C++

#include "StdAfx.h"
#include ".\MissionRankingRecord.h"
#include <ArchiveOfStream.h>
#include <algorithm>
//==================================================================================================
__IMPL_CUSTOMPOOL_PTR(MissionRankingRecord);
//==================================================================================================
MissionRankingRecord::MissionRankingRecord()
: ranking_key_(0)
, clear_time_(0)
, register_time_(0)
, average_level_(0)
, total_level_(0)
, average_level_for_client_(0)
#ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
, ranking_(0)
#endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
{
}
MissionRankingRecord::~MissionRankingRecord()
{
}
void MissionRankingRecord::Clone(const MissionRankingRecord* record)
{
this->Release();
;{
ranking_key_ = record->ranking_key_;
clear_time_ = record->clear_time_;
register_time_ = record->register_time_;
average_level_ = record->average_level_;
total_level_ = record->total_level_;
average_level_for_client_ = record->average_level_for_client_;
};
const MEMBER_HASH& src_member_table = record->member_table_;
FOREACH_CONTAINER(const MEMBER_HASH::value_type& node, src_member_table, MEMBER_HASH)
{
const RankingMember* const src_member = node.second;
RankingMember* const dest_member = RankingMember::ALLOC();
dest_member->Clone(src_member);
AddMember(dest_member);
}
}
void MissionRankingRecord::Release()
{
ranking_key_ = 0;
clear_time_ = 0;
register_time_ = 0;
average_level_ = 0;
total_level_ = 0;
average_level_for_client_ = 0;
FOREACH_CONTAINER(const MEMBER_HASH::value_type& node, member_table_, MEMBER_HASH)
{
RankingMember* member = node.second;
FREE_MEMBER(member);
};
member_table_.clear();
}
RankingMember* MissionRankingRecord::FindMember(const TCHAR* charname) const
{
DWORD char_name_hash = RankingMember::MakeCharNameHashKey(charname);
if (char_name_hash == 0) {
return NULL;
};
MEMBER_HASH::const_iterator it = member_table_.find(char_name_hash);
if (it == member_table_.end()) {
return NULL;
};
RankingMember* member = it->second;
return member;
}
void MissionRankingRecord::Serialize(_MISSION_RANKING_TOTAL_INFO& totalInfo, eSERIALIZE se)
{
if (se == SERIALIZE_STORE)
{
Release();
clear_time_ = totalInfo.m_Info.m_ClearTime;
register_time_ = totalInfo.m_Info.m_RegisterTime;
for (BYTE c = 0 ; c < totalInfo.m_Count ; ++c)
{
RankingMember* ranking_member = RankingMember::ALLOC();
ranking_member->Serialize(totalInfo.m_Member[c], se);
AddMember(ranking_member);
}
}
else if (se == SERIALIZE_LOAD)
{
totalInfo.m_Info.m_ClearTime = clear_time_;
totalInfo.m_Info.m_RegisterTime = register_time_;
totalInfo.m_Count = (BYTE)member_table_.size();
MEMBER_HASH::iterator it = member_table_.begin(), end = member_table_.end();
for (BYTE c = 0 ; it != end ; ++it, ++c)
{
(it->second)->Serialize(totalInfo.m_Member[c], se);
}
}
}
void MissionRankingRecord::AddMember(RankingMember* ranking_member)
{
DWORD char_name_hash = ranking_member->GetCharNameHash();
if (FlowControl::FCAssert(char_name_hash != 0) == false) {
return;
};
MEMBER_HASH::_Pairib result = member_table_.insert(
MEMBER_HASH::value_type(char_name_hash, ranking_member));
ASSERT(result.second && "랭킹맴버 추가 실패");
if (result.second) {
total_level_ += ranking_member->GetLV();
average_level_ = static_cast<DWORD>(total_level_ / member_table_.size());
};
}
void MissionRankingRecord::AddMember_Info(
BYTE reward, BYTE class_type, LEVELTYPE level,
const TCHAR* char_name, const TCHAR* guild_name)
{
RankingMember* ranking_member = RankingMember::ALLOC();
ranking_member->Release();
ranking_member->rewarded_ = reward;
ranking_member->class_type_ = class_type;
ranking_member->level_ = level;
ranking_member->SetCharName(char_name);
ranking_member->SetGuildName(guild_name);
AddMember(ranking_member);
}
void MissionRankingRecord::Serialize(ArchiveOfStream& ar, eRANKING_SERIALIZE se)
{
if (se == RANKING_SERIALIZE_SAVE)
{
this->Release();
ar >> ranking_key_;
ar >> clear_time_;
ar >> register_time_;
BYTE number_of_members = 0;
ar >> number_of_members;
for (int countdown = number_of_members; countdown != 0; --countdown)
{
RankingMember* ranking_member = RankingMember::ALLOC();
ranking_member->Serialize(ar, se);
AddMember(ranking_member);
};
}
else if (se == RANKING_SERIALIZE_LOAD)
{
ar << ranking_key_;
ar << clear_time_;
ar << register_time_;
ar << BYTE(member_table_.size());
FOREACH_CONTAINER(const MEMBER_HASH::value_type& node, member_table_, MEMBER_HASH)
{
RankingMember* member = node.second;
member->Serialize(ar, se);
};
}
}
// LEVELTYPE의 레벨이 255를 넘어갈경우 변경 필요!!!!!
void MissionRankingRecord::SerializeForClient(ArchiveOfStream& ar, eRANKING_SERIALIZE se)
{
if (se == RANKING_SERIALIZE_CLIENT_SAVE)
{
this->Release();
ar >> ranking_key_;
ar >> clear_time_;
BYTE average_level = 0;
ar >> average_level; //< 클라이언트만 사용(1byte)캐스팅
average_level_for_client_ = average_level;
}
else if (se == RANKING_SERIALIZE_CLIENT_LOAD)
{
ar << ranking_key_;
ar << clear_time_;
assert((average_level_ <= UCHAR_MAX));
ar << (BYTE)average_level_; //< 클라이언트만 사용(1byte)캐스팅
}
}
//SerializeForClient() 다음에 SerializeMember()가 사용되어야 한다.
void MissionRankingRecord::SerializeMember(ArchiveOfStream& ar, eRANKING_SERIALIZE se)
{
if (se == RANKING_SERIALIZE_CLIENT_SAVE)
{
total_level_ = 0;
average_level_ = 0;
BYTE number_of_members = 0;
ar >> number_of_members;
for (int countdown = number_of_members; countdown != 0; --countdown)
{
RankingMember* ranking_member = RankingMember::ALLOC();
ranking_member->Serialize(ar, se);
AddMember(ranking_member);
};
}
else if (se == RANKING_SERIALIZE_CLIENT_LOAD)
{
// 맴버수
ar << BYTE(member_table_.size());
FOREACH_CONTAINER(const MEMBER_HASH::value_type& node, member_table_, MEMBER_HASH)
{
RankingMember* member = node.second;
member->Serialize(ar, se);
};
}
}
#ifdef _SERVER
void MissionRankingRecord::Display() const
{
CONSOLELOG(eCRITICAL_LOG,
_T("RankingRecord: Key=%d, ClearTime=%d, RegisterTime=%I64d,"),
ranking_key_, clear_time_, register_time_);
FOREACH_CONTAINER(const MEMBER_HASH::value_type& node, member_table_, MEMBER_HASH)
{
const RankingMember* member = node.second;
member->Display();
};
}
#endif //_SERVER