📄 characterformula.cpp
字号:
// 2瞒 单固瘤 拌魂(付过)
int CalcSecondDamage_Magic( int iFirstMinDamage, int iFirstMaxDamage, int iBonusDamage, int iTargetDefense )
{
int iFirstDamage = random( iFirstMinDamage, iFirstMaxDamage );
int iSecondDamage = iFirstDamage * 120 / ( iTargetDefense + 120 );
// 弥家焊厘阑 眉农茄促.
if( iSecondDamage <= iFirstMinDamage / 20 )
{
int damageBound = iFirstMinDamage / 20 + 1;
iSecondDamage = damageBound + random( 0, damageBound );
}
return iSecondDamage;
}
BOOL IsCriticalHit( eOBJECT_TYPE eObjectType, int criticalRatio, LEVELTYPE LV )
{
if( ( eObjectType & PLAYER_OBJECT ) == PLAYER_OBJECT )
{
int B = 25 + LV * 8;
int iRandom = random( 1, B );
if( iRandom <= criticalRatio )
{
return TRUE;
}
}
else
{
//阁胶磐狼 版快绰 NPCInfo.txt俊辑 犬伏蔼(criticalRatio)阑 掘绢辑 魄沥
if( (int)random( 1, 100 ) <= criticalRatio )
return TRUE;
}
return FALSE;
}
// 农府萍拿 单固瘤 拌魂
int CalcCriticalDamage( eOBJECT_TYPE eObjectType, LEVELTYPE TargetLV, int iSecondDamage, int iCriticalRatio,
int iCriticalDamageBonus, float fCriticalDamagePercentBonus )
{
if ( !IsCriticalHit( eObjectType, iCriticalRatio, TargetLV ) ) return 0;
int iCriticalDamage = (int)( iSecondDamage * 1.2f + random( 0, iSecondDamage ) * 0.5f );
// 农府萍拿 单固瘤(欺季飘) 焊呈胶
iCriticalDamage = (int)( iCriticalDamage * ( 1+ fCriticalDamagePercentBonus ) );
iCriticalDamage += iCriticalDamageBonus;
return iCriticalDamage;
}
//----------------------------------------------------------------------------------------------------
// 拱府 傍拜(胶懦)
//----------------------------------------------------------------------------------------------------
DAMAGETYPE CalcPhysicalDamage_Skill( Character* pAttacker, Character* pTarget, eATTACK_TYPE eAttackType,
int iSkillAttackPower, float fSkillPercentDamage, WORD criticalRatioBonus,
BOOL* pCritical, BYTE bySkillStatType, float fDefenseIgnore )
{
short nPhysicalAttackRate = pAttacker->GetAttr().GetPhysicalAttackRate();
if(0 >= nPhysicalAttackRate)
nPhysicalAttackRate = 1;
// 老馆 傍拜老 版快绰 喉废啦阑 拌魂窍绊 胶懦 傍拜老 版快绰 拌魂窍瘤 臼澜!!
if( 0 == iSkillAttackPower )
{
// 傍拜己傍-喉废
int nTempAvoidValue = min( 100, 100 * (double)((double)(pTarget->GetPhysicalAvoidValue()) / (double)nPhysicalAttackRate) ) - 10;
if(5 > nTempAvoidValue)
nTempAvoidValue = 5;
DWORD dwAvoidValue = nTempAvoidValue;
DWORD dwSuccessValue = random( 0, 100 );
if( dwSuccessValue <= dwAvoidValue )
{
return 0;
}
}
// 扁夯傍拜仿, 胶懦傍拜仿, 槛访档, 鸥百规绢仿, 胶懦欺季飘眠啊单固瘤
int iBaseMinAttackPower = pAttacker->GetAttr().GetOptionPhysicalAttPower();
int iBaseMaxAttackPower = pAttacker->GetAttr().GetOptionPhysicalAttPower();
if( eAttackType == eATTACK_TYPE_MELEE )
{
iBaseMinAttackPower += pAttacker->GetAttr().GetBaseMeleeMinAttPower();
iBaseMaxAttackPower += pAttacker->GetAttr().GetBaseMeleeMaxAttPower();
}
else
{
iBaseMinAttackPower += pAttacker->GetAttr().GetBaseRangeMinAttPower();
iBaseMaxAttackPower += pAttacker->GetAttr().GetBaseRangeMaxAttPower();
}
iBaseMinAttackPower += (int)(iBaseMinAttackPower * pAttacker->GetAttr().GetAttackIncRate() / 100.0f);
iBaseMaxAttackPower += (int)(iBaseMaxAttackPower * pAttacker->GetAttr().GetAttackIncRate() / 100.0f);
iBaseMinAttackPower += pAttacker->GetAttr().GetBonusMinAttackPower( eAttackType );
iBaseMaxAttackPower += pAttacker->GetAttr().GetBonusMaxAttackPower( eAttackType );
iSkillAttackPower += pAttacker->GetAttr().GetSkillAttackPower();
SHORT sSkillStat = 0;
if( bySkillStatType == 1 ) sSkillStat = pAttacker->GetAttr().GetExperty1();
else if( bySkillStatType == 2 ) sSkillStat = pAttacker->GetAttr().GetExperty2();
// 规绢仿 拌魂
int iTargetDefense = pTarget->GetAttr().GetOptionPhysicalDefPower();
if( eAttackType == eATTACK_TYPE_MELEE )
{
iTargetDefense += pTarget->GetAttr().GetBaseMeleeDefPower();
}
else
{
iTargetDefense += pTarget->GetAttr().GetBaseRangeDefPower();
}
iTargetDefense += pTarget->GetAttr().GetBonusDefense( eAttackType );
int iIncreaseDefence = (int)(iTargetDefense * pTarget->GetAttr().GetDefenseIncRate() / 100.0f);
int iDecreaseDefense = (int)(iTargetDefense * pAttacker->GetAttr().GetReduceDefenseRate( eAttackType ) / 100.0f);
iTargetDefense = iTargetDefense + iIncreaseDefence - iDecreaseDefense;
if( fDefenseIgnore > 0 && fDefenseIgnore <= 1.0f )
{
iTargetDefense -= (int)(iTargetDefense * fDefenseIgnore);
}
fSkillPercentDamage += (float)( pAttacker->GetAttr().GetSkillPercentDamage() / 1000.0f );
// 1瞒 单固瘤 拌魂
int iFirstMinDamage = CalcFirstDamage( iBaseMinAttackPower, iSkillAttackPower, sSkillStat, fSkillPercentDamage, eATTACK_TYPE_PHYSICAL_OPTION );
int iFirstMaxDamage = CalcFirstDamage( iBaseMaxAttackPower, iSkillAttackPower, sSkillStat, fSkillPercentDamage, eATTACK_TYPE_PHYSICAL_OPTION );
// 焊呈胶 单固瘤, 酒赣 鸥涝喊 单固瘤 利侩伏
int iBonusDamage = pAttacker->GetAttr().GetBonusDamage( pTarget->GetArmorType() ) - pTarget->GetAttr().GetReduceDamage( eAttackType );
float fBonusPercentDamage = pAttacker->GetAttr().GetBonusPercentDamage( pTarget->GetArmorType() ) / 100.0f;
float fArmorDamageRatio = GetArmorDamageRatio( pTarget->GetArmorType(), pAttacker->GetMeleeType() ) / 100.0f + fBonusPercentDamage;
// 2瞒 单固瘤 拌魂
int iSecondDamage = CalcSecondDamage_Physical( iFirstMinDamage, iFirstMaxDamage, iBonusDamage, iTargetDefense, fArmorDamageRatio );
// 农府萍拿 犬伏, 农府萍拿 单固瘤 焊呈胶, 农府萍拿 单固瘤 欺季飘 焊呈胶
int iCriticalRatio = pAttacker->GetAttr().GetPhysicalCriticalRatio() + pAttacker->GetAttr().GetCriticalRatioBonus() + criticalRatioBonus;
int iCriticalDamageBonus = pAttacker->GetAttr().GetCriticalDamageBonus();
float fCriticalDamagePercentBonus = (float)( pAttacker->GetAttr().GetCriticalDamagePercentBonus() / 1000.0f );
// 农府萍拿 单固瘤 拌魂
int iCriticalDamage = CalcCriticalDamage( pAttacker->GetObjectType(), pTarget->GetLevel(), iSecondDamage, iCriticalRatio, iCriticalDamageBonus, fCriticalDamagePercentBonus );
if( iCriticalDamage && pCritical!=NULL )
{
*pCritical = TRUE;
}
else if( pCritical!=NULL )
{
*pCritical = FALSE;
}
else
{
DISPMSG("CalcPhysicalDamage_Skill!\n");
}
// 弥辆 单固瘤
int iResultDamage = iSecondDamage;
if( iCriticalDamage )
{
iResultDamage = iCriticalDamage;
}
return iResultDamage;
}
//----------------------------------------------------------------------------------------------------
// 付过 傍拜(胶懦)
//----------------------------------------------------------------------------------------------------
DAMAGETYPE CalcMagicDamage_Skill( Character* pAttacker, Character* pTarget, eATTACK_TYPE eAttackType, int iSkillAttackPower,
float fSkillPercentDamage, WORD criticalRatioBonus, BOOL* pCritical, BYTE bySkillStatType )
{
// 扁夯傍拜仿, 胶懦傍拜仿, 槛访档, 鸥百规绢仿, 胶懦欺季飘眠啊单固瘤
int iBaseMinAttackPower = pAttacker->GetAttr().GetBaseMagicMinAttPower();
int iBaseMaxAttackPower = pAttacker->GetAttr().GetBaseMagicMaxAttPower();
iBaseMinAttackPower += pAttacker->GetAttr().GetOptionMagicAttPower();
iBaseMaxAttackPower += pAttacker->GetAttr().GetOptionMagicAttPower();
iBaseMinAttackPower += pAttacker->GetAttr().GetMagicalAttackPower( eAttackType );
iBaseMaxAttackPower += pAttacker->GetAttr().GetMagicalAttackPower( eAttackType );
iSkillAttackPower += pAttacker->GetAttr().GetSkillAttackPower();
SHORT sSkillStat = 0;
if( bySkillStatType == 1 ) sSkillStat = pAttacker->GetAttr().GetExperty1();
else if( bySkillStatType == 2 ) sSkillStat = pAttacker->GetAttr().GetExperty2();
fSkillPercentDamage += (float)( pAttacker->GetAttr().GetSkillPercentDamage() / 1000.0f );
// 1瞒 单固瘤 拌魂
int iFirstMinDamage = CalcFirstDamage( iBaseMinAttackPower, iSkillAttackPower, sSkillStat, fSkillPercentDamage, eATTACK_TYPE_MAGIC_OPTION );
int iFirstMaxDamage = CalcFirstDamage( iBaseMaxAttackPower, iSkillAttackPower, sSkillStat, fSkillPercentDamage, eATTACK_TYPE_MAGIC_OPTION );
// 焊呈胶 单固瘤, 鸥百规绢仿
int iBonusDamage = pTarget->GetAttr().GetBonusDamage( pTarget->GetArmorType() ) - pTarget->GetAttr().GetReduceDamage( eAttackType );
int iTargetDefense = pTarget->GetAttr().GetBaseMagicDefPower();
iTargetDefense += pTarget->GetAttr().GetOptionMagicDefPower();
iTargetDefense += pTarget->GetAttr().GetMagicalDefense( eAttackType );
iTargetDefense += pTarget->GetAttr().GetBonusDefense( eAttackType );
// 2瞒 单固瘤 拌魂
int iSecondDamage = CalcSecondDamage_Magic( iFirstMinDamage, iFirstMaxDamage, iBonusDamage, iTargetDefense );
// 农府萍拿 犬伏, 农府萍拿 单固瘤 焊呈胶, 农府萍拿 单固瘤 欺季飘 焊呈胶
int iCriticalRatio = pAttacker->GetAttr().GetMagicCriticalRatio() + pAttacker->GetAttr().GetCriticalRatioBonus() + criticalRatioBonus;
int iCriticalDamageBonus = pAttacker->GetAttr().GetCriticalDamageBonus();
float fCriticalDamagePercentBonus = (float)( pAttacker->GetAttr().GetCriticalDamagePercentBonus() / 1000.0f );
// 农府萍拿 单固瘤 拌魂
int iCriticalDamage = CalcCriticalDamage( pAttacker->GetObjectType(), pTarget->GetLevel(), iSecondDamage, iCriticalRatio, iCriticalDamageBonus, fCriticalDamagePercentBonus );
if( iCriticalDamage && pCritical!=NULL )
{
*pCritical = TRUE;
}
else if( pCritical!=NULL )
{
*pCritical = FALSE;
}
else
{
DISPMSG("CalcMagicDamage_Skill Error!\n");
}
// 弥辆 单固瘤
int iResultDamage = iSecondDamage;
if( iCriticalDamage )
{
iResultDamage = iCriticalDamage;
}
return iResultDamage;
}
//----------------------------------------------------------------------------------------------------
// 寇何俊辑 静绰 窃荐( 老馆, 胶懦 )
//----------------------------------------------------------------------------------------------------
DAMAGETYPE CalcNormalDamage( Character* pAttacker, Character* pTarget, eATTACK_TYPE eAttackType,
WORD criticalRatioBonus, BOOL* pCritical, float fDefenseIgnore )
{
DAMAGETYPE wDamage = CalcPhysicalDamage_Skill( pAttacker, pTarget, eAttackType, 0, 0, criticalRatioBonus, pCritical, 0, fDefenseIgnore );
return wDamage;
}
DAMAGETYPE CalcSkillDamage( Character* pAttacker, Character* pTarget, eATTACK_TYPE eAttackType, int iSkillAttackPower,
float fSkillPercentDamage, WORD criticalRatioBonus, BOOL* pCritical, BYTE bySkillStatType )
{
DAMAGETYPE wDamage = 0;
// 拱府 胶懦捞扼搁
if( eAttackType == eATTACK_TYPE_MELEE || eAttackType == eATTACK_TYPE_RANGE )
{
wDamage = CalcPhysicalDamage_Skill( pAttacker, pTarget, eAttackType, iSkillAttackPower, fSkillPercentDamage, criticalRatioBonus, pCritical, bySkillStatType, 0 );
}
// 付过 胶懦捞扼搁
else
{
wDamage = CalcMagicDamage_Skill( pAttacker, pTarget, eAttackType, iSkillAttackPower, fSkillPercentDamage, criticalRatioBonus, pCritical, bySkillStatType );
}
return wDamage;
}
BOOL IsStatusHit( Character* pAttacker, Character* pTarget )
{
if( !pAttacker || !pTarget ) return FALSE;
// 酒焙茄抛 惑怕甫 吧 版快 公炼扒 己傍
if( pAttacker->IsFriend( pTarget ) )
{
return TRUE;
}
LEVELTYPE AttackerLV = pAttacker->GetLevel();
LEVELTYPE TargetLV = pTarget->GetDisplayLevel();
// 阁胶磐 殿鞭喊 惑荐
float fGradeValue = 1.0f;
// 鸥百捞 阁胶磐捞搁
if( ( pTarget->GetObjectType() & NPC_OBJECT ) == NPC_OBJECT )
{
// 阁胶磐 饭骇捞 歹 奴 版快
if( TargetLV >= AttackerLV )
{
NPC *pNPC = (NPC*)pTarget;
fGradeValue = GetStatusRatioAsNPCGrade( pNPC->GetGrade() );
}
}
else if( ( pTarget->GetObjectType() & PLAYER_OBJECT ) == PLAYER_OBJECT )
{
fGradeValue = 0.5f;
}
// 惑怕利侩 犬伏
BYTE bySuccessRatio = (BYTE)(100 * fGradeValue);
if( TargetLV >= AttackerLV )
{
bySuccessRatio = bySuccessRatio * 10 / ( 10 + TargetLV - AttackerLV );
}
if( random(1, 100) <= bySuccessRatio )
{
return TRUE;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -