DEFINE_ACTION_FUNCTION(AActor, A_InquisitorJump) { fixed_t dist; fixed_t speed; angle_t an; // [BC] This is handled server-side. if ( NETWORK_InClientMode() ) { return; } if (self->target == NULL) return; S_Sound (self, CHAN_ITEM|CHAN_LOOP, "inquisitor/jump", 1, ATTN_NORM); self->z += 64*FRACUNIT; A_FaceTarget (self); an = self->angle >> ANGLETOFINESHIFT; speed = self->Speed * 2/3; self->velx += FixedMul (speed, finecosine[an]); self->vely += FixedMul (speed, finesine[an]); dist = P_AproxDistance (self->target->x - self->x, self->target->y - self->y); dist /= speed; if (dist < 1) { dist = 1; } self->velz = (self->target->z - self->z) / dist; self->reactiontime = 60; self->flags |= MF_NOGRAVITY; // [BC] If we're the server, update the thing's position. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) { SERVERCOMMANDS_MoveThingExact( self, CM_Z|CM_MOMX|CM_MOMY|CM_MOMZ ); // [CW] Also, set the flags to ensure the actor can fly. SERVERCOMMANDS_SetThingFlags( self, FLAGSET_FLAGS ); } }
// // A_FireCGun // DEFINE_ACTION_FUNCTION(AActor, A_FireCGun) { PARAM_ACTION_PROLOGUE; player_t *player; if (self == NULL || NULL == (player = self->player)) { return 0; } AWeapon *weapon = player->ReadyWeapon; if (weapon != NULL && ACTION_CALL_FROM_WEAPON()) { if (!weapon->DepleteAmmo (weapon->bAltFire, true, 1)) return 0; S_Sound (self, CHAN_WEAPON, "weapons/chngun", 1, ATTN_NORM); FState *flash = weapon->FindState(NAME_Flash); if (flash != NULL) { // [RH] Fix for Sparky's messed-up Dehacked patch! Blargh! FState * atk = weapon->FindState(NAME_Fire); int theflash = clamp (int(player->psprites[ps_weapon].state - atk), 0, 1); if (flash[theflash].sprite != flash->sprite) { theflash = 0; } P_SetSafeFlash (weapon, player, flash, theflash); } } player->mo->PlayAttacking2 (); P_GunShot (self, !player->refire, PClass::FindActor(NAME_BulletPuff), P_BulletSlope (self)); return 0; }
int ALightning::SpecialMissileHit (AActor *thing) { if (thing->flags&MF_SHOOTABLE && thing != target) { if (thing->Mass != INT_MAX) { thing->Vel.X += Vel.X / 16; thing->Vel.Y += Vel.Y / 16; } if ((!thing->player && !(thing->flags2&MF2_BOSS)) || !(level.time&1)) { P_DamageMobj(thing, this, target, 3, NAME_Electric); if (!(S_IsActorPlayingSomething (this, CHAN_WEAPON, -1))) { S_Sound (this, CHAN_WEAPON, this->AttackSound, 1, ATTN_NORM); } if (thing->flags3&MF3_ISMONSTER && pr_hit() < 64) { thing->Howl (); } } health--; if (health <= 0 || thing->health <= 0) { return 0; } if (flags3 & MF3_FLOORHUGGER) { if (lastenemy && ! lastenemy->tracer) { lastenemy->tracer = thing; } } else if (!tracer) { tracer = thing; } } return 1; // lightning zaps through all sprites }
DEFINE_ACTION_FUNCTION(AActor, A_MinotaurAtk2) { PARAM_ACTION_PROLOGUE; AActor *mo; DAngle angle; double vz; double z; bool friendly = !!(self->flags5 & MF5_SUMMONEDMONSTER); if (self->target == NULL) { return 0; } S_Sound (self, CHAN_WEAPON, "minotaur/attack2", 1, ATTN_NORM); if (self->CheckMeleeRange()) { int damage; damage = pr_atk.HitDice (friendly ? 3 : 5); int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self); return 0; } z = self->Z() + 40; PClassActor *fx = PClass::FindActor("MinotaurFX1"); if (fx) { mo = P_SpawnMissileZ (self, z, self->target, fx); if (mo != NULL) { // S_Sound (mo, CHAN_WEAPON, "minotaur/attack2", 1, ATTN_NORM); vz = mo->Vel.Z; angle = mo->Angles.Yaw; P_SpawnMissileAngleZ (self, z, fx, angle-(45./8), vz); P_SpawnMissileAngleZ (self, z, fx, angle+(45./8), vz); P_SpawnMissileAngleZ (self, z, fx, angle-(45./16), vz); P_SpawnMissileAngleZ (self, z, fx, angle+(45./16), vz); } } return 0; }
// // A_PosAttack // DEFINE_ACTION_FUNCTION(AActor, A_PosAttack) { PARAM_ACTION_PROLOGUE; int angle; int damage; int slope; if (!self->target) return 0; 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_Hitscan, NAME_BulletPuff); return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_WhirlwindSeek) { self->health -= 3; if (self->health < 0) { self->velx = self->vely = self->velz = 0; self->SetState (self->FindState(NAME_Death)); self->flags &= ~MF_MISSILE; return; } if ((self->special2 -= 3) < 0) { self->special2 = 58 + (pr_seek() & 31); S_Sound (self, CHAN_BODY, "ironlich/attack3", 1, ATTN_NORM); } if (self->tracer && self->tracer->flags&MF_SHADOW) { return; } P_SeekerMissile (self, ANGLE_1*10, ANGLE_1*30); }
// // A_TroopAttack // DEFINE_ACTION_FUNCTION(AActor, A_TroopAttack) { PARAM_ACTION_PROLOGUE; if (!self->target) return 0; 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 0; } // launch a missile P_SpawnMissile (self, self->target, PClass::FindActor("DoomImpBall")); return 0; }
// [RH] DoorSound: Plays door sound depending on direction and speed void DDoor::DoorSound (bool raise) const { const char *snd; if (raise) { if((m_Speed >= FRACUNIT*8)) snd = "doors/dr2_open"; else snd = "doors/dr1_open"; } else { if((m_Speed >= FRACUNIT*8)) snd = "doors/dr2_clos"; else snd = "doors/dr1_clos"; } S_Sound (m_Sector->soundorg, CHAN_BODY, snd, 1, ATTN_NORM); }
DEFINE_ACTION_FUNCTION(AActor, A_InquisitorJump) { PARAM_ACTION_PROLOGUE; double dist; double speed; if (self->target == NULL) return 0; S_Sound (self, CHAN_ITEM|CHAN_LOOP, "inquisitor/jump", 1, ATTN_NORM); self->AddZ(64); A_FaceTarget (self); speed = self->Speed * (2./3); self->VelFromAngle(speed); dist = self->DistanceBySpeed(self->target, speed); self->Vel.Z = (self->target->Z() - self->Z()) / dist; self->reactiontime = 60; self->flags |= MF_NOGRAVITY; return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_HeadAttack) { PARAM_ACTION_PROLOGUE; if (!self->target) return 0; 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 0; } // launch a missile P_SpawnMissile (self, self->target, PClass::FindActor("CacodemonBall")); return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_SerpentMeleeAttack) { PARAM_ACTION_PROLOGUE; if (!self->target) { return 0; } if (self->CheckMeleeRange ()) { int damage = pr_serpentmeattack.HitDice (5); int newdam = P_DamageMobj (self->target, self, self, damage, NAME_Melee); P_TraceBleed (newdam > 0 ? newdam : damage, self->target, self); S_Sound (self, CHAN_BODY, "SerpentMeleeHit", 1, ATTN_NORM); } if (pr_serpentmeattack() < 96) { CALL_ACTION(A_SerpentCheckForAttack, self); } return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_MinotaurAtk1) { player_t *player; if (!self->target) { return; } S_Sound (self, CHAN_WEAPON, "minotaur/melee", 1, ATTN_NORM); if (self->CheckMeleeRange()) { int damage = pr_minotauratk1.HitDice (4); 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*FRACUNIT; } } }
void A_FreezeDeath (AActor *actor) { int t = pr_freezedeath(); actor->tics = 75+t+pr_freezedeath(); actor->flags |= MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD; actor->flags2 |= MF2_PUSHABLE|MF2_TELESTOMP|MF2_PASSMOBJ|MF2_SLIDE; actor->height = actor->GetDefault()->height; S_Sound (actor, CHAN_BODY, "misc/freeze", 1, ATTN_NORM); if (actor->player) { actor->player->damagecount = 0; actor->player->poisoncount = 0; actor->player->bonuscount = 0; } else if (actor->flags3&MF3_ISMONSTER && actor->special) { // Initiate monster death actions LineSpecials [actor->special] (NULL, actor, false, actor->args[0], actor->args[1], actor->args[2], actor->args[3], actor->args[4]); actor->special = 0; } }
DEFINE_ACTION_FUNCTION(AActor, A_LightningZap) { PARAM_ACTION_PROLOGUE; PClassActor *lightning = PClass::FindActor(self->GetClass()->MissileName); AActor *mo; if (lightning == NULL) { lightning = PClass::FindActor(NAME_LightningZap); } CALL_ACTION(A_LightningClip, self); self->health -= 8; if (self->health <= 0) { self->SetState (self->FindState(NAME_Death)); return 0; } double deltaX = (pr_zap() - 128) * self->radius / 256; double deltaY = (pr_zap() - 128) * self->radius / 256; double deltaZ = (self->flags3 & MF3_FLOORHUGGER) ? 10 : -10; mo = Spawn(lightning, self->Vec3Offset(deltaX, deltaY, deltaZ), ALLOW_REPLACE); if (mo) { mo->lastenemy = self; mo->Vel.X = self->Vel.X; mo->Vel.Y = self->Vel.Y; mo->Vel.Z = (self->flags3 & MF3_FLOORHUGGER) ? 20 : -20; mo->target = self->target; } if ((self->flags3 & MF3_FLOORHUGGER) && pr_zapf() < 160) { S_Sound (self, CHAN_BODY, self->ActiveSound, 1, ATTN_NORM); } return 0; }
// // A_VileAttack // DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_VileAttack) { ACTION_PARAM_START(6); ACTION_PARAM_SOUND(snd,0); ACTION_PARAM_INT(dmg,1); ACTION_PARAM_INT(blastdmg,2); ACTION_PARAM_INT(blastrad,3); ACTION_PARAM_FIXED(thrust,4); ACTION_PARAM_NAME(dmgtype,5); AActor *fire, *target; angle_t an; if (NULL == (target = self->target)) return; A_FaceTarget (self); if (!P_CheckSight (self, target, 0) ) return; S_Sound (self, CHAN_WEAPON, snd, 1, ATTN_NORM); P_TraceBleed (dmg, target); P_DamageMobj (target, self, self, dmg, NAME_None); an = self->angle >> ANGLETOFINESHIFT; fire = self->tracer; if (fire != NULL) { // move the fire between the vile and the player fire->SetOrigin (target->x - FixedMul (24*FRACUNIT, finecosine[an]), target->y - FixedMul (24*FRACUNIT, finesine[an]), target->z); P_RadiusAttack (fire, self, blastdmg, blastrad, dmgtype, false); } target->velz = Scale(thrust, 1000, target->Mass); }
bool AArtiTomeOfPower::Use (bool pickup) { if (Owner->player->morphTics && (Owner->player->MorphStyle & MORPH_UNDOBYTOMEOFPOWER)) { // Attempt to undo chicken if (!P_UndoPlayerMorph (Owner->player, Owner->player, MORPH_UNDOBYTOMEOFPOWER)) { // Failed if (!(Owner->player->MorphStyle & MORPH_FAILNOTELEFRAG)) { P_DamageMobj (Owner, NULL, NULL, TELEFRAG_DAMAGE, NAME_Telefrag); } } else { // Succeeded S_Sound (Owner, CHAN_VOICE, "*evillaugh", 1, ATTN_IDLE); } return true; } else { return Super::Use (pickup); } }
// // A_Punch // DEFINE_ACTION_FUNCTION(AActor, A_Punch) { PARAM_ACTION_PROLOGUE; angle_t angle; int damage; int pitch; AActor *linetarget; if (self->player != NULL) { AWeapon *weapon = self->player->ReadyWeapon; if (weapon != NULL && !(weapon->WeaponFlags & WIF_DEHAMMO) && ACTION_CALL_FROM_WEAPON()) { if (!weapon->DepleteAmmo (weapon->bAltFire)) return 0; } } damage = (pr_punch()%10+1)<<1; if (self->FindInventory<APowerStrength>()) damage *= 10; angle = self->angle; angle += pr_punch.Random2() << 18; pitch = P_AimLineAttack (self, angle, MELEERANGE, &linetarget); P_LineAttack (self, angle, MELEERANGE, pitch, damage, NAME_Melee, NAME_BulletPuff, LAF_ISMELEEATTACK, &linetarget); // turn to face target if (linetarget) { S_Sound (self, CHAN_WEAPON, "*fist", 1, ATTN_NORM); self->angle = self->AngleTo(linetarget); } return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_InquisitorCheckLand) { PARAM_ACTION_PROLOGUE; self->reactiontime--; if (self->reactiontime < 0 || self->Vel.X == 0 || self->Vel.Y == 0 || self->Z() <= self->floorz) { self->SetState (self->SeeState); self->reactiontime = 0; self->flags &= ~MF_NOGRAVITY; S_StopSound (self, CHAN_ITEM); return 0; } if (!S_IsActorPlayingSomething (self, CHAN_ITEM, -1)) { S_Sound (self, CHAN_ITEM|CHAN_LOOP, "inquisitor/jump", 1, ATTN_NORM); } return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_FireSigil1) { PARAM_ACTION_PROLOGUE; AActor *spot; player_t *player = self->player; FTranslatedLineTarget t; if (player == NULL || player->ReadyWeapon == NULL) return 0; P_DamageMobj (self, self, NULL, 1*4, 0, DMG_NO_ARMOR); S_Sound (self, CHAN_WEAPON, "weapons/sigilcharge", 1, ATTN_NORM); P_BulletSlope (self, &t, ALF_PORTALRESTRICT); if (t.linetarget != NULL) { spot = Spawn("SpectralLightningSpot", t.linetarget->PosAtZ(t.linetarget->floorz), ALLOW_REPLACE); if (spot != NULL) { spot->tracer = t.linetarget; } } else { spot = Spawn("SpectralLightningSpot", self->Pos(), ALLOW_REPLACE); if (spot != NULL) { spot->VelFromAngle(self->Angles.Yaw, 28.); } } if (spot != NULL) { spot->SetFriendPlayer(player); spot->target = self; } return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_ReaverRanged) { PARAM_ACTION_PROLOGUE; if (self->target != NULL) { DAngle bangle; DAngle pitch; A_FaceTarget (self); S_Sound (self, CHAN_WEAPON, "reaver/attack", 1, ATTN_NORM); bangle = self->Angles.Yaw; pitch = P_AimLineAttack (self, bangle, MISSILERANGE); for (int i = 0; i < 3; ++i) { DAngle angle = bangle + pr_reaverattack.Random2() * (22.5 / 256); int damage = ((pr_reaverattack() & 7) + 1) * 3; P_LineAttack (self, angle, MISSILERANGE, pitch, damage, NAME_Hitscan, NAME_StrifePuff); } } return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_VolcanoBlast) { int i; int count; AActor *blast; angle_t angle; count = 1 + (pr_blast() % 3); for (i = 0; i < count; i++) { blast = Spawn("VolcanoBlast", self->x, self->y, self->z + 44*FRACUNIT, ALLOW_REPLACE); blast->target = self; angle = pr_blast () << 24; blast->angle = angle; angle >>= ANGLETOFINESHIFT; blast->velx = FixedMul (1*FRACUNIT, finecosine[angle]); blast->vely = FixedMul (1*FRACUNIT, finesine[angle]); blast->velz = (FRACUNIT*5/2) + (pr_blast() << 10); S_Sound (blast, CHAN_BODY, "world/volcano/shoot", 1, ATTN_NORM); P_CheckMissileSpawn (blast, self->radius); } }
void A_VolcanoBlast (AActor *volcano) { int i; int count; AActor *blast; angle_t angle; count = 1 + (pr_blast() % 3); for (i = 0; i < count; i++) { blast = Spawn<AVolcanoBlast> (volcano->x, volcano->y, volcano->z + 44*FRACUNIT, ALLOW_REPLACE); blast->target = volcano; angle = pr_blast () << 24; blast->angle = angle; angle >>= ANGLETOFINESHIFT; blast->momx = FixedMul (1*FRACUNIT, finecosine[angle]); blast->momy = FixedMul (1*FRACUNIT, finesine[angle]); blast->momz = (FRACUNIT*5/2) + (pr_blast() << 10); S_Sound (blast, CHAN_BODY, "world/volcano/shoot", 1, ATTN_NORM); P_CheckMissileSpawn (blast); } }
DEFINE_ACTION_FUNCTION(AActor, A_AcolyteDie) { int i; // [RH] Disable translucency here. self->RenderStyle = STYLE_Normal; // Only the Blue Acolyte does extra stuff on death. if (self->GetClass()->TypeName != NAME_AcolyteBlue) return; // Make sure somebody is still alive for (i = 0; i < MAXPLAYERS; ++i) { if (playeringame[i] && players[i].health > 0) break; } if (i == MAXPLAYERS) return; // Make sure all the other blue acolytes are dead. TThinkerIterator<AActor> iterator(NAME_AcolyteBlue); AActor *other; while ( (other = iterator.Next ()) ) { if (other != self && other->health > 0) { // Found a living one return; } } players[i].mo->GiveInventoryType (QuestItemClasses[6]); players[i].SetLogNumber (14); S_StopSound (CHAN_VOICE); S_Sound (CHAN_VOICE, "svox/voc14", 1, ATTN_NORM); }
void DEarthquake::RunThink () { if (level.time % 48 == 0) S_Sound (m_Spot, CHAN_BODY, "world/quake", 1, ATTN_NORM); if (serverside) { for (Players::iterator it = players.begin(); it != players.end(); ++it) { if (it->ingame() && !(it->cheats & CF_NOCLIP)) { AActor *mo = it->mo; if (!(level.time & 7) && mo->x >= m_DamageBox[BOXLEFT] && mo->x < m_DamageBox[BOXRIGHT] && mo->y >= m_DamageBox[BOXTOP] && mo->y < m_DamageBox[BOXBOTTOM]) { int mult = 1024 * m_Intensity; P_DamageMobj (mo, NULL, NULL, m_Intensity / 2, MOD_UNKNOWN); mo->momx += (P_Random ()-128) * mult; mo->momy += (P_Random ()-128) * mult; } if (mo->x >= m_TremorBox[BOXLEFT] && mo->x < m_TremorBox[BOXRIGHT] && mo->y >= m_TremorBox[BOXTOP] && mo->y < m_TremorBox[BOXBOTTOM]) { it->xviewshift = m_Intensity; } } } } if (--m_Countdown == 0) { Destroy (); } }
// // F_BunnyScroll // void F_BunnyScroll (void) { static int laststage; V_MarkRect (0, 0, screen->width, screen->height); int scrolled = clamp(320 - (finalecount-230)/2, 0, 320); if (!bunny_scroll_initialized) F_InitBunnyScroll(); R_CopySubimage(scroll_texture, bunny_texture, 0, 0, 319, 199, scrolled, 0, scrolled + 319, 199); screen->DrawTextureFullScreen(scroll_texture); if (finalecount < 1130) return; if (finalecount < 1180) { screen->DrawTextureIndirect(R_LoadTexture("END0"), (320-13*8)/2, (200-8*8)/2); laststage = 0; return; } int stage = (finalecount-1180) / 5; if (stage > 6) stage = 6; if (stage > laststage) { S_Sound (CHAN_WEAPON, "weapons/pistol", 1, ATTN_NONE); laststage = stage; } char name[10]; sprintf(name,"END%i",stage); screen->DrawTextureIndirect(R_LoadTexture(name), (320-13*8)/2, (200-8*8)/2); }
static void MarinePunch(AActor *self, int damagemul) { angle_t angle; int damage; int pitch; AActor *linetarget; // [BC] Don't do this in client mode. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } 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); // turn to face target if (linetarget) { S_Sound (self, CHAN_WEAPON, "*fist", 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, "*fist", 1, ATTN_NORM ); self->angle = R_PointToAngle2 (self->x, self->y, linetarget->x, linetarget->y); } }
DEFINE_ACTION_FUNCTION(AActor, A_M_FireShotgun2) { PARAM_ACTION_PROLOGUE; int pitch; if (self->target == NULL) return 0; S_Sound (self, CHAN_WEAPON, "weapons/sshotf", 1, ATTN_NORM); A_FaceTarget (self); pitch = P_AimLineAttack (self, self->angle, MISSILERANGE); for (int i = 0; i < 20; ++i) { int damage = 5*(pr_m_fireshotgun2()%3+1); angle_t angle = self->angle + (pr_m_fireshotgun2.Random2() << 19); P_LineAttack (self, angle, MISSILERANGE, pitch + (pr_m_fireshotgun2.Random2() * 332063), damage, NAME_Hitscan, NAME_BulletPuff); } self->special1 = level.maptime; return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_FPunchAttack) { PARAM_ACTION_PROLOGUE; int damage; int i; player_t *player; if (NULL == (player = self->player)) { return 0; } APlayerPawn *pmo = player->mo; damage = 40+(pr_fpatk()&15); for (i = 0; i < 16; i++) { if (TryPunch(pmo, pmo->Angles.Yaw + i*(45./16), damage, 2) || TryPunch(pmo, pmo->Angles.Yaw - i*(45./16), damage, 2)) { // hit something if (pmo->weaponspecial >= 3) { pmo->weaponspecial = 0; P_SetPsprite (player, ps_weapon, player->ReadyWeapon->FindState("Fire2")); S_Sound (pmo, CHAN_VOICE, "*fistgrunt", 1, ATTN_NORM); } return 0; } } // didn't find any creatures, so try to strike any walls pmo->weaponspecial = 0; DAngle slope = P_AimLineAttack (pmo, pmo->Angles.Yaw, MELEERANGE); P_LineAttack (pmo, pmo->Angles.Yaw, MELEERANGE, slope, damage, NAME_Melee, PClass::FindActor("PunchPuff"), true); return 0; }
bool AArtiTeleport::Use (bool pickup) { fixed_t destX; fixed_t destY; angle_t destAngle; if (deathmatch) { unsigned int selections = deathmatchstarts.Size (); unsigned int i = pr_tele() % selections; destX = deathmatchstarts[i].x; destY = deathmatchstarts[i].y; destAngle = ANG45 * (deathmatchstarts[i].angle/45); } else { destX = playerstarts[Owner->player - players].x; destY = playerstarts[Owner->player - players].y; destAngle = ANG45 * (playerstarts[Owner->player - players].angle/45); } P_Teleport (Owner, destX, destY, ONFLOORZ, destAngle, true, true, false); bool canlaugh = true; if (Owner->player->morphTics && (Owner->player->MorphStyle & MORPH_UNDOBYCHAOSDEVICE)) { // Teleporting away will undo any morph effects (pig) if (!P_UndoPlayerMorph (Owner->player, Owner->player, MORPH_UNDOBYCHAOSDEVICE) && (Owner->player->MorphStyle & MORPH_FAILNOLAUGH)) { canlaugh = false; } } if (canlaugh) { // Full volume laugh S_Sound (Owner, CHAN_VOICE, "*evillaugh", 1, ATTN_NONE); } return true; }
DEFINE_ACTION_FUNCTION(AActor, A_FreezeDeath) { int t = pr_freezedeath(); self->tics = 75+t+pr_freezedeath(); self->flags |= MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_ICECORPSE; self->flags2 |= MF2_PUSHABLE|MF2_TELESTOMP|MF2_PASSMOBJ|MF2_SLIDE; self->flags3 |= MF3_CRASHED; self->height = self->GetDefault()->height; // Remove fuzz effects from frozen actors. if (self->RenderStyle.BlendOp >= STYLEOP_Fuzz && self->RenderStyle.BlendOp <= STYLEOP_FuzzOrRevSub) { self->RenderStyle = STYLE_Normal; } S_Sound (self, CHAN_BODY, "misc/freeze", 1, ATTN_NORM); // [RH] Andy Baker's stealth monsters if (self->flags & MF_STEALTH) { self->alpha = OPAQUE; self->visdir = 0; } if (self->player) { self->player->damagecount = 0; self->player->poisoncount = 0; self->player->bonuscount = 0; } else if (self->flags3 & MF3_ISMONSTER && self->special) { // Initiate monster death actions P_ExecuteSpecial(self->special, NULL, self, false, self->args[0], self->args[1], self->args[2], self->args[3], self->args[4]); self->special = 0; } }