⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 damageeffectunit.cpp

📁 墨香最新私服
💻 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 + -