diff --git a/src/d_player.h b/src/d_player.h index 9d4ebf08..55bd23bf 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -187,6 +187,9 @@ typedef struct player_s // [crispy] weapon recoil pitch fixed_t recoilpitch, oldrecoilpitch; + // [crispy] variable player view bob + fixed_t bob2; + } player_t; diff --git a/src/doomstat.c b/src/doomstat.c index 5433524b..6bfcc5ed 100644 --- a/src/doomstat.c +++ b/src/doomstat.c @@ -121,7 +121,7 @@ int monkeys, default_monkeys; // [FG] centered weapon sprite int center_weapon; -boolean cosmetic_bobbing; +int cosmetic_bobbing; char *MAPNAME(int e, int m) { diff --git a/src/doomstat.h b/src/doomstat.h index d2043839..a145308d 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -437,7 +437,7 @@ extern int doom_weapon_toggles; // killough 10/98 // [FG] centered weapon sprite extern int center_weapon; -extern boolean cosmetic_bobbing; +extern int cosmetic_bobbing; #endif diff --git a/src/m_menu.c b/src/m_menu.c index 96e74ad2..14e7ca76 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3103,6 +3103,10 @@ static const char *weapon_attack_alignment_strings[] = { "OFF", "CENTERED", "BOBBING", NULL }; +static const char *default_bobfactor_strings[] = { + "OFF", "FULL", "75%", NULL +}; + static void M_UpdateCenteredWeaponItem(void) { DISABLE_ITEM(!STRICTMODE(cosmetic_bobbing), weap_settings1[weap_center]); @@ -3129,7 +3133,7 @@ setup_menu_t weap_settings1[] = // Weapons Settings screen {"Cosmetic",S_SKIP|S_TITLE,m_null,M_X,M_Y+weap_title1*M_SPC}, - {"Enable Bobbing",S_YESNO,m_null,M_X, M_Y+weap_bobbing*M_SPC, {"cosmetic_bobbing"}, 0, M_UpdateCenteredWeaponItem}, + {"Player View/Weapon Bobbing",S_CHOICE,m_null,M_X, M_Y+weap_bobbing*M_SPC, {"cosmetic_bobbing"}, 0, M_UpdateCenteredWeaponItem, default_bobfactor_strings}, {"Enable Recoil Pitch", S_YESNO,m_null,M_X, M_Y+ weap_recoilpitch*M_SPC, {"weapon_recoilpitch"}}, diff --git a/src/m_misc.c b/src/m_misc.c index 1f6def01..6b1b08ec 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -348,8 +348,8 @@ default_t defaults[] = { { "cosmetic_bobbing", (config_t *) &cosmetic_bobbing, NULL, - {1}, {0,1}, number, ss_weap, wad_no, - "1 to enable cosmetic player bobbing (view moving up/down slightly)" + {1}, {0,2}, number, ss_weap, wad_no, + "Player View/Weapon Bobbing (0 = off, 1 = full, 2 = 75%)" }, // [FG] centered or bobbing weapon sprite diff --git a/src/p_pspr.c b/src/p_pspr.c index 9d7754db..845a6c58 100644 --- a/src/p_pspr.c +++ b/src/p_pspr.c @@ -1056,6 +1056,8 @@ void P_SetupPsprites(player_t *player) // Called every tic by player thinking routine. // +#define BOBBING_75 2 + #define WEAPON_CENTERED 1 #define WEAPON_BOBBING 2 @@ -1097,7 +1099,7 @@ void P_MovePsprites(player_t *player) psp->sy2 -= (last_sy - 32 * FRACUNIT); } } - else if (psp->state && center_weapon) + else if (psp->state && (cosmetic_bobbing == BOBBING_75 || center_weapon)) { // [FG] don't center during lowering and raising states if (psp->state->misc1 || @@ -1109,9 +1111,9 @@ void P_MovePsprites(player_t *player) else if (!player->attackdown || center_weapon == WEAPON_BOBBING) { int angle = (128*leveltime) & FINEMASK; - psp->sx2 = FRACUNIT + FixedMul(player->bob, finecosine[angle]); + psp->sx2 = FRACUNIT + FixedMul(player->bob2, finecosine[angle]); angle &= FINEANGLES/2-1; - psp->sy2 = WEAPONTOP + FixedMul(player->bob, finesine[angle]); + psp->sy2 = WEAPONTOP + FixedMul(player->bob2, finesine[angle]); } // [FG] center the weapon sprite horizontally and push up vertically else if (center_weapon == WEAPON_CENTERED) diff --git a/src/p_saveg.c b/src/p_saveg.c index a1c1c3bf..547fa125 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -826,6 +826,7 @@ static void saveg_read_player_t(player_t *str) // fixed_t bob; str->bob = saveg_read32(); + str->bob2 = str->bob; // fixed_t momx; str->momx = saveg_read32(); diff --git a/src/p_user.c b/src/p_user.c index 174d3e9b..648799af 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -86,6 +86,9 @@ void P_Bob(player_t *player, angle_t angle, fixed_t move) // Calculate the walking / running height adjustment // +// [crispy] variable player view bob +static const int bobfactors[3] = {0, 4, 3}; + void P_CalcHeight (player_t* player) { int angle; @@ -125,6 +128,9 @@ void P_CalcHeight (player_t* player) player->bob = MAXBOB; } + // [crispy] variable player view bob + player->bob2 = bobfactors[cosmetic_bobbing] * player->bob / 4; + if (!onground || player->cheats & CF_NOMOMENTUM) { player->viewz = player->mo->z + VIEWHEIGHT; @@ -143,7 +149,7 @@ void P_CalcHeight (player_t* player) } angle = (FINEANGLES/20*leveltime)&FINEMASK; - bob = cosmetic_bobbing ? FixedMul(player->bob/2,finesine[angle]) : 0; + bob = FixedMul(player->bob2/2,finesine[angle]); // move viewheight