From 81a3a1c108124adead1d31440532d3bb9d1e87f8 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sat, 24 Oct 2020 09:18:28 -0400 Subject: [PATCH] Steal bumpers from other players on any hit --- src/d_netcmd.c | 4 +-- src/k_kart.c | 97 +++++++++++++++++++++++++++++--------------------- src/k_kart.h | 6 ++-- src/p_inter.c | 39 +++++++++++--------- src/p_map.c | 16 ++++----- 5 files changed, 90 insertions(+), 72 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 6e5d245da..1b0806832 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -4310,15 +4310,13 @@ static void TimeLimit_OnChange(void) if (cv_timelimit.value != 0) { - CONS_Printf(M_GetText("Levels will end after %d minute%s.\n"),cv_timelimit.value,cv_timelimit.value == 1 ? "" : "s"); // Graue 11-17-2003 + CONS_Printf(M_GetText("Rounds will end after %d minute%s.\n"),cv_timelimit.value,cv_timelimit.value == 1 ? "" : "s"); // Graue 11-17-2003 timelimitintics = cv_timelimit.value * (60*TICRATE); // Note the deliberate absence of any code preventing // pointlimit and timelimit from being set simultaneously. // Some people might like to use them together. It works. } - else if (netgame || multiplayer) - CONS_Printf(M_GetText("Time limit disabled\n")); #ifdef HAVE_DISCORDRPC DRPC_UpdatePresence(); diff --git a/src/k_kart.c b/src/k_kart.c index f7954307e..6e3d11a9a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1036,7 +1036,7 @@ fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against) return FixedMul(weight, mobj->scale); } -void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) +boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) { mobj_t *fx; fixed_t momdifx, momdify; @@ -1045,16 +1045,16 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) fixed_t mass1, mass2; if (!mobj1 || !mobj2) - return; + return false; // Don't bump when you're being reborn if ((mobj1->player && mobj1->player->playerstate != PST_LIVE) || (mobj2->player && mobj2->player->playerstate != PST_LIVE)) - return; + return false; if ((mobj1->player && mobj1->player->respawn.state != RESPAWNST_NONE) || (mobj2->player && mobj2->player->respawn.state != RESPAWNST_NONE)) - return; + return false; { // Don't bump if you're flashing INT32 flash; @@ -1064,7 +1064,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) { if (mobj1->player->powers[pw_flashing] < flash-1) mobj1->player->powers[pw_flashing]++; - return; + return false; } flash = K_GetKartFlashing(mobj2->player); @@ -1072,7 +1072,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) { if (mobj2->player->powers[pw_flashing] < flash-1) mobj2->player->powers[pw_flashing]++; - return; + return false; } } @@ -1080,13 +1080,13 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) if (mobj1->player && mobj1->player->kartstuff[k_justbumped]) { mobj1->player->kartstuff[k_justbumped] = bumptime; - return; + return false; } if (mobj2->player && mobj2->player->kartstuff[k_justbumped]) { mobj2->player->kartstuff[k_justbumped] = bumptime; - return; + return false; } mass1 = K_GetMobjWeight(mobj1, mobj2); @@ -1104,8 +1104,10 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) disty = (mobj1->y + mobj2->momy*3) - (mobj2->y + mobj1->momy*3); if (distx == 0 && disty == 0) + { // if there's no distance between the 2, they're directly on top of each other, don't run this - return; + return false; + } { // Normalize distance to the sum of the two objects' radii, since in a perfect world that would be the distance at the point of collision... fixed_t dist = P_AproxDistance(distx, disty); @@ -1142,7 +1144,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) if (dot >= 0) { // They're moving away from each other - return; + return false; } force = FixedDiv(dot, FixedMul(distx, distx)+FixedMul(disty, disty)); @@ -1233,6 +1235,8 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) P_PlayerRingBurst(mobj2->player, 1); } } + + return true; } /** \brief Checks that the player is on an offroad subsector for realsies. Also accounts for line riding to prevent cheese. @@ -2413,11 +2417,14 @@ void K_BattleHitPlayer(player_t *player, player_t *victim, UINT8 points, boolean } } -void K_RemoveBumper(player_t *player, mobj_t *inflictor, mobj_t *source) +void K_RemoveBumper(player_t *player, mobj_t *inflictor, mobj_t *source, UINT8 amount) { UINT8 score = 1; boolean trapitem = false; + if (amount <= 0) + return; + if (!(gametyperules & GTR_BUMPERS)) return; @@ -2436,7 +2443,7 @@ void K_RemoveBumper(player_t *player, mobj_t *inflictor, mobj_t *source) { if (K_IsPlayerWanted(player)) score = 3; - else if ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] == 1) + else if ((gametyperules & GTR_BUMPERS) && (player->kartstuff[k_bumper] <= amount)) score = 2; } @@ -2447,7 +2454,7 @@ void K_RemoveBumper(player_t *player, mobj_t *inflictor, mobj_t *source) if (player->kartstuff[k_bumper] > 0) { - if (player->kartstuff[k_bumper] == 1) + if (player->kartstuff[k_bumper] <= amount) { mobj_t *karmahitbox = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_KARMAHITBOX); // Player hitbox is too small!! P_SetTarget(&karmahitbox->target, player->mo); @@ -2456,14 +2463,15 @@ void K_RemoveBumper(player_t *player, mobj_t *inflictor, mobj_t *source) CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]); } - player->kartstuff[k_bumper]--; + player->kartstuff[k_bumper] -= amount; if (K_IsPlayerWanted(player)) K_CalculateBattleWanted(); } - if (player->kartstuff[k_bumper] == 0) + if (player->kartstuff[k_bumper] <= 0) { + player->kartstuff[k_bumper] = 0; player->kartstuff[k_comebacktimer] = comebacktime; if (player->kartstuff[k_comebackmode] == 2) @@ -2587,59 +2595,68 @@ void K_DebtStingPlayer(player_t *player, mobj_t *source) P_SetPlayerMobjState(player->mo, S_KART_SPINOUT); } -void K_StealBumper(player_t *player, player_t *victim) +void K_StealBumper(player_t *player, player_t *victim, UINT8 amount) { + INT32 intendedamount = player->kartstuff[k_bumper] + amount; INT32 newbumper; angle_t newangle, diff; fixed_t newx, newy; mobj_t *newmo; + if (amount <= 0) + return; + if (!(gametyperules & GTR_BUMPERS)) return; if (netgame && player->kartstuff[k_bumper] <= 0) CONS_Printf(M_GetText("%s is back in the game!\n"), player_names[player-players]); - newbumper = player->kartstuff[k_bumper]; - if (newbumper <= 1) - diff = 0; - else - diff = FixedAngle(360*FRACUNIT/newbumper); + while (player->kartstuff[k_bumper] < intendedamount) + { + newbumper = player->kartstuff[k_bumper]; + if (newbumper <= 1) + diff = 0; + else + diff = FixedAngle(360*FRACUNIT/newbumper); - newangle = player->mo->angle; - newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT); - newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + newangle = player->mo->angle; + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT); - newmo = P_SpawnMobj(newx, newy, player->mo->z, MT_BATTLEBUMPER); - newmo->threshold = newbumper; - P_SetTarget(&newmo->tracer, victim->mo); - P_SetTarget(&newmo->target, player->mo); - newmo->angle = (diff * (newbumper-1)); - newmo->color = victim->skincolor; + newmo = P_SpawnMobj(newx, newy, player->mo->z, MT_BATTLEBUMPER); + newmo->threshold = newbumper; + P_SetTarget(&newmo->tracer, victim->mo); + P_SetTarget(&newmo->target, player->mo); + newmo->angle = (diff * (newbumper-1)); + newmo->color = victim->skincolor; - if (newbumper+1 < 2) - P_SetMobjState(newmo, S_BATTLEBUMPER3); - else if (newbumper+1 < 3) - P_SetMobjState(newmo, S_BATTLEBUMPER2); - else - P_SetMobjState(newmo, S_BATTLEBUMPER1); + if (newbumper+1 < 2) + P_SetMobjState(newmo, S_BATTLEBUMPER3); + else if (newbumper+1 < 3) + P_SetMobjState(newmo, S_BATTLEBUMPER2); + else + P_SetMobjState(newmo, S_BATTLEBUMPER1); + + player->kartstuff[k_bumper]++; + } S_StartSound(player->mo, sfx_3db06); - player->kartstuff[k_bumper]++; player->kartstuff[k_comebackpoints] = 0; player->powers[pw_flashing] = K_GetKartFlashing(player); player->kartstuff[k_comebacktimer] = comebacktime; - /*victim->powers[pw_flashing] = K_GetKartFlashing(victim); - victim->kartstuff[k_comebacktimer] = comebacktime;*/ + /* + victim->powers[pw_flashing] = K_GetKartFlashing(victim); + victim->kartstuff[k_comebacktimer] = comebacktime; + */ victim->kartstuff[k_instashield] = 15; if (cv_kartdebughuddrop.value && !modeattacking) K_DropItems(victim); else K_DropHnextList(victim, false); - return; } // source is the mobj that originally threw the bomb that exploded etc. diff --git a/src/k_kart.h b/src/k_kart.h index d45a69570..2d682511a 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -27,7 +27,7 @@ UINT8 K_FindUseodds(player_t *player, fixed_t mashed, UINT32 pdis, UINT8 bestbum INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean spbrush, boolean bot, boolean rival); INT32 K_GetShieldFromItem(INT32 item); fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against); -void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid); +boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid); void K_KartPainEnergyFling(player_t *player); void K_FlipFromObject(mobj_t *mo, mobj_t *master); void K_MatchGenericExtraFlags(mobj_t *mo, mobj_t *master); @@ -41,12 +41,12 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_KartPlayerAfterThink(player_t *player); void K_DoInstashield(player_t *player); void K_BattleHitPlayer(player_t *player, player_t *victim, UINT8 points, boolean reducewanted); -void K_RemoveBumper(player_t *player, mobj_t *inflictor, mobj_t *source); +void K_RemoveBumper(player_t *player, mobj_t *inflictor, mobj_t *source, UINT8 amount); void K_SpinPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 type); void K_SquishPlayer(player_t *player, mobj_t *inflictor, mobj_t *source); void K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source); void K_DebtStingPlayer(player_t *player, mobj_t *source); -void K_StealBumper(player_t *player, player_t *victim); +void K_StealBumper(player_t *player, player_t *victim, UINT8 amount); void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit, mobj_t *source); void K_SpawnMineExplosion(mobj_t *source, UINT8 color); UINT16 K_DriftSparkColor(player_t *player, INT32 charge); diff --git a/src/p_inter.c b/src/p_inter.c index b610ec692..6fd7d28c1 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -349,7 +349,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->target->player->kartstuff[k_comebackpoints]++; if (special->target->player->kartstuff[k_comebackpoints] >= 2) - K_StealBumper(special->target->player, player); + K_StealBumper(special->target->player, player, 1); special->target->player->kartstuff[k_comebacktimer] = comebacktime; player->kartstuff[k_itemroulette] = 1; @@ -384,7 +384,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->target->player->karthud[khud_yougotem] = 2*TICRATE; if (special->target->player->kartstuff[k_comebackpoints] >= 2) - K_StealBumper(special->target->player, player); + K_StealBumper(special->target->player, player, 1); special->target->player->kartstuff[k_comebacktimer] = comebacktime; @@ -726,7 +726,7 @@ void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost) } // Easily make it so that overtime works offline -//#define TESTOVERTIMEINFREEPLAY +#define TESTOVERTIMEINFREEPLAY /** Checks if the level timer is over the timelimit and the round should end, * unless you are in overtime. In which case leveltime may stretch out beyond @@ -1661,12 +1661,11 @@ static boolean P_KillPlayer(player_t *player, UINT8 type) return false; } - K_RemoveBumper(player, NULL, NULL); - switch (type) { case DMG_DEATHPIT: // Respawn kill types + K_RemoveBumper(player, NULL, NULL, 1); K_DoIngameRespawn(player); return false; default: @@ -1674,12 +1673,11 @@ static boolean P_KillPlayer(player_t *player, UINT8 type) break; } + K_RemoveBumper(player, NULL, NULL, player->kartstuff[k_bumper]); + player->pflags &= ~PF_SLIDING; player->powers[pw_carry] = CR_NONE; - // Get rid of shield - player->powers[pw_shield] = SH_NONE; - player->mo->color = player->skincolor; player->mo->colorized = false; @@ -1692,7 +1690,7 @@ static boolean P_KillPlayer(player_t *player, UINT8 type) P_SetPlayerMobjState(player->mo, player->mo->info->deathstate); - if (type == DMG_TIMEOVER) + if ((type == DMG_TIMEOVER) && (gametype == GT_RACE)) { mobj_t *boom; @@ -1851,7 +1849,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { if (gametyperules & GTR_BUMPERS) { - if ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1) + if ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || (player->kartstuff[k_comebackmode] == 1)) { // No bumpers, can't be hurt K_DoInstashield(player); @@ -1889,17 +1887,20 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da // We successfully hit 'em! if (type != DMG_STING) { + UINT8 bumpadd = 1; + + if (damagetype & DMG_STEAL) + { + bumpadd = 2; + } + if (source && source != player->mo && source->player) { K_PlayHitEmSound(source); - - if (damagetype & DMG_STEAL) - { - K_StealBumper(source->player, player); - } + K_StealBumper(source->player, player, bumpadd); } - K_RemoveBumper(player, inflictor, source); + K_RemoveBumper(player, inflictor, source, bumpadd); } player->kartstuff[k_sneakertimer] = player->kartstuff[k_numsneakers] = 0; @@ -1930,11 +1931,17 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da } if (type != DMG_STING) + { player->powers[pw_flashing] = K_GetKartFlashing(player); + } P_PlayRinglossSound(player->mo); + if (ringburst > 0) + { P_PlayerRingBurst(player, ringburst); + } + K_PlayPainSound(player->mo); if ((type == DMG_EXPLODE) || (cv_kartdebughuddrop.value && !modeattacking)) diff --git a/src/p_map.c b/src/p_map.c index 10f048e77..4a33b5427 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1322,17 +1322,13 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player->kartstuff[k_pogospring]) P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT|DMG_STEAL); } - - if ((gametyperules & GTR_BUMPERS)) + else if (thing->player->kartstuff[k_sneakertimer] && !(tmthing->player->kartstuff[k_sneakertimer]) && !(thing->player->powers[pw_flashing])) // Don't steal bumpers while intangible { - if (thing->player->kartstuff[k_sneakertimer] && !(tmthing->player->kartstuff[k_sneakertimer]) && !(thing->player->powers[pw_flashing])) // Don't steal bumpers while intangible - { - P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT|DMG_STEAL); - } - else if (tmthing->player->kartstuff[k_sneakertimer] && !(thing->player->kartstuff[k_sneakertimer]) && !(tmthing->player->powers[pw_flashing])) - { - P_DamageMobj(thing, tmthing, tmthing, 1, DMG_WIPEOUT|DMG_STEAL); - } + P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT|DMG_STEAL); + } + else if (tmthing->player->kartstuff[k_sneakertimer] && !(thing->player->kartstuff[k_sneakertimer]) && !(tmthing->player->powers[pw_flashing])) + { + P_DamageMobj(thing, tmthing, tmthing, 1, DMG_WIPEOUT|DMG_STEAL); } K_KartBouncing(mo1, mo2, zbounce, false);