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

📄 battlesystem.cpp

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					if (pMonster->IsEudemon())
						pUser	= pTarget->QueryOwnerUser();
				}
			}
			
			if (pUser)
			{
				CTeam* pTeam = pUser->GetTeam();
				if (pTeam)
				{
					nPower	= pTeam->ShareDamage(nPower, pTarget->GetID());
				}
			}
		}
	}
	

	return nPower;
}

//////////////////////////////////////////////////////////////////////
int CBattleSystem::CalcAttackPower(IRole* pAtker, IRole* pTarget, int* pAdjustAtk/*=0*/, int* pAdjustDef/*=0*/)
{
	CHECKF(pAtker && pTarget);

	// super man status
//	IStatus* pSuperMan = pAtker->QueryStatus(STATUS_SUPERMAN);

	// get user
	CUser* pUser = NULL;
	pAtker->QueryObj(OBJ_USER, IPP_OF(pUser));

	// attack
	int nMaxRand = 50 + pAtker->GetLuck();
	int nAtk = 0;
	if(::RandGet(100) < nMaxRand)
		nAtk = pAtker->GetMaxAtk() - ::RandGet((pAtker->GetMaxAtk()-pAtker->GetMinAtk()) / 2);
	else
		nAtk = pAtker->GetMinAtk() + ::RandGet((pAtker->GetMaxAtk()-pAtker->GetMinAtk()) / 2);

	if (pUser)
	{
#ifdef _DEBUG
		pUser->SendSysMsg(_TXTATR_NORMAL, "atk org value: %d", nAtk);
#endif
	}

	nAtk	= pAtker->AdjustAttack(nAtk);
	if(pAdjustAtk)
	{
		if(*pAdjustAtk)
			nAtk = ::CutTrail(0, CRole::AdjustDataEx(nAtk, *pAdjustAtk));
		
		*pAdjustAtk = nAtk;
	}

	// defence
	int nRawDef	= pTarget->GetDef();
#ifdef _DEBUG
	if (pUser)
		pUser->SendSysMsg(_TXTATR_NORMAL, "target row def: +%d", nRawDef);
#endif

	int nDef = pTarget->AdjustDefence(nRawDef);
	if(pAtker->IsBowman())
		nDef = pTarget->AdjustBowDefence(nDef);
#ifdef	PALED_DEBUG
//	if(pSuperMan && pAtker->IsPM())
//	{
//		nAtk = pTarget->GetLife();
//		pAtker->SendSysMsg("==========必杀===========");
//	}
#endif

	if(pAdjustDef)
	{
		if(*pAdjustDef)
			nDef = ::CutTrail(0, CRole::AdjustDataEx(nDef, *pAdjustDef));
		
		*pAdjustDef	= nDef;
	}

//	if(pSuperMan)
//	{
//		nDef /= 2;
//#ifdef _DEBUG
//		if (pUser)
//			pUser->SendSysMsg(_TXTATR_NORMAL, "target def decrease to 1/2 for superman status, def=%d", nDef);
//#endif
//	}

	// damage
	int	nDamage	= nAtk - nDef;
	if (pAtker->QueryOwnerUser() && pTarget->IsMonster())
	{
		CMonster* pMonster;
		if(pTarget->QueryObj(OBJ_MONSTER, IPP_OF(pMonster)) && !pMonster->IsEquality())
			nDamage	= CBattleSystem::CalcDamageUser2Monster(nAtk, nDef, pAtker->GetLev(), pTarget->GetLev());
		nDamage = pTarget->AdjustWeaponDamage(nDamage);
		nDamage	= CBattleSystem::AdjustMinDamageUser2Monster(nDamage, pAtker, pTarget);
	}
	else if(pAtker->IsMonster() && pTarget->QueryOwnerUser())
	{
		CMonster* pMonster;
		if(pAtker->QueryObj(OBJ_MONSTER, IPP_OF(pMonster)) && !pMonster->IsEquality())
			nDamage	= CBattleSystem::CalcDamageMonster2User(nAtk, nDef, pAtker->GetLev(), pTarget->GetLev());
		nDamage = pTarget->AdjustWeaponDamage(nDamage);
		nDamage	= CBattleSystem::AdjustMinDamageMonster2User(nDamage, pAtker, pTarget);
	}
	else
	{
		nDamage	= pTarget->AdjustWeaponDamage(nDamage);
	}

	return ::CutTrail(0, nDamage);
}

//////////////////////////////////////////////////////////////////////
int	CBattleSystem::AdjustMinDamageUser2Monster(int nDamage, IRole* pAtker, IRole* pTarget)
{
	int nMinDamage = 1;
	nMinDamage += pAtker->GetLev() / 10;

	CUser* pUser;
	if(!pAtker->QueryObj(OBJ_USER, IPP_OF(pUser)))
		return ::CutTrail(nMinDamage, nDamage);

	CItem* pItem = pUser->GetWeaponR();
	if(pItem)
	{
		nMinDamage += pItem->GetQuality();
	}

	return ::CutTrail(nMinDamage, nDamage);
}

//////////////////////////////////////////////////////////////////////
int	CBattleSystem::AdjustMinDamageMonster2User(int nDamage, IRole* pAtker, IRole* pTarget)
{
	int nMinDamage = 7;

	if(nDamage >= nMinDamage || pTarget->GetLev() <= 15)
		return nDamage;

	CUser* pUser;
	if(!pTarget->QueryObj(OBJ_USER, IPP_OF(pUser)))
		return ::CutTrail(nMinDamage, nDamage);

	for(int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
	{
		switch(i)
		{
		case	ITEMPOSITION_HELMET:
		case	ITEMPOSITION_NECKLACE:
		case	ITEMPOSITION_ARMOR:
			{
				CItem* pItem = pUser->GetEquipItemByPos(i);
				if(pItem)
				{
					nMinDamage -= pItem->GetQuality() / 5;
				}
			}
			break;
		}
	}
	nMinDamage = ::CutTrail(1, nMinDamage);

	return ::CutTrail(nMinDamage, nDamage);
}

//////////////////////////////////////////////////////////////////////
int CBattleSystem::CalcDamageUser2Monster(int nAtk, int nDef, int nAtkLev, int nDefLev)
{
	if(nAtkLev > 120)
		nAtkLev = 120;

	int nDamage = nAtk-nDef;
	
	if (CMonster::GetNameType(nAtkLev, nDefLev) != NAME_GREEN)
		return ::CutTrail(0, nDamage);

	int nDeltaLev = nAtkLev - nDefLev;
	if (nDeltaLev >= 3 && nDeltaLev <= 5)
		nAtk *= 1.5;
	else if (nDeltaLev > 5 && nDeltaLev <= 10)
		nAtk *= 2;
	else if (nDeltaLev > 10 && nDeltaLev <= 20)
		nAtk *= 2.5;
	else if (nDeltaLev > 20)
		nAtk *= 3;

	return ::CutTrail(0, nAtk-nDef);


//	if(nAtkLev - nDefLev > 0)
//	{
//		int nDeltaLev = nAtkLev - nDefLev;
//		if(1<nAtkLev && nAtkLev<=19)
//		{
//			if(nDeltaLev<3)
//				nDamage=nAtk-nDef;
//			else if(3 <= nDeltaLev && nDeltaLev < 6)
//				nDamage=nAtk*1.2-nDef;
//			else
//				nDamage=nAtk*1.5-nDef;
//		}
//		else if(19<nAtkLev && nAtkLev<=49)
//		{
//			if(nDeltaLev<5)
//				nDamage=nAtk-nDef;
//			else if(5 <= nDeltaLev && nDeltaLev < 10)
//				nDamage=nAtk*1.2-nDef;
//			else
//				nDamage=nAtk*1.5-nDef;
//		}
//		else if(49<nAtkLev && nAtkLev<=85)
//		{
//			if(nDeltaLev<4)
//				nDamage=nAtk-nDef;
//			else if(4 <= nDeltaLev && nDeltaLev < 8)
//				nDamage=nAtk*1.2-nDef;
//			else
//				nDamage=nAtk*1.5-nDef;
//		}
//		else if(85<nAtkLev && nAtkLev<=112)
//		{
//			if(nDeltaLev<3)
//				nDamage=nAtk-nDef;
//			else if(3 <= nDeltaLev && nDeltaLev < 6)
//				nDamage=nAtk*1.2-nDef;
//			else
//				nDamage=nAtk*1.5-nDef;
//		}
//		else if(112<nAtkLev && nAtkLev<=120)
//		{
//			if(nDeltaLev<2)
//				nDamage=nAtk-nDef;
//			else if(2 <= nDeltaLev && nDeltaLev < 4)
//				nDamage=nAtk*1.2-nDef;
//			else
//				nDamage=nAtk*1.5-nDef;
//		}
//	}
//	else
//	{
//		nDamage=nAtk-nDef;
//	}
//
//	return ::CutTrail(0, nDamage);
}
//////////////////////////////////////////////////////////////////////
int CBattleSystem::CalcDamageMonster2User(int nAtk, int nDef, int nAtkLev, int nDefLev)
{
	if(nAtkLev > 120)
		nAtkLev = 120;

	int nDamage = nAtk-nDef;

	int nNameType = CMonster::GetNameType(nDefLev, nAtkLev);
	if (nNameType == NAME_RED)
	{
		nDamage = nAtk*1.5 - nDef;
	}
	else if (nNameType == NAME_BLACK)
	{
		int nDeltaLev = nDefLev - nAtkLev;
		if (nDeltaLev >= -10 && nDeltaLev <= -5)
			nAtk *= 2;
		else if (nDeltaLev >= -20 && nDeltaLev < -10)
			nAtk *= 3.5;
		else if (nDeltaLev < -20)
			nAtk *= 5;
		nDamage = nAtk - nDef;
	}

//	if(nAtkLev - nDefLev > 0)
//	{
//		int nDeltaLev = nDefLev-nAtkLev;
//		if(1<nAtkLev && nAtkLev<=19)
//		{
//			if(nDeltaLev<3)
//				nDamage=nAtk-nDef;
//			else if(3 <= nDeltaLev && nDeltaLev < 6)
//				nDamage=nAtk+14-nDef;
//			else
//				nDamage=nAtk+14*2-nDef;
//		}
//		else if(19<nAtkLev && nAtkLev<=49)
//		{
//			if(nDeltaLev<5)
//				nDamage=nAtk-nDef;
//			else if(5 <= nDeltaLev && nDeltaLev < 10)
//				nDamage=nAtk+50-nDef;
//			else
//				nDamage=nAtk+50*2-nDef;
//		}
//		else if(49<nAtkLev && nAtkLev<=85)
//		{
//			if(nDeltaLev<4)
//				nDamage=nAtk-nDef;
//			else if(4 <= nDeltaLev && nDeltaLev < 8)
//				nDamage=nAtk+96-nDef;
//			else
//				nDamage=nAtk+96*2-nDef;
//		}
//		else if(85<nAtkLev && nAtkLev<=112)
//		{
//			if(nDeltaLev<3)
//				nDamage=nAtk-nDef;
//			else if(3 <= nDeltaLev && nDeltaLev < 6)
//				nDamage=nAtk+140-nDef;
//			else
//				nDamage=nAtk+140*2-nDef;
//		}
//		else if(112<nAtkLev && nAtkLev<=120)
//		{
//			if(nDeltaLev<2)
//				nDamage=nAtk-nDef;
//			else if(2 <= nDeltaLev && nDeltaLev < 4)
//				nDamage=nAtk+165-nDef;
//			else
//				nDamage=nAtk+165*2-nDef;
//		}
//	}
//	else
//	{
//		nDamage=nAtk-nDef;
//	}

	return ::CutTrail(0, nDamage);
}
//////////////////////////////////////////////////////////////////////
int CBattleSystem::AdjustExp(int nDamage, int nAtkLev, int nDefLev)
{
	if(nAtkLev > 120)
		nAtkLev = 120;

	int nExp = nDamage;

	int nNameType = CMonster::GetNameType(nAtkLev, nDefLev);
	int nDeltaLev = nAtkLev - nDefLev;
	if (nNameType == NAME_GREEN)
	{
		if (nDeltaLev >= 3 && nDeltaLev <= 5)
			nExp = nExp * 70 / 100;
		else if (nDeltaLev > 5 && nDeltaLev <= 10)
			nExp = nExp * 20 / 100;
		else if (nDeltaLev > 10 && nDeltaLev <= 20)
			nExp = nExp * 10 / 100;
		else if (nDeltaLev > 20)
			nExp = nExp * 5 / 100;
	}
	else if (nNameType == NAME_RED)
	{
		nExp *= 1.3;
	}
	else if (nNameType == NAME_BLACK)
	{
		if (nDeltaLev >= -10 && nDeltaLev < -5)
			nExp *= 1.5;
		else if (nDeltaLev >= -20 && nDeltaLev < -10)
			nExp *= 1.8;
		else if (nDeltaLev < -20)
			nExp *= 2.3;
	}

	return ::CutTrail(0, nExp);
}

//////////////////////////////////////////////////////////////////////
int CBattleSystem::AdjustDrop(int nDrop, int nAtkLev, int nDefLev)
{
	if(nAtkLev > 120)
		nAtkLev = 120;

	if(nAtkLev - nDefLev > 0)
	{
		int nDeltaLev = nAtkLev - nDefLev;
		if(1<nAtkLev && nAtkLev<=19)
		{
			if(nDeltaLev<3)
				;
			else if(3 <= nDeltaLev && nDeltaLev < 6)
				nDrop=nDrop/5;
			else
				nDrop=nDrop/10;
		}
		else if(19<nAtkLev && nAtkLev<=49)
		{
			if(nDeltaLev<5)
				;
			else if(5 <= nDeltaLev && nDeltaLev < 10)
				nDrop=nDrop/5;
			else
				nDrop=nDrop/10;
		}
		else if(49<nAtkLev && nAtkLev<=85)
		{
			if(nDeltaLev<4)
				;
			else if(4 <= nDeltaLev && nDeltaLev < 8)
				nDrop=nDrop/5;
			else
				nDrop=nDrop/10;
		}
		else if(85<nAtkLev && nAtkLev<=112)
		{
			if(nDeltaLev<3)
				;
			else if(3 <= nDeltaLev && nDeltaLev < 6)
				nDrop=nDrop/5;
			else
				nDrop=nDrop/10;
		}
		else if(112<nAtkLev && nAtkLev<=120)
		{
			if(nDeltaLev<2)
				;
			else if(2 <= nDeltaLev && nDeltaLev < 4)
				nDrop=nDrop/5;
			else
				nDrop=nDrop/10;
		}
	}

	return ::CutTrail(0, nDrop);
}

⌨️ 快捷键说明

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