#include "stdafx.h" #include "StatusCalc_Client.h" #include "ObjectManager.h" #include "Hero.h" #include "GameResourceManager.h" #include "SkillScript.h" #include "StatusScript.h" #include "SkillManager.h" #include "ItemManager.h" #include "MonsterScript.h" cStatusCalc_Client* cStatusCalc_Client::mpStatusCalc = NULL; cStatusCalc_Client::cStatusCalc_Client(void) { if( !mpStatusCalc ) { mpStatusCalc = this; } ::memset( mBaseStatus, 0, sizeof( mBaseStatus ) ); ::memset( mBaseStatusPlus, 0, sizeof( mBaseStatusPlus ) ); ::memset( mBaseStatusPer, 0, sizeof( mBaseStatusPer ) ); ::memset( mExtStatus, 0, sizeof( mExtStatus ) ); ::memset( mExtStatusPlus, 0, sizeof( mExtStatusPlus ) ); ::memset( mExtStatusPer, 0, sizeof( mExtStatusPer ) ); ::memset( mExtStatusLast, 0, sizeof( mExtStatusLast ) ); ::memset( mExtAddStatus, 0, sizeof( mExtAddStatus ) ); } cStatusCalc_Client::~cStatusCalc_Client(void) { } void cStatusCalc_Client::CalcPlayerStatusItemSkillAddDetail( eSTATUS_PLUS statusType, float value, bool passive ) { unsigned long arrayNum = 0; if( eSTATUSPLUS_STR_PLUS <= statusType && statusType < eSTATUSPLUS_BASE_MAX ) { arrayNum = statusType - eSTATUSPLUS_STR_PLUS; mBaseStatusPlus[arrayNum] = mBaseStatusPlus[arrayNum] + value; /// Ç׸ñº° »ö°ªÀ» ÁöÁ¤ÇÑ´Ù. SetBaseStatusInfoType( (ePLAYER_STATUS)arrayNum, value, mBaseStatusPlus[arrayNum] ); } else if( eSTATUSPLUS_STR_PERCENT <= statusType && statusType < eSTATUSPLUS_BASE_PERCENT_MAX ) { arrayNum = statusType - eSTATUSPLUS_STR_PERCENT; mBaseStatusPer[arrayNum] = mBaseStatusPer[arrayNum] + value; SetBaseStatusInfoType( (ePLAYER_STATUS)arrayNum, value, mBaseStatusPer[arrayNum] ); } else if( eSTATUSPLUS_ATK_PLUS <= statusType && statusType <= eSTATUSPLUS_EXT_PLUS_MAX ) { arrayNum = statusType - eSTATUSPLUS_ATK_PLUS; mExtStatusPlus[arrayNum] = mExtStatusPlus[arrayNum] + value; if( passive == false ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)arrayNum, value, mExtStatusPlus[arrayNum] ); } /// ±âº»½ºÅÝ 5°³ Àüü¸¦ º¯°æ else if( eSTATUSPLUS_BASEALL_PLUS == statusType ) { for( int i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL ; ++i ) { mBaseStatusPlus[i] = mBaseStatusPlus[i] + value; /// Ç׸ñº° »ö°ªÀ» ÁöÁ¤ÇÑ´Ù. SetBaseStatusInfoType( (ePLAYER_STATUS)i, value, mBaseStatusPlus[i] ); } } else if( eSTATUSPLUS_BASEALL_PERCENT == statusType ) { for( int i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL ; ++i ) { mBaseStatusPer[i] = mBaseStatusPer[i] + value; SetBaseStatusInfoType( (ePLAYER_STATUS)i, value, mBaseStatusPer[i] ); } } /// °ø°Ý·Â Àüü¸¦ º¯°æ+ else if( eSTATUSPLUS_ATKTOTAL_PLUS == statusType ) { mExtStatusPlus[ePLAYER_STATUS_EXT_ATK] += value; mExtStatusPlus[ePLAYER_STATUS_EXT_RATK] += value; mExtStatusPlus[ePLAYER_STATUS_EXT_MATK] += value; if( passive == false ) { SetExtStatusInfoType( ePLAYER_STATUS_EXT_ATK, value, mExtStatusPlus[ePLAYER_STATUS_EXT_ATK] ); SetExtStatusInfoType( ePLAYER_STATUS_EXT_RATK, value, mExtStatusPlus[ePLAYER_STATUS_EXT_RATK] ); SetExtStatusInfoType( ePLAYER_STATUS_EXT_MATK, value, mExtStatusPlus[ePLAYER_STATUS_EXT_MATK] ); } } /// ¹æ¾î·Â Àüü¸¦ º¯°æ+ else if( eSTATUSPLUS_DEFTOTAL_PLUS == statusType ) { mExtStatusPlus[ePLAYER_STATUS_EXT_DEF] += value; mExtStatusPlus[ePLAYER_STATUS_EXT_MDEF] += value; if( passive == false ) { SetExtStatusInfoType( ePLAYER_STATUS_EXT_DEF, value, mExtStatusPlus[ePLAYER_STATUS_EXT_DEF] ); SetExtStatusInfoType( ePLAYER_STATUS_EXT_MDEF, value, mExtStatusPlus[ePLAYER_STATUS_EXT_MDEF] ); } } else if( eSTATUSPLUS_ATK_PER <= statusType && statusType <= eSTATUSPLUS_EXT_PER_MAX ) { arrayNum = statusType - eSTATUSPLUS_ATK_PER; mExtStatusPer[arrayNum] = mExtStatusPer[arrayNum] + value; if( mExtStatusPer[arrayNum] <= -100 ) mExtStatusPer[arrayNum] = -99; /// ÆÐ½Ãºê´Â »öº¯È¯ ¾ÈÇÔ if( passive == false ) { /// Ç׸ñº° »ö°ªÀ» ÁöÁ¤ÇÑ´Ù. SetExtStatusInfoType( (ePLAYER_STATUS_EXT)arrayNum, value, mExtStatusPer[arrayNum] ); } } /// °ø°Ý·Â Àüü¸¦ º¯°æ% else if( eSTATUSPLUS_ATKTOTAL_PER == statusType ) { mExtStatusPer[ePLAYER_STATUS_EXT_ATK] += value; mExtStatusPer[ePLAYER_STATUS_EXT_RATK] += value; mExtStatusPer[ePLAYER_STATUS_EXT_MATK] += value; if( mExtStatusPer[ePLAYER_STATUS_EXT_ATK] <= -100 ) mExtStatusPer[ePLAYER_STATUS_EXT_ATK] = -99; if( mExtStatusPer[ePLAYER_STATUS_EXT_RATK] <= -100 ) mExtStatusPer[ePLAYER_STATUS_EXT_RATK] = -99; if( mExtStatusPer[ePLAYER_STATUS_EXT_MATK] <= -100 ) mExtStatusPer[ePLAYER_STATUS_EXT_MATK] = -99; if( passive == false ) { SetExtStatusInfoType( ePLAYER_STATUS_EXT_ATK, value, mExtStatusPer[ePLAYER_STATUS_EXT_ATK] ); SetExtStatusInfoType( ePLAYER_STATUS_EXT_RATK, value, mExtStatusPer[ePLAYER_STATUS_EXT_RATK] ); SetExtStatusInfoType( ePLAYER_STATUS_EXT_MATK, value, mExtStatusPer[ePLAYER_STATUS_EXT_MATK] ); } } /// ¹æ¾î·Â Àüü¸¦ º¯°æ% else if( eSTATUSPLUS_DEFTOTAL_PER == statusType ) { mExtStatusPer[ePLAYER_STATUS_EXT_DEF] += value; mExtStatusPer[ePLAYER_STATUS_EXT_MDEF] += value; if( mExtStatusPer[ePLAYER_STATUS_EXT_DEF] <= -100 ) mExtStatusPer[ePLAYER_STATUS_EXT_DEF] = -99; if( mExtStatusPer[ePLAYER_STATUS_EXT_MDEF] <= -100 ) mExtStatusPer[ePLAYER_STATUS_EXT_MDEF] = -99; if( passive == false ) { SetExtStatusInfoType( ePLAYER_STATUS_EXT_DEF, value, mExtStatusPer[ePLAYER_STATUS_EXT_DEF] ); SetExtStatusInfoType( ePLAYER_STATUS_EXT_MDEF, value, mExtStatusPer[ePLAYER_STATUS_EXT_MDEF] ); } } else if( eSTATUSPLUS_EXPADDPER <= statusType && statusType < eSTATUSPLUS_BUFF_ETC_MAX ) { arrayNum = statusType - eSTATUSPLUS_EXPADDPER; mExtAddStatus[arrayNum] = mExtAddStatus[arrayNum] + value; if( statusType == eSTATUSPLUS_EXPADDPER || statusType == eSTATUSPLUS_SXPADDPER || statusType == eSTATUSPLUS_MONEYPER || statusType == eSTATUSPLUS_PVPPOINTPER ) { if( mExtAddStatus[arrayNum] <= -100 ) mExtAddStatus[arrayNum] = -99; } } } void cStatusCalc_Client::SetBaseStatusInfoType( ePLAYER_STATUS pos, float value, float totalValue ) { if( !( ePLAYER_STATUS_STR <= pos && pos < ePLAYER_STATUS_LEVEL ) ) { assert(NULL); return; } /// Ç÷¹À̾î Á¤º¸ Àоî¿È cHero* pHero = OBJECTMANAGER->GetHero(); /// ÇöÀç Ä÷¯ ŸÀÔÀ» °¡Á®¿È eStateInfo_Type colorType; colorType = pHero->GetBaseStatusInfoType( pos ); /// Àоî¿Â ¼öÄ¡°ªÀÌ 0 Àϰæ¿ì ¸®ÅÏ if( value == 0 ) { return; } /// ±âÁ¸ Ä÷¯Å¸ÀÔÀÌ ¾ø´Â »óÅ¿¡ +°ªÀÌ µé¾î ¿Â°æ¿ì else if( colorType == eSTATE_NORMAL && value > 0 ) { /// Ä÷¯Å¸ÀÔÀ» +»öÀ¸·Î ¼³Á¤ pHero->SetBaseStatusInfoType( pos, eSTATE_PLUS ); } /// ±âÁ¸ Ä÷¯Å¸ÀÔÀÌ ¾ø´Â »óÅ¿¡ -°ªÀÌ µé¾î ¿Â°æ¿ì else if( colorType == eSTATE_NORMAL && value < 0 ) { /// Ä÷¯Å¸ÀÔÀ» -»öÀ¸·Î ¼³Á¤ pHero->SetBaseStatusInfoType( pos, eSTATE_MINUS ); } /// ±âÁ¸ Ä÷¯Å¸ÀÔÀÌ +»óÅ¿¡¼­ -°ªÀÌ µé¾î ¿Â°æ¿ì ¶Ç´Â ±âÁ¸ Ä÷¯Å¸ÀÔÀÌ -»óÅ¿¡¼­ +°ªÀÌ µé¾î ¿Â°æ¿ì else if( ( colorType == eSTATE_PLUS && value < 0 ) || ( colorType == eSTATE_MINUS && value > 0 )) { if( totalValue > 0 ) { /// Ä÷¯Å¸ÀÔÀ» +»öÀ¸·Î ¼³Á¤ pHero->SetBaseStatusInfoType( pos, eSTATE_OVERLAPPLUS ); } else { /// Ä÷¯Å¸ÀÔÀ» +»öÀ¸·Î ¼³Á¤ pHero->SetBaseStatusInfoType( pos, eSTATE_OVERLAPMINUS ); } } } void cStatusCalc_Client::SetExtStatusInfoType( ePLAYER_STATUS_EXT pos, float value, float totalValue ) { if( !( ePLAYER_STATUS_EXT_ATK <= pos && pos <= ePLAYER_STATUS_EXT_MAX ) ) { assert(NULL); return; } /// ÇöÀç Ä÷¯ ŸÀÔÀ» °¡Á®¿È eStateInfo_Type colorType; colorType = HERO->GetExtStatusInfoType( pos ); /// Àоî¿Â ¼öÄ¡°ªÀÌ 0 Àϰæ¿ì ¸®ÅÏ if( value == 0 ) { return; } /// ±âÁ¸ Ä÷¯Å¸ÀÔÀÌ ¾ø´Â »óÅ¿¡ +°ªÀÌ µé¾î ¿Â°æ¿ì else if( colorType == eSTATE_NORMAL && value > 0 ) { /// Ä÷¯Å¸ÀÔÀ» +»öÀ¸·Î ¼³Á¤ HERO->SetExtStatusInfoType( pos, eSTATE_PLUS ); } /// ±âÁ¸ Ä÷¯Å¸ÀÔÀÌ ¾ø´Â »óÅ¿¡ -°ªÀÌ µé¾î ¿Â°æ¿ì else if( colorType == eSTATE_NORMAL && value < 0 ) { /// Ä÷¯Å¸ÀÔÀ» -»öÀ¸·Î ¼³Á¤ HERO->SetExtStatusInfoType( pos, eSTATE_MINUS ); } /// ±âÁ¸ Ä÷¯Å¸ÀÔÀÌ +»óÅ¿¡¼­ -°ªÀÌ µé¾î ¿Â°æ¿ì ¶Ç´Â ±âÁ¸ Ä÷¯Å¸ÀÔÀÌ -»óÅ¿¡¼­ +°ªÀÌ µé¾î ¿Â°æ¿ì else if( ( colorType == eSTATE_PLUS && value < 0 ) || ( colorType == eSTATE_MINUS && value > 0 )) { if( totalValue > 0 ) { /// Ä÷¯Å¸ÀÔÀ» +»öÀ¸·Î ¼³Á¤ HERO->SetExtStatusInfoType( pos, eSTATE_OVERLAPPLUS ); } else { /// Ä÷¯Å¸ÀÔÀ» +»öÀ¸·Î ¼³Á¤ HERO->SetExtStatusInfoType( pos, eSTATE_OVERLAPMINUS ); } } } void cStatusCalc_Client::CalcPlayerBaseOnly() { //HERO->InitStatusColor(); /// ±âº» ½ºÅÝ ÃʱâÈ­ for( unsigned char i = ePLAYER_STATUS_STR ; ePLAYER_STATUS_LEVEL > i ; ++i ) { mBaseStatus[i] = 0.0f; } /// ½ºÅ©¸³Æ®¿¡¼­ ÀоîµéÀÎ ¼ø¼öÇÑ ±âº» ½ºÅݰª °è»ê CalcPlayerStatus(); } void cStatusCalc_Client::CalcPlayerExtensionOnly() { HERO->InitStatusInfoType(); /// ½ºÅÝ1 + ÃʱâÈ­ for( unsigned char i = ePLAYER_STATUS_STR ; ePLAYER_STATUS_LEVEL > i ; ++i ) { mBaseStatusPlus[i] = 0.0f; } /// ½ºÅÝ1 % ÃʱâÈ­ for( unsigned char i = ePLAYER_STATUS_STR ; ePLAYER_STATUS_LEVEL > i ; ++i ) { mBaseStatusPer[i] = 0.0f; } /// ½ºÅÝ2 + ÃʱâÈ­ for( int i = ePLAYER_STATUS_EXT_ATK ; ePLAYER_STATUS_EXT_MAX > i ; ++i ) { mExtStatusPlus[i] = 0; } /// ½ºÅÝ2 % ÃʱâÈ­ for( int i = ePLAYER_STATUS_EXT_ATK ; ePLAYER_STATUS_EXT_MAX > i ; ++i ) { mExtStatusPer[i] = 0; } /// ½ºÅÝ¿Ü ½ºÅÝ for( int i = ePLAYER_STATUS_EXT_ADD_EXPADDPER ; ePLAYER_STATUS_EXT_ADD_MAX > i ; ++i ) { mExtAddStatus[i] = 0; } /// ½ºÅ³È¿°ú, ½ºÅ³ÆÐ½Ãºê, ¾ÆÀÌÅÛ µ¥ÀÌŸ¸¦ Àоî¿Í ½ºÅÝ ¼öÄ¡ Àû¿ë CalcPlayerStatusSkillInfluenceAdd(); CalcPlayerStatusSkillPassiveAdd(); CalcPlayerStatusItemAdd(); } unsigned long cStatusCalc_Client::GetParantJob( unsigned long job, unsigned int jobPos ) { unsigned long jobCode; /// ÇöÀç Á÷¾÷ÀÇ ºÎ¸ð Á÷¾÷µéÀ» ¹è¿­·Î ¹Þ¾Æ¿Â´Ù. tArray* pParentJob; /// »óÀ§ Á÷¾÷ Äڵ带 Àоî¿Å pParentJob = GAMERESOURCEMAN->GetParentJob( job ); /// µ¥ÀÌÅͰ¡ ¾ø´Ù - ÇöÀç Á÷¾÷ÀÌ ±âº» Á÷¾÷ ÀÌ´Ù. if( pParentJob == NULL ) { return NULL; } /// »çÀÌÁ´Ù Å©´Ù - ÇöÀç Á÷¾÷ÀÌ ÃÖÁ¾ Á÷¾÷ÀÌ´Ù. if( jobPos > pParentJob->GetSize() - 1 ) { return NULL; } /// ÀüÁ÷ Â÷¼ö¿¡ ÇØ´çÇÏ´Â Á÷¾÷ÀÇ ÄÚµåµå¸¦ Àо´Ù. pParentJob->GetAt( &jobCode, jobPos ); return jobCode; } void cStatusCalc_Client::CalcPlayerStatusSkillInfluenceAdd() { cPointerHashMap::cIterator iter; cInfluenceObject* pInfluenceObject = NULL; sInfluenceScript* pInfluenceScript = NULL; cPointerHashMap* influenceMap = HERO->GetBufMap(); if( influenceMap != NULL ) { iter = influenceMap->Begin(); while( iter != influenceMap->End() ) { pInfluenceObject = (cInfluenceObject*)((*iter).mSecond); ++iter; pInfluenceScript = SKILLSCRIPT->GetInfluenceInfo( pInfluenceObject->GetInfluenceIdx() ); /// Áö¼ÓÀûÀÎ È¿°ú°¡ ¾Æ´Ñ°æ¿ì¸¸(µ¥¹ÌÁö) if( pInfluenceScript->mTime1 == 0 ) { if( pInfluenceScript->mStatusPlusIdx1 != 0 ) { CalcPlayerStatusItemSkillAddDetail( (eSTATUS_PLUS)(pInfluenceScript->mStatusPlusIdx1), (float)(pInfluenceScript->mValue1), false ); } } /// Áö¼ÓÀûÀÎ È¿°ú°¡ ¾Æ´Ñ°æ¿ì¸¸(µ¥¹ÌÁö) if( pInfluenceScript->mTime2 == 0 ) { if( pInfluenceScript->mStatusPlusIdx2 != 0 ) { CalcPlayerStatusItemSkillAddDetail( (eSTATUS_PLUS)(pInfluenceScript->mStatusPlusIdx2), (float)(pInfluenceScript->mValue2), false ); } } if( pInfluenceScript->mStatusPlusIdx3 != 0 ) { CalcPlayerStatusItemSkillAddDetail( (eSTATUS_PLUS)(pInfluenceScript->mStatusPlusIdx3), (float)(pInfluenceScript->mValue3), false ); } } } influenceMap = HERO->GetDeBufMap(); if( influenceMap != NULL ) { iter = influenceMap->Begin(); while( iter != influenceMap->End() ) { pInfluenceObject = (cInfluenceObject*)((*iter).mSecond); ++iter; pInfluenceScript = SKILLSCRIPT->GetInfluenceInfo( pInfluenceObject->GetInfluenceIdx() ); /// Áö¼ÓÀûÀÎ È¿°ú°¡ ¾Æ´Ñ°æ¿ì¸¸(µ¥¹ÌÁö) if( pInfluenceScript->mTime1 == 0 ) { if( pInfluenceScript->mStatusPlusIdx1 != 0 ) { CalcPlayerStatusItemSkillAddDetail( (eSTATUS_PLUS)(pInfluenceScript->mStatusPlusIdx1), (float)(pInfluenceScript->mValue1), false ); } } if( pInfluenceScript->mStatusPlusIdx2 != 0 ) { CalcPlayerStatusItemSkillAddDetail( (eSTATUS_PLUS)(pInfluenceScript->mStatusPlusIdx2), (float)(pInfluenceScript->mValue2), false ); } if( pInfluenceScript->mStatusPlusIdx3 != 0 ) { CalcPlayerStatusItemSkillAddDetail( (eSTATUS_PLUS)(pInfluenceScript->mStatusPlusIdx3), (float)(pInfluenceScript->mValue3), false ); } } } } void cStatusCalc_Client::CalcPlayerStatusSkillPassiveAdd() { cPointerHashMap::cIterator iter; unsigned long skillIdx = 0; sKeepSkill* pKeepSkill = NULL; sPlayerSkillBaseInfo* pSkillInfo = NULL; sPlayerSkillStepInfo* pSkillStep = NULL; cPointerHashMap* keepSkillMap = SKILLMAN->GetKeepSkillMap(); if( keepSkillMap != NULL ) { iter = keepSkillMap->Begin(); while( iter != keepSkillMap->End() ) { skillIdx = (*iter).mFirst; pKeepSkill = (sKeepSkill*)((*iter).mSecond); if( pKeepSkill == NULL ) { assert(NULL); return; } ++iter; pSkillInfo = SKILLSCRIPT->GetPlayerSkillInfo( skillIdx ); /// ÆÐ½Ãºê¸¸ È¿°ú°ª Àû¿ë if( pSkillInfo->mType != eSKILLTYPE_PASSIVE ) { continue; } if( pSkillInfo->mStepCount <= pKeepSkill->mStep ) { assert(0); } pSkillStep = &pSkillInfo->mpSetpInfoArray[ pKeepSkill->mStep ]; /// ³» Àåºñ°¡ ¸Â´ÂÁö üũ bool IsEquipment = true; if( pSkillInfo->mUseEquipment ) { cItem* rightWeapon = ITEMMAN->GetHeroRightWeapon(); if( !rightWeapon ) { assert(0); return; } cItem* leftWeapon = ITEMMAN->GetHeroLeftWeapon(); if( !leftWeapon ) { assert(0); return; } int rType = rightWeapon->GetDefine()? rightWeapon->GetDefine()->GetSubType() : -1; int lType = leftWeapon->GetDefine()? leftWeapon->GetDefine()->GetSubType() : -1; /// Âø¿ë Àåºñ üũ switch( pSkillInfo->mUseEquipment ) { case eEQUIPTYPE_SWORD: if( rType != ITEM_WEAPON_SWORD ) IsEquipment = false; break; case eEQUIPTYPE_LONGSWORD: if( rType != ITEM_WEAPON_BLADE ) IsEquipment = false; break; case eEQUIPTYPE_DOUBLESWORD: if( rType != ITEM_WEAPON_DUAL ) IsEquipment = false; break; case eEQUIPTYPE_SHORTSWORD: if( rType != ITEM_WEAPON_CUTTER ) IsEquipment = false; break; case eEQUIPTYPE_GUN: if( rType != ITEM_WEAPON_GUN ) IsEquipment = false; break; case eEQUIPTYPE_STAFF: if( rType != ITEM_WEAPON_STAFF ) IsEquipment = false; break; case eEQUIPTYPE_SHIELD: if( lType != ITEM_WEAPON_SHIELD ) IsEquipment = false; break; case eEQUIPTYPE_SWORD_LONGSWORD: if( rType != ITEM_WEAPON_SWORD && rType != ITEM_WEAPON_BLADE ) IsEquipment = false; break; case eEQUIPTYPE_SWORD_DOUBLESWORD: if( rType != ITEM_WEAPON_SWORD && rType != ITEM_WEAPON_DUAL ) IsEquipment = false; break; case eEQUIPTYPE_LONGSWORD_DOUBLESWORD: if( rType != ITEM_WEAPON_BLADE && rType != ITEM_WEAPON_DUAL ) IsEquipment = false; break; case eEQUIPTYPE_SWORD_LONGSWORD_DOUBLESWORD: if( rType != ITEM_WEAPON_SWORD && rType != ITEM_WEAPON_BLADE && rType != ITEM_WEAPON_DUAL ) IsEquipment = false; break; case eEQUIPTYPE_SHORTSWORD_GUN: if( rType != ITEM_WEAPON_CUTTER && rType != ITEM_WEAPON_GUN ) IsEquipment = false; break; case eEQUIPTYPE_CLOTH: if( HERO->GetArmorSets() != ARMOR_SETS_ROBES ) IsEquipment = false; break; case eEQUIPTYPE_LIGHTARMOR: if( HERO->GetArmorSets() != ARMOR_SETS_LIGHT ) IsEquipment = false; break; case eEQUIPTYPE_HEAVYARMOR: if( HERO->GetArmorSets() != ARMOR_SETS_HEAVY ) IsEquipment = false; break; } } if( IsEquipment == true ) { if( pSkillStep->mApplyValueType1 != 0 ) { CalcPlayerStatusItemSkillAddDetail( (eSTATUS_PLUS)(pSkillStep->mApplyValueType1), (float)(pSkillStep->mApplyValue1), true ); } if( pSkillStep->mApplyValueType2 != 0 ) { CalcPlayerStatusItemSkillAddDetail( (eSTATUS_PLUS)(pSkillStep->mApplyValueType2), (float)(pSkillStep->mApplyValue2), true ); } } } } } void cStatusCalc_Client::CalcPlayerStatusItemAdd() { sEquipAbility* pEquipAbility = ITEMMAN->GetBasicAbil(); if( pEquipAbility == NULL ) return; pEquipAbility = ITEMMAN->GetBasicAbil(); if( pEquipAbility->mOptStr != 0 ) /// Áõ°¡:Èû { CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_STR_PLUS, (float)pEquipAbility->mOptStr, false ); } if( pEquipAbility->mOptDex != 0 ) /// Áõ°¡:¹Îø { CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_DEX_PLUS, (float)pEquipAbility->mOptDex, false ); } if( pEquipAbility->mOptCon != 0 ) /// Áõ°¡:ü·Â { CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_CON_PLUS, (float)pEquipAbility->mOptCon, false ); } if( pEquipAbility->mOptInt != 0 ) /// Áõ°¡:Áö´É { CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_INT_PLUS, (float)pEquipAbility->mOptInt, false ); } if( pEquipAbility->mOptWis != 0 ) /// Áõ°¡:ÁöÇý { CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_WIS_PLUS, (float)pEquipAbility->mOptWis, false ); } /* // ¾ÆÁ÷ ¾ÆÀÌÅÛ ¿É¼Ç Àû¿ë¾ÈµÇ´Â ½ÃÁ¡ÀÓ [7/13/2010 JO_CLIENT] // if( pEquipAbility->mOptPercentStr != 0 ) /// Áõ°¡:Èû(%) { CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_STR_PERCENT, (float)pEquipAbility->mOptPercentStr, false ); } if( pEquipAbility->mOptPercentDex != 0 ) /// Áõ°¡:¹Îø(%) { CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_DEX_PERCENT, (float)pEquipAbility->mOptPercentDex, false ); } if( pEquipAbility->mOptPercentCon != 0 ) /// Áõ°¡:ü·Â(%) { CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_CON_PERCENT, (float)pEquipAbility->mOptPercentCon, false ); } if( pEquipAbility->mOptPercentInt != 0 ) /// Áõ°¡:Áö´É(%) { CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_INT_PERCENT, (float)pEquipAbility->mOptPercentInt, false ); } if( pEquipAbility->mOptPercentWis != 0 ) /// Áõ°¡:ÁöÇý(%) { CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_WIS_PERCENT, (float)pEquipAbility->mOptPercentWis, false ); } */ //if( pEquipAbility->mOptPlusWei != 0 ) /// Áõ°¡:¹«°Ô //{ // CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_WEIGHT_PLUS, (float)pEquipAbility->mOptPlusWei, colorChange ); //} //if( pEquipAbility->mOptPlusMov != 0 ) /// Áõ°¡:À̵¿¼Óµµ //{ // CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_SPD_PLUS, (float)pEquipAbility->mOptPlusMov, colorChange ); //} //if( pEquipAbility->mOptPlusMaxHp != 0 ) /// Áõ°¡:ÃÖ´ëHP //{ // CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_HP_PLUS, (float)pEquipAbility->mOptPlusMaxHp, colorChange ); //} //if( pEquipAbility->mOptPlusMaxMp != 0 ) /// Áõ°¡:ÃÖ´ëMP //{ // CalcPlayerStatusItemSkillAddDetail( eSTATUSPLUS_MP_PLUS, (float)pEquipAbility->mOptPlusMaxMp, colorChange ); //} } void cStatusCalc_Client::CalcPlayerStatus() { unsigned char level = HERO->GetLevel(); ePLAYER_JOB job = HERO->GetJob(); /// ÀüÁ÷Ŭ·¡½º1 ±âÁØ ·¹º§ unsigned char class1 = 30; /// ÀüÁ÷Ŭ·¡½º2 ±âÁØ ·¹º§ unsigned char class2 = 70; sStatusBaseScript* pStatusBase = NULL; /// ÀÚ±â Àڽſ¡ ÇØ´çÇÏ´Â Á÷¾÷ÀÇ statusbase Á¤º¸¸¦ °¡Á®¿È pStatusBase = STATUSSCRIPT->GetStatusBaseInfo( job ); /// Àڽſ¡ ÇØ´çÇÏ´Â Á÷¾÷ÀÌ ¾øÀ¸¸é »óÀ§ Á÷¾÷À» Àоî¿Í¼­ ó¸®ÇÑ´Ù. if( pStatusBase == NULL ) { /// »óÀ§ Á÷¾÷ ¹è¿­À» Àоî¿Â´Ù. tArray* playerJobParent = GAMERESOURCEMAN->GetParentJob( job ); if( playerJobParent == NULL ) { /// ÀÚ½ÅÀÇ Á÷¾÷µµ ¾ø´Âµ¥ ºÎ¸ðÀÇ Á÷¾÷µµ ¾øÀ¸¸é ¿À·ù assert(NULL); return; } else { /// »óÀ§ Á÷¾÷ÀÌ ÀÖÀ¸¸é for( int i = playerJobParent->GetSize() - 1 ; 0 <= i ; --i ) { /// »óÀ§ Á÷¾÷ÄÚµå·Î ½ºÅ©¸³Æ® °ªÀ» Àоî¿È pStatusBase = STATUSSCRIPT->GetStatusBaseInfo( (*playerJobParent)[i] ); if( pStatusBase != NULL ) { break; } } assert(NULL); } } /// ÀÔ·Â °ª ±âº» ½ºÅÝ ¼öÄ¡·Î Àû¿ë for( unsigned char i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL ; ++i ) { mBaseStatus[i] = pStatusBase->mBaseStatus[i]; } /// ÀüÁ÷ Â÷¼ö¿Í ·¹º§¿¡ µû¸¥ ½ÇÁ¦ Àû¿ë ¹Þ¾Æ¾ßÇÒ Á÷¾÷ÄÚµå unsigned long fixjob = job; sStatusMultiplScript* pStatusMultipl; /// ÇöÀç ·¹º§¿¡¼­ 1·¹º§±îÁö ½ºÅÝ °è»ê ( 0·¹º§Àº ±âº»°ª 1·¹º§ºÎÅÍ Áõ°¡Ä¡ ) for( unsigned char j = 1 ; j < level ; ++j ) { /// 1·¹º§¿¡¼­ 1Â÷ÀüÁ÷·¹º§(30)Àü±îÁö ±âº»Á÷¾÷ ÄÚµå·Î ½ºÅÝ °è»ê if( ( 1 <= j ) && ( j < class1 ) ) { /// »óÀ§ Á÷¾÷ ¸®½ºÆ®¿¡¼­ 1Â÷ÀüÁ÷ Á÷¾÷À» °¡Á®¿È fixjob = GetParantJob( job, 0 ); /// ¾ø´Â °æ¿ì ÇöÀç Á÷¾÷ÀÌ ±âº» Á÷¾÷À̶ó ºÎ¸ð°¡ ¾ø´Â °æ¿ìÀÓ if( fixjob == NULL ) { /// ÇöÀç Á÷¾÷À» ½ºÅÝ °è»ê ±âÁØ ÄÚµå·Î µî·Ï fixjob = job; } } /// 1Â÷ÀüÁ÷·¹º§(30)¿¡¼­ 2Â÷ÀüÁ÷·¹º§(70)±îÁö 1Â÷ÀüÁ÷ else if( ( class1 <= j ) && ( j < class2 ) ) { /// »óÀ§ Á÷¾÷ ¸®½ºÆ®¿¡¼­ 1Â÷ÀüÁ÷ Á÷¾÷À» °¡Á®¿È fixjob = GetParantJob( job, 1 ); /// ¾ø´Â °æ¿ì ÇöÀç Á÷¾÷ÀÌ 1Â÷ Á÷¾÷ÀÓ if( fixjob == NULL ) { fixjob = job; } } /// 2Â÷ÀüÁ÷·¹º§(30)¿¡¼­ ·¹º§ ÇѰèÁ¡ ±îÁö else if( class2 <= j ) { /// »óÀ§ Á÷¾÷ ¸®½ºÆ®¿¡¼­ 2Â÷ÀüÁ÷ Á÷¾÷À» °¡Á®¿È fixjob = GetParantJob( job, 2 ); /// ¾ø´Â °æ¿ì ÇöÀç Á÷¾÷ÀÌ 2Â÷ Á÷¾÷ÀÓ if( fixjob == NULL ) { fixjob = job; } } /// ÇöÀç ·¹º§¿¡ ¸Â´Â Á÷¾÷ ÄÚµå·Î ½ºÅÝ Áõ°¡Ä¡¸¦ ¾ò¾î¿È pStatusMultipl = STATUSSCRIPT->GetStatusMultiplInfo( fixjob ); if( pStatusMultipl == NULL ) { assert(NULL); return; } for( unsigned char i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL ; ++i ) { /// Ŭ·¡½º±âÁØ¿¡ µû¸¥ Áõ°¡Ä¡ ¸¸Å­ Áõ°¡ mBaseStatus[i] = mBaseStatus[i] + pStatusMultipl->mBaseStatus[i]; } } } void cStatusCalc_Client::CalcPlayerExtStatus( ePLAYER_STATUS_EXT statusExt ) { ePLAYER_JOB job = HERO->GetJob(); /// Ç÷¹À̾îÀÇ ½ºÅÝ1 ÃÖÁ¾°ªÀ» Àоî¿È + ·¹º§°ª±îÁö float baseStatus[ePLAYER_STATUS_LEVEL_MAX]; unsigned char i = ePLAYER_STATUS_STR; for( ; i < ePLAYER_STATUS_LEVEL ; ++i ) { baseStatus[i] = (mBaseStatus[i] + mBaseStatusPlus[i]); if( mBaseStatusPer[i] != 0 ) baseStatus[i] += (mBaseStatus[i] + mBaseStatusPlus[i]) * (mBaseStatusPer[i]*0.01f); if( baseStatus[i] < 0.0f ) baseStatus[i] = 0.0f; } baseStatus[i] = HERO->GetLevel(); /// ½ºÅÝÀÇ °è»ê °á°ú °ª float statusValue = 0.0f; /// ÀÚ¿¬È¸º¹HP/MP ±âº»°ªÀº [ij¸¯ÅͽºÅÈȸº¹¼öÄ¡]¿¡ ´õÇÏÁö ¾Ê°í ÀÚ¿¬È¸º¹°è»ê½Ã »ç¿ëÇÑ´Ù. if( statusExt == ePLAYER_STATUS_EXT_RECOVHP || statusExt == ePLAYER_STATUS_EXT_RECOVMP ) { statusValue = 0.0f; } else { /// ÀÚ½ÅÀÇ Á÷¾÷°ú ½ºÅÝ ±¸ºÐÀ̶û °°Àº °ÍÀÌ ÀÖ´ÂÁö üũ statusValue = (float)STATUSSCRIPT->GetStatusExtBaseInfo( statusExt, job ); //if( FloatToInt(statusValue) == 0 ) //{ // if( playerJobParent != 0 ) // { // /// »óÀ§ Á÷¾÷ÀÌ ÀÖÀ¸¸é // for( int i = playerJobParent->GetSize() - 1 ; 0 <= i ; --i ) // { // /// »óÀ§ Á÷¾÷ÄÚµå·Î ½ºÅ©¸³Æ® °ªÀ» Àоî¿È // statusValue = (float)STATUSSCRIPT->GetStatusExtBaseInfo( statusExt, (*playerJobParent)[i] ); // if( FloatToInt(statusValue) != 0 ) // { // break; // } // } // } // else // { // statusValue = 0.0f; // } //} } /// Ç÷¹À̾îÀÇ ÃÖ»óÀ§(1Â÷) Á÷¾÷ ±â·Ï tArray* playerJobParent = GAMERESOURCEMAN->GetParentJob( job ); unsigned long firstJob = HERO->GetJob(); if( playerJobParent != NULL ) firstJob = (*playerJobParent)[0]; /// 1Â÷ Á÷¾÷¿¡ µû¶ó °ø°Ý·Â ½ºÅÝ ºñÁßÄ¡ Àоî¿Ã Ç׸ñ°ª ¼³Á¤ unsigned long plusStatus = 0; switch( firstJob ) { case ePLAYER_FIGHTER: /// ÆÄÀÌÅÍ case ePLAYER_ARMSMAN: /// ¾ÏÁî¸Ç plusStatus = 0; break; case ePLAYER_WANDERER: /// ¿ø´õ·¯ case ePLAYER_RANGER: /// ·¹ÀÎÀú plusStatus = 1; break; case ePLAYER_MAGE: /// ¸ÞÀÌÁö case ePLAYER_WARLOCK: /// ¿ö·Ï plusStatus = 2; break; } float oriMaxMP = statusValue; float importance = 0.0f; for( unsigned char i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL_MAX ; ++i ) { eEXT_MULTIPL chgStatusExt = eEXT_MULTIPL_MAX; switch( statusExt ) { case ePLAYER_STATUS_EXT_ATK: chgStatusExt = (eEXT_MULTIPL)( eEXT_MULTIPL_ATK_FIGHTER + plusStatus ); /// ±Ù°Å¸®, ¿ø°Å¸®, ¸¶¹ý Á÷¾÷¿¡ µû¸¥ °ø°Ý·Â Ç׸ñ ¼³Á¤ break; case ePLAYER_STATUS_EXT_RATK: chgStatusExt = (eEXT_MULTIPL)( eEXT_MULTIPL_RATK_FIGHTER + plusStatus ); break; case ePLAYER_STATUS_EXT_MATK: chgStatusExt = (eEXT_MULTIPL)( eEXT_MULTIPL_MATK_FIGHTER + plusStatus ); break; case ePLAYER_STATUS_EXT_DEF: chgStatusExt = eEXT_MULTIPL_DEF; break; /// ¹°¸® ¹æ¾î·Â case ePLAYER_STATUS_EXT_MDEF: chgStatusExt = eEXT_MULTIPL_MDEF; break; /// ¸¶¹ý ¹æ¾î·Â case ePLAYER_STATUS_EXT_CRI: chgStatusExt = eEXT_MULTIPL_CRI; break; /// ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡ case ePLAYER_STATUS_EXT_MCRI: chgStatusExt = eEXT_MULTIPL_MCRI; break; /// ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡ case ePLAYER_STATUS_EXT_MAXHP: chgStatusExt = eEXT_MULTIPL_MAXHP; break; /// HP case ePLAYER_STATUS_EXT_MAXMP: /// MP { chgStatusExt = eEXT_MULTIPL_MAXMP; /// º£À̽º ½ºÅÝÀ» ºñÁß°ú °öÇÑ´Ù. importance = STATUSSCRIPT->GetStatusExtMultiplInfo( chgStatusExt, (ePLAYER_STATUS)i ); oriMaxMP += mBaseStatus[i] * importance; } break; case ePLAYER_STATUS_EXT_RECOVHP: chgStatusExt = eEXT_MULTIPL_RECOVHP; break; /// HP ȸº¹ ¼Óµµ case ePLAYER_STATUS_EXT_RECOVMP: chgStatusExt = eEXT_MULTIPL_RECOVMP; break; /// MP ȸº¹ ¼Óµµ case ePLAYER_STATUS_EXT_HIT: chgStatusExt = eEXT_MULTIPL_HIT; break; /// ¸íÁß ¼öÄ¡ case ePLAYER_STATUS_EXT_MHIT: chgStatusExt = eEXT_MULTIPL_MHIT; break; /// ¸¶¹ý ¸íÁß case ePLAYER_STATUS_EXT_AVOID: chgStatusExt = eEXT_MULTIPL_AVOID; break; /// ȸÇÇ ¼öÄ¡ case ePLAYER_STATUS_EXT_WEIGHT: chgStatusExt = eEXT_MULTIPL_WEIGHT; break; /// ¹«°Ô case ePLAYER_STATUS_EXT_RANGE: chgStatusExt = eEXT_MULTIPL_RANGE; break; /// »çÁ¤°Å¸® case ePLAYER_STATUS_EXT_RRANGE: chgStatusExt = eEXT_MULTIPL_RRANGE; break; /// ¹æÃâÇ÷»çÁ¤°Å¸® case ePLAYER_STATUS_EXT_COOLTIME: chgStatusExt = eEXT_MULTIPL_COOLTIME; break; /// ÄðŸÀÓ case ePLAYER_STATUS_EXT_SPD: chgStatusExt = eEXT_MULTIPL_SPD; break; /// À̵¿¼Óµµ case ePLAYER_STATUS_EXT_ASPD: chgStatusExt = eEXT_MULTIPL_ASPD; break; /// °ø°Ý ¼Óµµ case ePLAYER_STATUS_EXT_MAVOID: chgStatusExt = eEXT_MULTIPL_MAVOID; break; /// ¸¶¹ýȸÇÇ(ÀúÇ×·Â) case ePLAYER_STATUS_EXT_HEAL: chgStatusExt = eEXT_MULTIPL_HEAL; break; /// Èúȸº¹·® case ePLAYER_STATUS_EXT_CRIDEF: chgStatusExt = eEXT_MULTIPL_CRIDEF; break; /// ¹°¸® Å©¸®Æ¼Äà °¨¼Ò(¹æÈ£) case ePLAYER_STATUS_EXT_MCRIDEF: chgStatusExt = eEXT_MULTIPL_MCRIDEF; break; /// ¸¶¹ý Å©¸®Æ¼Äà °¨¼Ò(¹æÈ£) } /// º£À̽º ½ºÅÝÀ» ºñÁß°ú °öÇÑ´Ù. importance = STATUSSCRIPT->GetStatusExtMultiplInfo( chgStatusExt, (ePLAYER_STATUS)i ); statusValue += baseStatus[i] * importance; } if( statusExt == ePLAYER_STATUS_EXT_MAXMP ) HERO->SetOriMpMax( FloatToInt( oriMaxMP ) ); /// °á°ú °ªÀ» ±â·Ï mExtStatus[statusExt] = mExtStatus[statusExt] + statusValue; if( statusExt == ePLAYER_STATUS_EXT_WEIGHT ) { sHeroInfo* pHeroInfo = HERO->GetHeroInfo(); if( pHeroInfo ) { switch( pHeroInfo->BagEnd ) { case INVENTORY_BAG1_END: mExtStatus[statusExt] += ADD_BAG1_WEIGHT; break; case INVENTORY_BAG2_END: mExtStatus[statusExt] += ADD_BAG2_WEIGHT; break; case INVENTORY_BAG3_END: mExtStatus[statusExt] += ADD_BAG3_WEIGHT; break; } } else { assert(0); } } if( mExtStatus[statusExt] < 0.0f ) mExtStatus[statusExt] = 0.0f; } void cStatusCalc_Client::CalcPlayerInit() { CalcPlayerBaseOnly(); CalcPlayerExtensionOnly(); CalcPlayerGlobal(); } void cStatusCalc_Client::CalcPlayerBaseGlobal() { CalcPlayerBaseOnly(); CalcPlayerGlobal(); } void cStatusCalc_Client::CalcPlayerExtensionGlobal() { CalcPlayerExtensionOnly(); CalcPlayerGlobal(); } void cStatusCalc_Client::CalcPlayerGlobal() { /// È®Àå ½ºÅÝ º£À̽º ÃʱâÈ­ for( int i = ePLAYER_STATUS_EXT_ATK ; ePLAYER_STATUS_EXT_MAX > i ; ++i ) { mExtStatus[i] = 0; } /// È®Àå ½ºÅÝ ÃÖÁ¾°ª for( int i = ePLAYER_STATUS_EXT_ATK ; ePLAYER_STATUS_EXT_MAX > i ; ++i ) { mExtStatusLast[i] = 0; } sEquipAbility* pItem = ITEMMAN->GetBasicAbil(); for( unsigned char i = ePLAYER_STATUS_EXT_ATK ; i < ePLAYER_STATUS_EXT_MAX ; ++i ) { /// ½ºÅ©¸³Æ®¿¡¼­ ÀоîµéÀÎ ¼ø¼öÇÑ È®Àå ½ºÅݰª °è»ê CalcPlayerExtStatus( (ePLAYER_STATUS_EXT)i ); /// ÃÖÁ¾ ½ºÅÝ °è»êÀü °¡°¨»ê ÇÒ Ç׸ñ Àû¿ë switch( (ePLAYER_STATUS_EXT)i ) { /// ±Ù°Å¸® ¹°¸® °ø°Ý case ePLAYER_STATUS_EXT_ATK: { float num301 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 301 ); // °ø°Ý·Â(±Ù°Å¸®) // A = ij¸¯ÅÍ ½ºÅÈ ±Ù°Å¸® °ø°Ý·Â // B = ¾ÆÀÌÅÛ ¹°¸® °ø°Ý·Â + ( [ij¸¯ÅÍ] Lv * {num301} ) // C = ((100 + ¹öÇÁ¼º ±Ù°Å¸® °ø°Ý·Â[%]°ª + ¾ÆÀÌÅÛ ¹°¸® °ø°Ý·Â[%]°ª) / 100) // D = ((A + B ) * C) + ¹öÇÁ¼º ±Ù°Å¸® °ø°Ý·Â[+-]°ª + ¾ÆÀÌÅÛ ¹°¸® °ø°Ý·Â[+-]°ª float valueA = mExtStatus[i]; float valueB = pItem->mPhysicMinAttack + ( HERO->GetLevel() * num301 ); float valueC = (( 100.0f + mExtStatusPer[i] + pItem->mOptPercentPhysicAttack ) / 100.0f ); mExtStatusLast[i] = (( valueA + valueB ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusPhysicAttack; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( ePLAYER_STATUS_EXT_ATKMin, mExtStatusLast[i] ); valueB = pItem->mPhysicMaxAttack + ( HERO->GetLevel() * num301 ); valueC = (( 100.0f + mExtStatusPer[i] + pItem->mOptPercentPhysicAttack ) / 100.0f ); mExtStatusLast[i] = (( valueA + valueB ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusPhysicAttack; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( ePLAYER_STATUS_EXT_ATKMax, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentPhysicAttack != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentPhysicAttack, mExtStatusLast[i] ); if( pItem->mOptPlusPhysicAttack != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusPhysicAttack, mExtStatusLast[i] ); mExtStatusLast[i] = 0.0f; } break; /// ¿ø°Å¸® ¹°¸® °ø°Ý case ePLAYER_STATUS_EXT_RATK: { float num331 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 331 ); // °ø°Ý·Â(¿ø°Å¸®) // A = ij¸¯ÅÍ ½ºÅÈ ¿ø°Å¸® °ø°Ý·Â // B = ¾ÆÀÌÅÛ ¹°¸® °ø°Ý·Â + ( [ij¸¯ÅÍ] Lv * {num331} ) // C = ((100 + ¹öÇÁ¼º ¿ø°Å¸® °ø°Ý·Â[%]°ª + ¾ÆÀÌÅÛ ¹°¸® °ø°Ý·Â[%]°ª) / 100) // D = (A + B ) * C + ¹öÇÁ¼º ¿ø°Å¸® °ø°Ý·Â[+-]°ª + ¾ÆÀÌÅÛ ¹°¸® °ø°Ý·Â[+-]°ª float valueA = mExtStatus[i]; float valueB = pItem->mPhysicMinAttack + ( HERO->GetLevel() * num331 ); float valueC = (( 100.0f + mExtStatusPer[i] + pItem->mOptPercentPhysicAttack ) / 100.0f ); mExtStatusLast[i] = (( valueA + valueB ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusPhysicAttack; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( ePLAYER_STATUS_EXT_RATKMin, mExtStatusLast[i] ); valueB = pItem->mPhysicMaxAttack + ( HERO->GetLevel() * num331 ); valueC = (( 100.0f + mExtStatusPer[i] + pItem->mOptPercentPhysicAttack ) / 100.0f ); mExtStatusLast[i] = (( valueA + valueB ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusPhysicAttack; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( ePLAYER_STATUS_EXT_RATKMax, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentPhysicAttack != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentPhysicAttack, mExtStatusLast[i] ); if( pItem->mOptPlusPhysicAttack != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusPhysicAttack, mExtStatusLast[i] ); mExtStatusLast[i] = 0.0f; } break; /// ¹°¸® ¹æ¾î·Â case ePLAYER_STATUS_EXT_DEF: { float num401 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 401 ); float num402 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 402 ); // ¹æ¾î·Â(¹°¸®) // A = ij¸¯ÅÍ ½ºÅȹ°¸® ¹æ¾î·Â // B = ¾ÆÀÌÅÛ ¹°¸® ¹æ¾î·Â // C = ((100 + ¹öÇÁ¼º ¹°¸® ¹æ¾î·Â[%]°ª + ¾ÆÀÌÅÛ ¹°¸® ¹æ¾î·Â[%]°ª) / 100) // D = ((A / {num401} + B / {num402} ) * C) + ¹öÇÁ¼º ¹°¸® ¹æ¾î·Â[+-]°ª + ¾ÆÀÌÅÛ ¹°¸® ¹æ¾î·Â[+-]°ª float valueA = mExtStatus[i]; float valueB = pItem->mPhysicDefense; float valueC = ( ( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentPhysicDefense ) ) / 100.0f ); mExtStatusLast[i] = ( ( valueA / num401 + valueB / num402 ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusPhysicDefense; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentPhysicDefense != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentPhysicDefense, mExtStatusLast[i] ); if( pItem->mOptPlusPhysicDefense != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusPhysicDefense, mExtStatusLast[i] ); } break; /// ¸¶¹ý °ø°Ý case ePLAYER_STATUS_EXT_MATK: { float num361 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 361 ); float num362 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 362 ); // °ø°Ý·Â(¸¶¹ý) // A = ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý °ø°Ý·Â / {num361} // B = ¾ÆÀÌÅÛ ¸¶¹ý °ø°Ý·Â + ( [ij¸¯ÅÍ] Lv * {num362} ) // C = ((100 + ¹öÇÁ¼º ¸¶¹ý °ø°Ý·Â[%]°ª + ¾ÆÀÌÅÛ ¸¶¹ý °ø°Ý·Â[%]°ª) / 100) // D = (A + B ) * C + ¹öÇÁ¼º ¸¶¹ý °ø°Ý·Â[+-]°ª + ¾ÆÀÌÅÛ ¸¶¹ý °ø°Ý·Â[+-]°ª float valueA = mExtStatus[i] / num361; float valueB = pItem->mMagicMinAttack + ( HERO->GetLevel() * num362 ); float valueC = ( ( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentMagicAttack ) ) / 100.0f ); mExtStatusLast[i] = ( ( valueA + valueB ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusMagicAttack; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( ePLAYER_STATUS_EXT_MATKMin, mExtStatusLast[i] ); valueB = pItem->mMagicMaxAttack + ( HERO->GetLevel() * num362 ); valueC = ( ( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentMagicAttack ) ) / 100.0f ); mExtStatusLast[i] = ( ( valueA + valueB ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusMagicAttack; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( ePLAYER_STATUS_EXT_MATKMax, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentMagicAttack != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentMagicAttack, mExtStatusLast[i] ); if( pItem->mOptPlusMagicAttack != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusMagicAttack, mExtStatusLast[i] ); mExtStatusLast[i] = 0.0f; } break; /// ¸¶¹ý ¹æ¾î·Â case ePLAYER_STATUS_EXT_MDEF: { float num431 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 431 ); float num432 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 432 ); // ¹æ¾î·Â(¸¶¹ý) // A = ij¸¯ÅÍ ½ºÅȸ¶¹ý ¹æ¾î·Â // B = ¾ÆÀÌÅÛ ¸¶¹ý ¹æ¾î·Â // C = ((100 + ¹öÇÁ¼º ¸¶¹ý ¹æ¾î·Â[%]°ª + ¾ÆÀÌÅÛ ¸¶¹ý ¹æ¾î·Â[%]°ª) / 100) // D = ((A /{num431} + B / {num432} ) * C) + ¹öÇÁ¼º ¹°¸® ¹æ¾î·Â[+-]°ª + ¾ÆÀÌÅÛ ¸¶¹ý ¹æ¾î·Â[+-]°ª float valueA = mExtStatus[i]; float valueB = pItem->mMagicDefense; float valueC = (( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentMagicDefense ) ) / 100.0f ); mExtStatusLast[i] = (( valueA / num431 + valueB / num432 ) * valueC ) + mExtStatusPlus[i] + pItem->mOptPlusMagicDefense; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentMagicDefense != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentMagicDefense, mExtStatusLast[i] ); if( pItem->mOptPlusMagicDefense != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusMagicDefense, mExtStatusLast[i] ); } break; /// ¹°¸® °ø°Ý Å©¸® case ePLAYER_STATUS_EXT_CRI: { float num201 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 201 ); float num202 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 202 ); // Å©¸®Æ¼Äà ¹ß»ý È®·ü(¹°¸®) //A = [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡ * {num201} //B = A * ((100 + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¹°¸® Å©¸®Æ¼ÄÃ[%]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¹°¸® Å©¸®Æ¼Äà [%]°ª) / 100) + ( ([°ø°ÝÀÚ]¾ÆÀÌÅÛ ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¹°¸® Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª) * {num202} ) float valueA = mExtStatus[i] * num201; float valueB = valueA * (( 100.0f + pItem->mOptPercentPhysicCritical + mExtStatusPer[i] ) / 100.0f ) + (( pItem->mOptPlusPhysicCritical + mExtStatusPlus[i] ) * num202 ); mExtStatusLast[i] = valueB; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentPhysicCritical != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentPhysicCritical, mExtStatusLast[i] ); if( pItem->mOptPlusPhysicCritical != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusPhysicCritical, mExtStatusLast[i] ); } break; /// ¸¶¹ý °ø°Ý Å©¸® case ePLAYER_STATUS_EXT_MCRI: { float num231 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 231 ); float num232 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 232 ); // Å©¸®Æ¼Äà ¹ß»ý È®·ü(¸¶¹ý) //A = [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡ * {num231} //B = A * ((100 + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý Å©¸®Æ¼ÄÃ[%]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý Å©¸®Æ¼Äà [%]°ª) / 100) + (([°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý Å©¸®Æ¼Äà ¼öÄ¡[+-]°ª) * {num232} ) float valueA = mExtStatus[i] * num231; float valueB = valueA * (( 100.0f + pItem->mOptPercentMagicCritical + mExtStatusPer[i] ) / 100.0f ) + (( pItem->mOptPlusMagicCritical + mExtStatusPlus[i] ) * num232 ); mExtStatusLast[i] = valueB; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentMagicCritical != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentMagicCritical, mExtStatusLast[i] ); if( pItem->mOptPlusMagicCritical != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusMagicCritical, mExtStatusLast[i] ); }break; /// ÃÖ´ë HP case ePLAYER_STATUS_EXT_MAXHP: { float num20 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 20 ); /// ±âº» hp·® + ( ·¹º§ * num1 ) mExtStatus[i] = mExtStatus[i] + ( HERO->GetLevel() * num20 ); mExtStatusLast[i] = mExtStatus[i] * ( ( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentMaxHp ) ) / 100.0f ) + mExtStatusPlus[i] + pItem->mOptPlusMaxHp; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// ÃÖ´ë MP case ePLAYER_STATUS_EXT_MAXMP: { mExtStatusLast[i] = mExtStatus[i] * ( ( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentMaxMp ) ) / 100.0f ) + mExtStatusPlus[i] + pItem->mOptPlusMaxMp; if( mExtStatusLast[i] < 1.0f ) mExtStatusLast[i] = 1.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// HP ÀÚ¿¬ ȸº¹·® case ePLAYER_STATUS_EXT_RECOVHP: { float num1001 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 1001 ); float defaultValueHP = (float)STATUSSCRIPT->GetStatusExtBaseInfo( (ePLAYER_STATUS_EXT)i, HERO->GetJob() ); // ij¸¯ÅÍ È¸º¹ - HP ȸº¹ // A = Ŭ·¡½º ±âº»°ª // B = ( ij¸¯ÅÍ ½ºÅÈ È¸º¹ ¼öÄ¡ * {num1001} ) * ((100 + ¾ÆÀÌÅÛ HPȸº¹ [%]°ª+ ¹öÇÁ¼º HPȸº¹ [%]°ª) / 100) + ¾ÆÀÌÅÛ HPȸº¹ [+-]°ª // A + B + ¹öÇÁ¼º HPȸº¹ [+-]°ª float valueA = defaultValueHP; float valueB = ( mExtStatus[i] * num1001 ) * (( 100.0f + pItem->mOptPercentHp + mExtStatusPer[i] ) / 100.0f ) + pItem->mOptPlusHp; mExtStatusLast[i] = valueA + valueB + mExtStatusPlus[i]; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentHp != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentHp, mExtStatusLast[i] ); if( pItem->mOptPlusHp != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusHp, mExtStatusLast[i] ); } break; /// MP ÀÚ¿¬ ȸº¹·® case ePLAYER_STATUS_EXT_RECOVMP: { float num1101 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 1101 ); float defaultValueMP = (float)STATUSSCRIPT->GetStatusExtBaseInfo( (ePLAYER_STATUS_EXT)i, HERO->GetJob() ); // ij¸¯ÅÍ È¸º¹ - MP ȸº¹ // A = Ŭ·¡½º ±âº»°ª // B = ( ij¸¯ÅÍ ½ºÅÈ È¸º¹ ¼öÄ¡ * {num1101} ) * ((100 + ¾ÆÀÌÅÛ MPȸº¹ [%]°ª + ¹öÇÁ¼º MPȸº¹ [%]°ª) / 100) + ¾ÆÀÌÅÛ MPȸº¹ [+-]°ª // A + B + ¹öÇÁ¼º MPȸº¹ [+-]°ª float valueA = defaultValueMP; float valueB = ( mExtStatus[i] * num1101 ) * ( ( 100.0f + pItem->mOptPercentMp + mExtStatusPer[i] ) / 100.0f ) + pItem->mOptPlusMp; mExtStatusLast[i] = valueA + valueB + mExtStatusPlus[i]; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentMp != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentMp, mExtStatusLast[i] ); if( pItem->mOptPlusMp != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusMp, mExtStatusLast[i] ); } break; /// ¹°¸® °ø°Ý ¼º°ø case ePLAYER_STATUS_EXT_HIT: { float num101 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 101 ); float num102 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 102 ); // °ø°Ý ¼º°ø È®·ü(¹°¸®) // A = {num101} + (( [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸íÁß ¼öÄ¡) * ((100 + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸íÁß ¼öÄ¡[%]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸íÁß ¼öÄ¡[%]°ª) / 100) + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸íÁß ¼öÄ¡[+-]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸íÁß ¼öÄ¡[+-]°ª ) * {num102} float valueA = num101 + (( mExtStatus[i] ) * (( 100.0f + pItem->mOptPercentPhysicAttackRate + mExtStatusPer[i]) / 100.0f ) + pItem->mOptPlusPhysicAttackRate + mExtStatusPlus[i] ) * num102; mExtStatusLast[i] = valueA; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentPhysicAttackRate != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentPhysicAttackRate, mExtStatusLast[i] ); if( pItem->mOptPlusPhysicAttackRate != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusPhysicAttackRate, mExtStatusLast[i] ); } break; /// ¸¶¹ý °ø°Ý ¼º°ø case ePLAYER_STATUS_EXT_MHIT: { float num131 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 131 ); float num132 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 132 ); // °ø°Ý ¼º°ø È®·ü(¸¶¹ý) // A = {num131} + (( [°ø°ÝÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý ¸íÁß ¼öÄ¡) * ((100 + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¸íÁß ¼öÄ¡[%]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý ¸íÁß ¼öÄ¡[%]°ª) / 100) + [°ø°ÝÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¸íÁß ¼öÄ¡[+-]°ª + [°ø°ÝÀÚ]¹öÇÁ¼º ¸¶¹ý ¸íÁß ¼öÄ¡[+-]°ª ) * {num132} float valueA = num131 + (( mExtStatus[i] ) * (( 100.0f + pItem->mOptPercentMagicAttackRate + mExtStatusPer[i] ) / 100.0f ) + pItem->mOptPlusMagicAttackRate + mExtStatusPlus[i] ) * num132; mExtStatusLast[i] = valueA; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentMagicAttackRate != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentMagicAttackRate, mExtStatusLast[i] ); if( pItem->mOptPlusMagicAttackRate != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusMagicAttackRate, mExtStatusLast[i] ); } break; /// ȸÇÇÀ² case ePLAYER_STATUS_EXT_AVOID: { float num103 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 102 ); // C = (( [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ È¸ÇÇ ¼öÄ¡) * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ È¸ÇÇ ¼öÄ¡[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ȸÇÇ ¼öÄ¡[%]°ª ) / 100) + [¹æ¾îÀÚ]¾ÆÀÌÅÛ È¸ÇÇ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ȸÇÇ ¼öÄ¡[+-]°ª ) * {num103} float valueC = (( mExtStatus[i] ) * (( 100.0f + pItem->mOptPercentDod + mExtStatusPer[i] ) / 100.0f ) + pItem->mOptPlusDod + mExtStatusPlus[i] ) * num103; mExtStatusLast[i] = valueC; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentDod != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentDod, mExtStatusLast[i] ); if( pItem->mOptPlusDod != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusDod, mExtStatusLast[i] ); } break; /// ¹«°Ô case ePLAYER_STATUS_EXT_WEIGHT: { mExtStatusLast[i] = mExtStatus[i] * ( ( 100.0f + ( mExtStatusPer[i] + pItem->mOptPercentWei ) ) / 100.0f ) + mExtStatusPlus[i] + pItem->mOptPlusWei; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; /// ÀϹݰø°Ý ¼Óµµ case ePLAYER_STATUS_EXT_ASPD: { mExtStatusLast[i] = ( 100.0f + pItem->mAttackSpeed + mExtStatusPer[i] + pItem->mOptPercentAttackSpeed ) / 100.0f; if( mExtStatusLast[i] <= 0.0f ) mExtStatusLast[i] = 0.1f; if( mExtStatusLast[i] >= 2.0f ) mExtStatusLast[i] = 1.9f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); }break; /// À̵¿ ¼Óµµ °è»ê case ePLAYER_STATUS_EXT_SPD: { /// ¸ó½ºÅÍ º¯½ÅÁßÀÏ °æ¿ì À̵¿¼Óµµ ±âº»°ªÀ» ¸ó½ºÅÍ¿¡¼­ Àоî¿Â´Ù. if( HERO->GetTransMonsterClassIdx() != 0 ) { sMonsterScript* pMScript = MONSTERSCRIPT->GetMonsterListInfo( HERO->GetTransMonsterClassIdx() ); if( pMScript != NULL ) mExtStatus[i] = (float)pMScript->mActionRunSpd; mExtStatusLast[i] = mExtStatus[i] * ( ( 100.0f + mExtStatusPer[i] + pItem->mOptPercentMov ) / 100.0f ) + mExtStatusPlus[i] + pItem->mOptPlusMov; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } else { mExtStatusLast[i] = mExtStatus[i] * ( ( 100.0f + mExtStatusPer[i] + pItem->mOptPercentMov ) / 100.0f ) + mExtStatusPlus[i] + pItem->mOptPlusMov; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } } break; /// Èú ȸº¹·® case ePLAYER_STATUS_EXT_HEAL: { // Èú ȸº¹·® // A = ((ij¸¯ÅÍ ½ºÅÈ Èúȸº¹·® + ¾ÆÀÌÅÛ ±âº» Èú ȸº¹·®) * ((100 + ¹öÇÁ¼º Èú ȸº¹·® [%]°ª + ¾ÆÀÌÅÛ Èú ȸº¹·® [%]°ª) / 100) // + ¾ÆÀÌÅÛ Èú ȸº¹·®[+-]°ª + ¹öÇÁ¼º Èú ȸº¹·® [+-]°ª) float valueA = (( mExtStatus[ePLAYER_STATUS_EXT_HEAL] + pItem->mHealValue ) * (( 100 + mExtStatusPer[ePLAYER_STATUS_EXT_HEAL] + pItem->mOptPercentHeal ) / 100 ) + pItem->mOptPlusHeal + mExtStatusPlus[ePLAYER_STATUS_EXT_HEAL] ); mExtStatusLast[i] = valueA; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( ePLAYER_STATUS_EXT_HEAL, mExtStatusLast[i] ); } break; /// ¸¶¹ý ȸÇÇÀ²(ÀúÇ×) case ePLAYER_STATUS_EXT_MAVOID: { float num133 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 133 ); // C = (( [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ÀúÇ×·Â ¼öÄ¡ ) * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ÀúÇ×·Â ¼öÄ¡[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ÀúÇ×·Â ¼öÄ¡[%]°ª) / 100) + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ÀúÇ×·Â ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ÀúÇ×·Â ¼öÄ¡[+-]°ª ) * {num133} float valueC = (( mExtStatus[i] ) * (( 100.0f + pItem->mOptPercentResistance + mExtStatusPer[i] ) / 100.0f ) + pItem->mOptPlusResistance + mExtStatusPlus[i] ) * num133; mExtStatusLast[i] = valueC; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentDod != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentResistance, mExtStatusLast[i] ); if( pItem->mOptPlusDod != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusResistance, mExtStatusLast[i] ); } break; /// ¹°¸® °ø°Ý Å©¸® °¨¼Ò case ePLAYER_STATUS_EXT_CRIDEF: { float num203 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 203 ); float num204 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 204 ); //D = [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ¹°¸® ¹æÈ£ ¼öÄ¡ * {num203} //E = D * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ¹°¸® ¹æÈ£[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¹°¸® ¹æÈ£ [%]°ª) / 100) // + ( ([¹æ¾îÀÚ]¾ÆÀÌÅÛ ¹°¸® ¹æÈ£ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¹°¸® ¹æÈ£ ¼öÄ¡[+-]°ª) * {num204} ) float valueD = mExtStatus[i] * num203; float valueE = valueD * (( 100.0f + pItem->mOptPercentPhysicCriticalDec + mExtStatusPer[i] ) / 100 ) + ( ( pItem->mOptPlusPhysicCriticalDec + mExtStatusPlus[i] ) * num204 ); mExtStatusLast[i] = valueE; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentPhysicCriticalDec != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentPhysicCriticalDec, mExtStatusLast[i] ); if( pItem->mOptPlusPhysicCriticalDec != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusPhysicCriticalDec, mExtStatusLast[i] ); } break; /// ¸¶¹ý °ø°Ý Å©¸® °¨¼Ò case ePLAYER_STATUS_EXT_MCRIDEF: { float num233 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 233 ); float num234 = STATUSSCRIPT->GetDamageCalcNumericalInfo( 234 ); //D = [¹æ¾îÀÚ] ij¸¯ÅÍ ½ºÅÈ ¸¶¹ý ¹æÈ£ ¼öÄ¡ * {num233} //E = D * ((100 + [¹æ¾îÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¹æÈ£[%]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¸¶¹ý ¹æÈ£ [%]°ª) / 100) // + ( ([¹æ¾îÀÚ]¾ÆÀÌÅÛ ¸¶¹ý ¹æÈ£ ¼öÄ¡[+-]°ª + [¹æ¾îÀÚ]¹öÇÁ¼º ¸¶¹ý ¹æÈ£ ¼öÄ¡[+-]°ª) * {num234} ) float valueD = mExtStatus[i] * num233; float valueE = valueD * (( 100.0f + pItem->mOptPercentMagicCriticalDec + mExtStatusPer[i] ) / 100 ) + ( ( pItem->mOptPlusMagicCriticalDec + mExtStatusPlus[i] ) * num234 ); mExtStatusLast[i] = valueE; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); /// È®ÀåÇ׸ñ¿¡ ¼öÄ¡°¡ Àִ°æ¿ì »öº¯È¯ if( pItem->mOptPercentMagicCriticalDec != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPercentMagicCriticalDec, mExtStatusLast[i] ); if( pItem->mOptPlusMagicCriticalDec != 0 ) SetExtStatusInfoType( (ePLAYER_STATUS_EXT)i, pItem->mOptPlusMagicCriticalDec, mExtStatusLast[i] ); } break; case ePLAYER_STATUS_EXT_HUMAN_ATK: /// Àΰ£Çü °ø°Ý·Â case ePLAYER_STATUS_EXT_ANIMAL_ATK: /// µ¿¹°Çü °ø°Ý·Â case ePLAYER_STATUS_EXT_PLANT_ATK: /// ½Ä¹°Çü °ø°Ý·Â case ePLAYER_STATUS_EXT_BUG_ATK: /// °ïÃæÇü °ø°Ý·Â case ePLAYER_STATUS_EXT_SOUL_ATK: /// Á¤·ÉÇü °ø°Ý·Â case ePLAYER_STATUS_EXT_UNDEAD_ATK: /// ¾ðµ¥µåÇü °ø°Ý·Â case ePLAYER_STATUS_EXT_GIANT_ATK: /// °ÅÀÎÇü °ø°Ý·Â case ePLAYER_STATUS_EXT_DRAGON_ATK: /// ¿ëÇü °ø°Ý·Â case ePLAYER_STATUS_EXT_NORMAL_ATK: /// ÀÏ¹Ý ¸ó½ºÅÍ °ø°Ý·Â case ePLAYER_STATUS_EXT_VETERAN_ATK: /// Á¤¿¹ ¸ó½ºÅÍ °ø°Ý·Â case ePLAYER_STATUS_EXT_ELITE_ATK: /// ¿¤¸®Æ® ¸ó½ºÅÍ °ø°Ý·Â case ePLAYER_STATUS_EXT_BOSS_ATK: /// º¸½º ¸ó½ºÅÍ °ø°Ý·Â break; default: { mExtStatusLast[i] = mExtStatus[i] * ( ( 100.0f + mExtStatusPer[i] ) / 100.0f ) + mExtStatusPlus[i]; if( mExtStatusLast[i] < 0.0f ) mExtStatusLast[i] = 0.0f; HERO->SetStatus2( (ePLAYER_STATUS_EXT)i, mExtStatusLast[i] ); } break; } } /// ÃÖÁ¾ °á°ú¸¦ Ç÷¹À̾ ±â·Ï for( unsigned char i = ePLAYER_STATUS_STR ; i < ePLAYER_STATUS_LEVEL ; ++i ) { HERO->SetStatus1( (ePLAYER_STATUS)i, mBaseStatus[i] ); HERO->SetStatus1Plus( (ePLAYER_STATUS)i, mBaseStatusPlus[i] ); HERO->SetStatus1Per( (ePLAYER_STATUS)i, mBaseStatusPer[i] ); } for( unsigned char i = ePLAYER_STATUS_EXT_ADD_EXPADDPER ; i < ePLAYER_STATUS_EXT_ADD_MAX ; ++i ) { HERO->SetStatusEtc( (ePLAYER_STATUS_EXT_ADD)i, mExtAddStatus[i] ); } } float cStatusCalc_Client::GetStatus2Plus( ePLAYER_STATUS_EXT status2 ) { if( status2 >= ePLAYER_STATUS_EXT_MAX ) { assert(NULL); return 0.0f; } return mExtStatusPlus[status2]; } float cStatusCalc_Client::GetStatus2Per( ePLAYER_STATUS_EXT status2 ) { if( status2 >= ePLAYER_STATUS_EXT_MAX ) { assert(NULL); return 0.0f; } return mExtStatusPer[status2]; }