diff --git a/src/d_main.c b/src/d_main.c
index e25ef998e040bc51dda58ff80fc84a1c9be4a9f2..e79234730c5eb6995499a49807311342a6d1be26 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -715,7 +715,7 @@ void D_StartTitle(void)
 
 	if (netgame)
 	{
-		if (gametype == GT_COOP)
+		if (gametyperules & GTR_CAMPAIGN)
 		{
 			G_SetGamestate(GS_WAITINGPLAYERS); // hack to prevent a command repeat
 
diff --git a/src/dehacked.c b/src/dehacked.c
index d71ed854c92ca134771193edd1ff99d3d0489ac2..9a4e0d499721d7a38660f23fb7fa53b003831877 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -8930,6 +8930,7 @@ static const char *const GAMETYPERULE_LIST[] = {
 	"SPAWNENEMIES",
 	"ALLOWEXIT",
 	"NOTITLECARD",
+	"CUTSCENES",
 	NULL
 };
 
diff --git a/src/doomstat.h b/src/doomstat.h
index 1e0eb4815d1d4ad91d4271a85b9713f479a19a93..6d1d6eb3665b95eceb0c58683086722d0f98b92f 100644
--- a/src/doomstat.h
+++ b/src/doomstat.h
@@ -425,6 +425,7 @@ enum GameTypeRules
 	GTR_SPAWNENEMIES     = 1<<28, // Spawn enemies
 	GTR_ALLOWEXIT        = 1<<29, // Allow exit sectors
 	GTR_NOTITLECARD      = 1<<30, // Don't show the title card
+	GTR_CUTSCENES        = 1<<31, // Play cutscenes, ending, credits, and evaluation
 };
 
 // String names for gametypes
diff --git a/src/g_game.c b/src/g_game.c
index 67b6c2098f7222a4a5d522770cab324d338ee9f7..e201faf6af8bf608e0f11d32b646add3609d9655 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -3193,7 +3193,7 @@ const char *Gametype_ConstantNames[NUMGAMETYPES] =
 UINT32 gametypedefaultrules[NUMGAMETYPES] =
 {
 	// Co-op
-	GTR_CAMPAIGN|GTR_LIVES|GTR_FRIENDLY|GTR_SPAWNENEMIES|GTR_ALLOWEXIT|GTR_EMERALDHUNT|GTR_EMERALDTOKENS|GTR_SPECIALSTAGES,
+	GTR_CAMPAIGN|GTR_LIVES|GTR_FRIENDLY|GTR_SPAWNENEMIES|GTR_ALLOWEXIT|GTR_EMERALDHUNT|GTR_EMERALDTOKENS|GTR_SPECIALSTAGES|GTR_CUTSCENES,
 	// Competition
 	GTR_RACE|GTR_LIVES|GTR_SPAWNENEMIES|GTR_EMERALDTOKENS|GTR_SPAWNINVUL|GTR_ALLOWEXIT,
 	// Race
@@ -3765,7 +3765,7 @@ void G_AfterIntermission(void)
 
 	HU_ClearCEcho();
 
-	if (mapheaderinfo[gamemap-1]->cutscenenum && !modeattacking && skipstats <= 1) // Start a custom cutscene.
+	if ((gametyperules & GTR_CUTSCENES) && mapheaderinfo[gamemap-1]->cutscenenum && !modeattacking && skipstats <= 1) // Start a custom cutscene.
 		F_StartCustomCutscene(mapheaderinfo[gamemap-1]->cutscenenum-1, false, false);
 	else
 	{
@@ -3875,7 +3875,7 @@ static void G_DoContinued(void)
 void G_EndGame(void)
 {
 	// Only do evaluation and credits in coop games.
-	if (gametype == GT_COOP)
+	if (gametyperules & GTR_CUTSCENES)
 	{
 		if (nextmap == 1103-1) // end game with ending
 		{
@@ -4578,7 +4578,7 @@ void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean
 	automapactive = false;
 	imcontinuing = false;
 
-	if (!skipprecutscene && mapheaderinfo[gamemap-1]->precutscenenum && !modeattacking) // Start a custom cutscene.
+	if ((gametyperules & GTR_CUTSCENES) && !skipprecutscene && mapheaderinfo[gamemap-1]->precutscenenum && !modeattacking) // Start a custom cutscene.
 		F_StartCustomCutscene(mapheaderinfo[gamemap-1]->precutscenenum-1, true, resetplayer);
 	else
 		G_DoLoadLevel(resetplayer);