AActor *COPY_AAPTREX(FLevelLocals *Level, AActor *origin, int selector) { if (selector == AAPTR_DEFAULT) return origin; FTranslatedLineTarget t; auto AAPTR_RESOLVE_PLAYERNUM = [=](int playernum) -> AActor* { return (Level->PlayerInGame(playernum) ? Level->Players[playernum]->mo : nullptr); }; if (origin) { if (origin->player) { switch (selector & AAPTR_PLAYER_SELECTORS) { case AAPTR_PLAYER_GETTARGET: P_BulletSlope(origin, &t, ALF_PORTALRESTRICT); return t.linetarget; case AAPTR_PLAYER_GETCONVERSATION: return origin->player->ConversationNPC; } } switch (selector & AAPTR_GENERAL_SELECTORS) { case AAPTR_TARGET: return origin->target; case AAPTR_MASTER: return origin->master; case AAPTR_TRACER: return origin->tracer; case AAPTR_FRIENDPLAYER: return origin->FriendPlayer ? AAPTR_RESOLVE_PLAYERNUM(origin->FriendPlayer - 1) : NULL; case AAPTR_GET_LINETARGET: P_BulletSlope(origin, &t, ALF_PORTALRESTRICT); return t.linetarget; } } switch (selector & AAPTR_STATIC_SELECTORS) { case AAPTR_PLAYER1: return AAPTR_RESOLVE_PLAYERNUM(0); case AAPTR_PLAYER2: return AAPTR_RESOLVE_PLAYERNUM(1); case AAPTR_PLAYER3: return AAPTR_RESOLVE_PLAYERNUM(2); case AAPTR_PLAYER4: return AAPTR_RESOLVE_PLAYERNUM(3); case AAPTR_PLAYER5: return AAPTR_RESOLVE_PLAYERNUM(4); case AAPTR_PLAYER6: return AAPTR_RESOLVE_PLAYERNUM(5); case AAPTR_PLAYER7: return AAPTR_RESOLVE_PLAYERNUM(6); case AAPTR_PLAYER8: return AAPTR_RESOLVE_PLAYERNUM(7); case AAPTR_NULL: return NULL; } return origin; }
void A_FireCGun(player_t* player, pspdef_t* psp) { int ammo = player->ammo[weaponinfo[player->readyweapon].ammo]; int rand; if(!ammo) return; S_StartSound(player->mo, sfx_pistol); P_SetMobjState (player->mo, S_007); player->ammo[weaponinfo[player->readyweapon].ammo]--; // randomize sx rand = (((P_Random() & 1) << 1) - 1); psp->sx = (rand * FRACUNIT); // randomize sy rand = ((((ammo - 1) & 1) << 1) - 1); psp->sy = WEAPONTOP - (rand * (2*FRACUNIT)); player->psprites[ps_flash].alpha = 160; P_SetPsprite(player, ps_flash, weaponinfo[player->readyweapon].flashstate + psp->state - &states[S_756]); player->recoilpitch = RECOILPITCH; P_BulletSlope(player->mo); P_GunShot(player->mo, !player->refire); }
DEFINE_ACTION_FUNCTION(AActor, A_FireSigil4) { 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, 4*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 = P_SpawnPlayerMissile (self, 0,0,0, PClass::FindActor("SpectralLightningBigV1"), self->Angles.Yaw, &t, NULL, false, false, ALF_PORTALRESTRICT); if (spot != NULL) { spot->tracer = t.linetarget; } } else { spot = P_SpawnPlayerMissile (self, PClass::FindActor("SpectralLightningBigV1")); if (spot != NULL) { spot->VelFromAngle(self->Angles.Yaw, spot->Speed); } } return 0; }
// // 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; }
DEFINE_ACTION_FUNCTION(AActor, A_FireMauler1) { PARAM_ACTION_PROLOGUE; if (self->player != NULL) { AWeapon *weapon = self->player->ReadyWeapon; if (weapon != NULL) { if (!weapon->DepleteAmmo (weapon->bAltFire)) return 0; } // Strife apparently didn't show the player shooting. Let's fix that. self->player->mo->PlayAttacking2 (); } S_Sound (self, CHAN_WEAPON, "weapons/mauler1", 1, ATTN_NORM); int bpitch = P_BulletSlope (self); for (int i = 0; i < 20; ++i) { int damage = 5 * (pr_mauler1() % 3 + 1); angle_t angle = self->angle + (pr_mauler1.Random2() << 19); int pitch = bpitch + (pr_mauler1.Random2() * 332063); // Strife used a range of 2112 units for the mauler to signal that // it should use a different puff. ZDoom's default range is longer // than this, so let's not handicap it by being too faithful to the // original. P_LineAttack (self, angle, PLAYERMISSILERANGE, pitch, damage, NAME_Hitscan, NAME_MaulerPuff); } return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_FireAssaultGun) { PARAM_ACTION_PROLOGUE; bool accurate; S_Sound (self, CHAN_WEAPON, "weapons/assaultgun", 1, ATTN_NORM); if (self->player != NULL) { AWeapon *weapon = self->player->ReadyWeapon; if (weapon != NULL) { if (!weapon->DepleteAmmo (weapon->bAltFire)) return 0; } self->player->mo->PlayAttacking2 (); accurate = !self->player->refire; } else { accurate = true; } P_StrifeGunShot (self, accurate, 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; }
void A_FireShotgun2(player_t* player, pspdef_t* psp) { int i; angle_t angle; int damage; S_StartSound(player->mo, sfx_sht2fire); P_SetMobjState(player->mo, S_007); player->ammo[weaponinfo[player->readyweapon].ammo] -= 2; P_SetPsprite(player, ps_flash, weaponinfo[player->readyweapon].flashstate); P_BulletSlope(player->mo); player->recoilpitch = RECOILPITCH; if(player->onground) P_Thrust(player, player->mo->angle + ANG180, FRACUNIT); for(i = 0; i < 20; i++) { damage = 5 * (P_Random() % 3 + 1); angle = player->mo->angle; angle += P_RandomShift(ANGLETOFINESHIFT); P_LineAttack(player->mo, angle, MISSILERANGE, bulletslope + P_RandomShift(5), damage); } }
void A_FireShotgun2(player_t *player, pspdef_t *psp) { int i; CHECK_WEAPON_CODEPOINTER("A_FireShotgun2", player); S_StartSound(player->mo, sfx_dshtgn); P_SetMobjState(player->mo, S_PLAY_ATK2); player->ammo[weaponinfo[player->readyweapon].ammo] -= 2; A_FireSomething(player,0); // phares P_BulletSlope(player->mo); for (i=0; i<20; i++) { int damage = 5*(P_Random(pr_shotgun)%3+1); angle_t angle = player->mo->angle; // killough 5/5/98: remove dependence on order of evaluation: int t = P_Random(pr_shotgun); angle += (t - P_Random(pr_shotgun))<<19; t = P_Random(pr_shotgun); P_LineAttack(player->mo, angle, MISSILERANGE, bulletslope + ((t - P_Random(pr_shotgun))<<5), damage); } }
OVERLAY void A_FirePistol(player_t *player, pspdef_t *psp) { S_StartSound(player->mo, sfx_pistol); P_SetMobjState(player->mo, S_PLAY_ATK2); player->ammo[weaponinfo[player->readyweapon].ammo]--; A_FireSomething(player,0); // phares P_BulletSlope(player->mo); P_GunShot(player->mo, !player->refire); }
// // A_FirePistol // void A_FirePistol(player_t *player, pspdef_t *psp) { S_StartSound(player->mo, sfx_pistol); P_SetMobjState(player->mo, S_PLAY_ATK2); player->ammo[weaponinfo[player->readyweapon].ammo]--; P_SetPsprite(player, ps_flash, (statenum_t)weaponinfo[player->readyweapon].flashstate); P_BulletSlope(player->mo); P_GunShot(player->mo, !player->refire); }
// // A_FirePistol // Modded to be a musket pistol // -jukeri12 30.8.2015 // void A_FirePistol(player_t *player, pspdef_t *psp) { S_StartSound(player->mo, sfx_pistol); P_SetMobjState(player->mo, S_PLAY_ATK2); player->ammo[weaponinfo[player->readyweapon].ammo]--; A_FireSomething(player,0); // phares P_BulletSlope(player->mo); P_MusketShot(player->mo, 19, 40); P_TraceFront(player->mo, player->mo->angle, MELEERANGE/2, bulletslope); }
OVERLAY void A_FireCGun(player_t *player, pspdef_t *psp) { S_StartSound(player->mo, sfx_pistol); if (!player->ammo[weaponinfo[player->readyweapon].ammo]) return; P_SetMobjState(player->mo, S_PLAY_ATK2); player->ammo[weaponinfo[player->readyweapon].ammo]--; A_FireSomething(player,psp->state - &states[S_CHAIN1]); // phares P_BulletSlope(player->mo); P_GunShot(player->mo, !player->refire); }
OVERLAY void A_FireShotgun(player_t *player, pspdef_t *psp) { int i; S_StartSound(player->mo, sfx_shotgn); P_SetMobjState(player->mo, S_PLAY_ATK2); player->ammo[weaponinfo[player->readyweapon].ammo]--; A_FireSomething(player,0); // phares P_BulletSlope(player->mo); for (i=0; i<7; i++) P_GunShot(player->mo, false); }
// // 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; }
// // A_FireShotgun // void A_FireShotgun(player_t *player, pspdef_t *psp) { int i; S_StartSound(player->mo, sfx_shotgn); P_SetMobjState(player->mo, S_PLAY_ATK2); player->ammo[weaponinfo[player->readyweapon].ammo]--; P_SetPsprite(player, ps_flash, (statenum_t)weaponinfo[player->readyweapon].flashstate); P_BulletSlope(player->mo); for (i = 0; i < 7; i++) P_GunShot(player->mo, false); player->preferredshotgun = wp_shotgun; }
// // A_FireCGun // void A_FireCGun(player_t *player, pspdef_t *psp) { if (player->ammo[weaponinfo[player->readyweapon].ammo]) S_StartSound(player->mo, sfx_pistol); if (!player->ammo[weaponinfo[player->readyweapon].ammo]) return; P_SetMobjState(player->mo, S_PLAY_ATK2); player->ammo[weaponinfo[player->readyweapon].ammo]--; P_SetPsprite(player, ps_flash, (statenum_t)(weaponinfo[player->readyweapon].flashstate + psp->state - &states[S_CHAIN1])); P_BulletSlope(player->mo); P_GunShot(player->mo, !player->refire); }
AActor *COPY_AAPTR(AActor *origin, int selector) { if (origin) { if (origin->player) { switch (selector & AAPTR_PLAYER_SELECTORS) { case AAPTR_PLAYER_GETTARGET: { AActor *gettarget = NULL; P_BulletSlope(origin, &gettarget); return gettarget; } case AAPTR_PLAYER_GETCONVERSATION: return origin->player->ConversationNPC; } } switch (selector & AAPTR_GENERAL_SELECTORS) { case AAPTR_TARGET: return origin->target; case AAPTR_MASTER: return origin->master; case AAPTR_TRACER: return origin->tracer; case AAPTR_FRIENDPLAYER: return origin->FriendPlayer ? AAPTR_RESOLVE_PLAYERNUM(origin->FriendPlayer - 1) : NULL; } } switch (selector & AAPTR_STATIC_SELECTORS) { case AAPTR_PLAYER1: return AAPTR_RESOLVE_PLAYERNUM(0); case AAPTR_PLAYER2: return AAPTR_RESOLVE_PLAYERNUM(1); case AAPTR_PLAYER3: return AAPTR_RESOLVE_PLAYERNUM(2); case AAPTR_PLAYER4: return AAPTR_RESOLVE_PLAYERNUM(3); case AAPTR_PLAYER5: return AAPTR_RESOLVE_PLAYERNUM(4); case AAPTR_PLAYER6: return AAPTR_RESOLVE_PLAYERNUM(5); case AAPTR_PLAYER7: return AAPTR_RESOLVE_PLAYERNUM(6); case AAPTR_PLAYER8: return AAPTR_RESOLVE_PLAYERNUM(7); case AAPTR_NULL: return NULL; } return origin; }
void A_FireCGun(player_t *player, pspdef_t *psp) { CHECK_WEAPON_CODEPOINTER("A_FireCGun", player); if (player->ammo[weaponinfo[player->readyweapon].ammo] || comp[comp_sound]) S_StartSound(player->mo, sfx_pistol); if (!player->ammo[weaponinfo[player->readyweapon].ammo]) return; P_SetMobjState(player->mo, S_PLAY_ATK2); player->ammo[weaponinfo[player->readyweapon].ammo]--; A_FireSomething(player,psp->state - &states[S_CHAIN1]); // phares P_BulletSlope(player->mo); P_GunShot(player->mo, !player->refire); }
// // A_FireShotgun // void A_FireShotgun(player_t* player, pspdef_t* psp) { int i; S_StartSound(player->mo, sfx_shotgun); P_SetMobjState (player->mo, S_007); player->ammo[weaponinfo[player->readyweapon].ammo]--; P_SetPsprite(player, ps_flash, weaponinfo[player->readyweapon].flashstate); P_BulletSlope(player->mo); player->recoilpitch = RECOILPITCH; for(i = 0; i < 7; i++) P_GunShot(player->mo, false); }
// // 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; }
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; }
// // A_FireShotgun2 // void A_FireShotgun2(player_t *player, pspdef_t *psp) { int i; S_StartSound(player->mo, sfx_dshtgn); P_SetMobjState(player->mo, S_PLAY_ATK2); player->ammo[weaponinfo[player->readyweapon].ammo] -= 2; P_SetPsprite(player, ps_flash, (statenum_t)weaponinfo[player->readyweapon].flashstate); P_BulletSlope(player->mo); for (i = 0; i < 20; i++) { int damage = 5 * (P_Random() % 3 + 1); angle_t angle = player->mo->angle + ((P_Random() - P_Random()) << 19); P_LineAttack(player->mo, angle, MISSILERANGE, bulletslope + ((P_Random() - P_Random()) << 5), damage); } player->preferredshotgun = wp_supershotgun; }