📄 cultistai.cpp
字号:
MC_Fire_Stand();
}
}
else
Metacmd++;
break;
case 5: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : CultistAI::AI_STATE_AttackFar
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CultistAI::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 || fHeight > m_vDims.y)
{
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_STAND
)
{
if(m_nInjuredLeg)
MC_Walk();
else
MC_Fire_Run();
}
else
{
MC_Fire_Stand();
}
}
else
Metacmd++;
break;
case 5: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : CultistAI::AI_STATE_Escape
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CultistAI::AI_STATE_Escape_RunAway()
{
if(Metacmd > 1)
{
int nStimType = ComputeStimuli();
if(nStimType > 0)
{
ComputeState(nStimType);
return;
}
}
DFLOAT fDim = (DFLOAT)sqrt((m_vDims.x * m_vDims.x) + (m_vDims.z * m_vDims.z)) + 0.1f;
switch(Metacmd)
{
case 1: m_hTrackObject = FindObjectInRadius(m_pServerDE->GetClass("ExitHint"), m_fSeeingDist, FIND_VISIBLE | FIND_AVOID_TARGET);
if(m_hTrackObject)
{
m_pServerDE->GetObjectPos(m_hTrackObject,&m_vTrackObjPos);
MC_FacePos(m_vTrackObjPos);
if(!m_MoveObj.CalculatePath(m_vTrackObjPos))
SetNewState(STATE_Escape_Hide);
}
else
SetNewState(STATE_AttackFar);
break;
case 2:
{
DVector* pvPos = m_MoveObj.GetNextPathPoint();
if(pvPos)
MC_FacePos(*pvPos);
else
SetNewState(STATE_Escape_Hide);
break;
}
case 3:
{
DVector vPoint = *m_MoveObj.GetNextPathPoint();
vPoint.y = m_MoveObj.GetPos().y;
if(VEC_DIST(vPoint, m_MoveObj.GetPos()) <= fDim/2)
{
if(!m_MoveObj.MoveToNextPathPoint())
{
MC_FacePos(m_vTargetPos);
}
else
{
Metacmd = 2;
}
}
else
MC_Run();
break;
}
case 4: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : CultistAI::AI_STATE_Escape_Hide
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CultistAI::AI_STATE_Escape_Hide()
{
if(m_hTarget == DNULL)
{
ComputeState();
return;
}
MC_FaceTarget();
Metacmd--;
switch(Metacmd)
{
case 1: MC_Taunt_Beg(); break;
case 2: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : CultistAI::AI_STATE_Dodge
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CultistAI::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
Metacmd++;
}
else
{
Metacmd++;
}
break;
case 3: ComputeState(); break;
}
return;
}
void CultistAI::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
m_pServerDE->WriteToMessageByte(hWrite, (DBYTE)m_bMale);
}
void CultistAI::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
// Load our male flag
m_bMale = (DBOOL)m_pServerDE->ReadFromMessageByte(hRead);
// Figure out other flags by the model filenames
#ifdef _ADDON
char sModel[256] = { "" };
char sSkin[256] = { "" };
m_pServerDE->GetModelFilenames(m_hObject, sModel, 255, sSkin, 255);
strupr(sModel);
strupr(sSkin);
if (strstr(sSkin, "M_CULTIST4")) m_bClownSkin = DTRUE;
if (strstr(sSkin, "M_CULTIST5")) m_bClownSkin = DTRUE;
if (strstr(sSkin, "M_CULTIST6")) m_bClownSkin = DTRUE;
if (strstr(sSkin, "OLDSCHOOL")) m_bRobeSkin = DTRUE;
#endif
//Load up animation indexes if first model instance
if((m_bMale || m_bClownSkin) && m_bMaleAnims)
{
m_Male_Anim_Sound.SetAnimationIndexes(m_hObject);
m_Male_Anim_Sound.GenerateHitSpheres(m_hObject);
m_Male_Anim_Sound.SetSoundRoot("sounds\\enemies\\m_cultist");
m_bMaleAnims = DFALSE;
}
#ifdef _ADD_ON
if (m_bRobeSkin && m_bRobeAnims)
{
m_Robe_Anim_Sound.SetAnimationIndexes(m_hObject);
m_Robe_Anim_Sound.GenerateHitSpheres(m_hObject);
m_Robe_Anim_Sound.SetSoundRoot("sounds_ao\\enemies\\RetroCultist");
m_bRobeAnims = DFALSE;
}
#endif
if((!m_bMale && !m_bClownSkin && !m_bRobeSkin) && m_bFemaleAnims)
{
m_Female_Anim_Sound.SetAnimationIndexes(m_hObject);
m_Female_Anim_Sound.GenerateHitSpheres(m_hObject);
m_Female_Anim_Sound.SetSoundRoot("sounds\\enemies\\f_cultist");
m_bFemaleAnims = DFALSE;
}
if((m_bMale || m_bClownSkin) && !m_bRobeSkin)
AI_Mgr::InitStatics(&m_Male_Anim_Sound);
#ifdef _ADD_ON
else if (m_bRobeSkin)
AI_Mgr::InitStatics(&m_Robe_Anim_Sound);
#endif
else
AI_Mgr::InitStatics(&m_Female_Anim_Sound);
return;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CacheFiles
//
// PURPOSE: Cache resources used by the object
//
// ----------------------------------------------------------------------- //
void CultistAI::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...
#ifdef _ADDON
if (m_bRobeSkin)
{
SetCacheDirectory("sounds_ao\\enemies\\retrocultist");
CacheSoundFileRange("death", 1, 3);
CacheSoundFileRange("kill", 1, 3);
CacheSoundFileRange("idle", 1, 3);
CacheSoundFileRange("pain", 1, 3);
CacheSoundFileRange("spot", 1, 3);
CacheSoundFileRange("attack", 1, 3);
CacheSoundFileRange("taunt", 1, 3);
}
else
#endif
if (m_bMale)
{
SetCacheDirectory("sounds\\enemies\\m_cultist");
CacheSoundFileRange("death", 1, 3);
CacheSoundFileRange("fear", 1, 3);
CacheSoundFileRange("idle", 1, 3);
CacheSoundFileRange("pain", 1, 3);
CacheSoundFileRange("spot", 1, 3);
CacheSoundFileRange("attack", 1, 3);
CacheSoundFileRange("taunt", 1, 3);
CacheSoundFileRange("anger", 1, 3);
}
else
{
SetCacheDirectory("sounds\\enemies\\f_cultist");
CacheSoundFileRange("death", 1, 3);
CacheSoundFileRange("fear", 1, 3);
CacheSoundFileRange("idle", 1, 3);
CacheSoundFileRange("pain", 1, 3);
CacheSoundFileRange("spot", 1, 3);
CacheSoundFileRange("attack", 1, 3);
CacheSoundFileRange("taunt", 1, 3);
CacheSoundFileRange("anger", 1, 3);
}
}
void CultistAI::ResetStatics()
{
m_bMaleAnims = DTRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -