From f5650eba09fa10cf17701af88e53963ed2d33672 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 10 Dec 2017 20:57:46 -0500 Subject: [PATCH] Wipeout & minor tweaks - SMK-style wipeout - Using goldshroom removes some of its timer again - Karma item boxes follow the player more closely - "ATTACK OR PROTECT" no longer appears when you die if you've already seen it - Lua support for our SOC actions - Fixed KARTSTUFF_LIST for Lua/SOC - "Battle" is now an accepted word in level headers for setting TOL_MATCH - Default map numlaps is now 3 instead of 4 - Reverted making LF2_RECORDATTACK and LF2_NOVISITNEEDED default menu flags, needs to be set manually now --- src/d_player.h | 2 +- src/dehacked.c | 4 +++ src/doomstat.h | 1 + src/g_game.c | 5 ++++ src/info.c | 3 +- src/info.h | 1 + src/k_kart.c | 74 ++++++++++++++++++++++++++++++-------------------- src/k_kart.h | 2 +- src/p_enemy.c | 12 ++++++++ src/p_inter.c | 23 +++++++++++----- src/p_map.c | 4 +-- src/p_mobj.c | 12 +++++++- src/p_setup.c | 4 +-- src/p_user.c | 7 +++-- 14 files changed, 106 insertions(+), 48 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index ceb48440..83976f10 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -276,7 +276,7 @@ typedef enum k_goldshroomtimer, // Gold Mushroom duration timer k_startimer, // Invincibility timer k_spinouttimer, // Spin-out from a banana peel or oil slick (was "pw_bananacam") - //k_wipeouttimer, // Wipe-out from a shell, waits a short amount of time before making you stop and spinning out in place + k_wipeouttimer, // Wipe-out from a shell, waits a short amount of time before making you stop and spinning out in place k_laserwisptimer, // The duration and relative angle of the laser k_justbumped, // Prevent players from endlessly bumping into each other k_poweritemtimer, // Battle mode, how long before you're allowed another power item (Star, Megashroom) diff --git a/src/dehacked.c b/src/dehacked.c index c4c8fed9..6dc5beb7 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -981,6 +981,7 @@ static const struct { {"RACE",TOL_RACE}, {"MATCH",TOL_MATCH}, + {"BATTLE",TOL_MATCH}, // SRB2kart {"TAG",TOL_TAG}, {"CTF",TOL_CTF}, @@ -6426,6 +6427,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_PLAYERARROW_ROULETTE", "S_PLAYERBOMB", // Player bomb overlay + "S_PLAYERBOMB_WHEEL", #ifdef SEENAMES "S_NAMECHECK", @@ -7326,6 +7328,7 @@ static const char *const KARTSTUFF_LIST[] = { "THROWDIR", "CAMSPIN", "LAPANIMATION", + "CARDANIMATION", "SOUNDS", "BOOSTING", @@ -7354,6 +7357,7 @@ static const char *const KARTSTUFF_LIST[] = { "GOLDSHROOMTIMER", "STARTIMER", "SPINOUTTIMER", + "WIPEOUTTIMER", "LASERWISPTIMER", "JUSTBUMPED", "POWERITEMTIMER", diff --git a/src/doomstat.h b/src/doomstat.h index 11560259..df13266f 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -405,6 +405,7 @@ extern INT32 boostealtime; extern INT32 mushroomtime; extern INT32 itemtime; extern INT32 comebacktime; +extern INT32 wipeouttime; extern UINT8 introtoplay; extern UINT8 creditscutscene; diff --git a/src/g_game.c b/src/g_game.c index e0fb25c0..6f3bf3bb 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -206,6 +206,7 @@ INT32 boostealtime = TICRATE/2; INT32 mushroomtime = TICRATE + (TICRATE/3); INT32 itemtime = 8*TICRATE; INT32 comebacktime = 10*TICRATE; +INT32 wipeouttime = 20; INT32 gameovertics = 15*TICRATE; @@ -2203,6 +2204,7 @@ void G_PlayerReborn(INT32 player) INT32 offroad; INT32 balloon; INT32 comebackpoints; + INT32 comebackshowninfo; score = players[player].score; lives = players[player].lives; @@ -2260,6 +2262,7 @@ void G_PlayerReborn(INT32 player) offroad = players[player].kartstuff[k_offroad]; balloon = players[player].kartstuff[k_balloon]; comebackpoints = players[player].kartstuff[k_comebackpoints]; + comebackshowninfo = players[player].kartstuff[k_comebackshowninfo]; p = &players[player]; memset(p, 0, sizeof (*p)); @@ -2316,8 +2319,10 @@ void G_PlayerReborn(INT32 player) // SRB2kart p->kartstuff[k_starpostwp] = starpostwp; // TODO: get these out of kartstuff, it causes desync p->kartstuff[k_offroad] = offroad; + p->kartstuff[k_balloon] = balloon; p->kartstuff[k_comebackpoints] = comebackpoints; + p->kartstuff[k_comebackshowninfo] = comebackshowninfo; p->kartstuff[k_comebacktimer] = comebacktime; // Don't do anything immediately diff --git a/src/info.c b/src/info.c index 79433ecd..ec5097a6 100644 --- a/src/info.c +++ b/src/info.c @@ -2881,7 +2881,8 @@ state_t states[NUMSTATES] = {SPR_ARRO, FF_FULLBRIGHT|16, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_EMPTY {SPR_ARRO, FF_FULLBRIGHT|FF_ANIMATE|1, -1, {NULL}, 5, 3, S_NULL}, // S_PLAYERARROW_ROULETTE - {SPR_PBOM, 0, -1, {NULL}, 1, 0, S_NULL}, // S_PLAYERBOMB + {SPR_PBOM, FF_ANIMATE, -1, {NULL}, 3, 3, S_NULL}, // S_PLAYERBOMB + {SPR_PBOM, 4, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERBOMB_WHEEL #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK diff --git a/src/info.h b/src/info.h index 2624f16e..e50e9bf0 100644 --- a/src/info.h +++ b/src/info.h @@ -3403,6 +3403,7 @@ typedef enum state S_PLAYERARROW_ROULETTE, S_PLAYERBOMB, + S_PLAYERBOMB_WHEEL, #ifdef SEENAMES S_NAMECHECK, diff --git a/src/k_kart.c b/src/k_kart.c index df25cfa8..1efe2814 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -728,7 +728,7 @@ static INT32 K_KartItemOddsBalloons[NUMKARTITEMS][5] = /*Gold Mushroom*/ { 0, 0, 0, 0, 0 }, // Gold Mushroom /*Star*/ { 1, 1, 0, 0, 0 }, // Star - /*Triple Banana*/ { 0, 3, 3, 1, 0 }, // Triple Banana + /*Triple Banana*/ { 0, 3, 1, 1, 0 }, // Triple Banana /*Fake Item*/ { 0, 0, 2, 2, 1 }, // Fake Item /*Banana*/ { 0, 0, 3, 1, 1 }, // Banana /*Green Shell*/ { 0, 0, 5, 3, 1 }, // Green Shell @@ -1455,16 +1455,22 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_spinout] == 0 && player->kartstuff[k_spinouttimer] == 0 && player->powers[pw_flashing] == K_GetKartFlashing()) player->powers[pw_flashing]--; - /*if (player->kartstuff[k_wipeouttimer]) + if (player->kartstuff[k_wipeouttimer]) { if (player->kartstuff[k_wipeouttimer] == 1) { - player->kartstuff[k_spinouttype] = 1; - K_SpinPlayer(player, NULL); - player->mo->momx = player->mo->momy = 0; + if (P_IsObjectOnGround(player->mo)) + { + player->kartstuff[k_wipeouttimer] = 0; + P_PlayRinglossSound(player->mo); + player->kartstuff[k_spinouttype] = 1; + K_SpinPlayer(player, NULL); + player->mo->momx = player->mo->momy = 0; + } } - player->kartstuff[k_wipeouttimer]--; - }*/ + else + player->kartstuff[k_wipeouttimer]--; + } if (player->kartstuff[k_magnettimer]) player->kartstuff[k_magnettimer]--; @@ -1521,13 +1527,20 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_lapanimation]) player->kartstuff[k_lapanimation]--; - if (gametype != GT_RACE && (player->exiting || (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]))) + if (gametype != GT_RACE && (player->exiting || player->kartstuff[k_comebacktimer])) { - if ((player->exiting < 6*TICRATE) - || (player->kartstuff[k_comebacktimer] > 7*TICRATE && player->kartstuff[k_comebacktimer] < 9*TICRATE)) - player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1; - else if (player->kartstuff[k_comebacktimer] < 5*TICRATE && !player->exiting) - player->kartstuff[k_cardanimation] -= ((164-player->kartstuff[k_cardanimation])/8)+1; + if (player->exiting) + { + if (player->exiting < 6*TICRATE) + player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1; + } + else + { + if (player->kartstuff[k_comebacktimer] < 6*TICRATE) + player->kartstuff[k_cardanimation] -= ((164-player->kartstuff[k_cardanimation])/8)+1; + else if (player->kartstuff[k_comebacktimer] < 9*TICRATE) + player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1; + } if (player->kartstuff[k_cardanimation] > 164) player->kartstuff[k_cardanimation] = 164; @@ -1802,7 +1815,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source) return; if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinout] > 0) - || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 + || player->kartstuff[k_wipeouttimer] > 0 || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 || (gametype != GT_RACE && ((player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) return; @@ -1860,13 +1873,13 @@ void K_SpinPlayer(player_t *player, mobj_t *source) return; } -/*void K_WipeoutPlayer(player_t *player, mobj_t *source) +void K_WipeoutPlayer(player_t *player, mobj_t *source) { if (player->health <= 0) return; if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinout] > 0) - || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 + || player->kartstuff[k_wipeouttimer] > 0 || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 || (gametype != GT_RACE && ((player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) return; @@ -1882,19 +1895,18 @@ void K_SpinPlayer(player_t *player, mobj_t *source) P_AddPlayerScore(source->player, 1); } - P_RingDamage(player, NULL, source, player->mo->health-1); P_PlayerRingBurst(player, 5); if (P_IsLocalPlayer(player)) { quake.intensity = 32*FRACUNIT; quake.time = 5; - } + } - player->kartstuff[k_wipeouttimer] = 21; + player->kartstuff[k_wipeouttimer] = wipeouttime+1; return; -}*/ +} void K_SquishPlayer(player_t *player, mobj_t *source) { @@ -1902,7 +1914,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source) return; if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_startimer] > 0 - || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 + || player->kartstuff[k_wipeouttimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 || (gametype != GT_RACE && ((player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) return; @@ -1946,7 +1958,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju return; if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinout] > 0) - || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 + || player->kartstuff[k_wipeouttimer] > 0 || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 || (gametype != GT_RACE && ((player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) return; @@ -2025,10 +2037,10 @@ void K_StealBalloon(player_t *player, player_t *victim, boolean force) return; if ((player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinout] > 0) - || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 + || player->kartstuff[k_wipeouttimer] > 0 || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 || (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer])) || (victim->powers[pw_flashing] > 0 || victim->kartstuff[k_squishedtimer] > 0 || (victim->kartstuff[k_spinouttimer] > 0 && victim->kartstuff[k_spinout] > 0) - || victim->kartstuff[k_startimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_bootimer] > 0)) + || victim->kartstuff[k_wipeouttimer] > 0 || victim->kartstuff[k_startimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_bootimer] > 0)) return; } @@ -2902,7 +2914,7 @@ static void K_KartDrift(player_t *player, boolean onground) } // Stop drifting - if (player->kartstuff[k_spinouttimer] > 0 // banana peel + if (player->kartstuff[k_spinouttimer] > 0 || player->kartstuff[k_wipeouttimer] > 0 // banana peel || player->speed < (10<<16)) // you're too slow! { player->kartstuff[k_drift] = 0; @@ -3135,7 +3147,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else if (cmd->buttons & BT_ATTACK) player->pflags |= PF_ATTACKDOWN; - if (player && player->health > 0 && !player->spectator && !player->exiting && player->kartstuff[k_spinouttimer] == 0) + if (player && player->health > 0 && !player->spectator && !player->exiting && player->kartstuff[k_spinouttimer] == 0 && player->kartstuff[k_wipeouttimer] == 0) { // Magnet @@ -3170,9 +3182,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else if (ATTACK_IS_DOWN && player->kartstuff[k_goldshroomtimer] > 1 && onground && NO_BOO) { K_DoMushroom(player, true, false); - //player->kartstuff[k_goldshroomtimer] -= 10; - //if (player->kartstuff[k_goldshroomtimer] < 1) - // player->kartstuff[k_goldshroomtimer] = 1; + player->kartstuff[k_goldshroomtimer] -= 10; + if (player->kartstuff[k_goldshroomtimer] < 1) + player->kartstuff[k_goldshroomtimer] = 1; } // TripleMushroom power else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_mushroom] == 4 && onground && NO_BOO) @@ -3614,10 +3626,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->mo->flags2 |= MF2_SHADOW; if (!(player->mo->tracer)) + { player->mo->tracer = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_OVERLAY); + P_SetMobjState(player->mo->tracer, S_PLAYERBOMB); + } P_SetTarget(&player->mo->tracer->target, player->mo); - P_SetMobjState(player->mo->tracer, S_PLAYERBOMB); player->mo->tracer->color = player->mo->color; if (player->kartstuff[k_comebacktimer] > 0) diff --git a/src/k_kart.h b/src/k_kart.h index c9ab9c0f..a8c86cfe 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -23,7 +23,7 @@ void K_LakituChecker(player_t *player); void K_KartMoveAnimation(player_t *player); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_SpinPlayer(player_t *player, mobj_t *source); -//void K_WipeoutPlayer(player_t *player, mobj_t *source); +void K_WipeoutPlayer(player_t *player, mobj_t *source); void K_SquishPlayer(player_t *player, mobj_t *source); void K_ExplodePlayer(player_t *player, mobj_t *source); void K_StealBalloon(player_t *player, player_t *victim, boolean force); diff --git a/src/p_enemy.c b/src/p_enemy.c index 2b010327..59a4a076 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8094,6 +8094,10 @@ void A_ToggleFlameJet(mobj_t* actor) void A_ItemPop(mobj_t *actor) { mobj_t *remains; +#ifdef HAVE_BLUA + if (LUA_CallAction("A_ItemPop", actor)) + return; +#endif if (!(actor->target && actor->target->player)) { @@ -8151,6 +8155,10 @@ void A_RedShellChase(mobj_t *actor) INT32 c = 0; INT32 stop; player_t *player; +#ifdef HAVE_BLUA + if (LUA_CallAction("A_RedShellChase", actor)) + return; +#endif if (actor->tracer) { @@ -8252,6 +8260,10 @@ void A_BobombExplode(mobj_t *actor) INT32 d; INT32 locvar1 = var1; mobjtype_t type; +#ifdef HAVE_BLUA + if (LUA_CallAction("A_BobombExplode", actor)) + return; +#endif type = (mobjtype_t)locvar1; diff --git a/src/p_inter.c b/src/p_inter.c index 0882f23f..6491ce67 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2911,7 +2911,7 @@ static void P_ShieldDamage(player_t *player, mobj_t *inflictor, mobj_t *source, } */ -static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 damage) +/*static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 damage) { if (!(inflictor && ((inflictor->flags & MF_MISSILE) || inflictor->player) && player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))) { @@ -2923,7 +2923,7 @@ static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, IN S_StartSound(player->mo, sfx_spkdth); } - /*if (source && source->player && !player->powers[pw_super]) //don't score points against super players + if (source && source->player && !player->powers[pw_super]) //don't score points against super players { // Award no points when players shoot each other when cv_friendlyfire is on. if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo)) @@ -2939,11 +2939,11 @@ static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, IN if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo)) P_AddPlayerScore(source->player, 1); } - }*/ + } // Ring loss sound plays despite hitting spikes P_PlayRinglossSound(player->mo); // Ringledingle! -} +}*/ /** Damages an object, which may or may not be a player. * For melee attacks, source and inflictor are the same. @@ -3202,8 +3202,17 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da || inflictor->type == MT_TRIPLEREDSHIELD1 || inflictor->type == MT_TRIPLEREDSHIELD2 || inflictor->type == MT_TRIPLEREDSHIELD3 || inflictor->player)) { - //K_WipeoutPlayer(player, source); - player->kartstuff[k_spinouttype] = 1; + fixed_t tmomx = inflictor->momx; + fixed_t tmomy = inflictor->momy; + fixed_t tmomz = inflictor->momz; + + K_KartBouncing(target, inflictor, false); + K_WipeoutPlayer(player, source); + + inflictor->momx = tmomx; + inflictor->momy = tmomy; + inflictor->momz = tmomz; + /*player->kartstuff[k_spinouttype] = 1; K_SpinPlayer(player, source); damage = player->mo->health - 1; P_RingDamage(player, inflictor, source, damage); @@ -3213,7 +3222,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { quake.intensity = 32*FRACUNIT; quake.time = 5; - } + }*/ } else { diff --git a/src/p_map.c b/src/p_map.c index f2fcf53c..5502aea6 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1627,12 +1627,12 @@ static boolean PIT_CheckThing(mobj_t *thing) return true; // underneath if (thing->player->kartstuff[k_growshrinktimer] || thing->player->kartstuff[k_squishedtimer] - || thing->player->kartstuff[k_bootimer] || thing->player->kartstuff[k_spinouttimer] + || thing->player->kartstuff[k_bootimer] || thing->player->kartstuff[k_spinouttimer] || thing->player->kartstuff[k_wipeouttimer] || thing->player->kartstuff[k_startimer] || thing->player->kartstuff[k_justbumped] || (gametype != GT_RACE && (thing->player->kartstuff[k_balloon] <= 0 && (thing->player->kartstuff[k_comebacktimer] || thing->player->kartstuff[k_comebackmode] == 1))) || tmthing->player->kartstuff[k_growshrinktimer] || tmthing->player->kartstuff[k_squishedtimer] - || tmthing->player->kartstuff[k_bootimer] || tmthing->player->kartstuff[k_spinouttimer] + || tmthing->player->kartstuff[k_bootimer] || tmthing->player->kartstuff[k_spinouttimer] || tmthing->player->kartstuff[k_wipeouttimer] || tmthing->player->kartstuff[k_startimer] || tmthing->player->kartstuff[k_justbumped] || (gametype != GT_RACE && (tmthing->player->kartstuff[k_balloon] <= 0 && (tmthing->player->kartstuff[k_comebacktimer] || tmthing->player->kartstuff[k_comebackmode] == 1)))) diff --git a/src/p_mobj.c b/src/p_mobj.c index adbc466c..e2565a71 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2867,7 +2867,7 @@ static void P_PlayerZMovement(mobj_t *mo) // Cut momentum in half when you hit the ground and // aren't pressing any controls. if (!(mo->player->cmd.forwardmove || mo->player->cmd.sidemove) && !mo->player->cmomx && !mo->player->cmomy - && !(mo->player->pflags & PF_SPINNING) && !(mo->player->kartstuff[k_spinouttimer])) + && !(mo->player->pflags & PF_SPINNING) && !(mo->player->kartstuff[k_spinouttimer] || mo->player->kartstuff[k_wipeouttimer])) { mo->momx = mo->momx/2; mo->momy = mo->momy/2; @@ -5922,6 +5922,13 @@ void P_Attract(mobj_t *source, mobj_t *dest, boolean nightsgrab) // Home in on y if (!dest || dest->health <= 0 || !dest->player || !source->tracer) return; + if (dest->player && dest->player->kartstuff[k_comebackmode] == 1) + { + P_TeleportMove(source, dest->x+dest->momx, dest->y+dest->momy, dest->z+dest->momz); + source->angle = dest->angle; + return; + } + // change angle source->angle = R_PointToAngle2(source->x, source->y, tx, ty); @@ -9492,6 +9499,9 @@ void P_SpawnPlayer(INT32 playernum) overheadarrow->flags2 |= MF2_DONTDRAW; P_SetScale(overheadarrow, mobj->destscale); + if (leveltime < 1) + p->kartstuff[k_comebackshowninfo] = 0; + if (gametype != GT_RACE) { /*INT32 i; diff --git a/src/p_setup.c b/src/p_setup.c index 3e817fb1..ff256703 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -160,7 +160,7 @@ FUNCNORETURN static ATTRNORETURN void CorruptMapError(const char *msg) I_Error("Invalid or corrupt map.\nLook in log file or text console for technical details."); } -#define NUMLAPS_DEFAULT 4 +#define NUMLAPS_DEFAULT 3 /** Clears the data from a single map header. * @@ -224,7 +224,7 @@ static void P_ClearSingleMapHeaderInfo(INT16 i) DEH_WriteUndoline("LEVELFLAGS", va("%d", mapheaderinfo[num]->levelflags), UNDO_NONE); mapheaderinfo[num]->levelflags = 0; DEH_WriteUndoline("MENUFLAGS", va("%d", mapheaderinfo[num]->menuflags), UNDO_NONE); - mapheaderinfo[num]->menuflags = LF2_RECORDATTACK|LF2_NOVISITNEEDED; // 0 + mapheaderinfo[num]->menuflags = 0; // TODO grades support for delfile (pfft yeah right) P_DeleteGrades(num); // an even further impossibility, delfile custom opts support diff --git a/src/p_user.c b/src/p_user.c index 5e47cdde..bd0b8f49 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3665,7 +3665,7 @@ void P_DoJump(player_t *player, boolean soundandstate) if (!player->jumpfactor) return; - if (player->kartstuff[k_spinouttimer]) // SRB2kart + if (player->kartstuff[k_spinouttimer] || player->kartstuff[k_wipeouttimer]) // SRB2kart return; /* // SRB2kart - climbing in a kart? @@ -4636,7 +4636,8 @@ static void P_3dMovement(player_t *player) cmd = &player->cmd; - if (player->exiting || player->pflags & PF_STASIS || player->kartstuff[k_spinouttimer]) // pw_introcam? + if (player->exiting || player->pflags & PF_STASIS + || player->kartstuff[k_spinouttimer] || player->kartstuff[k_wipeouttimer]) // pw_introcam? { cmd->forwardmove = cmd->sidemove = 0; if (player->pflags & PF_GLIDING) @@ -4868,7 +4869,7 @@ static void P_3dMovement(player_t *player) P_Thrust(player->mo, movepushangle, movepushforward); #endif } - else if (!player->kartstuff[k_spinouttimer]) + else if (!(player->kartstuff[k_spinouttimer] || player->kartstuff[k_wipeouttimer])) { K_MomentumToFacing(player); }