Files
Sun1602/ProgramCommon/Attribute.cpp
T
2022-10-26 12:25:11 +08:00

1416 lines
124 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include "Attribute.h"
#include <Const.h>
#include "Struct.h"
#include "ItemInfoParser.h"
//==================================================================================================
static BoundPolicies s_BoundPolicies;
BoundPolicies::BoundPolicies()
{
policy_list_[eBOUNDTYPE_MP_100] = &policy_mp_100_;
policy_list_[eBOUNDTYPE_MP_1000] = &policy_mp_1000_;
policy_list_[eBOUNDTYPE_MP_10000] = &policy_mp_10000_;
policy_list_[eBOUNDTYPE_MP_INFINITE] = &policy_mp_infinite_;
policy_list_[eBOUNDTYPE_ZP_100] = &policy_zp_100_;
policy_list_[eBOUNDTYPE_ZP_1000] = &policy_zp_1000_;
policy_list_[eBOUNDTYPE_ZP_10000] = &policy_zp_10000_;
policy_list_[eBOUNDTYPE_ZP_INFINITE] = &policy_zp_infinite_;
}
inline int BoundPolicies::touch(eBOUNDTYPE bound_type, int check_value) const
{
assert(0 <= bound_type && bound_type < _countof(policy_list_));
return policy_list_[bound_type]->touch(check_value);
}
//==================================================================================================
int INTValue::touch(eBOUNDTYPE bound_type)
{
value_ = s_BoundPolicies.touch(bound_type, value_);
return value_;
}
//==================================================================================================
INTValue AttrValue::calc_ratio_static_;
INTValue& AttrValue::operator[](eATTR_KIND eAttr)
{
assert(eAttr < eATTR_KIND_MAX);
switch (eAttr)
{
case eATTR_KIND_BASE:
return base_value_;
case eATTR_KIND_ITEM:
return item_value_;
case eATTR_KIND_SKILL:
return skill_value_;
case eATTR_KIND_ITEM_RATIO:
return item_ratio_;
case eATTR_KIND_SKILL_RATIO:
return skill_ratio_;
case eATTR_KIND_RATIO :
{
INTValue calc_ratio;
calc_ratio.value_ += item_ratio_.value_;
calc_ratio.value_ += skill_ratio_.value_;
calc_ratio.touch(eBOUNDTYPE_MP_10000);
calc_ratio_static_ = calc_ratio;
return calc_ratio_static_;
};
}
return calc_value_;
}
int AttrValue::operator[](eATTR_KIND eAttr) const
{
assert(eAttr < eATTR_KIND_MAX);
switch (eAttr)
{
case eATTR_KIND_BASE:
return base_value_;
case eATTR_KIND_ITEM:
return item_value_;
case eATTR_KIND_SKILL:
return skill_value_;
case eATTR_KIND_ITEM_RATIO:
return item_ratio_;
case eATTR_KIND_SKILL_RATIO:
return skill_ratio_;
case eATTR_KIND_RATIO:
{
INTValue calc_ratio;
calc_ratio.value_ += item_ratio_.value_;
calc_ratio.value_ += skill_ratio_.value_;
calc_ratio.touch(eBOUNDTYPE_MP_10000);
return calc_ratio.value_;
};
}
return calc_value_.value_;
}
void AttrValue::Update()
{
//s_AttrUpdatePolicies[update_type_].Update(calc_value_,
// base_value_, item_value_, skill_value_, item_ratio_, skill_ratio_);
if (item_value_.value_ != 0) {
item_value_.touch(eBOUNDTYPE_MP_INFINITE);
}
if (skill_value_.value_ != 0) {
skill_value_.touch(eBOUNDTYPE_MP_INFINITE);
}
if (item_ratio_.value_ != 0) {
item_ratio_.touch(eBOUNDTYPE_MP_10000);
}
if (skill_ratio_.value_ != 0) {
skill_ratio_.touch(eBOUNDTYPE_MP_10000);
}
if (base_value_.value_ != 0) {
base_value_.touch(static_cast<eBOUNDTYPE>(bound_type_));
}
if (update_type_ == eUPDATETYPE_NOTHING)
{
if (calc_value_.value_ != 0) {
calc_value_.touch(static_cast<eBOUNDTYPE>(bound_type_));
}
return;
}
if (update_type_ == eUPDATETYPE_NOT_RATIO)
{
//不应用比率值的原因是将比率值本身应用到其他值。.
calc_value_.value_ = base_value_.value_;
calc_value_.value_ += item_value_.value_;
calc_value_.value_ += skill_value_.value_;
if (calc_value_.value_ != 0) {
calc_value_.touch(static_cast<eBOUNDTYPE>(bound_type_));
}
}
else if (update_type_ == eUPDATETYPE_SUM_RATIO)
{
INTValue calc_ratio;
calc_ratio.value_ += item_ratio_.value_;
calc_ratio.value_ += skill_ratio_.value_;
if (calc_ratio.value_ != 0) {
calc_ratio.touch(eBOUNDTYPE_MP_10000);
}
//
calc_value_.value_ = base_value_.value_;
calc_value_.value_ += item_value_.value_;
calc_value_.value_ += skill_value_.value_;
if (calc_value_.value_ != 0 && calc_ratio.value_ != 0)
{
calc_value_.value_ *= (100L + calc_ratio.value_);
calc_value_.value_ /= 100L;
}
if (calc_value_.value_ != 0) {
calc_value_.touch(static_cast<eBOUNDTYPE>(bound_type_));
}
}
}
//==================================================================================================
AttrValue Attributes::attr_value_static_;
const eATTACK_TYPE Attributes::Physicals::kPhysicalsMappedArray[Counts] =
{
eATTACK_TYPE_MELEE, // 1
eATTACK_TYPE_RANGE, // 2
};
#define PHYSICAL_INDEX_INVALID (_countof(Attributes::Physicals::kPhysicalsMappedArray))
const int Attributes::Physicals::kToPhysicalIndex[eATTACK_TYPE_MAX] =
{
PHYSICAL_INDEX_INVALID, //eATTACK_TYPE_ALL_OPTION = 0, //所有选项
0, //eATTACK_TYPE_MELEE, // 近程
1, //eATTACK_TYPE_RANGE, // 范围
PHYSICAL_INDEX_INVALID, //eATTACK_TYPE_WATER, // 水
PHYSICAL_INDEX_INVALID, //eATTACK_TYPE_FIRE, // 火
PHYSICAL_INDEX_INVALID, //eATTACK_TYPE_WIND, // 风
PHYSICAL_INDEX_INVALID, //eATTACK_TYPE_EARTH, // 土
PHYSICAL_INDEX_INVALID, //eATTACK_TYPE_DARKNESS, // 暗
PHYSICAL_INDEX_INVALID, //eATTACK_TYPE_DIVINE, //神
PHYSICAL_INDEX_INVALID, //eATTACK_TYPE_PHYSICAL_OPTION, //物理选项
PHYSICAL_INDEX_INVALID, //eATTACK_TYPE_MAGIC_OPTION, //魔法选项
PHYSICAL_INDEX_INVALID, //eATTACK_TYPE_ALL_MAGIC, //所有魔法属性
PHYSICAL_INDEX_INVALID, //eATTACK_TYPE_MAGIC, //魔法
#if !defined(_NA001605_EP2_ATTRIBUTES_RENEWAL_)
PHYSICAL_INDEX_INVALID, //eATTACK_TYPE_INVALID,
#endif
//eATTACK_TYPE_MAX,
};
const eATTACK_TYPE Attributes::Elements::kElementsMappedArray[Counts] =
{
eATTACK_TYPE_WATER, // 3
eATTACK_TYPE_FIRE, // 4
eATTACK_TYPE_WIND, // 5
eATTACK_TYPE_EARTH, // 6
eATTACK_TYPE_DARKNESS // 7
};
#define ELEMENT_INDEX_INVALID (_countof(Attributes::Elements::kElementsMappedArray))
const int Attributes::Elements::kToElementIndex[eATTACK_TYPE_MAX] =
{
ELEMENT_INDEX_INVALID, //eATTACK_TYPE_ALL_OPTION = 0, //所有选项
ELEMENT_INDEX_INVALID, //eATTACK_TYPE_MELEE, //近程
ELEMENT_INDEX_INVALID, //eATTACK_TYPE_RANGE, //范围
0, //eATTACK_TYPE_WATER, // 水
1, //eATTACK_TYPE_FIRE, // 火
2, //eATTACK_TYPE_WIND, // 风
3, //eATTACK_TYPE_EARTH, //土
4, //eATTACK_TYPE_DARKNESS, //暗
ELEMENT_INDEX_INVALID, //eATTACK_TYPE_DIVINE, //神
ELEMENT_INDEX_INVALID, //eATTACK_TYPE_PHYSICAL_OPTION, //物理选项
ELEMENT_INDEX_INVALID, //eATTACK_TYPE_MAGIC_OPTION, //魔法选项
ELEMENT_INDEX_INVALID, //eATTACK_TYPE_ALL_MAGIC, //所有魔法属性
ELEMENT_INDEX_INVALID, //eATTACK_TYPE_MAGIC, //魔法
#if !defined(_NA001605_EP2_ATTRIBUTES_RENEWAL_)
ELEMENT_INDEX_INVALID, //eATTACK_TYPE_INVALID,
#endif
#ifdef _NA_004965_20120613_NEW_CHARACTER_MYSTIC
ELEMENT_INDEX_INVALID, //eATTACK_TYPE_SKILL, //技能
#endif //_NA_004965_20120613_NEW_CHARACTER_MYSTIC
//eATTACK_TYPE_MAX,
};
#ifdef _NA_004965_20120613_NEW_CHARACTER_MYSTIC
BOOST_STATIC_ASSERT((_countof(Attributes::Physicals::kToPhysicalIndex) == 14));
BOOST_STATIC_ASSERT((_countof(Attributes::Elements::kToElementIndex) == 14));
#else
#ifdef _NA001605_EP2_ATTRIBUTES_RENEWAL_
BOOST_STATIC_ASSERT((_countof(Attributes::Physicals::kToPhysicalIndex) == 13));
BOOST_STATIC_ASSERT((_countof(Attributes::Elements::kToElementIndex) == 13));
#else
BOOST_STATIC_ASSERT((_countof(Attributes::Physicals::kToPhysicalIndex) == 14));
BOOST_STATIC_ASSERT((_countof(Attributes::Elements::kToElementIndex) == 14));
#endif
#endif
//
// Unused ...
void Attributes::RegisterAttr(eATTR_TYPE attr_type, AttrValue* attr_value,
eBOUNDTYPE bound_type, eUPDATETYPE update_type)
{
ASSERT(attr_type < eATTR_MAX);
attr_values_[attr_type].attr_value = attr_value;
if (attr_value) {
attr_value->SetType(bound_type, update_type);
}
}
Attributes::Attributes()
{
RegisterAll();
}
Attributes::~Attributes()
{
}
//--------------------------------------------------------------------------------------------------
// NOTE: f110217.4L, 添加不使用运算符的接口函数类型属性
int Attributes::GetAttrValue(eATTR_TYPE attr_type, eATTR_KIND attr_kind) const
{
if (attr_type < eATTR_MAX && attr_kind < eATTR_KIND_MAX)
{
const AttrValue* attr_value = attr_values_[attr_type].attr_value;
if (attr_value && attr_value != &attr_value_static_) {
return (*attr_value)[attr_kind];
}
assert(attr_value && attr_value != &attr_value_static_);
return 0;
}
assert(attr_type < eATTR_MAX && attr_kind < eATTR_KIND_MAX);
return 0;
}
void Attributes::SetAttrValue(eATTR_TYPE attr_type, eATTR_KIND attr_kind, int value)
{
if (attr_type < eATTR_MAX && attr_kind < eATTR_KIND_MAX)
{
AttrValue* attr_value = attr_values_[attr_type].attr_value;
if (attr_value && attr_value != &attr_value_static_) {
(*attr_value)[attr_kind].value_ = value;
return;
}
assert(attr_value && attr_value != &attr_value_static_);
return;
}
assert(attr_type < eATTR_MAX && attr_kind < eATTR_KIND_MAX);
}
//--------------------------------------------------------------------------------------------------
// (f100720.3L) 特殊用途接口
// eATTR_KIND_SKILL = clear fields { eATTR_KIND_SKILL, eATTR_KIND_SKILL_RATIO }
// eATTR_KIND_ITEM = clear fields { eATTR_KIND_ITEM, eATTR_KIND_ITEM_RATIO }
void Attributes::ClearRelatedAttrKind(eATTR_KIND attr_kind)
{
if (false);
else if (attr_kind == eATTR_KIND_ITEM)
{
AttrNode* it = attr_values_,
* const end = &attr_values_[eATTR_MAX];
for ( ; it != end; ++it)
{
AttrValue* attr_value = it->attr_value;
if (attr_value == NULL) {
continue;
}
attr_value->item_value_.value_ = 0;
attr_value->item_ratio_.value_ = 0;
}
}
else if (attr_kind == eATTR_KIND_SKILL)
{
AttrNode* it = attr_values_,
* const end = &attr_values_[eATTR_MAX];
for ( ; it != end; ++it)
{
AttrValue* attr_value = it->attr_value;
if (attr_value == NULL) {
continue;
}
attr_value->skill_value_.value_ = 0;
attr_value->skill_ratio_.value_ = 0;
}
}
}
bool Attributes::GroupOperate(const Operation::eOper operate_cmd, const eATTR_KIND attr_kind,
const Operation* attr_array, const int* value_array,
const int number_of_data)
{
if (number_of_data <= 0 ||
operate_cmd >= attr_array->eOper_Counts ||
attr_kind >= eATTR_KIND_MAX)
{
return false;
}
const Operation* attr_it = attr_array;
for (int index = 0; index < number_of_data; ++index, ++attr_it)
{
if (attr_it->attr_type == eATTR_TYPE_INVALID ||
attr_it->attr_type >= eATTR_MAX)
{
return false;
}
const int value = value_array[index];
if (operate_cmd != attr_it->eOper_Set && value == 0) {
continue;
}
AttrValue* const attr_value = attr_values_[attr_it->attr_type].attr_value;
if (attr_value == NULL || attr_value == &attr_value_static_) {
continue;
}
INTValue* int_value = NULL;
switch (attr_kind)
{
case eATTR_KIND_BASE:
int_value = &attr_value->base_value_;
break;
case eATTR_KIND_ITEM:
int_value = &attr_value->item_value_;
break;
case eATTR_KIND_SKILL:
int_value = &attr_value->skill_value_;
break;
case eATTR_KIND_ITEM_RATIO:
int_value = &attr_value->item_ratio_;
break;
case eATTR_KIND_SKILL_RATIO:
int_value = &attr_value->skill_ratio_;
break;
};
if (int_value == NULL) {
continue;
};
//
switch (operate_cmd)
{
case attr_it->eOper_Set:
int_value->value_ = value;
break;
case attr_it->eOper_Add:
int_value->value_ += value;
break;
case attr_it->eOper_Sub:
int_value->value_ -= value;
break;
//case attr_it->eOper_Mul:
// int_value->value_ *= value;
// break;
//case attr_it->eOper_Div:
// if (value != 0) {
// int_value->value_ /= value;
// }
break;
};
} //cmd_end 'for'
return true;
}
// (f100809.3L) 外部多操作命令支持接口,支持记录更新
bool Attributes::GroupBatchOperate(const OperationRecord* records, const int number_of_records)
{
if (number_of_records <= 0) {
return false;
}
const OperationRecord* record_it = records;
for (int index = 0; index < number_of_records; ++index, ++record_it)
{
if (record_it->operate >= Operation::eOper_Counts ||
record_it->attr_kind >= eATTR_KIND_MAX ||
record_it->attr_type == eATTR_TYPE_INVALID ||
record_it->attr_type >= eATTR_MAX)
{
return false;
}
const int value = record_it->attr_value;
if (record_it->operate != Operation::eOper_Set && value == 0) {
continue;
}
//
AttrValue* const attr_value = attr_values_[record_it->attr_type].attr_value;
if (attr_value == NULL || attr_value == &attr_value_static_) {
continue;
}
//
INTValue* int_value = NULL;
switch (record_it->attr_kind)
{
case eATTR_KIND_BASE:
int_value = &attr_value->base_value_;
break;
case eATTR_KIND_ITEM:
int_value = &attr_value->item_value_;
break;
case eATTR_KIND_SKILL:
int_value = &attr_value->skill_value_;
break;
case eATTR_KIND_ITEM_RATIO:
int_value = &attr_value->item_ratio_;
break;
case eATTR_KIND_SKILL_RATIO:
int_value = &attr_value->skill_ratio_;
break;
};
if (int_value == NULL) {
continue;
};
//
switch (record_it->operate)
{
case Operation::eOper_Set:
int_value->value_ = value;
break;
case Operation::eOper_Add:
int_value->value_ += value;
break;
case Operation::eOper_Sub:
int_value->value_ -= value;
break;
//case Operation::eOper_Mul:
// int_value->value_ *= value;
// break;
//case Operation::eOper_Div:
// if (value != 0) {
// int_value->value_ /= value;
// }
break;
};
} //cmd_end 'for'
return true;
}
#if !defined(_SERVER)
int Attributes::GetAttrMaxBoundValue(eATTR_TYPE attr_type) const
{
if (attr_type < eATTR_MAX)
{
const AttrValue* attr_value = attr_values_[attr_type].attr_value;
if (attr_value && attr_value != &attr_value_static_) {
return s_BoundPolicies.GetMaxValue(static_cast<eBOUNDTYPE>(attr_value->bound_type_));
}
assert(attr_value && attr_value != &attr_value_static_);
return 0;
}
assert(attr_type < eATTR_MAX);
return 0;
}
#endif //!defined(_SERVER)
void Attributes::RegisterAll(bool is_reuse_data)
{
if (is_reuse_data == false) {
ZeroMemory(attr_values_,
static_cast<size_t>(last_field_end_ - reinterpret_cast<int8_t*>(attr_values_)));
};
assert(((&m_ArmorPhysicalAvoidRate + 1) == &m_MoveSpeedRatio) &&
((&m_MoveSpeedRatio + 1) == &m_AttSpeedRatio));
//==================================================================================================
#if defined(_DEBUG) || defined(_SERVER)
#define REGISTER_ATTR(AttrType, AttrValuePtr, BoundType, UpdateType, Desc) \
;{ \
BOOST_STATIC_ASSERT(AttrType < eATTR_MAX); \
AttrNode* node = &attr_values_[AttrType]; \
node->attr_value = AttrValuePtr; \
node->attr_type = AttrType; \
node->attr_type_str = #AttrType; \
node->attr_field = #AttrValuePtr;\
node->attr_desc = Desc; \
if (AttrValuePtr) { \
(AttrValuePtr)->bound_type_ = (BoundType); \
(AttrValuePtr)->update_type_ = (UpdateType); \
} \
};
#else
#define REGISTER_ATTR(AttrType, AttrValuePtr, BoundType, UpdateType, Desc) \
;{ \
BOOST_STATIC_ASSERT(AttrType < eATTR_MAX); \
AttrNode* node = &attr_values_[AttrType]; \
node->attr_value = AttrValuePtr; \
if (AttrValuePtr) { \
(AttrValuePtr)->bound_type_ = (BoundType); \
(AttrValuePtr)->update_type_ = (UpdateType); \
} \
};
#endif
//==================================================================================================
#define REGISTER_ATTR_UNUSED(AttrType) \
REGISTER_ATTR(AttrType, &attr_value_static_, eBOUNDTYPE_MAX, eUPDATETYPE_NOT_RATIO, "")
#ifdef _NA001605_EP2_ATTRIBUTES_RENEWAL_
#define REGISTER_ATTR_EP1(AttrType, AttrValuePtr, BoundType, UpdateType, Desc) \
REGISTER_ATTR_UNUSED(##AttrType)
#else
#define REGISTER_ATTR_EP1(AttrType, AttrValuePtr, BoundType, UpdateType, Desc) \
REGISTER_ATTR(AttrType, AttrValuePtr, BoundType, UpdateType, Desc)
#endif
//==================================================================================================
// initialize all
for (AttrNode* it = attr_values_; it != &attr_values_[_countof(attr_values_)]; ++it) {
it->attr_value = &attr_value_static_;
};
//
//REGISTER_ATTR(eATTR_TYPE_INVALID, NULL,
// eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
// "无效的属性");
//
;{
REGISTER_ATTR(eATTR_STR, &m_STR,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"23:增加力量");
REGISTER_ATTR(eATTR_DEX, &m_DEX,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"24:增加敏捷性");
REGISTER_ATTR(eATTR_VIT, &m_VIT,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"25:增加体力");
REGISTER_ATTR(eATTR_INT, &m_INT,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"26:增加智力");
REGISTER_ATTR(eATTR_SPR, &m_SPR,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"27:增加精神力");
};
;{
REGISTER_ATTR_EP1(eATTR_EXPERTY1, &m_Experty1,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"技能1");
REGISTER_ATTR_EP1(eATTR_EXPERTY2, &m_Experty2,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"技能2");
};
;{
// HP, MP
REGISTER_ATTR(eATTR_MAX_HP, &m_MaxHP,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"28:最大 HP");
REGISTER_ATTR(eATTR_MAX_MP, &m_MaxMP,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"29:最大 MP/SP");
REGISTER_ATTR(eATTR_CUR_HP, &m_CurHP,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"当前 HP");
REGISTER_ATTR(eATTR_CUR_MP, &m_CurMP,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"当前 MP");
REGISTER_ATTR(eATTR_RECOVERY_HP, &m_RecoverHP,
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"39:HP 恢复量");
REGISTER_ATTR(eATTR_RECOVERY_MP, &m_RecoverMP,
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"40:MP 恢复量");
};
//-----------------------------------------------------------------
//攻击相关参数
//-----------------------------------------------------------------
;{
//基础物理和魔法攻击力
REGISTER_ATTR(eATTR_BASE_MELEE_MIN_ATTACK_POWER, &m_BaseMeleeMinAttPower,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"最低基础物理攻击");
REGISTER_ATTR(eATTR_BASE_MELEE_MAX_ATTACK_POWER, &m_BaseMeleeMaxAttPower,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"最大基础物理攻击力");
REGISTER_ATTR(eATTR_BASE_RANGE_MIN_ATTACK_POWER, &m_BaseRangeMinAttPower,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"基础范围内的最小攻击伤害");
REGISTER_ATTR(eATTR_BASE_RANGE_MAX_ATTACK_POWER, &m_BaseRangeMaxAttPower,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"基础范围内最大攻击力");
REGISTER_ATTR_EP1(eATTR_BASE_MAGICAL_MIN_ATTACK_POWER, &m_BaseMagicMinAttPower,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"最低基础魔法攻击");
REGISTER_ATTR_EP1(eATTR_BASE_MAGICAL_MAX_ATTACK_POWER, &m_BaseMagicMaxAttPower,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"最大基础魔法攻击");
};
;{
//可选的物理和魔法攻击力
REGISTER_ATTR(eATTR_OPTION_PHYSICAL_ATTACK_POWER, &m_OptionPhysicalAttPower,
eBOUNDTYPE_MP_INFINITE, eUPDATETYPE_NOT_RATIO,
"47:可选物理攻击力");
REGISTER_ATTR_EP1(eATTR_OPTION_MAGICAL_ATTACK_POWER, &m_OptionMagicAttPower,
eBOUNDTYPE_MP_INFINITE, eUPDATETYPE_NOT_RATIO,
"48:可选魔法攻击");
REGISTER_ATTR_EP1(eATTR_OPTION_ALL_ATTACK_POWER, &m_OptionAllAttPower,
eBOUNDTYPE_MP_INFINITE, eUPDATETYPE_NOT_RATIO,
"21:可选总攻击");
};
;{
//魔法攻击力
REGISTER_ATTR(eATTR_MAGICAL_WATER_ATTACK_POWER,
&m_MagicalAttPower[eATTACK_TYPE_WATER],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"4:增加魔法属性攻击力(水)");
REGISTER_ATTR(eATTR_MAGICAL_FIRE_ATTACK_POWER,
&m_MagicalAttPower[eATTACK_TYPE_FIRE],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"3:增加魔法属性攻击力(火)");
REGISTER_ATTR(eATTR_MAGICAL_WIND_ATTACK_POWER,
&m_MagicalAttPower[eATTACK_TYPE_WIND],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"6:增加魔法属性攻击力(风)");
REGISTER_ATTR(eATTR_MAGICAL_EARTH_ATTACK_POWER,
&m_MagicalAttPower[eATTACK_TYPE_EARTH],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"5:增加魔法属性攻击力(土)");
REGISTER_ATTR(eATTR_MAGICAL_DARKNESS_ATTACK_POWER,
&m_MagicalAttPower[eATTACK_TYPE_DARKNESS],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"7增加魔法属性攻击力(暗)");
REGISTER_ATTR(eATTR_MAGICAL_DIVINE_ATTACK_POWER,
&m_MagicalAttPower[eATTACK_TYPE_DIVINE],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"");
REGISTER_ATTR(eATTR_MAGICAL_ALL_ATTACK_POWER, &m_MagicalAllAttPower,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_NOT_RATIO,
"35:增加了所有元素攻击力");
};
;{
//技能攻击力、技能百分比附加伤害
REGISTER_ATTR(eATTR_ADD_SKILL_ATTACK_POWER, &m_SkillAttackPower,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"30:技能攻击");
REGISTER_ATTR(eATTR_ADD_SKILL_DAMAGE_RATIO, &m_SkillPercentDamage,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"31:技能伤害加成率:技能额外伤害百分比");
// eBOUNDTYPE_ZP_1000->INFINITE 변경[CHANGUP_INTENSIFY_SKILLDAMAGE_STATUS]
};
//-----------------------------------------------------------------
// 防御相关参数
//-----------------------------------------------------------------
;{
//基础物理和魔法防御
REGISTER_ATTR(eATTR_BASE_MELEE_DEFENSE_POWER, &m_BaseMeleeDefPower,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"基本物理防御");
REGISTER_ATTR(eATTR_BASE_RANGE_DEFENSE_POWER, &m_BaseRangeDefPower,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"根据地物理防御");
REGISTER_ATTR_EP1(eATTR_BASE_MAGICAL_DEFENSE_POWER, &m_BaseMagicDefPower,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"基础魔法防御");
};
;{
//可选的物理和魔法防御
REGISTER_ATTR(eATTR_OPTION_PHYSICAL_DEFENSE_POWER, &m_OptionPhysicalDefPower,
eBOUNDTYPE_MP_INFINITE, eUPDATETYPE_NOT_RATIO,
"49:增加物理防御");
REGISTER_ATTR_EP1(eATTR_OPTION_MAGICAL_DEFENSE_POWER, &m_OptionMagicDefPower,
eBOUNDTYPE_MP_INFINITE, eUPDATETYPE_NOT_RATIO,
"50:添加魔法防御");
REGISTER_ATTR_EP1(eATTR_OPTION_ALL_DEFENSE_POWER, &m_OptionAllDefPower,
eBOUNDTYPE_MP_INFINITE, eUPDATETYPE_NOT_RATIO,
"22:增加总防御(物理+魔法)");
};
;{
//魔法防御(最低)
REGISTER_ATTR_EP1(eATTR_MAGICAL_WATER_DEFENSE_POWER,
&m_MagicalDefPower[eATTACK_TYPE_WATER],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"17:增加魔法属性抗性(水)");
REGISTER_ATTR_EP1(eATTR_MAGICAL_FIRE_DEFENSE_POWER,
&m_MagicalDefPower[eATTACK_TYPE_FIRE],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"16:增加魔法属性抗性(火)");
REGISTER_ATTR_EP1(eATTR_MAGICAL_WIND_DEFENSE_POWER,
&m_MagicalDefPower[eATTACK_TYPE_WIND],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"19:增加魔法属性抗性(风)");
REGISTER_ATTR_EP1(eATTR_MAGICAL_EARTH_DEFENSE_POWER,
&m_MagicalDefPower[eATTACK_TYPE_EARTH],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"18:增加魔法属性抗性(土)");
REGISTER_ATTR_EP1(eATTR_MAGICAL_DARKNESS_DEFENSE_POWER,
&m_MagicalDefPower[eATTACK_TYPE_DARKNESS],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"20:增加魔法属性抗性(暗)");
REGISTER_ATTR_EP1(eATTR_MAGICAL_DIVINE_DEFENSE_POWER,
&m_MagicalDefPower[eATTACK_TYPE_DIVINE],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"");
REGISTER_ATTR_EP1(eATTR_MAGICAL_ALL_DEFENSE_POWER,
&m_MagicalAllDefPower,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_NOT_RATIO,
"36:新增全属性防御");
};
;{
//攻击类型的额外防御
REGISTER_ATTR_EP1(eATTR_ADD_ALL_DEFENSE_POWER,
&m_BonusDefense[eATTACK_TYPE_ALL_OPTION],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"针对所有攻击类型的额外防御");
REGISTER_ATTR_EP1(eATTR_ADD_MELEE_DEFENSE_POWER,
&m_BonusDefense[eATTACK_TYPE_MELEE],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"添加近战攻击防御");
REGISTER_ATTR_EP1(eATTR_ADD_RANGE_DEFENSE_POWER,
&m_BonusDefense[eATTACK_TYPE_RANGE],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"增加范围攻击防御");
REGISTER_ATTR_EP1(eATTR_ADD_WATER_DEFENSE_POWER,
&m_BonusDefense[eATTACK_TYPE_WATER],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(水)攻击防御添加");
REGISTER_ATTR_EP1(eATTR_ADD_FIRE_DEFENSE_POWER,
&m_BonusDefense[eATTACK_TYPE_FIRE],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(火)攻击防御增加");
REGISTER_ATTR_EP1(eATTR_ADD_WIND_DEFENSE_POWER,
&m_BonusDefense[eATTACK_TYPE_WIND],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(风)攻击防御添加");
REGISTER_ATTR_EP1(eATTR_ADD_EARTH_DEFENSE_POWER,
&m_BonusDefense[eATTACK_TYPE_EARTH],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(土)攻击防御添加");
REGISTER_ATTR_EP1(eATTR_ADD_DARKNESS_DEFENSE_POWER,
&m_BonusDefense[eATTACK_TYPE_DARKNESS],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(暗)攻击防御添加");
REGISTER_ATTR_EP1(eATTR_ADD_DIVINE_DEFENSE_POWER,
&m_BonusDefense[eATTACK_TYPE_DIVINE],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(城堡)增加攻击防御");
REGISTER_ATTR_EP1(eATTR_ADD_PHYSICAL_DEFENSE_POWER,
&m_BonusDefense[eATTACK_TYPE_PHYSICAL_OPTION],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"增加了(物理)攻击防御");
REGISTER_ATTR_EP1(eATTR_ADD_MAGICAL_DEFENSE_POWER,
&m_BonusDefense[eATTACK_TYPE_MAGIC_OPTION],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(魔法) 攻击防御加成");
REGISTER_ATTR_EP1(eATTR_ADD_MAGICAL_ALL_DEFENSE_POWER,
&m_BonusDefense[eATTACK_TYPE_ALL_MAGIC],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(全魔法)攻击防御加成");
};
#ifdef _NA001605_EP2_ATTRIBUTES_RENEWAL_
;{
//攻击目标的防御降低率
REGISTER_ATTR(eATTR_DEL_PHYSICAL_TARGET_DEFENSE_RATIO,
&m_ReducePhysicalTargetDefenseRatio,
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"8:降低目标对物理攻击的防御率");
REGISTER_ATTR(eATTR_DEL_WATER_TARGET_DEFENSE_RATIO,
&m_ReduceElementTargetDefenseRatio[Elements::kToElementIndex[eATTACK_TYPE_WATER]],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"10:降低目标对元素(水)攻击的防御率");
REGISTER_ATTR(eATTR_DEL_FIRE_TARGET_DEFENSE_RATIO,
&m_ReduceElementTargetDefenseRatio[Elements::kToElementIndex[eATTACK_TYPE_FIRE]],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"9:降低目标对元素(火)攻击的防御率");
REGISTER_ATTR(eATTR_DEL_WIND_TARGET_DEFENSE_RATIO,
&m_ReduceElementTargetDefenseRatio[Elements::kToElementIndex[eATTACK_TYPE_WIND]],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"12:降低目标对元素(风)攻击的防御率");
REGISTER_ATTR(eATTR_DEL_EARTH_TARGET_DEFENSE_RATIO,
&m_ReduceElementTargetDefenseRatio[Elements::kToElementIndex[eATTACK_TYPE_EARTH]],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"11:降低目标对元素(土)攻击的防御率");
REGISTER_ATTR(eATTR_DEL_DARKNESS_TARGET_DEFENSE_RATIO,
&m_ReduceElementTargetDefenseRatio[Elements::kToElementIndex[eATTACK_TYPE_DARKNESS]],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"13:降低目标对元素(暗)攻击的防御率");
REGISTER_ATTR(eATTR_DEL_MAGICAL_ALL_TARGET_DEFENSE_RATIO,
&m_ReduceElementTargetDefenseRatioAll,
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"降低目标对元素(所有元素)攻击的防御率");
REGISTER_ATTR_UNUSED(eATTR_DEL_ALL_TARGET_DEFENSE_RATIO);
REGISTER_ATTR_UNUSED(eATTR_DEL_MELEE_TARGET_DEFENSE_RATIO);
REGISTER_ATTR_UNUSED(eATTR_DEL_RANGE_TARGET_DEFENSE_RATIO);
REGISTER_ATTR_UNUSED(eATTR_DEL_DIVINE_TARGET_DEFENSE_RATIO);
REGISTER_ATTR_UNUSED(eATTR_DEL_MAGICAL_TARGET_DEFENSE_RATIO);
};
#else
;{
//攻击目标的防御降低率
REGISTER_ATTR_EP1(eATTR_DEL_ALL_TARGET_DEFENSE_RATIO,
&m_ReduceDefenseRate[eATTACK_TYPE_ALL_OPTION],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"降低目标对(所有)攻击的防御率");
REGISTER_ATTR(eATTR_DEL_MELEE_TARGET_DEFENSE_RATIO,
&m_ReduceDefenseRate[eATTACK_TYPE_MELEE],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"降低目标对(近战)攻击的防御率");
REGISTER_ATTR(eATTR_DEL_RANGE_TARGET_DEFENSE_RATIO,
&m_ReduceDefenseRate[eATTACK_TYPE_RANGE],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"(Range) 降低目标对攻击的防御率");
REGISTER_ATTR(eATTR_DEL_WATER_TARGET_DEFENSE_RATIO,
&m_ReduceDefenseRate[eATTACK_TYPE_WATER],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"10:降低目标对(水)攻击的防御率");
REGISTER_ATTR(eATTR_DEL_FIRE_TARGET_DEFENSE_RATIO,
&m_ReduceDefenseRate[eATTACK_TYPE_FIRE],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"9:(火) 降低目标对攻击的防御率");
REGISTER_ATTR(eATTR_DEL_WIND_TARGET_DEFENSE_RATIO,
&m_ReduceDefenseRate[eATTACK_TYPE_WIND],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"12:降低目标对(风)攻击的防御率");
REGISTER_ATTR(eATTR_DEL_EARTH_TARGET_DEFENSE_RATIO,
&m_ReduceDefenseRate[eATTACK_TYPE_EARTH],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"11:降低目标对(地)攻击的防御率");
REGISTER_ATTR(eATTR_DEL_DARKNESS_TARGET_DEFENSE_RATIO,
&m_ReduceDefenseRate[eATTACK_TYPE_DARKNESS],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"13:(暗)目标对攻击的防御降低率");
REGISTER_ATTR_EP1(eATTR_DEL_DIVINE_TARGET_DEFENSE_RATIO,
&m_ReduceDefenseRate[eATTACK_TYPE_DIVINE],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"(神圣)降低目标防御攻击的速度");
REGISTER_ATTR(eATTR_DEL_PHYSICAL_TARGET_DEFENSE_RATIO,
&m_ReduceDefenseRate[eATTACK_TYPE_PHYSICAL_OPTION],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"8:(物理)降低目标对攻击的防御率");
REGISTER_ATTR_EP1(eATTR_DEL_MAGICAL_TARGET_DEFENSE_RATIO,
&m_ReduceDefenseRate[eATTACK_TYPE_MAGIC_OPTION],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"(魔法) 降低目标对攻击的防御率");
REGISTER_ATTR(eATTR_DEL_MAGICAL_ALL_TARGET_DEFENSE_RATIO,
&m_ReduceDefenseRate[eATTACK_TYPE_ALL_MAGIC],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"(全魔法) 降低目标对攻击的防御率");
};
#endif
//-----------------------------------------------------------------
//损坏相关参数
//-----------------------------------------------------------------
;{
//护甲类型的额外伤害
REGISTER_ATTR_EP1(eATTR_ADD_ARMOR_HARD_DAMAGE, &m_BonusDamage[eARMOR_HARD],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(Hard)对装甲的额外伤害");
REGISTER_ATTR_EP1(eATTR_ADD_ARMOR_MEDIUM_DAMAGE, &m_BonusDamage[eARMOR_MEDIUM],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(Medium)对装甲的额外伤害");
REGISTER_ATTR_EP1(eATTR_ADD_ARMOR_SOFT_DAMAGE, &m_BonusDamage[eARMOR_SOFT],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(Soft)对装甲的额外伤害");
REGISTER_ATTR_EP1(eATTR_ADD_ARMOR_SIEGE_DAMAGE, &m_BonusDamage[eARMOR_SIEGE],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(Siege)对装甲的额外伤害");
REGISTER_ATTR_EP1(eATTR_ADD_ARMOR_UNARMOR_DAMAGE, &m_BonusDamage[eARMOR_UNARMOR],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(Unarmor)对装甲的额外伤害");
};
;{
//护甲类型的额外伤害(百分比)
REGISTER_ATTR_EP1(eATTR_ADD_RATIO_ARMOR_HARD_DAMAGE, &m_BonusPercentDamage[eARMOR_HARD],
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"(Hard)对护甲的额外伤害(比率值)");
REGISTER_ATTR_EP1(eATTR_ADD_RATIO_ARMOR_MEDIUM_DAMAGE, &m_BonusPercentDamage[eARMOR_MEDIUM],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"(Medium)对护甲的额外伤害(比率值)");
REGISTER_ATTR_EP1(eATTR_ADD_RATIO_ARMOR_SOFT_DAMAGE, &m_BonusPercentDamage[eARMOR_SOFT],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"(Soft)对护甲的额外伤害(比率值)");
REGISTER_ATTR_EP1(eATTR_ADD_RATIO_ARMOR_SIEGE_DAMAGE, &m_BonusPercentDamage[eARMOR_SIEGE],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"(攻城)对护甲的额外伤害(百分比值)");
REGISTER_ATTR_EP1(eATTR_ADD_RATIO_ARMOR_UNARMOR_DAMAGE, &m_BonusPercentDamage[eARMOR_UNARMOR],
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"(Unarmor) 对护甲的额外伤害(百分比值)");
};
#ifdef _NA001605_EP2_ATTRIBUTES_RENEWAL_
;{
REGISTER_ATTR(eATTR_DEL_PHYSICAL_DAMAGE,
&m_ReducePhysicalDamageRatio,
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"对物理攻击的伤害减免率");
REGISTER_ATTR(eATTR_DEL_WATER_DAMAGE,
&m_ReduceElementDamageRatio[Elements::kToElementIndex[eATTACK_TYPE_WATER]],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"元素(水)攻击的伤害减免率");
REGISTER_ATTR(eATTR_DEL_FIRE_DAMAGE,
&m_ReduceElementDamageRatio[Elements::kToElementIndex[eATTACK_TYPE_FIRE]],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"元素(火)攻击的伤害减免率");
REGISTER_ATTR(eATTR_DEL_WIND_DAMAGE,
&m_ReduceElementDamageRatio[Elements::kToElementIndex[eATTACK_TYPE_WIND]],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"元素(风)攻击的伤害减免率");
REGISTER_ATTR(eATTR_DEL_EARTH_DAMAGE,
&m_ReduceElementDamageRatio[Elements::kToElementIndex[eATTACK_TYPE_EARTH]],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"元素(土)攻击的伤害减免率");
REGISTER_ATTR(eATTR_DEL_DARKNESS_DAMAGE,
&m_ReduceElementDamageRatio[Elements::kToElementIndex[eATTACK_TYPE_DARKNESS]],
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"元素(暗)攻击的伤害减免率");
REGISTER_ATTR(eATTR_DEL_MAGICAL_ALL_DAMAGE,
&m_ReduceElementDamageRatioAll,
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"元素(所有)攻击的伤害减免率");
REGISTER_ATTR_UNUSED(eATTR_DEL_ALL_DAMAGE);
REGISTER_ATTR_UNUSED(eATTR_DEL_MELEE_DAMAGE);
REGISTER_ATTR_UNUSED(eATTR_DEL_RANGE_DAMAGE);
REGISTER_ATTR_UNUSED(eATTR_DEL_DIVINE_DAMAGE);
REGISTER_ATTR_UNUSED(eATTR_DEL_PHYSICAL_DAMAGE);
REGISTER_ATTR_UNUSED(eATTR_DEL_MAGICAL_DAMAGE);
};
#else
;{
REGISTER_ATTR_EP1(eATTR_DEL_ALL_DAMAGE, &m_ReduceDamage[eATTACK_TYPE_ALL_OPTION],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"减少对(所有)攻击的伤害");
REGISTER_ATTR_EP1(eATTR_DEL_MELEE_DAMAGE, &m_ReduceDamage[eATTACK_TYPE_MELEE],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"减少对(近战)攻击的伤害");
REGISTER_ATTR_EP1(eATTR_DEL_RANGE_DAMAGE, &m_ReduceDamage[eATTACK_TYPE_RANGE],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(范围)对攻击的伤害减免");
REGISTER_ATTR_EP1(eATTR_DEL_WATER_DAMAGE, &m_ReduceDamage[eATTACK_TYPE_WATER],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"减少对(水)攻击的伤害");
REGISTER_ATTR_EP1(eATTR_DEL_FIRE_DAMAGE, &m_ReduceDamage[eATTACK_TYPE_FIRE],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"减少对(火)攻击的伤害");
REGISTER_ATTR_EP1(eATTR_DEL_WIND_DAMAGE, &m_ReduceDamage[eATTACK_TYPE_WIND],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"减少对(风)攻击的伤害");
REGISTER_ATTR_EP1(eATTR_DEL_EARTH_DAMAGE, &m_ReduceDamage[eATTACK_TYPE_EARTH],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"减少对(土)攻击的伤害");
REGISTER_ATTR_EP1(eATTR_DEL_DARKNESS_DAMAGE, &m_ReduceDamage[eATTACK_TYPE_DARKNESS],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"减少对(暗)攻击的伤害");
REGISTER_ATTR_EP1(eATTR_DEL_DIVINE_DAMAGE, &m_ReduceDamage[eATTACK_TYPE_DIVINE],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(神圣)对攻击的伤害减免");
REGISTER_ATTR_EP1(eATTR_DEL_PHYSICAL_DAMAGE, &m_ReduceDamage[eATTACK_TYPE_PHYSICAL_OPTION],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(物理)对攻击的伤害减免");
REGISTER_ATTR_EP1(eATTR_DEL_MAGICAL_DAMAGE, &m_ReduceDamage[eATTACK_TYPE_MAGIC_OPTION],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(魔法)对攻击的伤害减免");
REGISTER_ATTR_EP1(eATTR_DEL_MAGICAL_ALL_DAMAGE, &m_ReduceDamage[eATTACK_TYPE_ALL_MAGIC],
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"(全魔法)对攻击的伤害减免");
};
#endif
;{
//攻击成功率、回避率
#ifdef _NA001605_EP2_ATTRIBUTES_RENEWAL_
uint8_t update_type_select = eUPDATETYPE_NOTHING;
#else
uint8_t update_type_select = eUPDATETYPE_SUM_RATIO;
#endif
REGISTER_ATTR(eATTR_PHYSICAL_ATTACK_SUCCESS_RATIO, &m_PhysicalAttackRate,
eBOUNDTYPE_ZP_10000, update_type_select,
"2:整体物理攻击成功率(百分比)");
REGISTER_ATTR(eATTR_PHYSICAL_ATTACK_BLOCK_RATIO, &m_PhysicalAvoidRate,
eBOUNDTYPE_ZP_10000, update_type_select,
"15:[R][ 15]攻防率(Option) 加成率(Ratio)");
#ifdef _NA001605_EP2_ATTRIBUTES_RENEWAL_
REGISTER_ATTR(eATTR_PHYSICAL_ATTACK_BLOCK_BASE_ARMOR_RATIO, &m_ArmorPhysicalAvoidRate,
eBOUNDTYPE_ZP_10000, eUPDATETYPE_NOTHING,
"EP2:added,总攻防率项(总和/5");
#endif
};
;{
REGISTER_ATTR(eATTR_MOVE_SPEED, &m_MoveSpeedRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOTHING,
"14:增加移动速度");
REGISTER_ATTR(eATTR_ATTACK_SPEED, &m_AttSpeedRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOTHING,
"1:增加了整体攻击速度");
};
;{
REGISTER_ATTR(eATTR_ALL_ATTACK_RANGE, &m_AllRangeBonus,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"所有攻击范围");
REGISTER_ATTR(eATTR_NORMAL_ATTACK_RANGE, &m_NormalRangeBonus,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"普通攻击范围");
REGISTER_ATTR(eATTR_SKILL_ATTACK_RANGE, &m_SkillRangeBonus,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"技能范围");
};
;{
REGISTER_ATTR(eATTR_SIGHT_RANGE, &m_SightRange,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"视线");
};
;{
REGISTER_ATTR(eATTR_CRITICAL_RATIO_CHANGE, &m_CriticalRatioChange,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"暴击几率增加或减少");
REGISTER_ATTR_EP1(eATTR_ADD_MAGICAL_CRITICAL_RATIO, &m_MagicCriticalRatio,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"添加魔法暴击率");
REGISTER_ATTR(eATTR_ADD_ALL_CRITICAL_RATIO, &m_CriticalRatioBonus,
eBOUNDTYPE_MP_INFINITE, eUPDATETYPE_NOT_RATIO,
"41:增加了整体暴击率");
REGISTER_ATTR(eATTR_CRITICAL_DAMAGE_CHANGE, &m_CriticalDamageBonus,
eBOUNDTYPE_MP_INFINITE, eUPDATETYPE_SUM_RATIO,
"42:增加致命伤害");
};
;{
REGISTER_ATTR(eATTR_ADD_ATTACK_INC_RATIO, &m_AttackIncRate,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"增加额外攻击的机会(百分比)");
REGISTER_ATTR(eATTR_ADD_DEFENSE_INC_RATIO, &m_DefenseIncRate,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"增加防御额外攻击的机会(百分比)");
REGISTER_ATTR(eATTR_INCREASE_SKILL_LEVEL, &m_SkillLevelAll,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"技能等级提升1");
// (NOTE) 使用选项标志的特殊属性
//REGISTER_ATTR(eATTR_INCREASE_STAT_POINT, NULL,
// eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
// "32 添加所有统计信息"); //<没有价值 只有状态.
};
;{
// taiyo
REGISTER_ATTR(eATTR_DECREASE_LIMIT_STAT, &m_DecreaseLimitStat,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"33:降低统计限制");
REGISTER_ATTR(eATTR_MP_SPEND_INCREASE, &m_MPSpendIncrease,
eBOUNDTYPE_MP_10000, eUPDATETYPE_NOT_RATIO,
"34:MP消耗增减");
};
;{
//添加了商业项目选项
REGISTER_ATTR(eATTR_ABSORB_HP, &m_AbsorbHP,
eBOUNDTYPE_ZP_10000, eUPDATETYPE_SUM_RATIO,
"37:HP吸收");
REGISTER_ATTR(eATTR_ABSORB_MP, &m_AbsorbMP,
eBOUNDTYPE_ZP_10000, eUPDATETYPE_SUM_RATIO,
"38:MP/SP吸收");
REGISTER_ATTR(eATTR_REFLECT_DAMAGE_RATIO, &m_ReflectDamageRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"43:伤害反射");
REGISTER_ATTR(eATTR_BONUS_MONEY_RATIO, &m_BonusMoneyRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"44:奖金增加");
REGISTER_ATTR(eATTR_BONUS_EXP_RATIO, &m_BonusExpRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"45:经验增加");
REGISTER_ATTR(eATTR_AREA_ATTACK_RATIO, &m_AreaAttackRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"46:多次攻击概率");
REGISTER_ATTR(eATTR_BONUS_CASTING_TIME, &m_BonusCastingTime,
eBOUNDTYPE_MP_1000, eUPDATETYPE_NOT_RATIO,
"65:技能施法时间增加");
REGISTER_ATTR(eATTR_BONUS_SKILL_COOL_TIME, &m_BonusSkillCoolTime,
eBOUNDTYPE_MP_1000, eUPDATETYPE_NOT_RATIO,
"EP2:75:[R]技能冷却增加");
REGISTER_ATTR(eATTR_DECREASE_DAMAGE, &m_DecDamage,
eBOUNDTYPE_MP_10000, eUPDATETYPE_NOT_RATIO,
"51:减少伤害");
REGISTER_ATTR(eATTR_RESURRECTION_RATIO, &m_ResurrectionRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"52:死亡时自我复活的机会");
REGISTER_ATTR(eATTR_DOUBLE_DAMAGE_RATIO, &m_DoubleDamageRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"53:几率双倍伤害");
REGISTER_ATTR(eATTR_LUCKMON_INC_DAMAGE, &m_LuckMonIncDamage,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"54:攻击幸运怪物时的额外伤害");
REGISTER_ATTR(eATTR_COPOSITE_INC_RATIO, &m_CompositeIncRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"55:提高组合成功率");
REGISTER_ATTR(eATTR_BYPASS_DEFENCE_RATIO, &m_BypassDeffenceRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"56:防御忽略几率");
// 57最小伤害增加(数量)/减少概率[使用m_iItemRatio作为减少概率]
REGISTER_ATTR(eATTR_INCREASE_MIN_DAMAGE, &m_IncreaseMinDamage,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOT_RATIO,
"57:最小伤害增加");
// 58 最大伤害增加(数量)/减少概率[使用m_iItemRatio作为减少率]
REGISTER_ATTR(eATTR_INCREASE_MAX_DAMAGE, &m_IncreaseMaxDamage,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOT_RATIO,
"58:最大伤害加成");
REGISTER_ATTR(eATTR_DECREASE_ITEMDURA_RATIO, &m_DecreaseItemDuraRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"59:有几率无视物品耐久度降低");
//状态抗性几率/技能持续时间
REGISTER_ATTR(eATTR_RESISTANCE_BADSTATUS_RATIO, &m_ResistBadStatusRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"60:有几率无视技能效果(debuff + 特殊状态)");
REGISTER_ATTR(eATTR_INCREASE_SKILLDURATION, &m_IncreaseSkillDuration,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"61:技能效果时间增加(buff");
REGISTER_ATTR(eATTR_DECREASE_SKILL_SKILLDURATION, &m_DecreaseSkillDuration,
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"62:减少技能效果时间(debuff"); // CHANGES: f110603.2L, f110531.6L
// eATTR_TYPE 根据定义移除定义移除
REGISTER_ATTR(eATTR_OPTION_ETHER_DAMAGE_RATIO, &m_EhterDamageRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"63:以太武器伤害变化");
REGISTER_ATTR(eATTR_OPTION_ETHER_PvE_DAMAGE_RATIO, &m_EhterPvEDamageRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"76:以太武器伤害变化(PvE"); // NOTE: f110601.4L
//__NA_001196_20081110_RECOVERY_ADD_OPTION
REGISTER_ATTR(eATTR_INCREASE_RESERVE_HP, &m_IncreaseReserveHPRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"64:获得的HP增加");
//#ifdef _NA_001231_20081216_ADD_OPTION_KIND
REGISTER_ATTR(eATTR_RESIST_HOLDING, &m_ResistHolding,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"66:持有阻力");
REGISTER_ATTR(eATTR_RESIST_SLEEP, &m_ResistSleep,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"67:防滑性");
REGISTER_ATTR(eATTR_RESIST_POISON, &m_ResistPoison,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"68:毒耐受");
REGISTER_ATTR(eATTR_RESIST_KNOCKBACK, &m_ResistKnockBack,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"69:击退抗性");
REGISTER_ATTR(eATTR_RESIST_DOWN, &m_ResistDown,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"70:向下阻力");
REGISTER_ATTR(eATTR_RESIST_STUN, &m_ResistStun,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"71:眩晕抗性");
REGISTER_ATTR(eATTR_DECREASE_PVPDAMAGE, &m_DecreasePVPDamage,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"72:PVP伤害减免");
//#endif
// __NA_S00015_20080828_NEW_HOPE_SHADOW
REGISTER_ATTR(eATTR_ADD_DAMAGE, &m_AddDamage,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"73:额外伤害");
//__NA_1241_AUTO_PICKUP_PET_OPTION
REGISTER_ATTR(eATTR_AUTO_ITEM_PICK_UP, &m_AutoPickup,
eBOUNDTYPE_ZP_100, eUPDATETYPE_SUM_RATIO,
"74:物品自动拾取");
// _NA_003966_20111227_ADD_ENCHANT
REGISTER_ATTR(eATTR_INCREASE_ENCHANT_RATIO, &m_IncreaseEnchantRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"77:附魔成功率增加");
#ifdef _20220109_ADD_ATTACKDECDAMAGE
REGISTER_ATTR(eATTR_BYPASS_DECDAMAGE, &m_PassDecDamage,
eBOUNDTYPE_MP_10000, eUPDATETYPE_SUM_RATIO,
"78:贯穿");
#endif
};
;{
//__NA_001290_20090525_SHIELD_SYSTEM
REGISTER_ATTR(eATTR_MAX_SD, &m_MaxSD,
eBOUNDTYPE_ZP_INFINITE, eUPDATETYPE_SUM_RATIO,
"93:最大SD");
REGISTER_ATTR(eATTR_RECOVERY_SD, &m_RecoverSD,
eBOUNDTYPE_MP_INFINITE, eUPDATETYPE_SUM_RATIO,
"94:SD恢复量");
};
#ifdef _NA_006731_20130521_ENCHANT_ADD_OPTION
;{
REGISTER_ATTR(eATTR_ENEMY_CRITICAL_RATIO_CHANGE, &m_EnemyCriticalRatioChange,
eBOUNDTYPE_MP_INFINITE, eUPDATETYPE_SUM_RATIO,
"96:攻击时增加/减少对手的暴击率");
};
#endif // _NA_006731_20130521_ENCHANT_ADD_OPTION
;{
REGISTER_ATTR(eATTR_PREMIUMSERVICE_PCBANG, &m_PCBang,
eBOUNDTYPE_ZP_100, eUPDATETYPE_NOT_RATIO,
"97:网吧效果");
};
#ifdef _NA_006680_20130426_ITEM_OPTION_ADD_AND_MODIFY
;{
REGISTER_ATTR(eATTR_ATTACK_DAMAGE_ABSORB_SD_RATIO, &m_AttackDamageAbsorbSDRatio,
eBOUNDTYPE_ZP_100, eUPDATETYPE_SUM_RATIO,
"98:伤害造成的 SD 转换量");
REGISTER_ATTR(eATTR_ATTACK_DAMAGE_ABSORB_HP_RATIO, &m_AttackDamageAbsorbHPRatio,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"99:造成伤害的HP转换量");
};
#endif // _NA_006680_20130426_ITEM_OPTION_ADD_AND_MODIFY
#ifdef _NA_006937_20131030_ABILITY_AND_STATE_CHANGE_CRITICAL
;{
REGISTER_ATTR(eATTR_ENEMY_CRITICAL_DAMAGE_CHANGE, &m_EnemyCriticalDamageChange,
eBOUNDTYPE_MP_INFINITE, eUPDATETYPE_SUM_RATIO,
"100:被攻击时增加或减少对手的暴击伤害");
};
#endif //_NA_006937_20131030_ABILITY_AND_STATE_CHANGE_CRITICAL
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
;{
REGISTER_ATTR(eATTR_CRAFT_COST_RATIO, &m_CraftCostRatio,
eBOUNDTYPE_MP_100, eUPDATETYPE_SUM_RATIO,
"101:生产成本增减");
REGISTER_ATTR(eATTR_CRAFT_PREVENT_EXTINCTION_MATERIAL_RATIO, &m_CraftPreventExtinctionMaterialRatio,
eBOUNDTYPE_MP_100, eUPDATETYPE_SUM_RATIO,
"102:生产故障时防止材料损坏");
REGISTER_ATTR(eATTR_ENCHANT_COST_RATIO, &m_EnchantCostRatio,
eBOUNDTYPE_MP_100, eUPDATETYPE_SUM_RATIO,
"103:附魔费用增加或减少");
REGISTER_ATTR(eATTR_ENCHANT_PREVENT_DESTROY_N_DOWNGRADE_ITEM_RATIO, &m_EnchantPreventDestroyNDowngradeItemRatio,
eBOUNDTYPE_MP_100, eUPDATETYPE_SUM_RATIO,
"104:附魔失败时防止物品破坏和等级下降");
REGISTER_ATTR(eATTR_RECOVER_POTION_COOLTIME_RATIO, &m_RecoverPotionCooltimeRatio,
eBOUNDTYPE_MP_100, eUPDATETYPE_SUM_RATIO,
"105:恢复药水冷却时间增加/减少");
REGISTER_ATTR(eATTR_RECOVER_POTION_RECOVERY_RATIO, &m_RecoverPotionRecoveryRatio,
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"106:恢复药水恢复量增减");
REGISTER_ATTR(eATTR_QUEST_REWARD_EXP_RATIO, &m_QuestRewardExpRatio,
eBOUNDTYPE_MP_INFINITE, eUPDATETYPE_SUM_RATIO,
"107:增加或减少任务奖励经验");
REGISTER_ATTR(eATTR_MAX_DAMAGE_RATIO, &m_MaxDamageRatio,
eBOUNDTYPE_MP_100, eUPDATETYPE_SUM_RATIO,
"108:增加/减少最大伤害几率");
REGISTER_ATTR(eATTR_DOMINATION_MAPOBJECT_DAMAGE_RATIO, &m_DominationMapobjectDamageRatio,
eBOUNDTYPE_MP_100, eUPDATETYPE_SUM_RATIO,
"109:增加或减少攻城对象伤害");
REGISTER_ATTR(eATTR_SHOP_REPAIR_HEIM_RATIO, &m_ShopRepairHeimRatio,
eBOUNDTYPE_MP_100, eUPDATETYPE_SUM_RATIO,
"110:店铺维修海姆增减");
REGISTER_ATTR(eATTR_SHOP_BUY_HEIM_RATIO, &m_ShopBuyHeimRatio,
eBOUNDTYPE_MP_100, eUPDATETYPE_SUM_RATIO,
"111:商店购买海姆增加或减少");
};
#endif //_NA_007330_20140620_GUILD_SYSTEM_EXTENSION
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
REGISTER_ATTR(eATTR_MAX_FP, &m_MaxFP,
eBOUNDTYPE_ZP_100, eUPDATETYPE_SUM_RATIO,
"112:最大 FP");
REGISTER_ATTR(eATTR_RECOVERY_FP, &m_RecoverFP,
eBOUNDTYPE_ZP_100, eUPDATETYPE_SUM_RATIO,
"113:FP恢复量");
#endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
REGISTER_ATTR(eATTR_INCREASE_DAMAGE_RATIO, &m_IncreaseDamageRatio,
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"114:伤害增加");
#ifdef _NA_008124_20150313_AWAKENING_SYSTEM
REGISTER_ATTR(eATTR_AWAKENING_PROBABILITY, &m_AwakeningProbability,
eBOUNDTYPE_MP_1000, eUPDATETYPE_SUM_RATIO,
"115:觉醒概率增加/减少");
#endif // _NA_008124_20150313_AWAKENING_SYSTEM
#ifdef _NA_008486_20150914_TOTAL_BALANCE
REGISTER_ATTR(eATTR_DEBUFF_DURATION, &m_DebuffDuration,
eBOUNDTYPE_ZP_10000, eUPDATETYPE_SUM_RATIO,
"116:减益效果持续时间增强");
#endif //_NA_008486_20150914_TOTAL_BALANCE
#ifdef _NA_008540_20151027_ADD_ITEMOPTION_ELITE4
;{
REGISTER_ATTR(eATTR_DECREASE_DAMAGE_NPC, &m_DecreaseDamageNPC,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOT_RATIO,
"117:减少 NPC 造成的伤害");
REGISTER_ATTR(eATTR_DECREASE_DAMAGE_BERSERKER, &m_DecreaseDamageBerserker,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOT_RATIO,
"118:减少狂战士造成的伤害");
REGISTER_ATTR(eATTR_DECREASE_DAMAGE_DRAGONKNIGHT, &m_DecreaseDamageDragonKnight,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOT_RATIO,
"119:减少龙骑士造成的伤害");
REGISTER_ATTR(eATTR_DECREASE_DAMAGE_VALKYRIE, &m_DecreaseDamageValkyrie,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOT_RATIO,
"120:降低瓦尔基里造成的伤害");
REGISTER_ATTR(eATTR_DECREASE_DAMAGE_ELEMENTALIST, &m_DecreaseDamageElementalist,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOT_RATIO,
"121:减少元素使造成的伤害");
REGISTER_ATTR(eATTR_DECREASE_DAMAGE_SHADOW, &m_DecreaseDamageShadow,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOT_RATIO,
"122:减少阴影造成的伤害");
REGISTER_ATTR(eATTR_DECREASE_DAMAGE_MYSTIC, &m_DecreaseDamageMystic,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOT_RATIO,
"123:减少神秘主义者造成的伤害");
REGISTER_ATTR(eATTR_DECREASE_DAMAGE_HELLROID, &m_DecreaseDamageHellroid,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOT_RATIO,
"124:降低 Helloids 造成的伤害");
REGISTER_ATTR(eATTR_DECREASE_DAMAGE_WITCHBLADE, &m_DecreaseDamageWitchBlade,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOT_RATIO,
"125:女巫之刃造成的伤害降低");
REGISTER_ATTR(eATTR_INCREASE_SKILL_LEVEL, &m_SkillLevelAll,
eBOUNDTYPE_ZP_1000, eUPDATETYPE_SUM_RATIO,
"126:技能等级提升1");
#ifdef _NA_003740_20210704_SKILL_LEVLEUP_OPTION
REGISTER_ATTR(eATTR_LEVELUP_SKILL,&m_SkillLevelUp, //技能等级提升 by:十里坡剑神 2021-07-04
eBOUNDTYPE_ZP_1000,eUPDATETYPE_NOT_RATIO,
"技能等级提升");
#endif //_NA_003740_20210704_SKILL_LEVLEUP_OPTION
};
#endif //_NA_008540_20151027_ADD_ITEMOPTION_ELITE4
//-----__NA001390_090915_RIDING_SYSTEM__------
//----这未在 attr_values_ 中注册---
m_RiderSpeedRatio.SetType(eBOUNDTYPE_ZP_1000, eUPDATETYPE_NOTHING);
//--------------------------------------------
#ifdef _DEBUG
for (int i = eATTR_TYPE_INVALID + 1; i < eATTR_MAX; ++i)
{
if (i != eATTR_INCREASE_STAT_POINT) {
ASSERT(attr_values_[i].attr_value != NULL);
}
}
#endif
}
// added by _NA001605_EP2_ATTRIBUTES_RENEWAL_
void Attributes::GetDefaultMagicalAttributes(
Elements* const attack,
Elements* const rate_of_defense_power_reduction_of_target,
Elements* const damage_reduction_against_attack) const
{
BOOST_STATIC_ASSERT(_countof(attack->values) == _countof(Elements::kElementsMappedArray));
if (attack) {
ZeroMemory(attack, sizeof(*attack));
}
if (rate_of_defense_power_reduction_of_target) {
ZeroMemory(rate_of_defense_power_reduction_of_target,
sizeof(*rate_of_defense_power_reduction_of_target));
};
if (damage_reduction_against_attack) {
ZeroMemory(damage_reduction_against_attack,
sizeof(*damage_reduction_against_attack));
};
#ifdef _NA001605_EP2_ATTRIBUTES_RENEWAL_
//属性攻击
if (attack)
{
const eATTACK_TYPE* search_it = Elements::kElementsMappedArray;
for (int* it = attack->values;
it != &attack->values[_countof(attack->values)];
++it, ++search_it)
{
//属性攻击(基础)
*it = m_MagicalAttPower[*search_it].calc_value_.value_;
}
};
#if SUN_CODE_BACKUP
//属性防御
if (defense)
{
const eATTACK_TYPE* search_it = Elements::kElementsMappedArray;
for (int* it = defense->values;
it != &defense->values[_countof(defense->values)];
++it, ++search_it)
{
//属性防御(默认)
*it = m_MagicalDefPower[*search_it].calc_value_.value_;
//攻击类型的额外防御
*it += m_BonusDefense[*search_it].calc_value_.value_;
}
};
#endif
//目标防御降低率
if (rate_of_defense_power_reduction_of_target)
{
const AttrValue* src_attr_it = m_ReduceElementTargetDefenseRatio;
for (int* it = rate_of_defense_power_reduction_of_target->values;
it != &rate_of_defense_power_reduction_of_target->values[
_countof(rate_of_defense_power_reduction_of_target->values)];
++it, ++src_attr_it)
{
*it = src_attr_it->calc_value_.value_;
}
};
//对攻击的伤害减免率
if (damage_reduction_against_attack)
{
const AttrValue* src_attr_it = m_ReduceElementDamageRatio;
for (int* it = damage_reduction_against_attack->values;
it != &damage_reduction_against_attack->values[
_countof(damage_reduction_against_attack->values)];
++it, ++src_attr_it)
{
*it = src_attr_it->calc_value_.value_;
}
}
#endif
}