Add a cvar to control weapon bobbing while firing

This simulates a feature found in Crispy Doom, which keeps the
weapon bobbing while firing. This leads to a "smoother" appearance
which may look a bit prettier to some people.

The default value of 0 preserves the old behavior.
This commit is contained in:
Hugo Locurcio 2020-01-18 01:45:42 +01:00 committed by Christoph Oelckers
parent 8c539539df
commit 80c5b4d37b
6 changed files with 25 additions and 10 deletions

View file

@ -810,6 +810,7 @@ xx(MoveBob)
xx(StillBob) xx(StillBob)
xx(ClassicFlight) xx(ClassicFlight)
xx(WBobSpeed) xx(WBobSpeed)
xx(WBobFire)
xx(PlayerClass) xx(PlayerClass)
xx(MonsterClass) xx(MonsterClass)
xx(MorphedMonster) xx(MorphedMonster)

View file

@ -65,6 +65,7 @@ CVAR (Bool, neverswitchonpickup, false, CVAR_USERINFO | CVAR_ARCHIVE);
CVAR (Float, movebob, 0.25f, CVAR_USERINFO | CVAR_ARCHIVE); CVAR (Float, movebob, 0.25f, CVAR_USERINFO | CVAR_ARCHIVE);
CVAR (Float, stillbob, 0.f, CVAR_USERINFO | CVAR_ARCHIVE); CVAR (Float, stillbob, 0.f, CVAR_USERINFO | CVAR_ARCHIVE);
CVAR (Float, wbobspeed, 1.f, CVAR_USERINFO | CVAR_ARCHIVE); CVAR (Float, wbobspeed, 1.f, CVAR_USERINFO | CVAR_ARCHIVE);
CVAR (Float, wbobfire, 0.f, CVAR_USERINFO | CVAR_ARCHIVE);
CVAR (String, playerclass, "Fighter", CVAR_USERINFO | CVAR_ARCHIVE); CVAR (String, playerclass, "Fighter", CVAR_USERINFO | CVAR_ARCHIVE);
CVAR (Bool, classicflight, false, CVAR_USERINFO | CVAR_ARCHIVE); CVAR (Bool, classicflight, false, CVAR_USERINFO | CVAR_ARCHIVE);
@ -80,6 +81,7 @@ enum
INFO_MoveBob, INFO_MoveBob,
INFO_StillBob, INFO_StillBob,
INFO_WBobSpeed, INFO_WBobSpeed,
INFO_WBobFire,
INFO_PlayerClass, INFO_PlayerClass,
INFO_ColorSet, INFO_ColorSet,
INFO_ClassicFlight, INFO_ClassicFlight,

View file

@ -232,6 +232,10 @@ struct userinfo_t : TMap<FName,FBaseCVar *>
{ {
return *static_cast<FFloatCVar *>(*CheckKey(NAME_WBobSpeed)); return *static_cast<FFloatCVar *>(*CheckKey(NAME_WBobSpeed));
} }
double GetWBobFire() const
{
return *static_cast<FFloatCVar *>(*CheckKey(NAME_WBobFire));
}
int GetPlayerClassNum() const int GetPlayerClassNum() const
{ {
return *static_cast<FIntCVar *>(*CheckKey(NAME_PlayerClass)); return *static_cast<FIntCVar *>(*CheckKey(NAME_PlayerClass));

View file

@ -790,6 +790,12 @@ DEFINE_ACTION_FUNCTION(_PlayerInfo, GetWBobSpeed)
ACTION_RETURN_FLOAT(self->userinfo.GetWBobSpeed()); ACTION_RETURN_FLOAT(self->userinfo.GetWBobSpeed());
} }
DEFINE_ACTION_FUNCTION(_PlayerInfo, GetWBobFire)
{
PARAM_SELF_STRUCT_PROLOGUE(player_t);
ACTION_RETURN_FLOAT(self->userinfo.GetWBobFire());
}
DEFINE_ACTION_FUNCTION(_PlayerInfo, GetMoveBob) DEFINE_ACTION_FUNCTION(_PlayerInfo, GetMoveBob)
{ {
PARAM_SELF_STRUCT_PROLOGUE(player_t); PARAM_SELF_STRUCT_PROLOGUE(player_t);

View file

@ -1046,6 +1046,7 @@ OptionMenu "HUDOptions" protected
Slider "$DSPLYMNU_MOVEBOB", "movebob", 0, 1.0, 0.05, 2 Slider "$DSPLYMNU_MOVEBOB", "movebob", 0, 1.0, 0.05, 2
Slider "$DSPLYMNU_STILLBOB", "stillbob", 0, 1.0, 0.05, 2 Slider "$DSPLYMNU_STILLBOB", "stillbob", 0, 1.0, 0.05, 2
Slider "$DSPLYMNU_BOBSPEED", "wbobspeed", 0, 2.0, 0.1 Slider "$DSPLYMNU_BOBSPEED", "wbobspeed", 0, 2.0, 0.1
Slider "$DSPLYMNU_BOBFIRE", "wbobfire", 0, 1.0, 0.1
StaticText " " StaticText " "
Slider "$DSPLYMNU_MENUDIM", "dimamount", 0, 1.0, 0.05, 2 Slider "$DSPLYMNU_MENUDIM", "dimamount", 0, 1.0, 0.05, 2
ColorPicker "$DSPLYMNU_DIMCOLOR", "dimcolor" ColorPicker "$DSPLYMNU_DIMCOLOR", "dimcolor"

View file

@ -2301,8 +2301,6 @@ class PlayerPawn : Actor
Vector2 p1, p2, r; Vector2 p1, p2, r;
Vector2 result; Vector2 result;
float bobtarget;
let player = self.player; let player = self.player;
if (!player) return (0, 0); if (!player) return (0, 0);
let weapon = player.ReadyWeapon; let weapon = player.ReadyWeapon;
@ -2326,17 +2324,16 @@ class PlayerPawn : Actor
// [RH] Smooth transitions between bobbing and not-bobbing frames. // [RH] Smooth transitions between bobbing and not-bobbing frames.
// This also fixes the bug where you can "stick" a weapon off-center by // This also fixes the bug where you can "stick" a weapon off-center by
// shooting it when it's at the peak of its swing. // shooting it when it's at the peak of its swing.
bobtarget = double((player.WeaponState & WF_WEAPONBOBBING) ? player.bob : 0.); if (curbob != player.bob)
if (curbob != bobtarget)
{ {
if (abs(bobtarget - curbob) <= 1) if (abs(player.bob - curbob) <= 1)
{ {
curbob = bobtarget; curbob = player.bob;
} }
else else
{ {
double zoom = MAX(1., abs(curbob - bobtarget) / 40); double zoom = MAX(1., abs(curbob - player.bob) / 40);
if (curbob > bobtarget) if (curbob > player.bob)
{ {
curbob -= zoom; curbob -= zoom;
} }
@ -2347,11 +2344,14 @@ class PlayerPawn : Actor
} }
} }
// The weapon bobbing intensity while firing can be adjusted by the player.
double BobIntensity = (player.WeaponState & WF_WEAPONBOBBING) ? 1. : player.GetWBobFire();
if (curbob != 0) if (curbob != 0)
{ {
//[SP] Added in decorate player.viewbob checks //[SP] Added in decorate player.viewbob checks
double bobx = (player.bob * Rangex * ViewBob); double bobx = (player.bob * BobIntensity * Rangex * ViewBob);
double boby = (player.bob * Rangey * ViewBob); double boby = (player.bob * BobIntensity * Rangey * ViewBob);
switch (bobstyle) switch (bobstyle)
{ {
case Bob_Normal: case Bob_Normal:
@ -2710,6 +2710,7 @@ struct PlayerInfo native play // self is what internally is known as player_t
native float GetAutoaim() const; native float GetAutoaim() const;
native bool GetNoAutostartMap() const; native bool GetNoAutostartMap() const;
native double GetWBobSpeed() const; native double GetWBobSpeed() const;
native double GetWBobFire() const;
native double GetMoveBob() const; native double GetMoveBob() const;
native double GetStillBob() const; native double GetStillBob() const;
native void SetFOV(float fov); native void SetFOV(float fov);