- Added WRF_DISABLESWITCH flag for A_WeaponReady to indicate that any attempts to switch the weapon

should be discarded.

SVN r4062 (trunk)
This commit is contained in:
Randy Heit 2013-02-05 02:27:35 +00:00
parent f0bc2fdc53
commit 87b8b6201c
3 changed files with 47 additions and 18 deletions

View file

@ -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.
};

View file

@ -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);
}
}
//---------------------------------------------------------------------------

View file

@ -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;