]> granicus.if.org Git - nethack/commitdiff
newbie in-game assistance with Guidebook notation
authornethack.allison <nethack.allison>
Sun, 4 Aug 2002 16:48:15 +0000 (16:48 +0000)
committernethack.allison <nethack.allison>
Sun, 4 Aug 2002 16:48:15 +0000 (16:48 +0000)
Provide some command assistance for newbies, but
suppress it with !cmdassist in the config file.

If someone misinterprets the Guidebook ^D, ^T
type command notation, this will pop up some
further information to possibly assist them and
explain the notation.

doc/Guidebook.mn
doc/Guidebook.tex
include/extern.h
include/flag.h
src/cmd.c
src/options.c
src/pager.c

index 4ff488a6faa37241d4284a96f2d136c40049518d..09c34cefa5c7883a09a8b686903d31cd39d6e136 100644 (file)
@@ -1646,6 +1646,9 @@ Check free disk space before writing files to disk (default on).
 You may have to turn this off if you have more than 2 GB free space
 on the partition used for your save and level files.
 Only applies when MFLOPPY was defined during compilation.
+.lp cmdassist
+Have the game provide some additional command assistance for 
+new players if it detects some anticipated mistakes (default on).
 .lp "confirm "
 Have user confirm attacks on pets, shopkeepers, and other
 peaceable creatures (default on).
index cbb2785b129ed90966fe6e4390f3fa4f4a34059a..3b896a5e4ce706b94ecfec5c531ad84d62a9c1a1 100644 (file)
@@ -27,7 +27,7 @@
 \begin{document}
 %
 % input file: guidebook.mn
-% $Revision: 1.45 $ $Date: 2002/07/23 05:10:28 $
+% $Revision: 1.46 $ $Date: 2002/07/28 10:45:46 $
 %
 %.ds h0 "
 %.ds h1 %.ds h2 \%
@@ -2066,6 +2066,10 @@ You may have to turn this off if you have more than 2 GB free space
 on the partition used for your save and level files.
 Only applies when MFLOPPY was defined during compilation.
 %.lp
+\item[\ib{cmdassist}]
+Have the game provide some additional command assistance for new 
+players if it detects some anticipated mistakes (default on).
+%.lp
 \item[\ib{confirm}]
 Have user confirm attacks on pets, shopkeepers, and other
 peaceable creatures (default on).
index b0d9001c0092b07e84ff0669043b6adaa5cb8afa..f5f7de5d0be6ca45861f605a1f3cfcc7e2c79477 100644 (file)
@@ -1369,6 +1369,7 @@ E int NDECL(dowhatis);
 E int NDECL(doquickwhatis);
 E int NDECL(doidtrap);
 E int NDECL(dowhatdoes);
+E char *FDECL(dowhatdoes_core,(CHAR_P, char *));
 E int NDECL(dohelp);
 E int NDECL(dohistory);
 
index 5f32398e8fbfd25ad7ad19fa471b21e1403b7406..cb84d19187b36823972a932ad0ff1947404bd6a3 100644 (file)
@@ -254,6 +254,7 @@ struct instance_flags {
        boolean wc_eight_bit_input;     /* allow eight bit input               */
        boolean wc_mouse_support;       /* allow mouse support */
 
+       boolean  cmdassist;     /* provide detailed assistance for some commands */
        /* Items which belong in flags, but are here to allow save compatibility */
        boolean  lootabc;       /* use "a/b/c" rather than "o/i/b" when looting */
        boolean  showrace;      /* show hero glyph by race rather than by role */
index 65984ea3327aa6148b06a48a9521248956b4db5d..61bd49613f1df2d0fd35510b582e084f07d09c1c 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -148,6 +148,7 @@ static void NDECL(end_of_input);
 static const char* readchar_queue="";
 
 STATIC_DCL char *NDECL(parse);
+STATIC_DCL boolean FDECL(help_control, (CHAR_P, char *));
 
 #ifdef OVL1
 
@@ -1899,7 +1900,7 @@ const char *s;
            dirsym = readchar();
        else
 #endif
-           dirsym = yn_function (s ? s : "In what direction?",
+           dirsym = yn_function ((s && *s != '^') ? s : "In what direction?",
                                        (char *)0, '\0');
 #ifdef REDO
        savech(dirsym);
@@ -1907,14 +1908,55 @@ const char *s;
        if(dirsym == '.' || dirsym == 's')
                u.dx = u.dy = u.dz = 0;
        else if(!movecmd(dirsym) && !u.dz) {
-               if(!index(quitchars, dirsym))
-                       pline("What a strange direction!");
+               boolean did_control = FALSE;
+               if(!index(quitchars, dirsym)) {
+                   if (s && *s == '^' && iflags.cmdassist)
+                       did_control = help_control(dirsym, "Invalid direction key!");
+                   if (!did_control) pline("What a strange direction!");
+               }
                return 0;
        }
        if(!u.dz && (Stunned || (Confusion && !rn2(5)))) confdir();
        return 1;
 }
 
+STATIC_OVL boolean
+help_control(sym, msg)
+char sym;
+char *msg;
+{
+       char ctrl;
+       winid win;
+       char buf[BUFSZ], buf2[BUFSZ], *expl;
+       if (letter(sym)) { 
+           sym = highc(sym);
+           ctrl = (sym - 'A') + 1;
+           if ((expl = dowhatdoes_core(ctrl, buf2))) {
+               win = create_nhwindow(NHW_TEXT);
+               putstr(win, 0, "cmdassist");
+               if (msg) putstr(win, 0, msg);
+               putstr(win, 0, "");
+               Sprintf(buf,
+                       "Are you trying to use ^%c as specified in the Guidebook?",
+                       sym);
+               putstr(win, 0, buf);
+               putstr(win, 0, "");
+               putstr(win, 0, expl);
+               putstr(win, 0, "");
+               putstr(win, 0, "To use that command, you press");
+               Sprintf(buf,
+                       "the <Ctrl> key, and the <%c> key at the same time.", sym);
+               putstr(win, 0, buf);
+               putstr(win, 0, "");
+               putstr(win, 0, "(Suppress this message with !cmdassist in config file.)");
+               display_nhwindow(win, FALSE);
+               destroy_nhwindow(win);
+               return TRUE;
+           }
+       }
+       return FALSE;
+}
+
 #endif /* OVL1 */
 #ifdef OVLB
 
index f200cb91b069c709f01b2974c2adf530841a9bc9..5c1d630e0079994c888414a05acb761addf68ec7 100644 (file)
@@ -68,6 +68,7 @@ static struct Bool_Opt
 #else
        {"checkspace", (boolean *)0, FALSE, SET_IN_FILE},
 #endif
+       {"cmdassist", &iflags.cmdassist, TRUE, SET_IN_GAME},
 # if defined(MICRO) || defined(WIN32)
        {"color",         &iflags.wc_color,TRUE, SET_IN_GAME},          /*WC*/
 # else /* systems that support multiple terminals, many monochrome */
index 75d9be982ef363f6555ed46a67d37cabb3f56ae2..41b5bdf0e33e306c5b57723df6962aaf9a8be8f0 100644 (file)
@@ -739,7 +739,7 @@ doidtrap()
        register struct trap *trap;
        int x, y, tt;
 
-       if (!getdir((char *)0)) return 0;
+       if (!getdir("^")) return 0;
        x = u.ux + u.dx;
        y = u.uy + u.dy;
        for (trap = ftrap; trap; trap = trap->ntrap)
@@ -765,12 +765,14 @@ doidtrap()
        return 0;
 }
 
-int
-dowhatdoes()
+char *
+dowhatdoes_core(q, cbuf)
+char q;
+char *cbuf;
 {
        dlb *fp;
-       char bufr[BUFSZ+6];
-       register char *buf = &bufr[6], *ep, q, ctrl, meta;
+       char bufr[BUFSZ];
+       register char *buf = &bufr[6], *ep, ctrl, meta;
 
        fp = dlb_fopen(CMDHELPFILE, "r");
        if (!fp) {
@@ -778,16 +780,9 @@ dowhatdoes()
                return 0;
        }
 
-#if defined(UNIX) || defined(VMS)
-       introff();
-#endif
-       q = yn_function("What command?", (char *)0, '\0');
-#if defined(UNIX) || defined(VMS)
-       intron();
-#endif
-       ctrl = ((q <= '\033') ? (q - 1 + 'A') : 0);
+       ctrl = ((q <= '\033') ? (q - 1 + 'A') : 0);
        meta = ((0x80 & q) ? (0x7f & q) : 0);
-       while(dlb_fgets(buf,BUFSZ,fp))
+       while(dlb_fgets(buf,BUFSZ-6,fp)) {
            if ((ctrl && *buf=='^' && *(buf+1)==ctrl) ||
                (meta && *buf=='M' && *(buf+1)=='-' && *(buf+2)==meta) ||
                *buf==q) {
@@ -806,12 +801,33 @@ dowhatdoes()
                        buf[0] = q;
                        (void) strncpy(buf+1, "       ", 7);
                }
-               pline("%s", buf);
                (void) dlb_fclose(fp);
-               return 0;
+               Strcpy(cbuf, buf);
+               return cbuf;
            }
-       pline("I've never heard of such commands.");
+       }
        (void) dlb_fclose(fp);
+       return (char *)0;
+}
+
+int
+dowhatdoes()
+{
+       char bufr[BUFSZ];
+       char q, *reslt;
+
+#if defined(UNIX) || defined(VMS)
+       introff();
+#endif
+       q = yn_function("What command?", (char *)0, '\0');
+#if defined(UNIX) || defined(VMS)
+       intron();
+#endif
+       reslt = dowhatdoes_core(q, bufr);
+       if (reslt)
+               pline("%s", reslt);
+       else
+               pline("I've never heard of such commands.");
        return 0;
 }