mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-28 06:53:58 +00:00
Cleanup the zoom/reload/userX handling for A_WeaponReady
- There was lots of code duplication. Consolidated it. - Renamed WRF_UserX to WRF_AllowUserX for consistancy.
This commit is contained in:
parent
afbf88cc63
commit
1d759283c0
5 changed files with 82 additions and 259 deletions
|
@ -305,9 +305,7 @@ public:
|
||||||
virtual FState *GetReadyState ();
|
virtual FState *GetReadyState ();
|
||||||
virtual FState *GetAtkState (bool hold);
|
virtual FState *GetAtkState (bool hold);
|
||||||
virtual FState *GetAltAtkState (bool hold);
|
virtual FState *GetAltAtkState (bool hold);
|
||||||
virtual FState *GetRelState ();
|
virtual FState *GetStateForButtonName (FName button);
|
||||||
virtual FState *GetZoomState ();
|
|
||||||
virtual FState *GetUserState(int state);
|
|
||||||
|
|
||||||
virtual void PostMorphWeapon ();
|
virtual void PostMorphWeapon ();
|
||||||
virtual void EndPowerup ();
|
virtual void EndPowerup ();
|
||||||
|
|
|
@ -683,47 +683,13 @@ FState *AWeapon::GetAltAtkState (bool hold)
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
// AWeapon :: GetRelState
|
// AWeapon :: GetStateForButtonName
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
FState *AWeapon::GetRelState ()
|
FState *AWeapon::GetStateForButtonName (FName button)
|
||||||
{
|
{
|
||||||
return FindState(NAME_Reload);
|
return FindState(button);
|
||||||
}
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
//
|
|
||||||
// AWeapon :: GetZoomState
|
|
||||||
//
|
|
||||||
//===========================================================================
|
|
||||||
|
|
||||||
FState *AWeapon::GetZoomState ()
|
|
||||||
{
|
|
||||||
return FindState(NAME_Zoom);
|
|
||||||
}
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
//
|
|
||||||
// AWeapon :: GetUserState
|
|
||||||
//
|
|
||||||
//===========================================================================
|
|
||||||
|
|
||||||
FState *AWeapon::GetUserState(int state)
|
|
||||||
{
|
|
||||||
switch (state)
|
|
||||||
{
|
|
||||||
case 4:
|
|
||||||
return FindState(NAME_User4);
|
|
||||||
case 3:
|
|
||||||
return FindState(NAME_User3);
|
|
||||||
case 2:
|
|
||||||
return FindState(NAME_User2);
|
|
||||||
case 1:
|
|
||||||
return FindState(NAME_User1);
|
|
||||||
default:
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
287
src/p_pspr.cpp
287
src/p_pspr.cpp
|
@ -38,6 +38,30 @@
|
||||||
|
|
||||||
// TYPES -------------------------------------------------------------------
|
// TYPES -------------------------------------------------------------------
|
||||||
|
|
||||||
|
struct FGenericButtons
|
||||||
|
{
|
||||||
|
int ReadyFlag; // Flag passed to A_WeaponReady
|
||||||
|
int StateFlag; // Flag set in WeaponState
|
||||||
|
int ButtonFlag; // Button to press
|
||||||
|
ENamedName StateName; // Name of the button/state
|
||||||
|
};
|
||||||
|
|
||||||
|
enum EWRF_Options
|
||||||
|
{
|
||||||
|
WRF_NoBob = 1,
|
||||||
|
WRF_NoSwitch = 1 << 1,
|
||||||
|
WRF_NoPrimary = 1 << 2,
|
||||||
|
WRF_NoSecondary = 1 << 3,
|
||||||
|
WRF_NoFire = WRF_NoPrimary | WRF_NoSecondary,
|
||||||
|
WRF_AllowReload = 1 << 4,
|
||||||
|
WRF_AllowZoom = 1 << 5,
|
||||||
|
WRF_DisableSwitch = 1 << 6,
|
||||||
|
WRF_AllowUser1 = 1 << 7,
|
||||||
|
WRF_AllowUser2 = 1 << 8,
|
||||||
|
WRF_AllowUser3 = 1 << 9,
|
||||||
|
WRF_AllowUser4 = 1 << 10,
|
||||||
|
};
|
||||||
|
|
||||||
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
||||||
|
|
||||||
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
||||||
|
@ -57,6 +81,16 @@ CVAR(Int, sv_fastweapons, false, CVAR_SERVERINFO);
|
||||||
static FRandom pr_wpnreadysnd ("WpnReadySnd");
|
static FRandom pr_wpnreadysnd ("WpnReadySnd");
|
||||||
static FRandom pr_gunshot ("GunShot");
|
static FRandom pr_gunshot ("GunShot");
|
||||||
|
|
||||||
|
static const FGenericButtons ButtonChecks[] =
|
||||||
|
{
|
||||||
|
{ WRF_AllowReload, WF_WEAPONZOOMOK, BT_ZOOM, NAME_Zoom },
|
||||||
|
{ WRF_AllowZoom, WF_WEAPONRELOADOK, BT_RELOAD, NAME_Reload },
|
||||||
|
{ WRF_AllowUser1, WF_USER1OK, BT_USER1, NAME_User1 },
|
||||||
|
{ WRF_AllowUser2, WF_USER2OK, BT_USER2, NAME_User2 },
|
||||||
|
{ WRF_AllowUser3, WF_USER3OK, BT_USER3, NAME_User3 },
|
||||||
|
{ WRF_AllowUser4, WF_USER4OK, BT_USER4, NAME_User4 },
|
||||||
|
};
|
||||||
|
|
||||||
// CODE --------------------------------------------------------------------
|
// CODE --------------------------------------------------------------------
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
@ -290,94 +324,6 @@ void P_FireWeaponAlt (player_t *player, FState *state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC P_ReloadWeapon
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void P_ReloadWeapon (player_t *player, FState *state)
|
|
||||||
{
|
|
||||||
AWeapon *weapon;
|
|
||||||
if (player->Bot == NULL && bot_observer)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
weapon = player->ReadyWeapon;
|
|
||||||
if (weapon == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state == NULL)
|
|
||||||
{
|
|
||||||
state = weapon->GetRelState();
|
|
||||||
}
|
|
||||||
// [XA] don't change state if still null, so if the modder sets
|
|
||||||
// WRF_RELOAD to true but forgets to define the Reload state, the weapon
|
|
||||||
// won't disappear. ;)
|
|
||||||
if (state != NULL)
|
|
||||||
P_SetPsprite (player, ps_weapon, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC P_ZoomWeapon
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void P_ZoomWeapon (player_t *player, FState *state)
|
|
||||||
{
|
|
||||||
AWeapon *weapon;
|
|
||||||
if (player->Bot == NULL && bot_observer)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
weapon = player->ReadyWeapon;
|
|
||||||
if (weapon == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state == NULL)
|
|
||||||
{
|
|
||||||
state = weapon->GetZoomState();
|
|
||||||
}
|
|
||||||
// [XA] don't change state if still null. Same reasons as above.
|
|
||||||
if (state != NULL)
|
|
||||||
P_SetPsprite (player, ps_weapon, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------- -
|
|
||||||
//
|
|
||||||
// PROC P_UserStateWeapon
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void P_UserStateWeapon(player_t *player, FState *state, int userstate)
|
|
||||||
{
|
|
||||||
if (!userstate)
|
|
||||||
return;
|
|
||||||
|
|
||||||
AWeapon *weapon;
|
|
||||||
if (player->Bot == NULL && bot_observer)
|
|
||||||
return;
|
|
||||||
|
|
||||||
weapon = player->ReadyWeapon;
|
|
||||||
if (weapon == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (state == NULL)
|
|
||||||
{
|
|
||||||
state = weapon->GetUserState(userstate);
|
|
||||||
}
|
|
||||||
if (state != NULL)
|
|
||||||
P_SetPsprite(player, ps_weapon, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC P_DropWeapon
|
// PROC P_DropWeapon
|
||||||
|
@ -591,33 +537,21 @@ void DoReadyWeaponToBob (AActor *self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DoReadyWeaponToReload (AActor *self)
|
void DoReadyWeaponToGeneric(AActor *self, int paramflags)
|
||||||
{
|
{
|
||||||
// Prepare for reload action.
|
int flags = 0;
|
||||||
player_t *player;
|
|
||||||
if (self && (player = self->player))
|
|
||||||
player->WeaponState |= WF_WEAPONRELOADOK;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DoReadyWeaponToZoom (AActor *self)
|
for (size_t i = 0; i < countof(ButtonChecks); ++i)
|
||||||
{
|
|
||||||
// Prepare for zoom action.
|
|
||||||
player_t *player;
|
|
||||||
if (self && (player = self->player))
|
|
||||||
player->WeaponState |= WF_WEAPONZOOMOK;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DoReadyWeaponToUser(AActor *self, int userStates)
|
|
||||||
{
|
|
||||||
// Prepare for user state action.
|
|
||||||
player_t *player;
|
|
||||||
if (self && (player = self->player) && userStates)
|
|
||||||
{
|
{
|
||||||
player->WeaponState |= userStates;
|
if (paramflags & ButtonChecks[i].ReadyFlag)
|
||||||
|
{
|
||||||
|
flags |= ButtonChecks[i].StateFlag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (self != NULL && self->player != NULL)
|
||||||
|
{
|
||||||
|
self->player->WeaponState |= flags;
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function replaces calls to A_WeaponReady in other codepointers.
|
// This function replaces calls to A_WeaponReady in other codepointers.
|
||||||
|
@ -626,27 +560,9 @@ void DoReadyWeapon(AActor *self)
|
||||||
DoReadyWeaponToBob(self);
|
DoReadyWeaponToBob(self);
|
||||||
DoReadyWeaponToFire(self);
|
DoReadyWeaponToFire(self);
|
||||||
DoReadyWeaponToSwitch(self);
|
DoReadyWeaponToSwitch(self);
|
||||||
DoReadyWeaponToReload(self);
|
DoReadyWeaponToGeneric(self, ~0);
|
||||||
DoReadyWeaponToZoom(self);
|
|
||||||
DoReadyWeaponToUser(self, (WF_USER1OK | WF_USER2OK | WF_USER3OK | WF_USER4OK));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum EWRF_Options
|
|
||||||
{
|
|
||||||
WRF_NoBob = 1,
|
|
||||||
WRF_NoSwitch = 1 << 1,
|
|
||||||
WRF_NoPrimary = 1 << 2,
|
|
||||||
WRF_NoSecondary = 1 << 3,
|
|
||||||
WRF_NoFire = WRF_NoPrimary + WRF_NoSecondary,
|
|
||||||
WRF_AllowReload = 1 << 4,
|
|
||||||
WRF_AllowZoom = 1 << 5,
|
|
||||||
WRF_DisableSwitch = 1 << 6,
|
|
||||||
WRF_User1 = 1 << 7,
|
|
||||||
WRF_User2 = 1 << 8,
|
|
||||||
WRF_User3 = 1 << 9,
|
|
||||||
WRF_User4 = 1 << 10,
|
|
||||||
};
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION_PARAMS(AInventory, A_WeaponReady)
|
DEFINE_ACTION_FUNCTION_PARAMS(AInventory, A_WeaponReady)
|
||||||
{
|
{
|
||||||
ACTION_PARAM_START(1);
|
ACTION_PARAM_START(1);
|
||||||
|
@ -655,17 +571,8 @@ DEFINE_ACTION_FUNCTION_PARAMS(AInventory, A_WeaponReady)
|
||||||
DoReadyWeaponToSwitch(self, !(paramflags & WRF_NoSwitch));
|
DoReadyWeaponToSwitch(self, !(paramflags & WRF_NoSwitch));
|
||||||
if ((paramflags & WRF_NoFire) != WRF_NoFire) DoReadyWeaponToFire(self, !(paramflags & WRF_NoPrimary), !(paramflags & WRF_NoSecondary));
|
if ((paramflags & WRF_NoFire) != WRF_NoFire) DoReadyWeaponToFire(self, !(paramflags & WRF_NoPrimary), !(paramflags & WRF_NoSecondary));
|
||||||
if (!(paramflags & WRF_NoBob)) DoReadyWeaponToBob(self);
|
if (!(paramflags & WRF_NoBob)) DoReadyWeaponToBob(self);
|
||||||
if ((paramflags & WRF_AllowReload)) DoReadyWeaponToReload(self);
|
DoReadyWeaponToGeneric(self, paramflags);
|
||||||
if ((paramflags & WRF_AllowZoom)) DoReadyWeaponToZoom(self);
|
DoReadyWeaponDisableSwitch(self, paramflags & WRF_DisableSwitch);
|
||||||
|
|
||||||
int userStates = 0;
|
|
||||||
if (paramflags & WRF_User1) userStates |= WF_USER1OK;
|
|
||||||
if (paramflags & WRF_User2) userStates |= WF_USER2OK;
|
|
||||||
if (paramflags & WRF_User3) userStates |= WF_USER3OK;
|
|
||||||
if (paramflags & WRF_User4) userStates |= WF_USER4OK;
|
|
||||||
if (userStates) DoReadyWeaponToUser(self, userStates);
|
|
||||||
|
|
||||||
DoReadyWeaponDisableSwitch(self, paramflags & WRF_DisableSwitch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
@ -742,79 +649,40 @@ void P_CheckWeaponSwitch (player_t *player)
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC P_CheckWeaponReload
|
// PROC P_CheckWeaponButtons
|
||||||
//
|
//
|
||||||
// The player can reload the weapon.
|
// Check extra button presses for weapons.
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
void P_CheckWeaponReload (player_t *player)
|
static void P_CheckWeaponButtons (player_t *player)
|
||||||
{
|
{
|
||||||
AWeapon *weapon = player->ReadyWeapon;
|
if (player->Bot == NULL && bot_observer)
|
||||||
|
{
|
||||||
if (weapon == NULL)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Check for reload.
|
|
||||||
if ((player->WeaponState & WF_WEAPONRELOADOK) && (player->cmd.ucmd.buttons & BT_RELOAD))
|
|
||||||
{
|
|
||||||
P_ReloadWeapon (player, NULL);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC P_CheckWeaponZoom
|
|
||||||
//
|
|
||||||
// The player can use the weapon's zoom function.
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void P_CheckWeaponZoom (player_t *player)
|
|
||||||
{
|
|
||||||
AWeapon *weapon = player->ReadyWeapon;
|
AWeapon *weapon = player->ReadyWeapon;
|
||||||
|
|
||||||
if (weapon == NULL)
|
if (weapon == NULL)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Check for zoom.
|
|
||||||
if ((player->WeaponState & WF_WEAPONZOOMOK) && (player->cmd.ucmd.buttons & BT_ZOOM))
|
|
||||||
{
|
|
||||||
P_ZoomWeapon (player, NULL);
|
|
||||||
}
|
}
|
||||||
}
|
// The button checks are ordered by precedence. The first one to match a
|
||||||
|
// button press and affect a state change wins.
|
||||||
//---------------------------------------------------------------------------
|
for (size_t i = 0; i < countof(ButtonChecks); ++i)
|
||||||
//
|
|
||||||
// PROC P_CheckWeaponUserState
|
|
||||||
//
|
|
||||||
// The player can use the weapon's user state functionalities.
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void P_CheckWeaponUserState(player_t *player)
|
|
||||||
{
|
|
||||||
AWeapon *weapon = player->ReadyWeapon;
|
|
||||||
|
|
||||||
if (weapon == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Check for user state(s).
|
|
||||||
if ((player->WeaponState & WF_USER1OK) && (player->cmd.ucmd.buttons & BT_USER1))
|
|
||||||
{
|
{
|
||||||
P_UserStateWeapon(player, NULL, 1);
|
if ((player->WeaponState & ButtonChecks[i].StateFlag) &&
|
||||||
}
|
(player->cmd.ucmd.buttons & ButtonChecks[i].ButtonFlag))
|
||||||
else if ((player->WeaponState & WF_USER2OK) && (player->cmd.ucmd.buttons & BT_USER2))
|
{
|
||||||
{
|
FState *state = weapon->GetStateForButtonName(ButtonChecks[i].StateName);
|
||||||
P_UserStateWeapon(player, NULL, 2);
|
// [XA] don't change state if still null, so if the modder
|
||||||
}
|
// sets WRF_xxx to true but forgets to define the corresponding
|
||||||
else if ((player->WeaponState & WF_USER3OK) && (player->cmd.ucmd.buttons & BT_USER3))
|
// state, the weapon won't disappear. ;)
|
||||||
{
|
if (state != NULL)
|
||||||
P_UserStateWeapon(player, NULL, 3);
|
{
|
||||||
}
|
P_SetPsprite(player, ps_weapon, state);
|
||||||
else if ((player->WeaponState & WF_USER4OK) && (player->cmd.ucmd.buttons & BT_USER4))
|
return;
|
||||||
{
|
}
|
||||||
P_UserStateWeapon(player, NULL, 4);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1181,18 +1049,9 @@ void P_MovePsprites (player_t *player)
|
||||||
{
|
{
|
||||||
P_CheckWeaponFire (player);
|
P_CheckWeaponFire (player);
|
||||||
}
|
}
|
||||||
if (player->WeaponState & WF_WEAPONRELOADOK)
|
|
||||||
{
|
// Check custom buttons
|
||||||
P_CheckWeaponReload (player);
|
P_CheckWeaponButtons(player);
|
||||||
}
|
|
||||||
if (player->WeaponState & WF_WEAPONZOOMOK)
|
|
||||||
{
|
|
||||||
P_CheckWeaponZoom (player);
|
|
||||||
}
|
|
||||||
if (player->WeaponState & (WF_USER1OK | WF_USER2OK | WF_USER3OK | WF_USER4OK))
|
|
||||||
{
|
|
||||||
P_CheckWeaponUserState(player);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -129,10 +129,10 @@ const int WRF_NOFIRE = WRF_NOPRIMARY | WRF_NOSECONDARY;
|
||||||
const int WRF_ALLOWRELOAD = 16;
|
const int WRF_ALLOWRELOAD = 16;
|
||||||
const int WRF_ALLOWZOOM = 32;
|
const int WRF_ALLOWZOOM = 32;
|
||||||
const int WRF_DISABLESWITCH = 64;
|
const int WRF_DISABLESWITCH = 64;
|
||||||
const int WRF_USER1 = 128;
|
const int WRF_ALLOWUSER1 = 128;
|
||||||
const int WRF_USER2 = 256;
|
const int WRF_ALLOWUSER2 = 256;
|
||||||
const int WRF_USER3 = 512;
|
const int WRF_ALLOWUSER3 = 512;
|
||||||
const int WRF_USER4 = 1024;
|
const int WRF_ALLOWUSER4 = 1024;
|
||||||
|
|
||||||
// Morph constants
|
// Morph constants
|
||||||
const int MRF_ADDSTAMINA = 1;
|
const int MRF_ADDSTAMINA = 1;
|
||||||
|
|
Loading…
Reference in a new issue