📄 prophet.cpp
字号:
else if(m_fStimuli[HEALTH] < 0.50f)
{
SetNewState(STATE_AttackFar);
return;
}
else if(m_nState == STATE_Escape_RunAway)
{
SetNewState(STATE_FindAmmo);
}
else
{
if(m_fStimuli[SIGHT] <= 0.5f || fHeight > m_vDims.y)
SetNewState(STATE_AttackFar);
else
SetNewState(STATE_AttackClose);
}
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Prophet::STATE_AttackClose
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Prophet::AI_STATE_AttackClose()
{
DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);
//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
if(m_hTarget == DNULL)
{
if(fHeight <= m_vDims.y)
SetNewState(STATE_SearchVisualTarget);
else
ComputeState();
return;
}
m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
DBOOL bAbove = (m_vTargetPos.y - m_MoveObj.GetPos().y) > 0;
switch(Metacmd)
{
case 1: MC_FaceTarget(); break;
case 2: MC_BestWeapon(); break;
case 3: if(m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.33) || m_nCurMetacmd == MC_FIRE_STAND
|| m_nCurMetacmd == MC_FIRE_CROUCH)
{
if(m_nDodgeFlags & FORWARD || m_nDodgeFlags & BACKWARD || m_fStimuli[HEALTH] < 0.5f
|| m_nCurMetacmd == MC_FIRE_CROUCH || (fHeight > m_vDims.y && !bAbove))
{
MC_Fire_Crouch();
}
else
{
MC_Fire_Stand();
}
}
else
Metacmd++;
break;
case 4: if(m_fStimuli[SIGHT] > (m_fSeeingDist * 0.33) && m_fStimuli[SIGHT] < (m_fSeeingDist * 0.5))
{
MC_FaceTarget();
Metacmd--;
if(!IsLedge(m_MoveObj.GetForwardVector()) && fHeight <= m_vDims.y
&& m_nCurMetacmd != MC_FIRE_CROUCH)
{
if(m_nInjuredLeg)
MC_Walk();
else
{
if(m_nDodgeFlags & FORWARD || m_nDodgeFlags & BACKWARD
|| m_fStimuli[HEALTH] < 0.5f)
MC_Fire_Crawl();
else
MC_Fire_Run();
}
}
else
{
MC_Fire_Crouch();
}
}
else
Metacmd++;
break;
case 5: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Prophet::AI_STATE_AttackFar
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Prophet::AI_STATE_AttackFar()
{
DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);
//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
if(m_hTarget == DNULL)
{
if(fHeight <= m_vDims.y)
SetNewState(STATE_SearchVisualTarget);
else
ComputeState();
return;
}
m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
DBOOL bAbove = (m_vTargetPos.y - m_MoveObj.GetPos().y) > 0;
switch(Metacmd)
{
case 1: MC_FaceTarget(); break;
case 2: MC_BestWeapon(); break;
case 3: if(m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.75) || m_nCurMetacmd == MC_FIRE_STAND
|| m_nCurMetacmd == MC_FIRE_CROUCH || fHeight > m_vDims.y)
{
if((fHeight > m_vDims.y && !bAbove) || m_nCurMetacmd == MC_FIRE_CROUCH
|| m_fStimuli[HEALTH] < 0.5f)
{
MC_Fire_Crouch();
}
else
{
MC_Fire_Stand();
}
}
else
Metacmd++;
break;
case 4: if(m_fStimuli[SIGHT] > (m_fSeeingDist * 0.75))
{
MC_FaceTarget();
Metacmd--;
if(!IsLedge(m_MoveObj.GetForwardVector()) && fHeight <= m_vDims.y
&& m_nCurMetacmd != MC_FIRE_CROUCH)
{
if(m_nInjuredLeg)
MC_Walk();
else
MC_Fire_Run();
}
else
{
MC_Fire_Crouch();
}
}
else
Metacmd++;
break;
case 5: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Prophet::AI_STATE_Escape_Runaway
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Prophet::AI_STATE_Escape_RunAway()
{
DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);
//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
if(m_hTarget == DNULL && m_nCurMetacmd != MC_FIRE_STAND)
{
if(fHeight <= m_vDims.y)
SetNewState(STATE_SearchVisualTarget);
else
ComputeState();
return;
}
switch(Metacmd)
{
case 1: MC_FaceTarget();
m_InventoryMgr.ChangeWeapon(WEAP_MELEE);
break;
case 2: m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
if(m_fStimuli[SIGHT] <= 75.0f)
MC_Fire_Stand();
else
{
MC_FaceTarget();
Metacmd--;
if(!IsLedge(m_MoveObj.GetForwardVector()) && fHeight <= m_vDims.y)
{
MC_Run();
}
else
{
MC_Idle();
}
}
break;
case 3: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Prophet::AI_STATE_Dodge
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Prophet::AI_STATE_Dodge()
{
switch(Metacmd)
{
case 1: m_nDodgeFlags = CalculateDodge(m_vTrackObjPos);
Metacmd++; break;
case 2: if(m_nDodgeFlags & ROLL)
{
if(m_nDodgeFlags & RIGHT)
MC_Roll_Right();
else if(m_nDodgeFlags & LEFT)
MC_Roll_Left();
else if(m_nDodgeFlags & FORWARD)
MC_Roll_Forward();
else
MC_Roll_Backward();
}
else
{
Metacmd++;
}
break;
case 3: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CacheFiles
//
// PURPOSE: Cache resources used by the object
//
// ----------------------------------------------------------------------- //
void Prophet::CacheFiles()
{
// Sanity checks...
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
if(!(pServerDE->GetServerFlags() & SS_CACHING))
{
return;
}
if (!m_hObject) return;
// Get the model filenames...
char sModel[256] = { "" };
char sSkin[256] = { "" };
pServerDE->GetModelFilenames(m_hObject, sModel, 255, sSkin, 255);
// Cache models...
pServerDE->CacheFile(FT_MODEL, sModel);
// Cache textures...
pServerDE->CacheFile(FT_TEXTURE, sSkin);
// Cache sounds...
SetCacheDirectory("sounds\\enemies\\prophet");
CacheSoundFileRange("anger", 1, 3);
CacheSoundFileRange("death", 1, 3);
CacheSoundFileRange("idle", 1, 3);
CacheSoundFileRange("laugh", 1, 3);
CacheSoundFileRange("onfire", 1, 3);
CacheSoundFileRange("pain", 1, 3);
CacheSoundFileRange("spot", 1, 3);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -