DragonNest/GameCommon/DnPayBackMPBlow.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

201 lines
5.3 KiB
C++

#include "StdAfx.h"
#include "DnPayBackMPBlow.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CDnPayBackMPBlow::CDnPayBackMPBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ),
m_fApplyProb( 0.0f ),
m_fConsumeDecreaseProb( 0.0f )
#ifndef _GAMESERVER
,m_bShowActivateEffect( false )
,m_ShowActivateEffectTime( 0 )
,m_PrevFrameLocalTime( 0 )
#endif
{
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_068;
SetValue( szValue );
//m_fValue = (float)atof( szValue );
string strValue( szValue );
int iSemiColonIndex = (int)strValue.find_first_of( ';', 0 );
bool bValidArgument = (string::npos != iSemiColonIndex);
_ASSERT( bValidArgument && "PayBack Mana 상태효과 효과 수치가 잘못 되었습니다. 세미콜론을 찾을 수가 없음" );
if( bValidArgument )
{
string strApplyProb = strValue.substr( 0, iSemiColonIndex );
string strConsumeDecreaseProb = strValue.substr( iSemiColonIndex+1, strValue.length() );
// 확률
m_fApplyProb = (float)atof( strApplyProb.c_str() );
m_fConsumeDecreaseProb = (float)atof( strConsumeDecreaseProb.c_str() );
}
AddCallBackType( SB_ONUSEMP );
}
CDnPayBackMPBlow::~CDnPayBackMPBlow(void)
{
}
void CDnPayBackMPBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
OutputDebug( "CDnPayBackMPBlow::OnBegin\n" );
}
void CDnPayBackMPBlow::Process( LOCAL_TIME LocalTime, float fDelta )
{
CDnBlow::Process( LocalTime, fDelta );
#ifndef _GAMESERVER
if( m_bShowActivateEffect )
{
// 1.5 초간만 보여준다.
if( 1500 < LocalTime - m_ShowActivateEffectTime )
{
_DetachGraphicEffect();
m_bShowActivateEffect = false;
}
}
m_PrevFrameLocalTime = LocalTime;
#endif
}
void CDnPayBackMPBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
OutputDebug( "CDnPayBackMPBlow::OnEnd\n" );
}
void CDnPayBackMPBlow::OnDuplicate( const STATE_BLOW& StateBlowInfo )
{
// 페이백 마나 상태효과에서는 아무것도 하지 않는다.
}
#ifdef _GAMESERVER
int CDnPayBackMPBlow::OnUseMP( int iMPDelta )
{
int iResult = 0;
if( _rand(GetRoom())%10000 <= m_fApplyProb*10000.0f )
{
iResult = int(-iMPDelta * m_fConsumeDecreaseProb);
m_hActor->RequestSEProbSuccess( m_ParentSkillInfo.iSkillID, m_StateBlow.emBlowIndex );
}
return iResult;
}
#else
void CDnPayBackMPBlow::OnActivate( void )
{
m_bShowActivateEffect = true;
_AttachGraphicEffect();
m_ShowActivateEffectTime = m_PrevFrameLocalTime;
}
#endif
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnPayBackMPBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
//파싱에 필요한 변수 선언
std::vector<string> vlTokens[2];
string strArgument[2];
//필요한 값 변수
float fApplyProb[2] = {0.0f, };
float fConsumeDecreaseProb[2] = {0.0f, };
//////////////////////////////////////////////////////////////////////////
//첫번째 문자열 파싱.
strArgument[0] = szOrigValue;
TokenizeA( strArgument[0], vlTokens[0], ";" );
if( vlTokens[0].size() == 2 ) {
fApplyProb[0] = (float)atof( vlTokens[0][0].c_str() );
fConsumeDecreaseProb[0] = (float)atof( vlTokens[0][1].c_str() );
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//두번째 문자열 파싱
strArgument[1] = szAddValue;
TokenizeA( strArgument[1], vlTokens[1], ";" );
if( vlTokens[1].size() == 2 ) {
fApplyProb[1] = (float)atof( vlTokens[1][0].c_str() );
fConsumeDecreaseProb[1] = (float)atof( vlTokens[1][1].c_str() );
}
//////////////////////////////////////////////////////////////////////////
//두 값을 더한다.
float fResultApplyProb = fApplyProb[0] + fApplyProb[1];
float fResultConsumeDecreaseProb = fConsumeDecreaseProb[0] + fConsumeDecreaseProb[1];
sprintf_s(szBuff, "%f;%f", fResultApplyProb, fResultConsumeDecreaseProb);
szNewValue = szBuff;
}
void CDnPayBackMPBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
//파싱에 필요한 변수 선언
std::vector<string> vlTokens[2];
string strArgument[2];
//필요한 값 변수
float fApplyProb[2] = {0.0f, };
float fConsumeDecreaseProb[2] = {0.0f, };
//////////////////////////////////////////////////////////////////////////
//첫번째 문자열 파싱.
strArgument[0] = szOrigValue;
TokenizeA( strArgument[0], vlTokens[0], ";" );
if( vlTokens[0].size() == 2 ) {
fApplyProb[0] = (float)atof( vlTokens[0][0].c_str() );
fConsumeDecreaseProb[0] = (float)atof( vlTokens[0][1].c_str() );
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//두번째 문자열 파싱
strArgument[1] = szAddValue;
TokenizeA( strArgument[1], vlTokens[1], ";" );
if( vlTokens[1].size() == 2 ) {
fApplyProb[1] = (float)atof( vlTokens[1][0].c_str() );
fConsumeDecreaseProb[1] = (float)atof( vlTokens[1][1].c_str() );
}
//////////////////////////////////////////////////////////////////////////
//두 값을 더한다.
float fResultApplyProb = fApplyProb[0] - fApplyProb[1];
float fResultConsumeDecreaseProb = fConsumeDecreaseProb[0] - fConsumeDecreaseProb[1];
sprintf_s(szBuff, "%f;%f", fResultApplyProb, fResultConsumeDecreaseProb);
szNewValue = szBuff;
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW