#include "Stdafx.h" #include "DnBasicStateBaseAddState.h" CDnBasicStateBaseAddState::CDnBasicStateBaseAddState( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ) { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_271; SetValue( szValue ); } CDnBasicStateBaseAddState::~CDnBasicStateBaseAddState(void) { SAFE_DELETE_PVEC( m_vecBasicBlow ); } void CDnBasicStateBaseAddState::OnBegin( LOCAL_TIME LocalTime, float fDelta ) { std::string str = m_StateBlow.szValue; std::vector tokens; TokenizeA( str, tokens, ";" ); for( DWORD itr = 0; itr < tokens.size(); ++itr ) { int nStateType = atoi( tokens[itr].c_str() ); ++itr; if( itr < tokens.size() ) { float fStateValue = (float)atof( tokens[itr].c_str() ); AddState( nStateType, fStateValue, LocalTime, fDelta ); } } __super::OnBegin( LocalTime, fDelta ); } void CDnBasicStateBaseAddState::Process( LOCAL_TIME LocalTime, float fDelta ) { __super::Process( LocalTime, fDelta ); } void CDnBasicStateBaseAddState::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { for( DWORD itr = 0; itr < m_vecBasicBlow.size(); ++itr ) { if( NULL == m_vecBasicBlow[itr] ) continue; m_vecBasicBlow[itr]->OnEnd( LocalTime, fDelta ); } __super::OnEnd( LocalTime, fDelta ); } // nStateType이 중간에 바뀌는 이유는 테이블에서는 비율로 값을 넣었지만 // 실제 적용 되는것은 기본 스탯의 비율을 곱한값을 절대 값으로 넣는다. // 그래서 절대 값이 필요한 경우 절대값 상태효과로 바꿔준다. void CDnBasicStateBaseAddState::AddState( int nStateType, const float fStateValue, LOCAL_TIME LocalTime, float fDelta ) { CDnState * pBaseState = const_cast(m_hActor->GetBaseState()); if( NULL == pBaseState ) return; char buff[64] = {0,}; switch( nStateType ) { case STATE_BLOW::BLOW_058: { INT64 nMaxHP = (INT64)(pBaseState->GetMaxHP() * fStateValue); sprintf_s( buff, "%I64d", nMaxHP ); nStateType = STATE_BLOW::BLOW_009; AddBasicBlow( nStateType, buff, LocalTime, fDelta ); #ifdef _GAMESERVER m_hActor->SetHP(m_hActor->GetMaxHP()); m_hActor->RequestHPMPDelta( CDnState::ElementEnum_Amount, m_hActor->GetMaxHP(), m_hActor->GetUniqueID() , false , false ); #endif } return; case STATE_BLOW::BLOW_002: { int nAttackP = (int)( pBaseState->GetAttackPMin() + pBaseState->GetAttackPMax() ) / 2; nAttackP = (int)(nAttackP * fStateValue); sprintf_s( buff, "%d", nAttackP ); nStateType = STATE_BLOW::BLOW_001; } break; case STATE_BLOW::BLOW_029: { int nAttackM = (int)( pBaseState->GetAttackMMin() + pBaseState->GetAttackMMax() ) / 2; nAttackM = (int)(nAttackM * fStateValue); sprintf_s( buff, "%d", nAttackM ); nStateType = STATE_BLOW::BLOW_028; } break; case STATE_BLOW::BLOW_004: { int nDefenseP = (int)(pBaseState->GetDefenseP() * fStateValue); sprintf_s( buff, "%d", nDefenseP ); nStateType = STATE_BLOW::BLOW_003; } break; case STATE_BLOW::BLOW_094: { int nDefenseM = (int)(pBaseState->GetDefenseM() * fStateValue); sprintf_s( buff, "%d", nDefenseM ); nStateType = STATE_BLOW::BLOW_093; } break; case STATE_BLOW::BLOW_061: { int nSuperAmmor = (int)(pBaseState->GetSuperAmmor() * fStateValue); sprintf_s( buff, "%d", nSuperAmmor ); } break; default: return; } AddBasicBlow( nStateType, buff, LocalTime, fDelta ); } void CDnBasicStateBaseAddState::AddBasicBlow( const int nStateType, char * buff, LOCAL_TIME LocalTime, float fDelta ) { CDnBasicBlow * pBasicBlow = new CDnBasicBlow( m_hActor, buff ); pBasicBlow->SetBlow( (STATE_BLOW::emBLOW_INDEX)nStateType ); pBasicBlow->SetParentSkillInfo( &m_ParentSkillInfo ); pBasicBlow->SetDurationTime( m_StateBlow.fDurationTime ); pBasicBlow->OnBegin(LocalTime, fDelta); m_vecBasicBlow.push_back( pBasicBlow ); }