DEFINE_ACTION_FUNCTION(AActor, A_SpectralBigBallLightning) { const PClass *cls = PClass::FindClass("SpectralLightningH3"); if (cls) { self->angle += ANGLE_90; P_SpawnSubMissile (self, cls, self->target); self->angle += ANGLE_180; P_SpawnSubMissile (self, cls, self->target); self->angle += ANGLE_90; P_SpawnSubMissile (self, cls, self->target); } }
DEFINE_ACTION_FUNCTION(AActor, A_FireSigil3) { PARAM_ACTION_PROLOGUE; AActor *spot; player_t *player = self->player; int i; if (player == NULL || player->ReadyWeapon == NULL) return 0; P_DamageMobj (self, self, NULL, 3*4, 0, DMG_NO_ARMOR); S_Sound (self, CHAN_WEAPON, "weapons/sigilcharge", 1, ATTN_NORM); self->Angles.Yaw -= 90.; for (i = 0; i < 20; ++i) { self->Angles.Yaw += 9.; spot = P_SpawnSubMissile (self, PClass::FindActor("SpectralLightningBall1"), self); if (spot != NULL) { spot->SetZ(self->Z() + 32); } } self->Angles.Yaw -= 90.; return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_SpectralBigBallLightning) { PARAM_ACTION_PROLOGUE; PClassActor *cls = PClass::FindActor("SpectralLightningH3"); if (cls) { self->Angles.Yaw += 90.; P_SpawnSubMissile (self, cls, self->target); self->Angles.Yaw += 180.; P_SpawnSubMissile (self, cls, self->target); self->Angles.Yaw -= 270.; P_SpawnSubMissile (self, cls, self->target); } return 0; }
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_FireGrenade) { PARAM_ACTION_PROLOGUE; PARAM_CLASS(grenadetype, AActor); PARAM_ANGLE(angleofs); PARAM_STATE(flash) player_t *player = self->player; AActor *grenade; DAngle an; AWeapon *weapon; if (player == nullptr || grenadetype == nullptr) return 0; if ((weapon = player->ReadyWeapon) == nullptr) return 0; if (!weapon->DepleteAmmo (weapon->bAltFire)) return 0; P_SetPsprite (player, PSP_FLASH, flash, true); if (grenadetype != nullptr) { self->AddZ(32); grenade = P_SpawnSubMissile (self, grenadetype, self); self->AddZ(-32); if (grenade == nullptr) return 0; if (grenade->SeeSound != 0) { S_Sound (grenade, CHAN_VOICE, grenade->SeeSound, 1, ATTN_NORM); } grenade->Vel.Z = (-self->Angles.Pitch.TanClamped()) * grenade->Speed + 8; DVector2 offset = self->Angles.Yaw.ToVector(self->radius + grenade->radius); DAngle an = self->Angles.Yaw + angleofs; offset += an.ToVector(15); grenade->SetOrigin(grenade->Vec3Offset(offset.X, offset.Y, 0.), false); } return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_MaulerTorpedoWave) { AActor *wavedef = GetDefaultByName("MaulerTorpedoWave"); fixed_t savedz; self->angle += ANGLE_180; // If the torpedo hit the ceiling, it should still spawn the wave savedz = self->Z(); if (wavedef && self->ceilingz - self->Z() < wavedef->height) { self->SetZ(self->ceilingz - wavedef->height); } for (int i = 0; i < 80; ++i) { self->angle += ANGLE_45/10; P_SpawnSubMissile (self, PClass::FindClass("MaulerTorpedoWave"), self->target); } self->SetZ(savedz); }
DEFINE_ACTION_FUNCTION(AActor, A_MaulerTorpedoWave) { PARAM_ACTION_PROLOGUE; AActor *wavedef = GetDefaultByName("MaulerTorpedoWave"); double savedz; self->Angles.Yaw += 180.; // If the torpedo hit the ceiling, it should still spawn the wave savedz = self->Z(); if (wavedef && self->ceilingz < self->Z() + wavedef->Height) { self->SetZ(self->ceilingz - wavedef->Height); } for (int i = 0; i < 80; ++i) { self->Angles.Yaw += 4.5; P_SpawnSubMissile (self, PClass::FindActor("MaulerTorpedoWave"), self->target); } self->SetZ(savedz); return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_Spectre3Attack) { PARAM_ACTION_PROLOGUE; if (self->target == NULL) return 0; AActor *foo = Spawn("SpectralLightningV2", self->PosPlusZ(32.), ALLOW_REPLACE); foo->Vel.Z = -12; foo->target = self; foo->FriendPlayer = 0; foo->tracer = self->target; self->Angles.Yaw -= 90.; for (int i = 0; i < 20; ++i) { self->Angles.Yaw += 9.; P_SpawnSubMissile (self, PClass::FindActor("SpectralLightningBall2"), self); } self->Angles.Yaw -= 90.; return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_Spectre3Attack) { if (self->target == NULL) return; AActor *foo = Spawn("SpectralLightningV2", self->x, self->y, self->z + 32*FRACUNIT, ALLOW_REPLACE); foo->momz = -12*FRACUNIT; foo->target = self; foo->health = -2; foo->tracer = self->target; // [CW] Tell clients to spawn the actor. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SpawnMissile( foo ); self->angle -= ANGLE_180 / 20 * 10; for (int i = 0; i < 20; ++i) { self->angle += ANGLE_180 / 20; P_SpawnSubMissile (self, PClass::FindClass("SpectralLightningBall2"), self); } self->angle -= ANGLE_180 / 20 * 10; }