Index: src/game/g_local.h =================================================================== --- src/game/g_local.h (revision 853) +++ src/game/g_local.h (working copy) @@ -1051,6 +1051,7 @@ extern vmCvar_t g_timelimit; extern vmCvar_t g_suddenDeathTime; +extern vmCvar_t g_suddenDeath; extern vmCvar_t g_friendlyFire; extern vmCvar_t g_friendlyFireHumans; extern vmCvar_t g_friendlyFireAliens; Index: src/game/g_active.c =================================================================== --- src/game/g_active.c (revision 853) +++ src/game/g_active.c (working copy) @@ -1379,7 +1379,7 @@ // Give clients some credit periodically if( ent->client->lastKillTime + FREEKILL_PERIOD < level.time ) { - if( G_TimeTilSuddenDeath( ) <= 0 ) + if( g_suddenDeath.integer ) { //gotta love logic like this eh? } Index: src/game/g_main.c =================================================================== --- src/game/g_main.c (revision 853) +++ src/game/g_main.c (working copy) @@ -42,6 +42,7 @@ vmCvar_t g_fraglimit; vmCvar_t g_timelimit; vmCvar_t g_suddenDeathTime; +vmCvar_t g_suddenDeath; vmCvar_t g_capturelimit; vmCvar_t g_friendlyFire; vmCvar_t g_friendlyFireAliens; @@ -145,6 +146,7 @@ // change anytime vars { &g_timelimit, "timelimit", "0", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue }, { &g_suddenDeathTime, "g_suddenDeathTime", "0", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue }, + { &g_suddenDeath, "g_suddenDeath", "0", 0, 0, qfalse }, { &g_synchronousClients, "g_synchronousClients", "0", CVAR_SYSTEMINFO, 0, qfalse }, @@ -604,6 +606,7 @@ trap_Cvar_Set( "g_humanStage", va( "%d", S1 ) ); trap_Cvar_Set( "g_alienKills", 0 ); trap_Cvar_Set( "g_humanKills", 0 ); + trap_Cvar_Set( "g_suddenDeath", 0 ); G_Printf( "-----------------------------------\n" ); @@ -1001,9 +1004,22 @@ int localHTP = g_humanBuildPoints.integer, localATP = g_alienBuildPoints.integer; - if( g_suddenDeathTime.integer && !level.warmupTime ) + if( g_suddenDeathTime.integer && !g_suddenDeath.integer && + level.suddenDeathWarning == TW_PASSED && G_TimeTilSuddenDeath( ) <= 0 ) { - if( G_TimeTilSuddenDeath( ) <= 0 ) + // prevent sudden death from starting again + } + else if( !g_suddenDeath.integer && level.suddenDeathWarning == TW_PASSED ) + { + level.suddenDeathWarning = TW_NOT; + } + else if( ( g_suddenDeathTime.integer || g_suddenDeath.integer ) && + !level.warmupTime ) + { + if( !g_suddenDeath.integer && G_TimeTilSuddenDeath( ) <= 0 ) + trap_Cvar_Set( "g_suddenDeath", "1" ); + + if( g_suddenDeath.integer ) { localHTP = 0; localATP = 0; @@ -1017,6 +1033,8 @@ } else { + localHTP = g_humanBuildPoints.integer; + localATP = g_alienBuildPoints.integer; //warn about sudden death if( G_TimeTilSuddenDeath( ) <= 60000 && level.suddenDeathWarning < TW_IMMINENT ) @@ -1026,12 +1044,8 @@ } } } - else - { - localHTP = g_humanBuildPoints.integer; - localATP = g_alienBuildPoints.integer; - } + level.humanBuildPoints = level.humanBuildPointsPowered = localHTP; level.alienBuildPoints = localATP; Index: src/game/g_cmds.c =================================================================== --- src/game/g_cmds.c (revision 853) +++ src/game/g_cmds.c (working copy) @@ -1738,7 +1738,7 @@ return; // Don't allow destruction of buildables that cannot be rebuilt - if( G_TimeTilSuddenDeath( ) <= 0 && + if( g_suddenDeath.integer && BG_FindBuildPointsForBuildable( traceEnt->s.modelindex ) ) { return;