From 08d087c6b5421623ebf25227fe50069a5ac15abd Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 20 Feb 2021 23:10:18 +0000 Subject: [PATCH] Acceleration Kickstart, my little hobby project. It's no secret that holding down a button a lot can fuck with your wrists and fingers. It's too late for me to be damageless, but I can at least create an option to reduce further harm. This accessibility feature, when enabled (kickstartaccel and kickstartaccel2/3/4 in the console) behaves with the following properties: * Hold accelerate for 1 second to lock it down. * Press again to release. * Short holds/presses do nothing (good for POSITION). * Continue holding it during the releasing press to re-lock it. * A small triangular UI element is added next to the speedometer sticker, which displays the current state of the acceleration kickstart for visual feedback. (NO SPLITS SUPPORT YET) In addition: * Add PF_ACCELDOWN and PF_BRAKEDOWN, and BT_REALACCELERATE (which ACCELDOWN tracks). Even if this feature never gets merged, BT_REALACCELERATE is required because sneakers and boosters force it on too (extending this is how I implemented it). * Fix the dehacked playerflag list being out of shape. * I replaced some existing flags during development of this branch, so their old uses have been whittled away. --- src/d_netcmd.c | 10 +++++---- src/d_player.h | 47 +++++++++++++++++++------------------- src/d_ticcmd.h | 17 +++++++------- src/dehacked.c | 34 ++++++++-------------------- src/g_demo.c | 16 +++++++++++-- src/g_game.c | 57 ++++++++++++++++++++++++++++++++++++++--------- src/g_game.h | 1 + src/k_hud.c | 38 +++++++++++++++++++++++++++---- src/lua_baselib.c | 12 ---------- src/p_inter.c | 29 ------------------------ src/p_local.h | 1 - src/p_spec.c | 4 ---- src/p_user.c | 30 ++++++++++++++++++++----- 13 files changed, 168 insertions(+), 128 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index ba5560802..7ad6b2727 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -939,6 +939,7 @@ void D_RegisterClientCommands(void) // g_input.c for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) { + CV_RegisterVar(&cv_kickstartaccel[i]); CV_RegisterVar(&cv_turnaxis[i]); CV_RegisterVar(&cv_moveaxis[i]); CV_RegisterVar(&cv_brakeaxis[i]); @@ -1627,6 +1628,8 @@ void SendWeaponPref(UINT8 n) buf[0] = 0; // Player option cvars that need to be synched go HERE + if (cv_kickstartaccel[n].value) + buf[0] |= 1; SendNetXCmdForPlayer(n, XD_WEAPONPREF, buf, 1); } @@ -1635,11 +1638,10 @@ static void Got_WeaponPref(UINT8 **cp,INT32 playernum) { UINT8 prefs = READUINT8(*cp); - (void)prefs; - (void)playernum; - - //players[playernum].pflags &= ~(PF_FLIPCAM); // Player option cvars that need to be synched go HERE + players[playernum].pflags &= ~(PF_KICKSTARTACCEL); + if (prefs & 1) + players[playernum].pflags |= PF_KICKSTARTACCEL; } static void Got_PowerLevel(UINT8 **cp,INT32 playernum) diff --git a/src/d_player.h b/src/d_player.h index f2883eaa2..0016a2cac 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -67,48 +67,45 @@ typedef enum // True if button down last tic. PF_ATTACKDOWN = 1<<7, - PF_SPINDOWN = 1<<8, - PF_JUMPDOWN = 1<<9, - PF_WPNDOWN = 1<<10, + PF_ACCELDOWN = 1<<8, + PF_BRAKEDOWN = 1<<9, + PF_WPNDOWN = 1<<10, // unused // Unmoving states PF_STASIS = 1<<11, // Player is not allowed to move - PF_JUMPSTASIS = 1<<12, // and that includes jumping. - PF_FULLSTASIS = PF_STASIS|PF_JUMPSTASIS, + PF_JUMPSTASIS = 1<<12, // unused // SRB2Kart: Spectator that wants to join PF_WANTSTOJOIN = 1<<13, // Character action status - PF_STARTJUMP = 1<<14, - PF_JUMPED = 1<<15, - PF_NOJUMPDAMAGE = 1<<16, - - PF_SPINNING = 1<<17, - PF_STARTDASH = 1<<18, - - PF_THOKKED = 1<<19, - PF_SHIELDABILITY = 1<<20, - PF_GLIDING = 1<<21, - PF_BOUNCING = 1<<22, + PF_STARTJUMP = 1<<14, // unused + PF_JUMPED = 1<<15, // unused + PF_NOJUMPDAMAGE = 1<<16, // unused + PF_SPINNING = 1<<17, // unused + PF_STARTDASH = 1<<18, // unused + PF_THOKKED = 1<<19, // unused + PF_SHIELDABILITY = 1<<20, // unused + PF_GLIDING = 1<<21, // unused + PF_BOUNCING = 1<<22, // unused // Sliding (usually in water) like Labyrinth/Oil Ocean PF_SLIDING = 1<<23, // NiGHTS stuff - PF_TRANSFERTOCLOSEST = 1<<24, - PF_DRILLING = 1<<25, + PF_TRANSFERTOCLOSEST = 1<<24, // unused + PF_DRILLING = 1<<25, // unused // Gametype-specific stuff - PF_GAMETYPEOVER = 1<<26, // Race time over, or H&S out-of-game - PF_TAGIT = 1<<27, // The player is it! For Tag Mode + PF_GAMETYPEOVER = 1<<26, // Race time over + PF_TAGIT = 1<<27, // unused /*** misc ***/ - PF_FORCESTRAFE = 1<<28, // Turning inputs are translated into strafing inputs - PF_CANCARRY = 1<<29, // Can carry another player? + PF_KICKSTARTACCEL = 1<<28, // Accessibility feature - is accelerate in kickstart mode? + PF_CANCARRY = 1<<29, // unused PF_HITFINISHLINE = 1<<30, // Already hit the finish line this tic - // up to 1<<31 is free + // up to 1<<31 is free, but try to hit unused stuff first } pflags_t; typedef enum @@ -298,6 +295,9 @@ typedef enum #undef KSPIN_TYPE } kartspinoutflags_t; +// for k_kickstartaccel +#define ACCEL_KICKSTART 35 + //{ SRB2kart - kartstuff typedef enum { @@ -398,6 +398,7 @@ typedef enum k_springcolor, // Color of spring stars k_killfield, // How long have you been in the kill field, stay in too long and lose a bumper k_wrongway, // Display WRONG WAY on screen + k_kickstartaccel, // how long you've been holding accel for, for PF_KICKSTARTACCEL NUMKARTSTUFF } kartstufftype_t; diff --git a/src/d_ticcmd.h b/src/d_ticcmd.h index 17c41cfbf..6f57fe784 100644 --- a/src/d_ticcmd.h +++ b/src/d_ticcmd.h @@ -26,17 +26,18 @@ // Button/action code definitions. typedef enum { - BT_ACCELERATE = 1, // Accelerate - BT_DRIFT = 1<<2, // Drift (direction is cmd->turning) - BT_BRAKE = 1<<3, // Brake - BT_ATTACK = 1<<4, // Use Item - BT_FORWARD = 1<<5, // Aim Item Forward - BT_BACKWARD = 1<<6, // Aim Item Backward - BT_LOOKBACK = 1<<7, // Look Backward + BT_ACCELERATE = 1, // Accelerate + BT_DRIFT = 1<<2, // Drift (direction is cmd->turning) + BT_BRAKE = 1<<3, // Brake + BT_ATTACK = 1<<4, // Use Item + BT_FORWARD = 1<<5, // Aim Item Forward + BT_BACKWARD = 1<<6, // Aim Item Backward + BT_LOOKBACK = 1<<7, // Look Backward + BT_REALACCELERATE = 1<<8, // Accelerate but not influenced by boosting or kickstart BT_EBRAKEMASK = (BT_ACCELERATE|BT_BRAKE), - // free: 1<<8 to 1<<12 + // free: 1<<9 to 1<<12 // Lua garbage BT_CUSTOM1 = 1<<13, diff --git a/src/dehacked.c b/src/dehacked.c index 5d77e61dc..8e3faba02 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -10645,17 +10645,13 @@ static const char *const PLAYERFLAG_LIST[] = { // True if button down last tic. "ATTACKDOWN", - "SPINDOWN", - "JUMPDOWN", + "ACCELDOWN", + "BRAKEDOWN", "WPNDOWN", // Unmoving states "STASIS", // Player is not allowed to move "JUMPSTASIS", // and that includes jumping. - // (we don't include FULLSTASIS here I guess because it's just those two together...?) - - // Did you get a time-over? - "TIMEOVER", // SRB2Kart: spectator that wants to join "WANTSTOJOIN", @@ -10664,10 +10660,8 @@ static const char *const PLAYERFLAG_LIST[] = { "STARTJUMP", "JUMPED", "NOJUMPDAMAGE", - "SPINNING", "STARTDASH", - "THOKKED", "SHIELDABILITY", "GLIDING", @@ -10681,13 +10675,13 @@ static const char *const PLAYERFLAG_LIST[] = { "DRILLING", // Gametype-specific stuff - "GAMETYPEOVER", // Race time over, or H&S out-of-game - "TAGIT", // The player is it! For Tag Mode + "GAMETYPEOVER", // Race time over + "TAGIT", /*** misc ***/ - "FORCESTRAFE", // Translate turn inputs into strafe inputs + "FORCESTRAFE", // Accessibility feature - is accelerate in kickstart mode? + "CANCARRY", "HITFINISHLINE", // Already hit the finish line this tic - "FINISHED", NULL // stop loop here. }; @@ -11054,7 +11048,8 @@ static const char *const KARTSTUFF_LIST[] = { "SPRINGSTARS", "SPRINGCOLOR", "KILLFIELD", - "WRONGWAY" + "WRONGWAY", + "KICKSTARTACCEL" }; static const char *const KARTHUD_LIST[] = { @@ -11655,6 +11650,7 @@ struct { {"BT_ATTACK",BT_ATTACK}, {"BT_FORWARD",BT_FORWARD}, {"BT_BACKWARD",BT_BACKWARD}, + {"BT_REALACCELERATE",BT_REALACCELERATE}, {"BT_CUSTOM1",BT_CUSTOM1}, // Lua customizable {"BT_CUSTOM2",BT_CUSTOM2}, // Lua customizable {"BT_CUSTOM3",BT_CUSTOM3}, // Lua customizable @@ -12183,8 +12179,6 @@ static fixed_t find_const(const char **rword) free(word); return (1<spectator ? DEMO_SPECTATOR : 0)); + i = p; + if (player->pflags & PF_KICKSTARTACCEL) + i |= DEMO_KICKSTART; + if (player->spectator) + i |= DEMO_SPECTATOR; + WRITEUINT8(demo_p, i); // Name memset(name, 0, 16); @@ -2903,6 +2909,12 @@ void G_DoPlayDemo(char *defdemoname) while (p != 0xFF) { + players[p].pflags &= ~PF_KICKSTARTACCEL; + if (p & DEMO_KICKSTART) + { + players[p].pflags |= PF_KICKSTARTACCEL; + p &= ~DEMO_KICKSTART; + } spectator = false; if (p & DEMO_SPECTATOR) { @@ -3194,7 +3206,7 @@ void G_AddGhost(char *defdemoname) return; } - if (READUINT8(p) != 0) + if ((READUINT8(p) & ~DEMO_KICKSTART) != 0) { CONS_Alert(CONS_NOTICE, M_GetText("Failed to add ghost %s: Invalid player slot.\n"), pdemoname); Z_Free(pdemoname); diff --git a/src/g_game.c b/src/g_game.c index c6c831b76..8e076c2c4 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -342,10 +342,11 @@ INT16 prevmap, nextmap; static UINT8 *savebuffer; -void SendWeaponPref(void); -void SendWeaponPref2(void); -void SendWeaponPref3(void); -void SendWeaponPref4(void); +static void kickstartaccel_OnChange(void); +static void kickstartaccel2_OnChange(void); +static void kickstartaccel3_OnChange(void); +static void kickstartaccel4_OnChange(void); +void SendWeaponPref(UINT8 n); static CV_PossibleValue_t joyaxis_cons_t[] = {{0, "None"}, {1, "X-Axis"}, {2, "Y-Axis"}, {-1, "X-Axis-"}, {-2, "Y-Axis-"}, @@ -405,6 +406,13 @@ consvar_t cv_resetspecialmusic = CVAR_INIT ("resetspecialmusic", "Yes", CV_SAVE, consvar_t cv_resume = CVAR_INIT ("resume", "Yes", CV_SAVE, CV_YesNo, NULL); +consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS] = { + CVAR_INIT ("kickstartaccel", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel_OnChange), + CVAR_INIT ("kickstartaccel2", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel2_OnChange), + CVAR_INIT ("kickstartaccel3", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel3_OnChange), + CVAR_INIT ("kickstartaccel4", "Off", CV_SAVE|CV_CALL, CV_OnOff, kickstartaccel4_OnChange) +}; + consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS] = { CVAR_INIT ("joyaxis_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL), CVAR_INIT ("joyaxis2_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL), @@ -1003,10 +1011,15 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { // forward with key or button // SRB2kart - we use an accel/brake instead of forward/backward. axis = PlayerJoyAxis(ssplayer, AXISMOVE); - if (PlayerInputDown(ssplayer, gc_accelerate) || (gamepadjoystickmove && axis > 0) || player->kartstuff[k_sneakertimer]) + if (PlayerInputDown(ssplayer, gc_accelerate) || (gamepadjoystickmove && axis > 0)) + { + cmd->buttons |= (BT_ACCELERATE|BT_REALACCELERATE); + forward = MAXPLMOVE; // 50 + } + else if ((gamestate == GS_LEVEL) && (player->kartstuff[k_sneakertimer] || (player->kartstuff[k_kickstartaccel] >= ACCEL_KICKSTART))) { cmd->buttons |= BT_ACCELERATE; - forward = MAXPLMOVE; // 50 + forward = MAXPLMOVE; } else if (analogjoystickmove && axis > 0) { @@ -1184,6 +1197,26 @@ ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n) return dest; } +static void kickstartaccel_OnChange(void) +{ + SendWeaponPref(0); +} + +static void kickstartaccel2_OnChange(void) +{ + SendWeaponPref(1); +} + +static void kickstartaccel3_OnChange(void) +{ + SendWeaponPref(2); +} + +static void kickstartaccel4_OnChange(void) +{ + SendWeaponPref(3); +} + // // G_DoLoadLevel // @@ -2108,6 +2141,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) boolean eliminated; UINT16 nocontrol; INT32 khudfault; + INT32 kickstartaccel; score = players[player].score; marescore = players[player].marescore; @@ -2123,7 +2157,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) splitscreenindex = players[player].splitscreenindex; spectator = players[player].spectator; - pflags = (players[player].pflags & (PF_WANTSTOJOIN|PF_GAMETYPEOVER|PF_FAULT)); + pflags = (players[player].pflags & (PF_WANTSTOJOIN|PF_GAMETYPEOVER|PF_FAULT|PF_KICKSTARTACCEL)); playerangleturn = players[player].angleturn; // As long as we're not in multiplayer, carry over cheatcodes from map to map @@ -2177,6 +2211,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) spheres = 0; eliminated = false; wanted = 0; + kickstartaccel = 0; } else { @@ -2205,6 +2240,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) spheres = players[player].spheres; eliminated = players[player].eliminated; wanted = players[player].kartstuff[k_wanted]; + kickstartaccel = players[player].kartstuff[k_kickstartaccel]; } if (!betweenmaps) @@ -2278,6 +2314,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) p->kartstuff[k_lastdraft] = -1; p->karthud[khud_fault] = khudfault; p->powers[pw_nocontrol] = nocontrol; + players[player].kartstuff[k_kickstartaccel] = kickstartaccel; memcpy(&p->respawn, &respawn, sizeof (p->respawn)); @@ -2292,9 +2329,9 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) // Don't do anything immediately - p->pflags |= PF_SPINDOWN; + p->pflags |= PF_BRAKEDOWN; p->pflags |= PF_ATTACKDOWN; - p->pflags |= PF_JUMPDOWN; + p->pflags |= PF_ACCELDOWN; p->playerstate = PST_LIVE; p->panim = PA_STILL; // standing animation @@ -4446,7 +4483,7 @@ void G_InitNew(UINT8 pencoremode, const char *mapname, boolean resetplayer, bool memset(&players[i].respawn, 0, sizeof (players[i].respawn)); // The latter two should clear by themselves, but just in case - players[i].pflags &= ~(PF_GAMETYPEOVER|PF_FULLSTASIS|PF_FAULT); + players[i].pflags &= ~(PF_GAMETYPEOVER|PF_STASIS|PF_FAULT); // Clear cheatcodes too, just in case. players[i].pflags &= ~(PF_GODMODE|PF_NOCLIP|PF_INVIS); diff --git a/src/g_game.h b/src/g_game.h index 89156b82f..28321adc5 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -57,6 +57,7 @@ extern consvar_t cv_pauseifunfocused; extern consvar_t cv_invertmouse; +extern consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_turnaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_moveaxis[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_brakeaxis[MAXSPLITSCREENPLAYERS]; diff --git a/src/k_hud.c b/src/k_hud.c index 525f3eda3..9ab832c7b 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -2249,6 +2249,36 @@ static void K_drawKartSpeedometer(void) V_DrawScaledPatch(LAPS_X+13, LAPS_Y-25 + battleoffset, V_HUDTRANS|V_SLIDEIN|splitflags, kp_facenum[numbers[1]]); V_DrawScaledPatch(LAPS_X+19, LAPS_Y-25 + battleoffset, V_HUDTRANS|V_SLIDEIN|splitflags, kp_facenum[numbers[2]]); V_DrawScaledPatch(LAPS_X+29, LAPS_Y-25 + battleoffset, V_HUDTRANS|V_SLIDEIN|splitflags, kp_speedometerlabel[labeln]); + + if (stplyr->pflags & PF_KICKSTARTACCEL) + { + numbers[0] = 7-(stplyr->kartstuff[k_kickstartaccel]*7)/ACCEL_KICKSTART; + numbers[1] = 7; + numbers[2] = 0; + + V_DrawFill(LAPS_X+61, LAPS_Y-26, 2, 1, 31|V_SLIDEIN|splitflags); + V_DrawFill(LAPS_X+61-4, (LAPS_Y-26)+8, 10, 1, 31|V_SLIDEIN|splitflags); + + while (numbers[1]--) + { + numbers[2] = (numbers[1]/2)+1; + V_DrawFill(LAPS_X+61-numbers[2], (LAPS_Y-25)+numbers[1], 2+(numbers[2]*2), 1, 31|V_SLIDEIN|splitflags); + if (numbers[0]) + { + if (numbers[1] < numbers[0]) + labeln = 23; + else if (numbers[1] == numbers[0]) + labeln = 3; + else + labeln = 5 + (numbers[1]-numbers[0])*2; + } + else if ((leveltime % 7) == numbers[1]) + labeln = 0; + else + labeln = 3; + V_DrawFill(LAPS_X+62-numbers[2], (LAPS_Y-25)+numbers[1], (numbers[2]*2), 1, labeln|V_SLIDEIN|splitflags); + } + } } static void K_drawBlueSphereMeter(void) @@ -3770,10 +3800,10 @@ static void K_drawInput(void) V_DrawFill(x+(xoffs), y+offs, BUTTW-1, BUTTH, col);\ V_DrawFixedPatch((x+1+(xoffs))<powers[pw_shield] & SH_FORCE) - { // Multi-hit - if (player->powers[pw_shield] & SH_FORCEHP) - player->powers[pw_shield]--; - else - player->powers[pw_shield] &= SH_STACK; - } - else if (player->powers[pw_shield] & SH_NOSTACK) - { // First layer shields - if ((player->powers[pw_shield] & SH_NOSTACK) == SH_ARMAGEDDON) // Give them what's coming to them! - { - player->pflags |= PF_JUMPDOWN; - } - else - player->powers[pw_shield] &= SH_STACK; - } - else - { // Second layer shields - if (((player->powers[pw_shield] & SH_STACK) == SH_FIREFLOWER) && !player->powers[pw_super]) - { - player->mo->color = player->skincolor; - G_GhostAddColor((INT32) (player - players), GHC_NORMAL); - } - player->powers[pw_shield] = SH_NONE; - } -} - /** Damages an object, which may or may not be a player. * For melee attacks, source and inflictor are the same. * diff --git a/src/p_local.h b/src/p_local.h index 5fc1ab956..4182d0658 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -486,7 +486,6 @@ typedef struct BasicFF_s void P_ForceFeed(const player_t *player, INT32 attack, INT32 fade, tic_t duration, INT32 period); void P_ForceConstant(const BasicFF_t *FFInfo); void P_RampConstant(const BasicFF_t *FFInfo, INT32 Start, INT32 End); -void P_RemoveShield(player_t *player); void P_SpecialStageDamage(player_t *player, mobj_t *inflictor, mobj_t *source); boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype); diff --git a/src/p_spec.c b/src/p_spec.c index d0a8f085c..98ae6faf9 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -8763,12 +8763,8 @@ void T_Pusher(pusher_t *p) { if (p->slider && thing->player) { - pflags_t jumped = (thing->player->pflags & (PF_JUMPED|PF_NOJUMPDAMAGE)); P_ResetPlayer (thing->player); - if (jumped) - thing->player->pflags |= jumped; - thing->player->pflags |= PF_SLIDING; thing->angle = R_PointToAngle2 (0, 0, xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR)); diff --git a/src/p_user.c b/src/p_user.c index 4d2705180..491fec1f2 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4324,6 +4324,19 @@ void P_PlayerThink(player_t *player) player->kartstuff[k_throwdir] = 0; } + // Accessibility - kickstart your acceleration + if (!(player->pflags & PF_KICKSTARTACCEL)) + player->kartstuff[k_kickstartaccel] = 0; + else if (cmd->buttons & BT_REALACCELERATE) + { + if (!(player->pflags & PF_ACCELDOWN)) + player->kartstuff[k_kickstartaccel] = 0; + else if (player->kartstuff[k_kickstartaccel] < ACCEL_KICKSTART) + player->kartstuff[k_kickstartaccel]++; + } + else if (player->kartstuff[k_kickstartaccel] < ACCEL_KICKSTART) + player->kartstuff[k_kickstartaccel] = 0; + #ifdef PARANOIA if (player->playerstate == PST_REBORN) I_Error("player %s is in PST_REBORN\n", sizeu1(playeri)); @@ -4506,10 +4519,10 @@ void P_PlayerThink(player_t *player) player->mo->movefactor = FRACUNIT; // We're not going to do any more with this, so let's change it back for the next frame. - // Unset statis flags after moving. + // Unset statis flag after moving. // In other words, if you manually set stasis via code, // it lasts for one tic. - player->pflags &= ~PF_FULLSTASIS; + player->pflags &= ~PF_STASIS; if (player->onconveyor == 1) player->onconveyor = 3; @@ -4555,11 +4568,16 @@ void P_PlayerThink(player_t *player) } #endif - // check for use - if (cmd->buttons & BT_BRAKE) - player->pflags |= PF_SPINDOWN; + // check for buttons + if (cmd->buttons & BT_REALACCELERATE) + player->pflags |= PF_ACCELDOWN; else - player->pflags &= ~PF_SPINDOWN; + player->pflags &= ~PF_ACCELDOWN; + + if (cmd->buttons & BT_BRAKE) + player->pflags |= PF_BRAKEDOWN; + else + player->pflags &= ~PF_BRAKEDOWN; // Counters, time dependent power ups. // Time Bonus & Ring Bonus count settings