From 08d087c6b5421623ebf25227fe50069a5ac15abd Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 20 Feb 2021 23:10:18 +0000 Subject: [PATCH 1/9] 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 From b49e44bd971a4e2561bbd945f3a995776ddc5052 Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 21 Feb 2021 15:58:25 +0000 Subject: [PATCH 2/9] Bots will now pretend their imaginary accelerate buttons are real, just so PF_ACCELDOWN is properly tracked. --- src/k_bot.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_bot.c b/src/k_bot.c index 32270b419..c035b2864 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -990,7 +990,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) rad = playerwidth; } - cmd->buttons |= BT_ACCELERATE; + cmd->buttons |= (BT_ACCELERATE|BT_REALACCELERATE); // Full speed ahead! cmd->forwardmove = MAXPLMOVE; @@ -1067,7 +1067,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) // where we figure out what the shape of the track looks like. UINT16 oldButtons = cmd->buttons; - cmd->buttons &= ~(BT_ACCELERATE|BT_BRAKE); + cmd->buttons &= ~(BT_ACCELERATE|BT_REALACCELERATE|BT_BRAKE); if (oldButtons & BT_ACCELERATE) { @@ -1076,7 +1076,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) if (oldButtons & BT_BRAKE) { - cmd->buttons |= BT_ACCELERATE; + cmd->buttons |= (BT_ACCELERATE|BT_REALACCELERATE); } cmd->forwardmove = -cmd->forwardmove; From f71741f557dc75bcb4f3ae3a7c619764b2673e83 Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 21 Feb 2021 16:58:37 +0000 Subject: [PATCH 3/9] MT_BRAKEDRIFT appears to be broken, and self-removing if BT_ACCELERATE ISN'T there, as opposed to if it is as the comment suggests. Fix that here. --- src/p_mobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 25a505821..94eef3530 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6839,7 +6839,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if ((!mobj->target || !mobj->target->health || !mobj->target->player || !P_IsObjectOnGround(mobj->target)) || !mobj->target->player->kartstuff[k_drift] || !mobj->target->player->kartstuff[k_brakedrift] || !((mobj->target->player->cmd.buttons & BT_BRAKE) - || !(mobj->target->player->cmd.buttons & BT_ACCELERATE))) // Letting go of accel functions about the same as brake-drifting + || (mobj->target->player->cmd.buttons & BT_ACCELERATE))) // Letting go of accel functions about the same as brake-drifting { P_RemoveMobj(mobj); return false; From d039b14aa42e1e3dd7938d465f8d352f8085d4d2 Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 21 Feb 2021 18:08:04 +0000 Subject: [PATCH 4/9] Make kickstartaccel a UINT8 instead of an INT32 kartstuff entry. --- src/d_player.h | 9 +++++---- src/dehacked.c | 3 +-- src/g_game.c | 6 +++--- src/k_hud.c | 2 +- src/p_saveg.c | 4 ++++ src/p_user.c | 12 ++++++------ 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 0016a2cac..b055f6d9f 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -295,9 +295,6 @@ typedef enum #undef KSPIN_TYPE } kartspinoutflags_t; -// for k_kickstartaccel -#define ACCEL_KICKSTART 35 - //{ SRB2kart - kartstuff typedef enum { @@ -398,7 +395,6 @@ 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; @@ -451,6 +447,9 @@ typedef enum //} +// for kickstartaccel +#define ACCEL_KICKSTART 35 + // player_t struct for all respawn variables typedef struct respawnvars_s { @@ -701,6 +700,8 @@ typedef struct player_s UINT8 typing_timer; // Counts down while keystrokes are not emitted UINT8 typing_duration; // How long since resumed timer + UINT8 kickstartaccel; + #ifdef HWRENDER fixed_t fovadd; // adjust FOV for hw rendering #endif diff --git a/src/dehacked.c b/src/dehacked.c index 8e3faba02..73f681fe4 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -11048,8 +11048,7 @@ static const char *const KARTSTUFF_LIST[] = { "SPRINGSTARS", "SPRINGCOLOR", "KILLFIELD", - "WRONGWAY", - "KICKSTARTACCEL" + "WRONGWAY" }; static const char *const KARTHUD_LIST[] = { diff --git a/src/g_game.c b/src/g_game.c index 8e076c2c4..93cbd0132 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1016,7 +1016,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) cmd->buttons |= (BT_ACCELERATE|BT_REALACCELERATE); forward = MAXPLMOVE; // 50 } - else if ((gamestate == GS_LEVEL) && (player->kartstuff[k_sneakertimer] || (player->kartstuff[k_kickstartaccel] >= ACCEL_KICKSTART))) + else if ((gamestate == GS_LEVEL) && (player->kartstuff[k_sneakertimer] || (player->kickstartaccel >= ACCEL_KICKSTART))) { cmd->buttons |= BT_ACCELERATE; forward = MAXPLMOVE; @@ -2240,7 +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]; + kickstartaccel = players[player].kickstartaccel; } if (!betweenmaps) @@ -2314,7 +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; + p->kickstartaccel = kickstartaccel; memcpy(&p->respawn, &respawn, sizeof (p->respawn)); diff --git a/src/k_hud.c b/src/k_hud.c index 9ab832c7b..f325d8135 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -2252,7 +2252,7 @@ static void K_drawKartSpeedometer(void) if (stplyr->pflags & PF_KICKSTARTACCEL) { - numbers[0] = 7-(stplyr->kartstuff[k_kickstartaccel]*7)/ACCEL_KICKSTART; + numbers[0] = 7-(stplyr->kickstartaccel*7)/ACCEL_KICKSTART; numbers[1] = 7; numbers[2] = 0; diff --git a/src/p_saveg.c b/src/p_saveg.c index 367f21439..8f5a1c709 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -280,6 +280,8 @@ static void P_NetArchivePlayers(void) WRITEUINT8(save_p, players[i].typing_timer); WRITEUINT8(save_p, players[i].typing_duration); + WRITEUINT8(save_p, players[i].kickstartaccel); + // respawnvars_t WRITEUINT8(save_p, players[i].respawn.state); WRITEUINT32(save_p, K_GetWaypointHeapIndex(players[i].respawn.wp)); @@ -489,6 +491,8 @@ static void P_NetUnArchivePlayers(void) players[i].typing_timer = READUINT8(save_p); players[i].typing_duration = READUINT8(save_p); + players[i].kickstartaccel = READUINT8(save_p); + // respawnvars_t players[i].respawn.state = READUINT8(save_p); players[i].respawn.wp = (waypoint_t *)(size_t)READUINT32(save_p); diff --git a/src/p_user.c b/src/p_user.c index 491fec1f2..a010e85b3 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4326,16 +4326,16 @@ void P_PlayerThink(player_t *player) // Accessibility - kickstart your acceleration if (!(player->pflags & PF_KICKSTARTACCEL)) - player->kartstuff[k_kickstartaccel] = 0; + player->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]++; + player->kickstartaccel = 0; + else if (player->kickstartaccel < ACCEL_KICKSTART) + player->kickstartaccel++; } - else if (player->kartstuff[k_kickstartaccel] < ACCEL_KICKSTART) - player->kartstuff[k_kickstartaccel] = 0; + else if (player->kickstartaccel < ACCEL_KICKSTART) + player->kickstartaccel = 0; #ifdef PARANOIA if (player->playerstate == PST_REBORN) From 56d0a6e43d5fd7ed4677846850d4ce423cfffe8f Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 21 Feb 2021 18:10:43 +0000 Subject: [PATCH 5/9] Bunch of changes to how the Kickstart Acceleration icon is rendered. * Display even if the player (or Lua) has disabled the speedometer. * Support splits all the way up to 4p. * Abstract out to a function that could hypothetically display more accessibility-related icons down the line. --- src/k_hud.c | 97 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 32 deletions(-) diff --git a/src/k_hud.c b/src/k_hud.c index f325d8135..eac4f291d 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -2200,6 +2200,64 @@ static void K_drawKartLapsAndRings(void) #undef RINGANIM_FLIPFRAME +static void K_drawKartAccessibilityIcons(INT32 fx) +{ + INT32 fy = LAPS_Y; + UINT8 col = 0, i, wid, fil; + INT32 splitflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_SPLITSCREEN; + //INT32 step = 1; -- if there's ever more than one accessibility icon + + fx += LAPS_X; + + if (r_splitscreen < 2) // adjust to speedometer height + { + fy -= 25; + if (gametype == GT_BATTLE) + fy -= 4; + } + else + { + fx += 44; + if (!(stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]])) // If we are not P1 or P3... + { + splitflags ^= (V_SNAPTOLEFT|V_SNAPTORIGHT); + fx = (BASEVIDWIDTH/2) - (fx + 10); + //step = -step; + } + } + + if (stplyr->pflags & PF_KICKSTARTACCEL) // just KICKSTARTACCEL right now, maybe more later + { + fil = 7-(stplyr->kickstartaccel*7)/ACCEL_KICKSTART; + i = 7; + + V_DrawFill(fx+4, fy-1, 2, 1, 31|V_SLIDEIN|splitflags); + V_DrawFill(fx, (fy-1)+8, 10, 1, 31|V_SLIDEIN|splitflags); + + while (i--) + { + wid = (i/2)+1; + V_DrawFill(fx+4-wid, fy+i, 2+(wid*2), 1, 31|V_SLIDEIN|splitflags); + if (fil) + { + if (i < fil) + col = 23; + else if (i == fil) + col = 3; + else + col = 5 + (i-fil)*2; + } + else if ((leveltime % 7) == i) + col = 0; + else + col = 3; + V_DrawFill(fx+5-wid, fy+i, (wid*2), 1, col|V_SLIDEIN|splitflags); + } + + //fx += step*12; + } +} + static void K_drawKartSpeedometer(void) { static fixed_t convSpeed; @@ -2250,35 +2308,7 @@ static void K_drawKartSpeedometer(void) 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->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); - } - } + K_drawKartAccessibilityIcons(57); } static void K_drawBlueSphereMeter(void) @@ -4205,10 +4235,13 @@ void K_drawKartHUD(void) if (!stplyr->spectator && !demo.freecam) // Bottom of the screen elements, don't need in spectate mode { // Draw the speedometer - if (cv_kartspeedometer.value && !r_splitscreen) + if (cv_kartspeedometer.value && !r_splitscreen && (LUA_HudEnabled(hud_speedometer))) { - if (LUA_HudEnabled(hud_speedometer)) - K_drawKartSpeedometer(); + K_drawKartSpeedometer(); + } + else + { + K_drawKartAccessibilityIcons(0); } if (demo.title) // Draw title logo instead in demo.titles From 75b53bbb5282142669e18399b69109f51cfd148e Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 21 Feb 2021 18:20:44 +0000 Subject: [PATCH 6/9] Don't delete your kickstartaccel if you cross the finish line and the bot driver takes over. --- src/p_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index a010e85b3..640400b48 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4329,7 +4329,7 @@ void P_PlayerThink(player_t *player) player->kickstartaccel = 0; else if (cmd->buttons & BT_REALACCELERATE) { - if (!(player->pflags & PF_ACCELDOWN)) + if (!player->exiting && !(player->pflags & PF_ACCELDOWN)) player->kickstartaccel = 0; else if (player->kickstartaccel < ACCEL_KICKSTART) player->kickstartaccel++; From cce4165f359c63bab2ca5ed6102b9be23822075e Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 21 Feb 2021 21:37:56 +0000 Subject: [PATCH 7/9] After discussing with Oni, adjust the coordinates for the accel kickstart indicator. --- src/k_hud.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/k_hud.c b/src/k_hud.c index eac4f291d..1aa0c97f8 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -2202,7 +2202,7 @@ static void K_drawKartLapsAndRings(void) static void K_drawKartAccessibilityIcons(INT32 fx) { - INT32 fy = LAPS_Y; + INT32 fy = LAPS_Y-25; UINT8 col = 0, i, wid, fil; INT32 splitflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_SPLITSCREEN; //INT32 step = 1; -- if there's ever more than one accessibility icon @@ -2211,13 +2211,12 @@ static void K_drawKartAccessibilityIcons(INT32 fx) if (r_splitscreen < 2) // adjust to speedometer height { - fy -= 25; if (gametype == GT_BATTLE) fy -= 4; } else { - fx += 44; + fy += 4; if (!(stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]])) // If we are not P1 or P3... { splitflags ^= (V_SNAPTOLEFT|V_SNAPTORIGHT); @@ -2308,7 +2307,7 @@ static void K_drawKartSpeedometer(void) 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]); - K_drawKartAccessibilityIcons(57); + K_drawKartAccessibilityIcons(56); } static void K_drawBlueSphereMeter(void) @@ -4234,16 +4233,6 @@ void K_drawKartHUD(void) if (!stplyr->spectator && !demo.freecam) // Bottom of the screen elements, don't need in spectate mode { - // Draw the speedometer - if (cv_kartspeedometer.value && !r_splitscreen && (LUA_HudEnabled(hud_speedometer))) - { - K_drawKartSpeedometer(); - } - else - { - K_drawKartAccessibilityIcons(0); - } - if (demo.title) // Draw title logo instead in demo.titles { INT32 x = BASEVIDWIDTH - 32, y = 128, offs; @@ -4294,6 +4283,16 @@ void K_drawKartHUD(void) K_drawKartBumpersOrKarma(); } + // Draw the speedometer and/or accessibility icons + if (cv_kartspeedometer.value && !r_splitscreen && (LUA_HudEnabled(hud_speedometer))) + { + K_drawKartSpeedometer(); + } + else + { + K_drawKartAccessibilityIcons((r_splitscreen > 1) ? 0 : 8); + } + if (gametyperules & GTR_SPHERES) { K_drawBlueSphereMeter(); From a43a762b466c6da81d4c66d3aa70999c3b9b496e Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 22 Feb 2021 12:21:48 +0000 Subject: [PATCH 8/9] Instead of hacking ticcmd generation, add/modify helper functions acting as intermediaries that add the necessary changes. * Introducing K_GetKartButtons(player_t), for adding false presses to. * K_GetForwardMove(player_t) takes kickstarting into account, and is now applied to engine sound generation too. * BT_REALACCELERATE has been deleted. --- src/d_ticcmd.h | 1 - src/dehacked.c | 1 - src/g_game.c | 7 +----- src/k_bot.c | 6 ++--- src/k_hud.c | 8 +++---- src/k_kart.c | 60 +++++++++++++++++++++++++++++++++---------------- src/k_kart.h | 2 ++ src/k_respawn.c | 6 ++--- src/p_mobj.c | 2 +- src/p_user.c | 4 ++-- 10 files changed, 57 insertions(+), 40 deletions(-) diff --git a/src/d_ticcmd.h b/src/d_ticcmd.h index 6f57fe784..226c8f4d8 100644 --- a/src/d_ticcmd.h +++ b/src/d_ticcmd.h @@ -33,7 +33,6 @@ typedef enum 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), diff --git a/src/dehacked.c b/src/dehacked.c index 73f681fe4..fb3608849 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -11649,7 +11649,6 @@ 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 diff --git a/src/g_game.c b/src/g_game.c index 93cbd0132..9a766dc42 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1012,14 +1012,9 @@ 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)) - { - cmd->buttons |= (BT_ACCELERATE|BT_REALACCELERATE); - forward = MAXPLMOVE; // 50 - } - else if ((gamestate == GS_LEVEL) && (player->kartstuff[k_sneakertimer] || (player->kickstartaccel >= ACCEL_KICKSTART))) { cmd->buttons |= BT_ACCELERATE; - forward = MAXPLMOVE; + forward = MAXPLMOVE; // 50 } else if (analogjoystickmove && axis > 0) { diff --git a/src/k_bot.c b/src/k_bot.c index c035b2864..32270b419 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -990,7 +990,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) rad = playerwidth; } - cmd->buttons |= (BT_ACCELERATE|BT_REALACCELERATE); + cmd->buttons |= BT_ACCELERATE; // Full speed ahead! cmd->forwardmove = MAXPLMOVE; @@ -1067,7 +1067,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) // where we figure out what the shape of the track looks like. UINT16 oldButtons = cmd->buttons; - cmd->buttons &= ~(BT_ACCELERATE|BT_REALACCELERATE|BT_BRAKE); + cmd->buttons &= ~(BT_ACCELERATE|BT_BRAKE); if (oldButtons & BT_ACCELERATE) { @@ -1076,7 +1076,7 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) if (oldButtons & BT_BRAKE) { - cmd->buttons |= (BT_ACCELERATE|BT_REALACCELERATE); + cmd->buttons |= BT_ACCELERATE; } cmd->forwardmove = -cmd->forwardmove; diff --git a/src/k_hud.c b/src/k_hud.c index 1aa0c97f8..e72698cf8 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -3829,10 +3829,10 @@ static void K_drawInput(void) V_DrawFill(x+(xoffs), y+offs, BUTTW-1, BUTTH, col);\ V_DrawFixedPatch((x+1+(xoffs))<mo); - ticcmd_t *cmd = &player->cmd; - const boolean spinningwheels = (((cmd->buttons & BT_ACCELERATE) == BT_ACCELERATE) || (onground && player->speed > 0)); - const boolean lookback = ((cmd->buttons & BT_LOOKBACK) == BT_LOOKBACK); + UINT16 buttons = K_GetKartButtons(player); + const boolean spinningwheels = (((buttons & BT_ACCELERATE) == BT_ACCELERATE) || (onground && player->speed > 0)); + const boolean lookback = ((buttons & BT_LOOKBACK) == BT_LOOKBACK); SINT8 turndir = 0; SINT8 destGlanceDir = 0; SINT8 drift = player->kartstuff[k_drift]; - if (cmd->turning < -minturn) + if (player->cmd.turning < -minturn) { turndir = -1; } - else if (cmd->turning > minturn) + else if (player->cmd.turning > minturn) { turndir = 1; } @@ -2583,6 +2583,19 @@ UINT16 K_GetKartFlashing(player_t *player) return tics; } +boolean K_KartKickstart(player_t *player) +{ + return ((player->pflags & PF_KICKSTARTACCEL) + && (!K_PlayerUsesBotMovement(player)) + && (player->kickstartaccel >= ACCEL_KICKSTART)); +} + +UINT16 K_GetKartButtons(player_t *player) +{ + return (player->cmd.buttons | + (K_KartKickstart(player) ? BT_ACCELERATE : 0)); +} + SINT8 K_GetForwardMove(player_t *player) { SINT8 forwardmove = player->cmd.forwardmove; @@ -2602,6 +2615,13 @@ SINT8 K_GetForwardMove(player_t *player) return 0; } + if (K_KartKickstart(player)) // unlike the brute forward of sneakers, allow for backwards easing here + { + forwardmove += MAXPLMOVE; + if (forwardmove > MAXPLMOVE) + forwardmove = MAXPLMOVE; + } + return forwardmove; } @@ -5632,7 +5652,7 @@ player_t *K_FindJawzTarget(mobj_t *actor, player_t *source) } // Engine Sounds. -static void K_UpdateEngineSounds(player_t *player, ticcmd_t *cmd) +static void K_UpdateEngineSounds(player_t *player) { const INT32 numsnds = 13; @@ -5641,6 +5661,8 @@ static void K_UpdateEngineSounds(player_t *player, ticcmd_t *cmd) const UINT8 dampenval = 48; // 255 * 48 = close enough to FRACUNIT/6 + const UINT16 buttons = K_GetKartButtons(player); + INT32 class, s, w; // engine class number UINT8 volume = 255; @@ -5681,17 +5703,17 @@ static void K_UpdateEngineSounds(player_t *player, ticcmd_t *cmd) if (player->respawn.state == RESPAWNST_DROP) // Dropdashing { // Dropdashing - targetsnd = ((cmd->buttons & BT_ACCELERATE) ? 12 : 0); + targetsnd = ((buttons & BT_ACCELERATE) ? 12 : 0); } else if (K_PlayerEBrake(player) == true) { // Spindashing - targetsnd = ((cmd->buttons & BT_DRIFT) ? 12 : 0); + targetsnd = ((buttons & BT_DRIFT) ? 12 : 0); } else { // Average out the value of forwardmove and the speed that you're moving at. - targetsnd = (((6 * cmd->forwardmove) / 25) + ((player->speed / mapobjectscale) / 5)) / 2; + targetsnd = (((6 * K_GetForwardMove(player)) / 25) + ((player->speed / mapobjectscale) / 5)) / 2; } if (targetsnd < 0) { targetsnd = 0; } @@ -5989,7 +6011,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { K_UpdateOffroad(player); K_UpdateDraft(player); - K_UpdateEngineSounds(player, cmd); // Thanks, VAda! + K_UpdateEngineSounds(player); // Thanks, VAda! // update boost angle if not spun out if (!player->kartstuff[k_spinouttimer] && !player->kartstuff[k_wipeoutslow]) @@ -6471,7 +6493,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (cmd->buttons & BT_DRIFT) { // Only allow drifting while NOT trying to do an spindash input. - if ((cmd->buttons & BT_EBRAKEMASK) != BT_EBRAKEMASK) + if ((K_GetKartButtons(player) & BT_EBRAKEMASK) != BT_EBRAKEMASK) { player->driftInput = true; } @@ -7019,7 +7041,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) currentSpeed = R_PointToDist2(0, 0, player->mo->momx, player->mo->momy); if ((currentSpeed <= 0) // Not moving - && ((player->cmd.buttons & BT_EBRAKEMASK) != BT_EBRAKEMASK) // not e-braking + && ((K_GetKartButtons(player) & BT_EBRAKEMASK) != BT_EBRAKEMASK) // not e-braking && (player->respawn.state == RESPAWNST_NONE)) // Not respawning { return 0; @@ -7123,6 +7145,8 @@ static void K_KartDrift(player_t *player, boolean onground) const INT32 dstwo = dsone*2; const INT32 dsthree = dstwo*2; + const UINT16 buttons = K_GetKartButtons(player); + // Drifting is actually straffing + automatic turning. // Holding the Jump button will enable drifting. // (This comment is extremely funny) @@ -7329,8 +7353,8 @@ static void K_KartDrift(player_t *player, boolean onground) K_SpawnAIZDust(player); if (player->kartstuff[k_drift] - && ((player->cmd.buttons & BT_BRAKE) - || !(player->cmd.buttons & BT_ACCELERATE)) + && ((buttons & BT_BRAKE) + || !(buttons & BT_ACCELERATE)) && P_IsObjectOnGround(player->mo)) { if (!player->kartstuff[k_brakedrift]) @@ -7504,7 +7528,7 @@ static INT32 K_FlameShieldMax(player_t *player) boolean K_PlayerEBrake(player_t *player) { - return (player->cmd.buttons & BT_EBRAKEMASK) == BT_EBRAKEMASK + return (K_GetKartButtons(player) & BT_EBRAKEMASK) == BT_EBRAKEMASK && P_IsObjectOnGround(player->mo) == true && player->kartstuff[k_drift] == 0 && player->kartstuff[k_spinouttimer] == 0 @@ -7687,8 +7711,6 @@ static void K_AirFailsafe(player_t *player) const fixed_t maxSpeed = 6*player->mo->scale; const fixed_t thrustSpeed = 6*player->mo->scale; // 10*player->mo->scale - ticcmd_t *cmd = &player->cmd; - if (player->speed > maxSpeed // Above the max speed that you're allowed to use this technique. || player->respawn.state != RESPAWNST_NONE) // Respawning, you don't need this AND drop dash :V { @@ -7696,7 +7718,7 @@ static void K_AirFailsafe(player_t *player) return; } - if ((cmd->buttons & BT_ACCELERATE) || K_GetForwardMove(player) != 0) + if ((K_GetKartButtons(player) & BT_ACCELERATE) || K_GetForwardMove(player) != 0) { // Queue up later player->airFailsafe = true; @@ -7738,7 +7760,7 @@ void K_AdjustPlayerFriction(player_t *player) { player->mo->friction -= 1024; } - else if (player->speed > 0 && cmd->forwardmove < 0) + else if (player->speed > 0 && K_GetForwardMove(player) < 0) { player->mo->friction -= 512; } diff --git a/src/k_kart.h b/src/k_kart.h index 0e3aa0ff4..c91bba806 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -91,6 +91,8 @@ fixed_t K_GetKartSpeedFromStat(UINT8 kartspeed); fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower); fixed_t K_GetKartAccel(player_t *player); UINT16 K_GetKartFlashing(player_t *player); +boolean K_KartKickstart(player_t *player); +UINT16 K_GetKartButtons(player_t *player); SINT8 K_GetForwardMove(player_t *player); fixed_t K_3dKartMovement(player_t *player); boolean K_PlayerEBrake(player_t *player); diff --git a/src/k_respawn.c b/src/k_respawn.c index 409340a3f..dd424e6d6 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -648,7 +648,7 @@ static void K_DropDashWait(player_t *player) --------------------------------------------------*/ static void K_HandleDropDash(player_t *player) { - ticcmd_t *cmd = &player->cmd; + const UINT16 buttons = K_GetKartButtons(player); if (player->kartstuff[k_growshrinktimer] < 0) { @@ -673,7 +673,7 @@ static void K_HandleDropDash(player_t *player) // The old behavior was stupid and prone to accidental usage. // Let's rip off Mania instead, and turn this into a Drop Dash! - if ((cmd->buttons & BT_ACCELERATE) && !player->kartstuff[k_spinouttimer]) // Since we're letting players spin out on respawn, don't let them charge a dropdash in this state. (It wouldn't work anyway) + if ((buttons & BT_ACCELERATE) && !player->kartstuff[k_spinouttimer]) // Since we're letting players spin out on respawn, don't let them charge a dropdash in this state. (It wouldn't work anyway) { player->respawn.dropdash++; } @@ -698,7 +698,7 @@ static void K_HandleDropDash(player_t *player) } else { - if ((cmd->buttons & BT_ACCELERATE) && (player->respawn.dropdash >= TICRATE/4)) + if ((buttons & BT_ACCELERATE) && (player->respawn.dropdash >= TICRATE/4)) { S_StartSound(player->mo, sfx_s23c); player->kartstuff[k_startboost] = 50; diff --git a/src/p_mobj.c b/src/p_mobj.c index 94eef3530..6a58fc907 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6839,7 +6839,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if ((!mobj->target || !mobj->target->health || !mobj->target->player || !P_IsObjectOnGround(mobj->target)) || !mobj->target->player->kartstuff[k_drift] || !mobj->target->player->kartstuff[k_brakedrift] || !((mobj->target->player->cmd.buttons & BT_BRAKE) - || (mobj->target->player->cmd.buttons & BT_ACCELERATE))) // Letting go of accel functions about the same as brake-drifting + || (K_GetKartButtons(mobj->target->player) & BT_ACCELERATE))) // Letting go of accel functions about the same as brake-drifting { P_RemoveMobj(mobj); return false; diff --git a/src/p_user.c b/src/p_user.c index 640400b48..5bfe06533 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4327,7 +4327,7 @@ void P_PlayerThink(player_t *player) // Accessibility - kickstart your acceleration if (!(player->pflags & PF_KICKSTARTACCEL)) player->kickstartaccel = 0; - else if (cmd->buttons & BT_REALACCELERATE) + else if (cmd->buttons & BT_ACCELERATE) { if (!player->exiting && !(player->pflags & PF_ACCELDOWN)) player->kickstartaccel = 0; @@ -4569,7 +4569,7 @@ void P_PlayerThink(player_t *player) #endif // check for buttons - if (cmd->buttons & BT_REALACCELERATE) + if (cmd->buttons & BT_ACCELERATE) player->pflags |= PF_ACCELDOWN; else player->pflags &= ~PF_ACCELDOWN; From 879c821d181bd1607d62b82c7fd39f3df892af7c Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 22 Feb 2021 12:58:03 +0000 Subject: [PATCH 9/9] Demo-sync weaponpref data, which just includes kickstartaccel right now. --- src/d_netcmd.c | 3 +++ src/g_demo.c | 17 ++++++++++++++++- src/g_demo.h | 17 +++++++++-------- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 7ad6b2727..233252536 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1642,6 +1642,9 @@ static void Got_WeaponPref(UINT8 **cp,INT32 playernum) players[playernum].pflags &= ~(PF_KICKSTARTACCEL); if (prefs & 1) players[playernum].pflags |= PF_KICKSTARTACCEL; + + // SEE ALSO g_demo.c + demo_extradata[playernum] |= DXD_WEAPONPREF; } static void Got_PowerLevel(UINT8 **cp,INT32 playernum) diff --git a/src/g_demo.c b/src/g_demo.c index 859bb4421..fc9181717 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -341,7 +341,13 @@ void G_ReadDemoExtraData(void) K_CheckBumpers(); P_CheckRacers(); } - + if (extradata & DXD_WEAPONPREF) + { + extradata = READUINT8(demo_p); + players[p].pflags &= ~(PF_KICKSTARTACCEL); + if (extradata & 1) + players[p].pflags |= PF_KICKSTARTACCEL; + } p = READUINT8(demo_p); } @@ -447,6 +453,13 @@ void G_WriteDemoExtraData(void) else WRITEUINT8(demo_p, DXD_PST_PLAYING); } + if (demo_extradata[i] & DXD_WEAPONPREF) + { + UINT8 prefs = 0; + if (players[i].pflags & PF_KICKSTARTACCEL) + prefs |= 1; + WRITEUINT8(demo_p, prefs); + } } demo_extradata[i] = 0; @@ -1068,6 +1081,8 @@ void G_GhostTicker(void) g->p += 32; // ok (32 because there's both the skin and the colour) if (ziptic & DXD_PLAYSTATE && READUINT8(g->p) != DXD_PST_PLAYING) I_Error("Ghost is not a record attack ghost PLAYSTATE"); //@TODO lmao don't blow up like this + if (ziptic & DXD_WEAPONPREF) + g->p++; // ditto } else if (ziptic == DW_RNG) g->p += 4; // RNG seed diff --git a/src/g_demo.h b/src/g_demo.h index b4039434e..03d75cf4b 100644 --- a/src/g_demo.h +++ b/src/g_demo.h @@ -110,16 +110,17 @@ typedef enum extern UINT8 demo_extradata[MAXPLAYERS]; extern UINT8 demo_writerng; -#define DXD_RESPAWN 0x01 // "respawn" command in console -#define DXD_SKIN 0x02 // skin changed -#define DXD_NAME 0x04 // name changed -#define DXD_COLOR 0x08 // color changed -#define DXD_PLAYSTATE 0x10 // state changed between playing, spectating, or not in-game -#define DXD_FOLLOWER 0x20 // follower was changed +#define DXD_RESPAWN 0x01 // "respawn" command in console +#define DXD_SKIN 0x02 // skin changed +#define DXD_NAME 0x04 // name changed +#define DXD_COLOR 0x08 // color changed +#define DXD_PLAYSTATE 0x10 // state changed between playing, spectating, or not in-game +#define DXD_FOLLOWER 0x20 // follower was changed +#define DXD_WEAPONPREF 0x40 // netsynced playsim settings were changed -#define DXD_PST_PLAYING 0x01 +#define DXD_PST_PLAYING 0x01 #define DXD_PST_SPECTATING 0x02 -#define DXD_PST_LEFT 0x03 +#define DXD_PST_LEFT 0x03 // Record/playback tics void G_ReadDemoExtraData(void);