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

📄 objectengine.cpp

📁 此为传奇游戏源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				}		  
		}
*/
		if (nWeaponDamage > 0)
		{
			if (m_pUserInfo->GetWeapon()) 
				DoDamageWeapon(nWeaponDamage);
		}

		if (nPower > 0)
		{
			pObject->StruckDamage(nPower);

			// Debug Code
#ifdef _DEBUG
			char szMsg[64];

			if (m_wObjectType & _OBJECT_HUMAN)
			{
				sprintf(szMsg, "%s 嘎澜 - PW:%d HP:%d, 公扁郴备粹澜:%d", pObject->m_szName, nPower, pObject->m_WAbility.HP, nWeaponDamage);
				SysMsg(szMsg, 0);
			}
			else if (pObject->m_wObjectType & _OBJECT_HUMAN)
			{
				sprintf(szMsg, "%s 嘎澜 - PW:%d HP:%d", pObject->m_szName, nPower, pObject->m_WAbility.HP);
				pObject->SysMsg(szMsg, 0);
			}
			// Debug Code
#endif

			AddDelayProcess(pObject, RM_STRUCK, nPower, pObject->m_WAbility.HP, pObject->m_WAbility.MaxHP, (LONG)this, NULL, 550);

			if (!(pObject->m_wObjectType & _OBJECT_HUMAN))
				pObject->AddProcess(pObject, RM_STRUCK, nPower, pObject->m_WAbility.HP, pObject->m_WAbility.MaxHP, (LONG)this, NULL);

			return TRUE;
		}
	}

	return FALSE;
}									   

BOOL CCharObject::HitXY(WORD wIdent, int nX, int nY, int nDir, int nHitStyle)
{
	if ((GetTickCount() - m_dwLatestHitTime) < 600)
		m_nHitTimeOverCount++;
	else
		m_nHitTimeOverCount = 0;

	if (m_nHitTimeOverCount < 2)
	{
		if (m_nCurrX == nX && m_nCurrY == nY)
		{
			if (wIdent == CM_WIDEHIT && m_pUserInfo->m_lpTMagicBanwolSkill)
			{
				if (m_WAbility.MP > 0)
				{
					int nLevel		= m_pUserInfo->GetMagicRcdByID(_SKILL_BANWOL)->btLevel;
					int nSpellPoint = GetMagicInfo(_SKILL_BANWOL)->GetSpellPoint(nLevel);
					DamageSpell(nSpellPoint);
					HealthSpellChanged();
				}
				else
					wIdent = CM_HIT;
			}

			m_nDirection		= nDir;
			m_dwLatestHitTime	= GetTickCount();

			CCharObject* pObject = GetFrontObject();

			if (pObject)
			{
				if (_Attack(wIdent, pObject))
				{
					SelectTarget(pObject);

					m_dwHealthTick	-= 100;
					m_dwSpellTick	-= 100;
					m_dwSpellTick	= _MAX(0, m_dwSpellTick);
					m_btPerHealth	-= 2;
					m_btPerSpell	-= 2;
				}
			}

			if (m_wObjectType & _OBJECT_HUMAN)
			{
				switch (wIdent)
				{
					case CM_HIT:
						AddRefMsg(RM_HIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
						break;
					case CM_WIDEHIT:
						AddRefMsg(RM_WIDEHIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
						break;
					case CM_LONGHIT:
						AddRefMsg(RM_LONGHIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
						break;
					case CM_FIREHIT:
						AddRefMsg(RM_FIREHIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
						break;
					case CM_POWERHIT:
						AddRefMsg(RM_POWERHIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
						break;
				}
			}

			if (m_pUserInfo->m_lpTMagicPowerHitSkill)		// 抗档 八过
			{
				m_pUserInfo->m_btAttackSkillCount--;

				if (m_pUserInfo->m_btAttackSkillCount == m_pUserInfo->m_btAttackSkillPointCount)
				{
					m_pUserInfo->m_fPowerHitSkill = TRUE;
					SendSocket(NULL, "+PWR");
				}

				if (m_pUserInfo->m_btAttackSkillCount <= 0)
				{
					m_pUserInfo->m_btAttackSkillCount		= 7 - m_pUserInfo->m_lpTMagicPowerHitSkill->btLevel;
					m_pUserInfo->m_btAttackSkillPointCount	= rand() % m_pUserInfo->m_btAttackSkillCount;
				}
			}

			return TRUE;
		}
	}

	return FALSE;
}

void CCharObject::DoPushed(int nDirection)
{
	int nFrontX, nFrontY;

	m_nDirection = nDirection;

	GetFrontPosition(nFrontX, nFrontY);

	if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nFrontX, nFrontY, this))
	{
		AddRefMsg(RM_PUSH, GetBack(nDirection), m_nCurrX, m_nCurrY, 0, NULL);

		m_nCurrX = nFrontX;
		m_nCurrY = nFrontY;
	}
}

void CCharObject::GoldChanged()
{
	if (m_wObjectType & _OBJECT_HUMAN)
		UpdateProcess(this, RM_GOLDCHANGED, 0, 0, 0, 0, NULL);
}

void CCharObject::HealthSpellChanged()
{
	if (m_wObjectType & _OBJECT_HUMAN)
		UpdateProcess(this, RM_HEALTHSPELLCHANGED, 0, 0, 0, 0, NULL);

	if (m_fOpenHealth)
		AddRefMsg(RM_HEALTHSPELLCHANGED, 0, 0, 0, 0, NULL);
}

CCharObject* CCharObject::AddCreatureSysop(int nX, int nY, CMonRaceInfo* pMonRaceInfo, BOOL fSearch)
{
	CMonsterObject* pMonObject = AddCreature(m_pMap, nX, nY, pMonRaceInfo->nIndex, fSearch);

	if (pMonObject)
	{
		if (g_pMonGenInfo)
			g_pMonGenInfo[g_nNumOfMonGenInfo].xMonsterObjList.AddNewNode(pMonObject);
	}

	return (CCharObject*)pMonObject;
}

void CCharObject::DoMotaebo()
{
	int nFrontX, nFrontY;

	CCharObject* pCharObject = GetFrontObject();

	if (pCharObject)
	{
		for (int i = 0; i < 5; i++)
		{
			pCharObject->DoPushed(m_nDirection);

			GetFrontPosition(nFrontX, nFrontY);
			
			if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nFrontX, nFrontY, this))
			{
				AddRefMsg(RM_RUSH, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);

				m_nCurrX		= nFrontX;
				m_nCurrY		= nFrontY;

				if (!(pCharObject = GetFrontObject()))
					break;
			}
			else 
				break;
		}
	}
	else
	{
		for (int i = 0; i < 5; i++)
		{
			GetFrontPosition(nFrontX, nFrontY);
			
			if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nFrontX, nFrontY, this))
			{
				AddRefMsg(RM_RUSH, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);

				m_nCurrX		= nFrontX;
				m_nCurrY		= nFrontY;
			}
			else
				break;
		}
	}
}

/* **************************************************************************************

										沤扁颇楷

   ************************************************************************************** */

BOOL CCharObject::DoShowHP(CCharObject* pObject, CMagicInfo* pMagicInfo, int nLevel)
{
	if (pObject)
	{
		if (!pObject->m_fOpenHealth)
		{
			if ((rand() % 6) <= (3 + m_Ability.Level))
			{
				pObject->m_dwOpenHealthStart	= GetTickCount();
				pObject->m_dwOpenHealthTime		= pMagicInfo->GetPower13(30 + GetRPow(m_WAbility.SC) * 2, nLevel) * 1000;
				
				pObject->AddDelayProcess(pObject, RM_DOOPENHEALTH, 0, 0, 0, 0, NULL, 3000);

				return TRUE;
			}
		}
	}

	return FALSE;
}

void CCharObject::MakeOpenHealth()
{
	m_fOpenHealth		= TRUE;
   
	m_nCharStatusEx		|= STATE_OPENHEATH;
	m_nCharStatus		= GetCharStatus();
   
	AddRefMsg(RM_OPENHEALTH, 0, m_WAbility.HP/*lparam1*/, m_WAbility.MaxHP/*lparam2*/, 0, NULL);
}

void CCharObject::BreakOpenHealth()
{
	m_fOpenHealth		= FALSE;
   
	m_nCharStatusEx		^= STATE_OPENHEATH;
	m_nCharStatus		= GetCharStatus();
   
	AddRefMsg(RM_CLOSEHEALTH, 0, 0, 0, 0, NULL);
}

/* **************************************************************************************

										公怕焊

   ************************************************************************************** */

int CCharObject::CharPushed(int nDir, int nPushCount)
{
	int nFrontX, nFrontY;
	int nResult = 0;

	for (int i = 0; i < nPushCount; i++)
	{
		GetFrontPosition(nFrontX, nFrontY);

		if (m_pMap->CanMove(nFrontX, nFrontY, FALSE))
		{
			if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nFrontX, nFrontY, this))
			{
				m_nCurrX = nFrontX;
				m_nCurrY = nFrontY;

				AddRefMsg(RM_PUSH, GetBack(nDir), m_nCurrX, m_nCurrY, 0, NULL);

				nResult++;
			}
		}
	}

	m_nDirection = GetBack(nDir);

	return nResult;

/*function  TCreature.CharPushed (ndir, pushcount: integer): integer;  //绢恫 塞俊 狼秦辑 剐妨唱促.
var
   i, nx, ny, olddir, oldx, oldy: integer;
begin
   Result := 0;
   olddir := Dir;
   oldx := CX;
   oldy := CY;
   Dir := ndir;
   for i:=0 to pushcount-1 do begin
      GetFrontPosition (self, nx, ny);
      if PEnvir.CanWalk (nx, ny, FALSE{扳魔倾侩救窃}) then begin
         if PEnvir.MoveToMovingObject (CX, CY, self, nx, ny, FALSE) > 0 then begin
            CX := nx;
            CY := ny;
            SendRefMsg (RM_PUSH, GetBack(ndir), CX, CY, 0, '');
            Inc (Result);
            if RaceServer >= RC_ANIMAL then
               WalkTime := WalkTime + 800; //剐府搁辑 词霸 锭赴促.
         end else
            break;
      end else
         break;
   end;
   Dir := GetBack(ndir); //olddir;
end;
*/
}

/* **************************************************************************************

										拳堪浅

   ************************************************************************************** */

int CCharObject::MagPushArround(int nPushLevel)
{
	int nLevelGap, nPush,nDir;
	int nResult = 0;

	if (m_xVisibleObjectList.GetCount())
	{
		PLISTNODE		pListNode = m_xVisibleObjectList.GetHead();
		CVisibleObject*	pVisibleObject;

		while (pListNode)
		{
			if (pVisibleObject = m_xVisibleObjectList.GetData(pListNode))
			{
				if (abs(m_nCurrX - pVisibleObject->pObject->m_nCurrX) <= 1 && abs(m_nCurrY - pVisibleObject->pObject->m_nCurrY) <= 1)
				{
					if (!pVisibleObject->pObject->m_fIsDead && pVisibleObject->pObject != this)
					{
						if (m_Ability.Level > pVisibleObject->pObject->m_Ability.Level)
						{
							nLevelGap = m_Ability.Level - pVisibleObject->pObject->m_Ability.Level;
							
							if ((rand() % 20) < 6 + nPushLevel * 3 + nLevelGap)
							{
								if (IsProperTarget(pVisibleObject->pObject))
								{
									nPush	= 1 + _MAX(0, nPushLevel - 1) + rand() % 2;
									nDir	= GetNextDirection (pVisibleObject->pObject->m_nCurrX, pVisibleObject->pObject->m_nCurrY);
									pVisibleObject->pObject->CharPushed(nDir, nPush);
									nResult++;
								}
							}
						}
					}
				}
			} // if (pVisibleObject = m_xVisibleObjectList.GetData(pListNode))
			
			pListNode = m_xVisibleObjectList.GetNext(pListNode);
		} // while (pListNode)
	}

	return nResult;

/*function  TMagicManager.MagPushArround (user: TCreature; pushlevel: integer): integer;
var
   i, ndir, levelgap, push: integer;
   cret: TCreature;
begin
   Result := 0;
   for i:=0 to user.VisibleActors.Count-1 do begin
      cret := TCreature (PTVisibleActor(user.VisibleActors[i]).cret);
      if (abs(user.CX-cret.CX) <= 1) and (abs(user.CY-cret.CY) <= 1) then begin
         if (not cret.Death) and (cret <> user) then begin
            if (user.Abil.Level > cret.Abil.Level) and (not cret.StickMode) then begin
               levelgap := user.Abil.Level - cret.Abil.Level;
               if (Random(20) < 6+pushlevel*3+levelgap) then begin  //荐访沥档俊 蝶扼辑
                  if user.IsProperTarget(cret) then begin
                     push := 1 + _MAX(0,pushlevel-1) + Random(2);
                     ndir := GetNextDirection (user.CX, user.CY, cret.CX, cret.CY);
                     cret.CharPushed (ndir, push);
                     Inc (Result);
                  end;
               end;
            end;
         end;
      end;
   end;
end;
*/
}

/* **************************************************************************************

										堪荤厘, 汾牢厘

   ************************************************************************************** */

int CCharObject::MagPassThroughMagic(int nStartX, int nStartY, int nTargetX, int nTargetY, int nDir, int nPwr, BOOL fUndeadAttack)
{
	int				nResult = 0;
	CCharObject*	pObject;

	for (int i = 0; i < 12; i++)
	{
		pObject = m_pMap->GetObject(nStartX, nStartY);

		if (pObject)
		{
			if (IsProperTarget(pObject))
			{
				if (pObject->m_btAntiMagic <= rand() % 10)
				{
					if (fUndeadAttack)
						nPwr = ROUND(nPwr * 1.5);

					pObject->AddDelayProcess(this, RM_MAGSTRUCK, 0, nPwr, 0, 0, NULL, 600);

					nResult++;
				}
			}
		}

		if (!((abs(nStartX - nTargetX) <= 0) && (abs(nStartY - nTargetY) <= 0)))
		{
			nDir = GetNextDirection(nStartX, nStartY, nTargetX, nTargetY);

			if (!(GetNextPosition(nStartX, nStartY, nDir, 1, nStartX, nStartY)))
				break;
		}
		else
			break;
	}

	return nResult;
/*
function  TCreature.MagPassThroughMagic (sx, sy, tx, ty, ndir, magpwr: integer; undeadattack: Boolean): integer;
var
   i, tcount, acpwr: integer;
   cret: TCreature;
begin
   tcount := 0;
   for i:=0 to 12 do begin
      cret := TCreature (PEnvir.GetCreature (sx, sy, TRUE));
      if cret <> nil then begin
         //if (RaceServer = RC_USERHUMAN) and (cret.RaceServer = RC_USERHUMAN) and ((cret.InSafeZone) or (InSafeZone)) then
         //   continue;  //救傈瘤措
         if IsProperTarget (cret) then begin
            if cret.AntiMagic <= Random(10) then begin  //付过 雀乔啊 乐澜
               if undeadattack then  //攫单靛 阁胶磐俊霸 傍拜仿 碍拳牢 版快
                  acpwr := Round (magpwr * 1.5)
               else
                  acpwr := magpwr;
               cret.SendDelayMsg (self, RM_MAGSTRUCK, 0, acpwr, 0, 0, '', 600);
               Inc (tcount);
            end;
         end;
      end;
      if not ((abs(sx-tx) <= 0) and (abs(sy-ty) <= 0)) then begin
         ndir := GetNextDirection (sx, sy, tx, ty);
         if not GetNextPosition (PEnvir, sx, sy, ndir, 1, sx, sy) then
            break;
      end else
         break;
   end;
   Result := tcount;
end; */
}

/* **************************************************************************************

										林贱狼阜

   ************************************************************************************** */

BOOL CCharObject::MagBubbleDefenceUp(int nLevel, int nSec)
{
	if (m_wStatusArr[STATE_BUBBLEDEFENCEUP] == 0)
	{
		UINT nOldStatus = m_nCharStatus;

		m_wStatusArr[STATE_BUBBLEDEFENCEUP]		= (WORD)nSec; 
		m_dwStatusTime[STATE_BUBBLEDEFENCEUP]	= GetTickCount();

		m_nCharStatus = GetCharStatus();

		if (nOldStatus != m_nCharStatus)
			AddRefMsg(RM_CHARSTATUSCHANGED, m_sHitSpeed/*wparam*/, m_nCharStatus, 0, 0, NULL);

		m_fAbilMagBubbleDefence		= TRUE;
		m_btMagBubbleDefenceLevel	= nLevel;

		return TRUE;
	}

	return FALSE;
}

void CCharObject::DamageBubbleDefence()
{
	if (m_wStatusArr[STATE_BUBBLEDEFENCEUP] > 0)
	{
		if (m_wStatusArr[STATE_BUBBLEDEFENCEUP] > 3)
			m_wStatusArr[STATE_BUBBLEDEFENCEUP] -= 3;
		else
			m_wStatusArr[STATE_BUBBLEDEFENCEUP] = 1;
	}
}

/* **************************************************************************************

										瘤堪贱

   *************************************

⌨️ 快捷键说明

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