From 87b8b6201cfce58b88cdf01f3354946d5fba37da Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Tue, 5 Feb 2013 02:27:35 +0000 Subject: [PATCH] - Added WRF_DISABLESWITCH flag for A_WeaponReady to indicate that any attempts to switch the weapon should be discarded. SVN r4062 (trunk) --- src/d_player.h | 1 + src/p_pspr.cpp | 61 +++++++++++++++++++++--------- wadsrc/static/actors/constants.txt | 3 +- 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 1b26bb776..76c70819d 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -212,6 +212,7 @@ enum WF_WEAPONBOBBING = 1 << 1, // [HW] Bob weapon while the player is moving WF_WEAPONREADYALT = 1 << 2, // Weapon can fire its secondary attack WF_WEAPONSWITCHOK = 1 << 3, // It is okay to switch away from this weapon + WF_DISABLESWITCH = 1 << 4, // Disable weapon switching completely WF_WEAPONRELOADOK = 1 << 5, // [XA] Okay to reload this weapon. WF_WEAPONZOOMOK = 1 << 6, // [XA] Okay to use weapon zoom function. }; diff --git a/src/p_pspr.cpp b/src/p_pspr.cpp index a4310efd4..192514058 100644 --- a/src/p_pspr.cpp +++ b/src/p_pspr.cpp @@ -352,6 +352,12 @@ void P_ZoomWeapon (player_t *player, FState *state) void P_DropWeapon (player_t *player) { + if (player == NULL) + { + return; + } + // Since the weapon is dropping, stop blocking switching. + player->WeaponState &= ~WF_DISABLESWITCH; if (player->ReadyWeapon != NULL) { P_SetPsprite (player, ps_weapon, player->ReadyWeapon->GetDownState()); @@ -471,7 +477,7 @@ void P_BobWeapon (player_t *player, pspdef_t *psp, fixed_t *x, fixed_t *y) // //============================================================================ -void DoReadyWeaponToSwitch (AActor * self) +void DoReadyWeaponToSwitch (AActor *self) { // Prepare for switching action. player_t *player; @@ -479,7 +485,24 @@ void DoReadyWeaponToSwitch (AActor * self) player->WeaponState |= WF_WEAPONSWITCHOK; } -void DoReadyWeaponToFire (AActor * self, bool prim, bool alt) +void DoReadyWeaponDisableSwitch (AActor *self, INTBOOL disable) +{ + // Discard all switch attempts? + player_t *player; + if (self && (player = self->player)) + { + if (disable) + { + player->WeaponState |= WF_DISABLESWITCH; + } + else + { + player->WeaponState &= ~WF_DISABLESWITCH; + } + } +} + +void DoReadyWeaponToFire (AActor *self, bool prim, bool alt) { player_t *player; AWeapon *weapon; @@ -510,7 +533,7 @@ void DoReadyWeaponToFire (AActor * self, bool prim, bool alt) return; } -void DoReadyWeaponToBob (AActor * self) +void DoReadyWeaponToBob (AActor *self) { if (self && self->player && self->player->ReadyWeapon) { @@ -521,7 +544,7 @@ void DoReadyWeaponToBob (AActor * self) } } -void DoReadyWeaponToReload (AActor * self) +void DoReadyWeaponToReload (AActor *self) { // Prepare for reload action. player_t *player; @@ -530,7 +553,7 @@ void DoReadyWeaponToReload (AActor * self) return; } -void DoReadyWeaponToZoom (AActor * self) +void DoReadyWeaponToZoom (AActor *self) { // Prepare for reload action. player_t *player; @@ -540,7 +563,7 @@ void DoReadyWeaponToZoom (AActor * self) } // This function replaces calls to A_WeaponReady in other codepointers. -void DoReadyWeapon(AActor * self) +void DoReadyWeapon(AActor *self) { DoReadyWeaponToBob(self); DoReadyWeaponToFire(self); @@ -558,6 +581,7 @@ enum EWRF_Options WRF_NoFire = WRF_NoPrimary + WRF_NoSecondary, WRF_AllowReload = 16, WRF_AllowZoom = 32, + WRF_DisableSwitch = 64, }; DEFINE_ACTION_FUNCTION_PARAMS(AInventory, A_WeaponReady) @@ -570,6 +594,8 @@ DEFINE_ACTION_FUNCTION_PARAMS(AInventory, A_WeaponReady) if (!(paramflags & WRF_NoBob)) DoReadyWeaponToBob(self); if ((paramflags & WRF_AllowReload)) DoReadyWeaponToReload(self); if ((paramflags & WRF_AllowZoom)) DoReadyWeaponToZoom(self); + + DoReadyWeaponDisableSwitch(self, paramflags & WRF_DisableSwitch); } //--------------------------------------------------------------------------- @@ -625,22 +651,23 @@ void P_CheckWeaponFire (player_t *player) void P_CheckWeaponSwitch (player_t *player) { - AWeapon *weapon; - - if (!player || !(weapon = player->ReadyWeapon)) - return; - - // Put the weapon away if the player has a pending weapon or has died. - if ((player->morphTics == 0 && player->PendingWeapon != WP_NOCHANGE) || player->health <= 0) + if (player == NULL) { - P_DropWeapon(player); return; } - else if (player->morphTics != 0) - { - // morphed classes cannot change weapons so don't even try again. + if ((player->WeaponState & WF_DISABLESWITCH) || // Weapon changing has been disabled. + player->morphTics != 0) // Morphed classes cannot change weapons. + { // ...so throw away any pending weapon requests. player->PendingWeapon = WP_NOCHANGE; } + + // Put the weapon away if the player has a pending weapon or has died, and + // we're at a place in the state sequence where dropping the weapon is okay. + if ((player->PendingWeapon != WP_NOCHANGE || player->health <= 0) && + player->WeaponState & WF_WEAPONSWITCHOK) + { + P_DropWeapon(player); + } } //--------------------------------------------------------------------------- diff --git a/wadsrc/static/actors/constants.txt b/wadsrc/static/actors/constants.txt index a8bcf26b8..3280f53d2 100644 --- a/wadsrc/static/actors/constants.txt +++ b/wadsrc/static/actors/constants.txt @@ -92,12 +92,13 @@ const int CVF_REPLACE = 2; // Flags for A_WeaponReady const int WRF_NOBOB = 1; -const int WRF_NOFIRE = 12; const int WRF_NOSWITCH = 2; const int WRF_NOPRIMARY = 4; const int WRF_NOSECONDARY = 8; +const int WRF_NOFIRE = WRF_NOPRIMARY | WRF_NOSECONDARY; const int WRF_ALLOWRELOAD = 16; const int WRF_ALLOWZOOM = 32; +const int WRF_DISABLESWITCH = 64; // Morph constants const int MRF_ADDSTAMINA = 1;