188 lines
5.9 KiB
C++
188 lines
5.9 KiB
C++
#include "StdAfx.h"
|
|
#include ".\SocketItemRatioParser.h"
|
|
|
|
// _NA_000251_20100727_SOCKET_SYSTEM
|
|
SocketItemRatioParser::SocketItemRatioParser()
|
|
{
|
|
}
|
|
|
|
SocketItemRatioParser::~SocketItemRatioParser()
|
|
{
|
|
}
|
|
|
|
void SocketItemRatioParser::Release()
|
|
{
|
|
FOREACH_CONTAINER(
|
|
const SocketRatioMap::value_type& socket_ratio_pair,
|
|
socket_ratio_map_,
|
|
SocketRatioMap)
|
|
{
|
|
SocketItemRatioInfo* socket_ratio = socket_ratio_pair.second;
|
|
SAFE_DELETE(socket_ratio);
|
|
}
|
|
socket_ratio_map_.clear();
|
|
}
|
|
|
|
BOOL SocketItemRatioParser::LoadScript(eSCRIPT_CODE script_code, BOOL is_reload)
|
|
{
|
|
switch (script_code)
|
|
{
|
|
case SCRIPT_SOCKET_ITEM_RATIO_INFO:
|
|
return (LoadSocketItemRatio(!!is_reload) ? TRUE : FALSE);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
SocketItemRatioInfo::RatioType::Value SocketItemRatioParser::GetRatioType(
|
|
const SocketItemRatioInfo::ItemType item_type, const bool is_recreate) const
|
|
{
|
|
switch (item_type)
|
|
{
|
|
case eITEMTYPE_TWOHANDAXE:
|
|
case eITEMTYPE_TWOHANDSWORD:
|
|
case eITEMTYPE_ONEHANDSWORD:
|
|
case eITEMTYPE_SPEAR:
|
|
case eITEMTYPE_WHIP:
|
|
case eITEMTYPE_DAGGER:
|
|
case eITEMTYPE_ONEHANDCROSSBOW:
|
|
case eITEMTYPE_ETHERWEAPON:
|
|
case eITEMTYPE_STAFF:
|
|
case eITEMTYPE_ORB:
|
|
case eITEMTYPE_GUNTLET: // _NA_004965_20120613_NEW_CHARACTER_MYSTIC
|
|
case eITEMTYPE_POLEARM: // _NA_004965_20120613_NEW_CHARACTER_MYSTIC
|
|
case eITEMTYPE_HELLROID_1: //_NA_000000_20130812_NEW_CHARACTER_HELLROID
|
|
case eITEMTYPE_ARCBLADE: //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
|
|
if (is_recreate)
|
|
{
|
|
return SocketItemRatioInfo::RatioType::kRecreateWeapon;
|
|
}
|
|
return SocketItemRatioInfo::RatioType::kWeapon;
|
|
case eITEMTYPE_ARMOR:
|
|
case eITEMTYPE_PANTS:
|
|
case eITEMTYPE_BOOTS:
|
|
case eITEMTYPE_GLOVE:
|
|
case eITEMTYPE_HELMET:
|
|
case eITEMTYPE_PROTECTOR:
|
|
case eITEMTYPE_BELT:
|
|
case eITEMTYPE_SHIRTS:
|
|
case eITEMTYPE_RING:
|
|
case eITEMTYPE_NECKLACE:
|
|
case eITEMTYPE_WINGS:
|
|
case eITEMTYPE_WING:
|
|
case eITEMTYPE_BERSERKER_KALVUS_ACCESSORY:
|
|
case eITEMTYPE_ALLCLASS_CHAOSEYE:
|
|
case eITEMTYPE_ELEMENTALIST_KALVUS_ACCESSORY:
|
|
case eITEMTYPE_DRAGON_KALVUS_ACCESSORY:
|
|
case eITEMTYPE_VALKYRIE_SHADOW_KALVUS_ACCESSORY:
|
|
case eITEMTYPE_MYSTIC_KALVUS_ACCESSORY:
|
|
case eITEMTYPE_HELLROID_WITCHBLADE_KALVUS_ACCESSORY:
|
|
|
|
if (is_recreate)
|
|
{
|
|
return SocketItemRatioInfo::RatioType::kRecreateArmor;
|
|
}
|
|
return SocketItemRatioInfo::RatioType::kArmor;
|
|
}
|
|
return SocketItemRatioInfo::RatioType::kInvalid;
|
|
}
|
|
|
|
const SocketItemRatioInfo* SocketItemRatioParser::FindSocketRatio(
|
|
const SocketItemRatioInfo::RatioType::Value ratio_type,
|
|
const SocketItemRatioInfo::ItemLevel item_level) const
|
|
{
|
|
if (ratio_type == SocketItemRatioInfo::RatioType::kInvalid)
|
|
{
|
|
return NULL;
|
|
}
|
|
const SocketRatioKey socket_ratio_key = MAKEWORD(ratio_type, item_level);
|
|
const SocketRatioMap::const_iterator iter = socket_ratio_map_.find(socket_ratio_key);
|
|
if (iter != socket_ratio_map_.end())
|
|
{
|
|
return iter->second;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
bool SocketItemRatioParser::IsValid(const SocketItemRatioInfo& socket_ratio) const
|
|
{
|
|
if (FindSocketRatio(socket_ratio.ratio_type_, socket_ratio.item_level_))
|
|
{
|
|
SUNLOG(eCRITICAL_LOG,
|
|
_T("|%s|已存在相同的概率类型和水平值.|RatioType = %d, ItemLevel = %d|"),
|
|
__FUNCTION__,
|
|
socket_ratio.ratio_type_,
|
|
socket_ratio.item_level_);
|
|
return false;
|
|
}
|
|
|
|
if (socket_ratio.ratio_type_ < 0 ||
|
|
socket_ratio.ratio_type_ > SocketItemRatioInfo::RatioType::kMax)
|
|
{
|
|
SUNLOG(eCRITICAL_LOG,
|
|
_T("|%s|不正确的概率类型.|RatioType = %d|"),
|
|
__FUNCTION__,
|
|
socket_ratio.ratio_type_);
|
|
return false;
|
|
}
|
|
|
|
if (socket_ratio.socket_creation_ratio_ < 1 ||
|
|
socket_ratio.socket_creation_ratio_ > SocketItemRatioInfo::kMaxRatio)
|
|
{
|
|
SUNLOG(eCRITICAL_LOG,
|
|
_T("|%s|成为插槽物品的概率是一个不可接受的值。.|RatioType = %d, ItemLevel = %d, SocketCreation = %d, 最大 = %d|"),
|
|
__FUNCTION__,
|
|
socket_ratio.ratio_type_,
|
|
socket_ratio.item_level_,
|
|
socket_ratio.socket_creation_ratio_,
|
|
SocketItemRatioInfo::kMaxRatio);
|
|
return false;
|
|
}
|
|
|
|
SocketItemRatioInfo::Ratio total_socket_number_ratio = 0;
|
|
for(int i = 0; i < SOCKET_MAX; ++i)
|
|
{
|
|
total_socket_number_ratio += socket_ratio.socket_ratio_[i];
|
|
}
|
|
|
|
if (total_socket_number_ratio > SocketItemRatioInfo::kMaxRatio)
|
|
{
|
|
SUNLOG(eCRITICAL_LOG,
|
|
_T("|%s|插槽概率的总和不是 %d.|RatioType = %d, ItemLevel = %d|"),
|
|
__FUNCTION__,
|
|
SocketItemRatioInfo::kMaxRatio,
|
|
socket_ratio.ratio_type_,
|
|
socket_ratio.item_level_);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool SocketItemRatioParser::LoadSocketItemRatio(const bool is_reload)
|
|
{
|
|
__UNUSED(is_reload);
|
|
|
|
const int row_size = GetRowSize();
|
|
for (int row = 0; row < row_size; ++row)
|
|
{
|
|
SocketItemRatioInfo* socket_ratio(new SocketItemRatioInfo);
|
|
{
|
|
GetData(row, socket_ratio->ratio_type_, _T("ItemType"));
|
|
GetData(row, socket_ratio->item_level_, _T("ItemLevel"));
|
|
GetData(row, socket_ratio->socket_creation_ratio_, _T("SocketCreation"));
|
|
|
|
for (int i = 0; i < SOCKET_MAX; ++i)
|
|
{
|
|
GetData(row, socket_ratio->socket_ratio_[i], _T("Socket%d"), i+1);
|
|
}
|
|
}
|
|
if (IsValid(*socket_ratio) == false)
|
|
{
|
|
SAFE_DELETE(socket_ratio);
|
|
continue;
|
|
}
|
|
const SocketRatioKey socket_ratio_key = MAKEWORD(socket_ratio->ratio_type_, socket_ratio->item_level_);
|
|
socket_ratio_map_.insert(std::make_pair(socket_ratio_key, socket_ratio));
|
|
}
|
|
return true;
|
|
} |