📄 naga.cpp
字号:
// ----------------------------------------------------------------------- //
void Naga::MC_Fire_Stand()
{
if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_FIRE_STAND)
{
if (m_nState == STATE_AttackFar)
{
if (m_fStimuli[SIGHT] > 0.0f && IsRandomChance(50))
{
m_InventoryMgr.ChangeWeapon(WEAP_NAGA_EYEBEAM);
DBOOL bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_RIFLE]);
}
else
{
m_iCeilingWhomps++;
if (m_iCeilingWhomps > NAGA_MAX_WHOMPS)
{
// Too many whomps, we use the eye beam for variety.
m_iCeilingWhomps = 0;
m_InventoryMgr.ChangeWeapon(WEAP_NAGA_EYEBEAM);
DBOOL bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_RIFLE]);
}
else
{
m_InventoryMgr.ChangeWeapon(WEAP_NAGA_DEBRIS);
DBOOL bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_MELEE]);
}
}
} else
{
if (IsRandomChance(25))
{
m_InventoryMgr.ChangeWeapon(WEAP_NAGA_EYEBEAM);
DBOOL bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_RIFLE]);
}
else
{
m_InventoryMgr.ChangeWeapon(WEAP_NAGA_SPIKE);
DBOOL bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_MAGIC]);
}
}
m_pServerDE->SetModelLooping(m_hObject, DFALSE);
m_bAnimating = DTRUE;
m_nCurMetacmd = MC_FIRE_STAND;
}
else
{
if(m_pServerDE->GetModelPlaybackState(m_hObject) & MS_PLAYDONE)
{
m_bAnimating = DFALSE;
Metacmd++;
return;
}
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Naga::AI_STATE_AttackClose
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Naga::AI_STATE_AttackClose()
{
//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
if(m_hTarget == DNULL && m_nCurMetacmd != MC_FIRE_STAND)
{
SetNewState(STATE_SearchVisualTarget);
return;
}
switch(Metacmd)
{
case 1: MC_FaceTarget(); break;
case 2: MC_Fire_Stand(); break;
case 3: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Naga::AI_STATE_AttackFar
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Naga::AI_STATE_AttackFar()
{
//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
if(m_hTarget == DNULL && m_nCurMetacmd != MC_FIRE_STAND)
{
SetNewState(STATE_SearchVisualTarget);
return;
}
switch(Metacmd)
{
case 1: MC_FaceTarget(); break;
case 2: MC_Fire_Stand(); break;
case 3: ComputeState(); break;
}
return;
}
void Naga::SetNewState(int nState)
{
DDWORD dwFlags;
// Hide the spike, just in case
dwFlags = m_pServerDE->GetObjectFlags(m_hSpike);
dwFlags &= ~FLAG_VISIBLE;
m_pServerDE->SetObjectFlags(m_hSpike, dwFlags);
AI_Mgr::SetNewState(nState);
}
DBOOL Naga::Fire(DBOOL bAltFire)
{
DVector vPos, vDir;
DRotation rRot;
// Sanity check (GK 9/18/98)
if (!m_InventoryMgr.GetCurrentWeapon())
return DFALSE;
switch(m_InventoryMgr.GetCurrentWeapon()->GetType())
{
case WEAP_NAGA_EYEBEAM:
{
m_pServerDE->GetModelNodeTransform(m_hObject,"head_gun",&vPos,&rRot);
VEC_SUB(vDir, m_vTargetPos, vPos);
break;
}
case WEAP_NAGA_SPIKE:
{
m_pServerDE->GetModelNodeTransform(m_hObject,"l_gun",&vPos,&rRot);
VEC_SUB(vDir, m_vTargetPos, vPos);
break;
}
default:
{
m_pServerDE->GetObjectPos(m_hObject,&vPos);
VEC_SUB(vDir, m_vTargetPos, vPos);
break;
}
}
VEC_NORM(vDir);
m_pServerDE->AlignRotation(&rRot, &vDir, DNULL);
m_InventoryMgr.FireCurrentWeapon(&vPos, &rRot, bAltFire);
return DTRUE;
}
void Naga::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
DVector vCol;
DFLOAT fAlpha;
m_pServerDE->GetObjectColor(m_hObject, &vCol.x,&vCol.y,&vCol.z,&fAlpha);
m_pServerDE->WriteToMessageDWord(hWrite, (DDWORD)m_iCeilingWhomps);
m_pServerDE->WriteToMessageObject(hWrite, m_hSpike);
m_pServerDE->WriteToMessageFloat(hWrite, m_fFullHealth);
m_pServerDE->WriteToMessageFloat(hWrite, fAlpha);
}
void Naga::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
DVector vCol;
DFLOAT fAlpha;
m_iCeilingWhomps = (int)(m_pServerDE->ReadFromMessageFloat(hRead));
m_hSpike = m_pServerDE->ReadFromMessageObject(hRead);
m_fFullHealth = m_pServerDE->ReadFromMessageFloat(hRead);
m_pServerDE->GetObjectColor(m_hObject, &vCol.x,&vCol.y,&vCol.z, &fAlpha);
fAlpha = m_pServerDE->ReadFromMessageFloat(hRead);
m_pServerDE->SetObjectColor(m_hObject, vCol.x,vCol.y,vCol.z,fAlpha);
}
void Naga::MC_FadeIn()
{
if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_FADEIN)
{
m_bAnimating = DTRUE;
m_nCurMetacmd = MC_FADEIN;
DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags = dwFlags | FLAG_SOLID;
m_pServerDE->SetObjectFlags(m_hObject,dwFlags);
}
else
{
DVector vColor;
DFLOAT fAlpha = 0.0f;
m_pServerDE->GetObjectColor(m_hObject,&vColor.x, &vColor.y, &vColor.z, &fAlpha);
fAlpha += 1.0/64;
if(fAlpha >= 1.0f)
fAlpha = 1.0f;
m_pServerDE->SetObjectColor(m_hObject,vColor.x,vColor.y,vColor.z, fAlpha);
if(fAlpha >= 1.0f)
{
m_bAnimating = DFALSE;
Metacmd++;
return;
}
}
return;
}
void Naga::MC_Dead()
{
if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_DEAD)
{
DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags &= ~FLAG_SOLID;
m_pServerDE->SetObjectFlags(m_hObject,dwFlags);
m_bAnimating = DTRUE;
m_nCurMetacmd = MC_DEAD;
}
else
{
DVector vColor;
DFLOAT fAlpha = 1.0f;
m_pServerDE->GetObjectColor(m_hObject,&vColor.x, &vColor.y, &vColor.z, &fAlpha);
fAlpha -= 1.0/64;
if(fAlpha <= 0.0f)
{
fAlpha = 0.0f;
DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags &= ~FLAG_VISIBLE;
m_pServerDE->SetObjectFlags(m_hObject, dwFlags);
}
m_pServerDE->SetObjectColor(m_hObject,vColor.x,vColor.y,vColor.z, fAlpha);
if(fAlpha <= 0.0f)
{
m_bAnimating = DFALSE;
Metacmd++;
return;
}
}
return;
}
void Naga::AI_STATE_Special1()
{
switch(Metacmd)
{
case 1:
MC_FadeIn();
break;
case 2:
DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags = dwFlags | FLAG_SOLID;
m_pServerDE->SetObjectFlags(m_hObject, dwFlags);
SetNewState(STATE_Idle);
break;
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CacheFiles
//
// PURPOSE: Cache resources used by the object
//
// ----------------------------------------------------------------------- //
void Naga::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\\naga");
CacheSoundFileRange("na_attack_", 1, 3);
CacheSoundFileRange("na_beam_", 1, 3);
CacheSoundFileRange("na_death_", 1, 3);
CacheSoundFileRange("na_howl_", 1, 3);
CacheSoundFileRange("na_idle_", 1, 3);
CacheSoundFileRange("na_pain_", 1, 3);
CacheSoundFileRange("na_taunt_", 1, 3);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -