Steal bumpers from other players on any hit

This commit is contained in:
Sally Coolatta 2020-10-24 09:18:28 -04:00
parent 6c2884b7d6
commit 81a3a1c108
5 changed files with 90 additions and 72 deletions

View file

@ -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();

View file

@ -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.

View file

@ -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);

View file

@ -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))

View file

@ -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);