diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 07dba17774277d2af379f74bf9e684335d91c3df..ed7f808bc85817a2c2264203f5463f14e9c41623 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -875,6 +875,8 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_directionchar[1]); CV_RegisterVar(&cv_autobrake); CV_RegisterVar(&cv_autobrake2); + CV_RegisterVar(&cv_anglestand[0]); + CV_RegisterVar(&cv_anglestand[1]); // hi here's some new controls CV_RegisterVar(&cv_cam_shiftfacing[0]); @@ -1601,13 +1603,15 @@ void SendWeaponPref(void) buf[0] = 0; if (cv_flipcam.value) - buf[0] |= 1; + buf[0] |= WEAPONPREF_FLIPCAM; if (cv_analog[0].value && cv_directionchar[0].value != 2) - buf[0] |= 2; + buf[0] |= WEAPONPREF_ANALOGMODE; if (cv_directionchar[0].value == 1) - buf[0] |= 4; + buf[0] |= WEAPONPREF_DIRECTIONCHAR; if (cv_autobrake.value) - buf[0] |= 8; + buf[0] |= WEAPONPREF_AUTOBRAKE; + if (cv_anglestand[0].value) + buf[0] |= WEAPONPREF_ANGLESTAND; SendNetXCmd(XD_WEAPONPREF, buf, 1); } @@ -1617,13 +1621,15 @@ void SendWeaponPref2(void) buf[0] = 0; if (cv_flipcam2.value) - buf[0] |= 1; + buf[0] |= WEAPONPREF_FLIPCAM; if (cv_analog[1].value && cv_directionchar[1].value != 2) - buf[0] |= 2; + buf[0] |= WEAPONPREF_ANALOGMODE; if (cv_directionchar[1].value == 1) - buf[0] |= 4; + buf[0] |= WEAPONPREF_DIRECTIONCHAR; if (cv_autobrake2.value) - buf[0] |= 8; + buf[0] |= WEAPONPREF_AUTOBRAKE; + if (cv_anglestand[1].value) + buf[0] |= WEAPONPREF_ANGLESTAND; SendNetXCmd2(XD_WEAPONPREF, buf, 1); } @@ -1632,14 +1638,15 @@ static void Got_WeaponPref(UINT8 **cp,INT32 playernum) UINT8 prefs = READUINT8(*cp); players[playernum].pflags &= ~(PF_FLIPCAM|PF_ANALOGMODE|PF_DIRECTIONCHAR|PF_AUTOBRAKE); - if (prefs & 1) + if (prefs & WEAPONPREF_FLIPCAM) players[playernum].pflags |= PF_FLIPCAM; - if (prefs & 2) + if (prefs & WEAPONPREF_ANALOGMODE) players[playernum].pflags |= PF_ANALOGMODE; - if (prefs & 4) + if (prefs & WEAPONPREF_DIRECTIONCHAR) players[playernum].pflags |= PF_DIRECTIONCHAR; - if (prefs & 8) + if (prefs & WEAPONPREF_AUTOBRAKE) players[playernum].pflags |= PF_AUTOBRAKE; + players[playernum].anglestand = !!(prefs & WEAPONPREF_ANGLESTAND); } void D_SendPlayerConfig(void) diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 47f68a17e9d8f3f73a7196062ba533791689a3cd..f0f38a5403dd135c147ac38a0a549570660153f2 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -146,6 +146,17 @@ typedef enum MAXNETXCMD } netxcmd_t; +typedef enum +{ + WEAPONPREF_FLIPCAM = 0x01, + WEAPONPREF_ANALOGMODE = 0x02, + WEAPONPREF_DIRECTIONCHAR = 0x04, + WEAPONPREF_AUTOBRAKE = 0x08, + WEAPONPREF_USEGAMEPAD = 0x10, + WEAPONPREF_ANGLESTAND = 0x20, + // free up to and including 0x80 with current UINT8 buffers +} weaponpref_t; + extern const char *netxcmdnames[MAXNETXCMD - 1]; #if defined(_MSC_VER) diff --git a/src/d_player.h b/src/d_player.h index 42e9c3a82f2b656bbe9d304159f1ab5c0c7f8a69..bbe6ff25c42b30070c550d4c91f10190f3d45237 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -385,6 +385,7 @@ typedef struct player_s angle_t drawangle; angle_t old_drawangle; angle_t old_drawangle2; + boolean anglestand; // player's ring count INT16 rings; diff --git a/src/g_demo.c b/src/g_demo.c index 9099adc712635170d14f0ea61bc77aa9808a635c..a0cd0ad4592edc144714db8f59a85aeab4b14292 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -1509,27 +1509,32 @@ void G_BeginRecording(void) pflags_t pflags = 0; if (cv_flipcam.value) { - buf |= 0x01; + buf |= WEAPONPREF_FLIPCAM; pflags |= PF_FLIPCAM; } if (cv_analog[0].value) { - buf |= 0x02; + buf |= WEAPONPREF_ANALOGMODE; pflags |= PF_ANALOGMODE; } if (cv_directionchar[0].value) { - buf |= 0x04; + buf |= WEAPONPREF_DIRECTIONCHAR; pflags |= PF_DIRECTIONCHAR; } if (cv_autobrake.value) { - buf |= 0x08; + buf |= WEAPONPREF_AUTOBRAKE; pflags |= PF_AUTOBRAKE; } if (cv_usegamepad[0].value) - buf |= 0x10; + buf |= WEAPONPREF_USEGAMEPAD; CV_SetValue(&cv_showinputjoy, !!(cv_usegamepad[0].value)); + if (cv_anglestand[0].value) + { + buf |= WEAPONPREF_ANGLESTAND; + player->anglestand = true; + } WRITEUINT8(demo_p,buf); player->pflags = pflags; @@ -1766,6 +1771,7 @@ void G_DoPlayDemo(char *defdemoname) char skin[17],color[MAXCOLORNAME+1],*n,*pdemoname; UINT8 version,subversion,charability,charability2,thrustfactor,accelstart,acceleration,cnamelen; pflags_t pflags; + boolean anglestand; UINT32 randseed, followitem; fixed_t camerascale,shieldscale,actionspd,mindash,maxdash,normalspeed,runspeed,jumpfactor,height,spinheight; char msg[1024]; @@ -1932,15 +1938,16 @@ void G_DoPlayDemo(char *defdemoname) { UINT8 buf = READUINT8(demo_p); pflags = 0; - if (buf & 0x01) + if (buf & WEAPONPREF_FLIPCAM) pflags |= PF_FLIPCAM; - if (buf & 0x02) + if (buf & WEAPONPREF_ANALOGMODE) pflags |= PF_ANALOGMODE; - if (buf & 0x04) + if (buf & WEAPONPREF_DIRECTIONCHAR) pflags |= PF_DIRECTIONCHAR; - if (buf & 0x08) + if (buf & WEAPONPREF_AUTOBRAKE) pflags |= PF_AUTOBRAKE; - CV_SetValue(&cv_showinputjoy, !!(buf & 0x10)); + CV_SetValue(&cv_showinputjoy, !!(buf & WEAPONPREF_USEGAMEPAD)); + anglestand = !!(buf & WEAPONPREF_ANGLESTAND); } // net var data @@ -2022,6 +2029,7 @@ void G_DoPlayDemo(char *defdemoname) players[0].jumpfactor = jumpfactor; players[0].followitem = followitem; players[0].pflags = pflags; + players[0].anglestand = anglestand; demo_start = true; } diff --git a/src/g_game.c b/src/g_game.c index b4a127a73149eb5e7f5cb09b087f291ae775f89e..ae301d6d5eb3f0d27e3264b6d0c69f185cfe1005 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -267,6 +267,8 @@ static void Analog_OnChange(void); static void Analog2_OnChange(void); static void DirectionChar_OnChange(void); static void DirectionChar2_OnChange(void); +static void AngleStand_OnChange(void); +static void AngleStand2_OnChange(void); static void AutoBrake_OnChange(void); static void AutoBrake2_OnChange(void); void SendWeaponPref(void); @@ -374,6 +376,10 @@ consvar_t cv_directionchar[2] = { }; consvar_t cv_autobrake = CVAR_INIT ("autobrake", "On", CV_SAVE|CV_CALL, CV_OnOff, AutoBrake_OnChange); consvar_t cv_autobrake2 = CVAR_INIT ("autobrake2", "On", CV_SAVE|CV_CALL, CV_OnOff, AutoBrake2_OnChange); +consvar_t cv_anglestand[2] = { + CVAR_INIT ("anglestand", "Off", CV_SAVE|CV_CALL, CV_OnOff, AngleStand_OnChange), + CVAR_INIT ("anglestand2", "Off", CV_SAVE|CV_CALL, CV_OnOff, AngleStand2_OnChange), +}; // hi here's some new controls static CV_PossibleValue_t zerotoone_cons_t[] = {{0, "MIN"}, {FRACUNIT, "MAX"}, {0, NULL}}; @@ -1913,6 +1919,16 @@ static void AutoBrake2_OnChange(void) SendWeaponPref2(); } +static void AngleStand_OnChange(void) +{ + SendWeaponPref(); +} + +static void AngleStand2_OnChange(void) +{ + SendWeaponPref2(); +} + static void G_ResetInputs(void) { memset(gamekeydown, 0, sizeof (gamekeydown)); diff --git a/src/g_game.h b/src/g_game.h index e798176af06851822ec7956f88c5917751b7fb61..88408c463083c5386b0a4ecd9073c0bf02d77255 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -68,6 +68,7 @@ typedef enum { #define P_ControlStyle(player) ((((player)->pflags & PF_ANALOGMODE) ? CS_LMAOGALOG : 0) | (((player)->pflags & PF_DIRECTIONCHAR) ? CS_STANDARD : 0)) extern consvar_t cv_autobrake, cv_autobrake2; +extern consvar_t cv_anglestand[2]; extern consvar_t cv_ghost_bestscore, cv_ghost_besttime, cv_ghost_bestrings, cv_ghost_last, cv_ghost_guest; extern consvar_t cv_sideaxis[2], cv_turnaxis[2], cv_moveaxis[2], cv_lookaxis[2], diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 58cfab76cc8958674bddbbf5caebb8a1f6ca1f1d..727538d613fd9400a1dbca238fb3d06101cbde8a 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -380,6 +380,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->jointime); else if (fastcmp(field,"quittime")) lua_pushinteger(L, plr->quittime); + else if (fastcmp(field,"anglestand")) + lua_pushboolean(L, plr->anglestand); #ifdef HWRENDER else if (fastcmp(field,"fovadd")) lua_pushfixed(L, plr->fovadd); @@ -740,6 +742,8 @@ static int player_set(lua_State *L) plr->jointime = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"quittime")) plr->quittime = (tic_t)luaL_checkinteger(L, 3); + else if (fastcmp(field,"anglestand")) + plr->anglestand = lua_toboolean(L, 3); #ifdef HWRENDER else if (fastcmp(field,"fovadd")) plr->fovadd = luaL_checkfixed(L, 3); diff --git a/src/p_saveg.c b/src/p_saveg.c index 42125dae7c332a0689827750e3bc527266644609..3b80f27ec26f87e8854e28917e66bb4331ba4950 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -52,14 +52,15 @@ UINT8 *save_p; // than an UINT16 typedef enum { -// RFLAGPOINT = 0x01, -// BFLAGPOINT = 0x02, - CAPSULE = 0x04, - AWAYVIEW = 0x08, - FIRSTAXIS = 0x10, - SECONDAXIS = 0x20, - FOLLOW = 0x40, - DRONE = 0x80, +// RFLAGPOINT = 0x0001, +// BFLAGPOINT = 0x0002, + CAPSULE = 0x0004, + AWAYVIEW = 0x0008, + FIRSTAXIS = 0x0010, + SECONDAXIS = 0x0020, + FOLLOW = 0x0040, + DRONE = 0x0080, + ANGLESTAND = 0x0100, } player_saveflags; static inline void P_ArchivePlayer(void) @@ -294,6 +295,9 @@ static void P_NetArchivePlayers(void) if (players[i].drone) flags |= DRONE; + if (players[i].anglestand) + flags |= ANGLESTAND; + WRITEINT16(save_p, players[i].lastsidehit); WRITEINT16(save_p, players[i].lastlinehit); @@ -536,6 +540,9 @@ static void P_NetUnArchivePlayers(void) if (flags & DRONE) players[i].drone = (mobj_t *)(size_t)READUINT32(save_p); + if (flags & ANGLESTAND) + players[i].anglestand = true; + players[i].camerascale = READFIXED(save_p); players[i].shieldscale = READFIXED(save_p); diff --git a/src/p_user.c b/src/p_user.c index 4ca4e6c8ad7b5fdc18b036197da5e1bed5a48794..2bbe0896c08ca0dd258f3c9912f2d6d764bfcaee 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -11914,7 +11914,7 @@ void P_PlayerThink(player_t *player) diff = ((player->mo->angle + ((player->pflags & PF_ANALOGMODE) ? 0 : R_PointToAngle2(0, 0, cmd->forwardmove<<FRACBITS, -cmd->sidemove<<FRACBITS))) - player->drawangle); factor = 4; } - else if (player->rmomx || player->rmomy) + else if (player->rmomx || player->rmomy || player->anglestand) diff = factor = 0; else {