From f4fbd1e65480e44f366611a3d75b76dca298fe17 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Mon, 6 Mar 2023 05:00:59 -0700 Subject: [PATCH] Sliptide boost VFX first pass --- src/d_clisrv.c | 1 + src/d_player.h | 1 + src/deh_tables.c | 4 ++ src/info.c | 31 ++++++++++++++ src/info.h | 5 +++ src/k_kart.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++- src/k_kart.h | 1 + src/p_mobj.c | 2 + 8 files changed, 147 insertions(+), 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 76470b865..af2dfe0cd 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2561,6 +2561,7 @@ void CL_ClearPlayer(INT32 playernum) P_SetTarget(&players[playernum].followmobj, NULL); P_SetTarget(&players[playernum].hoverhyudoro, NULL); P_SetTarget(&players[playernum].stumbleIndicator, NULL); + P_SetTarget(&players[playernum].sliptideZipIndicator, NULL); } // Handle parties. diff --git a/src/d_player.h b/src/d_player.h index c2ad5050b..23f792c1b 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -680,6 +680,7 @@ struct player_t UINT16 sliptideZipBoost; // The actual boost granted from sliptideZip. mobj_t *stumbleIndicator; + mobj_t *sliptideZipIndicator; #ifdef HWRENDER fixed_t fovadd; // adjust FOV for hw rendering diff --git a/src/deh_tables.c b/src/deh_tables.c index de88639e8..1745d9a7d 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3304,6 +3304,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_MAGICIANBOXTOP", "S_MAGICIANBOXBOTTOM", + "S_SLIPTIDEZIP", + // Signpost sparkles "S_SIGNSPARK1", "S_SIGNSPARK2", @@ -5323,6 +5325,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_MONITOR_PART", "MT_MONITOR_SHARD", "MT_MAGICIANBOX", + + "MT_SLIPTIDEZIP", "MT_SIGNSPARKLE", diff --git a/src/info.c b/src/info.c index d0509e731..4d799efe9 100644 --- a/src/info.c +++ b/src/info.c @@ -552,6 +552,8 @@ char sprnames[NUMSPRITES + 1][5] = "IMDB", // Item Monitor Small Shard (Debris) "MTWK", // Item Monitor Glass Twinkle + "SLPT", // Sliptide zip indicator + "WIPD", // Wipeout dust trail "DRIF", // Drift Sparks "BDRF", // Brake drift sparks @@ -3930,6 +3932,8 @@ state_t states[NUMSTATES] = {SPR_MGBT, FF_FLOORSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_MAGICIANBOX_TOP {SPR_MGBB, FF_FLOORSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_MAGICIANBOX_BOTTOM + {SPR_SLPT, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_SLIPTIDEZIP + {SPR_SGNS, FF_ADD|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_SIGNSPARK2}, // S_SIGNSPARK1 {SPR_SGNS, FF_ADD|FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_SIGNSPARK3}, // S_SIGNSPARK2 {SPR_SGNS, FF_ADD|FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_SIGNSPARK4}, // S_SIGNSPARK3 @@ -22583,6 +22587,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT, // flags S_NULL // raisestate }, + + { // MT_SLIPTIDEZIP + -1, // doomednum + S_SLIPTIDEZIP, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // 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 + 20*FRACUNIT, // radius + 20*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING, // flags + S_NULL // raisestate + }, { // MT_SIGNSPARKLE -1, // doomednum diff --git a/src/info.h b/src/info.h index 02e194cb6..3a1921b3c 100644 --- a/src/info.h +++ b/src/info.h @@ -1103,6 +1103,8 @@ typedef enum sprite SPR_IMDB, // Item Monitor Small Shard (Debris) SPR_MTWK, // Item Monitor Glass Twinkle + SPR_SLPT, // Sliptide zip indicator + SPR_WIPD, // Wipeout dust trail SPR_DRIF, // Drift Sparks SPR_BDRF, // Brake drift sparks @@ -4339,6 +4341,8 @@ typedef enum state S_MAGICIANBOX_TOP, S_MAGICIANBOX_BOTTOM, + S_SLIPTIDEZIP, + // Signpost sparkles S_SIGNSPARK1, S_SIGNSPARK2, @@ -6394,6 +6398,7 @@ typedef enum mobj_type MT_MONITOR_PART, MT_MONITOR_SHARD, MT_MAGICIANBOX, + MT_SLIPTIDEZIP, MT_SIGNSPARKLE, diff --git a/src/k_kart.c b/src/k_kart.c index eb8962fbc..b4b12b7e1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3883,6 +3883,31 @@ void K_InitStumbleIndicator(player_t *player) P_SetTarget(&new->target, player->mo); } +void K_InitSliptideZipIndicator(player_t *player) +{ + mobj_t *new = NULL; + + if (player == NULL) + { + return; + } + + if (player->mo == NULL || P_MobjWasRemoved(player->mo) == true) + { + return; + } + + if (player->stumbleIndicator != NULL && P_MobjWasRemoved(player->sliptideZipIndicator) == false) + { + P_RemoveMobj(player->sliptideZipIndicator); + } + + new = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_SLIPTIDEZIP); + + P_SetTarget(&player->sliptideZipIndicator, new); + P_SetTarget(&new->target, player->mo); +} + void K_UpdateStumbleIndicator(player_t *player) { const angle_t fudge = ANG15; @@ -3985,6 +4010,71 @@ void K_UpdateStumbleIndicator(player_t *player) } } +void K_UpdateSliptideZipIndicator(player_t *player) +{ + mobj_t *mobj = NULL; + + if (player == NULL) + { + return; + } + + if (player->mo == NULL || P_MobjWasRemoved(player->mo) == true) + { + return; + } + + if (player->stumbleIndicator == NULL || P_MobjWasRemoved(player->stumbleIndicator) == true) + { + K_InitSliptideZipIndicator(player); + return; + } + + mobj = player->sliptideZipIndicator; + angle_t momentumAngle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); + + P_MoveOrigin(mobj, player->mo->x - FixedMul(40*mapobjectscale, FINECOSINE(momentumAngle >> ANGLETOFINESHIFT)), + player->mo->y - FixedMul(40*mapobjectscale, FINESINE(momentumAngle >> ANGLETOFINESHIFT)), + player->mo->z + (player->mo->height / 2)); + mobj->angle = momentumAngle + ANGLE_90; + P_SetScale(mobj, 3 * player->mo->scale / 2); + + mobj->renderflags &= ~RF_DONTDRAW; + + // No stored boost + if (player->sliptideZip == 0) + { + mobj->renderflags |= RF_DONTDRAW; + mobj->frame = 7; + return; + } + + UINT32 chargeFrame = 7 - min(7, player->sliptideZip / 10); + UINT32 decayFrame = min(7, player->sliptideZipDelay / 5); + if (max(chargeFrame, decayFrame) > mobj->frame) + mobj->frame++; + else if (max(chargeFrame, decayFrame) < mobj->frame) + mobj->frame--; + + CONS_Printf("%d/%d\n", chargeFrame, decayFrame); + + mobj->renderflags &= ~RF_TRANSMASK; + mobj->renderflags |= RF_PAPERSPRITE; + + if (!K_Sliptiding(player) && player->drift == 0) + { + // Decay timer's ticking + mobj->rollangle += 3*ANG30/4; + if (leveltime % 2 == 0) + mobj->renderflags |= RF_TRANS50; + } + else + { + // Storing boost + mobj->rollangle += 3*ANG15/4; + } +} + static boolean K_LastTumbleBounceCondition(player_t *player) { return (player->tumbleBounces > TUMBLEBOUNCES && player->tumbleHeight < 60); @@ -8129,6 +8219,8 @@ void K_KartPlayerAfterThink(player_t *player) K_UpdateStumbleIndicator(player); + K_UpdateSliptideZipIndicator(player); + // Move held objects (Bananas, Orbinaut, etc) K_MoveHeldObjects(player); @@ -9239,13 +9331,14 @@ static void K_KartDrift(player_t *player, boolean onground) if (!K_Sliptiding(player)) { - if (player->sliptideZip > 0) + if (player->sliptideZip > 0 && player->drift == 0) { player->sliptideZipDelay++; if (player->sliptideZipDelay > TICRATE && player->drift == 0) { S_StartSound(player->mo, sfx_s3kb6); player->sliptideZipBoost += player->sliptideZip; + K_SpawnDriftBoostExplosion(player, 0); player->sliptideZip = 0; player->sliptideZipDelay = 0; } @@ -9703,6 +9796,9 @@ static void K_KartSpindashWind(mobj_t *parent) P_SetTarget(&wind->target, parent); + if (parent->player && parent->player->sliptideZipBoost) + P_SetScale(wind, wind->scale * 2); + if (parent->momx || parent->momy) wind->angle = R_PointToAngle2(0, 0, parent->momx, parent->momy); else @@ -9778,6 +9874,11 @@ static void K_KartSpindash(player_t *player) K_KartSpindashWind(player->mo); } + if ((player->sliptideZipBoost > 0) && (spawnWind == true)) + { + K_KartSpindashWind(player->mo); + } + if (player->spindashboost > (TICRATE/2)) { K_KartSpindashDust(player->mo); diff --git a/src/k_kart.h b/src/k_kart.h index 04610be45..3409bb5d2 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -99,6 +99,7 @@ angle_t K_StumbleSlope(angle_t angle, angle_t pitch, angle_t roll); void K_StumblePlayer(player_t *player); boolean K_CheckStumble(player_t *player, angle_t oldPitch, angle_t oldRoll, boolean fromAir); void K_InitStumbleIndicator(player_t *player); +void K_InitSliptideZipIndicator(player_t *player); void K_UpdateStumbleIndicator(player_t *player); INT32 K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source); void K_DebtStingPlayer(player_t *player, mobj_t *source); diff --git a/src/p_mobj.c b/src/p_mobj.c index 8fe24ffed..00bd35fa5 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -11794,6 +11794,8 @@ void P_SpawnPlayer(INT32 playernum) K_InitStumbleIndicator(p); + K_InitSliptideZipIndicator(p); + if (gametyperules & GTR_ITEMARROWS) { mobj_t *overheadarrow = P_SpawnMobj(mobj->x, mobj->y, mobj->z + mobj->height + 16*FRACUNIT, MT_PLAYERARROW);