--- src.v3/apply.c	Sun Feb 23 09:43:24 2003
+++ src/apply.c	Sat Mar  1 14:29:36 2003
@@ -2546,7 +2546,12 @@
 
     Strcpy(the_wand, yname(obj));
     Sprintf(confirm, "Are you really sure you want to break %s?", the_wand);
+#ifndef PARANOID
     if (yn(confirm) == 'n' ) return 0;
+#else
+    if (flags.paranoid ? !paranoid_yesno(confirm) : (yn(confirm) == 'n'))
+	return 0;
+#endif /* PARANOID */
 
     if (nohands(youmonst.data)) {
 	You_cant("break %s without hands!", the_wand);
--- src.v3/cmd.c	Sat Mar  1 14:17:38 2003
+++ src/cmd.c	Sat Mar  1 14:29:36 2003
@@ -478,9 +478,16 @@
 STATIC_PTR int
 enter_explore_mode()
 {
+	static const char *confirm = "Do you want to enter explore mode?";
+
 	if(!discover && !wizard) {
 		pline("Beware!  From explore mode there will be no return to normal game.");
-		if (yn("Do you want to enter explore mode?") == 'y') {
+#ifndef PARANOID
+		if (yn(confirm) == 'y')
+#else
+		if (flags.paranoid ? paranoid_yesno(confirm) : yn(confirm) == 'y')
+#endif
+		{
 			clear_nhwindow(WIN_MESSAGE);
 			You("are now in non-scoring explore mode.");
 			discover = TRUE;
@@ -2128,6 +2135,26 @@
 	destroy_nhwindow(win);
 	return TRUE;
 }
+
+#ifdef PARANOID
+int
+paranoid_yesno(s)
+const char *s;
+{
+	char buf[BUFSZ];
+	char query[QBUFSZ];
+
+	/* Make sure we have enough room for the "yes/no" before adding it. */
+	if (strlen(s) < QBUFSZ - 10) {
+		strcpy(query, s);
+		strcat(query, " [yes/no]");
+		s = query;
+	}
+	getlin(s, buf);
+	(void)lcase(buf);
+	return !strcmp(buf, "yes");
+}
+#endif /* PARANOID */
 
 #endif /* OVL1 */
 #ifdef OVLB
--- src.v3/end.c	Sun Feb 23 09:43:26 2003
+++ src/end.c	Sat Mar  1 14:29:36 2003
@@ -112,7 +112,13 @@
 int
 done2()
 {
-	if(yn("Really quit?") == 'n') {
+#ifndef PARANOID
+	if(yn("Really quit?") == 'n')
+#else
+	if(flags.paranoid ?
+	   !paranoid_yesno("Really quit?") : (yn("Really quit?") == 'n'))
+#endif /* PARANOID */
+	{
 #ifndef NO_SIGNAL
 		(void) signal(SIGINT, (SIG_RET_TYPE) done1);
 #endif
--- src.v3/options.c	Sat Mar  1 13:59:49 2003
+++ src/options.c	Sat Mar  1 14:29:36 2003
@@ -143,6 +143,9 @@
 #else
 	{"page_wait", (boolean *)0, FALSE, SET_IN_FILE},
 #endif
+#ifdef PARANOID
+	{"paranoid", &flags.paranoid, FALSE, SET_IN_GAME},
+#endif /* PARANOID */
 	{"perm_invent", &flags.perm_invent, FALSE, SET_IN_GAME},
 	{"popup_dialog",  &iflags.wc_popup_dialog, FALSE, SET_IN_GAME},	/*WC*/
 	{"prayconfirm", &flags.prayconfirm, TRUE, SET_IN_GAME},
--- src.v3/polyself.c	Sun Feb 23 09:43:29 2003
+++ src/polyself.c	Sat Mar  1 14:29:36 2003
@@ -957,7 +957,13 @@
 			Sprintf(qbuf, "Really %s %s?",
 			    (adtyp == AD_CONF) ? "confuse" : "attack",
 			    mon_nam(mtmp));
+#ifndef PARANOID
 			if (yn(qbuf) != 'y') continue;
+#else
+			if (flags.paranoid ?
+			    !paranoid_yesno(qbuf) : (yn(qbuf) != 'y'))
+			    continue;
+#endif /* PARANOID */
 			setmangry(mtmp);
 		    }
 		    if (!mtmp->mcanmove || mtmp->mstun || mtmp->msleeping ||
--- src.v3/uhitm.c	Sun Feb 23 09:43:31 2003
+++ src/uhitm.c	Sat Mar  1 14:29:36 2003
@@ -200,7 +200,13 @@
 		}
 		if (canspotmon(mtmp)) {
 			Sprintf(qbuf, "Really attack %s?", mon_nam(mtmp));
-			if (yn(qbuf) != 'y') {
+#ifndef PARANOID
+			if (yn(qbuf) != 'y')
+#else
+			if (flags.paranoid ?
+			    !paranoid_yesno(qbuf) : (yn(qbuf) != 'y'))
+#endif /* PARANOID */
+			{
 				flags.move = 0;
 				return(TRUE);
 			}
--- include.v3/extern.h	Sat Mar  1 13:59:49 2003
+++ include/extern.h	Sat Mar  1 14:29:36 2003
@@ -170,6 +170,9 @@
 E void FDECL(dtoxy, (coord *,int));
 E int FDECL(movecmd, (CHAR_P));
 E int FDECL(getdir, (const char *));
+#ifdef PARANOID
+E int FDECL(paranoid_yesno, (const char *));
+#endif /* PARANOID */
 E void NDECL(confdir);
 E int FDECL(isok, (int,int));
 E int FDECL(get_adjacent_loc, (const char *, const char *, XCHAR_P, XCHAR_P, coord *));
--- include.v3/flag.h	Sun Feb 23 09:43:20 2003
+++ include/flag.h	Sat Mar  1 14:29:36 2003
@@ -61,6 +61,9 @@
 #ifdef MAC
 	boolean  page_wait;	/* put up a --More-- after a page of messages */
 #endif
+#ifdef PARANOID
+	boolean  paranoid;	/* Require "yes" instead of 'y in some cases */
+#endif /* PARANOID */
 	boolean  perm_invent;	/* keep full inventories up until dismissed */
 	boolean  pickup;	/* whether you pickup or move and look */
 
--- dat.v2/opthelp	Sun Feb 23 09:43:16 2003
+++ dat/opthelp	Sat Mar  1 14:29:36 2003
@@ -82,6 +82,9 @@
                start of the game.  Doing so enhances performance
                of the tile graphics, but uses more memory.        [TRUE]
 
+Boolean option if PARANOID was set at compile time:
+paranoid       require "yes" instead of just 'y' in some cases    [FALSE]
+
 Any Boolean option can be negated by prefixing it with a '!' or 'no'.
 
 
--- doc.v4/Guidebook.mn	Sat Mar  1 14:17:38 2003
+++ doc/Guidebook.mn	Sat Mar  1 14:29:36 2003
@@ -1977,6 +1977,10 @@
 The value of this option should be a string containing the
 symbols for the various object types.  Any omitted types are filled in
 at the end from the previous order.
+.lp paranoid
+If true, certain yes/no questions will require a full ``yes'' instead of
+a simple `y' to register an affirmative response.  Only available if the
+PARANOID option was enabled at compile time.
 .lp perm_invent
 If true, always display your current inventory in a window.  This only
 makes sense for windowing system interfaces that implement this feature.
--- doc.v4/Guidebook.tex	Sat Mar  1 14:17:38 2003
+++ doc/Guidebook.tex	Sat Mar  1 14:29:36 2003
@@ -2424,6 +2424,11 @@
 ``\verb&")[%?+!=/(*`0_&''). The value of this option should be a string
 containing the symbols for the various object types.  Any omitted types
 are filled in at the end from the previous order.
++\item[\ib{paranoid}]
++If true, certain yes/no questions will require a full ``yes'' instead of
++a simple `y' to register an affirmative response.  Only available if the
+{\tt PARANOID} option was enabled at compile time.
++%.lp
 %.lp
 \item[\ib{perm\_invent}]
 If true, always display your current inventory in a window.  This only
