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

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;
}