diff --git a/src/d_main.c b/src/d_main.c
index 2c02565dc0c7e1b1eadadda2a4d2ef6af1550627..8a63f61f8a277f4fd1bd99800154c7e263db2c83 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -999,6 +999,7 @@ void D_SRB2Main(void)
 	lumpinfo_t *lumpinfo;
 	UINT16 wadnum;
 	char *name;
+	FILE *tmpfile;
 
 	INT32 pstartmap = 1;
 	boolean autostart = false;
@@ -1126,6 +1127,19 @@ void D_SRB2Main(void)
 
 		configfile[sizeof configfile - 1] = '\0';
 
+		// If config isn't writable, tons of behavior will be broken.
+		// Fail loudly before things get confusing!
+		tmpfile = fopen(configfile, "w");
+		if (!tmpfile)
+		{
+#if defined (_WIN32)
+			I_Error("Couldn't write game config.\nMake sure the game is installed somewhere it has write permissions.\n\n(Don't use the Downloads folder, Program Files, or your desktop!\nIf unsure, we recommend making a subfolder in your Documents folder.)");
+#else
+			I_Error("Couldn't write game config.\nMake sure you've installed the game somewhere it has write permissions.");
+#endif
+		}
+		fclose(tmpfile);
+
 #ifdef _arch_dreamcast
 	strcpy(downloaddir, "/ram"); // the dreamcast's TMP
 #endif