📄 ishmaelai.cpp
字号:
Metacmd++;
char* szSound = "sounds\\enemies\\zealot\\magic.wav";
PlaySoundFromObject(m_hObject, szSound, 2000.0f, SOUNDPRIORITY_MISC_MEDIUM,
DFALSE, DTRUE, DTRUE);
DDWORD nType = EXP_DIVINE_SHOCKBALL;
DVector vPos, vNormal;
VEC_COPY(vPos, m_MoveObj.GetPos());
VEC_COPY(vNormal, m_MoveObj.GetUpVector());
//********************************************************************
// Create the explosion type
HMESSAGEWRITE hMessage = m_pServerDE->StartInstantSpecialEffectMessage(&vPos);
m_pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFX_ID);
m_pServerDE->WriteToMessageVector(hMessage, &vPos);
m_pServerDE->WriteToMessageVector(hMessage, &vNormal);
m_pServerDE->WriteToMessageDWord(hMessage, nType);
m_pServerDE->EndMessage(hMessage);
//********************************************************************
// Move all the objects within the radius back and randomly rotate them a little
ObjectList *ol = m_pServerDE->FindObjectsTouchingSphere(&vPos, LIFELEECH_PUSH_RADIUS);
if(ol)
{
DVector vObjPos, vObjVel, vUp;
DRotation rObjRot;
ObjectLink* pLink = ol->m_pFirstLink;
DFLOAT mag, randRot = MATH_PI * LIFELEECH_ROTATE_AMOUNT;
HOBJECT hObj;
short objType;
VEC_SET(vUp, 0.0f, 1.0f, 0.0f);
while(pLink)
{
hObj = pLink->m_hObject;
pLink = pLink->m_pNext;
objType = m_pServerDE->GetObjectType(hObj);
if(hObj == m_hObject) continue;
if((objType != OT_MODEL) && (objType != OT_WORLDMODEL)) continue;
// Get the information about the obj
m_pServerDE->GetObjectPos(hObj, &vObjPos);
m_pServerDE->GetObjectRotation(hObj, &rObjRot);
m_pServerDE->GetVelocity(hObj, &vObjVel);
// m_pServerDE->RotateAroundAxis(&rObjRot, &vUp, m_pServerDE->Random(-randRot, randRot));
// m_pServerDE->SetObjectRotation(hObj, &rObjRot);
VEC_SUB(vObjPos, vObjPos, vPos);
mag = LIFELEECH_PUSH_RADIUS - VEC_MAG(vObjPos);
if(mag < 0.0f) mag = 0.0f;
VEC_NORM(vObjPos);
VEC_MULSCALAR(vObjPos, vObjPos, mag * 5.0f);
m_pServerDE->GetGlobalForce(&vUp);
VEC_MULSCALAR(vUp, vUp, -0.15f);
VEC_ADD(vObjVel, vObjVel, vUp);
VEC_ADD(vObjVel, vObjVel, vObjPos);
// m_pServerDE->SetVelocity(hObj, &vObjVel);
m_pServerDE->GetObjectPos(hObj, &vObjPos);
DFLOAT fDamage = (DFLOAT)m_pServerDE->IntRandom(25,50);
DamageObject(m_hObject, this, hObj, fDamage, vObjVel, vObjPos, DAMAGE_TYPE_EXPLODE);
}
m_pServerDE->RelinquishList(ol);
}
RemoveMe();
}
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : IshmaelAI::ComputeState
// DESCRIPTION : Compute actual substate
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void IshmaelAI::ComputeState(int nStimType)
{
int nStim = nStimType;
if(nStimType == -1)
nStim = ComputeStimuli();
DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);
if(!nStim)
{
switch(m_nState)
{
case STATE_Idle: SetNewState(STATE_Idle); break;
case STATE_SearchVisualTarget: SetNewState(STATE_Idle); break;
case STATE_SearchSmellTarget: SetNewState(STATE_Idle); break;
case STATE_Escape_RunAway: SetNewState(STATE_Idle); break;
case STATE_Escape_Hide: SetNewState(STATE_Idle); break;
default: SetNewState(STATE_SearchVisualTarget); break;
}
}
else
{
if((m_fStimuli[HEALTH] < 0.1f) && (m_nState != STATE_Escape_Hide))
{
SetNewState(STATE_Escape_Hide);
return;
}
if(m_fStimuli[SENSE] < 0.65f || fHeight > m_vDims.y)
SetNewState(STATE_AttackFar);
else
SetNewState(STATE_AttackClose);
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : IshmaelAI::AI_STATE_AttackClose
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void IshmaelAI::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 && m_nCurMetacmd != MC_FIRE_STAND)
{
SetNewState(STATE_SearchVisualTarget);
return;
}
m_fStimuli[SENSE] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
switch(Metacmd)
{
case 1: MC_FaceTarget(); break;
case 2: if(m_fStimuli[SENSE] <= (m_fSensingDist * 0.20) && m_nCurMetacmd != MC_FIRE_STAND)
{
SetNewState(STATE_Teleport);
}
else
Metacmd++;
break;
case 3: MC_FaceTarget();
Metacmd--;
if((m_fStimuli[SENSE] >= (m_fSensingDist * 0.35) && m_nCurMetacmd != MC_FIRE_STAND)
|| fHeight > m_vDims.y)
{
ComputeState();
}
else
{
MC_Fire_Stand();
}
break;
case 4: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : IshmaelAI::AI_STATE_AttackFar
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void IshmaelAI::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_FIRE_STAND)
{
SetNewState(STATE_SearchVisualTarget);
return;
}
m_fStimuli[SENSE] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
switch(Metacmd)
{
case 1: MC_FaceTarget(); break;
case 2: if(m_fStimuli[SENSE] > (m_fSensingDist * 0.75) && fHeight <= m_vDims.y)
{
MC_Run();
}
else
Metacmd++;
break;
case 3: MC_FaceTarget();
Metacmd--;
if(m_fStimuli[SENSE] <= (m_fSensingDist * 0.75) || m_nCurMetacmd == MC_FIRE_STAND)
{
MC_Fire_Stand();
}
else
Metacmd++;
break;
case 4: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : IshmaelAI::AI_STATE_Escape_Hide
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void IshmaelAI::AI_STATE_Escape_Hide()
{
switch(Metacmd)
{
case 1: MC_Heal(); break;
case 2: ComputeState(); break;
}
return;
}
// ----------------------------------------------------------------------- //
// ROUTINE : IshmaelAI::AI_STATE_Teleport
// DESCRIPTION :
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
void IshmaelAI::AI_STATE_Teleport()
{
switch(Metacmd)
{
case 1: MC_FadeOut(); break;
case 2:
{
char szSound[256];
sprintf(szSound, "%s%d.wav", SOUND_LAUGH, m_pServerDE->IntRandom(1,3));
m_pAnim_Sound->PlaySound(m_hObject, szSound, 1000.0f, 100);
Metacmd++; break;
}
case 3:
{
IntersectQuery IQuery;
IntersectInfo IInfo;
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, m_fSensingDist);
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);
DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
dwFlags |= FLAG_SOLID;
m_pServerDE->SetObjectFlags(m_hObject, dwFlags);
Metacmd++;
break;
}
case 5: MC_FaceTarget(); break;
case 6: ComputeState(); break;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -