From: nethack.allison Date: Sun, 4 Aug 2002 16:48:15 +0000 (+0000) Subject: newbie in-game assistance with Guidebook notation X-Git-Tag: MOVE2GIT~2570 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8631cba725f8e5342467e20377119204646d2163;p=nethack newbie in-game assistance with Guidebook notation 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. --- diff --git a/doc/Guidebook.mn b/doc/Guidebook.mn index 4ff488a6f..09c34cefa 100644 --- a/doc/Guidebook.mn +++ b/doc/Guidebook.mn @@ -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). diff --git a/doc/Guidebook.tex b/doc/Guidebook.tex index cbb2785b1..3b896a5e4 100644 --- a/doc/Guidebook.tex +++ b/doc/Guidebook.tex @@ -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). diff --git a/include/extern.h b/include/extern.h index b0d9001c0..f5f7de5d0 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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); diff --git a/include/flag.h b/include/flag.h index 5f32398e8..cb84d1918 100644 --- a/include/flag.h +++ b/include/flag.h @@ -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 */ diff --git a/src/cmd.c b/src/cmd.c index 65984ea33..61bd49613 100644 --- 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 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 diff --git a/src/options.c b/src/options.c index f200cb91b..5c1d630e0 100644 --- a/src/options.c +++ b/src/options.c @@ -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 */ diff --git a/src/pager.c b/src/pager.c index 75d9be982..41b5bdf0e 100644 --- a/src/pager.c +++ b/src/pager.c @@ -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; }