diff --git a/src/d_main.c b/src/d_main.c
index 2c02565dc0c7e1b1eadadda2a4d2ef6af1550627..2fc0a4c50bd9c07ddd5bd4f33a42cc97566d649a 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -1126,6 +1126,29 @@ 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!
+		FILE *tmpfile;
+		char testfile[MAX_WADPATH];
+
+		snprintf(testfile, sizeof testfile, "%s" PATHSEP "file.tmp", srb2home);
+		testfile[sizeof testfile - 1] = '\0';
+
+		tmpfile = fopen(testfile, "w");
+		if (tmpfile == NULL)
+		{
+#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
+		}
+		else
+		{
+			fclose(tmpfile);
+			remove(testfile);
+		}
+
 #ifdef _arch_dreamcast
 	strcpy(downloaddir, "/ram"); // the dreamcast's TMP
 #endif