Index: /Daodan/src/Daodan.c
===================================================================
--- /Daodan/src/Daodan.c	(revision 347)
+++ /Daodan/src/Daodan.c	(revision 348)
@@ -24,5 +24,7 @@
 bool patch_largetextures = true;
 bool patch_pathfinding = true;
+bool patch_levelplugins = true;
 bool patch_projaware = true;
+bool patch_directinput = true;
 bool patch_wpfadetime = true;
 bool patch_kickguns = false;
@@ -37,4 +39,5 @@
 bool patch_daodandisplayenum = true;
 bool patch_usegettickcount = true;
+bool patch_cheatsenabled = true;
 bool patch_usedaodangl = false;
 
@@ -55,5 +58,6 @@
 	
 	// Non-"_Final" levels are now valid
-	DDrPatch_Byte  (OniExe + 0x000206a8, 0x01);
+	if (patch_levelplugins)
+		DDrPatch_Byte  (OniExe + 0x000206a8, 0x01);
 	
 	// Pathfinding grid cache size x8
@@ -74,5 +78,6 @@
 	
 	// Forced DirectInput (for Windows NT)
-	DDrPatch_Byte  (OniExe + 0x00002e6d, 0xeb);
+	if (patch_directinput)
+		DDrPatch_Byte  (OniExe + 0x00002e6d, 0xeb);
 	
 	if (patch_wpfadetime)
@@ -178,4 +183,8 @@
 			else if (!stricmp(name, "projaware"))
 				patch_projaware = !stricmp(value, "true");
+			else if (!stricmp(name, "levelplugins"))
+				patch_levelplugins = !stricmp(value, "true");
+			else if (!stricmp(name, "directinput"))
+				patch_directinput = !stricmp(value, "true");
 			else if (!stricmp(name, "wpfadetime"))
 				patch_wpfadetime = !stricmp(value, "true");
@@ -200,4 +209,6 @@
 			else if (!stricmp(name, "usegettickcount"))
 				patch_usegettickcount = !stricmp(value, "true");
+			else if (!stricmp(name, "cheatsenabled"))
+				patch_cheatsenabled = !stricmp(value, "true");
 			else if (!stricmp(name, "usedaodangl"))
 				patch_usedaodangl = !stricmp(value, "true");
@@ -222,4 +233,22 @@
 			else if (!stricmp(name, "blam"))
 				DDrPatch_StrDup(OniExe + 0x0010fb73, value);
+			else if (!stricmp(name, "shapeshifter_on"))
+				DDr_CheatTable[0].message_on = strdup(value);
+			else if (!stricmp(name, "shapeshifter_off"))
+				DDr_CheatTable[0].message_off = strdup(value);
+			else if (!stricmp(name, "liveforever_on"))
+				DDr_CheatTable[1].message_on = strdup(value);
+			else if (!stricmp(name, "liveforever_off"))
+				DDr_CheatTable[1].message_off = strdup(value);
+			else if (!stricmp(name, "touchofdeath_on"))
+				DDr_CheatTable[2].message_on = strdup(value);
+			else if (!stricmp(name, "touchofdeath_off"))
+				DDr_CheatTable[2].message_off = strdup(value);
+			else if (!stricmp(name, "canttouchthis_on"))
+				DDr_CheatTable[3].message_on = strdup(value);
+			else if (!stricmp(name, "canttouchthis_off"))
+				DDr_CheatTable[3].message_off = strdup(value);
+			else if (!stricmp(name, "fatloot_on"))
+				DDr_CheatTable[4].message_off = strdup(value);
 			else
 				DDrStartupMessage("unrecognised language item \"%s\"", name);
@@ -274,5 +303,6 @@
 	
 	// Cheats always enabled
-	DDrPatch_MakeJump(ONrPersist_GetWonGame, DDrPersist_GetWonGame);
+	if (patch_cheatsenabled)
+		DDrPatch_MakeJump(ONrPersist_GetWonGame, DDrPersist_GetWonGame);
 	
 	// Windowed mode
