📄 civilianai.cpp
字号:
if(fDist <= fDim/2)
{
SetNewState(STATE_Escape_Hide);
break;
}
MC_FacePos(m_vTrackObjPos);
DRotation rRot;
DVector vU, vR, vF, vMyF;
m_pServerDE->GetObjectRotation(m_hTrackObject, &rRot);
m_pServerDE->GetRotationVectors(&rRot, &vU, &vR, &vF);
VEC_COPY(vMyF, m_MoveObj.GetForwardVector());
DFLOAT fHintDp = (vMyF.x * vF.x) + (vMyF.y * vF.y) + (vMyF.z * vF.z);
if(fHintDp > 0)
{
if(!m_MoveObj.CalculatePath(m_vTrackObjPos))
SetNewState(STATE_Escape_Hide);
}
else
SetNewState(STATE_Escape_Hide);
}
else
SetNewState(STATE_Escape_Hide);
break;
}
case 2:
{
DVector* pvPos = m_MoveObj.GetNextPathPoint();
if(pvPos)
MC_FacePos(*pvPos);
else
SetNewState(STATE_Escape_RunAway);
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 : CivilianAI::AI_STATE_Escape_Hide
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CivilianAI::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 : CivilianAI::AI_STATE_Idle
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CivilianAI::AI_STATE_Idle()
{
if(m_bScared)
{
int nStimType = ComputeStimuli();
if(nStimType > 0)
{
m_pServerDE->SetNextUpdate(m_hObject, 0.001f);
ComputeState(nStimType);
return;
}
}
m_pServerDE->SetNextUpdate(m_hObject, 0.1f);
switch(Metacmd)
{
case 1: MC_Idle(); break;
case 2: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : CivilianAI::AI_STATE_Special1
// DESCRIPTION : TALKING state
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CivilianAI::AI_STATE_Special1()
{
MC_FaceTarget();
Metacmd--;
switch(Metacmd)
{
case 1: MC_Talk(); break;
case 2: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : CivilianAI::AI_STATE_Special2
// DESCRIPTION : TYPING state
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CivilianAI::AI_STATE_Special2()
{
switch(Metacmd)
{
case 1: MC_Special(0); break;
case 2: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : CivilianAI::AI_STATE_Special3
// DESCRIPTION : HAND_WARMING state
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CivilianAI::AI_STATE_Special3()
{
switch(Metacmd)
{
case 1: MC_Special(m_pServerDE->IntRandom(1,2)); break;
case 2: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : CivilianAI::AI_STATE_Special4
// DESCRIPTION : SLEEPING state
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CivilianAI::AI_STATE_Special4()
{
switch(Metacmd)
{
case 1: MC_Special(3); break;
case 2: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : CivilianAI::AI_STATE_Special5
// DESCRIPTION : STUDY state
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CivilianAI::AI_STATE_Special5()
{
switch(Metacmd)
{
case 1: MC_Special(4); break;
case 2: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : CivilianAI::AI_STATE_Special6
// DESCRIPTION : RIGHT HAND SUBWAY state
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CivilianAI::AI_STATE_Special6()
{
switch(Metacmd)
{
case 1: MC_Special(m_pServerDE->IntRandom(5,6)); break;
case 2: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : CivilianAI::AI_STATE_Special7
// DESCRIPTION : LEFT HAND SUBWAY state
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CivilianAI::AI_STATE_Special7()
{
switch(Metacmd)
{
case 1: MC_Special(7); break;
case 2: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : CivilianAI::AI_STATE_Special8
// DESCRIPTION : FETAL state
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void CivilianAI::AI_STATE_Special8()
{
switch(Metacmd)
{
case 1: MC_Special(8); break;
case 2: ComputeState(); break;
}
return;
}
void CivilianAI::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
DBYTE vals;
vals = m_bMale | (m_bLabTech * 0x02) | (m_bScared * 0x04);
m_pServerDE->WriteToMessageByte(hWrite, vals);
}
void CivilianAI::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
DBYTE vals;
vals = m_pServerDE->ReadFromMessageByte(hRead);
m_bMale = ((vals & 0x01) != 0);
m_bLabTech = ((vals & 0x02) != 0);
m_bScared = ((vals & 0x04) != 0);
//Load up animation indexes if first model instance
if(m_bMale || m_bLabTech && m_bMaleAnims)
{
m_Male_Anim_Sound.SetAnimationIndexes(m_hObject);
m_Male_Anim_Sound.GenerateHitSpheres(m_hObject);
m_Male_Anim_Sound.SetSoundRoot("sounds\\enemies\\civilian");
m_bMaleAnims = DFALSE;
}
if(!m_bMale && m_bFemaleAnims)
{
m_Female_Anim_Sound.SetAnimationIndexes(m_hObject);
m_Female_Anim_Sound.GenerateHitSpheres(m_hObject);
m_Female_Anim_Sound.SetSoundRoot("sounds\\enemies\\f_civ");
m_bFemaleAnims = DFALSE;
}
if(m_bMale || m_bLabTech)
AI_Mgr::InitStatics(&m_Male_Anim_Sound);
else
AI_Mgr::InitStatics(&m_Female_Anim_Sound);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CacheFiles
//
// PURPOSE: Cache resources used by the object
//
// ----------------------------------------------------------------------- //
void CivilianAI::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_bSororitySkin)
{
SetCacheDirectory("sounds_ao\\enemies\\femalemisc");
CacheSoundFileRange("femdie", 1, 3);
CacheSoundFileRange("femgig", 1, 3);
CacheSoundFileRange("fempain", 1, 3);
}
else
#endif
if (m_bMale)
{
SetCacheDirectory("sounds\\enemies\\civilian");
CacheSoundFileRange("death", 1, 3);
CacheSoundFileRange("fear", 1, 3);
CacheSoundFileRange("idle", 1, 3);
CacheSoundFileRange("pain", 1, 3);
CacheSoundFileRange("spot", 1, 3);
}
else
{
SetCacheDirectory("sounds\\enemies\\f_civ");
CacheSoundFileRange("death", 1, 3);
CacheSoundFileRange("fear", 1, 3);
CacheSoundFileRange("idle", 1, 3);
CacheSoundFileRange("pain", 1, 3);
CacheSoundFileRange("spot", 1, 3);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -