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

📄 objectmonster.cpp

📁 此为传奇游戏源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
*/
		if (m_fBoHolySeize)
		{
			if (GetTickCount() - m_dwHolySeizeStart > m_dwHolySeizeTime)
				BreakHolySeize();
		}

		if (Think())
		{
			InheritedRun();
			return;
		}

		if (GetTickCount() - m_dwWalkTime > m_dwNextWalkTime)
		{
			m_dwWalkTime = GetTickCount();

			if (!m_fRunAwayMode)
			{
				if (!m_fNoAttackMode)
				{
					if (m_pTargetObject)
					{
						if (AttackTarget())
						{
							InheritedRun();
							return;
						}
					}
					else
					{
						m_nTargetX = -1;
						
						if (m_fHasMission)
						{
							m_nTargetX = m_nMissionX;
							m_nTargetY = m_nMissionY;
						}
					}
				}

				if (m_pMasterObject)
				{
					if (!m_pTargetObject)
					{
						int nX, nY;

						m_pMasterObject->GetBackPosition(nX, nY);

						if ((abs(m_nTargetX - nX) > 1) || (abs(m_nTargetY - nY) > 1))
						{
							m_nTargetX = nX;
							m_nTargetY = nY;
							
							if ((abs(m_nCurrX - nX) <= 2) || (abs(m_nCurrY - nY) <= 2))
							{
								if (m_pMap->GetObject(nX, nY))
								{
									m_nTargetX = m_nCurrX;
									m_nTargetY = m_nCurrY;
								}
							}
						}
					}

/*               //林牢苞 呈公 冻绢廉 乐栏搁...
               if (not Master.BoSlaveRelax) and
                  ((PEnvir <> Master.PEnvir) or
                   (abs(CX-Master.CX) > 20) or
                   (abs(CY-Master.CY) > 20)
                  )
               then begin
                  SpaceMove (Master.PEnvir.MapName, TargetX, TargetY, 1);
               end;
            end; */
					if ((abs(m_nCurrX - m_pMasterObject->m_nCurrX) > 20) || (abs(m_nCurrY - m_pMasterObject->m_nCurrY) > 20))
						SpaceMove(m_nTargetX, m_nTargetY, m_pMasterObject->m_pMap);
				}

			}
			else
			{
				if (m_dwRunAwayTime > 0)
				{
					if (GetTickCount() - m_dwRunAwayStart > m_dwRunAwayTime)
					{
						m_fRunAwayMode	= FALSE;
						m_dwRunAwayTime	= 0;
					}
				}
			}

/*         if Master <> nil then begin
            if Master.BoSlaveRelax then begin
               //林牢捞 绒侥窍扼绊 窃...
               inherited Run;
               exit;
            end;
         end;
*/
			if (m_nTargetX != -1 )
				GotoTargetXY();
			else
			{
				if (!m_pTargetObject)
					Wondering();
			}
		}
	}

	InheritedRun();
}

void CMonsterObject::ComeOut()
{
	m_fHideMode = FALSE;
	AddRefMsg(RM_DIGUP, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);
}

void CMonsterObject::ComeDown()
{
	AddRefMsg(RM_DIGDOWN, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);

	CVisibleObject* pVisibleObject;

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

		while (pListNode)
		{
			if (pVisibleObject = m_xVisibleObjectList.GetData(pListNode))
			{
				delete pVisibleObject;
				pVisibleObject = NULL;
			}

			pListNode = m_xVisibleObjectList.RemoveNode(pListNode);
		} // while (pListNode)
	}

	m_fHideMode = TRUE;
}

BOOL CMonsterObject::CheckComeOut(int nValue)
{
	if (m_xVisibleObjectList.GetCount())
	{
		PLISTNODE pListNode = m_xVisibleObjectList.GetHead();

		while (pListNode)
		{
			CVisibleObject* pVisibleObject = m_xVisibleObjectList.GetData(pListNode);

			if (pVisibleObject)
			{
				if ((!pVisibleObject->pObject->m_fIsDead) && IsProperTarget(pVisibleObject->pObject) && (!pVisibleObject->pObject->m_fInspector))
				{
					if (abs(m_nCurrX - pVisibleObject->pObject->m_nCurrX) <= nValue && abs(m_nCurrY - pVisibleObject->pObject->m_nCurrY) <= nValue)
						return TRUE;
				}
			}

			pListNode = m_xVisibleObjectList.GetNext(pListNode);
		}
	}

	return FALSE;
}

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

		老馆 阁胶磐

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

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

	CMonsterObject::Run();	
}

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


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

CChickenObject::CChickenObject()
{
	m_nMeatQuality		= 3000 + rand() % 2000;
	m_nBodyLeathery		= 50;
}

void CChickenObject::Run()
{
}

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

		林付龋过, 林付脚厘

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

CScultureObject::CScultureObject()
{
	m_dwSearchTick	= 1500 + rand() % 1500;

	m_fStoneMode	= TRUE;
	m_nCharStatusEx = STATE_STONE_MODE;
	m_nCharStatus	= GetCharStatus();
}

void CScultureObject::MeltStone()
{
	m_nCharStatusEx	= 0;
	m_nCharStatus	= GetCharStatus();

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

	m_fStoneMode	= FALSE;
}

void CScultureObject::MeltStoneAll()
{
	CWHList<CCharObject*>	ObjectList;

	MeltStone();

	m_pMap->GetMapObject(m_nCurrX, m_nCurrY, 7, &ObjectList);

	if (ObjectList.GetCount())
	{
		PLISTNODE		pListNode = ObjectList.GetHead();
		CMonsterObject*	pTargetObject;

		while (pListNode)
		{
			if (pTargetObject = (CMonsterObject*)ObjectList.GetData(pListNode))
			{
				if (pTargetObject->m_fStoneMode)
				{
					if (pTargetObject->m_wObjectType & _OBJECT_MONSTER)
					{
						switch (pTargetObject->m_nRace)
						{
							case 145:
							case 148:
								((CScultureObject*)pTargetObject)->MeltStone();
								break;
						}
					}
				}
			}
		
			pListNode = ObjectList.RemoveNode(pListNode);
		}
	}
}

void CScultureObject::Run()
{
	if (!m_fIsDead && !m_fIsGhost && m_wStatusArr[POISON_STONE] == 0)
	{
		if (GetTickCount() - m_dwWalkTime > m_dwNextWalkTime)
		{
			if (m_fStoneMode)
			{
				if (CheckComeOut(2))
				{
					MeltStoneAll();
					m_dwWalkTime = GetTickCount() + 2000;
				}
			}
			else
			{
				if ((GetTickCount() - m_dwSearchEnemyTime > 8000) || ((GetTickCount() - m_dwSearchEnemyTime > 1000) && !m_pTargetObject))
				{
					m_dwSearchEnemyTime = GetTickCount();
					MonsterNormalAttack();
				}
			}
		}
	}

	CMonsterObject::Run();	
}

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

		林付空

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

CScultureKingObject::CScultureKingObject()
{
	m_dwSearchTick	= 1500 + rand() % 1500;

	m_nDangerLevel	= 5;

	m_fStoneMode	= TRUE;
	m_nCharStatusEx = STATE_STONE_MODE;
	m_nCharStatus	= GetCharStatus();

	m_nDirection	= 5;
}

void CScultureKingObject::CallSlave()
{
	static const int MaxSlaveList = 4;
	static SlaveList[MaxSlaveList] = { 143/*付泵荤*/, 145/*林付脚厘*/, 148/* 林付龋过 */, 126/*禁扁唱规*/ };

	int				nCount = 6 + (rand() % 6);
	int				nMonRace;
	int				nX, nY;
	CMonsterObject* pMonObject;

	for (int i = 0; i < nCount; i++)
	{
		if (m_SlaveObjectList.GetCount() < 30)
		{
			nMonRace = SlaveList[rand() % MaxSlaveList];	

			GetFrontPosition(nX, nY);

			pMonObject = (CMonsterObject*)AddCreatureSysop(nX, nY, &g_pMonRaceInfo[nMonRace], FALSE);

			if (pMonObject)
				m_SlaveObjectList.AddNewNode(pMonObject);
		}
	}
}

void CScultureKingObject::MeltStone()
{
	m_nCharStatusEx	= 0;
	m_nCharStatus	= GetCharStatus();

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

	m_fStoneMode	= FALSE;

//   event := TEvent.Create (PEnvir, CX, CY, ET_SCULPEICE, 5 * 60 * 1000, TRUE);
//   EventMan.AddEvent (event);
}

void CScultureKingObject::Run()
{
	if (!m_fIsDead && !m_fIsGhost && m_wStatusArr[POISON_STONE] == 0)
	{
		if (GetTickCount() - m_dwWalkTime > m_dwNextWalkTime)
		{
			if (m_fStoneMode)
			{
				if (CheckComeOut(2))
				{
					MeltStone();
					m_dwWalkTime = GetTickCount() + 2000;
				}
			}
			else
			{
				if ((GetTickCount() - m_dwSearchEnemyTime > 8000) || ((GetTickCount() - m_dwSearchEnemyTime > 1000) && !m_pTargetObject))
				{
					m_dwSearchEnemyTime = GetTickCount();
					MonsterNormalAttack();
				}
			
				if (((m_WAbility.HP / m_WAbility.MaxHP * 5) < m_nDangerLevel) && (m_nDangerLevel > 0))
				{
					m_nDangerLevel--;
					CallSlave();
				}

				if (m_WAbility.HP == m_WAbility.MaxHP) 
					m_nDangerLevel = 5;
			}
		}

		if (m_SlaveObjectList.GetCount())
		{
			PLISTNODE		pListNode = NULL;
			CMonsterObject* pMonsterObject = NULL;

			pListNode = m_SlaveObjectList.GetHead();

			while (pListNode)
			{
				pMonsterObject = m_SlaveObjectList.GetData(pListNode);

				if (pMonsterObject->m_fIsDead || pMonsterObject->m_fIsGhost)
					pListNode = m_SlaveObjectList.RemoveNode(pListNode);
				else
					pListNode = m_SlaveObjectList.GetNext(pListNode);
			}
		}
	}

	CMonsterObject::Run();	
}

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

		厚阜盔面

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

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

	m_fStickMode = TRUE;
}

void CBeeQueen::MakeChildBee()
{
	if (m_SlaveObjectList.GetCount() < 15)
	{
		AddRefMsg(RM_HIT, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);
		AddDelayProcess(this, RM_ZEN_BEE, 0, 0, 0, 0, NULL, 500);
	}
}

void CBeeQueen::Operate()
{
	int nCount = m_DelayProcessQ.GetCount();

	_LPTPROCESSMSG lpProcessMsg;

	if (nCount)
	{
		for (int i = 0; i < nCount; i++)
		{
			lpProcessMsg = (_LPTPROCESSMSG)m_DelayProcessQ.PopQ();

			if (lpProcessMsg)
			{
				if (GetTickCount() < lpProcessMsg->dwDeliveryTime)
				{
					m_DelayProcessQ.PushQ((BYTE *)lpProcessMsg);
					continue;
				}

				switch (lpProcessMsg->wIdent)
				{
					case RM_ZEN_BEE:
					{
						CMonsterObject *pMonObject = (CMonsterObject *)AddCreatureSysop(m_nCurrX, m_nCurrY, &g_pMonRaceInfo[_MONSTER_BEE], FALSE);

						if (pMonObject)
						{
							m_SlaveObjectList.AddNewNode(pMonObject);
							pMonObject->SelectTarget(m_pTargetObject);
						}

						break;
					}
				}

				delete lpProcessMsg;
				lpProcessMsg = NULL;
			}
		}
	}

	CMonsterObject::Operate();
}

void CBeeQueen::Run()
{
	if (!m_fIsDead && !m_fIsGhost && m_wStatusArr[POISON_STONE] == 0)
	{
		if (GetTickCount() - m_dwWalkTime > m_dwNextWalkTime)
		{
			m_dwWalkTime = GetTickCount();

			if (GetTickCount() - m_dwHitTime > m_dwNextHitTime)
			{
				m_dwHitTime = GetTickCount();
				MonsterNormalAttack();

				if (m_pTargetObject)
					MakeChildBee();
			}
		}

		if (m_SlaveObjectList.GetCount())
		{
			PLISTNODE		pListNode = NULL;
			CMonsterObject* pMonsterObject = NULL;

			pListNode = m_SlaveObjectList.GetHead();

			while (pListNode)
			{
				pMonsterObject = m_SlaveObjectList.GetData(pListNode);

				if (pMonsterObject->m_fIsDead || pMonsterObject->m_fIsGhost)
					pListNode = m_SlaveObjectList.RemoveNode(pListNode);
				else
					pListNode = m_SlaveObjectList.GetNext(pListNode);
			}
		}
	}

	CMonsterObject::Run();
}

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

		街档尝 秦榜, 付泵荤

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

CDualAxeObject::CDualAxeObject(int nChainShotCount)
{
   m_nChainShot			= 0;
   m_nChainShotCount	= nChainShotCount;
}

void CDualAxeObject::FlyAxeAttack(CCharObject* pTargetObject)
{
//   if PEnvir.CanFly (CX, CY, targ.CX, targ.CY) then begin //档尝啊 朝酒哎荐 乐绰瘤.
	int nDamage;
	int nDir	= GetNextDirection(pTargetObject->m_nCurrX, pTargetObject->m_nCurrY);

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

	if (nDamage > 0)
		nDamage = pTargetObject->GetHitStruckDamage(nDamage);

	if (nDamage > 0)
	{
		pTargetObject->StruckDamage(nDamage);
		pTargetObject->AddDelayProcess(pTargetObject, RM_STRUCK, nDamage, pTargetObject->m_WAbility.HP, pTargetObject->m_WAbility.MaxHP, 
										(int)this /*Hitter*/, NULL, 600 + _MAX(abs(m_nCurrX - pTargetObject->m_nCurrX), abs(m_nCurrY - pTargetObject->m_nCurrY) * 50));
	}

	AddRefMsg(RM_FLYAXE, nDir, m_nCurrX, m_nCurrY, (int)pTargetObject, NULL);
}

BOOL CDualAxeObject::AttackTarget()
{
	if (m_pTargetObject)
	{
		if (GetTickCount() - m_dwHitTime > m_dwNextHitTime)
		{
			m_dwHitTime = GetTickCount();

			if ((abs(m_nCurrX - m_pTargetObject->m_nCurrX) <= 7) && (abs(m_nCurrY - m_pTargetObject->m_nCurrY) <= 7))
			{
				if (m_nChainShot < m_nChainShotCount - 1)
				{
					m_nChainShot++;
					m_dwTargetFocusTime = GetTickCount();
					FlyAxeAttack(m_pTargetObject);
				}
				else
				{
					if ((rand() % 5) == 0)
						m_nChainShot = 0;
				}

				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;
}

void CDualAxeObject::Run()
{
	if (!m_fIsDead && !m_fIsGhost)
	{
		if ((GetTickCount() - m_dwSearchEnemyTime > 5000))
		{
			m_dwSearchEnemyTime = GetTickCount();
			MonsterNormalAttack();
		}

		if (GetTickCount() - m_dwWalkTime > m_dwNextWalkTime)
		{
			// 档噶啊绰 内靛 眠啊
		}
	}

	CMonsterObject::Run();
}

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

		扼捞飘醋 粱厚

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

void CLightingZombiObject::LightingAttack(int nDir)

⌨️ 快捷键说明

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