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
This commit is contained in:
TehRealSalt 2017-12-10 20:57:46 -05:00
parent d6af8e52c1
commit f5650eba09
14 changed files with 106 additions and 48 deletions

View file

@ -276,7 +276,7 @@ typedef enum
k_goldshroomtimer, // Gold Mushroom duration timer k_goldshroomtimer, // Gold Mushroom duration timer
k_startimer, // Invincibility timer k_startimer, // Invincibility timer
k_spinouttimer, // Spin-out from a banana peel or oil slick (was "pw_bananacam") 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_laserwisptimer, // The duration and relative angle of the laser
k_justbumped, // Prevent players from endlessly bumping into each other 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) k_poweritemtimer, // Battle mode, how long before you're allowed another power item (Star, Megashroom)

View file

@ -981,6 +981,7 @@ static const struct {
{"RACE",TOL_RACE}, {"RACE",TOL_RACE},
{"MATCH",TOL_MATCH}, {"MATCH",TOL_MATCH},
{"BATTLE",TOL_MATCH}, // SRB2kart
{"TAG",TOL_TAG}, {"TAG",TOL_TAG},
{"CTF",TOL_CTF}, {"CTF",TOL_CTF},
@ -6426,6 +6427,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_PLAYERARROW_ROULETTE", "S_PLAYERARROW_ROULETTE",
"S_PLAYERBOMB", // Player bomb overlay "S_PLAYERBOMB", // Player bomb overlay
"S_PLAYERBOMB_WHEEL",
#ifdef SEENAMES #ifdef SEENAMES
"S_NAMECHECK", "S_NAMECHECK",
@ -7326,6 +7328,7 @@ static const char *const KARTSTUFF_LIST[] = {
"THROWDIR", "THROWDIR",
"CAMSPIN", "CAMSPIN",
"LAPANIMATION", "LAPANIMATION",
"CARDANIMATION",
"SOUNDS", "SOUNDS",
"BOOSTING", "BOOSTING",
@ -7354,6 +7357,7 @@ static const char *const KARTSTUFF_LIST[] = {
"GOLDSHROOMTIMER", "GOLDSHROOMTIMER",
"STARTIMER", "STARTIMER",
"SPINOUTTIMER", "SPINOUTTIMER",
"WIPEOUTTIMER",
"LASERWISPTIMER", "LASERWISPTIMER",
"JUSTBUMPED", "JUSTBUMPED",
"POWERITEMTIMER", "POWERITEMTIMER",

View file

@ -405,6 +405,7 @@ extern INT32 boostealtime;
extern INT32 mushroomtime; extern INT32 mushroomtime;
extern INT32 itemtime; extern INT32 itemtime;
extern INT32 comebacktime; extern INT32 comebacktime;
extern INT32 wipeouttime;
extern UINT8 introtoplay; extern UINT8 introtoplay;
extern UINT8 creditscutscene; extern UINT8 creditscutscene;

View file

@ -206,6 +206,7 @@ INT32 boostealtime = TICRATE/2;
INT32 mushroomtime = TICRATE + (TICRATE/3); INT32 mushroomtime = TICRATE + (TICRATE/3);
INT32 itemtime = 8*TICRATE; INT32 itemtime = 8*TICRATE;
INT32 comebacktime = 10*TICRATE; INT32 comebacktime = 10*TICRATE;
INT32 wipeouttime = 20;
INT32 gameovertics = 15*TICRATE; INT32 gameovertics = 15*TICRATE;
@ -2203,6 +2204,7 @@ void G_PlayerReborn(INT32 player)
INT32 offroad; INT32 offroad;
INT32 balloon; INT32 balloon;
INT32 comebackpoints; INT32 comebackpoints;
INT32 comebackshowninfo;
score = players[player].score; score = players[player].score;
lives = players[player].lives; lives = players[player].lives;
@ -2260,6 +2262,7 @@ void G_PlayerReborn(INT32 player)
offroad = players[player].kartstuff[k_offroad]; offroad = players[player].kartstuff[k_offroad];
balloon = players[player].kartstuff[k_balloon]; balloon = players[player].kartstuff[k_balloon];
comebackpoints = players[player].kartstuff[k_comebackpoints]; comebackpoints = players[player].kartstuff[k_comebackpoints];
comebackshowninfo = players[player].kartstuff[k_comebackshowninfo];
p = &players[player]; p = &players[player];
memset(p, 0, sizeof (*p)); memset(p, 0, sizeof (*p));
@ -2316,8 +2319,10 @@ void G_PlayerReborn(INT32 player)
// SRB2kart // SRB2kart
p->kartstuff[k_starpostwp] = starpostwp; // TODO: get these out of kartstuff, it causes desync p->kartstuff[k_starpostwp] = starpostwp; // TODO: get these out of kartstuff, it causes desync
p->kartstuff[k_offroad] = offroad; p->kartstuff[k_offroad] = offroad;
p->kartstuff[k_balloon] = balloon; p->kartstuff[k_balloon] = balloon;
p->kartstuff[k_comebackpoints] = comebackpoints; p->kartstuff[k_comebackpoints] = comebackpoints;
p->kartstuff[k_comebackshowninfo] = comebackshowninfo;
p->kartstuff[k_comebacktimer] = comebacktime; p->kartstuff[k_comebacktimer] = comebacktime;
// Don't do anything immediately // Don't do anything immediately

View file

@ -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|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_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 #ifdef SEENAMES
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK

View file

@ -3403,6 +3403,7 @@ typedef enum state
S_PLAYERARROW_ROULETTE, S_PLAYERARROW_ROULETTE,
S_PLAYERBOMB, S_PLAYERBOMB,
S_PLAYERBOMB_WHEEL,
#ifdef SEENAMES #ifdef SEENAMES
S_NAMECHECK, S_NAMECHECK,

View file

@ -728,7 +728,7 @@ static INT32 K_KartItemOddsBalloons[NUMKARTITEMS][5] =
/*Gold Mushroom*/ { 0, 0, 0, 0, 0 }, // Gold Mushroom /*Gold Mushroom*/ { 0, 0, 0, 0, 0 }, // Gold Mushroom
/*Star*/ { 1, 1, 0, 0, 0 }, // Star /*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 /*Fake Item*/ { 0, 0, 2, 2, 1 }, // Fake Item
/*Banana*/ { 0, 0, 3, 1, 1 }, // Banana /*Banana*/ { 0, 0, 3, 1, 1 }, // Banana
/*Green Shell*/ { 0, 0, 5, 3, 1 }, // Green Shell /*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()) if (player->kartstuff[k_spinout] == 0 && player->kartstuff[k_spinouttimer] == 0 && player->powers[pw_flashing] == K_GetKartFlashing())
player->powers[pw_flashing]--; player->powers[pw_flashing]--;
/*if (player->kartstuff[k_wipeouttimer]) if (player->kartstuff[k_wipeouttimer])
{ {
if (player->kartstuff[k_wipeouttimer] == 1) if (player->kartstuff[k_wipeouttimer] == 1)
{ {
player->kartstuff[k_spinouttype] = 1; if (P_IsObjectOnGround(player->mo))
K_SpinPlayer(player, NULL); {
player->mo->momx = player->mo->momy = 0; 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]) if (player->kartstuff[k_magnettimer])
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]) if (player->kartstuff[k_lapanimation])
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) if (player->exiting)
|| (player->kartstuff[k_comebacktimer] > 7*TICRATE && player->kartstuff[k_comebacktimer] < 9*TICRATE)) {
player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1; if (player->exiting < 6*TICRATE)
else if (player->kartstuff[k_comebacktimer] < 5*TICRATE && !player->exiting) player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1;
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) if (player->kartstuff[k_cardanimation] > 164)
player->kartstuff[k_cardanimation] = 164; player->kartstuff[k_cardanimation] = 164;
@ -1802,7 +1815,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source)
return; return;
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinout] > 0) 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))) || (gametype != GT_RACE && ((player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
return; return;
@ -1860,13 +1873,13 @@ void K_SpinPlayer(player_t *player, mobj_t *source)
return; return;
} }
/*void K_WipeoutPlayer(player_t *player, mobj_t *source) void K_WipeoutPlayer(player_t *player, mobj_t *source)
{ {
if (player->health <= 0) if (player->health <= 0)
return; return;
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinout] > 0) 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))) || (gametype != GT_RACE && ((player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
return; return;
@ -1882,19 +1895,18 @@ void K_SpinPlayer(player_t *player, mobj_t *source)
P_AddPlayerScore(source->player, 1); P_AddPlayerScore(source->player, 1);
} }
P_RingDamage(player, NULL, source, player->mo->health-1);
P_PlayerRingBurst(player, 5); P_PlayerRingBurst(player, 5);
if (P_IsLocalPlayer(player)) if (P_IsLocalPlayer(player))
{ {
quake.intensity = 32*FRACUNIT; quake.intensity = 32*FRACUNIT;
quake.time = 5; quake.time = 5;
} }
player->kartstuff[k_wipeouttimer] = 21; player->kartstuff[k_wipeouttimer] = wipeouttime+1;
return; return;
}*/ }
void K_SquishPlayer(player_t *player, mobj_t *source) void K_SquishPlayer(player_t *player, mobj_t *source)
{ {
@ -1902,7 +1914,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source)
return; return;
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_startimer] > 0 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))) || (gametype != GT_RACE && ((player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
return; return;
@ -1946,7 +1958,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju
return; return;
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinout] > 0) 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))) || (gametype != GT_RACE && ((player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
return; return;
@ -2025,10 +2037,10 @@ void K_StealBalloon(player_t *player, player_t *victim, boolean force)
return; return;
if ((player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinout] > 0) 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])) || (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->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; return;
} }
@ -2902,7 +2914,7 @@ static void K_KartDrift(player_t *player, boolean onground)
} }
// Stop drifting // 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->speed < (10<<16)) // you're too slow!
{ {
player->kartstuff[k_drift] = 0; player->kartstuff[k_drift] = 0;
@ -3135,7 +3147,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
else if (cmd->buttons & BT_ATTACK) else if (cmd->buttons & BT_ATTACK)
player->pflags |= PF_ATTACKDOWN; 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 // 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) else if (ATTACK_IS_DOWN && player->kartstuff[k_goldshroomtimer] > 1 && onground && NO_BOO)
{ {
K_DoMushroom(player, true, false); K_DoMushroom(player, true, false);
//player->kartstuff[k_goldshroomtimer] -= 10; player->kartstuff[k_goldshroomtimer] -= 10;
//if (player->kartstuff[k_goldshroomtimer] < 1) if (player->kartstuff[k_goldshroomtimer] < 1)
// player->kartstuff[k_goldshroomtimer] = 1; player->kartstuff[k_goldshroomtimer] = 1;
} }
// TripleMushroom power // TripleMushroom power
else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_mushroom] == 4 && onground && NO_BOO) 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; player->mo->flags2 |= MF2_SHADOW;
if (!(player->mo->tracer)) if (!(player->mo->tracer))
{
player->mo->tracer = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_OVERLAY); 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_SetTarget(&player->mo->tracer->target, player->mo);
P_SetMobjState(player->mo->tracer, S_PLAYERBOMB);
player->mo->tracer->color = player->mo->color; player->mo->tracer->color = player->mo->color;
if (player->kartstuff[k_comebacktimer] > 0) if (player->kartstuff[k_comebacktimer] > 0)

View file

@ -23,7 +23,7 @@ void K_LakituChecker(player_t *player);
void K_KartMoveAnimation(player_t *player); void K_KartMoveAnimation(player_t *player);
void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd);
void K_SpinPlayer(player_t *player, mobj_t *source); 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_SquishPlayer(player_t *player, mobj_t *source);
void K_ExplodePlayer(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); void K_StealBalloon(player_t *player, player_t *victim, boolean force);

View file

@ -8094,6 +8094,10 @@ void A_ToggleFlameJet(mobj_t* actor)
void A_ItemPop(mobj_t *actor) void A_ItemPop(mobj_t *actor)
{ {
mobj_t *remains; mobj_t *remains;
#ifdef HAVE_BLUA
if (LUA_CallAction("A_ItemPop", actor))
return;
#endif
if (!(actor->target && actor->target->player)) if (!(actor->target && actor->target->player))
{ {
@ -8151,6 +8155,10 @@ void A_RedShellChase(mobj_t *actor)
INT32 c = 0; INT32 c = 0;
INT32 stop; INT32 stop;
player_t *player; player_t *player;
#ifdef HAVE_BLUA
if (LUA_CallAction("A_RedShellChase", actor))
return;
#endif
if (actor->tracer) if (actor->tracer)
{ {
@ -8252,6 +8260,10 @@ void A_BobombExplode(mobj_t *actor)
INT32 d; INT32 d;
INT32 locvar1 = var1; INT32 locvar1 = var1;
mobjtype_t type; mobjtype_t type;
#ifdef HAVE_BLUA
if (LUA_CallAction("A_BobombExplode", actor))
return;
#endif
type = (mobjtype_t)locvar1; type = (mobjtype_t)locvar1;

View file

@ -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]))) 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); 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. // Award no points when players shoot each other when cv_friendlyfire is on.
if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo)) 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)) if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo))
P_AddPlayerScore(source->player, 1); P_AddPlayerScore(source->player, 1);
} }
}*/ }
// Ring loss sound plays despite hitting spikes // Ring loss sound plays despite hitting spikes
P_PlayRinglossSound(player->mo); // Ringledingle! P_PlayRinglossSound(player->mo); // Ringledingle!
} }*/
/** Damages an object, which may or may not be a player. /** Damages an object, which may or may not be a player.
* For melee attacks, source and inflictor are the same. * 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->type == MT_TRIPLEREDSHIELD1 || inflictor->type == MT_TRIPLEREDSHIELD2 || inflictor->type == MT_TRIPLEREDSHIELD3
|| inflictor->player)) || inflictor->player))
{ {
//K_WipeoutPlayer(player, source); fixed_t tmomx = inflictor->momx;
player->kartstuff[k_spinouttype] = 1; 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); K_SpinPlayer(player, source);
damage = player->mo->health - 1; damage = player->mo->health - 1;
P_RingDamage(player, inflictor, source, damage); 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.intensity = 32*FRACUNIT;
quake.time = 5; quake.time = 5;
} }*/
} }
else else
{ {

View file

@ -1627,12 +1627,12 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true; // underneath return true; // underneath
if (thing->player->kartstuff[k_growshrinktimer] || thing->player->kartstuff[k_squishedtimer] 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] || thing->player->kartstuff[k_startimer] || thing->player->kartstuff[k_justbumped]
|| (gametype != GT_RACE && (thing->player->kartstuff[k_balloon] <= 0 || (gametype != GT_RACE && (thing->player->kartstuff[k_balloon] <= 0
&& (thing->player->kartstuff[k_comebacktimer] || thing->player->kartstuff[k_comebackmode] == 1))) && (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_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] || tmthing->player->kartstuff[k_startimer] || tmthing->player->kartstuff[k_justbumped]
|| (gametype != GT_RACE && (tmthing->player->kartstuff[k_balloon] <= 0 || (gametype != GT_RACE && (tmthing->player->kartstuff[k_balloon] <= 0
&& (tmthing->player->kartstuff[k_comebacktimer] || tmthing->player->kartstuff[k_comebackmode] == 1)))) && (tmthing->player->kartstuff[k_comebacktimer] || tmthing->player->kartstuff[k_comebackmode] == 1))))

View file

@ -2867,7 +2867,7 @@ static void P_PlayerZMovement(mobj_t *mo)
// Cut momentum in half when you hit the ground and // Cut momentum in half when you hit the ground and
// aren't pressing any controls. // aren't pressing any controls.
if (!(mo->player->cmd.forwardmove || mo->player->cmd.sidemove) && !mo->player->cmomx && !mo->player->cmomy 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->momx = mo->momx/2;
mo->momy = mo->momy/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) if (!dest || dest->health <= 0 || !dest->player || !source->tracer)
return; 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 // change angle
source->angle = R_PointToAngle2(source->x, source->y, tx, ty); source->angle = R_PointToAngle2(source->x, source->y, tx, ty);
@ -9492,6 +9499,9 @@ void P_SpawnPlayer(INT32 playernum)
overheadarrow->flags2 |= MF2_DONTDRAW; overheadarrow->flags2 |= MF2_DONTDRAW;
P_SetScale(overheadarrow, mobj->destscale); P_SetScale(overheadarrow, mobj->destscale);
if (leveltime < 1)
p->kartstuff[k_comebackshowninfo] = 0;
if (gametype != GT_RACE) if (gametype != GT_RACE)
{ {
/*INT32 i; /*INT32 i;

View file

@ -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."); 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. /** 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); DEH_WriteUndoline("LEVELFLAGS", va("%d", mapheaderinfo[num]->levelflags), UNDO_NONE);
mapheaderinfo[num]->levelflags = 0; mapheaderinfo[num]->levelflags = 0;
DEH_WriteUndoline("MENUFLAGS", va("%d", mapheaderinfo[num]->menuflags), UNDO_NONE); 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) // TODO grades support for delfile (pfft yeah right)
P_DeleteGrades(num); P_DeleteGrades(num);
// an even further impossibility, delfile custom opts support // an even further impossibility, delfile custom opts support

View file

@ -3665,7 +3665,7 @@ void P_DoJump(player_t *player, boolean soundandstate)
if (!player->jumpfactor) if (!player->jumpfactor)
return; return;
if (player->kartstuff[k_spinouttimer]) // SRB2kart if (player->kartstuff[k_spinouttimer] || player->kartstuff[k_wipeouttimer]) // SRB2kart
return; return;
/* // SRB2kart - climbing in a kart? /* // SRB2kart - climbing in a kart?
@ -4636,7 +4636,8 @@ static void P_3dMovement(player_t *player)
cmd = &player->cmd; 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; cmd->forwardmove = cmd->sidemove = 0;
if (player->pflags & PF_GLIDING) if (player->pflags & PF_GLIDING)
@ -4868,7 +4869,7 @@ static void P_3dMovement(player_t *player)
P_Thrust(player->mo, movepushangle, movepushforward); P_Thrust(player->mo, movepushangle, movepushforward);
#endif #endif
} }
else if (!player->kartstuff[k_spinouttimer]) else if (!(player->kartstuff[k_spinouttimer] || player->kartstuff[k_wipeouttimer]))
{ {
K_MomentumToFacing(player); K_MomentumToFacing(player);
} }