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

📄 objectengine.cpp

📁 此为传奇游戏源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		AddRefMsg(RM_TURN, nDir, m_nCurrX, m_nCurrY, 0, m_szName);

		m_nDirection = nDir;

		return TRUE;
	}

	return FALSE;
}

void CCharObject::WalkNextPos(int nDir, int& nX, int& nY)
{
	switch (nDir)
	{
		case DR_UP:
			nX = m_nCurrX;
			nY = m_nCurrY - 1;
			break;
		case DR_UPRIGHT:
			nX = m_nCurrX + 1;
			nY = m_nCurrY - 1;
			break;
		case DR_RIGHT:
			nX = m_nCurrX + 1;
			nY = m_nCurrY;
			break;
		case DR_DOWNRIGHT:
			nX = m_nCurrX + 1;
			nY = m_nCurrY + 1;
			break;
		case DR_DOWN:
			nX = m_nCurrX;
			nY = m_nCurrY + 1;
			break;
		case DR_DOWNLEFT:
			nX = m_nCurrX - 1;
			nY = m_nCurrY + 1;
			break;
		case DR_LEFT:
			nX = m_nCurrX - 1;
			nY = m_nCurrY;
			break;
		case DR_UPLEFT:
			nX = m_nCurrX - 1;
			nY = m_nCurrY - 1;
			break;
	}
}

BOOL CCharObject::WalkTo(int nDir)
{
	int nX, nY;

	WalkNextPos(nDir, nX, nY);

	BOOL fResult = WalkXY(nX, nY, nDir);

	if (fResult)
	{
		if (m_fFixedHideMode)
		{
           if (m_fHumHideMode)
              m_wStatusArr[STATE_TRANSPARENT] = 1;
		}
	}

	return fResult;
}

BOOL CCharObject::RunTo(int nDir)
{
	int nX = m_nCurrX, nY = m_nCurrY;
	int nWalk = 2;

	if (m_tFeatureEx.btHorse)
		nWalk = 3;

	for (int i = 0; i < nWalk; i++)
	{
		switch (nDir)
		{
			case DR_UP:
				nY--;
				break;
			case DR_UPRIGHT:
				nX++;
				nY--;
				break;
			case DR_RIGHT:
				nX++;
				break;
			case DR_DOWNRIGHT:
				nX++;
				nY++;
				break;
			case DR_DOWN:
				nY++;
				break;
			case DR_DOWNLEFT:
				nX--;
				nY++;
				break;
			case DR_LEFT:
				nX--;
				break;
			case DR_UPLEFT:
				nX--;
				nY--;
				break;
		}
		
		if (m_pMap->CanMove(nX, nY) == FALSE)
			return FALSE;
	}

	return RunXY(nX, nY, nDir); 
}

BOOL CCharObject::WalkXY(int nX, int nY, int nDir)
{
	int nFlag = m_pMap->CheckDoorEvent(nX, nY, m_nEvent);

	if (nFlag)
	{
		if (nFlag == _DOOR_OPEN)
			AddRefMsg(RM_DOOROPEN, 1, m_nEvent, 0, 0, NULL);
	}

	if (m_pMap->CanMove(nX, nY))
	{
		if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nX, nY, this))
		{
//#ifdef _DEBUG
//	_RPT4(_CRT_WARN, "WALK:%d, %d -> %d, %d", m_nCurrX, m_nCurrY, nX, nY);
//	_RPT1(_CRT_WARN, " [%d]\n", nDir); 
//#endif
			AddRefMsg(RM_WALK, nDir, m_nCurrX, m_nCurrY, 0, NULL);

			m_nCurrX		= nX;
			m_nCurrY		= nY;

			m_nDirection	= nDir;

			m_dwHealthTick	-= 20;

			return TRUE;
		}
	}

	return FALSE;
}

BOOL CCharObject::RunXY(int nX, int nY, int nDir)
{
	if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nX, nY, this))
	{
//#ifdef _DEBUG
//	_RPT4(_CRT_WARN, "RUN:%d, %d -> %d, %d", m_nCurrX, m_nCurrY, nX, nY);
//	_RPT1(_CRT_WARN, " [%d]\n", nDir); 
//#endif
		AddRefMsg(RM_RUN, nDir, m_nCurrX, m_nCurrY, 0, NULL);

		m_nCurrX		= nX;
		m_nCurrY		= nY;
		m_nDirection	= nDir;

		m_dwHealthTick	-= 150;
		m_dwSpellTick	-= 10;
		m_dwSpellTick	= _MAX(0, m_dwSpellTick);
		m_btPerHealth--;
		m_btPerSpell--;

		return TRUE;
	}

	return FALSE;
}

void CCharObject::IncHealthSpell(int nHP, int nMP)
{
	if (nHP >= 0)
	{
		if (m_WAbility.HP + nHP < m_WAbility.MaxHP)
			m_WAbility.HP += nHP;
		else 
			m_WAbility.HP = m_WAbility.MaxHP;
	}

	if (nMP >= 0)
	{
		if (m_WAbility.MP + nMP < m_WAbility.MaxMP)
			m_WAbility.MP += nMP;
		else 
			m_WAbility.MP = m_WAbility.MaxMP;
	}

	HealthSpellChanged();
}

//val : (+) dec spell
//      (-) inc spell
void CCharObject::DamageSpell(int nVal)
{
	if (nVal > 0)
	{
		if (m_WAbility.MP - nVal > 0)
			m_WAbility.MP = m_WAbility.MP - nVal;
		else
			m_WAbility.MP = 0;
	}
	else
	{
		if (m_WAbility.MP - nVal < m_WAbility.MaxMP)
			m_WAbility.MP = m_WAbility.MP - nVal;
		else
			m_WAbility.MP = m_WAbility.MaxMP;
	}
}

//nDamage : if (+) damage health
//			if (-) healing health
void CCharObject::DamageHealth(int nDamage)
{
/*	焊龋狼馆瘤 
	if BoMagicShield and (damage > 0) and (WAbil.MP > 0) then begin
      spdam := Round (damage * 1.5);
      if integer(WAbil.MP) >= spdam then begin
         WAbil.MP := WAbil.MP - spdam;
         spdam := 0;
      end else begin
         spdam := spdam - WAbil.MP;
         WAbil.MP := 0;
      end;
      damage := Round (spdam / 1.5);
      HealthSpellChanged;
   end;*/ 
	if (nDamage > 0)
	{
		if (m_WAbility.HP - nDamage > 0)
			m_WAbility.HP = m_WAbility.HP - nDamage;
		else
			m_WAbility.HP = 0;
	}
	else
	{
		if (m_WAbility.HP - nDamage < m_WAbility.MaxHP)
			m_WAbility.HP = m_WAbility.HP - nDamage;
		else
			m_WAbility.HP = m_WAbility.MaxHP;
	}
}

int CCharObject::GetMagStruckDamage(int nDamage)
{
	int nArmor = 0;

	if ((HIBYTE(m_WAbility.MAC) - LOBYTE(m_WAbility.MAC) + 1) > 0)
		nArmor = LOBYTE(m_WAbility.MAC) + (rand() % (HIBYTE(m_WAbility.MAC) - LOBYTE(m_WAbility.MAC) + 1));
	else
		nArmor = LOBYTE(m_WAbility.MAC);

	nDamage	= _MAX(0, nDamage - nArmor);

	if (nDamage > 0)
	{
		if (m_fAbilMagBubbleDefence) // 林贱狼阜
		{
			nDamage = ROUND(nDamage / 100 * (m_btMagBubbleDefenceLevel + 2) * 8);
			DamageBubbleDefence();
		}
	}										  

	return nDamage;
}

void CCharObject::StruckDamage(int nDamage)
{
	if (nDamage > 0)
	{
		BOOL	fReCalc = FALSE;
		int		wDam = (rand() % 10) + 5;

		if (m_wStatusArr[POISON_DAMAGEARMOR] > 0)
		{
			wDam	= ROUND(wDam * 1.2);
			nDamage	= ROUND(nDamage * 1.2);
		}

		if (m_pUserInfo)
		{
			_LPTUSERITEMRCD	lptDress = m_pUserInfo->GetDress();

			if (lptDress)
			{
				int nDura		= lptDress->nDura;
				int nOldDura	= ROUND(nDura / 1000);
				
				nDura	-= wDam;

				if (nDura <= 0)	// 粹酒 绝绢咙
				{
					lptDress->nDura = nDura = 0;

//               hum.SendDelItem (UseItems[U_DRESS]); //努扼捞攫飘俊 绝绢柳芭 焊晨
					m_pUserInfo->SetEmptyDress();

					AddProcess(this, RM_DURACHANGE, U_DRESS, nDura, lptDress->nDuraMax, 0); 
					AddProcess(this, RM_FEATURECHANGED, 0, GetFeatureToLong(), 0, 0);
					
					fReCalc = TRUE;
				}
				else
					lptDress->nDura = nDura;

				if (nOldDura != ROUND(nDura / 1000))
					AddProcess(this, RM_DURACHANGE, U_DRESS, lptDress->nDura, lptDress->nDuraMax, 0); 
			}

			_LPTUSERITEMRCD	lptUseItem;

			for (int i = 0; i < 8; i++)
			{
				lptUseItem = m_pUserInfo->GetUseItem(i);

				if (lptUseItem && (rand() % 8) == 0)
				{
					int nDura		= lptUseItem->nDura;
					int nOldDura	= ROUND(nDura / 1000);
					
					nDura	-= wDam;

					if (nDura <= 0)	// 粹酒 绝绢咙
					{
						lptUseItem->nDura = nDura = 0;

	//               hum.SendDelItem (UseItems[U_DRESS]); //努扼捞攫飘俊 绝绢柳芭 焊晨
						m_pUserInfo->SetEmptyUseItem(i);

						AddProcess(this, RM_DURACHANGE, i, nDura, lptUseItem->nDuraMax, 0); 
						AddProcess(this, RM_FEATURECHANGED, 0, GetFeatureToLong(), 0, 0);

						fReCalc = TRUE;
					}
					else
						lptUseItem->nDura = nDura;

					if (nOldDura != ROUND(nDura / 1000))
						AddProcess(this, RM_DURACHANGE, i, lptUseItem->nDura, lptUseItem->nDuraMax, 0); 
				}
			}
		}

		if (fReCalc && m_pUserInfo)
			((CPlayerObject*)this)->RecalcAbilitys();

		DamageHealth(nDamage);
	}
}

int CCharObject::GetHitStruckDamage(int nDamage)
{
	int nArmor;
	int nRnd = ((HIBYTE(m_WAbility.AC) - LOBYTE(m_WAbility.AC)) + 1);

	if (nRnd > 0)
		nArmor = LOBYTE(m_WAbility.AC) + (rand() % nRnd);
	else
		nArmor = LOBYTE(m_WAbility.AC);

	nDamage = _MAX(0, nDamage - nArmor);

	if (nDamage > 0)
	{
		if (m_fAbilMagBubbleDefence) // 林贱狼阜
		{
			nDamage = ROUND(nDamage / 100 * (m_btMagBubbleDefenceLevel + 2) * 8);
			DamageBubbleDefence();
		}
	}										  

	return nDamage;
}

int CCharObject::GetAttackPower(int nDamage, int nVal)
{
	int nPower = 0;

	if (nVal < 0) nVal = 0;

//	if (Lucky > 0)
//	{
//	}
//	else
//	{
		nPower = nDamage + (rand() % (nVal + 1));
//	}

	return nPower;
/*var
   v1, v2: integer;
begin
   if val < 0 then val := 0;
   if Luck > 0 then begin
      if Random(10 - _MIN(9,Luck)) = 0 then Result := damage + val //青款牢版快
      else Result := damage + Random(val + 1);
   end else begin
      Result := damage + Random(val + 1);
      if Luck < 0 then begin
         if Random(10 - _MAX(0,-Luck)) = 0 then Result := damage;  //阂款牢版快
      end;
   end; */
}

void CCharObject::DoDamageWeapon(int nDamage)
{
	if (m_pUserInfo)
	{
		_LPTUSERITEMRCD	lptWeapon = m_pUserInfo->GetWeapon();

		if (lptWeapon)
		{
			int nDura		= lptWeapon->nDura;
			int nOldDura	= ROUND(nDura / 1000);
			
			nDura	-= nDamage;

			if (nDura <= 0)	// 粹酒 绝绢咙
			{
				lptWeapon->nDura = nDura = 0;
//               hum.SendDelItem (UseItems[U_DRESS]); //努扼捞攫飘俊 绝绢柳芭 焊晨

				((CPlayerObject*)this)->RecalcAbilitys();

				m_pUserInfo->SetEmptyWeapon();

				AddProcess(this, RM_DURACHANGE, U_WEAPON, nDura, lptWeapon->nDuraMax, 0); 
			}
			else
				lptWeapon->nDura = nDura;

			if (nOldDura != ROUND(nDura / 1000))
				AddProcess(this, RM_DURACHANGE, U_WEAPON, lptWeapon->nDura, lptWeapon->nDuraMax, 0); 
		}
	}
}

BOOL CCharObject::_Attack(WORD wHitMode, CCharObject* pObject)
{
	int nPower	= GetAttackPower(LOBYTE(m_WAbility.DC), (HIBYTE(m_WAbility.DC) - LOBYTE(m_WAbility.DC)));
	int nSecPwr	= 0;
	int nWeaponDamage;

	if (pObject)
	{
		if (wHitMode == CM_POWERHIT && m_pUserInfo->m_fPowerHitSkill)
		{
			m_pUserInfo->m_fPowerHitSkill = FALSE;
			nPower += m_btHitPlus;
		}

		if (wHitMode == CM_FIREHIT && m_pUserInfo->m_fFireHitSkill)
		{
			m_pUserInfo->m_fFireHitSkill = FALSE;
			
			nPower += ROUND(nPower / 100 * (m_nHitDouble * 10));
		}
	}
	else
	{
		if (wHitMode == CM_POWERHIT && m_pUserInfo->m_fPowerHitSkill)
		{
			m_pUserInfo->m_fPowerHitSkill = FALSE;
			nPower += m_btHitPlus;
		}
	}

	if (wHitMode == CM_LONGHIT)
	{
		nSecPwr	= 0;

		if (m_pUserInfo->m_lpTMagicErgumSkill)
			nSecPwr = ROUND(nPower / (3/*MaxTrainLevel*/ + 2) * (m_pUserInfo->m_lpTMagicErgumSkill->btLevel + 2));
		else
			nSecPwr = nPower;

		if (nSecPwr > 0)
			SwordLongAttack(nSecPwr);
	}

	if (wHitMode == CM_WIDEHIT)
	{
		nSecPwr	= 0;

		if (m_pUserInfo->m_lpTMagicBanwolSkill)
			nSecPwr = ROUND(nPower / (3/*MaxTrainLevel*/ + 10) * (m_pUserInfo->m_lpTMagicBanwolSkill->btLevel + 2));
		else
			nSecPwr = nPower;

		if (nSecPwr > 0)
			SwordWideAttack(nSecPwr);
	}

	if (pObject)
	{
		if (IsProperTarget(pObject))
		{
			if (pObject->m_btHitPoint > 0)
			{
				if (m_btHitPoint < rand() % pObject->m_btSpeedPoint)
					nPower = 0;
			}
		}
		else
			nPower = 0;
	}	

	if (nPower > 0)
	{
		nPower			= pObject->GetHitStruckDamage(nPower);
		nWeaponDamage	= (rand() % 5) + 2 - m_AddAbility.WeaponStrong;
	
/*		if (m_wObjectType & _OBJECT_HUMAN)
		{
				case CM_FIREHIT:
				{
					if (m_pUserInfo->m_lpTMagicFireSwordSkill)
						nSecPwr = _ROUND(nPwr / (3 + 2) * (m_pUserInfo->m_lpTMagicFireSwordSkill->btLevel + 2));
					else
						nSecPwr = nPower;

					break;

⌨️ 快捷键说明

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