DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_FatAttack1) { AActor *missile; angle_t an; if (!self->target) return; ACTION_PARAM_START(1); ACTION_PARAM_CLASS(spawntype, 0); if (spawntype == NULL) spawntype = PClass::FindClass("FatShot"); A_FaceTarget (self); // Change direction to ... self->angle += FATSPREAD; missile = P_SpawnMissile (self, self->target, spawntype); // [BC] If we're the server, tell clients to spawn the missile. if (( NETWORK_GetState( ) == NETSTATE_SERVER ) && ( missile )) SERVERCOMMANDS_SpawnMissile( missile ); missile = P_SpawnMissile (self, self->target, spawntype); if (missile != NULL) { missile->angle += FATSPREAD; an = missile->angle >> ANGLETOFINESHIFT; missile->velx = FixedMul (missile->Speed, finecosine[an]); missile->vely = FixedMul (missile->Speed, finesine[an]); // [BC] If we're the server, tell clients to spawn the missile. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SpawnMissile( missile ); }
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_FatAttack1) { AActor *missile; angle_t an; if (!self->target) return; ACTION_PARAM_START(1); ACTION_PARAM_CLASS(spawntype, 0); if (spawntype == NULL) spawntype = PClass::FindClass("FatShot"); A_FaceTarget (self); // Change direction to ... self->angle += FATSPREAD; P_SpawnMissile (self, self->target, spawntype); missile = P_SpawnMissile (self, self->target, spawntype); if (missile != NULL) { missile->angle += FATSPREAD; an = missile->angle >> ANGLETOFINESHIFT; missile->velx = FixedMul (missile->Speed, finecosine[an]); missile->vely = FixedMul (missile->Speed, finesine[an]); }
void A_200e0 (AActor *self) { AActor *bar; // Apparent Strife bug: Case 5 was unreachable because they used % 5 instead of % 6. // I've fixed that by making case 1 duplicate it, since case 1 did nothing. switch (pr_entity() % 5) { case 0: if (self->target != NULL) { bar = Spawn<ASpectralLightningSpot> (self->x, self->y, ONFLOORZ, ALLOW_REPLACE); bar->threshold = 25; bar->target = self; bar->tracer = self->target; bar->health = -2; } break; case 2: if (self->target != NULL) { bar = P_SpawnMissile (self, self->target, RUNTIME_CLASS(ASpectralLightningH3)); if (bar != NULL) { bar->health = -2; } } break; case 3: A_20334 (self); break; case 4: if (self->target != NULL) { bar = P_SpawnMissile (self, self->target, RUNTIME_CLASS(ASpectralLightningBigV2)); if (bar != NULL) { bar->health = -2; bar->tracer = self->target; } } break; case 1: case 5: if (self->target != NULL) { bar = P_SpawnMissile (self, self->target, RUNTIME_CLASS(ASpectralLightningBigBall2)); if (bar != NULL) { bar->health = -2; } } break; } }
DEFINE_ACTION_FUNCTION(AActor, A_BruisAttack) { AActor *pMissile; if (!self->target) return; if (self->CheckMeleeRange ()) { int damage = (pr_bruisattack()%8+1)*10; S_Sound (self, CHAN_WEAPON, "baron/melee", 1, ATTN_NORM); // [BC] If we're the server, tell clients play this sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_WEAPON, "baron/melee", 1, ATTN_NORM ); P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (damage, self->target, self); return; } // launch a missile pMissile = P_SpawnMissile (self, self->target, PClass::FindClass("BaronBall")); // [BC] If we're the server, tell clients to spawn the missile. if (( NETWORK_GetState( ) == NETSTATE_SERVER ) && ( pMissile )) SERVERCOMMANDS_SpawnMissile( pMissile ); }
void A_FiredAttack (AActor *actor) { if (actor->target == NULL) return; AActor *mo = P_SpawnMissile (actor, actor->target, RUNTIME_CLASS(AFireDemonMissile)); if (mo) S_Sound (actor, CHAN_BODY, "FireDemonAttack", 1, ATTN_NORM); }
DEFINE_ACTION_FUNCTION(AActor, A_M_FireMissile) { // [BC] AActor *pMissile; // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->target == NULL) return; if (self->CheckMeleeRange ()) { // If too close, punch it MarinePunch(self, 1); } else { A_FaceTarget (self); pMissile = P_SpawnMissile (self, self->target, PClass::FindClass("Rocket")); // [BC] If we're the server, tell clients to spawn this missile. if (( pMissile ) && ( NETWORK_GetState( ) == NETSTATE_SERVER )) SERVERCOMMANDS_SpawnMissile( pMissile ); } }
void A_Srcr2Attack (AActor *actor) { int chance; if (!actor->target) { return; } S_SoundID (actor, CHAN_BODY, actor->AttackSound, 1, ATTN_NONE); if (actor->CheckMeleeRange()) { int damage = pr_s2a.HitDice (20); P_DamageMobj (actor->target, actor, actor, damage, NAME_Melee); P_TraceBleed (damage, actor->target, actor); return; } chance = actor->health < actor->GetDefault()->health/2 ? 96 : 48; if (pr_s2a() < chance) { // Wizard spawners P_SpawnMissileAngle (actor, RUNTIME_CLASS(ASorcerer2FX2), actor->angle-ANG45, FRACUNIT/2); P_SpawnMissileAngle (actor, RUNTIME_CLASS(ASorcerer2FX2), actor->angle+ANG45, FRACUNIT/2); } else { // Blue bolt P_SpawnMissile (actor, actor->target, RUNTIME_CLASS(ASorcerer2FX1)); } }
DEFINE_ACTION_FUNCTION(AActor, A_FiredAttack) { if (self->target == NULL) return; AActor *mo = P_SpawnMissile (self, self->target, PClass::FindClass ("FireDemonMissile")); if (mo) S_Sound (self, CHAN_BODY, "FireDemonAttack", 1, ATTN_NORM); }
DEFINE_ACTION_FUNCTION(AActor, A_Srcr2Attack) { int chance; if (!self->target) { return; } S_Sound (self, CHAN_BODY, self->AttackSound, 1, ATTN_NONE); if (self->CheckMeleeRange()) { int damage = pr_s2a.HitDice (20); int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self); return; } chance = self->health < self->SpawnHealth()/2 ? 96 : 48; if (pr_s2a() < chance) { // Wizard spawners const PClass *fx = PClass::FindClass("Sorcerer2FX2"); if (fx) { P_SpawnMissileAngle (self, fx, self->angle-ANG45, FRACUNIT/2); P_SpawnMissileAngle (self, fx, self->angle+ANG45, FRACUNIT/2); } } else { // Blue bolt P_SpawnMissile (self, self->target, PClass::FindClass("Sorcerer2FX1")); } }
DEFINE_ACTION_FUNCTION(AActor, A_CyberAttack) { PARAM_ACTION_PROLOGUE; if (!self->target) return 0; A_FaceTarget (self); P_SpawnMissile (self, self->target, PClass::FindActor("Rocket")); return 0; }
void A_FatAttack1 (AActor *self) { AActor *missile; angle_t an; if (!self->target) return; A_FaceTarget (self); // Change direction to ... self->angle += FATSPREAD; P_SpawnMissile (self, self->target, RUNTIME_CLASS(AFatShot)); missile = P_SpawnMissile (self, self->target, RUNTIME_CLASS(AFatShot)); if (missile != NULL) { missile->angle += FATSPREAD; an = missile->angle >> ANGLETOFINESHIFT; missile->momx = FixedMul (missile->Speed, finecosine[an]); missile->momy = FixedMul (missile->Speed, finesine[an]); }
// // A_CyberAttack // // Cyberdemon rocket attack. // void A_CyberAttack(actionargs_t *actionargs) { Mobj *actor = actionargs->actor; if(!actor->target) return; A_FaceTarget(actionargs); P_SpawnMissile(actor, actor->target, E_SafeThingType(MT_ROCKET), actor->z + DEFAULTMISSILEZ); }
DEFINE_ACTION_FUNCTION(AActor, A_M_FirePlasma) { PARAM_ACTION_PROLOGUE; if (self->target == NULL) return 0; A_FaceTarget (self); P_SpawnMissile (self, self->target, PClass::FindActor("PlasmaBall")); self->special1 = level.maptime + 20; return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_M_FireBFG) { PARAM_ACTION_PROLOGUE; if (self->target == NULL) return 0; A_FaceTarget (self); P_SpawnMissile (self, self->target, PClass::FindActor("BFGBall")); self->special1 = level.maptime + 30; self->PainChance = MARINE_PAIN_CHANCE; return 0; }
// // A_BspiAttack // // Arachnotron attack. // void A_BspiAttack(actionargs_t *actionargs) { Mobj *actor = actionargs->actor; if(!actor->target) return; A_FaceTarget(actionargs); // launch a missile P_SpawnMissile(actor, actor->target, E_SafeThingType(MT_ARACHPLAZ), actor->z + DEFAULTMISSILEZ); }
DEFINE_ACTION_FUNCTION(AActor, A_WizAtk3) { AActor *mo; CALL_ACTION(A_GhostOff, self); // [BB] This is server-side, the client only needs to run A_GhostOff. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (!self->target) { return; } S_Sound (self, CHAN_WEAPON, self->AttackSound, 1, ATTN_NORM); // [BB] If we're the server, tell the clients to play the sound. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SoundActor( self, CHAN_WEAPON, S_GetName( self->AttackSound ), 1, ATTN_NORM ); if (self->CheckMeleeRange()) { int damage = pr_wizatk3.HitDice (4); P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (damage, self->target, self); return; } const PClass *fx = PClass::FindClass("WizardFX1"); mo = P_SpawnMissile (self, self->target, fx); if (mo != NULL) { AActor *missile1 = P_SpawnMissileAngle(self, fx, mo->angle-(ANG45/8), mo->velz); AActor *missile2 = P_SpawnMissileAngle(self, fx, mo->angle+(ANG45/8), mo->velz); // [BB] If we're the server, tell the clients to spawn the missiles. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) { SERVERCOMMANDS_SpawnMissile( mo ); if ( missile1 ) SERVERCOMMANDS_SpawnMissile( missile1 ); if ( missile2 ) SERVERCOMMANDS_SpawnMissile( missile2 ); } } }
DEFINE_ACTION_FUNCTION(AActor, A_MinotaurAtk3) { PARAM_ACTION_PROLOGUE; AActor *mo; player_t *player; bool friendly = !!(self->flags5 & MF5_SUMMONEDMONSTER); if (!self->target) { return 0; } S_Sound (self, CHAN_VOICE, "minotaur/attack3", 1, ATTN_NORM); if (self->CheckMeleeRange()) { int damage; damage = pr_minotauratk3.HitDice (friendly ? 3 : 5); int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self); if ((player = self->target->player) != NULL && player->mo == self->target) { // Squish the player player->deltaviewheight = -16; } } else { if (self->Floorclip > 0 && (i_compatflags & COMPATF_MINOTAUR)) { // only play the sound. S_Sound (self, CHAN_WEAPON, "minotaur/fx2hit", 1, ATTN_NORM); } else { mo = P_SpawnMissile (self, self->target, PClass::FindActor("MinotaurFX2")); if (mo != NULL) { S_Sound (mo, CHAN_WEAPON, "minotaur/attack1", 1, ATTN_NORM); } } } if (pr_minotauratk3() < 192 && self->special2 == 0) { self->SetState (self->FindState ("HammerLoop")); self->special2 = 1; } return 0; }
void A_ImpMsAttack2 (AActor *self) { if (!self->target) { return; } S_SoundID (self, CHAN_WEAPON, self->AttackSound, 1, ATTN_NORM); if (self->CheckMeleeRange ()) { int damage = 5+(pr_impmsatk2()&7); P_DamageMobj (self->target, self, self, damage, MOD_HIT); P_TraceBleed (damage, self->target, self); return; } P_SpawnMissile (self, self->target, RUNTIME_CLASS(AHereticImpBall)); }
DEFINE_ACTION_FUNCTION(AActor, A_BishopAttack2) { AActor *mo; if (!self->target || !self->special1) { self->special1 = 0; self->SetState (self->SeeState); return; } mo = P_SpawnMissile (self, self->target, PClass::FindClass("BishopFX")); if (mo != NULL) { mo->tracer = self->target; } self->special1--; }
DEFINE_ACTION_FUNCTION(AActor, A_HeadAttack) { if (!self->target) return; A_FaceTarget (self); if (self->CheckMeleeRange ()) { int damage = (pr_headattack()%6+1)*10; S_Sound (self, CHAN_WEAPON, self->AttackSound, 1, ATTN_NORM); int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self); return; } // launch a missile P_SpawnMissile (self, self->target, PClass::FindClass("CacodemonBall")); }
// // A_TroopAttack // DEFINE_ACTION_FUNCTION(AActor, A_TroopAttack) { if (!self->target) return; A_FaceTarget (self); if (self->CheckMeleeRange ()) { int damage = (pr_troopattack()%8+1)*3; S_Sound (self, CHAN_WEAPON, "imp/melee", 1, ATTN_NORM); int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self); return; } // launch a missile P_SpawnMissile (self, self->target, PClass::FindClass("DoomImpBall")); }
DEFINE_ACTION_FUNCTION(AActor, A_M_FireMissile) { PARAM_ACTION_PROLOGUE; if (self->target == NULL) return 0; if (self->CheckMeleeRange ()) { // If too close, punch it MarinePunch(self, 1); } else { A_FaceTarget (self); P_SpawnMissile (self, self->target, PClass::FindActor("Rocket")); } return 0; }
void C_DECL A_FireMissile(player_t *player, pspdef_t *psp) { P_ShotAmmo(player); player->update |= PSF_AMMO; if(IS_CLIENT) return; P_SpawnMissile(MT_ROCKET, player->plr->mo, NULL); // jd64 > if(cfg.weaponRecoil) { angle_t angle = player->plr->mo->angle + ANG180; uint an = angle >> ANGLETOFINESHIFT; player->plr->mo->mom[MX] += 4 * FIX2FLT(finecosine[an]); player->plr->mo->mom[MY] += 4 * FIX2FLT(finesine[an]); }
// // A_SkelMissile // // Fire seeker missile. // void A_SkelMissile(actionargs_t *actionargs) { Mobj *actor = actionargs->actor; Mobj *mo; if(!actor->target) return; A_FaceTarget(actionargs); actor->z += 16*FRACUNIT; // so missile spawns higher mo = P_SpawnMissile(actor, actor->target, E_SafeThingType(MT_TRACER), actor->z + DEFAULTMISSILEZ); actor->z -= 16*FRACUNIT; // back to normal mo->x += mo->momx; mo->y += mo->momy; mo->backupPosition(); P_SetTarget<Mobj>(&mo->tracer, actor->target); // killough 11/98 }
// // A_HeadAttack // // Cacodemon attack. // void A_HeadAttack(actionargs_t *actionargs) { Mobj *actor = actionargs->actor; if(!actor->target) return; A_FaceTarget(actionargs); if(P_CheckMeleeRange(actor)) { int damage = (P_Random(pr_headattack)%6+1)*10; P_DamageMobj(actor->target, actor, actor, damage, MOD_HIT); } else { // launch a missile P_SpawnMissile(actor, actor->target, E_SafeThingType(MT_HEADSHOT), actor->z + DEFAULTMISSILEZ); } }
// // A_BruisAttack // // Baron of Hell attack. // void A_BruisAttack(actionargs_t *actionargs) { Mobj *actor = actionargs->actor; if(!actor->target) return; if(P_CheckMeleeRange(actor)) { int damage; S_StartSound(actor, sfx_claw); damage = (P_Random(pr_bruisattack)%8+1)*10; P_DamageMobj(actor->target, actor, actor, damage, MOD_HIT); } else { // launch a missile P_SpawnMissile(actor, actor->target, E_SafeThingType(MT_BRUISERSHOT), actor->z + DEFAULTMISSILEZ); } }
DEFINE_ACTION_FUNCTION(AActor, A_M_FireBFG) { AActor *pMissile; // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (self->target == NULL) return; A_FaceTarget (self); pMissile = P_SpawnMissile (self, self->target, PClass::FindClass("BFGBall")); self->special1 = level.maptime + 30; self->PainChance = MARINE_PAIN_CHANCE; // [BC] If we're the server, tell clients to spawn this missile. if (( pMissile ) && ( NETWORK_GetState( ) == NETSTATE_SERVER )) SERVERCOMMANDS_SpawnMissile( pMissile ); }
// // A_TroopAttack // // Imp attack. // void A_TroopAttack(actionargs_t *actionargs) { Mobj *actor = actionargs->actor; if(!actor->target) return; A_FaceTarget(actionargs); if(P_CheckMeleeRange(actor)) { int damage; S_StartSound(actor, sfx_claw); damage = (P_Random(pr_troopattack)%8+1)*3; P_DamageMobj(actor->target, actor, actor, damage, MOD_HIT); } else { // launch a missile P_SpawnMissile(actor, actor->target, E_SafeThingType(MT_TROOPSHOT), actor->z + DEFAULTMISSILEZ); } }
DEFINE_ACTION_FUNCTION(AActor, A_BishopAttack2) { AActor *mo; // [BB] This is server-side. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (!self->target || !self->special1) { self->special1 = 0; self->SetState (self->SeeState); // [BB] If we're the server, tell the clients of the state change. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SetThingState( self, STATE_SEE ); return; } mo = P_SpawnMissile (self, self->target, PClass::FindClass("BishopFX")); if (mo != NULL) { mo->tracer = self->target; mo->special2 = 16; // High word == x/y, Low word == z // [BB] If we're the server, tell the clients to spawn this missile. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) { SERVERCOMMANDS_SpawnMissile( mo ); SERVERCOMMANDS_SetThingSpecial2( mo ); } } self->special1--; }
void A_WizAtk3 (AActor *actor) { AActor *mo; A_GhostOff (actor); if (!actor->target) { return; } S_SoundID (actor, CHAN_WEAPON, actor->AttackSound, 1, ATTN_NORM); if (actor->CheckMeleeRange()) { int damage = pr_wizatk3.HitDice (4); P_DamageMobj (actor->target, actor, actor, damage, NAME_Melee); P_TraceBleed (damage, actor->target, actor); return; } mo = P_SpawnMissile (actor, actor->target, RUNTIME_CLASS(AWizardFX1)); if (mo != NULL) { P_SpawnMissileAngle(actor, RUNTIME_CLASS(AWizardFX1), mo->angle-(ANG45/8), mo->momz); P_SpawnMissileAngle(actor, RUNTIME_CLASS(AWizardFX1), mo->angle+(ANG45/8), mo->momz); } }