#include "StdAfx.h" #include "DnFreezingPrisonBlow.h" #include "DnHighLanderBlow.h" #include "DnCantMoveBlow.h" #include "DnCantActionBlow.h" #include "DnFrameStopBlow.h" #include "EtActionBase.h" #include "EtActionSignal.h" #if !defined( USE_BOOST_MEMPOOL ) #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #endif // #if !defined( USE_BOOST_MEMPOOL ) const int FREEZING_PRISON_INTERVAL_TIME = 1000; CDnFreezingPrisonBlow::CDnFreezingPrisonBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ), m_pCantMoveBlow( new CDnCantMoveBlow(hActor, NULL ) ), m_pCantActionBlow( new CDnCantActionBlow(hActor, NULL) ), m_pFrameStopBlow( new CDnFrameStopBlow(hActor, NULL) ), m_IntervalChecker( hActor, GetMySmartPtr() ), m_fIntervalDamage( 0.0f ), m_iDurability( 0 ), m_bDurabilityDestroyed( false ) { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_149; SetValue( szValue ); m_iFinalDamage = 0; m_iOriginalTeam = -1; // ÀÎÀÚ°¡ ÃÑ 3°³ÀÓ. // ³»±¸µµ, Áö¼Ó½Ã°£ ´Ù µÇ¾î Æø¹ß½Ã µ¥¹ÌÁö, ÃÊ´ç µ¥¹ÌÁö string strValue( szValue ); // ½ºÆ®¸µÀ» °ø¹é´ÜÀ§·Î ºÐÇÒÇÑ ÈÄ std::vector vlTokens; TokenizeA( strValue, vlTokens, ";" ); bool bValidArgument = (3 == (int)vlTokens.size()); _ASSERT( bValidArgument && "¾óÀ½ °¨¿Á »óÅÂÈ¿°ú ÀÎÀÚ ¼ÂÆÃÀÌ À߸øµÇ¾ú½À´Ï´Ù." ); if( bValidArgument ) { string strDurability = vlTokens.at( 0 ); string strFinalDamage = vlTokens.at( 1 ); string strIntervalDamage = vlTokens.at( 2 ); m_iDurability = atoi( strDurability.c_str() ); m_iFinalDamage = atoi( strFinalDamage.c_str() ); m_fIntervalDamage = (float)atoi( strIntervalDamage.c_str() ); #ifdef _GAMESERVER AddCallBackType( SB_ONDEFENSEATTACK ); AddCallBackType( SB_ONCALCDAMAGE ); #endif m_pCantActionBlow->SetActionWhenCancelAttack( "Freezing" ); } m_fOrigWight = 0.0f; m_iOrigPressLevel = 0; m_iMaxDurability = m_iDurability; // [2010/12/13 semozz] // »óÅÂÈ¿°ú°¡ »óŸ¦ °¡Áö°í ÀÖ´Â °æ¿ì °è¼Ó À¯Áö¸¦ À§Çؼ­ if (m_pCantMoveBlow) m_pCantMoveBlow->SetPermanent(true); if (m_pCantActionBlow) m_pCantActionBlow->SetPermanent(true); if (m_pFrameStopBlow) m_pFrameStopBlow->SetPermanent(true); } CDnFreezingPrisonBlow::~CDnFreezingPrisonBlow(void) { SAFE_DELETE( m_pCantMoveBlow ); SAFE_DELETE( m_pCantActionBlow ); SAFE_DELETE( m_pFrameStopBlow ); } void CDnFreezingPrisonBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta ) { m_IntervalChecker.OnBegin( LocalTime, FREEZING_PRISON_INTERVAL_TIME ); // ÇൿºÒ°¡, À̵¿ºÒ°¡ if( m_pCantMoveBlow ) m_pCantMoveBlow->OnBegin( LocalTime, fDelta ); if( m_pCantActionBlow ) m_pCantActionBlow->OnBegin( LocalTime, fDelta ); if( m_pFrameStopBlow ) m_pFrameStopBlow->OnBegin( LocalTime, fDelta ); #if defined(PRE_FIX_50482) if (m_hActor && m_hActor->GetChangeTeamRefCount() == 0) { // ÆÀÀ» ÀÌ ½ºÅ³À» ¾´ ¾×ÅÍÀÇ(ÇöÀç´Â ¸ó½ºÅÍ) ÆÀÀ¸·Î ¹Ù²ãÁØ´Ù. m_iOriginalTeam = m_hActor->GetTeam(); //¿ø·¡ ÆÀÀÌ ¾îµð ¿´´ÂÁö ¼³Á¤ ÇØ ³õ´Â´Ù. m_hActor->SetOriginalTeam(m_iOriginalTeam); } m_hActor->AddChangeTeamRefCount(); m_hActor->SetTeam( m_ParentSkillInfo.iSkillUserTeam ); #else // ÆÀÀ» ÀÌ ½ºÅ³À» ¾´ ¾×ÅÍÀÇ(ÇöÀç´Â ¸ó½ºÅÍ) ÆÀÀ¸·Î ¹Ù²ãÁØ´Ù. m_iOriginalTeam = m_hActor->GetTeam(); m_hActor->SetTeam( m_ParentSkillInfo.iSkillUserTeam ); //¿ø·¡ ÆÀÀÌ ¾îµð ¿´´ÂÁö ¼³Á¤ ÇØ ³õ´Â´Ù. m_hActor->SetOriginalTeam(m_iOriginalTeam); #endif // PRE_FIX_50482 #ifndef _GAMESERVER _AttachGraphicEffect(); // óÀ½¿£ idle ¾×¼ÇÀ» ½ÇÇàÇØÁØ´Ù. if( m_hEtcObjectEffect ) m_hEtcObjectEffect->SetActionQueue( "Idle" ); #endif //½ÃÀ۵ɶ§ Weight/PressLevelÀ» ÀúÀåÇØ ³õ´Â´Ù. m_fOrigWight = m_hActor->GetWeight(); m_iOrigPressLevel = m_hActor->GetPressLevel(); //ij¸¯ÅÍ ¹Ð¸²À» ¹æÁö Çϱâ À§ÇØ ¼³Á¤. m_hActor->SetWeight(0.0f); m_hActor->SetPressLevel(-1); #if defined(_GAMESERVER) //StateBlow°¡ ½ÃÀ۵ɶ§ UI Ç¥½Ã m_hActor->CmdFreezingPrisonDurablity(GetBlowID(), 100.0f, true); #endif OutputDebug( "CDnFreezingPrisonBlow::OnBegin\n" ); } #ifdef _GAMESERVER void CDnFreezingPrisonBlow::_RequestDamage( float fDamage ) { #if defined(PRE_FIX_44884) #if defined(PRE_FIX_61382) DnActorHandle hActor = CDnActor::GetOwnerActorHandle(m_hActor); if (hActor && hActor->IsDie() == false) { m_hActor->RequestDamageFromStateBlow(GetMySmartPtr(), (int)fDamage); //#48491 ŸÀ̸ӷΠµ¥¹ÌÁö Àû¿ë½Ã ActorStatIntervlaManipulator¿¡¼­ DieÈ£ÃâÀÌ µÇ°í ÀÖÀ½. //¿©±â¼­´Â DieÈ£ÃâÀÌ ÇÊ¿ä ¾ø´Ù. //if (m_hActor->IsDie()) // m_hActor->Die(m_ParentSkillInfo.hSkillUser); } #else if (m_hActor->IsDie() == false) { m_hActor->RequestDamageFromStateBlow(GetMySmartPtr(), (int)fDamage); //#48491 ŸÀ̸ӷΠµ¥¹ÌÁö Àû¿ë½Ã ActorStatIntervlaManipulator¿¡¼­ DieÈ£ÃâÀÌ µÇ°í ÀÖÀ½. //¿©±â¼­´Â DieÈ£ÃâÀÌ ÇÊ¿ä ¾ø´Ù. //if (m_hActor->IsDie()) // m_hActor->Die(m_ParentSkillInfo.hSkillUser); } #endif // PRE_FIX_61382 #else // ÇÏÀÌ·£´õ »óÅÂÈ¿°ú°¡ ÀÖ´Â °æ¿ì Á×Áö ¾Ê¾Æ¾ß ÇÑ´Ù. float fResultDamage = fDamage; if( m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_143 ) ) { // IsAppliedThisStateBlow() ÇÔ¼ö¿¡¼± true °¡ ¸®ÅϵÇÁö¸¸ Áö¼Ó½Ã°£ÀÌ ´Ù µÈ // »óÅÂÈ¿°ú´Â GatherAppliedStateBlowByBlowIndex() ¿¡¼­ ¾ò¾î¿ÍÁöÁö ¾ÊÀ¸¹Ç·Î ¸®½ºÆ®°¡ ºñ¾îÀÖÀ» ¼ö µµ ÀÖ´Ù. DNVector( DnBlowHandle ) vlhHighLanderBlow; m_hActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_143, vlhHighLanderBlow ); if( 0 < (int)vlhHighLanderBlow.size() ) { CDnHighlanderBlow* pHighlanderBlow = static_cast(vlhHighLanderBlow.front().GetPointer()); fResultDamage += pHighlanderBlow->CalcDamage( fResultDamage ); } } DWORD dwHitterUniqueID = m_ParentSkillInfo.hSkillUser ? m_ParentSkillInfo.hSkillUser->GetUniqueID() : -1; m_hActor->SetHP( m_hActor->GetHP()-(INT64)fResultDamage ); m_hActor->RequestHPMPDelta( m_ParentSkillInfo.eSkillElement, -(INT64)fResultDamage, dwHitterUniqueID ); #endif // PRE_FIX_44884 } #endif bool CDnFreezingPrisonBlow::OnCustomIntervalProcess( void ) { #ifdef _GAMESERVER if( 0.0f < m_fIntervalDamage ) { _RequestDamage( m_fIntervalDamage ); } #else //if( m_hEtcObjectEffect ) //{ // CEtActionBase::ActionElementStruct* pStruct = m_hEtcObjectEffect->GetElement( "Idle" ); // if( pStruct ) // { // m_fEffectLength = (float)pStruct->dwLength / 1000.0f; // } // _SetDiffuse( 0.0f, 1.0f, 0.0f, 1.0f ); // m_bEffecting = true; //} #endif return true; } void CDnFreezingPrisonBlow::Process( LOCAL_TIME LocalTime, float fDelta ) { CDnBlow::Process( LocalTime, fDelta ); m_IntervalChecker.Process( LocalTime, fDelta ); if( m_pCantMoveBlow ) m_pCantMoveBlow->Process( LocalTime, fDelta ); if( m_pCantActionBlow ) m_pCantActionBlow->Process( LocalTime, fDelta ); if( m_pFrameStopBlow ) m_pFrameStopBlow->Process( LocalTime, fDelta ); } void CDnFreezingPrisonBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { #ifndef _GAMESERVER //_SetDiffuse( 1.0f, 1.0f, 1.0f, 1.0f ); // ÀÌÆåÆ® »èÁ¦. ÀÌ¹Ì »ç¶óÁ³´ÙÇØµµ ±¦Âú´Ù. //_DetachGraphicEffect(); #endif if( m_pCantMoveBlow ) m_pCantMoveBlow->OnEnd( LocalTime, fDelta ); if( m_pCantActionBlow ) m_pCantActionBlow->OnEnd( LocalTime, fDelta ); if( m_pFrameStopBlow ) m_pFrameStopBlow->OnEnd( LocalTime, fDelta ); // ÀÌ·¸°Ô ÇØ¾ß °ð¹Ù·Î °æÁ÷ÀÌ Ç®¸°´Ù. m_hActor->SetStiffDelta( 0.001f ); #ifdef _GAMESERVER // Áö¼Ó½Ã°£ ´Ù µÇ¾î Á¾·áµÇ´Â °ÍÀ̶ó¸é ÁöÁ¤µÈ µ¥¹ÌÁö¸¦ ÁØ´Ù. if( false == m_bDurabilityDestroyed ) { _RequestDamage( (float)m_iFinalDamage ); //#48491¿¡¼­ ŸÀ̸ӷΠµ¥¹ÌÁö Àû¿ë½Ã ActorStatIntervlaManipulator¿¡¼­ DieÈ£ÃâÀÌ µÇ°í ÀÖÁö¸¸ OnEnd¿¡¼­´Â Dieó¸® ÇØ¾ßÇÔ. #if defined(PRE_FIX_61382) DnActorHandle hActor = CDnActor::GetOwnerActorHandle(m_hActor); if (hActor && hActor->IsDie()) hActor->Die(m_ParentSkillInfo.hSkillUser); #else if (m_hActor->IsDie()) m_hActor->Die(m_ParentSkillInfo.hSkillUser); #endif // PRE_FIX_61382 } #else if (m_hActor->IsDie()) { // ij¸¯ÅͰ¡ Á×¾ú´Ù¸é ÀÚ¿¬½º·´°Ô Effect »ç¶óÁöµµ·Ï.. if( m_hEtcObjectEffect ) m_hEtcObjectEffect->SetActionQueue( "Summon_Off" ); OutputDebug("SetActionQueue ---> Summon_Off\n"); } else { // Ŭ¶óÀÌ¾ðÆ®¿¡¼­´Â Áö¼Ó½Ã°£ÀÌ ³²¾ÆÀִµ¥ ¼­¹ö¿¡¼­ »èÁ¦Ç϶ó°í Áö¼Ó½Ã°£ÀÌ ³¡³ª±â Àü¿¡ ÆÐŶÀÌ ¿Â °æ¿ì // ³»±¸µµ°¡ ´Ù ´â¾Æ ¾ø¾îÁø °Å°í Áö¼Ó ½Ã°£ ´Ù µÇ¾î ³¡³ª´Â °ÍÀº Æø¹ßÇÏ´Â °ÍÀ̹ǷΠ¾×¼ÇÀ» ´Ù¸£°Ô º¸¿©ÁØ´Ù. if( IsEnd() ) { // ÀÌÆåÆ® °´Ã¼¿¡ Æø¹ß ¾×¼Ç ½ÇÇà. if( m_hEtcObjectEffect ) m_hEtcObjectEffect->SetActionQueue( "Attack" ); OutputDebug("SetActionQueue ---> Attack\n"); } else { // ÀÌÆåÆ® °´Ã¼ÀÇ ³»±¸µµ°¡ ´Ù µÇ¾î »ç¶óÁö´Â ¾×¼Ç ½ÇÇà. if( m_hEtcObjectEffect ) m_hEtcObjectEffect->SetActionQueue( "Break" ); OutputDebug("SetActionQueue ---> Break\n"); } } // ±úÁö´Â ¾×¼Ç ½ÇÇàµÉ ¶§´Â ¸µÅ© ²÷¾îÁÜ TSmartPtrSignalImp::SmartPtrSignalImpStruct *pStruct = (TSmartPtrSignalImp::SmartPtrSignalImpStruct *)m_hActor->TSmartPtrSignalImp::GetStruct( STATEBLOWEFFECT_ETCOFFSET + m_StateBlow.emBlowIndex, GetBlowID() ); if( pStruct ) pStruct->bLinkObject = false; // È¿°ú »èÁ¦... ½ÇÁ¦·Î ÀÌÆåÆ®¸¦ ¾ø¾Ö´Â °Ç ¾Æ´Ï°í, ÀÌÆåÆ® ÀÚü´Â destroy ½Ã±×³Î·Î ¾Ë¾Æ¼­ Á״´Ù. // ÇÏÁö¸¸ »óÅÂÈ¿°ú´Â ÀÌ ½ÃÁ¡¿¡¼­ ³¡À̹ǷΠÀÌÆåÆ®¸¦ Ãß°¡ÇÒ ¶§ ÆÇ´Ü ±Ù°Å°¡ µÇ´Â ½ºÅ³ Á¤º¸¸¦ ¿©±â¼­ Áö¿öÁà¾ß ÇÑ´Ù. // ±×·¸Áö ¾ÊÀ¸¸é ½ºÅ³ Á¤º¸ °è¼Ó ³²¾ÆÀ־ ÀÌÆåÆ®°¡ Ãß°¡°¡ ¾ÈµÊ. m_hActor->DetachSEEffectSkillInfo( m_ParentSkillInfo ); #endif m_IntervalChecker.OnEnd( LocalTime, fDelta ); //»óŰ¡ ³¡³¯¶§ ±âÁ¸¿¡ ÀúÀåÇØ³õÀº °ªÀ¸·Î º¹¿ø m_hActor->SetWeight(m_fOrigWight); m_hActor->SetPressLevel(m_iOrigPressLevel); #if defined(_GAMESERVER) //StateBlow°¡ ³¡³¯¶§ UI¸¦ ¾ø¾Ö¾ßÇÔ. m_hActor->CmdFreezingPrisonDurablity(GetBlowID(), 0.0f, false); #endif #if defined(PRE_FIX_50482) if (m_hActor && m_hActor->GetChangeTeamRefCount() == 1) { m_hActor->SetTeam(m_iOriginalTeam); } m_hActor->RemoveChangeTeamRefCount(); #else // ÆÀÀ» ÀÌ ½ºÅ³À» ¾´ ¾×ÅÍÀÇ(ÇöÀç´Â ¸ó½ºÅÍ) ÆÀÀ¸·Î ¹Ù²ãÁØ´Ù. m_hActor->SetTeam( m_iOriginalTeam ); #endif // PRE_FIX_50482 OutputDebug( "CDnFreezingPrisonBlow::OnEnd\n" ); } #if !defined(_GAMESERVER) void CDnFreezingPrisonBlow::OnHit() { if (m_hEtcObjectEffect) m_hEtcObjectEffect->SetActionQueue( "Hit" ); } //Guage¾×¼Ç¿¡¼­ Action½Ã±×³Î Á¤º¸¸¦ ¾ò¾î OffsetÁ¤º¸¸¦ È®ÀÎÇÑ´Ù. EtVector3 CDnFreezingPrisonBlow::GetGaugePos() { // m_hEtcObjectEffect°¡ À¯È¿ÇÏÁö ¾ÊÀ» ¼ö ÀÖ´Ù. [2010/12/15 semozz] EtVector3 vPos = EtVector3(0.0f, 0.0f, 0.0f); if (m_hEtcObjectEffect) { vPos = *m_hEtcObjectEffect->GetPosition(); //¿©±â¿¡´Â Hit Signal¸¸ ÀÖ¾î¾ß ÇÑ´Ù.. CEtActionBase::ActionElementStruct* pActionElement = m_hEtcObjectEffect->GetElement("Gauge"); if (pActionElement) { if (pActionElement->pVecSignalList.size() != 1) { OutputDebug("Gauge Á¤º¸¿¡ Hit SignalÀÌ Á¸Àç ÇÏÁö ¾ÊÀ½.. !!!\n"); } else { CEtActionSignal *pSignal = pActionElement->pVecSignalList[0]; HitStruct *pStruct = pSignal ? (HitStruct *)pSignal->GetData() : NULL; if (pStruct) vPos += *pStruct->vOffset; } } } return vPos; } #endif #ifdef _GAMESERVER bool CDnFreezingPrisonBlow::OnDefenseAttack( DnActorHandle hHitter, CDnState* pAttackerState, CDnDamageBase::SHitParam &HitParam, bool bHitSuccess ) { // Çǰݽà °øÁß¿¡ ¶ßÁö ¸øÇÏ´Â ÇÏ´Â ¼³Á¤?À» À§ÇØ HitParam.vResistance = EtVector3( 0.0f, 0.0f, 0.0f ); HitParam.vVelocity = EtVector3( 0.0f, 0.0f, 0.0f ); HitParam.vViewVec = *(m_hActor->GetLookDir()); return false; } float CDnFreezingPrisonBlow::OnCalcDamage( float fOriginalDamage, CDnDamageBase::SHitParam& HitParam ) { // È÷Æ® ½Ã±×³Î¿¡ ±â·ÏµÈ ³»±¸µµ ±ï´Â Á¤º¸¸¦ ±×´ë·Î »ç¿ë. m_iDurability -= (int)(HitParam.fDurability * 100.0f); //³»±¸µµ°¡ ¶³¾îÁú¶§ ¸¶´Ù ÇÇ°Ý ÀÌÆåÆ® Ç¥½Ã & ³»±¸µµ °ÔÀÌÁö °»½Å float fCurrentValue = min((float)m_iMaxDurability, max(0.0f, (float)m_iDurability)); float fRate = m_iMaxDurability != 0 ? (fCurrentValue / (float)m_iMaxDurability) : 0.0f; // ¿©±â¼­ false·Î º¸³» ÁÖ¸é UI°¡ ¸ÕÀú »ç¶óÁö°í ÀÌÆåÆ®´Â OnEnd¿¡¼­ »ç¶óÁ® // µ¿±âÈ­¿¡ ¹®Á¦°¡ ÀÖÀ½. ±×·¡¼­ ¿©±â¿¡¼­´Â bShowGauge°ªÀ» Ç×»ó true·Î¸¸ º¸³½´Ù. // OnEnd¿¡¼­ UI »ç¶óÁö°Ô ÇÏ´Â ÇÔ¼ö È£Ãâ.. bool bShowGauge = true;//fRate > 0.0f; m_hActor->CmdFreezingPrisonDurablity(GetBlowID(), fRate, bShowGauge); //³»±¸µµ 0 ÀÌÇÏÀ̸é if( m_iDurability <= 0 ) { // ³»±¸µµ ´Ù µÇ¾î ºÎ¼­Á³À¸¹Ç·Î ¾Æ¹« ÀÏ ¾øÀÌ »óÅÂÈ¿°ú Á¾·á ½ÃŲ´Ù. m_bDurabilityDestroyed = true; // CDnStateBlow::Process() ÇÔ¼ö°¡ Á¾·áµÇ¸é °ð¹Ù·Î ¿©±â¼­ ¿¹¾à °É¾î³ù´ø »óÅÂÈ¿°úµéÀÌ Á¦°ÅµÈ´Ù. // Ŭ¶óÂÊ¿¡µµ ÆÐŶÀ¸·Î º¸³»ÁÜ. m_hActor->AddReserveRemoveBlow( GetMySmartPtr() ); OutputDebug( "CDnFreezingBlow::OnCalcDamage - Freezing Broken by Attack!\n" ); } return -fOriginalDamage; } #endif #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) void CDnFreezingPrisonBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; //ÆÄ½Ì¿¡ ÇÊ¿äÇÑ º¯¼ö ¼±¾ð std::vector vlTokens[2]; string strArgument[2]; //ÇÊ¿äÇÑ °ª º¯¼ö int iDurability[2] = {0, }; int iFinalDamage[2] = {0, }; float fIntervalDamage[2] = {0.0f, }; ////////////////////////////////////////////////////////////////////////// //ù¹øÂ° ¹®ÀÚ¿­ ÆÄ½Ì. strArgument[0] = szOrigValue; TokenizeA( strArgument[0], vlTokens[0], ";" ); if( vlTokens[0].size() == 3 ) { iDurability[0] = atoi( vlTokens[0][0].c_str() ); iFinalDamage[0] = atoi( vlTokens[0][1].c_str() ); fIntervalDamage[0] = (float)atof( vlTokens[0][2].c_str() ); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //µÎ¹øÂ° ¹®ÀÚ¿­ ÆÄ½Ì strArgument[1] = szAddValue; TokenizeA( strArgument[1], vlTokens[1], ";" ); if( vlTokens[1].size() == 3 ) { iDurability[1] = atoi( vlTokens[1][0].c_str() ); iFinalDamage[1] = atoi( vlTokens[1][1].c_str() ); fIntervalDamage[1] = (float)atof( vlTokens[1][2].c_str() ); } ////////////////////////////////////////////////////////////////////////// //µÎ °ªÀ» ´õÇÑ´Ù. int iResultDurability = iDurability[0] + iDurability[1]; int iResultFinalDamage = iFinalDamage[0] + iFinalDamage[1]; float fResultIntervalDamage = fIntervalDamage[0] + fIntervalDamage[1]; sprintf_s(szBuff, "%d;%d;%f", iResultDurability, iResultFinalDamage, fResultIntervalDamage); szNewValue = szBuff; } void CDnFreezingPrisonBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; //ÆÄ½Ì¿¡ ÇÊ¿äÇÑ º¯¼ö ¼±¾ð std::vector vlTokens[2]; string strArgument[2]; //ÇÊ¿äÇÑ °ª º¯¼ö int iDurability[2] = {0, }; int iFinalDamage[2] = {0, }; float fIntervalDamage[2] = {0.0f, }; ////////////////////////////////////////////////////////////////////////// //ù¹øÂ° ¹®ÀÚ¿­ ÆÄ½Ì. strArgument[0] = szOrigValue; TokenizeA( strArgument[0], vlTokens[0], ";" ); if( vlTokens[0].size() == 3 ) { iDurability[0] = atoi( vlTokens[0][0].c_str() ); iFinalDamage[0] = atoi( vlTokens[0][1].c_str() ); fIntervalDamage[0] = (float)atof( vlTokens[0][2].c_str() ); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //µÎ¹øÂ° ¹®ÀÚ¿­ ÆÄ½Ì strArgument[1] = szAddValue; TokenizeA( strArgument[1], vlTokens[1], ";" ); if( vlTokens[1].size() == 3 ) { iDurability[1] = atoi( vlTokens[1][0].c_str() ); iFinalDamage[1] = atoi( vlTokens[1][1].c_str() ); fIntervalDamage[1] = (float)atof( vlTokens[1][2].c_str() ); } ////////////////////////////////////////////////////////////////////////// //µÎ °ªÀ» ´õÇÑ´Ù. int iResultDurability = iDurability[0] - iDurability[1]; int iResultFinalDamage = iFinalDamage[0] - iFinalDamage[1]; float fResultIntervalDamage = fIntervalDamage[0] - fIntervalDamage[1]; sprintf_s(szBuff, "%d;%d;%f", iResultDurability, iResultFinalDamage, fResultIntervalDamage); szNewValue = szBuff; } #endif // PRE_ADD_PREFIX_SYSTE_RENEW