Iskhodnyy_kod_Doom
.pdf// modify target threshold if (actor->threshold)
{
if (!actor->target
|| actor->target->health <= 0)
{
actor->threshold = 0;
}
else
actor->threshold--;
}
// turn towards movement direction if not there yet if (actor->movedir < 8)
{
actor->angle &= (7<<29);
delta = actor->angle - (actor->movedir << 29);
if (delta > 0)
actor->angle -= ANG90/2;
else if (delta < 0)
actor->angle += ANG90/2;
}
if (!actor->target
|| !(actor->target->flags&MF_SHOOTABLE))
{
// |
look for |
a new target |
if |
(P_LookForPlayers(actor,true)) |
|
|
return; |
// got a new target |
P_SetMobjState (actor, actor->info->spawnstate); return;
}
// do not attack twice in a row
if (actor->flags & MF_JUSTATTACKED)
{
actor->flags &= ~MF_JUSTATTACKED;
if (gameskill != sk_nightmare && !fastparm) P_NewChaseDir (actor);
return;
}
// check for melee attack if (actor->info->meleestate
&& P_CheckMeleeRange (actor))
{
if (actor->info->attacksound)
S_StartSound (actor, actor->info->attacksound);
P_SetMobjState (actor, actor->info->meleestate); return;
}
// check for missile attack
if (actor->info->missilestate)
{
if (gameskill < sk_nightmare
&& !fastparm && actor->movecount)
{
goto nomissile;
}
if (!P_CheckMissileRange (actor))
391
goto nomissile;
P_SetMobjState (actor, actor->info->missilestate); actor->flags |= MF_JUSTATTACKED;
return;
}
//?
nomissile:
//possibly choose another target if (netgame
&&!actor->threshold
&&!P_CheckSight (actor, actor->target) )
{
if (P_LookForPlayers(actor,true))
return; |
// got a new target |
}
//chase towards player if (--actor->movecount<0
||!P_Move (actor))
{
P_NewChaseDir (actor);
}
//make active sound
if (actor->info->activesound && P_Random () < 3)
{
S_StartSound (actor, actor->info->activesound);
}
}
//
// A_FaceTarget
//
void A_FaceTarget (mobj_t* actor)
{
if (!actor->target) return;
actor->flags &= ~MF_AMBUSH;
actor->angle = R_PointToAngle2 (actor->x, actor->y, actor->target->x, actor->target->y);
if (actor->target->flags & MF_SHADOW) actor->angle += (P_Random()-P_Random())<<21;
}
//
// A_PosAttack
//
void A_PosAttack (mobj_t* actor)
{
int |
angle; |
int |
damage; |
int |
slope; |
if (!actor->target) |
|
return; |
|
392
A_FaceTarget (actor); angle = actor->angle;
slope = P_AimLineAttack (actor, angle, MISSILERANGE);
S_StartSound (actor, sfx_pistol); angle += (P_Random()-P_Random())<<20; damage = ((P_Random()%5)+1)*3;
P_LineAttack (actor, angle, MISSILERANGE, slope, damage);
}
void A_SPosAttack (mobj_t* actor)
{ |
|
int |
i; |
int |
angle; |
int |
bangle; |
int |
damage; |
int |
slope; |
if (!actor->target) |
|
return; |
|
S_StartSound (actor, sfx_shotgn);
A_FaceTarget (actor);
bangle = actor->angle;
slope = P_AimLineAttack (actor, bangle, MISSILERANGE);
for (i=0 ; i<3 ; i++)
{
angle = bangle + ((P_Random()-P_Random())<<20); damage = ((P_Random()%5)+1)*3;
P_LineAttack (actor, angle, MISSILERANGE, slope, damage);
}
}
void A_CPosAttack (mobj_t* actor)
{ |
|
int |
angle; |
int |
bangle; |
int |
damage; |
int |
slope; |
if (!actor->target) return;
S_StartSound (actor, sfx_shotgn);
A_FaceTarget (actor);
bangle = actor->angle;
slope = P_AimLineAttack (actor, bangle, MISSILERANGE);
angle = bangle + ((P_Random()-P_Random())<<20); damage = ((P_Random()%5)+1)*3;
P_LineAttack (actor, angle, MISSILERANGE, slope, damage);
}
void A_CPosRefire (mobj_t* actor)
{
// keep firing unless target got out of sight A_FaceTarget (actor);
if (P_Random () < 40) return;
if (!actor->target
|| actor->target->health <= 0
393
|| !P_CheckSight (actor, actor->target) )
{
P_SetMobjState (actor, actor->info->seestate);
}
}
void A_SpidRefire (mobj_t* actor)
{
// keep firing unless target got out of sight A_FaceTarget (actor);
if (P_Random () < 10) return;
if (!actor->target
||actor->target->health <= 0
||!P_CheckSight (actor, actor->target) )
{
P_SetMobjState (actor, actor->info->seestate);
}
}
void A_BspiAttack (mobj_t *actor)
{
if (!actor->target) return;
A_FaceTarget (actor);
// launch a missile
P_SpawnMissile (actor, actor->target, MT_ARACHPLAZ);
}
//
// A_TroopAttack
//
void A_TroopAttack (mobj_t* actor)
{
int |
damage; |
if (!actor->target) return;
A_FaceTarget (actor);
if (P_CheckMeleeRange (actor))
{
S_StartSound (actor, sfx_claw); damage = (P_Random()%8+1)*3;
P_DamageMobj (actor->target, actor, actor, damage); return;
}
// launch a missile
P_SpawnMissile (actor, actor->target, MT_TROOPSHOT);
}
void A_SargAttack (mobj_t* actor)
{
int |
damage; |
if (!actor->target)
394
return;
A_FaceTarget (actor);
if (P_CheckMeleeRange (actor))
{
|
damage = ((P_Random()%10)+1)*4; |
|
P_DamageMobj (actor->target, actor, actor, damage); |
} |
|
} |
|
void A_HeadAttack (mobj_t* actor) |
|
{ |
|
int |
damage; |
if (!actor->target) return;
A_FaceTarget (actor);
if (P_CheckMeleeRange (actor))
{
damage = (P_Random()%6+1)*10;
P_DamageMobj (actor->target, actor, actor, damage); return;
}
// launch a missile
P_SpawnMissile (actor, actor->target, MT_HEADSHOT);
}
void A_CyberAttack (mobj_t* actor)
{
if (!actor->target) return;
A_FaceTarget (actor);
P_SpawnMissile (actor, actor->target, MT_ROCKET);
}
void A_BruisAttack (mobj_t* actor)
{
int |
damage; |
if (!actor->target) return;
if (P_CheckMeleeRange (actor))
{
S_StartSound (actor, sfx_claw); damage = (P_Random()%8+1)*10;
P_DamageMobj (actor->target, actor, actor, damage); return;
}
// launch a missile
P_SpawnMissile (actor, actor->target, MT_BRUISERSHOT);
}
//
// A_SkelMissile
//
void A_SkelMissile (mobj_t* actor)
{
mobj_t* mo;