mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Steal bumpers from other players on any hit
This commit is contained in:
parent
6c2884b7d6
commit
81a3a1c108
5 changed files with 90 additions and 72 deletions
|
|
@ -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();
|
||||
|
|
|
|||
97
src/k_kart.c
97
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.
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
16
src/p_map.c
16
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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue