📄 gideon.cpp
字号:
bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_RIFLE]);
}
}
else
{
if (IsRandomChance(50))
{
m_InventoryMgr.ChangeWeapon(WEAP_GIDEON_WIND);
bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_RIFLE]);
}
else
{
m_InventoryMgr.ChangeWeapon(WEAP_NAGA_EYEBEAM);
bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_RIFLE]);
}
}
m_pServerDE->SetModelLooping(m_hObject, DFALSE);
m_bAnimating = DTRUE;
m_nCurMetacmd = MC_FIRE_STAND;
}
else
{
if(m_pServerDE->GetModelPlaybackState(m_hObject) & MS_PLAYDONE)
{
m_InventoryMgr.ChangeWeapon(WEAP_SOUL_HOOK);
m_bAnimating = DFALSE;
Metacmd++;
return;
}
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Gideon::AI_STATE_AttackClose
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Gideon::AI_STATE_AttackClose()
{
//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
if(m_hTarget == DNULL)
{
SetNewState(STATE_SearchVisualTarget);
return;
}
switch(Metacmd)
{
case 1: MC_FaceTarget(); break;
case 2: m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
if((m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.90f)) || m_nCurMetacmd == MC_FIRE_STAND)
MC_Fire_Stand();
else
{
MC_FaceTarget();
Metacmd--;
if(m_fStimuli[SIGHT] > (m_fSeeingDist * 0.40))
{
SetNewState(STATE_Special1);
}
else
{
MC_Walk();
}
}
break;
case 3: if(m_nCurMetacmd == MC_DODGE_RIGHT)
MC_Dodge_Right();
else if(m_nCurMetacmd == MC_DODGE_LEFT)
MC_Dodge_Left();
else if(IsRandomChance(50))
MC_Dodge_Right();
else
MC_Dodge_Left();
break;
case 4: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : Gideon::AI_STATE_AttackFar
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void Gideon::AI_STATE_AttackFar()
{
//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
if(m_hTarget == DNULL)
{
SetNewState(STATE_SearchVisualTarget);
return;
}
m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
switch(Metacmd)
{
case 1: MC_FaceTarget();
Metacmd--;
if((m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.30f)) || m_nCurMetacmd == MC_FIRE_STAND)
{
MC_Fire_Stand();
}
else
{
SetNewState(STATE_Special1);
}
break;
case 2: MC_Taunt_Bold(); break;
case 3: MC_FaceTarget();
Metacmd--;
if(m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.40f))
{
SetNewState(STATE_Special1);
}
else
{
MC_Walk();
}
break;
case 4: ComputeState(); break;
}
return;
}
void Gideon::MagicPowerup()
{
DVector offset;
VEC_SET(offset, 0.0f, 0.0f, 0.0f);
// Display the 'powerup' effect around Gideon
HMESSAGEWRITE hMessage = m_pServerDE->StartInstantSpecialEffectMessage(&offset);
m_pServerDE->WriteToMessageByte(hMessage, SFX_OBJECTFX_ID);
m_pServerDE->WriteToMessageObject(hMessage, m_hObject);
m_pServerDE->WriteToMessageVector(hMessage, &offset);
m_pServerDE->WriteToMessageFloat(hMessage, 0.0f);
m_pServerDE->WriteToMessageDWord(hMessage, 0);
m_pServerDE->WriteToMessageDWord(hMessage, OBJFX_POWERUP_1);
m_pServerDE->WriteToMessageDWord(hMessage, 0);
m_pServerDE->EndMessage(hMessage);
}
void Gideon::MC_FadeOut()
{
if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_FADEOUT)
{
m_bAnimating = DTRUE;
m_nCurMetacmd = MC_FADEOUT;
DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
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/16;
if(fAlpha <= 0.0f)
fAlpha = 0.0f;
m_pServerDE->SetObjectColor(m_hObject,vColor.x,vColor.y,vColor.z, fAlpha);
if(fAlpha <= 0.0f)
{
m_bAnimating = DFALSE;
Metacmd++;
return;
}
}
return;
}
void Gideon::AI_STATE_Teleport()
{
switch(Metacmd)
{
case 1: MC_FadeOut(); break;
case 2:
{
m_pAnim_Sound->PlaySound(m_hObject, "teleport.wav", 1000.0f, 100);
Metacmd++; break;
}
case 3:
{
IntersectQuery IQuery;
IntersectInfo IInfo;
DDWORD dwFlags;
IQuery.m_Flags = INTERSECT_OBJECTS;
IQuery.m_FilterFn = DNULL;
DVector vDir;
VEC_SET(vDir, m_pServerDE->Random(-1.0f,1.0f), 0.0f, m_pServerDE->Random(-1.0f,1.0f));
VEC_COPY(IQuery.m_From, m_MoveObj.GetPos());
VEC_ADDSCALED(IQuery.m_To, IQuery.m_From, vDir, 1500.0f);
dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags = dwFlags | FLAG_SOLID;
m_pServerDE->SetObjectFlags(m_hObject,dwFlags);
if(m_pServerDE->IntersectSegment(&IQuery, &IInfo))
{
VEC_ADDSCALED(IInfo.m_Point, IInfo.m_Point, vDir, -100.0f);
m_pServerDE->MoveObject(m_hObject, &IInfo.m_Point);
}
else
{
VEC_ADDSCALED(IInfo.m_Point, IQuery.m_To, vDir, -100.0f);
m_pServerDE->MoveObject(m_hObject, &IQuery.m_To);
}
Metacmd++;
break;
}
case 4:
{
DVector vColor;
DFLOAT fAlpha = 1.0f;
m_pServerDE->GetObjectColor(m_hObject,&vColor.x, &vColor.y, &vColor.z, &fAlpha);
m_pServerDE->SetObjectColor(m_hObject,vColor.x,vColor.y,vColor.z, 1.0f);
Metacmd++;
break;
}
case 5: MC_FaceTarget(); break;
case 6: ComputeState(); break;
}
return;
}
void Gideon::AI_STATE_Special1()
{
if (!m_hTarget)
{
SetNewState(STATE_Teleport);
}
switch(Metacmd)
{
case 1: MC_FadeOut(); break;
case 2:
{
// char szSound[256];
// strcpy(szSound, SOUND_LAUGH);
// m_pAnim_Sound->GetSoundPath(szSound,m_pServerDE->IntRandom(1,3));
// PlayAISound(szSound, 1000.0f, PLAY_WAIT);
Metacmd++; break;
}
case 3:
{
IntersectQuery IQuery;
IntersectInfo IInfo;
DDWORD dwFlags;
IQuery.m_Flags = INTERSECT_OBJECTS;
IQuery.m_FilterFn = DNULL;
DVector vDir, vTarget;
VEC_SET(vDir, m_pServerDE->Random(-1.0f,1.0f), 0.2f, m_pServerDE->Random(-1.0f,1.0f));
m_pServerDE->GetObjectPos(m_hTarget,&vTarget);
dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags = dwFlags | FLAG_SOLID;
m_pServerDE->SetObjectFlags(m_hObject,dwFlags);
VEC_COPY(IQuery.m_From, vTarget);
VEC_ADDSCALED(IQuery.m_To, IQuery.m_From, vDir, m_pServerDE->Random(400.0f,600.0f));
if(m_pServerDE->IntersectSegment(&IQuery, &IInfo))
{
VEC_ADDSCALED(IInfo.m_Point, IInfo.m_Point, vDir, -300.0f);
m_pServerDE->MoveObject(m_hObject, &IInfo.m_Point);
}
else
{
VEC_ADDSCALED(IInfo.m_Point, IQuery.m_To, vDir, -300.0f);
m_pServerDE->MoveObject(m_hObject, &IQuery.m_To);
}
Metacmd++;
break;
}
case 4:
{
DVector vColor;
DFLOAT fAlpha = 1.0f;
m_pServerDE->GetObjectColor(m_hObject,&vColor.x, &vColor.y, &vColor.z, &fAlpha);
m_pServerDE->SetObjectColor(m_hObject,vColor.x,vColor.y,vColor.z, 1.0f);
Metacmd++;
break;
}
case 5: MC_FaceTarget(); break;
case 6: ComputeState(); break;
}
return;
}
void Gideon::MC_Extra(const char *lpszText)
{
if(strncmp(lpszText,"powerup",7) == 0)
{
MagicPowerup();
}
else
{
sprintf(m_szFireNode,"%s",lpszText);
Fire();
}
}
DBOOL Gideon::Fire(DBOOL bAltFire)
{
DVector vPos, vDir;
DRotation rRot;
// Sanity check (GK 9/18/98)
if (!m_InventoryMgr.GetCurrentWeapon())
return DFALSE;
if(!m_pServerDE->GetModelNodeTransform(m_hObject,m_szFireNode,&vPos,&rRot))
{
m_pServerDE->GetObjectPos(m_hObject,&vPos);
VEC_COPY(vDir, m_MoveObj.GetForwardVector());
}
else
{
VEC_SUB(vDir, m_vTargetPos, vPos);
}
VEC_NORM(vDir);
m_pServerDE->AlignRotation(&rRot, &vDir, DNULL);
DDWORD m_nFiredWeapon = m_InventoryMgr.FireCurrentWeapon(&vPos, &rRot, bAltFire);
return DTRUE;
}
void Gideon::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return;
pServerDE->WriteToMessageFloat(hWrite, m_fShieldDuration);
pServerDE->WriteToMessageFloat(hWrite, m_fLastShield);
pServerDE->WriteToMessageFloat(hWrite, m_fFullHealth);
pServerDE->WriteToMessageFloat(hWrite, m_fLastPanic);
}
void Gideon::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE) return;
m_fShieldDuration = pServerDE->ReadFromMessageFloat(hRead);
m_fLastShield = pServerDE->ReadFromMessageFloat(hRead);
m_fFullHealth = m_pServerDE->ReadFromMessageFloat(hRead);
m_fLastPanic = m_pServerDE->ReadFromMessageFloat(hRead);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CacheFiles
//
// PURPOSE: Cache resources used by the object
//
// ----------------------------------------------------------------------- //
void Gideon::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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -