Merge commit '772a572431' into scripting
Conflicts: src/p_pspr.cpp src/thingdef/thingdef_codeptr.cpp
This commit is contained in:
commit
cfcd2668cc
94 changed files with 6366 additions and 964 deletions
213
src/p_pspr.cpp
213
src/p_pspr.cpp
|
|
@ -38,6 +38,30 @@
|
|||
|
||||
// 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 --------------------------------------------
|
||||
|
||||
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
||||
|
|
@ -57,6 +81,16 @@ CVAR(Int, sv_fastweapons, false, CVAR_SERVERINFO);
|
|||
static FRandom pr_wpnreadysnd ("WpnReadySnd");
|
||||
static FRandom pr_gunshot ("GunShot");
|
||||
|
||||
static const FGenericButtons ButtonChecks[] =
|
||||
{
|
||||
{ WRF_AllowZoom, WF_WEAPONZOOMOK, BT_ZOOM, NAME_Zoom },
|
||||
{ WRF_AllowReload, 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 --------------------------------------------------------------------
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
|
@ -95,7 +129,8 @@ void P_SetPsprite (player_t *player, int position, FState *state, bool nofunctio
|
|||
|
||||
if (position == ps_weapon && !nofunction)
|
||||
{ // A_WeaponReady will re-set these as needed
|
||||
player->WeaponState &= ~(WF_WEAPONREADY | WF_WEAPONREADYALT | WF_WEAPONBOBBING | WF_WEAPONSWITCHOK | WF_WEAPONRELOADOK | WF_WEAPONZOOMOK);
|
||||
player->WeaponState &= ~(WF_WEAPONREADY | WF_WEAPONREADYALT | WF_WEAPONBOBBING | WF_WEAPONSWITCHOK | WF_WEAPONRELOADOK | WF_WEAPONZOOMOK |
|
||||
WF_USER1OK | WF_USER2OK | WF_USER3OK | WF_USER4OK);
|
||||
}
|
||||
|
||||
psp = &player->psprites[position];
|
||||
|
|
@ -289,66 +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_DropWeapon
|
||||
|
|
@ -562,22 +537,21 @@ void DoReadyWeaponToBob (AActor *self)
|
|||
}
|
||||
}
|
||||
|
||||
void DoReadyWeaponToReload (AActor *self)
|
||||
void DoReadyWeaponToGeneric(AActor *self, int paramflags)
|
||||
{
|
||||
// Prepare for reload action.
|
||||
player_t *player;
|
||||
if (self && (player = self->player))
|
||||
player->WeaponState |= WF_WEAPONRELOADOK;
|
||||
return;
|
||||
}
|
||||
int flags = 0;
|
||||
|
||||
void DoReadyWeaponToZoom (AActor *self)
|
||||
{
|
||||
// Prepare for reload action.
|
||||
player_t *player;
|
||||
if (self && (player = self->player))
|
||||
player->WeaponState |= WF_WEAPONZOOMOK;
|
||||
return;
|
||||
for (size_t i = 0; i < countof(ButtonChecks); ++i)
|
||||
{
|
||||
if (paramflags & ButtonChecks[i].ReadyFlag)
|
||||
{
|
||||
flags |= ButtonChecks[i].StateFlag;
|
||||
}
|
||||
}
|
||||
if (self != NULL && self->player != NULL)
|
||||
{
|
||||
self->player->WeaponState |= flags;
|
||||
}
|
||||
}
|
||||
|
||||
// This function replaces calls to A_WeaponReady in other codepointers.
|
||||
|
|
@ -586,33 +560,18 @@ void DoReadyWeapon(AActor *self)
|
|||
DoReadyWeaponToBob(self);
|
||||
DoReadyWeaponToFire(self);
|
||||
DoReadyWeaponToSwitch(self);
|
||||
DoReadyWeaponToReload(self);
|
||||
DoReadyWeaponToZoom(self);
|
||||
DoReadyWeaponToGeneric(self, ~0);
|
||||
}
|
||||
|
||||
enum EWRF_Options
|
||||
{
|
||||
WRF_NoBob = 1,
|
||||
WRF_NoSwitch = 2,
|
||||
WRF_NoPrimary = 4,
|
||||
WRF_NoSecondary = 8,
|
||||
WRF_NoFire = WRF_NoPrimary + WRF_NoSecondary,
|
||||
WRF_AllowReload = 16,
|
||||
WRF_AllowZoom = 32,
|
||||
WRF_DisableSwitch = 64,
|
||||
};
|
||||
|
||||
DEFINE_ACTION_FUNCTION_PARAMS(AInventory, A_WeaponReady)
|
||||
{
|
||||
PARAM_ACTION_PROLOGUE;
|
||||
PARAM_INT_OPT(flags) { flags = 0; }
|
||||
|
||||
DoReadyWeaponToSwitch(self, !(flags & WRF_NoSwitch));
|
||||
if ((flags & WRF_NoFire) != WRF_NoFire) DoReadyWeaponToFire(self, !(flags & WRF_NoPrimary), !(flags & WRF_NoSecondary));
|
||||
if (!(flags & WRF_NoBob)) DoReadyWeaponToBob(self);
|
||||
if ((flags & WRF_AllowReload)) DoReadyWeaponToReload(self);
|
||||
if ((flags & WRF_AllowZoom)) DoReadyWeaponToZoom(self);
|
||||
|
||||
DoReadyWeaponToSwitch(self, !(flags & WRF_NoSwitch));
|
||||
if ((flags & WRF_NoFire) != WRF_NoFire) DoReadyWeaponToFire(self, !(flags & WRF_NoPrimary), !(flags & WRF_NoSecondary));
|
||||
if (!(flags & WRF_NoBob)) DoReadyWeaponToBob(self);
|
||||
DoReadyWeaponToGeneric(self, flags);
|
||||
DoReadyWeaponDisableSwitch(self, flags & WRF_DisableSwitch);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -691,45 +650,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 (weapon == NULL)
|
||||
return;
|
||||
|
||||
// Check for reload.
|
||||
if ((player->WeaponState & WF_WEAPONRELOADOK) && (player->cmd.ucmd.buttons & BT_RELOAD))
|
||||
if (player->Bot == NULL && bot_observer)
|
||||
{
|
||||
P_ReloadWeapon (player, NULL);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// PROC P_CheckWeaponZoom
|
||||
//
|
||||
// The player can use the weapon's zoom function.
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void P_CheckWeaponZoom (player_t *player)
|
||||
{
|
||||
AWeapon *weapon = player->ReadyWeapon;
|
||||
|
||||
if (weapon == NULL)
|
||||
return;
|
||||
|
||||
// Check for zoom.
|
||||
if ((player->WeaponState & WF_WEAPONZOOMOK) && (player->cmd.ucmd.buttons & BT_ZOOM))
|
||||
{
|
||||
P_ZoomWeapon (player, NULL);
|
||||
return;
|
||||
}
|
||||
// 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)
|
||||
{
|
||||
if ((player->WeaponState & ButtonChecks[i].StateFlag) &&
|
||||
(player->cmd.ucmd.buttons & ButtonChecks[i].ButtonFlag))
|
||||
{
|
||||
FState *state = weapon->GetStateForButtonName(ButtonChecks[i].StateName);
|
||||
// [XA] don't change state if still null, so if the modder
|
||||
// sets WRF_xxx to true but forgets to define the corresponding
|
||||
// state, the weapon won't disappear. ;)
|
||||
if (state != NULL)
|
||||
{
|
||||
P_SetPsprite(player, ps_weapon, state);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1126,15 +1080,10 @@ void P_MovePsprites (player_t *player)
|
|||
{
|
||||
P_CheckWeaponFire (player);
|
||||
}
|
||||
if (player->WeaponState & WF_WEAPONRELOADOK)
|
||||
{
|
||||
P_CheckWeaponReload (player);
|
||||
|
||||
// Check custom buttons
|
||||
P_CheckWeaponButtons(player);
|
||||
}
|
||||
if (player->WeaponState & WF_WEAPONZOOMOK)
|
||||
{
|
||||
P_CheckWeaponZoom (player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FArchive &operator<< (FArchive &arc, pspdef_t &def)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue