From bb6a5662c2610726ebe7606f77fa7128ba3787d1 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Tue, 14 Jul 2020 18:45:45 -0400 Subject: [PATCH 1/6] Fixing RocketSneakers New function specifically for dropping rocketsneakers K_DropRocketSneaker Used by Eggbox touchspecial to properly dispose of shoes and clean up hnext Now also used by the shoe thinker to drop themselves Fixes angle of spent shoe launch --- src/k_kart.c | 36 ++++++++++++++++++++++++++++++++++++ src/k_kart.h | 1 + src/p_inter.c | 3 +++ src/p_mobj.c | 13 +------------ 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index cc5504bb4..5d4ffe3f9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3870,6 +3870,42 @@ void K_DropItems(player_t *player) K_StripItems(player); } +void K_DropRocketSneaker(player_t *player) +{ + mobj_t *shoe = player->mo; + fixed_t flingangle; + boolean leftshoe = true; //left shoie is first + while ((shoe = shoe->hnext) && !P_MobjWasRemoved(shoe)) + { + shoe->flags2 &= ~MF2_DONTDRAW; + shoe->flags &= ~MF_NOGRAVITY; + shoe->angle += ANGLE_45; + + if (shoe->eflags & MFE_VERTICALFLIP) + shoe->z -= shoe->height; + else + shoe->z += shoe->height; + + //left shoe goes off tot eh left, right shoe off to the right + if (leftshoe) + flingangle = -(ANG60); + else + flingangle = ANG60; + + S_StartSound(shoe, shoe->info->deathsound); + P_SetObjectMomZ(shoe, 8*FRACUNIT, false); + P_InstaThrust(shoe, R_PointToAngle2(shoe->target->x, shoe->target->y, shoe->x, shoe->y)+flingangle, 16*FRACUNIT); + shoe->momx += shoe->target->momx; + shoe->momy += shoe->target->momy; + shoe->momz += shoe->target->momz; + shoe->extravalue2 = 1; + + leftshoe = false; + } + P_SetTarget(&player->mo->hnext, NULL); + player->kartstuff[k_rocketsneakertimer] = 0; +} + // When an item in the hnext chain dies. void K_RepairOrbitChain(mobj_t *orbit) { diff --git a/src/k_kart.h b/src/k_kart.h index 2ba5d1bdc..93edda8ea 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -55,6 +55,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue); INT32 K_GetKartDriftSparkValue(player_t *player); void K_KartUpdatePosition(player_t *player); void K_DropItems(player_t *player); +void K_DropRocketSneaker(player_t *player); void K_StripItems(player_t *player); void K_StripOther(player_t *player); void K_MomentumToFacing(player_t *player); diff --git a/src/p_inter.c b/src/p_inter.c index abb12811e..54fe01030 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -408,6 +408,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } else { + if (player->kartstuff[k_rocketsneakertimer]) + K_DropRocketSneaker(player); + K_DropItems(player); //K_StripItems(player); //K_StripOther(player); player->kartstuff[k_itemroulette] = 1; diff --git a/src/p_mobj.c b/src/p_mobj.c index f7f2afe34..82a003a0e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8312,18 +8312,7 @@ void P_MobjThinker(mobj_t *mobj) if (!mobj->extravalue2) { - if (mobj->eflags & MFE_VERTICALFLIP) - mobj->z -= mobj->height; - else - mobj->z += mobj->height; - - S_StartSound(mobj, mobj->info->deathsound); - P_SetObjectMomZ(mobj, 8*FRACUNIT, false); - P_InstaThrust(mobj, R_PointToAngle2(mobj->target->x, mobj->target->y, mobj->x, mobj->y)+ANGLE_90, 16*FRACUNIT); - mobj->momx += mobj->target->momx; - mobj->momy += mobj->target->momy; - mobj->momz += mobj->target->momz; - mobj->extravalue2 = 1; + K_DropRocketSneaker(mobj->target->player); } else if (P_IsObjectOnGround(mobj)) { From fef23cf7799d81d7b7d44330523a88ccef294612 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Tue, 14 Jul 2020 19:45:15 -0400 Subject: [PATCH 2/6] Some safeguards for K_DropRocketSneaker usage --- src/k_kart.c | 6 ++++++ src/p_inter.c | 4 +--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 5d4ffe3f9..ea80d65c5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3872,11 +3872,17 @@ void K_DropItems(player_t *player) void K_DropRocketSneaker(player_t *player) { + if (!(player->mo && !P_MobjWasRemoved(player->mo) && player->mo->hnext && !P_MobjWasRemoved(player->mo->hnext))) + return; + mobj_t *shoe = player->mo; fixed_t flingangle; boolean leftshoe = true; //left shoie is first while ((shoe = shoe->hnext) && !P_MobjWasRemoved(shoe)) { + if (shoe->type != MT_ROCKETSNEAKER) + return; //woah, not a rocketsneaker, bail! safeguard in case this gets used when you're holding non-rocketsneakers + shoe->flags2 &= ~MF2_DONTDRAW; shoe->flags &= ~MF_NOGRAVITY; shoe->angle += ANGLE_45; diff --git a/src/p_inter.c b/src/p_inter.c index 54fe01030..2a781d0a4 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -408,9 +408,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } else { - if (player->kartstuff[k_rocketsneakertimer]) - K_DropRocketSneaker(player); - + K_DropRocketSneaker(player); K_DropItems(player); //K_StripItems(player); //K_StripOther(player); player->kartstuff[k_itemroulette] = 1; From f60b6c881d3a741fb745570510c6e4351dc75d63 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Tue, 14 Jul 2020 19:50:37 -0400 Subject: [PATCH 3/6] Properly handle rocket sneakers when shrinking --- src/k_kart.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/k_kart.c b/src/k_kart.c index ea80d65c5..5ad368ce7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3577,6 +3577,7 @@ static void K_DoShrink(player_t *user) && !players[i].kartstuff[k_hyudorotimer]) { // Start shrinking! + K_DropRocketSneaker(&players[i]); //Make sure we handle this K_DropItems(&players[i]); players[i].kartstuff[k_growshrinktimer] = -(20*TICRATE); From f4d648526dc67cc76eb75f54340186eb3e9292ab Mon Sep 17 00:00:00 2001 From: Ashnal Date: Wed, 15 Jul 2020 09:17:35 -0400 Subject: [PATCH 4/6] Moved K_DropRocketSneaker call into K_StripItems This should catch when DropHnextList misses it Should probably fix sinks too ... --- src/k_kart.c | 3 +-- src/p_inter.c | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 5ad368ce7..5c4a00757 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3577,7 +3577,6 @@ static void K_DoShrink(player_t *user) && !players[i].kartstuff[k_hyudorotimer]) { // Start shrinking! - K_DropRocketSneaker(&players[i]); //Make sure we handle this K_DropItems(&players[i]); players[i].kartstuff[k_growshrinktimer] = -(20*TICRATE); @@ -5242,7 +5241,7 @@ void K_StripItems(player_t *player) player->kartstuff[k_itemamount] = 0; player->kartstuff[k_itemheld] = 0; - player->kartstuff[k_rocketsneakertimer] = 0; + K_DropRocketSneaker(player); if (!player->kartstuff[k_itemroulette] || player->kartstuff[k_roulettetype] != 2) { diff --git a/src/p_inter.c b/src/p_inter.c index 2a781d0a4..abb12811e 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -408,7 +408,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } else { - K_DropRocketSneaker(player); K_DropItems(player); //K_StripItems(player); //K_StripOther(player); player->kartstuff[k_itemroulette] = 1; From 8c5e725a8d81fb8b9ff0ead166d5838df67ae4a1 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Thu, 23 Jul 2020 20:12:35 -0400 Subject: [PATCH 5/6] Also lets do this for kitchen sinks They also ignored in K_DropHnextList --- src/k_kart.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 5c4a00757..a53372330 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3877,7 +3877,7 @@ void K_DropRocketSneaker(player_t *player) mobj_t *shoe = player->mo; fixed_t flingangle; - boolean leftshoe = true; //left shoie is first + boolean leftshoe = true; //left shoe is first while ((shoe = shoe->hnext) && !P_MobjWasRemoved(shoe)) { if (shoe->type != MT_ROCKETSNEAKER) @@ -3912,6 +3912,19 @@ void K_DropRocketSneaker(player_t *player) player->kartstuff[k_rocketsneakertimer] = 0; } +void K_DropKitchenSink(player_t *player) +{ + if (!(player->mo && !P_MobjWasRemoved(player->mo) && player->mo->hnext && !P_MobjWasRemoved(player->mo->hnext))) + return; + + if (player->mo->hnext->type != MT_SINK_SHIELD) + return; //so we can just call this function regardless of what is being held + + P_KillMobj(player->mo->hnext, NULL, NULL); + + P_SetTarget(&player->mo->hnext, NULL); +} + // When an item in the hnext chain dies. void K_RepairOrbitChain(mobj_t *orbit) { @@ -5237,12 +5250,12 @@ void K_KartUpdatePosition(player_t *player) // void K_StripItems(player_t *player) { + K_DropRocketSneaker(player); + K_DropKitchenSink(player); player->kartstuff[k_itemtype] = KITEM_NONE; player->kartstuff[k_itemamount] = 0; player->kartstuff[k_itemheld] = 0; - K_DropRocketSneaker(player); - if (!player->kartstuff[k_itemroulette] || player->kartstuff[k_roulettetype] != 2) { player->kartstuff[k_itemroulette] = 0; From 96e098b451001e5a9423e85721338145d1c72ea8 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Thu, 23 Jul 2020 21:05:00 -0400 Subject: [PATCH 6/6] Appease C91 --- src/k_kart.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index a53372330..01531a8b0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3872,12 +3872,13 @@ void K_DropItems(player_t *player) void K_DropRocketSneaker(player_t *player) { - if (!(player->mo && !P_MobjWasRemoved(player->mo) && player->mo->hnext && !P_MobjWasRemoved(player->mo->hnext))) - return; - mobj_t *shoe = player->mo; fixed_t flingangle; boolean leftshoe = true; //left shoe is first + + if (!(player->mo && !P_MobjWasRemoved(player->mo) && player->mo->hnext && !P_MobjWasRemoved(player->mo->hnext))) + return; + while ((shoe = shoe->hnext) && !P_MobjWasRemoved(shoe)) { if (shoe->type != MT_ROCKETSNEAKER)