From a68eb5146537332008d2a1bc9d08a74e7e6a2075 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Wed, 26 Mar 2025 09:29:05 -0400 Subject: [PATCH] stacking part 5: Implement stacking visual --- src/info/mobjs.h | 2 ++ src/info/sprites.h | 2 ++ src/info/states.h | 2 ++ src/k_kart.c | 34 ++++++++++++++++------------------ src/p_mobj.c | 28 ++++++++++++++++++++++++++-- 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/src/info/mobjs.h b/src/info/mobjs.h index 420089a39..5a4646cfa 100644 --- a/src/info/mobjs.h +++ b/src/info/mobjs.h @@ -1058,6 +1058,8 @@ _(TUMBLECOIN) _(KARMAFIREWORK) _(GAINAX) +_(BOOSTSTACK) + _(FOLLOWER) _(FOLLOWERBUBBLE_FRONT) _(FOLLOWERBUBBLE_BACK) diff --git a/src/info/sprites.h b/src/info/sprites.h index 55922f37c..718540c9c 100644 --- a/src/info/sprites.h +++ b/src/info/sprites.h @@ -715,6 +715,8 @@ _(WTRU) // Water Trail Underlay _(GCHA) // follower: generic chao _(CHEZ) // follower: cheese +_(BSSS) // Stacking effect + _(TRCK) // First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw later diff --git a/src/info/states.h b/src/info/states.h index 4cfb6fb4e..ef8581667 100644 --- a/src/info/states.h +++ b/src/info/states.h @@ -4200,6 +4200,8 @@ _(GAINAX_HUGE) _(GAINAX_MID1) _(GAINAX_MID2) +_(BOOSTSTACK) + _(WAYPOINTORB) _(WAYPOINTSPLAT) _(EGOORB) diff --git a/src/k_kart.c b/src/k_kart.c index 5a96b65fd..6ecb25d65 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2301,6 +2301,17 @@ void K_SpawnInvincibilitySpeedLines(mobj_t *mo) fast->destscale = 6*((mo->player->invincibilitytimer/TICRATE)*FRACUNIT)/8; } +static void K_SpawnStackingEffect(player_t *player) +{ + // Thanks to 1ndev for code used for booststack->scale and boosttack->frame! (taken and modified from BoostStack) + mobj_t *booststack = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BOOSTSTACK); + P_SetTarget(&booststack->target, player->mo); + P_SetScale(booststack, FixedMul(FRACUNIT + FixedMul(2*FRACUNIT - FRACUNIT, FixedDiv(min(player->numboosts,4)*FRACUNIT, 4*FRACUNIT)), mapobjectscale)); + + booststack->angle = player->mo->angle + ANGLE_90; + booststack->color = player->mo->color; +} + void K_SpawnBumpEffect(mobj_t *mo) { mobj_t *fx = P_SpawnMobj(mo->x, mo->y, mo->z, MT_BUMP); @@ -7194,25 +7205,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } } - /*if (gametype == GT_RACE && player->rings <= 0 && (K_RingsActive() == true)) // spawn ring debt indicator + // Stacking Effect + if (stackingactive && player->numboosts > 1) { - mobj_t *debtflag = P_SpawnMobj(player->mo->x + player->mo->momx, player->mo->y + player->mo->momy, - player->mo->z + P_GetMobjZMovement(player->mo) + player->mo->height + (24*player->mo->scale), MT_THOK); - - P_SetMobjState(debtflag, S_RINGDEBT); - P_SetScale(debtflag, (debtflag->destscale = player->mo->scale)); - - K_MatchGenericExtraFlags(debtflag, player->mo); - debtflag->frame += (leveltime % 4); - - if ((leveltime/12) & 1) - debtflag->frame += 4; - - debtflag->color = player->skincolor; - debtflag->fuse = 2; - - debtflag->renderflags = K_GetPlayerDontDrawFlag(player); - }*/ + K_SpawnStackingEffect(player); + } } if (player->itemtype == KITEM_NONE) @@ -8812,6 +8809,7 @@ INT32 K_GetKartDriftSparkValueForStage(player_t *player, UINT8 stage) static void K_SpawnDriftEFX(player_t *player,SINT8 level) { mobj_t *overlay = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BOOSTFLAME); + P_SetMobjState(overlay, S_DRIFTBOOSTFLAME); P_SetTarget(&overlay->target, player->mo); P_SetScale(overlay, (overlay->destscale = player->mo->scale)); K_FlipFromObject(overlay, player->mo); diff --git a/src/p_mobj.c b/src/p_mobj.c index 799bcf73c..ee531b4ff 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7081,11 +7081,15 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->angle = mobj->extravalue1 && p ? p->drawangle : mobj->target->angle; P_MoveOrigin(mobj, mobj->target->x + P_ReturnThrustX(mobj, mobj->angle+ANGLE_180, mobj->target->radius), mobj->target->y + P_ReturnThrustY(mobj, mobj->angle+ANGLE_180, mobj->target->radius), mobj->target->z); + K_FlipFromObject(mobj, mobj->target); P_SetScale(mobj, mobj->target->scale); mobj->roll = mobj->target->roll; mobj->pitch = mobj->target->pitch; + mobj->sloperoll = mobj->target->sloperoll; + mobj->slopepitch = mobj->target->slopepitch; + if (p) { if (mobj->extravalue1) @@ -7129,7 +7133,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (mobj->extravalue1) { - if (leveltime % 2 == 1) { mobj->frame |= FF_TRANS60; @@ -7143,7 +7146,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj) { mobj->color = K_RainbowColor(leveltime); } - } if (mobj->state == &states[S_BOOSTSMOKESPAWNER]) @@ -7307,6 +7309,28 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } break; + case MT_BOOSTSTACK: + { + if (!mobj->target || P_MobjWasRemoved(mobj->target) || !mobj->target->health || (mobj->target->player && !mobj->target->player->numboosts)) + { + P_RemoveMobj(mobj); + return false; + } + + mobj->roll = mobj->target->roll; + mobj->pitch = mobj->target->pitch; + + mobj->sloperoll = mobj->target->sloperoll; + mobj->slopepitch = mobj->target->slopepitch; + + // Thx Indev! (taken and modified from BoostStack) + P_MoveOrigin(mobj, mobj->target->x + FixedMul(cos(mobj->target->angle), FixedMul(30*FRACUNIT, mapobjectscale)), mobj->target->y + FixedMul(sin(mobj->target->angle), FixedMul(30*FRACUNIT, mapobjectscale)), mobj->target->z); + K_FlipFromObject(mobj, mobj->target); + + // Leveltime based animation + mobj->frame = states[S_BOOSTSTACK].frame + (leveltime / 3) % 5; + break; + } case MT_THUNDERSHIELD: { if (!mobj->target || !mobj->target->health || !mobj->target->player