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

📄 charactercalcmanager.cpp

📁 墨香最新私服
💻 CPP
字号:
// CharacterCalcManager.cpp: implementation of the CCharacterCalcManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CharacterCalcManager.h"
#include "Player.h"
#include "KyungGongManager.h"
#include "CharMove.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCharacterCalcManager::CCharacterCalcManager()
{
}

CCharacterCalcManager::~CCharacterCalcManager()
{

}

void CCharacterCalcManager::StartUpdateLife( CObject* pObject, WORD plusLife, BYTE recoverInterval, DWORD recoverTime )
{
	DWORD MaxVal = pObject->GetMaxLife();
	DWORD CurVal = pObject->GetLife();
	DWORD DamagedVal = MaxVal-CurVal;
	if(DamagedVal < plusLife)
		plusLife = DamagedVal;

	pObject->m_YYLifeRecoverTime.bStart = TRUE;
	pObject->m_YYLifeRecoverTime.count = recoverInterval;														// 10¹ø¿¡ °ÉÃÄ È¸º¹ÇÑ´Ù
	pObject->m_YYLifeRecoverTime.recoverUnitAmout = plusLife/pObject->m_YYLifeRecoverTime.count;	// Çѹø¿¡ ȸº¹µÉ ¾ç
	pObject->m_YYLifeRecoverTime.recoverDelayTime = recoverTime/pObject->m_YYLifeRecoverTime.count;		// 6Ãʰ£ ȸº¹ÀÌ ¿Ï·áµÈ´Ù
	pObject->m_YYLifeRecoverTime.lastCheckTime = 0;													// óÀ½Àº ¹Ù·Î ȸº¹ÇÑ´Ù.

	UpdateLife( pObject );
}

void CCharacterCalcManager::StartUpdateNaeRyuk( CPlayer* pPlayer, WORD plusNaeRyuk )
{
	DWORD MaxVal = pPlayer->GetMaxNaeRyuk();
	DWORD CurVal = pPlayer->GetNaeRyuk();
	DWORD DamagedVal = MaxVal-CurVal;
	if(DamagedVal < plusNaeRyuk)
		plusNaeRyuk = DamagedVal;

	pPlayer->m_YYNaeRyukRecoverTime.bStart = TRUE;
	pPlayer->m_YYNaeRyukRecoverTime.count = RECOVERINTERVALUNIT;																// 10¹ø¿¡ °ÉÃÄ È¸º¹ÇÑ´Ù
	pPlayer->m_YYNaeRyukRecoverTime.recoverUnitAmout = plusNaeRyuk/pPlayer->m_YYNaeRyukRecoverTime.count;	// Çѹø¿¡ ȸº¹µÉ ¾ç
	pPlayer->m_YYNaeRyukRecoverTime.recoverDelayTime = RECOVERTIMEUNIT/pPlayer->m_YYNaeRyukRecoverTime.count;		// 1Ãʰ£ ȸº¹ÀÌ ¿Ï·áµÈ´Ù
	pPlayer->m_YYNaeRyukRecoverTime.lastCheckTime = 0;														// óÀ½Àº ¹Ù·Î ȸº¹ÇÑ´Ù.

	UpdateNaeRyuk( pPlayer );
}
void CCharacterCalcManager::UpdateNaeRyuk(CPlayer* pPlayer)
{
	if( pPlayer->GetState() == eObjectState_Die )
		return;

	if( pPlayer->m_YYNaeRyukRecoverTime.bStart )
	{
		if(pPlayer->m_YYNaeRyukRecoverTime.recoverDelayTime + pPlayer->m_YYNaeRyukRecoverTime.lastCheckTime < gCurTime )
		{
			pPlayer->m_YYNaeRyukRecoverTime.lastCheckTime = gCurTime;
			// ³»·Â Áõ°¡
			pPlayer->AddNaeRyuk( pPlayer->m_YYNaeRyukRecoverTime.recoverUnitAmout, NULL );
			--pPlayer->m_YYNaeRyukRecoverTime.count;
			if( pPlayer->m_YYNaeRyukRecoverTime.count ==0 )
			{
				pPlayer->m_YYNaeRyukRecoverTime.bStart = FALSE;
				//CObjectEvent::ObjectEvent(pPlayer, OE_LEVELUP, &m_HeroCharacterInfo.Level);
			}
		}
	}
}
void CCharacterCalcManager::UpdateLife(CObject* pObject)
{
	if( pObject->GetState() == eObjectState_Die )
		return;

	if( pObject->m_YYLifeRecoverTime.bStart )
	{
		if(pObject->m_YYLifeRecoverTime.recoverDelayTime + pObject->m_YYLifeRecoverTime.lastCheckTime < gCurTime )
		{
			pObject->m_YYLifeRecoverTime.lastCheckTime = gCurTime;
			// »ý¸í·Â Áõ°¡
			pObject->AddLife( pObject->m_YYLifeRecoverTime.recoverUnitAmout, NULL );
			--pObject->m_YYLifeRecoverTime.count;
			if( pObject->m_YYLifeRecoverTime.count ==0 )
			{
				pObject->m_YYLifeRecoverTime.bStart = FALSE;
				//CObjectEvent::ObjectEvent(pObject, OE_LIFERECOVERCOMPLETED, NULL);
			}
		}
	}
}


void CCharacterCalcManager::CalcMaxLife(CPlayer * pPlayer)
{
	DWORD MaxLife = 0;
	WORD Sta = pPlayer->GetCheRyuk();
	LEVELTYPE level = pPlayer->GetLevel();

	//[·¹º§] * 5 + [ü·Â] * 10
	MaxLife = ( level * 5 ) + ( Sta * 10 );	
	
	// + ¾ÆÀÌÅÛ °¡»ê
	MaxLife += pPlayer->GetItemStats()->MaxLife;
	
	// + Ư±â °¡»ê
	MaxLife += pPlayer->GetAbilityStats()->LifeUp;

	pPlayer->SetMaxLife(MaxLife);
	
	pPlayer->CheckLifeValid();
}
void CCharacterCalcManager::CalcMaxShield(CPlayer * pPlayer)
{
	DWORD MaxShield = 0;
	WORD Simmek = pPlayer->GetSimMek();
	LEVELTYPE level = pPlayer->GetLevel();

	// [·¹º§] * 5 + [½É¸Æ] * 10
	MaxShield = ( level * 5 ) + ( Simmek * 10 );

	// + ¾ÆÀÌÅÛ °¡»ê
	MaxShield += pPlayer->GetItemStats()->MaxShield;
	
	// + Ư±â °¡»ê
	MaxShield += pPlayer->GetAbilityStats()->ShieldUp;

	pPlayer->SetMaxShield(MaxShield);

	pPlayer->CheckShieldValid();
}
void CCharacterCalcManager::CalcMaxNaeRyuk(CPlayer * pPlayer)
{
	DWORD MaxEnergy = 0;
	WORD Simmek = pPlayer->GetSimMek();
	LEVELTYPE level = pPlayer->GetLevel();

	// [·¹º§] * 5 + [½É¸Æ] * 10
	MaxEnergy = ( level * 5 ) + ( Simmek * 10 );

	MaxEnergy += pPlayer->GetItemStats()->MaxNaeRyuk;
	
	// + Ư±â °¡»ê
	MaxEnergy += pPlayer->GetAbilityStats()->NaeRyukUp;

	pPlayer->SetMaxNaeRyuk(MaxEnergy);

	pPlayer->CheckNaeRyukValid();
}

void CCharacterCalcManager::ProcessLife(CPlayer * pPlayer)
{
	if(pPlayer->GetState() == eObjectState_Die)
		return;

	DWORD life = pPlayer->GetLife();
	DWORD maxlife = pPlayer->GetMaxLife();
	LEVELTYPE level = pPlayer->GetLevel();

	if(life == maxlife) return;
	
	DWORD curTime = 0;
	if(!pPlayer->m_LifeRecoverTime.bStart)
	{
		curTime = gCurTime;
	}
	else
	{
		curTime = pPlayer->m_LifeRecoverTime.lastCheckTime = gCurTime;
		pPlayer->m_LifeRecoverTime.bStart = FALSE;
		return;
	}

	if(pPlayer->GetState() != eObjectState_Ungijosik)
		General_LifeCount(pPlayer, curTime, level, life, maxlife);
	
	if(pPlayer->GetState() == eObjectState_Ungijosik)
		Ungi_LifeCount(pPlayer,life,maxlife,curTime);
}

void CCharacterCalcManager::General_LifeCount(CPlayer * pPlayer, DWORD curTime, LEVELTYPE level, DWORD life, DWORD maxlife)
{
	// 	Æò»ó½Ã ȸº¹ (5ÃÊ´ç) ü·Â : ÀüüÀÇ 1%
	if(curTime - pPlayer->m_LifeRecoverTime.lastCheckTime > 5000)
	{
		pPlayer->SetLife(life+(DWORD)(maxlife*0.01f));
		pPlayer->m_LifeRecoverTime.lastCheckTime = curTime; //KES confirm
	}
}

void CCharacterCalcManager::Ungi_LifeCount(CPlayer* pPlayer, DWORD life, DWORD maxlife, DWORD curTime)
{
	// RaMa - 04.11.24  ->¿î±âÁ¶½Ä½Ã°£
	DWORD dwUngiTime = 5000;
	dwUngiTime = dwUngiTime*(1/gUngiSpeed);
	
	//·¹º§¿¡ »ó°ü¾øÀÌ 5Ãʸ¶´Ù Àüü·®ÀÇ 10(º¸Á¤Ä¡) + 3% ÀçÃæÀü
	if(curTime - pPlayer->m_LifeRecoverTime.lastCheckTime > dwUngiTime)
	{
		DWORD baseplus = (DWORD)(10 + maxlife*(0.03f)) + pPlayer->m_AbilityStats.UngiUpVal;
		DWORD pluslife = (DWORD)(maxlife*pPlayer->GetUngiPlusRate());
		pPlayer->SetLife(life + baseplus + pluslife);
		pPlayer->m_LifeRecoverTime.lastCheckTime = curTime;
	}
}


void CCharacterCalcManager::ProcessShield(CPlayer * pPlayer)
{
	if(pPlayer->GetState() == eObjectState_Die)
		return;

	DWORD shield = pPlayer->GetShield();
	DWORD maxshield = pPlayer->GetMaxShield();
	LEVELTYPE level = pPlayer->GetLevel();

	if(shield == maxshield) return;
	
	DWORD curTime = 0;
	if(!pPlayer->m_ShieldRecoverTime.bStart)
	{
		curTime = gCurTime;
	}
	else
	{
		curTime = pPlayer->m_ShieldRecoverTime.lastCheckTime = gCurTime;
		pPlayer->m_ShieldRecoverTime.bStart = FALSE;
		return;
	}

	if(pPlayer->GetState() != eObjectState_Ungijosik)
		General_ShieldCount(pPlayer, curTime, level, shield, maxshield);
	
	if(pPlayer->GetState() == eObjectState_Ungijosik)
		Ungi_ShieldCount(pPlayer,shield,maxshield,curTime);
}

void CCharacterCalcManager::General_ShieldCount(CPlayer * pPlayer, DWORD curTime, LEVELTYPE level, DWORD Shield, DWORD maxShield)
{
	// 	Æò»ó½Ã ȸº¹ (5ÃÊ´ç) ÀüüÀÇ 1%
	if(curTime - pPlayer->m_ShieldRecoverTime.lastCheckTime > 5000)
	{
		pPlayer->SetShield(Shield+(DWORD)(maxShield*0.05f));
		pPlayer->m_ShieldRecoverTime.lastCheckTime = curTime;	//KESÀÌ·¸°Ô ÇÏ¸é ¾ÈµÇÁö ¾Ê³²? Á¤È®È÷ 5Ãʸ¶´Ù°¡ µÇÁö ¸øÇÑ´Ù.
	}
}
 
void CCharacterCalcManager::Ungi_ShieldCount(CPlayer* pPlayer, DWORD Shield, DWORD maxShield, DWORD curTime)
{
	// RaMa - 04.11.24  ->¿î±âÁ¶½Ä½Ã°£
	DWORD dwUngiTime = 5000;
	dwUngiTime = dwUngiTime*(1/gUngiSpeed);
	
	//·¹º§¿¡ »ó°ü¾øÀÌ 5Ãʸ¶´Ù Àüü·®ÀÇ 10(º¸Á¤Ä¡) + 8% ÀçÃæÀü
	if(curTime - pPlayer->m_ShieldRecoverTime.lastCheckTime > dwUngiTime)
	{
		DWORD baseplus = (DWORD)(10 + maxShield*(0.08f)) + pPlayer->m_AbilityStats.UngiUpVal;
		DWORD plusShield = (DWORD)(maxShield*pPlayer->GetUngiPlusRate());
		pPlayer->SetShield(Shield + baseplus + plusShield);
		pPlayer->m_ShieldRecoverTime.lastCheckTime = curTime;
	}
}

void CCharacterCalcManager::ProcessNaeRyuk(CPlayer * pPlayer)
{
	if(pPlayer->GetState() == eObjectState_Die)
		return;
	
	DWORD energy = pPlayer->GetNaeRyuk();
	DWORD maxEnergy = pPlayer->GetMaxNaeRyuk();
	LEVELTYPE level = pPlayer->GetLevel();
	WORD KGIdx = pPlayer->m_MoveInfo.KyungGongIdx;

	if(KGIdx != 0)
	{
		KyungGong_NaeRyukCount(pPlayer,gCurTime,KGIdx);
		return;
	}

	if(energy == maxEnergy) return;

	DWORD curTime = 0;
	if(!pPlayer->m_NaeRyukRecoverTime.bStart)
	{
		curTime = gCurTime;
	}
	else
	{
		curTime = pPlayer->m_NaeRyukRecoverTime.lastCheckTime = gCurTime;
		pPlayer->m_NaeRyukRecoverTime.bStart = FALSE;
		return;
	}
	if(pPlayer->GetState() != eObjectState_Ungijosik)
		General_NaeRyukCount(pPlayer, curTime, level, energy, maxEnergy);
	
	else if(pPlayer->GetState() == eObjectState_Ungijosik)
		Ungi_NaeRyukCount(pPlayer,curTime,energy,maxEnergy);
}

void CCharacterCalcManager::General_NaeRyukCount(CPlayer* pPlayer, DWORD curTime, LEVELTYPE level, DWORD energy, DWORD maxEnergy)
{
	 //Æò»ó½Ã ȸº¹ (5ÃÊ´ç) ³»·Â : ÀüüÀÇ 1%
	if(curTime - pPlayer->m_NaeRyukRecoverTime.lastCheckTime > 5000)
	{
		pPlayer->SetNaeRyuk(energy+(DWORD)(maxEnergy*0.01f));
		pPlayer->m_NaeRyukRecoverTime.lastCheckTime = curTime;
	}
}

void CCharacterCalcManager::Ungi_NaeRyukCount(CPlayer* pPlayer, DWORD curTime, DWORD energy, DWORD maxEnergy)
{	
	// RaMa - 04.11.24  ->¿î±âÁ¶½Ä½Ã°£
	DWORD dwUngiTime = 5000;
	dwUngiTime = dwUngiTime*(1/gUngiSpeed);

	//·¹º§¿¡ »ó°ü¾øÀÌ 5Ãʸ¶´Ù Àüü·®ÀÇ 10(º¸Á¤Ä¡) + 3% ÀçÃæÀü
	if(curTime - pPlayer->m_NaeRyukRecoverTime.lastCheckTime > dwUngiTime)
	{
		DWORD baseplus = (DWORD)(10 + maxEnergy*(0.03f)) + pPlayer->m_AbilityStats.UngiUpVal;
		DWORD plusval = (DWORD)(maxEnergy*pPlayer->GetUngiPlusRate());
		pPlayer->SetNaeRyuk(energy + baseplus + plusval);
		pPlayer->m_NaeRyukRecoverTime.lastCheckTime = curTime;
	}
}

void CCharacterCalcManager::KyungGong_NaeRyukCount(CPlayer* pPlayer, DWORD curTime,WORD KyungGongIdx)
{
	ASSERT(KyungGongIdx);
	CKyungGongInfo* pKGInfo = KYUNGGONGMGR->GetKyungGongInfo(KyungGongIdx);
	ASSERT(pKGInfo);
		
	if(curTime - pPlayer->m_KyungGongNaeRyuk_LastCheckTime > 3000)
	{
		pPlayer->ReduceNaeRyuk(pKGInfo->GetNeedNaeRyuk());
		if(pPlayer->GetNaeRyuk() == 0)
		{
			CCharMove::ForceStopKyungGong(pPlayer);
		}
		pPlayer->m_KyungGongNaeRyuk_LastCheckTime = curTime;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -