From 784a541c095da99f12be6622ae5a923a3d083382 Mon Sep 17 00:00:00 2001 From: SinnamonLat Date: Tue, 3 May 2022 01:53:20 +0200 Subject: [PATCH 1/8] Spindash charge time rebalance + release thrust --- src/k_kart.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 412f3bdc3..2b153be26 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2773,8 +2773,8 @@ static fixed_t K_FlameShieldDashVar(INT32 val) INT16 K_GetSpindashChargeTime(player_t *player) { // more charge time for higher speed - // Tails = 2s, Mighty = 3s, Fang = 4s, Metal = 4s - return (player->kartspeed + 4) * (TICRATE/3); + // Tails = 2s, Knuckles = 2.6s, Metal = 3.2s + return (player->kartspeed + 8) * (TICRATE/5); } fixed_t K_GetSpindashChargeSpeed(player_t *player) @@ -8641,6 +8641,9 @@ static void K_KartSpindashWind(mobj_t *parent) K_MatchGenericExtraFlags(wind, parent); } +// Time after which you get a thrust for releasing spindash +#define SPINDASHTHRUSTTIME 20 + static void K_KartSpindash(player_t *player) { const INT16 MAXCHARGETIME = K_GetSpindashChargeTime(player); @@ -8657,6 +8660,13 @@ static void K_KartSpindash(player_t *player) player->spindashspeed = (player->spindash * FRACUNIT) / MAXCHARGETIME; player->spindashboost = TICRATE; + // if spindash was charged enough, give a small thrust. + if (player->spindash >= SPINDASHTHRUSTTIME) + { + // Give a bit of a boost depending on charge. + P_InstaThrust(player->mo, player->mo->angle, FixedMul(player->mo->scale, player->spindash*FRACUNIT/5)); + } + if (!player->tiregrease) { UINT8 i; @@ -8706,7 +8716,7 @@ static void K_KartSpindash(player_t *player) INT16 chargetime = MAXCHARGETIME - ++player->spindash; boolean spawnOldEffect = true; - if (chargetime <= (MAXCHARGETIME / 2)) + if (player->spindash >= SPINDASHTHRUSTTIME) { K_KartSpindashDust(player->mo); spawnOldEffect = false; @@ -8753,6 +8763,8 @@ static void K_KartSpindash(player_t *player) } } +#undef SPINDASHTHRUSTTIME + static void K_AirFailsafe(player_t *player) { const fixed_t maxSpeed = 6*player->mo->scale; From d843cc5b5cf849a0e4e9b8277a7a8b3c46e88289 Mon Sep 17 00:00:00 2001 From: SinnamonLat Date: Tue, 3 May 2022 02:16:22 +0200 Subject: [PATCH 2/8] Spindash iframe ring drain based off of speed/weight --- src/k_kart.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 2b153be26..b6f4c3f1d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8713,6 +8713,7 @@ static void K_KartSpindash(player_t *player) { if ((cmd->buttons & (BT_DRIFT|BT_BRAKE)) == (BT_DRIFT|BT_BRAKE)) { + UINT8 ringdropframes = 2 + (player->kartspeed + player->kartweight); INT16 chargetime = MAXCHARGETIME - ++player->spindash; boolean spawnOldEffect = true; @@ -8727,7 +8728,7 @@ static void K_KartSpindash(player_t *player) K_KartSpindashWind(player->mo); } - if (player->flashing > 0 && (leveltime & 1) && player->hyudorotimer == 0) + if (player->flashing > 0 && (player->spindash % ringdropframes == 0) && player->hyudorotimer == 0) { // Every frame that you're invisible from flashing, spill a ring. // Intentionally a lop-sided trade-off, so the game doesn't become From 464e4a338a2b2a8bb2dfb96cfc66c1c854f689f1 Mon Sep 17 00:00:00 2001 From: SinnamonLat Date: Tue, 3 May 2022 03:35:01 +0200 Subject: [PATCH 3/8] wip: ebrake visuals --- src/d_player.h | 1 + src/deh_tables.c | 14 ++++++++++ src/info.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ src/info.h | 16 +++++++++++ src/k_kart.c | 57 +++++++++++++++++++++++++++++++++++++++ src/k_kart.h | 1 + src/p_mobj.c | 10 +++++++ src/p_saveg.c | 4 +++ 8 files changed, 173 insertions(+) diff --git a/src/d_player.h b/src/d_player.h index 55c2857d5..0e5fd613b 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -488,6 +488,7 @@ typedef struct player_s UINT8 trickboostdecay; // used to know how long you've waited UINT8 trickboost; // Trick boost. This one is weird and has variable speed. Dear god. + tic_t ebrakefor; // Ebrake timer, used for visuals. UINT32 roundscore; // battle score this round UINT8 emeralds; diff --git a/src/deh_tables.c b/src/deh_tables.c index 8bdae717d..bd17b2afb 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4662,6 +4662,18 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_SPINDASHDUST", "S_SPINDASHWIND", + "S_SOFTLANDING1", + "S_SOFTLANDING2", + "S_SOFTLANDING3", + "S_SOFTLANDING4", + "S_SOFTLANDING5", + + "S_DOWNLINE1", + "S_DOWNLINE2", + "S_DOWNLINE3", + "S_DOWNLINE4", + "S_DOWNLINE5", + // Finish line beam "S_FINISHBEAM1", "S_FINISHBEAM2", @@ -5781,6 +5793,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_SPINDASHDUST", "MT_SPINDASHWIND", + "MT_SOFTLANDING", + "MT_DOWNLINE", "MT_PAPERITEMSPOT", diff --git a/src/info.c b/src/info.c index 9ebc1bf4c..5ded215d5 100644 --- a/src/info.c +++ b/src/info.c @@ -752,6 +752,8 @@ char sprnames[NUMSPRITES + 1][5] = "SDDS", // Spindash dust "SDWN", // Spindash wind + "EBRK", // Soft Landing / Ebrake aura stuff. + "HMTR", // Down Lines "TRCK", @@ -5246,6 +5248,20 @@ state_t states[NUMSTATES] = {SPR_SDDS, FF_ANIMATE, 9, {NULL}, 9, 1, S_NULL}, // S_SPINDASHDUST {SPR_SDWN, FF_ANIMATE|FF_PAPERSPRITE, 18, {NULL}, 9, 2, S_NULL}, // S_SPINDASHWIND + // Soft Landing + {SPR_EBRK, 0|FF_ADD|FF_FLOORSPRITE, 4, {NULL}, 0, 0, S_SOFTLANDING2}, // S_SOFTLANDING1 + {SPR_EBRK, 1|FF_ADD|FF_FLOORSPRITE, 4, {NULL}, 0, 0, S_SOFTLANDING3}, // S_SOFTLANDING2 + {SPR_EBRK, 2|FF_ADD|FF_FLOORSPRITE, 4, {NULL}, 0, 0, S_SOFTLANDING4}, // S_SOFTLANDING3 + {SPR_EBRK, 3|FF_ADD|FF_FLOORSPRITE, 4, {NULL}, 0, 0, S_SOFTLANDING5}, // S_SOFTLANDING4 + {SPR_EBRK, 4|FF_ADD|FF_FLOORSPRITE, 4, {NULL}, 0, 0, S_NULL}, // S_SOFTLANDING5 + + // Downwards Lines + {SPR_HMTR, 0, 2, {NULL}, 0, 0, S_DOWNLINE2}, // S_DOWNLINE1 + {SPR_HMTR, 1, 2, {NULL}, 0, 0, S_DOWNLINE3}, // S_DOWNLINE2 + {SPR_HMTR, 2, 2, {NULL}, 0, 0, S_DOWNLINE4}, // S_DOWNLINE3 + {SPR_HMTR, 3, 2, {NULL}, 0, 0, S_DOWNLINE5}, // S_DOWNLINE4 + {SPR_HMTR, 4, 2, {NULL}, 0, 0, S_NULL}, // S_DOWNLINE5 + // Finish line beam {SPR_FLBM, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_NULL}, // S_FINISHBEAM1 {SPR_FLBM, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_NULL}, // S_FINISHBEAM2 @@ -29197,6 +29213,60 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_SOFTLANDING + -1, // doomednum + S_SOFTLANDING1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 12*FRACUNIT, // radius + 24*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + + { // MT_DOWNLINE + -1, // doomednum + S_DOWNLINE1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 12*FRACUNIT, // radius + 24*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_PAPERITEMSPOT -1, // doomednum S_INVISIBLE, // spawnstate diff --git a/src/info.h b/src/info.h index 71da066b8..3494d057b 100644 --- a/src/info.h +++ b/src/info.h @@ -1300,6 +1300,8 @@ typedef enum sprite SPR_SDDS, // Spindash dust SPR_SDWN, // Spindash wind + SPR_EBRK, // Soft Landing / Ebrake aura stuff. + SPR_HMTR, // downwards line SPR_TRCK, @@ -5662,6 +5664,18 @@ typedef enum state S_SPINDASHDUST, S_SPINDASHWIND, + S_SOFTLANDING1, + S_SOFTLANDING2, + S_SOFTLANDING3, + S_SOFTLANDING4, + S_SOFTLANDING5, + + S_DOWNLINE1, + S_DOWNLINE2, + S_DOWNLINE3, + S_DOWNLINE4, + S_DOWNLINE5, + S_FINISHBEAM1, S_FINISHBEAM2, S_FINISHBEAM3, @@ -6798,6 +6812,8 @@ typedef enum mobj_type MT_SPINDASHDUST, MT_SPINDASHWIND, + MT_SOFTLANDING, + MT_DOWNLINE, MT_PAPERITEMSPOT, diff --git a/src/k_kart.c b/src/k_kart.c index b6f4c3f1d..5a85341a9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7416,6 +7416,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->tripWireState = TRIP_NONE; } + + K_KartEbrakeVisuals(player); } void K_KartPlayerAfterThink(player_t *player) @@ -8585,6 +8587,61 @@ INT32 K_StairJankFlip(INT32 value) return P_AltFlip(value, 2); } +// Ebraking visuals for mo +void K_KartEbrakeVisuals(player_t *p) +{ + mobj_t *wave; + mobj_t *spdl; + fixed_t sx, sy; + + if (K_PlayerEBrake(p)) + { + + if (p->ebrakefor % 20 == 0) + { + wave = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_SOFTLANDING); + P_SetScale(wave, p->mo->scale); + wave->standingslope = p->mo->standingslope; + } + + if (!p->spindash) + { + // Spawn downwards fastline + sx = p->mo->x + P_RandomRange(-48, 48)*p->mo->scale; + sy = p->mo->y + P_RandomRange(-48, 48)*p->mo->scale; + + spdl = P_SpawnMobj(sx, sy, p->mo->z, MT_DOWNLINE); + spdl->colorized = true; + spdl->color = SKINCOLOR_WHITE; + K_MatchGenericExtraFlags(spdl, p->mo); + P_SetScale(spdl, p->mo->scale); + + // squish the player a little bit. + p->mo->spritexscale = FRACUNIT*115/100; + p->mo->spriteyscale = FRACUNIT*85/100; + } + else + { + // sqish them a little MORE.... + p->mo->spritexscale = FRACUNIT*12/10; + p->mo->spriteyscale = FRACUNIT*8/10; + } + + + + + p->ebrakefor++; + } + else if (p->ebrakefor) // cancel effects + { + // reset scale + p->mo->spritexscale = FRACUNIT; + p->mo->spriteyscale = FRACUNIT; + + p->ebrakefor = 0; + } +} + static void K_KartSpindashDust(mobj_t *parent) { fixed_t rad = FixedDiv(FixedHypot(parent->radius, parent->radius), parent->scale); diff --git a/src/k_kart.h b/src/k_kart.h index 91024488f..95e24d7cd 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -141,6 +141,7 @@ void K_CheckSpectateStatus(void); UINT8 K_GetInvincibilityItemFrame(void); UINT8 K_GetOrbinautItemFrame(UINT8 count); boolean K_IsSPBInGame(void); +void K_KartEbrakeVisuals(player_t *p); // sound stuff for lua void K_PlayAttackTaunt(mobj_t *source); diff --git a/src/p_mobj.c b/src/p_mobj.c index 3a4cd1751..00744229f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9590,6 +9590,16 @@ void P_SceneryThinker(mobj_t *mobj) P_CycleMobjState(mobj); + // Flicker softlanding mobj, this just prevents us from needing like 20 states. + if (mobj->type == MT_SOFTLANDING) + { + mobj->renderflags |= RF_NOSPLATBILLBOARD|RF_OBJECTSLOPESPLAT; + if (mobj->tics & 1) + mobj->renderflags |= RF_DONTDRAW; + else + mobj->renderflags &= ~RF_DONTDRAW; + } + if (mobj->type != MT_RANDOMAUDIENCE) return; diff --git a/src/p_saveg.c b/src/p_saveg.c index 18cef0e94..92de0c486 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -326,6 +326,8 @@ static void P_NetArchivePlayers(void) WRITEUINT8(save_p, players[i].trickboostdecay); WRITEUINT8(save_p, players[i].trickboost); + WRITEUINT32(save_p, players[i].ebrakefor); + WRITEUINT32(save_p, players[i].roundscore); WRITEUINT8(save_p, players[i].emeralds); WRITEUINT8(save_p, players[i].bumpers); @@ -592,6 +594,8 @@ static void P_NetUnArchivePlayers(void) players[i].trickboostdecay = READUINT8(save_p); players[i].trickboost = READUINT8(save_p); + players[i].ebrakefor = READUINT32(save_p); + players[i].roundscore = READUINT32(save_p); players[i].emeralds = READUINT8(save_p); players[i].bumpers = READUINT8(save_p); From 03056eb3b57a5f8d5f49e2ede7a56e4ad54d08e9 Mon Sep 17 00:00:00 2001 From: SinnamonLat Date: Tue, 3 May 2022 23:23:46 +0200 Subject: [PATCH 4/8] better ebrake/spindash visuals --- src/deh_tables.c | 3 ++ src/info.c | 43 ++++++++++++++++++++++++---- src/info.h | 4 +++ src/k_kart.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 115 insertions(+), 8 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index bd17b2afb..a8fd4612c 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4674,6 +4674,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_DOWNLINE4", "S_DOWNLINE5", + "S_HOLDBUBBLE", + // Finish line beam "S_FINISHBEAM1", "S_FINISHBEAM2", @@ -5795,6 +5797,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_SPINDASHWIND", "MT_SOFTLANDING", "MT_DOWNLINE", + "MT_HOLDBUBBLE", "MT_PAPERITEMSPOT", diff --git a/src/info.c b/src/info.c index 5ded215d5..672c0401d 100644 --- a/src/info.c +++ b/src/info.c @@ -754,6 +754,7 @@ char sprnames[NUMSPRITES + 1][5] = "SDWN", // Spindash wind "EBRK", // Soft Landing / Ebrake aura stuff. "HMTR", // Down Lines + "HBUB", // HOLD! Bubble "TRCK", @@ -5256,11 +5257,14 @@ state_t states[NUMSTATES] = {SPR_EBRK, 4|FF_ADD|FF_FLOORSPRITE, 4, {NULL}, 0, 0, S_NULL}, // S_SOFTLANDING5 // Downwards Lines - {SPR_HMTR, 0, 2, {NULL}, 0, 0, S_DOWNLINE2}, // S_DOWNLINE1 - {SPR_HMTR, 1, 2, {NULL}, 0, 0, S_DOWNLINE3}, // S_DOWNLINE2 - {SPR_HMTR, 2, 2, {NULL}, 0, 0, S_DOWNLINE4}, // S_DOWNLINE3 - {SPR_HMTR, 3, 2, {NULL}, 0, 0, S_DOWNLINE5}, // S_DOWNLINE4 - {SPR_HMTR, 4, 2, {NULL}, 0, 0, S_NULL}, // S_DOWNLINE5 + {SPR_HMTR, 0|FF_ADD, 1, {NULL}, 0, 0, S_DOWNLINE2}, // S_DOWNLINE1 + {SPR_HMTR, 1|FF_ADD, 1, {NULL}, 0, 0, S_DOWNLINE3}, // S_DOWNLINE2 + {SPR_HMTR, 2|FF_ADD, 1, {NULL}, 0, 0, S_DOWNLINE4}, // S_DOWNLINE3 + {SPR_HMTR, 3|FF_ADD, 1, {NULL}, 0, 0, S_DOWNLINE5}, // S_DOWNLINE4 + {SPR_HMTR, 4|FF_ADD, 1, {NULL}, 0, 0, S_NULL}, // S_DOWNLINE5 + + // HOLD Bubble + {SPR_HBUB, 0|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_HOLDBUBBLE}, // S_HOLDBUBBLE // Finish line beam {SPR_FLBM, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_NULL}, // S_FINISHBEAM1 @@ -29242,7 +29246,34 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { // MT_DOWNLINE -1, // doomednum - S_DOWNLINE1, // spawnstate + S_DOWNLINE1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 12*FRACUNIT, // radius + 24*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + + { // MT_HOLDBUBBLE + -1, // doomednum + S_HOLDBUBBLE, // spawnstate 1000, // spawnhealth S_NULL, // seestate sfx_None, // seesound diff --git a/src/info.h b/src/info.h index 3494d057b..e64dae3de 100644 --- a/src/info.h +++ b/src/info.h @@ -1302,6 +1302,7 @@ typedef enum sprite SPR_SDWN, // Spindash wind SPR_EBRK, // Soft Landing / Ebrake aura stuff. SPR_HMTR, // downwards line + SPR_HBUB, // HOLD! Bubble SPR_TRCK, @@ -5676,6 +5677,8 @@ typedef enum state S_DOWNLINE4, S_DOWNLINE5, + S_HOLDBUBBLE, + S_FINISHBEAM1, S_FINISHBEAM2, S_FINISHBEAM3, @@ -6814,6 +6817,7 @@ typedef enum mobj_type MT_SPINDASHWIND, MT_SOFTLANDING, MT_DOWNLINE, + MT_HOLDBUBBLE, MT_PAPERITEMSPOT, diff --git a/src/k_kart.c b/src/k_kart.c index 5a85341a9..752e4e225 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8588,6 +8588,8 @@ INT32 K_StairJankFlip(INT32 value) } // Ebraking visuals for mo +// we use mo->hprev for the hold bubble. If another hprev exists for some reason, remove it. + void K_KartEbrakeVisuals(player_t *p) { mobj_t *wave; @@ -8601,9 +8603,35 @@ void K_KartEbrakeVisuals(player_t *p) { wave = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_SOFTLANDING); P_SetScale(wave, p->mo->scale); + wave->momx = p->mo->momx; + wave->momy = p->mo->momy; + wave->momz = p->mo->momz; wave->standingslope = p->mo->standingslope; } + // HOLD! bubble. + if (!p->ebrakefor) + { + if (p->mo->hprev && !P_MobjWasRemoved(p->mo->hprev)) + { + // for some reason, there's already an hprev. Remove it. + P_RemoveMobj(p->mo->hprev); + } + + p->mo->hprev = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_HOLDBUBBLE); + p->mo->hprev->renderflags |= (RF_DONTDRAW & ~K_GetPlayerDontDrawFlag(p)); + } + + // Update HOLD bubble. + if (p->mo->hprev && !P_MobjWasRemoved(p->mo->hprev)) + { + P_MoveOrigin(p->mo->hprev, p->mo->x, p->mo->y, p->mo->z); + p->mo->hprev->angle = p->mo->angle; + p->mo->hprev->fuse = TICRATE/2; // When we leave spindash for any reason, make sure this bubble goes away soon after. + K_FlipFromObject(p->mo->hprev, p->mo); + } + + if (!p->spindash) { // Spawn downwards fastline @@ -8622,14 +8650,45 @@ void K_KartEbrakeVisuals(player_t *p) } else { + const UINT16 MAXCHARGETIME = K_GetSpindashChargeTime(p); + const fixed_t MAXSHAKE = FRACUNIT; + + // update HOLD bubble with numbers based on charge. + if (p->mo->hprev && !P_MobjWasRemoved(p->mo->hprev)) + { + UINT8 frame = min(1 + ((p->spindash*3) / MAXCHARGETIME), 4); + + // ?! limit. + if (p->spindash >= MAXCHARGETIME +TICRATE) + frame = 5; + + p->mo->hprev->frame = frame|FF_FULLBRIGHT; + } + + // shake the player as they charge their spindash! + + // "gentle" shaking as we start... + if (p->spindash < MAXCHARGETIME) + { + fixed_t shake = FixedMul(((p->spindash)*FRACUNIT/MAXCHARGETIME), MAXSHAKE); + SINT8 mult = leveltime & 1 ? 1 : -1; + + p->mo->spritexoffset = shake*mult; + } + else // get VIOLENT on overcharge :) + { + fixed_t shake = MAXSHAKE + FixedMul(((p->spindash-MAXCHARGETIME)*FRACUNIT/TICRATE), MAXSHAKE)*3; + SINT8 mult = leveltime & 1 ? 1 : -1; + + p->mo->spritexoffset = shake*mult; + } + // sqish them a little MORE.... p->mo->spritexscale = FRACUNIT*12/10; p->mo->spriteyscale = FRACUNIT*8/10; } - - p->ebrakefor++; } else if (p->ebrakefor) // cancel effects @@ -8638,6 +8697,16 @@ void K_KartEbrakeVisuals(player_t *p) p->mo->spritexscale = FRACUNIT; p->mo->spriteyscale = FRACUNIT; + // reset shake + p->mo->spritexoffset = 0; + + // remove the bubble instantly unless it's in the !? state + if (p->mo->hprev && !P_MobjWasRemoved(p->mo->hprev) && (p->mo->hprev->frame & FF_FRAMEMASK) != 5) + { + P_RemoveMobj(p->mo->hprev); + p->mo->hprev = NULL; + } + p->ebrakefor = 0; } } From f80ef0e051e016d50140e144686d5a77d6a4cc69 Mon Sep 17 00:00:00 2001 From: SinnamonLat Date: Tue, 3 May 2022 23:37:32 +0200 Subject: [PATCH 5/8] ignore offroad while in tiregrease --- src/k_kart.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 752e4e225..a7c6e129a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1592,6 +1592,10 @@ static UINT8 K_CheckOffroadCollide(mobj_t *mo) I_Assert(mo != NULL); I_Assert(!P_MobjWasRemoved(mo)); + // If tiregrease is active, don't + if (mo->player && mo->player->tiregrease) + return 0; + for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next) { if (!node->m_sector) From bf09bdd6422d0e6c8019a090c7bce1cc6b6ebe99 Mon Sep 17 00:00:00 2001 From: SinnamonLat Date: Tue, 3 May 2022 23:51:37 +0200 Subject: [PATCH 6/8] ebrake sound --- src/k_kart.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index a7c6e129a..d64f26ad9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8613,6 +8613,10 @@ void K_KartEbrakeVisuals(player_t *p) wave->standingslope = p->mo->standingslope; } + // sound + if (!S_SoundPlaying(p->mo, sfx_s3kc6s)) + S_StartSound(p->mo, sfx_s3kc6s); + // HOLD! bubble. if (!p->ebrakefor) { From 3bcf4fd33bbf9988de2051bc24348aac81f898db Mon Sep 17 00:00:00 2001 From: SinnamonLat Date: Wed, 4 May 2022 10:50:07 +0200 Subject: [PATCH 7/8] fix exploit where releasing only accel mid spindash would cancel it --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index d64f26ad9..4a6ffbf7d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8789,7 +8789,7 @@ static void K_KartSpindash(player_t *player) player->spindash = 0; } - if (player->spindash > 0 && (cmd->buttons & (BT_DRIFT|BT_BRAKE)) != (BT_DRIFT|BT_BRAKE)) + if (player->spindash > 0 && (cmd->buttons & (BT_DRIFT|BT_BRAKE|BT_ACCELERATE)) != (BT_DRIFT|BT_BRAKE|BT_ACCELERATE)) { player->spindashspeed = (player->spindash * FRACUNIT) / MAXCHARGETIME; player->spindashboost = TICRATE; From 7a65dbfe8e7b5061acea6c7f5e082a9a45761346 Mon Sep 17 00:00:00 2001 From: SinnamonLat Date: Wed, 4 May 2022 10:55:19 +0200 Subject: [PATCH 8/8] use other magnetic sound for ebrake --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 4a6ffbf7d..92fda8de3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8614,8 +8614,8 @@ void K_KartEbrakeVisuals(player_t *p) } // sound - if (!S_SoundPlaying(p->mo, sfx_s3kc6s)) - S_StartSound(p->mo, sfx_s3kc6s); + if (!S_SoundPlaying(p->mo, sfx_s3kd9s)) + S_StartSound(p->mo, sfx_s3kd9s); // HOLD! bubble. if (!p->ebrakefor)