void DoReadyWeaponToFire (AActor *self, bool prim, bool alt) { player_t *player; AWeapon *weapon; if (!self || !(player = self->player) || !(weapon = player->ReadyWeapon)) { return; } // Change player from attack state if (self->InStateSequence(self->state, self->MissileState) || self->InStateSequence(self->state, self->MeleeState)) { static_cast<APlayerPawn *>(self)->PlayIdle (); } // Play ready sound, if any. if (weapon->ReadySound && player->GetPSprite(PSP_WEAPON)->GetState() == weapon->FindState(NAME_Ready)) { if (!(weapon->WeaponFlags & WIF_READYSNDHALF) || pr_wpnreadysnd() < 128) { S_Sound (self, CHAN_WEAPON, weapon->ReadySound, 1, ATTN_NORM); } } // Prepare for firing action. player->WeaponState |= ((prim ? WF_WEAPONREADY : 0) | (alt ? WF_WEAPONREADYALT : 0)); return; }
void P_FireWeaponAlt (player_t *player, FState *state) { AWeapon *weapon; // [SO] 9/2/02: People were able to do an awful lot of damage // when they were observers... if (player->Bot == nullptr && bot_observer) { return; } weapon = player->ReadyWeapon; if (weapon == nullptr || weapon->FindState(NAME_AltFire) == nullptr || !weapon->CheckAmmo (AWeapon::AltFire, true)) { return; } player->mo->PlayAttacking (); weapon->bAltFire = true; if (state == nullptr) { state = weapon->GetAltAtkState(!!player->refire); } P_SetPsprite(player, PSP_WEAPON, state); if (!(weapon->WeaponFlags & WIF_NOALERT)) { P_NoiseAlert (player->mo, player->mo, false); } }
// // A_FirePistol // DEFINE_ACTION_FUNCTION(AActor, A_FirePistol) { PARAM_ACTION_PROLOGUE; bool accurate; if (self->player != NULL) { AWeapon *weapon = self->player->ReadyWeapon; if (weapon != NULL && ACTION_CALL_FROM_WEAPON()) { if (!weapon->DepleteAmmo (weapon->bAltFire, true, 1)) return 0; P_SetPsprite (self->player, ps_flash, weapon->FindState(NAME_Flash)); } self->player->mo->PlayAttacking2 (); accurate = !self->player->refire; } else { accurate = true; } S_Sound (self, CHAN_WEAPON, "weapons/pistol", 1, ATTN_NORM); P_GunShot (self, accurate, PClass::FindActor(NAME_BulletPuff), P_BulletSlope (self)); return 0; }
// // A_FireShotgun // DEFINE_ACTION_FUNCTION(AActor, A_FireShotgun) { PARAM_ACTION_PROLOGUE; int i; player_t *player; if (NULL == (player = self->player)) { return 0; } S_Sound (self, CHAN_WEAPON, "weapons/shotgf", 1, ATTN_NORM); AWeapon *weapon = self->player->ReadyWeapon; if (weapon != NULL && ACTION_CALL_FROM_WEAPON()) { if (!weapon->DepleteAmmo (weapon->bAltFire, true, 1)) return 0; P_SetPsprite (player, ps_flash, weapon->FindState(NAME_Flash)); self->player->psprites[ps_flash].processPending = true; } player->mo->PlayAttacking2 (); DAngle pitch = P_BulletSlope (self); for (i = 0; i < 7; i++) { P_GunShot (self, false, PClass::FindActor(NAME_BulletPuff), pitch); } return 0; }
// // 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; }
// // A_FireShotgun2 // DEFINE_ACTION_FUNCTION(AActor, A_FireShotgun2) { PARAM_ACTION_PROLOGUE; int i; DAngle angle; int damage; player_t *player; if (NULL == (player = self->player)) { return 0; } S_Sound (self, CHAN_WEAPON, "weapons/sshotf", 1, ATTN_NORM); AWeapon *weapon = self->player->ReadyWeapon; if (weapon != NULL && ACTION_CALL_FROM_WEAPON()) { if (!weapon->DepleteAmmo (weapon->bAltFire, true, 2)) return 0; P_SetPsprite (player, ps_flash, weapon->FindState(NAME_Flash)); self->player->psprites[ps_flash].processPending = true; } player->mo->PlayAttacking2 (); DAngle pitch = P_BulletSlope (self); for (i=0 ; i<20 ; i++) { damage = 5*(pr_fireshotgun2()%3+1); angle = self->Angles.Yaw + pr_fireshotgun2.Random2() * (11.25 / 256); // Doom adjusts the bullet slope by shifting a random number [-255,255] // left 5 places. At 2048 units away, this means the vertical position // of the shot can deviate as much as 255 units from nominal. So using // some simple trigonometry, that means the vertical angle of the shot // can deviate by as many as ~7.097 degrees or ~84676099 BAMs. P_LineAttack (self, angle, PLAYERMISSILERANGE, pitch + pr_fireshotgun2.Random2() * (7.097 / 256), damage, NAME_Hitscan, NAME_BulletPuff); } return 0; }