📄 gremlin.cpp
字号:
Move(vVel, MATH_EPSILON);
m_nCurMetacmd = MC_DODGE_RIGHT;
m_bAnimating = DTRUE;
}
else
{
CollisionInfo collisionInfo;
m_pServerDE->GetStandingOn(m_hObject, &collisionInfo);
if (collisionInfo.m_hObject)
{
DVector vVel;
VEC_INIT(vVel);
Move(vVel, MATH_EPSILON);
m_bAnimating = DFALSE;
Metacmd++;
}
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : GremlinAI::ComputeState
// DESCRIPTION : Compute actual substate
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void GremlinAI::ComputeState(int nStimType)
{
int nStim = nStimType;
if(nStimType == -1)
nStim = ComputeStimuli();
if(nStim == 0)
{
switch(m_nState)
{
case STATE_Idle: SetNewState(STATE_Idle); break;
case STATE_SearchVisualTarget: SetNewState(STATE_Idle); break;
case STATE_SearchSmellTarget: SetNewState(STATE_Idle); break;
default: SetNewState(STATE_SearchSmellTarget); break;
}
}
else
{
if(nStimType == STIM_SMELL)
SetNewState(STATE_SearchSmellTarget);
else if(m_fStimuli[SIGHT] <= 0.75f)
SetNewState(STATE_AttackFar);
else
SetNewState(STATE_AttackClose);
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : GremlinAI::AI_STATE_AttackClose
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void GremlinAI::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)
{
ComputeState();
return;
}
m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
MC_FaceTarget();
Metacmd--;
DBOOL bAbove = (m_vTargetPos.y - m_MoveObj.GetPos().y) > 0;
switch(Metacmd)
{
case 1: MC_FaceTarget(); break;
case 2: if(m_fStimuli[SIGHT] <= 75.0f || m_nCurMetacmd == MC_FIRE_STAND
|| (bAbove && fHeight > m_vDims.y))
{
MC_Fire_Stand();
}
else
{
if(m_fStimuli[SIGHT] > (m_fSeeingDist * 0.33))
ComputeState();
else
MC_Run();
}
break;
case 3: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : GremlinAI::AI_STATE_AttackFar
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void GremlinAI::AI_STATE_AttackFar()
{
//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
if(m_hTarget == DNULL)
{
ComputeState();
return;
}
DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);
m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
DBOOL bAbove = (m_vTargetPos.y - m_MoveObj.GetPos().y) > 0;
MC_FaceTarget();
Metacmd--;
switch(Metacmd)
{
case 1: {
if (m_nCurMetacmd != MC_TAUNT_BOLD) {
if (IsRandomChance(40))
{
MC_Taunt_Bold();
Metacmd--;
}
else
Metacmd++;
}
else
{
if(m_pServerDE->GetModelPlaybackState(m_hObject) & MS_PLAYDONE)
Metacmd++;
}
break;
}
case 2: if(m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.75) || m_nCurMetacmd == MC_FIRE_STAND
|| (bAbove && fHeight > m_vDims.y))
{
MC_Fire_Stand();
}
else
{
if(m_fStimuli[SIGHT] < (m_fSeeingDist * 0.33))
ComputeState();
else
MC_Walk();
}
break;
case 3: if((m_fStimuli[SIGHT] < (m_fSeeingDist * 0.33)) && m_nCurMetacmd != MC_JUMP)
{
ComputeState();
}
else if(m_fStimuli[SIGHT] < (m_fSeeingDist * 0.4) || m_nCurMetacmd == MC_JUMP
|| IsLedge(m_MoveObj.GetForwardVector()))
{
MC_Jump();
} else Metacmd++;
break;
default: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : GremlinAI::AI_STATE_Dodge
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void GremlinAI::AI_STATE_Dodge()
{
switch(Metacmd)
{
case 1: m_nDodgeFlags = CalculateDodge(m_vTrackObjPos);
Metacmd++; break;
case 2: if(m_nDodgeFlags & RIGHT)
MC_Dodge_Right();
else if(m_nDodgeFlags & LEFT)
MC_Dodge_Left();
else
Metacmd++;
break;
case 3: SetNewState(m_nLastState); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : GremlinAI::AI_STATE_GuardLocation
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void GremlinAI::AI_STATE_GuardLocation()
{
int nStimType = ComputeStimuli();
MC_FaceTarget();
Metacmd--;
switch(Metacmd)
{
case 1: if(nStimType != STIM_SMELL && nStimType > 0)
Metacmd++;
break;
case 2: MC_Taunt_Bold(); break;
case 3: if(m_fStimuli[SIGHT] <= m_fSeeingDist || m_nCurMetacmd == MC_FIRE_STAND)
{
MC_Fire_Stand();
}
else
Metacmd++;
break;
case 4: if(m_fStimuli[HEALTH] <= 0.50f)
ComputeState();
else
Metacmd = 1;
break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : GremlinAI::AI_STATE_Special1
// DESCRIPTION : EATING state
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void GremlinAI::AI_STATE_Special1()
{
if(m_damage.GetLastDamager())
{
ComputeState();
return;
}
m_pServerDE->SetNextUpdate(m_hObject, 0.1f);
switch(Metacmd)
{
case 1: MC_Special(0); break;
case 2: Metacmd = 1; break;
}
return;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CacheFiles
//
// PURPOSE: Cache resources used by the object
//
// ----------------------------------------------------------------------- //
void GremlinAI::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_ao\\enemies\\gremlin");
CacheSoundFileRange("attack", 1, 3);
CacheSoundFileRange("death", 1, 3);
CacheSoundFileRange("idle", 1, 3);
CacheSoundFileRange("pain", 1, 3);
CacheSoundFileRange("taunt", 1, 3);
}
#endif // _ADD_ON
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -