📄 shikariai.cpp
字号:
SetAnimation(m_pAnim_Sound->m_nAnim_DODGE_RIGHT);
m_pServerDE->SetModelLooping(m_hObject, DFALSE);
DVector vVel;
vVel.y = m_MoveObj.GetUpVector().y * m_fJumpSpeed;
vVel.x = m_MoveObj.GetRightVector().x * m_fRunSpeed;
vVel.z = m_MoveObj.GetRightVector().z * m_fRunSpeed;
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 : ShikariAI::ComputeState
// DESCRIPTION : Compute actual substate
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void ShikariAI::ComputeState(int nStimType)
{
int nStim = nStimType;
if(nStimType == -1)
nStim = ComputeStimuli();
DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);
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.66f || fHeight > m_vDims.y)
SetNewState(STATE_AttackFar);
else
SetNewState(STATE_AttackClose);
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : ShikariAI::AI_STATE_AttackClose
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void ShikariAI::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;
MC_FaceTarget();
Metacmd--;
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 : ShikariAI::AI_STATE_AttackFar
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void ShikariAI::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 && m_nCurMetacmd != MC_JUMP)
{
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;
MC_FaceTarget();
Metacmd--;
switch(Metacmd)
{
case 1: 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 2: if((m_fStimuli[SIGHT] < (m_fSeeingDist * 0.33)) && m_nCurMetacmd != MC_JUMP
|| (bAbove && fHeight > m_vDims.y))
{
ComputeState();
}
else if(m_fStimuli[SIGHT] < (m_fSeeingDist * 0.4) || m_nCurMetacmd == MC_JUMP
|| IsLedge(m_MoveObj.GetForwardVector()))
{
MC_Jump();
}
else
MC_Roll_Forward(DTRUE);
break;
case 3: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : ShikariAI::AI_STATE_Dodge
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void ShikariAI::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 : ShikariAI::AI_STATE_GuardLocation
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void ShikariAI::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 : ShikariAI::AI_STATE_Special1
// DESCRIPTION : EATING state
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void ShikariAI::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 ShikariAI::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\\shikari");
CacheSoundFileRange("sh_attack_", 1, 3);
CacheSoundFileRange("sh_death_", 1, 3);
CacheSoundFileRange("sh_howl_", 1, 3);
CacheSoundFileRange("sh_idle_", 1, 3);
CacheSoundFileRange("sh_pain_", 1, 3);
CacheSoundFileRange("sh_spit_", 1, 3);
CacheSoundFileRange("sh_spot_", 1, 3);
CacheSoundFileRange("sh_taunt_", 1, 3);
CacheSoundFileRange("shikfall_", 1, 3);
CacheSoundFileRange("shikfoot1_", 1, 3);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -