Merge branch 'fix-splitscreen-gp-tidy' into 'master'

Fix remaining bugs with splitscreen GP GAME OVER

Closes #1251

See merge request KartKrew/Kart!2241
This commit is contained in:
toaster 2024-04-07 19:23:50 +00:00
commit 5afa8834ed
7 changed files with 46 additions and 12 deletions

View file

@ -3077,7 +3077,7 @@ void G_BeginLevelExit(void)
g_exit.losing = true;
g_exit.retry = false;
if (!G_GametypeUsesLives() || skipstats != 0)
if (!G_GametypeAllowsRetrying() || skipstats != 0)
{
g_exit.losing = false; // never force a retry
}
@ -3108,11 +3108,11 @@ void G_BeginLevelExit(void)
{
if (playeringame[i] && !players[i].spectator && !players[i].bot)
{
if (players[i].lives > 0)
{
g_exit.retry = true;
break;
}
if (G_GametypeUsesLives() && players[i].lives <= 0)
continue;
g_exit.retry = true;
break;
}
}
}
@ -3445,6 +3445,24 @@ boolean G_GametypeUsesLives(void)
if (modeattacking) // NOT in Record Attack
return false;
if (grandprixinfo.gp == true) // In Grand Prix
return true;
return false;
}
//
// G_GametypeAllowsRetrying
//
// Returns true if retrying is allowed at all.
// (Retrying may still not be possible if the player doesn't
// have enough lives.)
//
boolean G_GametypeAllowsRetrying(void)
{
if (modeattacking) // Attack modes have their own retry system
return false;
if ((grandprixinfo.gp == true) // In Grand Prix
&& grandprixinfo.eventmode != GPEVENT_BONUS) // NOT in bonus round
{

View file

@ -198,6 +198,7 @@ INT32 G_GetGametypeByName(const char *gametypestr);
INT32 G_GuessGametypeByTOL(UINT32 tol);
boolean G_GametypeUsesLives(void);
boolean G_GametypeAllowsRetrying(void);
boolean G_GametypeHasTeams(void);
boolean G_GametypeHasSpectators(void);
INT16 G_SometimesGetDifferentEncore(void);

View file

@ -26,6 +26,11 @@ constexpr INT32 kHudFlags = V_HUDTRANS | V_SLIDEIN;
tic_t player_timer(const player_t* player)
{
if (player->realtime == UINT32_MAX)
{
return 0;
}
return K_TranslateTimer(player->realtime, 0, nullptr);
}

View file

@ -855,7 +855,7 @@ void K_FakeBotResults(player_t *bot)
--------------------------------------------------*/
void K_PlayerLoseLife(player_t *player)
{
if (!G_GametypeUsesLives())
if (!G_GametypeUsesLives() || !G_GametypeAllowsRetrying())
{
return;
}

View file

@ -2916,6 +2916,14 @@ static int lib_gGametypeUsesLives(lua_State *L)
return 1;
}
static int lib_gGametypeAllowsRetrying(lua_State *L)
{
//HUDSAFE
INLEVEL
lua_pushboolean(L, G_GametypeAllowsRetrying());
return 1;
}
static int lib_gGametypeHasTeams(lua_State *L)
{
//HUDSAFE
@ -3795,6 +3803,7 @@ static luaL_Reg lib[] = {
{"G_SetCustomExitVars",lib_gSetCustomExitVars},
{"G_ExitLevel",lib_gExitLevel},
{"G_GametypeUsesLives",lib_gGametypeUsesLives},
{"G_GametypeAllowsRetrying",lib_gGametypeAllowsRetrying},
{"G_GametypeHasTeams",lib_gGametypeHasTeams},
{"G_GametypeHasSpectators",lib_gGametypeHasSpectators},
{"G_TicsToHours",lib_gTicsToHours},

View file

@ -197,11 +197,11 @@ void M_OpenPauseMenu(void)
{
retryallowed = true;
}
else if (G_GametypeUsesLives())
else if (G_GametypeAllowsRetrying())
{
for (i = 0; i <= splitscreen; i++)
{
if (players[g_localplayers[i]].lives <= 1)
if (G_GametypeUsesLives() && players[g_localplayers[i]].lives <= 1)
continue;
retryallowed = true;
break;

View file

@ -684,7 +684,7 @@ void P_EndingMusic(void)
{
jingle = "RETIRE";
if (G_GametypeUsesLives() == true)
if (G_GametypeAllowsRetrying() == true)
{
// A retry will be happening
nointer = true;
@ -694,7 +694,7 @@ void P_EndingMusic(void)
{
jingle = "_lose";
if (G_GametypeUsesLives() == true)
if (G_GametypeAllowsRetrying() == true)
{
// A retry will be happening
nointer = true;
@ -1245,7 +1245,7 @@ void P_DoPlayerExit(player_t *player, pflags_t flags)
const boolean losing = K_IsPlayerLosing(player); // HEY!!!! Set it AFTER K_UpdateAllPlayerPositions!!!!
const boolean specialout = (specialstageinfo.valid == true && losing == true);
if (G_GametypeUsesLives() && losing)
if (losing)
{
// Remove a life from the losing player
K_PlayerLoseLife(player);
@ -4169,6 +4169,7 @@ void P_PlayerThink(player_t *player)
player->respawn.pointz = player->mo->z;
player->pflags |= PF_LOSTLIFE|PF_ELIMINATED|PF_NOCONTEST;
player->realtime = UINT32_MAX;
K_InitPlayerTally(player);
}