#include "StdAfx.h" #include "damagecalc.h" #include "StatusScript.h" #include "BaseObject.h" #include "ObjectManager.h" #include "Player.h" #include "Monster.h" #include "Skill_Common.h" #include "SkillManager.h" #include "SkillScript.h" #include "MonsterScript.h" #include "GameSrv.h" #include "RandomTable.h" cDamageCalc* cDamageCalc::mpDamageCalc = NULL; cDamageCalc::cDamageCalc(void) { /// ½Ì±ÛÅæ - 2¹øÀÌ»ó °´Ã¼¸¦ »ý¼º ÇÏ·Á°í ÇÒ°æ¿ì Äֿܼ¡ ¿¡·¯ Âï¾îÁÜ if( mpDamageCalc ) { //CONSOLE->WriteLog( "mpDamageCalc new error"); } else { mpDamageCalc = this; } } cDamageCalc::~cDamageCalc(void) { } unsigned long cDamageCalc::PhyAttackSuccess100( unsigned long attackerStatusRate, unsigned long targetStatusAvoid, long skillRate, unsigned char attackerType, unsigned char attackerLv, unsigned char targetLv, unsigned long instantSuccess, unsigned long instantSuccessPer ) { float num104 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 104 ); float num105 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 105 ); float num106 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 106 ); float num107 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 107 ); float num108 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 108 ); float num109 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 109 ); float num110 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 110 ); float num111 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 111 ); float num112 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 112 ); // °ø°Ý ¼º°ø È®·ü(¹°¸®) // A = {num101} + (( [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸íÁß ¼öÄ¡) * ((100 + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸íÁß ¼öÄ¡[%]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸íÁß ¼öÄ¡[%]°ª) / 100) + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸íÁß ¼öÄ¡[+-]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸íÁß ¼öÄ¡[+-]°ª ) * {num102} // B = [°ø°ÝÀÚ]½ºÅ³ ¼º°øÈ®·ü°ª // C = (( [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ È¸ÇÇ ¼öÄ¡) * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ È¸ÇÇ ¼öÄ¡[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ȸÇÇ ¼öÄ¡[%]°ª ) / 100) + [¹æ¾îÀÚ]¾ÆÀÌÅÛ È¸ÇÇ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ȸÇÇ ¼öÄ¡[+-]°ª ) * {num103} //[°ø°ÝÀÚ]ij¸¯ÅÍ [°ø°ÝÀÚ] Lv < [¹æ¾îÀÚ] Lv D = - ((( [¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv ) * {num104} ) ^ {num105} )) ÃÖ¼Ò {num106} //[°ø°ÝÀÚ]¸ó½ºÅÍ [°ø°ÝÀÚ] Lv < [¹æ¾îÀÚ] Lv D = - ((( [¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv ) * {num107} ) ^ {num108} )) ÃÖ¼Ò {num109} //[°ø°ÝÀÚ]°øÅë [°ø°ÝÀÚ] Lv >= [¹æ¾îÀÚ] Lv D = (( [°ø°ÝÀÚ] Lv - [¹æ¾îÀÚ] Lv ) * {num110} ) ÃÖ´ë {num111} // E = ( ( ( A + B ) - C ) * ( 1 + [°ø°ÝÀÚ]°ø°Ý ¼º°ø È®·ü ¼ø°£È¿°ú[%]°ª / 100 ) + [°ø°ÝÀÚ]°ø°Ý ¼º°ø È®·ü ¼ø°£È¿°ú[+-]°ª * {num112} ) + D float valueA = (float)attackerStatusRate; /// [A]´Â ½ºÅÝ¿¡¼­ ÀÌ¹Ì °è»êµÈ °ªÀÌ´Ù float valueB = (float)skillRate; float valueC = (float)targetStatusAvoid; /// [C]´Â ½ºÅÝ¿¡¼­ ÀÌ¹Ì °è»êµÈ °ªÀÌ´Ù float valueD = 0.0f; float valueE = 0.0f; /// Á¤ÀÇ µÇÁö ¾ÊÀº °ø°ÝÀÚ Å¸ÀÔ if( attackerType != eOBJECTTYPE_PLAYER && attackerType != eOBJECTTYPE_MONSTER ) { NETWORK2->PostServerEvent("cDamageCalc::PhyAttackSuccess100 attackerType[%d] ERROR", attackerType ); return 0; } /// °ø°ÝÀÚ ·¹º§ÀÌ ³·Àº °æ¿ì °ø°ÝÀÚº° °è»êÀ» ´Ù¸£°Ô ó¸®ÇÑ´Ù. if( attackerLv < targetLv && attackerType == eOBJECTTYPE_PLAYER ) { // [°ø°ÝÀÚ]ij¸¯ÅÍ [°ø°ÝÀÚ] Lv < [¹æ¾îÀÚ] Lv // D = - ((( [¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv ) * {num104} ) ^ {num105} )) ÃÖ¼Ò {num106} valueD = -( pow((((float)targetLv - attackerLv) * num104 ), num105)); if( valueD < num106 ) valueD = num106; } /// °ø°ÝÀÚ ·¹º§ÀÌ ³·Àº °æ¿ì °ø°ÝÀÚº° °è»êÀ» ´Ù¸£°Ô ó¸®ÇÑ´Ù. else if( attackerLv < targetLv && attackerType == eOBJECTTYPE_MONSTER ) { // [°ø°ÝÀÚ]¸ó½ºÅÍ [°ø°ÝÀÚ] Lv < [¹æ¾îÀÚ] Lv // D = -((( [¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv ) * {num107} ) ^ {num108} )) ÃÖ¼Ò {num109} valueD = -( pow((((float)targetLv - attackerLv) * num107 ), num108 )); if( valueD < num109 ) valueD = num109; } else { // [°ø°ÝÀÚ]°øÅë [°ø°ÝÀÚ] Lv >= [¹æ¾îÀÚ] Lv // D = (( [°ø°ÝÀÚ] Lv - [¹æ¾îÀÚ] Lv ) * {num110} ) ÃÖ´ë {num111} valueD = (((float)attackerLv - targetLv) * num110 ); if( valueD > num111 ) valueD = num111; } // E = ( ( ( A + B ) - C ) * ( 1 + [°ø°ÝÀÚ]°ø°Ý ¼º°ø È®·ü ¼ø°£È¿°ú[%]°ª / 100 ) + [°ø°ÝÀÚ]°ø°Ý ¼º°ø È®·ü ¼ø°£È¿°ú[+-]°ª * {num112} ) + D valueE = ((( valueA + valueB ) - valueC ) * ( 1.0f + (float)instantSuccessPer / 100.0f ) + instantSuccess * num112 ) + valueD; if( g_eventPrint == true ) Verbose->WriteLog("PhyAttackSuccess attackerLv[%d] E[%.2f]", attackerLv, valueE ); /// °ø°Ý ¼º°ø È®·üÀÇ ÃÖ´ë°ªÀº 100%, ÃÖ¼Ò°ªÀº 35%ÀÌ´Ù. if( valueE < 35.0f ) valueE = 35.0f; if( valueE > 100.0f ) valueE = 100.0f; /// Àû¿ëÇ׸ñ¿¡ µû¶ó 100º¸´Ù Å«¼öÄ¡°¡ ³ª¿Ã ¼ö ÀÖÀ¸³ª È®·üüũ¶ó 100º¸´Ù Ä¿µµ 100À̶û ´Ù¸¦¹Ù°¡ ¾ø´Ù. return (unsigned long)valueE; } unsigned long cDamageCalc::MagAttackSuccess130( unsigned long attackerStatusRate, unsigned long targetStatusAvoid, long skillRate, unsigned char attackerType, unsigned char attackerLv, unsigned char targetLv, unsigned long instantSuccess, unsigned long instantSuccessPer ) { float num134 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 134 ); float num135 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 135 ); float num136 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 136 ); float num137 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 137 ); float num138 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 138 ); float num139 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 139 ); float num140 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 140 ); float num141 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 141 ); float num142 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 142 ); // °ø°Ý ¼º°ø È®·ü(¸¶¹ý) // A = {num131} + (( [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý ¸íÁß ¼öÄ¡) * ((100 + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¸íÁß ¼öÄ¡[%]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý ¸íÁß ¼öÄ¡[%]°ª) / 100) + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¸íÁß ¼öÄ¡[+-]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý ¸íÁß ¼öÄ¡[+-]°ª ) * {num132} // B = [°ø°ÝÀÚ]½ºÅ³ ¼º°øÈ®·ü°ª // C = (( [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ÀúÇ×·Â ¼öÄ¡ ) * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ÀúÇ×·Â ¼öÄ¡[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ÀúÇ×·Â ¼öÄ¡[%]°ª) / 100) + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ÀúÇ×·Â ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ÀúÇ×·Â ¼öÄ¡[+-]°ª ) * {num133} //[°ø°ÝÀÚ]ij¸¯ÅÍ [°ø°ÝÀÚ] Lv < [¹æ¾îÀÚ] Lv D = - ((( [¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv ) * {num134} ) ^ {num135} )) ÃÖ¼Ò {num136} //[°ø°ÝÀÚ]¸ó½ºÅÍ [°ø°ÝÀÚ] Lv < [¹æ¾îÀÚ] Lv D = - ((( [¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv ) * {num137} ) ^ {num138} )) ÃÖ¼Ò {num139} //[°ø°ÝÀÚ]°øÅë [°ø°ÝÀÚ] Lv >= [¹æ¾îÀÚ] Lv D = (( [°ø°ÝÀÚ] Lv - [¹æ¾îÀÚ] Lv ) * {num140} ) ÃÖ´ë {num141} // E = ( ( ( A + B ) - C ) * ( 1 + [°ø°ÝÀÚ]°ø°Ý ¼º°ø È®·ü ¼ø°£È¿°ú[%]°ª / 100) + [°ø°ÝÀÚ]°ø°Ý ¼º°ø È®·ü ¼ø°£È¿°ú[+-]°ª * {num142} ) + D float valueA = (float)attackerStatusRate; /// [A]´Â ½ºÅÝ¿¡¼­ ÀÌ¹Ì °è»êµÈ °ªÀÌ´Ù float valueB = (float)skillRate; float valueC = (float)targetStatusAvoid; /// [C]´Â ½ºÅÝ¿¡¼­ ÀÌ¹Ì °è»êµÈ °ªÀÌ´Ù float valueD = 0.0f; float valueE = 0.0f; /// Á¤ÀÇ µÇÁö ¾ÊÀº °ø°ÝÀÚ Å¸ÀÔ if( attackerType != eOBJECTTYPE_PLAYER && attackerType != eOBJECTTYPE_MONSTER ) { NETWORK2->PostServerEvent("cDamageCalc::MagAttackSuccess130 attackerType[%d] ERROR", attackerType ); return 0; } /// °ø°ÝÀÚ ·¹º§ÀÌ ³·Àº °æ¿ì °ø°ÝÀÚº° °è»êÀ» ´Ù¸£°Ô ó¸®ÇÑ´Ù. if( attackerLv < targetLv && attackerType == eOBJECTTYPE_PLAYER ) { // [°ø°ÝÀÚ]ij¸¯ÅÍ [°ø°ÝÀÚ] Lv < [¹æ¾îÀÚ] Lv // D = - ((( [¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv ) * {num134} ) ^ {num135} )) ÃÖ¼Ò {num136} valueD = -( pow((((float)targetLv - attackerLv) * num134 ), num135)) / 100.0f; if( valueD < num136 ) valueD = num136; } /// °ø°ÝÀÚ ·¹º§ÀÌ ³·Àº °æ¿ì °ø°ÝÀÚº° °è»êÀ» ´Ù¸£°Ô ó¸®ÇÑ´Ù. else if( attackerLv < targetLv && attackerType == eOBJECTTYPE_MONSTER ) { // [°ø°ÝÀÚ]¸ó½ºÅÍ [°ø°ÝÀÚ] Lv < [¹æ¾îÀÚ] Lv // D = - ((( [¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv ) * {num137} ) ^ {num138} )) ÃÖ¼Ò {num139} valueD = -( pow((((float)targetLv - attackerLv) * num137 ), num138 )) / 100.0f; if( valueD < num139 ) valueD = num139; } else { // [°ø°ÝÀÚ]°øÅë [°ø°ÝÀÚ] Lv >= [¹æ¾îÀÚ] Lv // D = (( [°ø°ÝÀÚ] Lv - [¹æ¾îÀÚ] Lv ) * {num140} ) ÃÖ´ë {num141} valueD = (((float)attackerLv - targetLv) * num140 ); if( valueD > num141 ) valueD = num141; } // E = ( ( ( A + B ) - C ) * ( 1 + [°ø°ÝÀÚ]°ø°Ý ¼º°ø È®·ü ¼ø°£È¿°ú[%]°ª / 100) + [°ø°ÝÀÚ]°ø°Ý ¼º°ø È®·ü ¼ø°£È¿°ú[+-]°ª * {num142} ) + D valueE = ((( valueA + valueB ) - valueC ) * ( 1.0f + instantSuccessPer / 100.0f ) + instantSuccess * num142 ) + valueD; if( g_eventPrint == true ) Verbose->WriteLog("MagAttackSuccess attackerLv[%d] E[%.2f]", attackerLv, valueE ); /// °ø°Ý ¼º°ø È®·üÀÇ ÃÖ´ë°ªÀº 100%, ÃÖ¼Ò°ªÀº 35%ÀÌ´Ù. if( valueE < 35.0f ) valueE = 35.0f; if( valueE > 100.0f ) valueE = 100.0f; /// Àû¿ëÇ׸ñ¿¡ µû¶ó 100º¸´Ù Å«¼öÄ¡°¡ ³ª¿Ã ¼ö ÀÖÀ¸³ª È®·üüũ¶ó 100º¸´Ù Ä¿µµ 100À̶û ´Ù¸¦¹Ù°¡ ¾ø´Ù. return (unsigned long)valueE; } unsigned long cDamageCalc::PhyCritical200( unsigned long attackerStatusCri, long skillCri, unsigned char attackerLv, unsigned char targetLv, long attackerPer, long attackerItemPer, long attackerPlus, long attackerItemPlus, float targetCriDef, unsigned long instantCri, unsigned long instantCriPer ) { float num201 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 201 ); float num202 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 202 ); float num205 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 205 ); float num206 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 206 ); float num207 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 207 ); float num208 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 208 ); float num209 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 209 ); float num210 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 210 ); float num211 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 211 ); // Å©¸®Æ¼Äà ¹ß»ý È®·ü(¹°¸®) //A = [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡ * {num201} //B = A * ((100 + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¹°¸® Å©¸®Æ¼ÄÃ[%]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¹°¸® Å©¸®Æ¼Äà [%]°ª) / 100) + ( ([°ø°ÝÀÚ]¾ÆÀÌÅÛ ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª) * {num202} ) //C = ½ºÅ³ ±âº»°ª //¸ó½ºÅÍÀÇ °æ¿ì //D = A //ij¸¯ÅÍÀÇ °æ¿ì //D = [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ¹°¸® ¹æÈ£ ¼öÄ¡ * {num203} //[E] = D * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ¹°¸® ¹æÈ£[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¹°¸® ¹æÈ£ [%]°ª) / 100) + ( ([¹æ¾îÀÚ]¾ÆÀÌÅÛ ¹°¸® ¹æÈ£ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¹°¸® ¹æÈ£ ¼öÄ¡[+-]°ª) * {num204} ) //[¹æ¾îÀÚ]Lv>=[°ø°ÝÀÚ]Lv //F = (100 - (([¹æ¾îÀÚ]Lv - [°ø°ÝÀÚ]Lv) * {num205}) ^ {num206}) /100 ÃÖ¼Ò {num207} //[¹æ¾îÀÚ]Lv<[°ø°ÝÀÚ]Lv //F = ({num208} + ([°ø°ÝÀÚ] Lv - [¹æ¾îÀÚ] Lv) / {num209}) ÃÖ´ë {num210} //G = (B + C - E) * F * (1 + [°ø°ÝÀÚ]Å©¸®Æ¼Äà ¼ø°£È¿°ú[%]°ª / 100) + ([°ø°ÝÀÚ]Å©¸®Æ¼Äà ¼ø°£È¿°ú[+-]°ª * {num211}) //A = [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡ * {num201} float valueA = (float)attackerStatusCri * num201; //B = A * ((100 + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¹°¸® Å©¸®Æ¼ÄÃ[%]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¹°¸® Å©¸®Æ¼Äà [%]°ª) / 100) + ( ([°ø°ÝÀÚ]¾ÆÀÌÅÛ ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª) * {num202} ) float valueB = valueA * (( 100.0f + attackerItemPer + attackerPer ) / 100.0f ) + (( attackerItemPlus + attackerPlus ) * num202 ); //C = ½ºÅ³ ±âº»°ª float valueC = (float)skillCri; //D = [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ¹°¸® ¹æÈ£ ¼öÄ¡ * {num203} //[E] = D * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ¹°¸® ¹æÈ£[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¹°¸® ¹æÈ£ [%]°ª) / 100) + ( ([¹æ¾îÀÚ]¾ÆÀÌÅÛ ¹°¸® ¹æÈ£ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¹°¸® ¹æÈ£ ¼öÄ¡[+-]°ª) * {num204} ) float valueE = targetCriDef; float valueF = 0; if( targetLv >= attackerLv ) { //[¹æ¾îÀÚ]Lv>=[°ø°ÝÀÚ]Lv //F = (100 - (([¹æ¾îÀÚ]Lv - [°ø°ÝÀÚ]Lv) * {num205}) ^ {num206}) /100 ÃÖ¼Ò {num207} valueF = ( 100.0f - pow((( targetLv - attackerLv ) * num205 ), num206 )) / 100.0f; if( valueF < num207 ) { valueF = num207; } } else { //[¹æ¾îÀÚ]Lv<[°ø°ÝÀÚ]Lv //F = ({num208} + ([°ø°ÝÀÚ] Lv - [¹æ¾îÀÚ] Lv) / {num209}) ÃÖ´ë {num210} valueF = ( num208 + (float)( attackerLv - targetLv ) / num209 ); if( valueF > num210 ) { valueF = num210; } } //G = (B + C - E) * F * (1 + [°ø°ÝÀÚ]Å©¸®Æ¼Äà ¼ø°£È¿°ú[%]°ª / 100) + ([°ø°ÝÀÚ]Å©¸®Æ¼Äà ¼ø°£È¿°ú[+-]°ª * {num211}) float valueG = ( valueB + valueC - valueE ) * valueF * ( 1.0f + instantCriPer / 100.0f ) + ( instantCri * num211 ) ; if( g_eventPrint == true ) Verbose->WriteLog("PhyCritical attackerLv[%d] G[%.2f]", attackerLv, valueG ); if( valueG < 0.0f ) valueG = 0.0f; return FloatToInt( valueG ); } unsigned long cDamageCalc::MagCritical230( unsigned long attackerStatusCri, long skillCri, unsigned char attackerLv, unsigned char targetLv, long attackerPer, long attackerItemPer, long attackerPlus, long attackerItemPlus, float targetCriDef, unsigned long instantCri, unsigned long instantCriPer ) { float num231 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 231 ); float num232 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 232 ); float num235 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 235 ); float num236 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 236 ); float num237 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 237 ); float num238 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 238 ); float num239 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 239 ); float num240 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 240 ); float num241 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 241 ); // Å©¸®Æ¼Äà ¹ß»ý È®·ü(¸¶¹ý) //A = [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡ * {num231} //B = A * ((100 + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý Å©¸®Æ¼ÄÃ[%]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý Å©¸®Æ¼Äà [%]°ª) / 100) + (([°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª) * {num232} ) //C = ½ºÅ³ ±âº»°ª //¸ó½ºÅÍÀÇ °æ¿ì //D = A //ij¸¯ÅÍÀÇ °æ¿ì //D = [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý ¹æÈ£ ¼öÄ¡ * {num233} //[E] = D * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¹æÈ£[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¸¶¹ý ¹æÈ£ [%]°ª) / 100) + ( ([¹æ¾îÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¹æÈ£ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¸¶¹ý ¹æÈ£ ¼öÄ¡[+-]°ª) * {num234} ) //[¹æ¾îÀÚ]Lv>=[°ø°ÝÀÚ]Lv //F = (100 - (([¹æ¾îÀÚ]Lv - [°ø°ÝÀÚ]Lv) * {num235}) ^ {num236}) /100 ÃÖ¼Ò {num237} //[¹æ¾îÀÚ]Lv<[°ø°ÝÀÚ]Lv //F = ({num238} + ([°ø°ÝÀÚ] Lv - [¹æ¾îÀÚ] Lv) / {num239}) ÃÖ´ë {num240} //G = (B + C - E) * F * (1 + [°ø°ÝÀÚ]Å©¸®Æ¼Äà ¼ø°£È¿°ú[%]°ª / 100) + ([°ø°ÝÀÚ]Å©¸®Æ¼Äà ¼ø°£È¿°ú[+-]°ª * {num241}) //A = [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡ * {num231} float valueA = (float)attackerStatusCri * num231; //B = A * ((100 + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý Å©¸®Æ¼ÄÃ[%]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý Å©¸®Æ¼Äà [%]°ª) / 100) + (([°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª) * {num232} ) float valueB = valueA * (( 100.0f + attackerItemPer + attackerPer ) / 100.0f ) + ((float)( attackerItemPlus + attackerPlus ) * num232 ); //C = ½ºÅ³ ±âº»°ª float valueC = (float)skillCri; //D = [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý ¹æÈ£ ¼öÄ¡ * {num233} //[E] = D * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¹æÈ£[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¸¶¹ý ¹æÈ£ [%]°ª) / 100) + ( ([¹æ¾îÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¹æÈ£ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¸¶¹ý ¹æÈ£ ¼öÄ¡[+-]°ª) * {num234} ) float valueE = targetCriDef; float valueF = 0; if( targetLv >= attackerLv ) { //[¹æ¾îÀÚ]Lv>=[°ø°ÝÀÚ]Lv //F = (100 - (([¹æ¾îÀÚ]Lv - [°ø°ÝÀÚ]Lv) * {num235}) ^ {num236}) /100 ÃÖ¼Ò {num237} valueF = ( 100.0f - pow((( targetLv - attackerLv ) * num235 ), num236 )) / 100.0f; if( valueF < num237 ) { valueF = num237; } } else { //[¹æ¾îÀÚ]Lv<[°ø°ÝÀÚ]Lv //F = ({num238} + ([°ø°ÝÀÚ] Lv - [¹æ¾îÀÚ] Lv) / {num239}) ÃÖ´ë {num240} valueF = ( num238 + (float)( attackerLv - targetLv ) / num239 ); if( valueF < num240 ) { valueF = num240; } } //G = (B + C - E) * F * (1 + [°ø°ÝÀÚ]Å©¸®Æ¼Äà ¼ø°£È¿°ú[%]°ª / 100) + ([°ø°ÝÀÚ]Å©¸®Æ¼Äà ¼ø°£È¿°ú[+-]°ª * {num241}) float valueG = ( valueB + valueC - valueE ) * valueF * ( 1.0f + instantCriPer / 100.0f ) + ( instantCri * num241 ) ; if( g_eventPrint == true ) Verbose->WriteLog("MagCritical attackerLv[%d] G[%.2f]", attackerLv, valueG ); if( valueG < 0.0f ) valueG = 0.0f; return FloatToInt( valueG ); } unsigned long cDamageCalc::MonsterCritical260( long skillCri, unsigned char attackerLv, unsigned char targetLv, long attackerPer, long attackerPlus, float targetCriDef ) { float num261 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 261 ); float num264 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 264 ); float num265 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 265 ); float num266 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 266 ); float num267 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 267 ); float num268 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 268 ); float num269 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 269 ); // Å©¸®Æ¼Äà ¹ß»ý È®·ü(¸ó½ºÅÍ) //A = ½ºÅ³ ±âº»°ª //B = A * ((100 + [°ø°ÝÀÚ]¹öÇÁ¼º Å©¸®Æ¼Äà [%]°ª) / 100) + ( [°ø°ÝÀÚ]¹öÇÁ¼º Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª * {num261} ) //C = [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ¹æÈ£ ¼öÄ¡ * {num262} //D = C * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ¹æÈ£[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¹æÈ£ [%]°ª) / 100) + ( ([¹æ¾îÀÚ]¾ÆÀÌÅÛ ¹æÈ£ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¹æÈ£ ¼öÄ¡[+-]°ª) * {num263} ) //[¹æ¾îÀÚ]Lv>=[°ø°ÝÀÚ]Lv //E = (100 - (([¹æ¾îÀÚ]Lv - [°ø°ÝÀÚ]Lv) * {num264}) ^ {num265}) /100 ÃÖ¼Ò {num266} //[¹æ¾îÀÚ]Lv<[°ø°ÝÀÚ]Lv //E = ({num267} + ([°ø°ÝÀÚ] Lv - [¹æ¾îÀÚ] Lv) / {num268}) ÃÖ´ë {num269} //F = (B - D) * E //A = ½ºÅ³ ±âº»°ª float valueA = (float)skillCri; //B = A * ((100 + [°ø°ÝÀÚ]¹öÇÁ¼º Å©¸®Æ¼Äà [%]°ª) / 100) + ( [°ø°ÝÀÚ]¹öÇÁ¼º Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª * {num261} ) float valueB = valueA * (( 100.0f + attackerPer ) / 100.0f ) + ( attackerPlus * num261 ); //C = [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ¹æÈ£ ¼öÄ¡ * {num262} //D = C * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ¹æÈ£[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¹æÈ£ [%]°ª) / 100) + ( ([¹æ¾îÀÚ]¾ÆÀÌÅÛ ¹æÈ£ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¹æÈ£ ¼öÄ¡[+-]°ª) * {num263} ) float valueD = targetCriDef; float valueE = 0; if( targetLv >= attackerLv ) { //[¹æ¾îÀÚ]Lv>=[°ø°ÝÀÚ]Lv //E = (100 - (([¹æ¾îÀÚ]Lv - [°ø°ÝÀÚ]Lv) * {num264}) ^ {num265}) /100 ÃÖ¼Ò {num266} valueE = ( 100.0f - pow((( targetLv - attackerLv ) * num264 ), num265 )) / 100.0f; if( valueE < num266 ) { valueE = num266; } } else { //[¹æ¾îÀÚ]Lv<[°ø°ÝÀÚ]Lv //E = ({num267} + ([°ø°ÝÀÚ] Lv - [¹æ¾îÀÚ] Lv) / {num268}) ÃÖ´ë {num269} valueE = ( num267 + (float)( attackerLv - targetLv ) / num268 ); if( valueE < num269 ) { valueE = num269; } } //F = (B - D) * E float valueF = ( valueB - valueD ) * valueE; if( g_eventPrint == true ) Verbose->WriteLog("MonsterCritical attackerLv[%d] F[%.2f]", attackerLv, valueF ); if( valueF < 0.0f ) valueF = 0.0f; return FloatToInt( valueF ); } unsigned long cDamageCalc::PhyDamage500( unsigned char attackerType, unsigned char attackerLv, unsigned char targetType, unsigned char targetLv, unsigned long attackerStatusPhyAttack, long skillAttackPlus, long skillAttackPer, unsigned long targetStatusPhyDef, float addTotalDamage, float addPerTotalDamage ) { float num501 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 501 ); float num502 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 502 ); float num503 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 503 ); float num504 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 504 ); float num505 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 505 ); float num506 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 506 ); float num507 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 507 ); float num508 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 508 ); float num509 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 509 ); float num510 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 510 ); float num511 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 511 ); float num512 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 512 ); float num513 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 513 ); float num514 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 514 ); float num515 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 515 ); // ÃÖÁ¾´ë¹ÌÁö(¹°¸®) // A = [°ø°ÝÀÚ] ¹°¸® °ø°Ý·Â // B = [¹æ¾îÀÚ] ¹°¸® ¹æ¾î·Â * {num501} // C = {num502} - (( {num503} * [¹æ¾îÀÚ] ¹°¸® ¹æ¾î·Â) / ({num504} * ([¹æ¾îÀÚ] ¹°¸® ¹æ¾î·Â ^ {num505}) + {num506} + ( {num507} * [°ø°ÝÀÚ] Lv) - ( {num508} * [¹æ¾îÀÚ] Lv))) // D = [°ø°ÝÀÚ] ½ºÅ³ °ø°Ý·Â(+) // E = (100 + [°ø°ÝÀÚ] ½ºÅ³ °ø°Ý·Â(%)) / 100 //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(À¯Àú) // F = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num509}) ^ {num510}) / 100 ÃÖ¼Ò {num511} //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(¸ó½ºÅÍ) // F = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num512}) ^ {num513}) / 100 ÃÖ¼Ò {num514} //±× ¿ÜÀÇ ¸ðµç °æ¿ì // F = {num515} // G = (((A * E) + D) * C) * F // H = ¸ó½ºÅÍ Á¾·ù¿¡ µû¸¥ Ãß°¡´ë¹ÌÁö [%]°ª + ¸ó½ºÅÍ ºÐ·ù¿¡ µû¸¥ Ãß°¡ ´ë¹ÌÁö[%]°ª // I = ¸ó½ºÅÍ Á¾·ù¿¡ µû¸¥ Ãß°¡´ë¹ÌÁö [+-]°ª + ¸ó½ºÅÍ ºÐ·ù¿¡ µû¸¥ Ãß°¡ ´ë¹ÌÁö[+-]°ª // J = G * H + I // A = [°ø°ÝÀÚ] ¹°¸® °ø°Ý·Â float valueA = (float)attackerStatusPhyAttack; // B = [¹æ¾îÀÚ] ¹°¸® ¹æ¾î·Â * {num501} float valueB = (float)targetStatusPhyDef * num501; // C = {num502} - (( {num503} * [¹æ¾îÀÚ] ¹°¸® ¹æ¾î·Â) / ({num504} * ([¹æ¾îÀÚ] ¹°¸® ¹æ¾î·Â ^ {num505}) + {num506} + ( {num507} * [°ø°ÝÀÚ] Lv) - ( {num508} * [¹æ¾îÀÚ] Lv))) float valueC = num502 - ( ( num503 * valueB ) / ( num504 * ( pow( valueB, num505) ) + num506 + ( num507 * attackerLv ) - ( num508 * targetLv ))); // D = [°ø°ÝÀÚ] ½ºÅ³ °ø°Ý·Â(+) float valueD = (float)skillAttackPlus; // E = (100 + [°ø°ÝÀÚ] ½ºÅ³ °ø°Ý·Â(%)) / 100 float valueE = (float)( 100.0f + skillAttackPer ) / 100.0f; //±× ¿ÜÀÇ ¸ðµç °æ¿ì // F = {num515} float valueF = num515; if( attackerType == eOBJECTTYPE_PLAYER && targetType == eOBJECTTYPE_PLAYER && attackerLv < targetLv ) { //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(À¯Àú) // F = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num509}) ^ {num510}) / 100 ÃÖ¼Ò {num511} valueF = ( 100.0f - pow((( targetLv - attackerLv ) * num509 ), num510 )) / 100.0f; if( valueF < num511 ) { valueF = num511; } } else if( attackerType == eOBJECTTYPE_PLAYER && targetType == eOBJECTTYPE_MONSTER && attackerLv < targetLv ) { //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(¸ó½ºÅÍ) // F = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num512}) ^ {num513}) / 100 ÃÖ¼Ò {num514} valueF = ( 100.0f - pow((( targetLv - attackerLv ) * num512 ), num513 )) / 100.0f; if( valueF < num514 ) { valueF = num514; } } // G = (((A * E) + D) * C) * F float valueG = ((( valueA * valueE ) + valueD ) * valueC ) * valueF; float valueH = addPerTotalDamage; float valueI = addTotalDamage; float valueJ = valueG * valueH + valueI; if( g_eventPrint == true ) Verbose->WriteLog("PhyDamage attackerLv[%d] G[%.2f]", attackerLv, valueG ); /// µ¥¹ÌÁö °ªÀº 1º¸´Ù ÀÛÀ»¼ö ¾ø´Ù. return valueG > 1.0f ? FloatToInt( valueJ ) : 1; } unsigned long cDamageCalc::MagDamage530( unsigned char attackerType, unsigned char attackerLv, unsigned char targetType, unsigned char targetLv, unsigned long attackerStatusMagAttack, long skillAttackPlus, long skillAttackPer, unsigned long targetStatusMagDef, float addTotalDamage, float addPerTotalDamage ) { float num531 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 531 ); float num532 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 532 ); float num533 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 533 ); float num534 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 534 ); float num535 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 535 ); float num536 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 536 ); float num537 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 537 ); float num538 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 538 ); float num539 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 539 ); float num540 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 540 ); float num541 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 541 ); float num542 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 542 ); float num543 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 543 ); float num544 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 544 ); float num545 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 545 ); // ÃÖÁ¾´ë¹ÌÁö(¸¶¹ý) // A = [°ø°ÝÀÚ] ¸¶¹ý °ø°Ý·Â // B = [¹æ¾îÀÚ] ¸¶¹ý ¹æ¾î·Â * {num531} // C = {num532} - (( {num533} * [¹æ¾îÀÚ] ¸¶¹ý ¹æ¾î·Â) / ({num534} * ([¹æ¾îÀÚ] ¸¶¹ý ¹æ¾î·Â ^ {num535}) + {num536} + ( {num537} * [°ø°ÝÀÚ] Lv) - ( {num538} * [¹æ¾îÀÚ] Lv))) // D = [°ø°ÝÀÚ] ½ºÅ³ °ø°Ý·Â(+) // E = (100 + [°ø°ÝÀÚ] ½ºÅ³ °ø°Ý·Â(%)) / 100 //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(À¯Àú) // F = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num539}) ^ {num540}) / 100 ÃÖ¼Ò {num541} //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(¸ó½ºÅÍ) // F = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num542}) ^ {num543}) / 100 ÃÖ¼Ò {num544} //±× ¿ÜÀÇ ¸ðµç °æ¿ì // F = {num545} // G = (((A * E) + D) * C) * F // H = ¸ó½ºÅÍ Á¾·ù¿¡ µû¸¥ Ãß°¡´ë¹ÌÁö [%]°ª + ¸ó½ºÅÍ ºÐ·ù¿¡ µû¸¥ Ãß°¡ ´ë¹ÌÁö[%]°ª // I = ¸ó½ºÅÍ Á¾·ù¿¡ µû¸¥ Ãß°¡´ë¹ÌÁö [+-]°ª + ¸ó½ºÅÍ ºÐ·ù¿¡ µû¸¥ Ãß°¡ ´ë¹ÌÁö[+-]°ª // J = G * H + I // A = [°ø°ÝÀÚ] ¸¶¹ý °ø°Ý·Â float valueA = (float)attackerStatusMagAttack; // B = [¹æ¾îÀÚ] ¸¶¹ý ¹æ¾î·Â * {num531} float valueB = (float)targetStatusMagDef * num531; // C = {num532} - (( {num533} * [¹æ¾îÀÚ] ¸¶¹ý ¹æ¾î·Â) / ({num534} * ([¹æ¾îÀÚ] ¸¶¹ý ¹æ¾î·Â ^ {num535}) + {num536} + ( {num537} * [°ø°ÝÀÚ] Lv) - ( {num538} * [¹æ¾îÀÚ] Lv))) float valueC = num532 - ( ( num533 * valueB ) / ( num534 * ( pow( valueB, num535) ) + num536 + ( num537 * attackerLv ) - ( num538 * targetLv ))); // D = [°ø°ÝÀÚ] ½ºÅ³ °ø°Ý·Â(+) float valueD = (float)skillAttackPlus; // E = (100 + [°ø°ÝÀÚ] ½ºÅ³ °ø°Ý·Â(%)) / 100 float valueE = (float)( 100.0f + skillAttackPer ) / 100.0f; //±× ¿ÜÀÇ ¸ðµç °æ¿ì // F = {num545} float valueF = num545; if( attackerType == eOBJECTTYPE_PLAYER && targetType == eOBJECTTYPE_PLAYER && attackerLv < targetLv ) { //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(À¯Àú) // F = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num539}) ^ {num540}) / 100 ÃÖ¼Ò {num541} valueF = ( 100.0f - pow((( targetLv - attackerLv ) * num539 ), num540 )) / 100.0f; if( valueF < num541 ) { valueF = num541; } } else if( attackerType == eOBJECTTYPE_PLAYER && targetType == eOBJECTTYPE_MONSTER && attackerLv < targetLv ) { //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(¸ó½ºÅÍ) // F = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num542}) ^ {num543}) / 100 ÃÖ¼Ò {num544} valueF = ( 100.0f - pow((( targetLv - attackerLv ) * num542 ), num543 )) / 100.0f; if( valueF < num544 ) { valueF = num544; } } // G = (((A * E) + D) * C) * F float valueG = ((( valueA * valueE ) + valueD ) * valueC ) * valueF; float valueH = addPerTotalDamage; float valueI = addTotalDamage; float valueJ = valueG * valueH + valueI; if( g_eventPrint == true ) Verbose->WriteLog("MagDamage attackerLv[%d] G[%.2f]", attackerLv, valueG ); /// µ¥¹ÌÁö °ªÀº 1º¸´Ù ÀÛÀ»¼ö ¾ø´Ù. return valueG > 1.0f ? FloatToInt( valueJ ) : 1; } unsigned long cDamageCalc::PhyDotDamage600( unsigned char attackerType, unsigned char attackerLv, unsigned char targetType, unsigned char targetLv, unsigned long attackerStatusPhyAttack, long infAttackPlus, long infAttackPer, unsigned long targetStatusPhyDef, unsigned long dotTotalTime, unsigned long dotTime ) { float num601 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 601 ); float num602 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 602 ); float num603 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 603 ); float num604 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 604 ); float num605 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 605 ); float num606 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 606 ); float num607 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 607 ); float num608 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 608 ); float num609 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 609 ); float num610 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 610 ); float num611 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 611 ); float num612 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 612 ); float num613 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 613 ); float num614 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 614 ); float num615 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 615 ); // µµÆ® ´ë¹ÌÁö(¹°¸®) // A = [°ø°ÝÀÚ] ¹°¸® °ø°Ý·Â // B = [¹æ¾îÀÚ] ¹°¸® ¹æ¾î·Â * {num601} // C = {num602} - (( {num603} * [¹æ¾îÀÚ] ¹°¸® ¹æ¾î·Â) / ({num604} * ([¹æ¾îÀÚ] ¹°¸® ¹æ¾î·Â ^ {num605}) + {num606} + ( {num607} * [°ø°ÝÀÚ] Lv) - ( {num608} * [¹æ¾îÀÚ] Lv))) //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(À¯Àú) // D = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num609}) ^ {num610}) / 100 ÃÖ¼Ò {num611} //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(¸ó½ºÅÍ) // D = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num612}) ^ {num613}) / 100 ÃÖ¼Ò {num614} //±× ¿ÜÀÇ ¸ðµç °æ¿ì // D = {num615} // E = [°ø°ÝÀÚ] È¿°ú ½ºÅ³ °ø°Ý·Â(+) // F = (100 + [°ø°ÝÀÚ] È¿°ú ½ºÅ³ °ø°Ý·Â(%)) / 100 // G = ½ºÅ³ Áö¼Ó½Ã°£ / ½ºÅ³ ƽ½Ã°£ // H = ((A * F) * C / G + E) * D // A = [°ø°ÝÀÚ] ¹°¸® °ø°Ý·Â float valueA = (float)attackerStatusPhyAttack; // B = [¹æ¾îÀÚ] ¹°¸® ¹æ¾î·Â * {num601} float valueB = (float)targetStatusPhyDef * num601; // C = {num602} - (( {num603} * [¹æ¾îÀÚ] ¹°¸® ¹æ¾î·Â) / ({num604} * ([¹æ¾îÀÚ] ¹°¸® ¹æ¾î·Â ^ {num605}) + {num606} + ( {num607} * [°ø°ÝÀÚ] Lv) - ( {num608} * [¹æ¾îÀÚ] Lv))) float valueC = num602 - ( ( num603 * valueB ) / ( num604 * ( pow( valueB, num605) ) + num606 + ( num607 * attackerLv ) - ( num608 * targetLv ))); //±× ¿ÜÀÇ ¸ðµç °æ¿ì // D = {num615} float valueD = num615; if( attackerType == eOBJECTTYPE_PLAYER && targetType == eOBJECTTYPE_PLAYER && attackerLv < targetLv ) { //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(À¯Àú) // D = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num609}) ^ {num610}) / 100 ÃÖ¼Ò {num611} valueD = ( 100.0f - pow((( targetLv - attackerLv ) * num609 ), num610 )) / 100.0f; if( valueD < num611 ) { valueD = num611; } } else if( attackerType == eOBJECTTYPE_PLAYER && targetType == eOBJECTTYPE_MONSTER && attackerLv < targetLv ) { //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(¸ó½ºÅÍ) // D = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num612}) ^ {num613}) / 100 ÃÖ¼Ò {num614} valueD = ( 100.0f - pow((( targetLv - attackerLv ) * num612 ), num613 )) / 100.0f; if( valueD < num614 ) { valueD = num614; } } // E = [°ø°ÝÀÚ] È¿°ú ½ºÅ³ °ø°Ý·Â(+) float valueE = (float)infAttackPlus; // F = (100 + [°ø°ÝÀÚ] È¿°ú ½ºÅ³ °ø°Ý·Â(%)) / 100 float valueF = (float)( 100.0f + infAttackPer ) / 100.0f; // G = È¿°ú Áö¼Ó½Ã°£ / È¿°ú ƽ½Ã°£ float valueG = 1; if( dotTime == 0 || dotTotalTime / dotTime == 0 ) { NETWORK2->PostServerEvent("cDamageCalc::PhyDotDamage600 valueG == 0 [%d,%d][%d,%d,%d,%d,%d,%d,%d,%d]", dotTotalTime, dotTime, attackerType, attackerLv, targetType, targetLv, attackerStatusPhyAttack, infAttackPlus, infAttackPer, targetStatusPhyDef ); } else { valueG = (float)dotTotalTime / dotTime; } // H = ((A * F) * C / G + E) * D float valueH = (( valueA * valueF ) * valueC / valueG + valueE ) * valueD; if( g_eventPrint == true ) Verbose->WriteLog("PhyDotDamage attackerLv[%d] H[%.2f]", attackerLv, valueH ); /// µ¥¹ÌÁö °ªÀº 1º¸´Ù ÀÛÀ»¼ö ¾ø´Ù. return valueH > 1.0f ? FloatToInt( valueH ) : 1; } unsigned long cDamageCalc::MagDotDamage630( unsigned char attackerType, unsigned char attackerLv, unsigned char targetType, unsigned char targetLv, unsigned long attackerStatusMagAttack, long infAttackPlus, long infAttackPer, unsigned long targetStatusMagDef, unsigned long dotTotalTime, unsigned long dotTime ) { float num631 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 631 ); float num632 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 632 ); float num633 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 633 ); float num634 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 634 ); float num635 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 635 ); float num636 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 636 ); float num637 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 637 ); float num638 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 638 ); float num639 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 639 ); float num640 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 640 ); float num641 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 641 ); float num642 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 642 ); float num643 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 643 ); float num644 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 644 ); float num645 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 645 ); // µµÆ® ´ë¹ÌÁö(¸¶¹ý) // A = [°ø°ÝÀÚ] ¸¶¹ý °ø°Ý·Â // B = [¹æ¾îÀÚ] ¸¶¹ý ¹æ¾î·Â * {num631} // C = {num632} - (({num633} * [¹æ¾îÀÚ] ¸¶¹ý ¹æ¾î·Â) / ({num634} * ([¹æ¾îÀÚ] ¸¶¹ý ¹æ¾î·Â ^ {num635}) + {num636} + ( {num637} * [°ø°ÝÀÚ] Lv) - ( {num638} * [¹æ¾îÀÚ] Lv))) //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(À¯Àú) // D = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num639}) ^ {num640}) / 100 ÃÖ¼Ò {num641} //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(¸ó½ºÅÍ) // D = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num642}) ^ {num643}) / 100 ÃÖ¼Ò {num644} //±× ¿ÜÀÇ ¸ðµç °æ¿ì // D = {num645} // E = [°ø°ÝÀÚ] È¿°ú ½ºÅ³ °ø°Ý·Â(+) // F = (100 + [°ø°ÝÀÚ] È¿°ú ½ºÅ³ °ø°Ý·Â(%)) / 100 // G = ½ºÅ³ Áö¼Ó½Ã°£ / ½ºÅ³ ƽ½Ã°£ // H = ((A * F) * C / G + E) * D // A = [°ø°ÝÀÚ] ¸¶¹ý °ø°Ý·Â float valueA = (float)attackerStatusMagAttack; // B = [¹æ¾îÀÚ] ¸¶¹ý ¹æ¾î·Â * {num631} float valueB = (float)targetStatusMagDef * num631; // C = {num632} - (({num633} * [¹æ¾îÀÚ] ¸¶¹ý ¹æ¾î·Â) / ({num634} * ([¹æ¾îÀÚ] ¸¶¹ý ¹æ¾î·Â ^ {num635}) + {num636} + ( {num637} * [°ø°ÝÀÚ] Lv) - ( {num638} * [¹æ¾îÀÚ] Lv))) float valueC = num632 - ( ( num633 * valueB ) / ( num634 * ( pow( valueB, num635) ) + num636 + ( num637 * attackerLv ) - ( num638 * targetLv ))); //±× ¿ÜÀÇ ¸ðµç °æ¿ì // D = {num645} float valueD = num645; if( attackerType == eOBJECTTYPE_PLAYER && targetType == eOBJECTTYPE_PLAYER && attackerLv < targetLv ) { //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(À¯Àú) // D = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num639}) ^ {num640}) / 100 ÃÖ¼Ò {num641} valueD = ( 100.0f - pow((( targetLv - attackerLv ) * num639 ), num640 )) / 100.0f; if( valueD < num641 ) { valueD = num641; } } else if( attackerType == eOBJECTTYPE_PLAYER && targetType == eOBJECTTYPE_MONSTER && attackerLv < targetLv ) { //[°ø°ÝÀÚ] Lv(À¯Àú) < [¹æ¾îÀÚ] Lv(¸ó½ºÅÍ) // D = (100 - (([¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv) * {num642}) ^ {num643}) / 100 ÃÖ¼Ò {num644} valueD = ( 100.0f - pow((( targetLv - attackerLv ) * num642 ), num643 )) / 100.0f; if( valueD < num644 ) { valueD = num644; } } // E = [°ø°ÝÀÚ] È¿°ú ½ºÅ³ °ø°Ý·Â(+) float valueE = (float)infAttackPlus; // F = (100 + [°ø°ÝÀÚ] È¿°ú ½ºÅ³ °ø°Ý·Â(%)) / 100 float valueF = (float)( 100.0f + infAttackPer ) / 100.0f; // G = È¿°ú Áö¼Ó½Ã°£ / È¿°ú ƽ½Ã°£ float valueG = 1; if( dotTime == 0 || dotTotalTime / dotTime == 0 ) { NETWORK2->PostServerEvent("cDamageCalc::MagDotDamage630 valueG == 0 [%d,%d][%d,%d,%d,%d,%d,%d,%d,%d]", dotTotalTime, dotTime, attackerType, attackerLv, targetType, targetLv, attackerStatusMagAttack, infAttackPlus, infAttackPer, targetStatusMagDef ); } else { valueG = (float)dotTotalTime / dotTime; } // H = ((A * F) * C / G + E) * D float valueH = (( valueA * valueF ) * valueC / valueG + valueE ) * valueD; if( g_eventPrint == true ) Verbose->WriteLog("MagDotDamage attackerLv[%d] H[%.2f]", attackerLv, valueH ); /// µ¥¹ÌÁö °ªÀº 1º¸´Ù ÀÛÀ»¼ö ¾ø´Ù. return valueH > 1.0f ? FloatToInt( valueH ) : 1; } unsigned long cDamageCalc::PhyConditionOdd900( long skillRate, unsigned char attackerLv, unsigned char targetLv ) { float num901 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 901 ); float num902 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 902 ); float num903 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 903 ); float num904 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 904 ); float num905 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 905 ); // »óÅÂÀÌ»ó(¹°¸®) // A = ½ºÅ³ ¼º°ø ±âº»°ª // [°ø°ÝÀÚ] Lv < [¹æ¾îÀÚ] Lv B = ( 100 - ((( [¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv ) * {num901} ) ^ {num902} )) / 100 ÃÖ¼Ò {num903} // [°ø°ÝÀÚ] Lv > [¹æ¾îÀÚ] Lv B = 1 + (( [°ø°ÝÀÚ] Lv - [¹æ¾îÀÚ] Lv ) / {num904} ) ÃÖ´ë {num905} // A * B float valueA = (float)skillRate; float valueB = 0; if( attackerLv <= targetLv ) { valueB = ( 100.0f - pow(((targetLv - attackerLv) * num901), num902)) / 100.0f; if( valueB < num903 ) { valueB = num903; } } else { valueB = 1.0f + ((float)(attackerLv - targetLv) / num904); if( valueB > num905 ) { valueB = num905; } } float valueC = valueA * valueB; if( g_eventPrint == true ) Verbose->WriteLog("PhyConditionOdd attackerLv[%d] C[%.2f]", attackerLv, valueC ); if( valueC < 0.0f ) { NETWORK2->PostServerEvent("cDamageCalc::PhyConditionOdd900 valueC < 0.0f[%d,%d,%d,%d]", valueC, skillRate, attackerLv, targetLv ); valueC = 0.0f; } return (unsigned long)valueC; } unsigned long cDamageCalc::MagConditionOdd930( long skillRate, unsigned char attackerLv, unsigned char targetLv ) { float num931 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 931 ); float num932 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 932 ); float num933 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 933 ); float num934 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 934 ); float num935 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 935 ); // »óÅÂÀÌ»ó(¸¶¹ý) // A = ½ºÅ³ ¼º°ø ±âº»°ª //[°ø°ÝÀÚ] Lv =< [¹æ¾îÀÚ] Lv B = ( 100 - ((( [¹æ¾îÀÚ] Lv - [°ø°ÝÀÚ] Lv ) * {num931} ) ^ {num932} )) / 100 ÃÖ¼Ò {num933} //[°ø°ÝÀÚ] Lv > [¹æ¾îÀÚ] Lv B = 1 + (( [°ø°ÝÀÚ] Lv - [¹æ¾îÀÚ] Lv ) / {num934} ) ÃÖ´ë {num935} // A * B float valueA = (float)skillRate; float valueB = 0; if( attackerLv <= targetLv ) { valueB = ( 100.0f - pow(((targetLv - attackerLv) * num931), num932) ) / 100.0f; if( valueB < num933 ) { valueB = num933; } } else { valueB = 1.0f + ((float)(attackerLv - targetLv) / num934); if( valueB > num935 ) { valueB = num935; } } float valueC = valueA * valueB; if( g_eventPrint == true ) Verbose->WriteLog("MagConditionOdd attackerLv[%d] C[%.2f]", attackerLv, valueC ); if( valueC < 0.0f ) { NETWORK2->PostServerEvent("cDamageCalc::MagConditionOdd930 valueC < 0.0f[%d,%d,%d,%d]", valueC, skillRate, attackerLv, targetLv ); valueC = 0.0f; } return (unsigned long)valueC; } unsigned long cDamageCalc::HealHP1200( long statusHeal, long skillHealPlus, long skillHealPer, long targetHealPlus, long targetHealPer, long targetItemPlus, long targetItemPer ) { // ȸº¹(Èú) // [A] = Èú ȸº¹·® // B = ½ºÅ³ ±âº» ȸº¹·® [+-]°ª // C = (A * ((100 + ½ºÅ³ ±âº» ȸº¹·® [%]°ª) / 100) + B) * ((100 + ¾ÆÀÌÅÛ ¹Þ´Â ȸº¹·® Áõ°¡ [%] °ª + ¹öÇÁ¼º ¹Þ´Â ȸº¹·® Áõ°¡ [%] °ª) / // 100) + ¾ÆÀÌÅÛ ¹Þ´Â ȸº¹·Â Áõ°¡ [+-]°ª + ¹öÇÁ¼º ¹Þ´Â ȸº¹·® Áõ°¡ [+-]°ª float valueA = (float)statusHeal; float valueB = (float)skillHealPlus; float valueC = ( valueA * (( 100.0f + skillHealPer ) / 100.0f ) + valueB ) * (( 100.0f + targetItemPer + targetHealPer ) / 100.0f ) + targetItemPlus + targetHealPlus; if( g_eventPrint == true ) Verbose->WriteLog("HealHP C[%.2f]", valueC ); if( valueC < 0.0f ) { NETWORK2->PostServerEvent("cDamageCalc::HealHP1200 valueC < 0.0f[%f][%d,%d,%d,%d,%d,%d,%d]", valueC, statusHeal, skillHealPlus, skillHealPer, targetHealPlus, targetHealPer, targetItemPlus, targetItemPer ); valueC = 0.0f; } /// °á°ú°ª ¸®ÅÏ return (unsigned long)valueC; } unsigned long cDamageCalc::DotHealHP1230( long statusHeal, long infHealPlus, long infHealPer, unsigned long dotTotalTime, unsigned long dotTime ) { // µµÆ® Èú ȸº¹ °è»ê // [A] = Èú ȸº¹·® // B = ½ºÅ³ µµÆ® ȸº¹·®[+-]°ª // C = ½ºÅ³ Áö¼Ó½Ã°£ / ½ºÅ³ ƽ½Ã°£ // D = (A * ((100 + ½ºÅ³ µµÆ®È¸º¹·®[%]°ª) / 100 ) / C) + B float valueA = (float)statusHeal; float valueB = (float)infHealPlus; float valueC = 1.0f; if( dotTotalTime == 0 || dotTotalTime / dotTime == 0 ) { NETWORK2->PostServerEvent("cDamageCalc::DotHealHP1230 dotTotalTime == 0[%d,%d,%d,%d,%d]", statusHeal, infHealPlus, infHealPer, dotTotalTime, dotTime ); } else valueC = (float)dotTotalTime / dotTime; float valueD = (float) ( valueA * (( 100.0f + infHealPer ) / 100.0f ) / valueC ) + valueB; if( g_eventPrint == true ) Verbose->WriteLog("DotHealHP D[%.2f] ", valueD ); if( valueD < 0.0f ) { NETWORK2->PostServerEvent("cDamageCalc::DotHealHP1230 valueD < 0.0f[%f,%d,%d,%d,%d,%d]", valueD, statusHeal, infHealPlus, infHealPer, dotTotalTime, dotTime ); valueD = 0.0f; } /// °á°ú°ª ¸®ÅÏ return (unsigned long)valueD; }