⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 characterformula.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -