DEFINE_ACTION_FUNCTION(AActor, A_CPosAttack) { int angle; int bangle; int damage; int slope; if (!self->target) return; // [RH] Andy Baker's stealth monsters if (self->flags & MF_STEALTH) { self->visdir = 1; } S_Sound (self, CHAN_WEAPON, self->AttackSound, 1, ATTN_NORM); A_FaceTarget (self); bangle = self->angle; slope = P_AimLineAttack (self, bangle, MISSILERANGE); angle = bangle + (pr_cposattack.Random2() << 20); damage = ((pr_cposattack()%5)+1)*3; P_LineAttack (self, angle, MISSILERANGE, slope, damage, NAME_Hitscan, NAME_BulletPuff); }
DEFINE_ACTION_FUNCTION(AActor, A_SnoutAttack) { angle_t angle; int damage; int slope; player_t *player; AActor *puff; AActor *linetarget; if (NULL == (player = self->player)) { return; } damage = 3+(pr_snoutattack()&3); angle = player->mo->angle; slope = P_AimLineAttack(player->mo, angle, MELEERANGE, &linetarget); puff = P_LineAttack(player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, "SnoutPuff", true, &linetarget); S_Sound(player->mo, CHAN_VOICE, "PigActive", 1, ATTN_NORM); if(linetarget) { AdjustPlayerAngle(player->mo, linetarget); if(puff != NULL) { // Bit something S_Sound(player->mo, CHAN_VOICE, "PigAttack", 1, ATTN_NORM); } } }
angle_t P_BulletSlope (AActor *mo, AActor **pLineTarget) { static const int angdiff[3] = { -1<<26, 1<<26, 0 }; int i; angle_t an; angle_t pitch; AActor *linetarget; // see which target is to be aimed at i = 2; do { an = mo->angle + angdiff[i]; pitch = P_AimLineAttack (mo, an, 16*64*FRACUNIT, &linetarget); if (mo->player != NULL && level.IsFreelookAllowed() && mo->player->userinfo.GetAimDist() <= ANGLE_1/2) { break; } } while (linetarget == NULL && --i >= 0); if (pLineTarget != NULL) { *pLineTarget = linetarget; } return pitch; }
void A_SnoutAttack (AActor *actor) { angle_t angle; int damage; int slope; player_t *player; if (NULL == (player = actor->player)) { return; } damage = 3+(pr_snoutattack()&3); angle = player->mo->angle; slope = P_AimLineAttack(player->mo, angle, MELEERANGE); PuffSpawned = NULL; P_LineAttack(player->mo, angle, MELEERANGE, slope, damage, MOD_HIT, RUNTIME_CLASS(ASnoutPuff)); S_Sound(player->mo, CHAN_VOICE, "PigActive", 1, ATTN_NORM); if(linetarget) { AdjustPlayerAngle(player->mo); if(PuffSpawned) { // Bit something S_Sound(player->mo, CHAN_VOICE, "PigAttack", 1, ATTN_NORM); } } }
// // A_Saw // void A_Saw(player_t *player, pspdef_t *psp) { int damage = 2 * (P_Random() % 10 + 1); angle_t angle = player->mo->angle + ((P_Random() - P_Random()) << 18); int slope = P_AimLineAttack(player->mo, angle, MELEERANGE + 1); // use meleerange + 1 so the puff doesn't skip the flash P_LineAttack(player->mo, angle, MELEERANGE + 1, slope, damage); if (!linetarget) { S_StartSound(player->mo, sfx_sawful); return; } S_StartSound (player->mo, sfx_sawhit); // turn to face target angle = R_PointToAngle2(player->mo->x, player->mo->y, linetarget->x, linetarget->y); if (angle - player->mo->angle > ANG180) { if (angle - player->mo->angle < -ANG90 / 20) player->mo->angle = angle + ANG90 / 21; else player->mo->angle -= ANG90 / 20; } else { if (angle - player->mo->angle > ANG90 / 20) player->mo->angle = angle - ANG90 / 21; else player->mo->angle += ANG90 / 20; } player->mo->flags |= MF_JUSTATTACKED; }
// // A_BFGSpray // Spawn a BFG explosion on every monster in view // void A_BFGSpray(mobj_t *mo) { int i; // offset angles from its attack angle for (i = 0; i < 40; i++) { int j; int damage; angle_t an = mo->angle - ANG90 / 2 + ANG90 / 40 * i; // mo->target is the originator (player) // of the missile P_AimLineAttack(mo->target, an, 16 * 64 * FRACUNIT); if (!linetarget) continue; P_SpawnMobj(linetarget->x, linetarget->y, linetarget->z + (linetarget->height >> 2), MT_EXTRABFG); damage = 0; for (j = 0; j < 15; j++) damage += (P_Random() & 7) + 1; P_DamageMobj(linetarget, mo->target, mo->target, damage); } }
void C_DECL A_Punch(player_t *player, pspdef_t *psp) { angle_t angle; int damage; float slope; P_ShotAmmo(player); player->update |= PSF_AMMO; if(IS_CLIENT) return; damage = (P_Random() % 10 + 1) * 2; if(player->powers[PT_STRENGTH]) damage *= 10; angle = player->plr->mo->angle; angle += (P_Random() - P_Random()) << 18; slope = P_AimLineAttack(player->plr->mo, angle, PLRMELEERANGE); P_LineAttack(player->plr->mo, angle, PLRMELEERANGE, slope, damage, MT_PUFF); // Turn to face target. if(lineTarget) { S_StartSound(SFX_PUNCH, player->plr->mo); player->plr->mo->angle = M_PointToAngle2(player->plr->mo->origin, lineTarget->origin); player->plr->flags |= DDPF_FIXANGLES; } }
DEFINE_ACTION_FUNCTION(AActor, A_BeakAttackPL2) { angle_t angle; int damage; int slope; player_t *player; AActor *linetarget; if (NULL == (player = self->player)) { return; } damage = pr_beakatkpl2.HitDice (4); angle = player->mo->angle; slope = P_AimLineAttack (player->mo, angle, MELEERANGE, &linetarget); P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, "BeakPuff", true, &linetarget); if (linetarget) { player->mo->angle = player->mo->AngleTo(linetarget); } P_PlayPeck (player->mo); player->chickenPeck = 12; player->psprites[ps_weapon].tics -= pr_beakatkpl2()&3; }
DEFINE_ACTION_FUNCTION(AActor, A_TemplarAttack) { int damage; angle_t angle; int pitch; int pitchdiff; if (self->target == NULL) return; S_Sound (self, CHAN_WEAPON, "templar/shoot", 1, ATTN_NORM); // [CW] Tell clients to play the sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_WEAPON, "templar/shoot", 1, ATTN_NORM ); A_FaceTarget (self); pitch = P_AimLineAttack (self, self->angle, MISSILERANGE); for (int i = 0; i < 10; ++i) { damage = (pr_templar() & 4) * 2; angle = self->angle + (pr_templar.Random2() << 19); pitchdiff = pr_templar.Random2() * 332063; P_LineAttack (self, angle, MISSILERANGE+64*FRACUNIT, pitch+pitchdiff, damage, NAME_None, NAME_MaulerPuff); } }
static bool TryPunch(APlayerPawn *pmo, angle_t angle, int damage, fixed_t power) { const PClass *pufftype; AActor *linetarget; int slope; slope = P_AimLineAttack (pmo, angle, 2*MELEERANGE, &linetarget); if (linetarget != NULL) { if (++pmo->weaponspecial >= 3) { damage <<= 1; power *= 3; pufftype = PClass::FindClass ("HammerPuff"); } else { pufftype = PClass::FindClass ("PunchPuff"); } P_LineAttack (pmo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, pufftype, true, &linetarget); if (linetarget != NULL) { if (linetarget->player != NULL || (linetarget->Mass != INT_MAX && (linetarget->flags3 & MF3_ISMONSTER))) { P_ThrustMobj (linetarget, angle, power); } AdjustPlayerAngle (pmo, linetarget); return true; } } return false; }
AActor *P_SpawnSubMissile (AActor *source, PClassActor *type, AActor *target) { AActor *other = Spawn (type, source->Pos(), ALLOW_REPLACE); if (other == NULL) { return NULL; } other->target = target; other->Angles.Yaw = source->Angles.Yaw; other->VelFromAngle(); if (other->flags4 & MF4_SPECTRAL) { if (source->flags & MF_MISSILE && source->flags4 & MF4_SPECTRAL) { other->FriendPlayer = source->FriendPlayer; } else { other->SetFriendPlayer(target->player); } } if (P_CheckMissileSpawn (other, source->radius)) { DAngle pitch = P_AimLineAttack (source, source->Angles.Yaw, 1024.); other->Vel.Z = -other->Speed * pitch.Sin(); return other; } return NULL; }
// // A_PosAttack // DEFINE_ACTION_FUNCTION(AActor, A_PosAttack) { int angle; int damage; int slope; // [BC] Server takes care of the rest of this. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { S_Sound( self, CHAN_WEAPON, "grunt/attack", 1, ATTN_NORM ); return; } if (!self->target) return; A_FaceTarget (self); angle = self->angle; slope = P_AimLineAttack (self, angle, MISSILERANGE); S_Sound (self, CHAN_WEAPON, "grunt/attack", 1, ATTN_NORM); angle += pr_posattack.Random2() << 20; damage = ((pr_posattack()%5)+1)*3; P_LineAttack (self, angle, MISSILERANGE, slope, damage, NAME_None, NAME_BulletPuff); }
DAngle P_BulletSlope (AActor *mo, FTranslatedLineTarget *pLineTarget, int aimflags) { static const double angdiff[3] = { -5.625f, 5.625f, 0 }; int i; DAngle an; DAngle pitch; FTranslatedLineTarget scratch; if (pLineTarget == NULL) pLineTarget = &scratch; // see which target is to be aimed at i = 2; do { an = mo->Angles.Yaw + angdiff[i]; pitch = P_AimLineAttack (mo, an, 16.*64, pLineTarget, 0., aimflags); if (mo->player != NULL && level.IsFreelookAllowed() && mo->player->userinfo.GetAimDist() <= 0.5) { break; } } while (pLineTarget->linetarget == NULL && --i >= 0); return pitch; }
void A_Punch(player_t* player, pspdef_t* psp) { angle_t angle; int damage; int slope = 0; damage = ((P_Random() & 7) + 1) * 3; if(player->powers[pw_strength]) damage *= 10; angle = player->mo->angle; angle += P_RandomShift(18); slope = P_AimLineAttack(player->mo, angle, 0, MELEERANGE); P_LineAttack(player->mo, angle, MELEERANGE, slope, damage); // turn to face target if(linetarget) { S_StartSound(player->mo, sfx_punch); player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, linetarget->x, linetarget->y); } }
AActor *P_SpawnSubMissile (AActor *source, PClassActor *type, AActor *target) { AActor *other = Spawn (type, source->Pos(), ALLOW_REPLACE); if (other == NULL) { return NULL; } other->target = target; other->angle = source->angle; other->velx = FixedMul (other->Speed, finecosine[source->angle >> ANGLETOFINESHIFT]); other->vely = FixedMul (other->Speed, finesine[source->angle >> ANGLETOFINESHIFT]); if (other->flags4 & MF4_SPECTRAL) { if (source->flags & MF_MISSILE && source->flags4 & MF4_SPECTRAL) { other->FriendPlayer = source->FriendPlayer; } else { other->SetFriendPlayer(target->player); } } if (P_CheckMissileSpawn (other, source->radius)) { angle_t pitch = P_AimLineAttack (source, source->angle, 1024*FRACUNIT); other->velz = FixedMul (-finesine[pitch>>ANGLETOFINESHIFT], other->Speed); return other; }
static bool TryPunch(APlayerPawn *pmo, DAngle angle, int damage, int power) { PClassActor *pufftype; FTranslatedLineTarget t; DAngle slope; slope = P_AimLineAttack (pmo, angle, 2*MELEERANGE, &t); if (t.linetarget != NULL) { if (++pmo->weaponspecial >= 3) { damage <<= 1; power *= 3; pufftype = PClass::FindActor("HammerPuff"); } else { pufftype = PClass::FindActor("PunchPuff"); } P_LineAttack (pmo, angle, 2*MELEERANGE, slope, damage, NAME_Melee, pufftype, true, &t); if (t.linetarget != NULL) { if (t.linetarget->player != NULL || (t.linetarget->Mass != INT_MAX && (t.linetarget->flags3 & MF3_ISMONSTER))) { t.linetarget->Thrust(t.angleFromSource, power); } AdjustPlayerAngle (pmo, &t); return true; } } return false; }
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_M_FirePistol) { // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->target == NULL) return; ACTION_PARAM_START(1); ACTION_PARAM_BOOL(accurate, 0); S_Sound (self, CHAN_WEAPON, "weapons/pistol", 1, ATTN_NORM); // [BC] If we're the server, tell clients to play this sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_WEAPON, "weapons/pistol", 1, ATTN_NORM ); A_FaceTarget (self); P_GunShot2 (self, accurate, P_AimLineAttack (self, self->angle, MISSILERANGE), PClass::FindClass(NAME_BulletPuff)); }
static void MarinePunch(AActor *self, int damagemul) { angle_t angle; int damage; int pitch; AActor *linetarget; if (self->target == NULL) return; damage = ((pr_m_punch()%10+1) << 1) * damagemul; A_FaceTarget (self); angle = self->angle + (pr_m_punch.Random2() << 18); pitch = P_AimLineAttack (self, angle, MELEERANGE, &linetarget); P_LineAttack (self, angle, MELEERANGE, pitch, damage, NAME_Melee, NAME_BulletPuff, true, &linetarget); // turn to face target if (linetarget) { S_Sound (self, CHAN_WEAPON, "*fist", 1, ATTN_NORM); self->angle = self->AngleTo(linetarget); } }
void A_Punch(player_t *player, pspdef_t *psp) { angle_t angle; int t, slope, damage = (P_Random(pr_punch)%10+1)<<1; if (player->powers[pw_strength]) damage *= 10; angle = player->mo->angle; // killough 5/5/98: remove dependence on order of evaluation: t = P_Random(pr_punchangle); angle += (t - P_Random(pr_punchangle))<<18; slope = P_AimLineAttack(player->mo, angle, MELEERANGE); P_LineAttack(player->mo, angle, MELEERANGE, slope, damage); if (!linetarget) return; S_StartSound(player->mo, sfx_punch); // turn to face target player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, linetarget->x, linetarget->y); }
DEFINE_ACTION_FUNCTION(AActor, A_JabDagger) { angle_t angle; int damage; int pitch; int power; AActor *linetarget; power = MIN(10, self->player->mo->stamina / 10); damage = (pr_jabdagger() % (power + 8)) * (power + 2); if (self->FindInventory<APowerStrength>()) { damage *= 10; } angle = self->angle + (pr_jabdagger.Random2() << 18); pitch = P_AimLineAttack (self, angle, 80*FRACUNIT, &linetarget); P_LineAttack (self, angle, 80*FRACUNIT, pitch, damage, NAME_Melee, "StrifeSpark", true, &linetarget); // turn to face target if (linetarget) { S_Sound (self, CHAN_WEAPON, linetarget->flags & MF_NOBLOOD ? "misc/metalhit" : "misc/meathit", 1, ATTN_NORM); self->angle = self->AngleTo(linetarget); self->flags |= MF_JUSTATTACKED; P_DaggerAlert (self, linetarget); } else { S_Sound (self, CHAN_WEAPON, "misc/swish", 1, ATTN_NORM); } }
DEFINE_ACTION_FUNCTION(AActor, A_BeakAttackPL2) { PARAM_ACTION_PROLOGUE; DAngle angle; int damage; DAngle slope; player_t *player; FTranslatedLineTarget t; if (NULL == (player = self->player)) { return 0; } damage = pr_beakatkpl2.HitDice (4); angle = player->mo->Angles.Yaw; slope = P_AimLineAttack (player->mo, angle, MELEERANGE); P_LineAttack (player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, "BeakPuff", true, &t); if (t.linetarget) { player->mo->Angles.Yaw = t.angleFromSource; } P_PlayPeck (player->mo); player->chickenPeck = 12; player->psprites[ps_weapon].tics -= pr_beakatkpl2()&3; return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_M_FireShotgun) { int pitch; // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->target == NULL) return; S_Sound (self, CHAN_WEAPON, "weapons/shotgf", 1, ATTN_NORM); // [BC] If we're the server, tell clients to play this sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_WEAPON, "weapons/shotgf", 1, ATTN_NORM ); A_FaceTarget (self); pitch = P_AimLineAttack (self, self->angle, MISSILERANGE); for (int i = 0; i < 7; ++i) { P_GunShot2 (self, false, pitch, PClass::FindClass(NAME_BulletPuff)); } self->special1 = level.maptime + 27; }
static void P_BulletSlope(mobj_t *mo) { angle_t an = mo->angle; // see which target is to be aimed at /* killough 8/2/98: make autoaiming prefer enemies */ uint_64_t mask = mbf_features ? MF_FRIEND : 0; do { bulletslope = P_AimLineAttack(mo, an, 16*64*FRACUNIT, mask); if (!linetarget) bulletslope = P_AimLineAttack(mo, an += 1<<26, 16*64*FRACUNIT, mask); if (!linetarget) bulletslope = P_AimLineAttack(mo, an -= 2<<26, 16*64*FRACUNIT, mask); } while (mask && (mask=0, !linetarget)); /* killough 8/2/98 */ }
OVERLAY static void P_BulletSlope(mobj_t *mo) { angle_t an = mo->angle; // see which target is to be aimed at bulletslope = P_AimLineAttack(mo, an, 16*64*FRACUNIT); if (!linetarget) { an += 1<<26; bulletslope = P_AimLineAttack(mo, an, 16*64*FRACUNIT); if (!linetarget) { an -= 2<<26; bulletslope = P_AimLineAttack(mo, an, 16*64*FRACUNIT); } } }
void A_Saw(player_t *player, pspdef_t *psp) { int slope, damage = 2*(P_Random(pr_saw)%10+1); angle_t angle = player->mo->angle; // killough 5/5/98: remove dependence on order of evaluation: int t = P_Random(pr_saw); angle += (t - P_Random(pr_saw))<<18; /* Use meleerange + 1 so that the puff doesn't skip the flash * killough 8/2/98: make autoaiming prefer enemies */ if (!mbf_features || (slope = P_AimLineAttack(player->mo, angle, MELEERANGE+1, MF_FRIEND), !linetarget)) slope = P_AimLineAttack(player->mo, angle, MELEERANGE+1, 0); P_LineAttack(player->mo, angle, MELEERANGE+1, slope, damage); if (!linetarget) { S_StartSound(player->mo, sfx_sawful); return; } S_StartSound(player->mo, sfx_sawhit); // turn to face target angle = R_PointToAngle2(player->mo->x, player->mo->y, linetarget->x, linetarget->y); if (angle - player->mo->angle > ANG180) { if (angle - player->mo->angle < -ANG90/20) player->mo->angle = angle + ANG90/21; else player->mo->angle -= ANG90/20; } else { if (angle - player->mo->angle > ANG90/20) player->mo->angle = angle - ANG90/21; else player->mo->angle += ANG90/20; } player->mo->flags |= MF_JUSTATTACKED; R_SmoothPlaying_Reset(player); // e6y }
static void P_BulletSlope(mobj_t *mo) { angle_t an = mo->angle; // see which target is to be aimed at /* killough 8/2/98: make autoaiming prefer enemies */ uint_64_t mask = mbf_features ? MF_FRIEND : 0; do { bulletslope = P_AimLineAttack(mo, an, 16*64*FRACUNIT, mask); if (!linetarget) bulletslope = P_AimLineAttack(mo, an += 1<<26, 16*64*FRACUNIT, mask); if (!linetarget) bulletslope = P_AimLineAttack(mo, an -= 2<<26, 16*64*FRACUNIT, mask); } while (mask && (mask=0, !linetarget)); /* killough 8/2/98 */ if (!linetarget && comperr(comperr_freeaim)) bulletslope = finetangent[(ANG90 - mo->pitch) >> ANGLETOFINESHIFT]; }
DEFINE_ACTION_FUNCTION(AActor, A_FireConePL1) { PARAM_ACTION_PROLOGUE; angle_t angle; int damage; int slope; int i; AActor *mo; bool conedone=false; player_t *player; AActor *linetarget; if (NULL == (player = self->player)) { return 0; } AWeapon *weapon = self->player->ReadyWeapon; if (weapon != NULL) { if (!weapon->DepleteAmmo (weapon->bAltFire)) return 0; } S_Sound (self, CHAN_WEAPON, "MageShardsFire", 1, ATTN_NORM); damage = 90+(pr_cone()&15); for (i = 0; i < 16; i++) { angle = self->angle+i*(ANG45/16); slope = P_AimLineAttack (self, angle, MELEERANGE, &linetarget, 0, ALF_CHECK3D); if (linetarget) { P_DamageMobj (linetarget, self, self, damage, NAME_Ice); conedone = true; break; } } // didn't find any creatures, so fire projectiles if (!conedone) { mo = P_SpawnPlayerMissile (self, RUNTIME_CLASS(AFrostMissile)); if (mo) { mo->special1 = SHARDSPAWN_LEFT|SHARDSPAWN_DOWN|SHARDSPAWN_UP |SHARDSPAWN_RIGHT; mo->special2 = 3; // Set sperm count (levels of reproductivity) mo->target = self; mo->args[0] = 3; // Mark Initial shard as super damage } } return 0; }
void P_BulletSlope(mobj_t* mo) { angle_t an; // see which target is to be aimed at an = mo->angle; bulletslope = P_AimLineAttack(mo, an, 0, ATTACKRANGE); if(!linetarget) { an += 1<<26; bulletslope = P_AimLineAttack(mo, an, 0, ATTACKRANGE); if(!linetarget) { an -= 2<<26; bulletslope = P_AimLineAttack(mo, an, 0, ATTACKRANGE); } } }
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_M_FireCGun) { PARAM_ACTION_PROLOGUE; PARAM_BOOL(accurate); if (self->target == NULL) return 0; S_Sound (self, CHAN_WEAPON, "weapons/chngun", 1, ATTN_NORM); A_FaceTarget (self); P_GunShot2 (self, accurate, P_AimLineAttack (self, self->angle, MISSILERANGE), PClass::FindActor(NAME_BulletPuff)); return 0; }
void A_Punch(player_t *player, pspdef_t *psp) { angle_t angle; int t, slope, damage = (P_Random(pr_punch)+1)<<1; if (player->powers[pw_strength]) damage *= 10; angle = player->mo->angle; // killough 5/5/98: remove dependence on order of evaluation: t = P_Random(pr_punchangle); angle += (t - P_Random(pr_punchangle))<<18; /* killough 8/2/98: make autoaiming prefer enemies */ if (!mbf_features || (slope = P_AimLineAttack(player->mo, angle, MELEERANGE*1.25, MF_FRIEND), !linetarget)) slope = P_AimLineAttack(player->mo, angle, MELEERANGE*1.25, 0); P_LineAttack(player->mo, angle, MELEERANGE*1.25, slope, damage); //Swish swash sound S_StartSound(player->mo, sfx_punch); if (!linetarget) return; //make hitsound S_StartSound(player->mo, sfx_swdhit); // turn to face target player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, linetarget->x, linetarget->y); R_SmoothPlaying_Reset(player); // e6y }