📄 objectmonster.cpp
字号:
*/
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 + -