695 lines
19 KiB
C++
695 lines
19 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#include "DnPoisonBlow.h"
|
|||
|
|
#include "DnDamageBase.h"
|
|||
|
|
#include "DnActionBase.h"
|
|||
|
|
#ifndef _GAMESERVER
|
|||
|
|
#include "DnPlayerActor.h"
|
|||
|
|
#else
|
|||
|
|
#include "DnHighLanderBlow.h"
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifdef _DEBUG
|
|||
|
|
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
const LOCAL_TIME POISON_DAMAGE_INTERVAL = 2000;
|
|||
|
|
const int DEFAULT_POISON_DAMAGE_PROB = 1000; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * 10 <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
#if defined(_GAMESERVER)
|
|||
|
|
extern int GetGaussianRandom( int nMin, int nMax, CMultiRoom *pRoom );
|
|||
|
|
#endif // _GAMESERVER
|
|||
|
|
|
|||
|
|
CDnPoisonBlow::CDnPoisonBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ),
|
|||
|
|
m_IntervalChecker( hActor, GetMySmartPtr() ),
|
|||
|
|
m_fEffectLength( 0.0f )
|
|||
|
|
,m_bEffecting(false)
|
|||
|
|
#ifdef _GAMESERVER
|
|||
|
|
, m_fIntervalDamage( 0.0f )
|
|||
|
|
#endif
|
|||
|
|
{
|
|||
|
|
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_044;
|
|||
|
|
SetValue( szValue );
|
|||
|
|
|
|||
|
|
m_fDamageProb = 0.0f;
|
|||
|
|
|
|||
|
|
#if defined(PRE_FIX_53266)
|
|||
|
|
m_fAddDamageValue = 0.0f;
|
|||
|
|
|
|||
|
|
std::string str = szValue;//"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȯ<EFBFBD><C8AE>;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;<3B>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", <20>Ǵ<EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
|||
|
|
std::vector<std::string> tokens;
|
|||
|
|
std::string delimiters = ";";
|
|||
|
|
|
|||
|
|
//1. <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
TokenizeA(str, tokens, delimiters);
|
|||
|
|
|
|||
|
|
int nTokenSize = (int)tokens.size();
|
|||
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 1<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20>ݿ<EFBFBD>?
|
|||
|
|
if (1 == nTokenSize)
|
|||
|
|
{
|
|||
|
|
m_fValue = (float)atof( tokens[0].c_str() );
|
|||
|
|
m_fDamageProb = -1.0f;
|
|||
|
|
}
|
|||
|
|
else if (nTokenSize >= 2)
|
|||
|
|
{
|
|||
|
|
m_fValue = (float)atof(tokens[0].c_str());
|
|||
|
|
m_fDamageProb = (float)atof(tokens[1].c_str());
|
|||
|
|
|
|||
|
|
if (nTokenSize >= 3)
|
|||
|
|
m_fAddDamageValue = (float)atof(tokens[2].c_str());
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OutputDebug("%s Invalid Value %s\n", __FUNCTION__, szValue);
|
|||
|
|
}
|
|||
|
|
#else
|
|||
|
|
string strValue(szValue);
|
|||
|
|
int iSemiColonIndex = (int)strValue.find_first_of( ';', 0 );
|
|||
|
|
bool bDamageProbMode = (string::npos != iSemiColonIndex);
|
|||
|
|
if( bDamageProbMode )
|
|||
|
|
{
|
|||
|
|
string strProb = strValue.substr( 0, iSemiColonIndex );
|
|||
|
|
string strDamageProb = strValue.substr( iSemiColonIndex+1, strValue.length() );
|
|||
|
|
|
|||
|
|
// Ȯ<><C8AE>
|
|||
|
|
m_fValue = (float)atof( strProb.c_str() );
|
|||
|
|
m_fDamageProb = (float)atof( strDamageProb.c_str() );
|
|||
|
|
|
|||
|
|
#ifdef _GAMESERVER
|
|||
|
|
_ASSERT( 0.0f <= m_fDamageProb/* && m_fDamageProb <= 1.0f*/ );
|
|||
|
|
#if defined(PRE_ADD_SKILLBUF_RENEW)
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.(OnSetParentSkillInfo)
|
|||
|
|
//m_fIntervalDamage = CalcIntervalDamage(CDnState::Dark);
|
|||
|
|
#else
|
|||
|
|
m_fIntervalDamage = m_hActor->GetLastDamage() * m_fDamageProb;
|
|||
|
|
#endif // PRE_ADD_SKILLBUF_RENEW
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
m_fValue = (float)atof( szValue );
|
|||
|
|
m_fDamageProb = -1.0f;
|
|||
|
|
}
|
|||
|
|
#endif // PRE_FIX_53266
|
|||
|
|
|
|||
|
|
#ifndef _GAMESERVER
|
|||
|
|
UseTableDefinedGraphicEffect( false );
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CDnPoisonBlow::~CDnPoisonBlow(void)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#ifdef _GAMESERVER
|
|||
|
|
bool CDnPoisonBlow::CanBegin( void )
|
|||
|
|
{
|
|||
|
|
bool bResult = true;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
if( -1.0f == m_fDamageProb )
|
|||
|
|
return true;
|
|||
|
|
|
|||
|
|
// Poison <20><><EFBFBD><EFBFBD> üũ.
|
|||
|
|
DNTableFileFormat* pSox = NULL;
|
|||
|
|
int iClassID = m_hActor->GetClassID();
|
|||
|
|
int nWeightItemID = 0;
|
|||
|
|
float fWeight = 0.0f;
|
|||
|
|
|
|||
|
|
// <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD>.
|
|||
|
|
bool bPlayer = false;
|
|||
|
|
if( m_hActor->GetActorType() <= CDnActor::Reserved6 )
|
|||
|
|
bPlayer = true;
|
|||
|
|
|
|||
|
|
if( bPlayer )
|
|||
|
|
{
|
|||
|
|
fWeight = CPlayerWeightTable::GetInstance().GetValue( iClassID, CPlayerWeightTable::ElementDefense );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <<3C>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD> poison ȸ<><C8B8>Ȯ<EFBFBD><C8AE>> = <dark <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD> x PlayerWeightTable<6C><65> <20>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD>>
|
|||
|
|
// <20>ǰݴ<C7B0><DDB4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD> Ȯ<><C8AE> = <<3C><>ų<EFBFBD><C5B3> poison Ȯ<><C8AE>> - <<3C>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD> poison ȸ<><C8B8>Ȯ<EFBFBD><C8AE>>
|
|||
|
|
float fAvoidProb = 1.0f - (m_fValue - (m_hActor->GetElementDefense( CDnState::Dark ) * fWeight));
|
|||
|
|
if( _rand(GetRoom()) % 10000 <= int(fAvoidProb * 10000.0f) )
|
|||
|
|
{
|
|||
|
|
// ȣ<><C8A3><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> CanBegin ȣ<><C8A3><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD>н<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
//SetState( STATE_BLOW::STATE_END );
|
|||
|
|
OutputDebug( "CDnPoisonBlow::CanAdd - Poison Fail\n" );
|
|||
|
|
bResult = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return bResult;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CDnPoisonBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
|
|||
|
|
{
|
|||
|
|
#ifdef _GAMESERVER
|
|||
|
|
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ΰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>.
|
|||
|
|
if( -1.0f == m_fDamageProb )
|
|||
|
|
{
|
|||
|
|
if( m_ParentSkillInfo.hSkillUser )
|
|||
|
|
{
|
|||
|
|
CDnDamageBase::SHitParam HitParam;
|
|||
|
|
HitParam.cAttackType = 1; // <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
HitParam.HasElement = CDnState::Dark;
|
|||
|
|
m_fIntervalDamage = m_hActor->PreCalcDamage( m_ParentSkillInfo.hSkillUser.GetPointer(), HitParam, 1.0f, m_fValue );
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><EFBFBD><EEBFA1><EFBFBD><EFBFBD> SkillUser <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵǾ<C8B5><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD><DAB0><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
|||
|
|
m_fIntervalDamage = m_fValue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>ּ<EFBFBD><D6BC><EFBFBD> dot <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
if( m_fIntervalDamage < 1.0f )
|
|||
|
|
{
|
|||
|
|
//SetState( STATE_BLOW::STATE_END );
|
|||
|
|
//OutputDebug( "CDnPoisonBlow::CanAdd - Damage is too small. ( < 1) Poison Fail\n" );
|
|||
|
|
m_fIntervalDamage = 1.0f;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
m_IntervalChecker.OnBegin( LocalTime, POISON_DAMAGE_INTERVAL );
|
|||
|
|
|
|||
|
|
m_fEffectLength = 0.0f;
|
|||
|
|
m_bEffecting = false;
|
|||
|
|
|
|||
|
|
OutputDebug( "CDnPoisonBlow::OnBegin, Value:%2.2f (HP : %d ) \n", m_fValue, m_hActor->GetHP());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//bool CDnPoisonBlow::OnCheckIntervalProb( void )
|
|||
|
|
//{
|
|||
|
|
// bool bSuccess = false;
|
|||
|
|
//
|
|||
|
|
// int iDamageProbability = DEFAULT_POISON_DAMAGE_PROB - m_hActor->GetElementDefense( CDnState::Dark ) * 3;
|
|||
|
|
//
|
|||
|
|
// if( iDamageProbability < 0 )
|
|||
|
|
// iDamageProbability = 0;
|
|||
|
|
// else
|
|||
|
|
// if( iDamageProbability > 1000 )
|
|||
|
|
// iDamageProbability = 1000;
|
|||
|
|
//
|
|||
|
|
// bSuccess = (_rand(GetRoom()) % 1000 < iDamageProbability);
|
|||
|
|
//
|
|||
|
|
// return bSuccess;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CDnPoisonBlow::OnCustomIntervalProcess( void )
|
|||
|
|
{
|
|||
|
|
//OutputDebug( "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> : OnCustomInvterval Called id: %d\n", m_hActor->GetUniqueID() );
|
|||
|
|
|
|||
|
|
#ifdef _GAMESERVER
|
|||
|
|
if( 0.0f < m_fIntervalDamage )
|
|||
|
|
{
|
|||
|
|
#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)m_fIntervalDamage);
|
|||
|
|
|
|||
|
|
//#48491 Ÿ<≯ӷ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ActorStatIntervlaManipulator<6F><72><EFBFBD><EFBFBD> Dieȣ<65><C8A3><EFBFBD><EFBFBD> <20>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
//<2F><><EFBFBD>⼭<EFBFBD><E2BCAD> Dieȣ<65><C8A3><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
//if (m_hActor->IsDie())
|
|||
|
|
// m_hActor->Die(m_ParentSkillInfo.hSkillUser);
|
|||
|
|
}
|
|||
|
|
#else
|
|||
|
|
if (m_hActor->IsDie() == false)
|
|||
|
|
{
|
|||
|
|
m_hActor->RequestDamageFromStateBlow(GetMySmartPtr(), (int)m_fIntervalDamage);
|
|||
|
|
|
|||
|
|
//#48491 Ÿ<≯ӷ<CCB8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ActorStatIntervlaManipulator<6F><72><EFBFBD><EFBFBD> Dieȣ<65><C8A3><EFBFBD><EFBFBD> <20>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
//<2F><><EFBFBD>⼭<EFBFBD><E2BCAD> Dieȣ<65><C8A3><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
//if (m_hActor->IsDie())
|
|||
|
|
// m_hActor->Die(m_ParentSkillInfo.hSkillUser);
|
|||
|
|
}
|
|||
|
|
#endif // PRE_FIX_61382
|
|||
|
|
#else
|
|||
|
|
// <20><><EFBFBD>̷<EFBFBD><CCB7><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾƾ<CABE> <20>Ѵ<EFBFBD>.
|
|||
|
|
float fDamage = m_fIntervalDamage;
|
|||
|
|
if( m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_143 ) )
|
|||
|
|
{
|
|||
|
|
// IsAppliedThisStateBlow() <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> true <20><> <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><> <20><>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> GatherAppliedStateBlowByBlowIndex() <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD>.
|
|||
|
|
DNVector( DnBlowHandle ) vlhHighLanderBlow;
|
|||
|
|
m_hActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_143, vlhHighLanderBlow );
|
|||
|
|
if( 0 < (int)vlhHighLanderBlow.size() )
|
|||
|
|
{
|
|||
|
|
CDnHighlanderBlow* pHighlanderBlow = static_cast<CDnHighlanderBlow*>(vlhHighLanderBlow.front().GetPointer());
|
|||
|
|
fDamage += pHighlanderBlow->CalcDamage( fDamage );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DWORD dwHitterUniqueID = m_ParentSkillInfo.hSkillUser ? m_ParentSkillInfo.hSkillUser->GetUniqueID() : -1;
|
|||
|
|
m_hActor->SetHP( m_hActor->GetHP()-(INT64)fDamage );
|
|||
|
|
m_hActor->RequestHPMPDelta( m_ParentSkillInfo.eSkillElement, -(INT64)fDamage, dwHitterUniqueID );
|
|||
|
|
#endif // PRE_FIX_44884
|
|||
|
|
}
|
|||
|
|
#else
|
|||
|
|
//DnEtcHandle hEffectHandle = m_hActor->AttachSEEffect( m_ParentSkillInfo, m_StateBlow.emBlowIndex, GetBlowID(), NULL, NULL, "Poisoning.act" );
|
|||
|
|
_AttachGraphicEffect();
|
|||
|
|
if( m_hEtcObjectEffect )
|
|||
|
|
{
|
|||
|
|
//OutputDebug( "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. id: %d\n", m_hActor->GetUniqueID() );
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//#ifndef _GAMESERVER
|
|||
|
|
//void CDnPoisonBlow::_SetDiffuse( fl00000000oat fRed, float fGreen, float fBlue, float fAlpha )
|
|||
|
|
//{
|
|||
|
|
// EtAniObjectHandle hAniObject = m_hActor->GetObjectHandle();
|
|||
|
|
// int iCustomParamIndex = hAniObject->AddCustomParam( "g_MaterialDiffuse", EPT_VECTOR );
|
|||
|
|
// EtColor Color( fRed, fGreen, fBlue, fAlpha );
|
|||
|
|
//
|
|||
|
|
// if( -1 != iCustomParamIndex )
|
|||
|
|
// {
|
|||
|
|
// hAniObject->SetCustomParam( iCustomParamIndex, EPT_VECTOR, &Color );
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// // TODO: <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>..
|
|||
|
|
// // <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// CDnPlayerActor* pPlayerActor = dynamic_cast<CDnPlayerActor*>(m_hActor.GetPointer());
|
|||
|
|
// if( pPlayerActor )
|
|||
|
|
// {
|
|||
|
|
// for( int iPart = (int)CDnParts::Face; iPart < CDnParts::PartsTypeEnum_Amount; ++iPart )
|
|||
|
|
// {
|
|||
|
|
// DnPartsHandle hBodyParts = pPlayerActor->GetParts( (CDnParts::PartsTypeEnum)iPart );
|
|||
|
|
// if( hBodyParts )
|
|||
|
|
// {
|
|||
|
|
// EtAniObjectHandle hBodyObject = hBodyParts->GetObjectHandle();
|
|||
|
|
// int iCustomParam = hBodyObject->AddCustomParam( "g_MaterialDiffuse", EPT_VECTOR );
|
|||
|
|
//
|
|||
|
|
// hBodyObject->SetCustomParam( iCustomParam, EPT_VECTOR, &Color );
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
//
|
|||
|
|
//}
|
|||
|
|
//#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CDnPoisonBlow::Process( LOCAL_TIME LocalTime, float fDelta )
|
|||
|
|
{
|
|||
|
|
CDnBlow::Process( LocalTime, fDelta );
|
|||
|
|
|
|||
|
|
m_IntervalChecker.Process( LocalTime, fDelta );
|
|||
|
|
|
|||
|
|
#ifndef _GAMESERVER
|
|||
|
|
if( m_bEffecting )
|
|||
|
|
{
|
|||
|
|
m_fEffectLength -= fDelta;
|
|||
|
|
if( m_fEffectLength < 0.0f )
|
|||
|
|
{
|
|||
|
|
m_fEffectLength = 0.0f;
|
|||
|
|
_SetDiffuse( 1.0f, 1.0f, 1.0f, 1.0f );
|
|||
|
|
|
|||
|
|
m_bEffecting = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
//LOCAL_TIME ElapsedTime = LocalTime - m_StartTime;
|
|||
|
|
//int iDamageCount = int(ElapsedTime / POISON_DAMAGE_INTERVAL);
|
|||
|
|
//while( m_iDamageCount < iDamageCount )
|
|||
|
|
//{
|
|||
|
|
// if( )
|
|||
|
|
// {
|
|||
|
|
// CDnDamageBase::SHitParam HitParam;
|
|||
|
|
// HitParam.vPosition = *m_hActor->GetPosition();
|
|||
|
|
// HitParam.vViewVec = *m_hActor->GetLookDir();
|
|||
|
|
// HitParam.fDamage = m_fValue;
|
|||
|
|
// m_hActor->OnDamage( m_hActor.GetPointer(), HitParam );
|
|||
|
|
|
|||
|
|
// //m_hActor->SetHP( m_hActor->GetHP() - (INT64)m_fValue );
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// m_LastDamageCheckTime = LocalTime;
|
|||
|
|
|
|||
|
|
// ++m_iDamageCount;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
// TODO: <20><> 2<>ʸ<EFBFBD><CAB8><EFBFBD> <20><>ũ <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// <20><>ũ <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> 100% <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD> 1<><31> 0.3% ȸ<><C8B8>Ȯ<EFBFBD><C8AE> <20><><EFBFBD><EFBFBD>)
|
|||
|
|
// ȸ<><C8B8> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ǥ<><C7A5><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
|||
|
|
//if( LocalTime - m_LastDamageCheckTime > POISON_DAMAGE_INTERVAL )
|
|||
|
|
//{
|
|||
|
|
//int iDamageProbability = DEFAULT_POISON_DAMAGE_PROB - m_hActor->GetElementDefense( CDnState::Dark ) * 3;
|
|||
|
|
//
|
|||
|
|
//if( iDamageProbability < 0 )
|
|||
|
|
// iDamageProbability = 0;
|
|||
|
|
//else
|
|||
|
|
//if( iDamageProbability > 1000 )
|
|||
|
|
// iDamageProbability = 1000;
|
|||
|
|
|
|||
|
|
//if( _rand(GetRoom()) % 1000 < iDamageProbability )
|
|||
|
|
//{
|
|||
|
|
// // HP 0 <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> die <20>˾Ƽ<CBBE> <20>dz<EFBFBD>?
|
|||
|
|
// m_hActor->SetHP( m_hActor->GetHP() - (INT64)m_fValue );
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//m_LastDamageCheckTime = LocalTime;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CDnPoisonBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
|
|||
|
|
{
|
|||
|
|
//#ifdef _GAMESERVER
|
|||
|
|
// LocalTime <20><> 0<><30><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><>øó<C3B8><C3B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
if( LocalTime != 0 )
|
|||
|
|
m_IntervalChecker.OnEnd( LocalTime, fDelta );
|
|||
|
|
|
|||
|
|
#ifndef _GAMESERVER
|
|||
|
|
_SetDiffuse( 1.0f, 1.0f, 1.0f, 1.0f );
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>. <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
//m_hActor->DetachSEEffect( m_ParentSkillInfo, m_StateBlow.emBlowIndex, GetBlowID() );
|
|||
|
|
_DetachGraphicEffect();
|
|||
|
|
#endif
|
|||
|
|
OutputDebug( "CDnPoisonBlow::OnEnd, Value:%2.2f (HP : %d ) \n", m_fValue, m_hActor->GetHP());
|
|||
|
|
//#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if defined(_GAMESERVER)
|
|||
|
|
void CDnPoisonBlow::OnDuplicate( const STATE_BLOW& StateBlowInfo )
|
|||
|
|
{
|
|||
|
|
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ΰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>.
|
|||
|
|
if( m_ParentSkillInfo.hSkillUser )
|
|||
|
|
{
|
|||
|
|
if( -1.0f == m_fDamageProb )
|
|||
|
|
{
|
|||
|
|
CDnDamageBase::SHitParam HitParam;
|
|||
|
|
HitParam.cAttackType = 1; // <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
HitParam.HasElement = CDnState::Dark;
|
|||
|
|
m_fIntervalDamage = m_hActor->PreCalcDamage( m_ParentSkillInfo.hSkillUser.GetPointer(), HitParam, 1.0f, m_fValue );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CDnPoisonBlow::CalcDuplicateValue( const char* szValue )
|
|||
|
|
{
|
|||
|
|
float fValue = 0.0f;
|
|||
|
|
float fDamageProb = 0.0f;
|
|||
|
|
|
|||
|
|
#if defined(PRE_FIX_53266)
|
|||
|
|
float fAddDamageValue = 0.0f;
|
|||
|
|
|
|||
|
|
std::string str = szValue;//"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȯ<EFBFBD><C8AE>;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;<3B>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", <20>Ǵ<EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
|||
|
|
std::vector<std::string> tokens;
|
|||
|
|
std::string delimiters = ";";
|
|||
|
|
|
|||
|
|
//1. <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
TokenizeA(str, tokens, delimiters);
|
|||
|
|
|
|||
|
|
int nTokenSize = (int)tokens.size();
|
|||
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 1<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20>ݿ<EFBFBD>?
|
|||
|
|
if (1 == nTokenSize)
|
|||
|
|
{
|
|||
|
|
fValue = (float)atof( tokens[0].c_str() );
|
|||
|
|
fDamageProb = -1.0f;
|
|||
|
|
|
|||
|
|
m_fValue += fValue;
|
|||
|
|
}
|
|||
|
|
else if (nTokenSize >= 2)
|
|||
|
|
{
|
|||
|
|
fValue = (float)atof(tokens[0].c_str());
|
|||
|
|
fDamageProb = (float)atof(tokens[1].c_str());
|
|||
|
|
|
|||
|
|
if (nTokenSize >= 3)
|
|||
|
|
fAddDamageValue = (float)atof(tokens[2].c_str());
|
|||
|
|
|
|||
|
|
m_fValue += fValue;
|
|||
|
|
m_fDamageProb += fDamageProb;
|
|||
|
|
m_fDamageProb = min(1.0f, m_fDamageProb);
|
|||
|
|
|
|||
|
|
m_fIntervalDamage = CalcIntervalDamage(CDnState::Dark);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OutputDebug("%s Invalid Value %s\n", __FUNCTION__, szValue);
|
|||
|
|
}
|
|||
|
|
#else
|
|||
|
|
string strValue(szValue);
|
|||
|
|
int iSemiColonIndex = (int)strValue.find_first_of( ';', 0 );
|
|||
|
|
bool bDamageProbMode = (string::npos != iSemiColonIndex);
|
|||
|
|
if( bDamageProbMode )
|
|||
|
|
{
|
|||
|
|
string strProb = strValue.substr( 0, iSemiColonIndex );
|
|||
|
|
string strDamageProb = strValue.substr( iSemiColonIndex+1, strValue.length() );
|
|||
|
|
|
|||
|
|
// Ȯ<><C8AE>
|
|||
|
|
fValue = (float)atof( strProb.c_str() );
|
|||
|
|
fDamageProb = (float)atof( strDamageProb.c_str() );
|
|||
|
|
|
|||
|
|
m_fValue += fValue;
|
|||
|
|
m_fDamageProb += fDamageProb;
|
|||
|
|
if( 1.0f < m_fDamageProb )
|
|||
|
|
m_fDamageProb = 1.0f;
|
|||
|
|
|
|||
|
|
_ASSERT( 0.0f <= m_fDamageProb );
|
|||
|
|
#if defined(PRE_ADD_SKILLBUF_RENEW)
|
|||
|
|
m_fIntervalDamage = CalcIntervalDamage(CDnState::Dark);
|
|||
|
|
#else
|
|||
|
|
m_fIntervalDamage = m_hActor->GetLastDamage() * m_fDamageProb;
|
|||
|
|
#endif // PRE_ADD_SKILLBUF_RENEW
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
fValue = (float)atof( szValue );
|
|||
|
|
fDamageProb = -1.0f;
|
|||
|
|
|
|||
|
|
m_fValue += fValue;
|
|||
|
|
}
|
|||
|
|
#endif // PRE_FIX_53266
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if defined(PRE_ADD_SKILLBUF_RENEW)
|
|||
|
|
float CDnPoisonBlow::CalcIntervalDamage(CDnState::ElementEnum haElement)
|
|||
|
|
{
|
|||
|
|
float fCalcDamage = 1.0f;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD>..
|
|||
|
|
int HitterAttackValue[2] = {0, };
|
|||
|
|
CDnState *pState = NULL;
|
|||
|
|
if (m_ParentSkillInfo.hSkillUser)
|
|||
|
|
pState = static_cast<CDnActorState *>(m_ParentSkillInfo.hSkillUser.GetPointer());
|
|||
|
|
|
|||
|
|
if (pState)
|
|||
|
|
{
|
|||
|
|
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>.(<28><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>?)
|
|||
|
|
if (m_ParentSkillInfo.hSkillUser)
|
|||
|
|
{
|
|||
|
|
HitterAttackValue[0] = m_ParentSkillInfo.hSkillUser->GetAttackMMinWithoutSkill();//pState->GetAttackMMin();
|
|||
|
|
HitterAttackValue[1] = m_ParentSkillInfo.hSkillUser->GetAttackMMaxWithoutSkill();//pState->GetAttackMMax();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
// <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>ġ
|
|||
|
|
float fElementWeight = 1.f;
|
|||
|
|
fElementWeight = ( ( 1.f + pState->GetElementAttack( haElement ) ) * ( 1.f - m_hActor->GetElementDefense( haElement ) ) );
|
|||
|
|
#ifndef PRE_ADD_BUFF_STATE_LIMIT
|
|||
|
|
fElementWeight = max( fElementWeight, CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::ElementMinRevision ) );
|
|||
|
|
#endif
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
|
|||
|
|
float fDefensePower = 1.f;
|
|||
|
|
float fDefenseWeight = 0.0f;
|
|||
|
|
int nDefense = 0;
|
|||
|
|
|
|||
|
|
nDefense = m_hActor->GetDefenseM();
|
|||
|
|
fDefenseWeight = m_ParentSkillInfo.hSkillUser->GetDefenseConstant();
|
|||
|
|
|
|||
|
|
fDefensePower = nDefense / fDefenseWeight;
|
|||
|
|
if( fDefensePower < 0.f ) fDefensePower = 0.f;
|
|||
|
|
else if( fDefensePower > CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::DefenseMax ) )
|
|||
|
|
fDefensePower = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::DefenseMax );
|
|||
|
|
|
|||
|
|
fDefensePower = 1.f - fDefensePower;
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
fCalcDamage = (float)GetGaussianRandom( HitterAttackValue[0], HitterAttackValue[1], m_hActor->GetRoom() ) * fElementWeight;
|
|||
|
|
|
|||
|
|
fCalcDamage = fCalcDamage * m_fDamageProb * fDefensePower;
|
|||
|
|
#if defined(PRE_FIX_53266)
|
|||
|
|
fCalcDamage += m_fAddDamageValue;
|
|||
|
|
#endif // PRE_FIX_53266
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
fCalcDamage = 1.0f;
|
|||
|
|
|
|||
|
|
return fCalcDamage;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDnPoisonBlow::OnSetParentSkillInfo()
|
|||
|
|
{
|
|||
|
|
m_fIntervalDamage = CalcIntervalDamage(CDnState::Dark);
|
|||
|
|
}
|
|||
|
|
#endif // PRE_ADD_SKILLBUF_RENEW
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
|
|||
|
|
void CDnPoisonBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
|
|||
|
|
{
|
|||
|
|
char szBuff[128] = {0, };
|
|||
|
|
|
|||
|
|
//<2F>Ľ̿<C4BD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
std::vector<string> vlTokens[2];
|
|||
|
|
string strArgument[2];
|
|||
|
|
|
|||
|
|
int nValueCount = 0;
|
|||
|
|
|
|||
|
|
//<2F>ʿ<EFBFBD><CABF><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
float fValue[2];
|
|||
|
|
float fDamageProb[2];
|
|||
|
|
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//ù<><C3B9>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>.
|
|||
|
|
strArgument[0] = szOrigValue;
|
|||
|
|
TokenizeA( strArgument[0], vlTokens[0], ";" );
|
|||
|
|
|
|||
|
|
if( vlTokens[0].size() > 1 ) {
|
|||
|
|
fValue[0] = (float)atof( vlTokens[0][0].c_str() );
|
|||
|
|
fDamageProb[0] = (float)atof( vlTokens[0][1].c_str() );
|
|||
|
|
|
|||
|
|
nValueCount = 2;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
fValue[0] = (float)atof( szOrigValue );
|
|||
|
|
fDamageProb[0] = -1.0f;
|
|||
|
|
|
|||
|
|
nValueCount = 1;
|
|||
|
|
}
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//<2F>ι<EFBFBD>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>
|
|||
|
|
strArgument[1] = szAddValue;
|
|||
|
|
TokenizeA( strArgument[1], vlTokens[1], ";" );
|
|||
|
|
|
|||
|
|
if( vlTokens[1].size() > 1 ) {
|
|||
|
|
fValue[1] = (float)atof( vlTokens[1][0].c_str() );
|
|||
|
|
fDamageProb[1] = (float)atof( vlTokens[1][1].c_str() );
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
fValue[1] = (float)atof( szOrigValue );
|
|||
|
|
fDamageProb[1] = -1.0f;
|
|||
|
|
}
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
float fResultValue = fValue[0] + fValue[1];
|
|||
|
|
float fResultDamageProb = fDamageProb[0] + fDamageProb[1];
|
|||
|
|
|
|||
|
|
if (nValueCount == 2)
|
|||
|
|
{
|
|||
|
|
sprintf_s(szBuff, "%f;%f", fResultValue, fResultDamageProb);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
sprintf_s(szBuff, "%f", fResultValue);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
szNewValue = szBuff;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDnPoisonBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
|
|||
|
|
{
|
|||
|
|
char szBuff[128] = {0, };
|
|||
|
|
|
|||
|
|
//<2F>Ľ̿<C4BD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
std::vector<string> vlTokens[2];
|
|||
|
|
string strArgument[2];
|
|||
|
|
|
|||
|
|
int nValueCount = 0;
|
|||
|
|
|
|||
|
|
//<2F>ʿ<EFBFBD><CABF><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
|
float fValue[2];
|
|||
|
|
float fDamageProb[2];
|
|||
|
|
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//ù<><C3B9>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>.
|
|||
|
|
strArgument[0] = szOrigValue;
|
|||
|
|
TokenizeA( strArgument[0], vlTokens[0], ";" );
|
|||
|
|
|
|||
|
|
if( vlTokens[0].size() > 1 ) {
|
|||
|
|
fValue[0] = (float)atof( vlTokens[0][0].c_str() );
|
|||
|
|
fDamageProb[0] = (float)atof( vlTokens[0][1].c_str() );
|
|||
|
|
|
|||
|
|
nValueCount = 2;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
fValue[0] = (float)atof( szOrigValue );
|
|||
|
|
fDamageProb[0] = -1.0f;
|
|||
|
|
|
|||
|
|
nValueCount = 1;
|
|||
|
|
}
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//<2F>ι<EFBFBD>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>
|
|||
|
|
strArgument[1] = szAddValue;
|
|||
|
|
TokenizeA( strArgument[1], vlTokens[1], ";" );
|
|||
|
|
|
|||
|
|
if( vlTokens[1].size() > 1 ) {
|
|||
|
|
fValue[1] = (float)atof( vlTokens[1][0].c_str() );
|
|||
|
|
fDamageProb[1] = (float)atof( vlTokens[1][1].c_str() );
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
fValue[1] = (float)atof( szOrigValue );
|
|||
|
|
fDamageProb[1] = -1.0f;
|
|||
|
|
}
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
|
|||
|
|
float fResultValue = fValue[0] - fValue[1];
|
|||
|
|
float fResultDamageProb = fDamageProb[0] - fDamageProb[1];
|
|||
|
|
|
|||
|
|
if (nValueCount == 2)
|
|||
|
|
{
|
|||
|
|
sprintf_s(szBuff, "%f;%f", fResultValue, fResultDamageProb);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
sprintf_s(szBuff, "%f", fResultValue);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
szNewValue = szBuff;
|
|||
|
|
}
|
|||
|
|
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
|