diff --git a/src/d_player.h b/src/d_player.h index 9a1e441b9..71d05c39d 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -1128,6 +1128,8 @@ struct player_t boolean dotrickfx; boolean stingfx; UINT8 bumperinflate; + + boolean mfdfinish; // Did you cross the finish line while just about to explode? UINT8 ringboxdelay; // Delay until Ring Box auto-activates UINT8 ringboxaward; // Where did we stop? diff --git a/src/g_game.c b/src/g_game.c index b329f0a6b..ae08487ce 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2312,6 +2312,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) UINT16 bigwaypointgap; INT16 duelscore; + + boolean mfdfinish; roundconditions_t roundconditions; boolean saveroundconditions; @@ -2406,6 +2408,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) totalring = players[player].totalring; xtralife = players[player].xtralife; + + mfdfinish = players[player].mfdfinish; pflags = (players[player].pflags & (PF_WANTSTOJOIN|PF_KICKSTARTACCEL|PF_SHRINKME|PF_SHRINKACTIVE|PF_AUTOROULETTE|PF_ANALOGSTICK|PF_AUTORING)); pflags2 = (players[player].pflags2 & (PF2_SELFMUTE | PF2_SELFDEAFEN | PF2_SERVERTEMPMUTE | PF2_SERVERMUTE | PF2_SERVERDEAFEN | PF2_STRICTFASTFALL)); @@ -2483,6 +2487,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) lastsafecheatcheck = 0; bigwaypointgap = 0; duelscore = 0; + mfdfinish = 0; finalized = false; @@ -2675,6 +2680,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) p->xtralife = xtralife; p->finalized = finalized; + + p->mfdfinish = mfdfinish; // SRB2kart p->itemtype = itemtype; diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 231ed07e0..a25484977 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -269,6 +269,8 @@ static int player_get(lua_State *L) lua_pushboolean(L, plr->transfer); else if (fastcmp(field,"markedfordeath")) lua_pushboolean(L, plr->markedfordeath); + else if (fastcmp(field,"mfdfinish")) + lua_pushboolean(L, plr->mfdfinish); else if (fastcmp(field,"incontrol")) lua_pushboolean(L, plr->incontrol); else if (fastcmp(field,"progressivethrust")) @@ -948,6 +950,8 @@ static int player_set(lua_State *L) plr->transfer = luaL_checkboolean(L, 3); else if (fastcmp(field,"markedfordeath")) plr->markedfordeath = luaL_checkboolean(L, 3); + else if (fastcmp(field,"mfdfinish")) + plr->mfdfinish = luaL_checkboolean(L, 3); else if (fastcmp(field,"dotrickfx")) plr->dotrickfx = luaL_checkboolean(L, 3); else if (fastcmp(field,"stingfx")) diff --git a/src/p_mobj.c b/src/p_mobj.c index 493bf2a89..e2682618c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9476,8 +9476,10 @@ static boolean P_MobjRegularThink(mobj_t *mobj) // it's still necessary to refresh SPR2 on skin changes. P_SetMobjState(cur, (newperfect == true) ? S_KART_SIGL : S_KART_SIGN); - if (cv_shittysigns.value && cur->state != &states[S_KART_SIGL]) - cur->sprite2 = P_GetSkinSprite2(skins[newplayer->skin], SPR2_SSIG, NULL);; + if ((cv_shittysigns.value || newplayer->mfdfinish) && cur->state != &states[S_KART_SIGL]) + { + cur->sprite2 = P_GetSkinSprite2(skins[newplayer->skin], SPR2_SSIG, NULL); + } } } else if (cur->state == &states[S_SIGN_ERROR]) diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 8072a905f..b8bf3fdca 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -700,6 +700,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].analoginput); WRITEUINT8(save->p, players[i].markedfordeath); + WRITEUINT8(save->p, players[i].mfdfinish); WRITEUINT8(save->p, players[i].dotrickfx); WRITEUINT8(save->p, players[i].stingfx); WRITEUINT8(save->p, players[i].bumperinflate); @@ -1377,6 +1378,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].analoginput = READUINT8(save->p); players[i].markedfordeath = READUINT8(save->p); + players[i].mfdfinish = READUINT8(save->p); players[i].dotrickfx = READUINT8(save->p); players[i].stingfx = READUINT8(save->p); players[i].bumperinflate = READUINT8(save->p); diff --git a/src/p_user.c b/src/p_user.c index 3a945c39b..d95a3b0fc 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1272,6 +1272,7 @@ void P_DoPlayerExit(player_t *player, pflags_t flags) if (!player->spectator && (gametyperules & GTR_CIRCUIT)) // Special Race-like handling { K_UpdateAllPlayerPositions(); + player->mfdfinish = player->markedfordeath; } if (!(gametyperules & GTR_SPHERES) && (player->pflags & PF_RINGLOCK) && grandprixinfo.gp)