From 475524e7ad9e35504ba92560bb5fecbc40751a89 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Tue, 25 Feb 2025 11:40:25 -0500 Subject: [PATCH] Add shield sounds and rework bubbleshield BS now only has two defend / attack uses, trap gives less height and you can dropdash from the trap --- src/d_player.h | 1 + src/k_collide.c | 30 +++++++++++++++++++++++++++++- src/k_hud.c | 6 ++++++ src/k_kart.c | 18 ++++++++++++++---- src/p_inter.c | 1 + src/p_mobj.c | 9 ++++++--- src/p_saveg.c | 2 ++ 7 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 19b1e09a0..d6175e3c9 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -610,6 +610,7 @@ struct player_t UINT8 curshield; // see kartshields_t UINT8 bubblecool; // Bubble Shield use cooldown UINT8 bubbleblowup; // Bubble Shield usage blowup + UINT8 bubblepop; // Bubble Shield usage count UINT16 flamedash; // Flame Shield dash power UINT16 flamemeter; // Flame Shield dash meter left UINT8 flamelength; // Flame Shield dash meter, number of segments diff --git a/src/k_collide.c b/src/k_collide.c index f5bb39457..fbdf2ed69 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -734,6 +734,20 @@ boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2) // Player Damage P_DamageMobj(t2, ((t1->type == MT_BUBBLESHIELD) ? t1->target : t1), t1, 1, DMG_NORMAL); + + if (t1->target->player) + { + player_t *player = t1->target->player; + + player->bubblepop++; + + if (player->bubblepop > 1) + { + K_DropHnextList(player, false); + player->bubblepop = 0; + } + } + S_StartSound(t1, sfx_s3k44); } else @@ -753,7 +767,21 @@ boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2) } if (t2->type == MT_JAWZ) P_SetTarget(&t2->tracer, t2->target); // Back to the source! - t2->threshold = 10; + + if (t1->target->player) + { + player_t *player = t1->target->player; + + player->bubblepop++; + + if (player->bubblepop > 1) + { + K_DropHnextList(player, false); + player->bubblepop = 0; + } + } + + t2->threshold = 20; S_StartSound(t1, sfx_s3k44); } } diff --git a/src/k_hud.c b/src/k_hud.c index 013b9f6ea..d7b0a11bb 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -1000,6 +1000,12 @@ static void K_drawKartItem(void) else localpatch = kp_nodraw; } + else if (stplyr->curshield == KSHIELD_BUBBLE) + { + localpatch = kp_bubbleshield[offset]; + itembar = 2 - stplyr->bubblepop; + maxl = 2; + } else if (stplyr->sadtimer > 0) { if (leveltime & 2) diff --git a/src/k_kart.c b/src/k_kart.c index bdfa19f74..e5cd00e1f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5302,9 +5302,17 @@ void K_DropHnextList(player_t *player, boolean keepshields) if (shield != KSHIELD_NONE && !keepshields) { - if (shield == KSHIELD_THUNDER) + switch (shield) { - K_DoThunderShield(player); + case KSHIELD_THUNDER: + K_DoThunderShield(player); + break; + case KSHIELD_BUBBLE: + S_StartSound(player->mo, sfx_s3k4b); + break; + case KSHIELD_FLAME: + S_StartSound(player->mo, sfx_s3k37); + break; } player->curshield = KSHIELD_NONE; @@ -9528,7 +9536,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->flamedash == 0) { - S_StartSound(player->mo, sfx_s3k43); + S_StartSound(player->mo, sfx_s3k48); K_PlayBoostTaunt(player->mo); } @@ -9547,9 +9555,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { P_Thrust( player->mo, player->mo->angle, - FixedMul((50*player->mo->scale), K_GetKartGameSpeedScalar(gamespeed)) + FixedMul((25*player->mo->scale), K_GetKartGameSpeedScalar(gamespeed)) ); + S_StartSound(player->mo, sfx_s3k47); + player->flamemeter = 0; player->flamelength = 0; player->itemflags &= ~IF_HOLDREADY; diff --git a/src/p_inter.c b/src/p_inter.c index 46963dc7a..0da52a23d 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2227,6 +2227,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (!((damagetype & DMG_NORMAL) || (damagetype & DMG_WIPEOUT))) player->sneakertimer = 0; player->driftboost = 0; + player->bubblepop = 0; player->ringboost = 0; player->glanceDir = 0; player->pflags &= ~PF_GAINAX; diff --git a/src/p_mobj.c b/src/p_mobj.c index 997d9db17..94bd091c8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8182,7 +8182,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->momz = 0; mobj->destscale = ((5*mobj->tracer->scale)>>2) + (mobj->tracer->scale>>3); - mobj->tracer->momz = (8*mobj->tracer->scale) * P_MobjFlip(mobj->tracer); + mobj->tracer->momz = (5*mobj->tracer->scale) * P_MobjFlip(mobj->tracer); mobj->tracer->momx = (31*mobj->tracer->momx)/32; mobj->tracer->momy = (31*mobj->tracer->momy)/32; @@ -8213,14 +8213,17 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->tracer->y + P_ReturnThrustY(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->z - (4*mobj->tracer->scale) + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<movecount > 4*TICRATE) + if (mobj->movecount > 5*TICRATE) { S_StartSound(mobj->tracer, sfx_s3k77); mobj->tracer->flags &= ~MF_NOGRAVITY; P_KillMobj(mobj, mobj->tracer, mobj->tracer, DMG_NORMAL); + player->respawn = 1; + break; } + // Uses cmd.turning over steering intentionally. if (abs(player->cmd.turning) > 100) { INT32 lastsign = 0; @@ -8232,7 +8235,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if ((player->cmd.turning > 0 && lastsign < 0) || (player->cmd.turning < 0 && lastsign > 0)) { - mobj->movecount += (TICRATE/2); + mobj->movecount += (TICRATE/4); mobj->cvmem = 8*lastsign; S_StartSound(mobj, sfx_s3k7a); } diff --git a/src/p_saveg.c b/src/p_saveg.c index d7879aa6d..01c2b1b0b 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -303,6 +303,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].curshield); WRITEUINT8(save->p, players[i].bubblecool); WRITEUINT8(save->p, players[i].bubbleblowup); + WRITEUINT8(save->p, players[i].bubblepop); WRITEUINT16(save->p, players[i].flamedash); WRITEUINT16(save->p, players[i].flamemeter); WRITEUINT8(save->p, players[i].flamelength); @@ -604,6 +605,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].curshield = READUINT8(save->p); players[i].bubblecool = READUINT8(save->p); players[i].bubbleblowup = READUINT8(save->p); + players[i].bubblepop = READUINT8(save->p); players[i].flamedash = READUINT16(save->p); players[i].flamemeter = READUINT16(save->p); players[i].flamelength = READUINT8(save->p);