📄 damageeffectunit.cpp
字号:
// DamageEffectUnit.cpp: implementation of the CDamageEffectUnit class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "EffectManager.h"
#include "DamageEffectUnit.h"
#include "DamageEffectUnitDesc.h"
#include "..\MoveManager.h"
#include "..\ObjectActionManager.h"
#include "..\Engine\EngineSound.h"
#include "..\ObjectManager.h"
//
#include "..\ChatDialog.h"
#include "..\interface\cListDialog.h"
#include "..\GameIn.h"
//
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDamageEffectUnit::CDamageEffectUnit()
{
}
CDamageEffectUnit::~CDamageEffectUnit()
{
}
void CDamageEffectUnit::Initialize(CEffectUnitDesc* pEffectUnitDesc,EFFECTPARAM* pEffectParam)
{
m_DamageOrder = NULL;
CEffectUnit::Initialize(pEffectUnitDesc,pEffectParam);
}
void CDamageEffectUnit::Release()
{
if(m_DamageOrder)
{
delete [] m_DamageOrder;
m_DamageOrder = NULL;
}
CDamageEffectUnitDesc::ReleaseUnit(this);
}
void CDamageEffectUnit::SortDamageOrder(DWORD nTargetNum,TARGETSET* pTargetArray)
{
}
void CDamageEffectUnit::GetDamageNumberVelocity(VECTOR3* pRtVelocity,CObject* pObject,DWORD DamageKind)
{
pRtVelocity->y = 0;
if(DamageKind == eDamageKind_Left)
{
pRtVelocity->x = -.1f;
pRtVelocity->y = 0.8f;
pRtVelocity->z = .3f;
}
else if(DamageKind == eDamageKind_Right)
{
pRtVelocity->x = 0.1f;
pRtVelocity->y = 0.8f;
pRtVelocity->z = 0.3f;
}
else if(DamageKind == eDamageKind_Front)
{
pRtVelocity->x = 0;
pRtVelocity->y = 1.f;
pRtVelocity->z = .3f;
}
else if(DamageKind == eDamageKind_Counter)
{
pRtVelocity->x = 0;
pRtVelocity->y = 7.f;
pRtVelocity->z = .2f;
}
else if(DamageKind == eDamageKind_ContinueDamage)
{
pRtVelocity->x = 0;
pRtVelocity->y = .5f;
pRtVelocity->z = .15f;
}
float angle = pObject->GetAngle();
TransToRelatedCoordinate(pRtVelocity,pRtVelocity,angle);
}
void CDamageEffectUnit::InitEffect(DWORD nTargetNum,TARGETSET* pTargetArray)
{
if(nTargetNum == 0)
return;
ASSERT(nTargetNum);
m_nObjectNum = nTargetNum;
SortDamageOrder(nTargetNum,pTargetArray);
m_nCurTargetNum = 0;
m_bInited = TRUE;
}
BOOL CDamageEffectUnit::On(EFFECTPARAM* pParam)
{
if(m_bInited == FALSE)
return FALSE;
int objectnum;
TARGETSET* pObject;
GetObjectSet(pParam,&pObject,&objectnum);
CDamageEffectUnitDesc* pDesc = (CDamageEffectUnitDesc*)m_pEffectUnitDesc;
pParam->m_DamageRate += pDesc->m_DamageRate;
for(int n=0;n<objectnum;++n)
{
if(pObject[n].pTarget->IsInited() == FALSE) // 纳腐磐啊 粮犁窍瘤 臼栏搁 return
continue;
m_nCurTargetNum = n;
DoOn(pParam,&pObject[n]);
}
//////////////////////////////////////////////////////////////////////////
// 林牢傍苞 单固瘤 涝绰 皋牢鸥百苞 啊鳖快搁 炼陛究 冻绢飘覆
if(pParam->m_dwFlag & EFFECT_FLAG_HEROATTACK)
{
DWORD MainTargetID = GetMainTargetID(pParam->GetMainTarget());
if(MainTargetID && MainTargetID != HEROID)
{
CObject* pMainTarget = OBJECTMGR->GetObject(MainTargetID);
if(pMainTarget)
{
// HERO->OnHitTarget(pMainTarget);
}
}
}
//////////////////////////////////////////////////////////////////////////
return TRUE;
}
DWORD CalcTotalDamage(DWORD CurTotal,float CurRate,float SumRate)
{
float lateSum = SumRate - CurRate;
float inverse = 1 / (1 - lateSum);
return (DWORD)(CurTotal * inverse);
}
void CDamageEffectUnit::Damage(CObject* pVictim,CObject* pAttacker,RESULTINFO* pResultInfo,
float CurRate,float SumRate,BYTE DamageKind,BOOL bFatalDamage)
{
DWORD LifeOriginalTotalDamage = CalcTotalDamage(pResultInfo->RealDamage,CurRate,SumRate);
DWORD ShieldOriginalTotalDamage = CalcTotalDamage(pResultInfo->ShieldDamage,CurRate,SumRate);
DWORD VampiricLifeOriginalTotal = CalcTotalDamage(pResultInfo->Vampiric_Life,CurRate,SumRate);
DWORD VampiricNaeryukOriginalTotal = CalcTotalDamage(pResultInfo->Vampiric_Naeryuk,CurRate,SumRate);
DWORD LifeDamage;
DWORD ShieldDamage;
DWORD VampiricLife;
DWORD VampiricNaeryuk;
if(SumRate >= 0.98f)
{ // 付瘤阜 傍拜捞搁 唱赣瘤 傈何甫 单固瘤肺
#ifdef _DEBUG
if(SumRate > 1)
{
char temp[256];
sprintf(temp,"%s Damage Error",m_pEffectUnitDesc->m_EffFilename);
ASSERTMSG(SumRate <= 1,temp);
}
#endif
LifeDamage = pResultInfo->RealDamage;
ShieldDamage = pResultInfo->ShieldDamage;
VampiricLife = pResultInfo->Vampiric_Life;
VampiricNaeryuk = pResultInfo->Vampiric_Naeryuk;
// 付瘤阜 傍拜捞搁 Stun 惑怕肺 父电促.
if(pResultInfo->StunTime)
pVictim->StartSpecialState(eSpecialState_Stun,pResultInfo->StunTime,0,0,0,FindEffectNum("monster_stun_s.beff"),0);
}
else
{
LifeDamage = (DWORD)(LifeOriginalTotalDamage*CurRate); // 磊脚狼 厚啦措肺..
ShieldDamage = (DWORD)(ShieldOriginalTotalDamage*CurRate); // 磊脚狼 厚啦措肺..
VampiricLife = (DWORD)(VampiricLifeOriginalTotal*CurRate); // 磊脚狼 厚啦措肺..
VampiricNaeryuk = (DWORD)(VampiricNaeryukOriginalTotal*CurRate); // 磊脚狼 厚啦措肺..
}
pResultInfo->RealDamage -= (TARGETDATA)LifeDamage;
pResultInfo->ShieldDamage -= (TARGETDATA)ShieldDamage;
pResultInfo->Vampiric_Life -= (TARGETDATA)VampiricLifeOriginalTotal;
pResultInfo->Vampiric_Naeryuk -= (TARGETDATA)VampiricNaeryukOriginalTotal;
if(pResultInfo->bDodge)
OBJECTACTIONMGR->Dodge(pVictim,pAttacker);
else
OBJECTACTIONMGR->Damage(pVictim,pAttacker,DamageKind,LifeDamage,ShieldDamage,pResultInfo->bCritical);
if(VampiricLife)
{
if(pAttacker->GetID() == HERO->GetID())
HERO->ChangeLife(VampiricLife);
else
pAttacker->SetLife(pAttacker->GetLife()+VampiricLife);
}
if(VampiricNaeryuk)
{
pAttacker->SetNaeRyuk(pAttacker->GetNaeRyuk()+VampiricNaeryuk);
}
if(SumRate >= 0.98f) // 单固瘤甫 促 锭啡促
{
if(pVictim->IsDied()) // 磷菌促
{
OBJECTACTIONMGR->Die(pVictim,pAttacker,bFatalDamage,pResultInfo->bCritical); // 朝扼啊辑 磷扁
}
}
}
void CDamageEffectUnit::DoOn(EFFECTPARAM* pParam,TARGETSET* pObject)
{
CDamageEffectUnitDesc* pDesc = (CDamageEffectUnitDesc*)m_pEffectUnitDesc;
Damage(pObject->pTarget, pParam->m_pOperator, &pObject->ResultInfo,
pDesc->m_DamageRate, pParam->m_DamageRate, pDesc->m_DamageKind,
pParam->m_dwFlag & EFFECT_FLAG_FATALDAMAGE);
//////////////////////////////////////////////////////////////////////////
// 馆拜 贸府
if(pObject->ResultInfo.CounterDamage)
{
RESULTINFO tempinfo;
tempinfo.Clear();
tempinfo.RealDamage = pObject->ResultInfo.CounterDamage;
Damage(pParam->m_pOperator, pObject->pTarget, &tempinfo,
pDesc->m_DamageRate, pParam->m_DamageRate, eDamageKind_Counter,
FALSE);
}
//////////////////////////////////////////////////////////////////////////
}
void CDamageEffectUnit::DoProcess(DWORD tickTime,EFFECTPARAM* pParam)
{
if(m_bInited == FALSE)
return;
/*
float FadeRate = 1;
if(m_bFading) // Fade矫累..
{
if(tickTime >= m_FadeTime)
{
m_FadeTime = 0;
FadeRate = 0;
for(int n=0;n<m_nObjectNum;++n)
m_DamageNumberArray[n].Clear();
}
else
{
m_FadeTime -= tickTime;
}
FadeRate = m_FadeTime / (float)pDesc->m_FadeDuration;
}
for(int n=0;n<m_nObjectNum;++n)
{
m_DamageNumberArray[n].SetAlpha(FadeRate);
}
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -