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

📄 objectmonster.cpp

📁 此为传奇游戏源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
{
	int nSX, nSY, nTX, nTY;
	int nPwr;

	m_nDirection = nDir;

	AddRefMsg(RM_LIGHTING, 1, m_nCurrX, m_nCurrY, (int)m_pTargetObject, NULL);

	if (GetNextPosition(nDir, 1, nSX, nSY))
	{
		GetNextPosition(nDir, 1, nTX, nTY);
		nPwr = LOBYTE(m_WAbility.DC) + rand() % HIBYTE(m_WAbility.DC) - LOBYTE(m_WAbility.DC) + 1;
		MagPassThroughMagic(nSX, nSY, nTX, nTY, nDir, nPwr, TRUE);

		BreakHolySeize();
	}
}

void CLightingZombiObject::Run()
{
	if (!m_fIsDead && !m_fIsGhost && m_wStatusArr[POISON_STONE] == 0)
	{
		if ((GetTickCount() - m_dwSearchEnemyTime > 8000) || ((GetTickCount() - m_dwSearchEnemyTime > 1000) && !m_pTargetObject))
		{
			m_dwSearchEnemyTime = GetTickCount();
			MonsterNormalAttack();
		}

		if (GetTickCount() - m_dwWalkTime > m_dwNextWalkTime)
		{
			if (m_pTargetObject)
			{
				if ((abs(m_nCurrX - m_pTargetObject->m_nCurrX) <= 4) && (abs(m_nCurrY - m_pTargetObject->m_nCurrY) <= 4))
				{
					if ((abs(m_nCurrX - m_pTargetObject->m_nCurrX) <= 2) && (abs(m_nCurrY - m_pTargetObject->m_nCurrY) <= 2))
					{
						if (rand() % 3 != 0)
						{
							CMonsterObject::Run();
							return;
						}
					}

					GetBackPosition(m_nTargetX, m_nTargetY);
				}
			}
		}

		if (m_pTargetObject)
		{
			if ((abs(m_nCurrX - m_pTargetObject->m_nCurrX) < 6) && (abs(m_nCurrY - m_pTargetObject->m_nCurrY) < 6))
			{
				if (GetTickCount() - m_dwHitTime > m_dwNextHitTime)
				{
					m_dwHitTime = GetTickCount();
					LightingAttack(GetNextDirection(m_pTargetObject->m_nCurrX, m_pTargetObject->m_nCurrY));
				}
			}
		}
	}

	CMonsterObject::Run();
}

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


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

void CRonObject::AroundAttack()
{
	CWHList<CCharObject*>	xTargetList;

	m_nDirection = (int)m_btTargetDir;

	m_pMap->GetMapObject(m_nCurrX, m_nCurrY, 1, &xTargetList);

	if (xTargetList.GetCount())
	{
		PLISTNODE		pListNode = xTargetList.GetHead();
		CCharObject*	pTargetObject;

		while (pListNode)
		{
			if (pTargetObject = xTargetList.GetData(pListNode))
				_Attack(CM_HIT, pTargetObject);
		
			pListNode = xTargetList.RemoveNode(pListNode);
		}
	}

	AddRefMsg(RM_HIT, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);
}

void CRonObject::Run()
{	 
	if (!m_fIsDead && !m_fIsGhost && m_wStatusArr[POISON_STONE] == 0)
	{
		if ((GetTickCount() - m_dwSearchEnemyTime > 8000) || ((GetTickCount() - m_dwSearchEnemyTime > 1000) && !m_pTargetObject))
		{
			m_dwSearchEnemyTime = GetTickCount();
			MonsterNormalAttack();
		}

		if (m_pTargetObject)
		{
			if ((abs(m_nCurrX - m_pTargetObject->m_nCurrX) < 6) && (abs(m_nCurrY - m_pTargetObject->m_nCurrY) < 6))
			{
				if (GetTickCount() - m_dwHitTime > m_dwNextHitTime)
				{
					m_dwHitTime = GetTickCount();
					AroundAttack();
				}
			}
		}
	}

	CMonsterObject::Run();
}

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

		窍鞭 穿付

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

void CMinorNumaObject::Run()
{	 
	if (!m_fIsDead)
	{
		if ((GetTickCount() - m_dwSearchEnemyTime > 8000) || ((GetTickCount() - m_dwSearchEnemyTime > 1000) && !m_pTargetObject))
		{
			m_dwSearchEnemyTime = GetTickCount();
			MonsterNormalAttack();
		}
	}

	CMonsterObject::Run();	
}

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

		坷付 矫府令 

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

void COmaObject::Run()
{	 
	if (!m_fIsDead && !m_fIsGhost)
	{
		if ((GetTickCount() - m_dwSearchEnemyTime > 8000) || ((GetTickCount() - m_dwSearchEnemyTime > 1000) && !m_pTargetObject))
		{
			m_dwSearchEnemyTime = GetTickCount();
			MonsterNormalAttack();
		}
	}

	CMonsterObject::Run();	
}

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

		榜伐(籍厘牢)

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

CRockManObject::CRockManObject()
{
//	m_dwSearchTick = 2500 + rand() % 1500;
//	m_dwSearchTime = GetTickCount();

	m_fHideMode = TRUE;
}

void CRockManObject::Run()
{	 
	if (!m_fIsDead && !m_fIsGhost)
	{
		if (m_fHideMode)
		{
			if (CheckComeOut(8))
				ComeOut();

			m_dwWalkTime = GetTickCount() + 1000;
		}
		else
		{
			if ((GetTickCount() - m_dwSearchEnemyTime > 8000) || ((GetTickCount() - m_dwSearchEnemyTime > 1000) && !m_pTargetObject))
			{
				m_dwSearchEnemyTime = GetTickCount();
				MonsterNormalAttack();

				if (!m_pTargetObject)
					ComeDown();
			}
		}
	}

	CMonsterObject::Run();
}

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

		侥牢檬

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

CStickObject::CStickObject()
{
	m_dwSearchTick	= 2500 + rand() % 1500;

	m_fHideMode = TRUE;
}

void CStickObject::Run()
{	 
	if (!m_fIsDead && !m_fIsGhost)
	{
		if (GetTickCount() - m_dwWalkTime > m_dwNextWalkTime)
		{
			m_dwWalkTime = GetTickCount();

			if (m_fHideMode)
			{
				if (CheckComeOut(4))
					ComeOut();
			}
			else
			{
				if (m_pTargetObject)
				{
					if (abs(m_nCurrX - m_pTargetObject->m_nCurrX) > 4 &&  abs(m_nCurrY - m_pTargetObject->m_nCurrY) > 4)
					{
						ComeDown();
						return;
					}
				}
				
				if (GetTickCount() - m_dwHitTime > m_dwNextHitTime)
					MonsterNormalAttack();
				
				if (!m_fHideMode)
				{
					if (AttackTarget())
						CMonsterObject::Run();
				}
			}
		}
	}

	CMonsterObject::Run();
}

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

		葛贰 鲍拱(荤锄)

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

CSandMobObject::CSandMobObject()
{
	m_fHideMode = TRUE;
}

void CSandMobObject::Run()
{	 
	if (!m_fIsDead && !m_fIsGhost)
	{
		if (GetTickCount() - m_dwWalkTime > m_dwNextWalkTime)
		{
			m_dwWalkTime = GetTickCount();

			if (m_fHideMode)
			{
				if ((m_WAbility.HP > (m_WAbility.MaxHP / 20) && CheckComeOut(8)))
					m_dwAppearStart = GetTickCount();
			}
			else
			{
				if ((m_WAbility.HP > 0) && (m_WAbility.HP < (m_WAbility.MaxHP / 20)) && (GetTickCount() - m_dwAppearStart > 3000))
					ComeDown();
				else if (m_pTargetObject)
				{
					if (abs(m_nCurrX - m_pTargetObject->m_nCurrX) > 15 &&  abs(m_nCurrY - m_pTargetObject->m_nCurrY) > 15)
					{
						ComeDown();
						return;
					}
				}
				
				if (GetTickCount() - m_dwHitTime > m_dwNextHitTime)
					MonsterNormalAttack();
				
				if (!m_fHideMode)
				{
					if (AttackTarget())
					{
						CMonsterObject::Run();
					}
				}
			}
		}
	}

	CMonsterObject::Run();
}

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

		归榜

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

CWhiteSkeleton::CWhiteSkeleton()
{
//	m_dwSearchTick = 2500 + rand() % 1500;
//	m_dwSearchTime = GetTickCount();
	m_fIsFirst	= TRUE;
	m_fHideMode = TRUE;
}

void CWhiteSkeleton::ResetSkeleton()
{
//   NextHitTime := 3000 - (SlaveMakeLevel * 600);
//   NextWalkTime := 1200 - (SlaveMakeLevel * 250);
	m_dwWalkTime = GetTickCount() + 2000;	
}

void CWhiteSkeleton::Run()
{	 
	if (m_fIsFirst)
	{
		m_fIsFirst		= FALSE;
		m_nDirection	= 5;
		m_fHideMode		= FALSE;
		AddRefMsg(RM_DIGUP, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);
		ResetSkeleton();
	}

	CGenneralMonObject::Run();
}

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

		脚荐 (锅脚傈)

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

CElfMonster::CElfMonster()
{
	m_fNoAttackMode = TRUE;
	m_fIsFirst		= TRUE;
	m_fHideMode		= TRUE;
}

void CElfMonster::ResetElfMon()
{
//   NextHitTime := 3000 - (SlaveMakeLevel * 600);
//   NextWalkTime := 1200 - (SlaveMakeLevel * 250);
	m_dwWalkTime = GetTickCount() + 2000;	
}

void CElfMonster::AppearNow()
{
	m_fIsFirst		= FALSE;
	m_fHideMode		= FALSE;

	m_dwWalkTime = GetTickCount() + 800;
/*procedure TElfMonster.AppearNow;
begin
   bofirst := FALSE;
   HideMode := FALSE;
   //SendRefMsg (RM_TURN, Dir, CX, CY, 0, '');
   //Appear;
   //ResetElfMon;
   RecalcAbilitys;
   WalkTime := WalkTime + 800; //函脚饶 距埃 掉饭捞 乐澜
end;
*/
}

void CElfMonster::Run()
{	 
	if (m_fIsFirst)
	{
		m_fIsFirst		= FALSE;
		m_fHideMode		= FALSE;
		AddRefMsg(RM_DIGUP, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);
		ResetElfMon();
	}

	if (m_fIsDead)
	{
		if (GetTickCount() - m_dwDeathTime > 2 * 1000)
			MakeGhost();
	}
	else
	{
		BOOL fChangeFace = FALSE;

		if (m_pTargetObject)
			fChangeFace = TRUE;

		if (m_pMasterObject)
		{
			if (m_pMasterObject->m_pTargetObject)// || m_pMasterObject->m_pLastHiter)
				fChangeFace = TRUE;
		}

		if (fChangeFace)
		{
			CElfWarriorMonster* pElfWarriorMon = dynamic_cast<CElfWarriorMonster*>(MakeClone(_MONSTER_ELFWARRIOR));

			if (pElfWarriorMon)
				pElfWarriorMon->AppearNow();

			m_pMasterObject = NULL;
			KickException();

			return;
		}
	}

	CMonsterObject::Run();
}

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

		脚荐 (函脚饶)

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

CElfWarriorMonster::CElfWarriorMonster()
{
	m_fIsFirst		= TRUE;
}

void CElfWarriorMonster::ResetElfMon()
{
//   NextHitTime := 3000 - (SlaveMakeLevel * 600);
//   NextWalkTime := 1200 - (SlaveMakeLevel * 250);
	m_dwWalkTime = GetTickCount() + 2000;	
}

void CElfWarriorMonster::AppearNow()
{
	m_fIsFirst		= FALSE;
	m_fHideMode		= FALSE;

	AddRefMsg(RM_DIGUP, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);

	m_dwWalkTime = GetTickCount() + 800;
/*procedure TElfMonster.AppearNow;
begin
   bofirst := FALSE;
   HideMode := FALSE;
   //SendRefMsg (RM_TURN, Dir, CX, CY, 0, '');
   //Appear;
   //ResetElfMon;
   RecalcAbilitys;
   WalkTime := WalkTime + 800; //函脚饶 距埃 掉饭捞 乐澜
end;
*/
}

void CElfWarriorMonster::Run()
{	 
	if (m_fIsFirst)
	{
		m_fIsFirst		= FALSE;
		m_fHideMode		= FALSE;
		AddRefMsg(RM_DIGUP, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);
		ResetElfMon();
	}

	if (m_fIsDead)
	{
		if (GetTickCount() - m_dwDeathTime > 2 * 1000)
			MakeGhost();
	}
	else
	{
		BOOL fChangeFace = TRUE;

		if (m_pTargetObject)
			fChangeFace = FALSE;

		if (m_pMasterObject)
		{
			if (m_pMasterObject->m_pTargetObject)// || m_pMasterObject->m_pLastHiter)
				fChangeFace = FALSE;
		}

		if (fChangeFace)
		{
			CElfMonster* pElfMon = dynamic_cast<CElfMonster*>(MakeClone(_MONSTER_ELFMONSTER));

			if (pElfMon)
			{
				AddRefMsg(RM_DIGDOWN, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);
				AddRefMsg(RM_CHANGEFACE, 0, (int)this, (int)pElfMon, 0, NULL);
			
				pElfMon->AppearNow();
			}

			m_pMasterObject = NULL;
			KickException();
		}
	}

	CGenneralMonObject::Run();
}

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

		魔芭固

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

CSpitSpiderMonster::CSpitSpiderMonster()
{
}

void CSpitSpiderMonster::SpitAttack(int nDir)
{
	int nDamage;
	int nX, nY;

	m_nDirection = nDir;

	if (HIBYTE(m_WAbility.DC) - LOBYTE(m_WAbility.DC) + 1)
		nDamage = LOBYTE(m_WAbility.DC) + rand() % (HIBYTE(m_WAbility.DC) - LOBYTE(m_WAbility.DC) + 1);
	else
		nDamage = LOBYTE(m_WAbility.DC);

	if (nDamage <= 0) return;

	AddRefMsg(RM_HIT, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);

	for (int i = 0; i < 4; i++)
	{
		for (int k = 0; k < 4; k++)
		{
			if (g_SpitMap[nDir][i][k] == 1)
			{
				nX = m_nCurrX - 2 + k;
				nY = m_nCurrY - 2 + i;

				CCharObject* pCharObject = m_pMap->GetObject(nX, nY);

				if (pCharObject && pCharObject != this)
				{
					if (IsProperTarget(pCharObject))
					{
						if (pCharObject->m_btSpeedPoint)
						{
							if (rand() % pCharObject->m_btSpeedPoint < m_btHitPoint)
							{
								nDamage = GetMagStruckDamage(nDamage);

								if (nDamage > 0)
								{
									pCharObject->StruckDamage(nDamage);
									pCharObject->AddDelayProcess(pCharObject, RM_STRUCK, nDamage, pCharObject->m_WAbility.HP, 
																	pCharObject->m_WAbility.MaxHP, (int)this, NULL, 300);

/*                        if BoUsePoison then begin
                           //眉仿捞 皑家窍绰 刀俊 吝刀 等促.
                           if Random(20 + cret.AntiPoison) = 0 then
                              cret.MakePoison (POISON_DECHEALTH, 30, 1);   //眉仿捞 皑家
                           //if Random(2) = 0 then
                           //   cret.MakePoison (POISON_STONE, 5);   //付厚
                        end; */

								}
							}
						}
					}
				}
			}
		}
	}
}

BOOL CSpitSpiderMonster::AttackTarget()
{
	int nTargetDir;

	if (m_pTargetObject)
	{
		if (TargetInSpitRange(nTargetDir))
		{
			if (GetTickCount() - m_dwHitTime > m_dwNextHitTime)
			{
				m_dwHitTime			= GetTickCount();
				m_dwTargetFocusTime = GetTickCount();
				SpitAttack(nTargetDir);
				BreakHolySeize();
			}

			return TRUE;
		}
		else
		{
			if (m_pTargetObject->m_pMap != m_pMap)
			{
				m_nTargetX = m_pTargetObject->m_nCurrX;
				m_nTargetY = m_pTargetObject->m_nCurrY;
			}
			else
			{
				m_pTargetObject = NULL;

				m_nTargetX = -1;
				m_nTargetY = -1;
			}
		}
	}

	return FALSE;
}

⌨️ 快捷键说明

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