From f1d91a071dc4d658d8194ab99fbdc68044410882 Mon Sep 17 00:00:00 2001 From: nhmall Date: Thu, 16 Feb 2023 19:34:33 -0500 Subject: [PATCH 01/66] status --- include/global.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/global.h b/include/global.h index a2b70d2587..5c02491c32 100644 --- a/include/global.h +++ b/include/global.h @@ -19,7 +19,7 @@ /* * Development status of this NetHack version. */ -#define NH_DEVEL_STATUS NH_STATUS_RELEASED +#define NH_DEVEL_STATUS NH_STATUS_POSTRELEASE #ifndef DEBUG /* allow tool chains to define without causing warnings */ #define DEBUG From 79cf1e902483c070b209b55059159da5f2120b97 Mon Sep 17 00:00:00 2001 From: Rui Chen Date: Fri, 24 Feb 2023 12:02:03 +0100 Subject: [PATCH 02/66] fix: add build patch for osx build Signed-off-by: Rui Chen --- include/tradstdc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/tradstdc.h b/include/tradstdc.h index a70698be40..f5fb90c1b0 100644 --- a/include/tradstdc.h +++ b/include/tradstdc.h @@ -429,7 +429,7 @@ typedef genericptr genericptr_t; /* (void *) or (char *) */ #if __GNUC__ >= 3 #define UNUSED __attribute__((unused)) #define NORETURN __attribute__((noreturn)) -#if !defined(__linux__) || defined(GCC_URWARN) +#if (!defined(__linux__) && !defined(__APPLE__)) || defined(GCC_URWARN) /* disable gcc's __attribute__((__warn_unused_result__)) since explicitly discarding the result by casting to (void) is not accepted as a 'use' */ #define __warn_unused_result__ /*empty*/ From 557e18611a860fa17bbb8e5dbfd37b96c9304fe1 Mon Sep 17 00:00:00 2001 From: nhmall Date: Fri, 24 Feb 2023 09:46:55 -0500 Subject: [PATCH 03/66] post-3.6.7 build fix with newer c library headers As reported for the Homebrew build Closes #988 --- doc/fixes36.7 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index f5138bb744..68c46bd66d 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -40,6 +40,7 @@ none Fixes to 3.6.7 Post-release Problems and other Post-release changes ------------------------------------------------------------------- -none +extend the fix for build failure with newer c library headers to macOS (pr #988) + From eff7cfbd9852f41d04af9ee1339a11ac78f7510f Mon Sep 17 00:00:00 2001 From: nhmall Date: Thu, 23 Mar 2023 09:08:00 -0400 Subject: [PATCH 04/66] Windows: backport fix for asan range error --- doc/fixes36.7 | 1 + src/.gitignore | 4 +++- util/.gitignore | 3 +++ win/win32/mhdlg.c | 10 ++++++---- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index 68c46bd66d..720cbb364b 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -41,6 +41,7 @@ none Fixes to 3.6.7 Post-release Problems and other Post-release changes ------------------------------------------------------------------- extend the fix for build failure with newer c library headers to macOS (pr #988) +Windows: fix range error detected by address sanitizer in plselInitDialog() diff --git a/src/.gitignore b/src/.gitignore index 6cdb6269a0..44101d8c02 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -12,4 +12,6 @@ graphicschk nhdat o nhdat* - +#address san +*.exp +*.lib diff --git a/util/.gitignore b/util/.gitignore index 9a54f6f2e9..28c0b29335 100644 --- a/util/.gitignore +++ b/util/.gitignore @@ -23,3 +23,6 @@ xpm2ppm.ttp # dev tool for analyzing data collected by nethack's #define MONITOR_HEAP heaputil heaputil.c +#address san +*.exp +*.lib diff --git a/win/win32/mhdlg.c b/win/win32/mhdlg.c index cb76c9a18c..8fdb51d3ec 100644 --- a/win/win32/mhdlg.c +++ b/win/win32/mhdlg.c @@ -574,6 +574,7 @@ plselInitDialog(struct plsel_data * data) { TCHAR wbuf[BUFSZ]; LVCOLUMN lvcol; + control_t *control; SetWindowLongPtr(data->dialog, GWLP_USERDATA, (LONG_PTR) data); @@ -654,10 +655,11 @@ plselInitDialog(struct plsel_data * data) plselAdjustSelections(data->dialog); /* set tab order */ - control_t * control = &data->controls[psc_quit_button]; - for(int i = psc_quit_button; i >= psc_name_box; i--, control++) - SetWindowPos(control->hWnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - + for(int i = psc_quit_button; i >= psc_name_box; i--) { + control = &data->controls[i]; + SetWindowPos(control->hWnd, NULL, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE); + } do_player_selector_layout(data); center_dialog(data->dialog); From 61e76df77eb8bc9f7dc3797c033ce54dc9ffb2d9 Mon Sep 17 00:00:00 2001 From: nhmall Date: Fri, 31 Mar 2023 15:38:40 -0400 Subject: [PATCH 05/66] hilite_pile glitch after eating floor food Steps to reproduce the bug: 1. Wish for potion of invisibility and quaff it so you don't see yourself 2. Wish for 2 apples. 3. Wish for orc corpse. (order matters below) 4. Drop the apples. 5. Drop the orc corpse. (must be dropped on top of the apples for the bug). 6. Eat (say "no" to orc corpse, "yes" to first apple). 7. Eat (say "no" to orc corpse, "yes" to last apple). bug is that the pile hilite remains on the display. The issue is that there is a test in show_glyph() that has no knowledge of piles, and it would be difficult to fix that without breaking 3.6.x savefile compatibility: if (gbuf[y][x].glyph != glyph || iflags.use_background_glyph) { gbuf[y][x].glyph = glyph; gbuf[y][x].new = 1; if (gbuf_start[y] > x) gbuf_start[y] = x; if (gbuf_stop[y] < x) gbuf_stop[y] = x; } Someone added newsym_force() for just such a situation, so use that in delobj() when the state of the pile has changed. Sidenote: NetHack-3.7 has separate glyphs for all the piletops, so the test above does catch the change, and no force is required. --- src/invent.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/invent.c b/src/invent.c index 151c5317cb..51075ccbdc 100644 --- a/src/invent.c +++ b/src/invent.c @@ -1178,7 +1178,8 @@ void delobj(obj) register struct obj *obj; { - boolean update_map; + boolean update_map, was_pile, is_pile; + int x = 0, y = 0; if (obj->otyp == AMULET_OF_YENDOR || obj->otyp == CANDELABRUM_OF_INVOCATION @@ -1192,9 +1193,19 @@ register struct obj *obj; return; } update_map = (obj->where == OBJ_FLOOR); + if (update_map) { + x = obj->ox; + y = obj->oy; + was_pile = (level.objects[x][y] && level.objects[x][y]->nexthere); + } obj_extract_self(obj); - if (update_map) - newsym(obj->ox, obj->oy); + if (update_map) { + is_pile = (level.objects[x][y] && level.objects[x][y]->nexthere); + if (was_pile != is_pile) + newsym_force(x, y); + else + newsym(x, y); + } obfree(obj, (struct obj *) 0); /* frees contents also */ } From f21a5d0f7600eba862b337bf054672c0299b29df Mon Sep 17 00:00:00 2001 From: nhmall Date: Fri, 31 Mar 2023 15:40:17 -0400 Subject: [PATCH 06/66] fixes update to post-3.6.7 section --- doc/fixes36.7 | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index 720cbb364b..a70f38596c 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -42,6 +42,7 @@ Fixes to 3.6.7 Post-release Problems and other Post-release changes ------------------------------------------------------------------- extend the fix for build failure with newer c library headers to macOS (pr #988) Windows: fix range error detected by address sanitizer in plselInitDialog() +hilite_pile can remain on the map after eating food off the floor From e769a30b0f7cc325d4b0607f122ab6c42693030c Mon Sep 17 00:00:00 2001 From: PatR Date: Wed, 10 May 2023 12:26:23 -0700 Subject: [PATCH 07/66] build fix for VMS: include/winprocs.h sys/vms/vmsmail.c uses wintypes.h and winprocs.h without hack.h. 3.6.3 introduced a change to winprocs.h which broke that but wasn't noticed until now. The fix is trivial. --- doc/fixes36.7 | 8 ++++---- include/winprocs.h | 5 ++++- sys/vms/Makefile.src | 6 +++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index a70f38596c..c6aa8de18b 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -1,4 +1,4 @@ -$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.4 $ $NHDT-Date: 1587039894 2020/04/16 12:24:54 $ +$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.21 $ $NHDT-Date: 1683746783 2023/05/10 19:26:23 $ fixes36.7 contains a summary of changes made to 3.6.6 in order to produce 3.6.7 as well as any post-release fixes in binaries. @@ -40,9 +40,9 @@ none Fixes to 3.6.7 Post-release Problems and other Post-release changes ------------------------------------------------------------------- -extend the fix for build failure with newer c library headers to macOS (pr #988) +extend the fix for build failure w/ newer C library headers to macOS (pr #988) Windows: fix range error detected by address sanitizer in plselInitDialog() hilite_pile can remain on the map after eating food off the floor - - +vms: update winprocs.h to ensure that CLR_MAX is defined; necessary for + compiling vmsmail.c which uses winprocs.h but not hack.h diff --git a/include/winprocs.h b/include/winprocs.h index 55b2b06113..845669d3f4 100644 --- a/include/winprocs.h +++ b/include/winprocs.h @@ -1,4 +1,4 @@ -/* NetHack 3.6 winprocs.h $NHDT-Date: 1567213890 2019/08/31 01:11:30 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.50 $ */ +/* NetHack 3.6 winprocs.h $NHDT-Date: 1683746775 2023/05/10 19:26:15 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.53 $ */ /* Copyright (c) David Cohrs, 1992 */ /* NetHack may be freely redistributed. See license for details. */ @@ -6,6 +6,9 @@ #define WINPROCS_H #include "botl.h" +#ifndef CLR_MAX +#include "color.h" +#endif /* NB: this MUST match chain_procs below */ struct window_procs { diff --git a/sys/vms/Makefile.src b/sys/vms/Makefile.src index c15d10f60f..a949801694 100644 --- a/sys/vms/Makefile.src +++ b/sys/vms/Makefile.src @@ -1,5 +1,5 @@ # NetHack Makefile (VMS) - for building nethack itself. -# NetHack 3.6 Makefile.src $NHDT-Date: 1557701517 2019/05/12 22:51:57 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.36 $ +# NetHack 3.6 Makefile.src $NHDT-Date: 1683746779 2023/05/10 19:26:19 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.42 $ # Copyright (c) 2011 by Robert Patrick Rankin # NetHack may be freely redistributed. See license for details. @@ -375,7 +375,7 @@ vmsunix.obj : $(VMS)vmsunix.c $(HACK_H) vmsmisc.obj : $(VMS)vmsmisc.c $(VMS)oldcrtl.c $(CONFIG_H) vmsfiles.obj : $(VMS)vmsfiles.c $(CONFIG_H) vmsmail.obj : $(VMS)vmsmail.c $(CONFIG_H) $(INC)mail.h \ - $(INC)wintype.h $(INC)winprocs.h + $(INC)wintype.h $(INC)winprocs.h $(INC)color.h # conditionally used code -- VMS always wants these isaac64.obj : isaac64.c $(CONFIG_H) $(INC)isaac64.h random.obj : random.c $(HACK_H) @@ -384,7 +384,7 @@ random.c : $(SYSSHR)random.c tclib.obj : tclib.c $(CONFIG_H) tclib.c : $(SYSSHR)tclib.c copy $(SYSSHR)tclib.c tclib.c -# user interface code -- VMS uses tty or curses or both, not X11 +# user interface code -- VMS uses tty, not curses or X11 getline.obj : $(TTY)getline.c $(HACK_H) $(INC)func_tab.h termcap.obj : $(TTY)termcap.c $(HACK_H) $(INC)tcap.h topl.obj : $(TTY)topl.c $(HACK_H) $(INC)tcap.h From 963c3acea7af2c84ddb4697298608f67b6261373 Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 28 Aug 2023 16:23:47 -0400 Subject: [PATCH 08/66] avoid crash in curses during #quit On GitHub issue 1090, Rhialto wrote: Hi! I am currently in the process of adapting the pkgsrc packaging of NetHack 3.6.7 to include the curses window option. A bit late perhaps... While working on that, I ran into a case of a NULL pointer being used. Apparently when linking with ncurses, this doesn't cause problems, but NetBSD's own curses doesn't like it, and crashes the game. Here is the stack trace. It happens when #quitting, I think just before the high scores are about to be shown (but I guess it should show in the stack trace if I'm totally correct with that): (gdb) bt #0 redrawwin (win=0x0) at /usr/src/lib/libcurses/touchwin.c:149 #1 0x0000000017e104b4 in curses_refresh_nethack_windows () at ../win/curses/curswins.c:176 #2 0x0000000017e1054a in curses_destroy_win (win=win@entry=0x7ad219520540) at ../win/curses/curswins.c:155 #3 0x0000000017e1512c in curses_display_nhmenu (wid=, how=, _selected=0x7f7fff65d850) at ../win/curses/cursdial.c:771 #4 0x0000000017e0ff81 in curses_select_menu (wid=wid@entry=21, how=how@entry=0, selected=selected@entry=0x7f7fff65d850) at ../win/curses/cursmain.c:607 #5 0x0000000017e10257 in curses_display_nhwindow (wid=21, block=1) at ../win/curses/cursmain.c:385 #6 0x0000000017ca8075 in really_done (how=, how@entry=13) at end.c:1609 #7 0x0000000017ca993f in done (how=how@entry=13) at end.c:1201 #8 0x0000000017ca9c85 in done2 () at end.c:381 #9 done2 () at end.c:337 #10 0x0000000017c489da in doextcmd () at cmd.c:363 #11 0x0000000017c57e94 in rhack (cmd=, cmd@entry=0x0) at cmd.c:4909 #12 0x0000000017c265da in moveloop (resuming=) at allmain.c:435 #13 0x0000000017e1b862 in main (argc=, argv=) at ../sys/unix/unixmain.c:351 status_window is NULL here. Simply checking for NULL avoids the problem. I added checks for the other windows as well, while I was there. --- doc/fixes36.7 | 3 ++- win/curses/curswins.c | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index c6aa8de18b..353e2deaa1 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -45,4 +45,5 @@ Windows: fix range error detected by address sanitizer in plselInitDialog() hilite_pile can remain on the map after eating food off the floor vms: update winprocs.h to ensure that CLR_MAX is defined; necessary for compiling vmsmail.c which uses winprocs.h but not hack.h - +curses: when #quitting, just before the high scores are about to be shown + status_window was NULL and dereferenced, so add checks (issue #1090) diff --git a/win/curses/curswins.c b/win/curses/curswins.c index bd2f505e8f..050549cfed 100644 --- a/win/curses/curswins.c +++ b/win/curses/curswins.c @@ -173,12 +173,18 @@ curses_refresh_nethack_windows() touchwin(stdscr); refresh(); } else { - touchwin(status_window); - wnoutrefresh(status_window); - touchwin(map_window); - wnoutrefresh(map_window); - touchwin(message_window); - wnoutrefresh(message_window); + if (status_window) { + touchwin(status_window); + wnoutrefresh(status_window); + } + if (map_window) { + touchwin(map_window); + wnoutrefresh(map_window); + } + if (message_window) { + touchwin(message_window); + wnoutrefresh(message_window); + } if (inv_window) { touchwin(inv_window); wnoutrefresh(inv_window); From 2a0b5726a90394cd2ac758df0c0fc2360ba4afe0 Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 1 Jan 2024 11:06:02 -0500 Subject: [PATCH 09/66] update year in copyright to 2024 --- include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/patchlevel.h b/include/patchlevel.h index a52c7156b8..0cd31fe1f6 100644 --- a/include/patchlevel.h +++ b/include/patchlevel.h @@ -16,7 +16,7 @@ */ #define EDITLEVEL 0 -#define COPYRIGHT_BANNER_A "NetHack, Copyright 1985-2023" +#define COPYRIGHT_BANNER_A "NetHack, Copyright 1985-2024" #define COPYRIGHT_BANNER_B \ " By Stichting Mathematisch Centrum and M. Stephenson." /* COPYRIGHT_BANNER_C is generated by makedefs into date.h */ From 0792685d64262dff15b94f83995c0bcdf2b2a97a Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 12 Mar 2024 11:15:21 -0400 Subject: [PATCH 10/66] backport of fix for GitHub issue #391 to NetHack-3.6 --- doc/fixes36.7 | 6 +++ util/makedefs.c | 113 ++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 102 insertions(+), 17 deletions(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index 353e2deaa1..b03a868757 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -47,3 +47,9 @@ vms: update winprocs.h to ensure that CLR_MAX is defined; necessary for compiling vmsmail.c which uses winprocs.h but not hack.h curses: when #quitting, just before the high scores are about to be shown status_window was NULL and dereferenced, so add checks (issue #1090) +when make was invoked with -j makedefs instances could end up running in + parallel and could trample on each other's temp files; default to + using mkstemp(); allow a port runtime library implementation that lacks + mkstemp() to define HAS_NO_MKSTEMP to revert to the old behaviour; + provide a work-alike mkstemp() implementation for windows visual studio + so there is no requirement to define HAS_NO_MKSTEMP there diff --git a/util/makedefs.c b/util/makedefs.c index cd971bcc0f..fb10155577 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -52,6 +52,12 @@ #define rewind(fp) fseek((fp), 0L, SEEK_SET) /* guarantee a return value */ #endif +#ifndef HAS_NO_MKSTEMP +#ifdef _MSC_VER +static int FDECL(mkstemp, (char *)); +#endif +#endif + #if defined(UNIX) && !defined(LINT) && !defined(GCC_WARN) static const char SCCS_Id[] UNUSED = "@(#)makedefs.c\t3.6\t2020/03/04"; #endif @@ -130,6 +136,8 @@ static struct version_info version; #define CLOSE_OFF_TABLE_STRING "99" /* for the close table */ #define FAR_OFF_TABLE_STRING "0xff" /* for the far table */ +#define FLG_TEMPFILE 0x01 /* flag for temp file */ + #define sign(z) ((z) < 0 ? -1 : ((z) ? 1 : 0)) #ifdef VISION_TABLES static char xclear[MAX_ROW][MAX_COL]; @@ -171,7 +179,7 @@ extern void NDECL(objects_init); /* objects.c */ static void NDECL(link_sanity_check); static char *FDECL(name_file, (const char *, const char *)); static void FDECL(delete_file, (const char *template, const char *)); -static FILE *FDECL(getfp, (const char *, const char *, const char *)); +static FILE *FDECL(getfp, (const char *, const char *, const char *, int)); static void FDECL(do_ext_makedefs, (int, char **)); static void NDECL(make_version); @@ -421,16 +429,39 @@ const char *tag; } static FILE * -getfp(template, tag, mode) +getfp(template, tag, mode, flg) const char *template; const char *tag; const char *mode; +#ifndef HAS_NO_MKSTEMP +int flg; +#else +int flg UNUSED; +#endif { char *name = name_file(template, tag); - FILE *rv = fopen(name, mode); - + FILE *rv = (FILE *) 0; +#ifndef HAS_NO_MKSTEMP + boolean istemp = (flg & FLG_TEMPFILE) != 0; + char tmpfbuf[MAXFNAMELEN]; + int tmpfd; +#endif + +#ifndef HAS_NO_MKSTEMP + if (istemp) { + (void) snprintf(tmpfbuf, sizeof tmpfbuf, DATA_TEMPLATE, "mdXXXXXX"); + tmpfd = mkstemp(tmpfbuf); + if (tmpfd >= 0) + rv = fdopen(tmpfd, WRTMODE); /* temp file is always read+write */ + } else +#endif + rv = fopen(name, mode); if (!rv) { - Fprintf(stderr, "Can't open '%s'.\n", name); + Fprintf(stderr, "Can't open '%s'.\n", +#ifndef HAS_NO_MKSTEMP + istemp ? tmpfbuf : +#endif + name); exit(EXIT_FAILURE); } return rv; @@ -454,7 +485,7 @@ static int FDECL(grep_check_id, (const char *)); static void FDECL(grep_show_wstack, (const char *)); static char *FDECL(do_grep_control, (char *)); static void NDECL(do_grep); -static void FDECL(grep0, (FILE *, FILE *)); +static void FDECL(grep0, (FILE *, FILE *, int)); static int grep_trace = 0; @@ -805,7 +836,7 @@ char *buf; } #endif -static void grep0(FILE *, FILE *); +static void grep0(FILE *, FILE *, int); static void do_grep() @@ -820,14 +851,26 @@ do_grep() exit(EXIT_FAILURE); } - grep0(inputfp, outputfp); + grep0(inputfp, outputfp, 0); } static void -grep0(inputfp0, outputfp0) +grep0(inputfp0, outputfp0, flg) FILE *inputfp0; FILE *outputfp0; +#ifndef HAS_NO_MKSTEMP +int flg; +#else +int flg UNUSED; +#endif { +#ifndef HAS_NO_MKSTEMP + /* if grep0 is passed FLG_TEMPFILE flag, it will + leave the output file open when it returns. + The caller will have to take care of calling + fclose() when it is done with the file */ + boolean istemp = (flg & FLG_TEMPFILE) != 0; +#endif char buf[16384]; /* looong, just in case */ while (!feof(inputfp0) && !ferror(inputfp0)) { @@ -867,7 +910,12 @@ FILE *outputfp0; exit(EXIT_FAILURE); } fclose(inputfp0); - fclose(outputfp0); +#ifndef HAS_NO_MKSTEMP + if (istemp) + rewind(outputfp0); + else +#endif + fclose(outputfp0); if (grep_sp) { Fprintf(stderr, "%d unterminated conditional level%s\n", grep_sp, grep_sp == 1 ? "" : "s"); @@ -993,9 +1041,13 @@ const char *deflt_content; more likely to be picked than normal but it's nothing to worry about */ (void) fputs(xcrypt(deflt_content), ofp); - tfp = getfp(DATA_TEMPLATE, "grep.tmp", WRTMODE); - grep0(ifp, tfp); - ifp = getfp(DATA_TEMPLATE, "grep.tmp", RDTMODE); + tfp = getfp(DATA_TEMPLATE, "grep.tmp", WRTMODE, FLG_TEMPFILE); + grep0(ifp, tfp, FLG_TEMPFILE); +#ifndef HAS_NO_MKSTEMP + ifp = tfp; +#else + ifp = getfp(DATA_TEMPLATE, "grep.tmp", RDTMODE, 0); +#endif while ((line = fgetline(ifp)) != 0) { if (line[0] != '#' && line[0] != '\n') @@ -1005,7 +1057,10 @@ const char *deflt_content; Fclose(ifp); Fclose(ofp); +#ifdef HAS_NO_MKSTEMP delete_file(DATA_TEMPLATE, "grep.tmp"); +#endif + return; } @@ -2291,10 +2346,13 @@ do_dungeon() } Fprintf(ofp, "%s", Dont_Edit_Data); - tfp = getfp(DATA_TEMPLATE, "grep.tmp", WRTMODE); - grep0(ifp, tfp); - ifp = getfp(DATA_TEMPLATE, "grep.tmp", RDTMODE); - + tfp = getfp(DATA_TEMPLATE, "grep.tmp", WRTMODE, FLG_TEMPFILE); + grep0(ifp, tfp, FLG_TEMPFILE); +#ifndef HAS_NO_MKSTEMP + ifp = tfp; +#else + ifp = getfp(DATA_TEMPLATE, "grep.tmp", RDTMODE, 0); +#endif while ((line = fgetline(ifp)) != 0) { SpinCursor(3); @@ -2305,10 +2363,13 @@ do_dungeon() (void) fputs(line, ofp); free(line); } + Fclose(ifp); Fclose(ofp); +#ifdef HAS_NO_MKSTEMP delete_file(DATA_TEMPLATE, "grep.tmp"); +#endif return; } @@ -2957,6 +3018,24 @@ char *str; return str; } +#ifndef HAS_NO_MKSTEMP +#ifdef _MSC_VER +int +mkstemp(template) +char *template; +{ + int err; + + err = _mktemp_s(template, strlen(template) + 1); + if( err != 0 ) + return -1; + return _open(template, + _O_RDWR | _O_BINARY | _O_TEMPORARY | _O_CREAT, + _S_IREAD | _S_IWRITE); +} +#endif /* _MSC_VER */ +#endif /* HAS_NO_MKSTEMP */ + /* * macro used to control vision algorithms: * VISION_TABLES => generate tables From 7a815d2eeece0535ed7fee5c30c76b01e00ae5ca Mon Sep 17 00:00:00 2001 From: nhmall Date: Thu, 11 Apr 2024 11:08:19 -0400 Subject: [PATCH 11/66] mingw32 NetHack 3.6.7 build fixes - April 2024 --- doc/fixes36.7 | 3 +++ sys/winnt/Makefile.gcc | 18 +++++++++--------- sys/winnt/stubs.c | 2 +- sys/winnt/winnt.c | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index b03a868757..cb333ea141 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -53,3 +53,6 @@ when make was invoked with -j makedefs instances could end up running in mkstemp() to define HAS_NO_MKSTEMP to revert to the old behaviour; provide a work-alike mkstemp() implementation for windows visual studio so there is no requirement to define HAS_NO_MKSTEMP there +fix the mingw32 build of NetHack 3.6.7 by updating sys/winnt/Makefile.gcc, + sys/winnt/winnt.c and sys/winnt/stubs.c + diff --git a/sys/winnt/Makefile.gcc b/sys/winnt/Makefile.gcc index 5932b2a128..7dfd7cc49e 100644 --- a/sys/winnt/Makefile.gcc +++ b/sys/winnt/Makefile.gcc @@ -139,7 +139,7 @@ SKIP_NETHACKW=Y #============================================================================== # The version of the game this Makefile was designed for -NETHACK_VERSION="3.6.6" +NETHACK_VERSION="3.6.7" # A brief version for use in macros NHV1=$(subst .,,$(NETHACK_VERSION)) @@ -375,8 +375,8 @@ endif COMCTRL = comctl32.lib -KEYDLLS = $(GAMEDIR)/nhdefkey.dll $(GAMEDIR)/nh340key.dll \ - $(GAMEDIR)/nhraykey.dll +#KEYDLLS = $(GAMEDIR)/nhdefkey.dll $(GAMEDIR)/nh340key.dll \ +# $(GAMEDIR)/nhraykey.dll TILEUTIL16 = $(UTIL)/tile2bmp.exe TILEBMP16 = $(SRC)/tiles.bmp @@ -844,11 +844,11 @@ gamedir.tag: test -d $(GAMEDIR) && echo directory created > $@ $(GAMEDIR)/NetHack.exe : gamedir.tag $(PDCLIB) $(O)tile.o $(O)nttty.o $(O)guistub.o \ - $(ALLOBJ) $(TTYOBJ) $(GUIOBJ) $(O)conres.o $(KEYDLLS) + $(ALLOBJ) $(TTYOBJ) $(GUIOBJ) $(O)conres.o @echo Linking $@... $(link) $(lflags) -o$@ $(ALLOBJ) $(TTYOBJ) $(O)nttty.o $(O)tile.o \ $(O)guistub.o $(O)conres.o $(PDCLIB) $(conlibs) -static -lstdc++ - $(subst /,\,@if exist $(O)install.tag del $(O)install.tag) + @if exist $(O)install.tag del $(O)install.tag # NetHackW # full tty linkage libs: @@ -860,11 +860,11 @@ $(GAMEDIR)/NetHack.exe : gamedir.tag $(PDCLIB) $(O)tile.o $(O)nttty.o $(O)guistu ifneq "$(SKIP_NETHACKW)" "Y" $(GAMEDIR)/NetHackW.exe : gamedir.tag $(PDCLIB) $(O)tile.o $(O)ttystub.o \ - $(ALLOBJ) $(TTYOBJ) $(GUIOBJ) $(O)winres.o $(KEYDLLS) + $(ALLOBJ) $(TTYOBJ) $(GUIOBJ) $(O)winres.o @echo Linking $@... $(link) $(lflags) -mwindows -o$@ $(ALLOBJ) $(GUIOBJ) $(O)tile.o $(O)ttystub.o \ $(O)winres.o $(PDCLIB) $(guilibs) -static -lstdc++ - $(subst /,\,@if exist $(O)install.tag del $(O)install.tag) + @if exist $(O)install.tag del $(O)install.tag endif $(O)nhdefkey.o: @@ -1353,8 +1353,8 @@ endif clean: if exist initialchk del initialchk - if exist $(O)install.tag del $(O)install.tag - if exist $(O)utility.tag del $(O)utility.tag + $(subst /,\,if exist $(O)install.tag del $(O)install.tag) + $(subst /,\,if exist $(O)utility.tag del $(O)utility.tag) ifneq "$(W_UTIL)" "" if exist $(W_UTIL)\makedefs.exe del $(W_UTIL)\makedefs.exe if exist $(W_UTIL)\levcomp.exe del $(W_UTIL)\levcomp.exe diff --git a/sys/winnt/stubs.c b/sys/winnt/stubs.c index 246676cab3..4568a6e90a 100644 --- a/sys/winnt/stubs.c +++ b/sys/winnt/stubs.c @@ -10,7 +10,7 @@ #error You cannot compile this with both GUISTUB and TTYSTUB defined. #endif -int GUILaunched; +extern int GUILaunched; struct window_procs mswin_procs = { "-guistubs" }; #ifdef QT_GRAPHICS diff --git a/sys/winnt/winnt.c b/sys/winnt/winnt.c index e7a2040a66..248a927ffb 100644 --- a/sys/winnt/winnt.c +++ b/sys/winnt/winnt.c @@ -45,7 +45,7 @@ boolean win32_cursorblink; HANDLE ffhandle = (HANDLE) 0; WIN32_FIND_DATA ffd; extern int GUILaunched; -boolean getreturn_enabled; +extern boolean getreturn_enabled; int redirect_stdout; typedef HWND(WINAPI *GETCONSOLEWINDOW)(); From 003d043e61220093b166f40da07453832867a446 Mon Sep 17 00:00:00 2001 From: nhmall Date: Thu, 11 Apr 2024 11:27:04 -0400 Subject: [PATCH 12/66] 3.6.7 mingw32 Makefile follow-up --- sys/winnt/Makefile.gcc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/winnt/Makefile.gcc b/sys/winnt/Makefile.gcc index 7dfd7cc49e..49f4fffcc2 100644 --- a/sys/winnt/Makefile.gcc +++ b/sys/winnt/Makefile.gcc @@ -848,7 +848,7 @@ $(GAMEDIR)/NetHack.exe : gamedir.tag $(PDCLIB) $(O)tile.o $(O)nttty.o $(O)guistu @echo Linking $@... $(link) $(lflags) -o$@ $(ALLOBJ) $(TTYOBJ) $(O)nttty.o $(O)tile.o \ $(O)guistub.o $(O)conres.o $(PDCLIB) $(conlibs) -static -lstdc++ - @if exist $(O)install.tag del $(O)install.tag + @$(subst /,\,@if exist $(O)install.tag del $(O)install.tag) # NetHackW # full tty linkage libs: @@ -864,7 +864,7 @@ $(GAMEDIR)/NetHackW.exe : gamedir.tag $(PDCLIB) $(O)tile.o $(O)ttystub.o \ @echo Linking $@... $(link) $(lflags) -mwindows -o$@ $(ALLOBJ) $(GUIOBJ) $(O)tile.o $(O)ttystub.o \ $(O)winres.o $(PDCLIB) $(guilibs) -static -lstdc++ - @if exist $(O)install.tag del $(O)install.tag + @$(subst /,\,@if exist $(O)install.tag del $(O)install.tag) endif $(O)nhdefkey.o: From 30612f26a0471ebc5b193564de71815aa1cf9bb6 Mon Sep 17 00:00:00 2001 From: nhmall Date: Fri, 12 Apr 2024 10:55:14 -0400 Subject: [PATCH 13/66] a report of link errors using cppregex using mingw Use g++ instead of gcc for the link step in sys/winnt/Makefile.gcc --- sys/winnt/Makefile.gcc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/sys/winnt/Makefile.gcc b/sys/winnt/Makefile.gcc index 49f4fffcc2..08c96c78a2 100644 --- a/sys/winnt/Makefile.gcc +++ b/sys/winnt/Makefile.gcc @@ -317,7 +317,9 @@ VOBJ27 = $(O)worm.o $(O)worn.o $(O)write.o $(O)zap.o DLBOBJ = $(O)dlb.o -REGEX = $(O)cppregex.o +REGEX = cppregex +#REGEX = posixregex +REGEXOBJ = $(O)$(REGEX).o TTYOBJ = $(O)topl.o $(O)getline.o $(O)wintty.o @@ -336,7 +338,7 @@ OBJS = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \ $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \ $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \ $(VOBJ21) $(VOBJ22) $(VOBJ23) $(VOBJ24) $(VOBJ25) \ - $(VOBJ26) $(VOBJ27) $(VOBJ28) $(VOBJ29) $(REGEX) \ + $(VOBJ26) $(VOBJ27) $(VOBJ28) $(VOBJ29) $(REGEXOBJ) \ $(CURSESOBJ) ifneq "$(SKIP_NETHACKW)" "Y" @@ -483,14 +485,18 @@ endif ifndef TRAVIS_COMPILER cc = i686-w64-mingw32-gcc.exe -cxx = g++ +cxx = i686-w64-mingw32-g++.exe rc = windres -link = i686-w64-mingw32-gcc.exe else cc = gcc cxx = g++ rc = windres -link = gcc +endif + +ifeq "$(REGEX)" "cppregex" +link = $(cxx) +else +link = $(cc) endif ifeq "$(WANT_WIN_QT4)" "Y" From 4479e8ffd972df7e10b495c7fbf87b11a5898d72 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 14 Apr 2024 06:23:08 -0400 Subject: [PATCH 14/66] mingw32 res file that links in correctly error reported: > /usr/lib/gcc/i686-w64-mingw32/11/../../../../i686-w64-mingw32/bin/ld: > i386:x86-64 architecture of input file `o/conres.o' is incompatible with i386 output > collect2: error: ld returned 1 exit status It was defaulting to x64 output which wouldn't link into an x86 executable. Add a windres command line switch. --- sys/winnt/Makefile.gcc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/winnt/Makefile.gcc b/sys/winnt/Makefile.gcc index 08c96c78a2..5ee0847787 100644 --- a/sys/winnt/Makefile.gcc +++ b/sys/winnt/Makefile.gcc @@ -838,7 +838,7 @@ $(O)winres.o: $(TILEBMP16) $(MSWIN)/NetHackW.rc $(MSWIN)/mnsel.bmp \ $(rc) -o$@ --include-dir $(MSWIN) -i $(MSWIN)/NetHackW.rc $(O)conres.o: $(MSWSYS)/console.rc $(MSWSYS)/NetHack.ico - $(rc) -o$@ --include-dir $(MSWSYS) -i $(MSWSYS)/console.rc + $(rc) -o$@ --include-dir $(MSWSYS) --target=pe-i386 -i $(MSWSYS)/console.rc #========================================== # The game targets. From 77f36aef06e937b84685f289799bcb686142850f Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 14 Apr 2024 07:43:39 -0400 Subject: [PATCH 15/66] mingw should be able to build the GUI version A cut-and-paste error for the name of the .exe in Makefile.gcc in 3.6.7 certainly was not helping with the goal of building NetHackW.exe. --- sys/winnt/Makefile.gcc | 11 ++++++----- sys/winnt/win10.c | 4 ---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/sys/winnt/Makefile.gcc b/sys/winnt/Makefile.gcc index 5ee0847787..1a73ee24d3 100644 --- a/sys/winnt/Makefile.gcc +++ b/sys/winnt/Makefile.gcc @@ -134,7 +134,7 @@ TARGET_CPU=x86 # #============================================================================== -SKIP_NETHACKW=Y +#SKIP_NETHACKW=Y #============================================================================== @@ -513,12 +513,13 @@ cdebug = linkdebug = endif +RESTARGET = --target=pe-i386 CFLAGSBASE = -c $(cflags) $(WINPINC) $(cdebug) $(CURSESDEF) #LFLAGSBASEC = $(linkdebug) #LFLAGSBASEG = $(linkdebug) -mwindows baselibs = -lwinmm -lshell32 -lole32 -luuid conlibs = -lgdi32 $(baselibs) $(BCRYPT) -guilibs = -lcomctl32 $(baselibs) +guilibs = -lgdi32 -lcomctl32 -lcomdlg32 -lole32 -lshell32 -luuid -lwinmm -lshcore $(baselibs) $(BCRYPT) ifeq "$(WANT_WIN_QT4)" "Y" # Might be either Qt 4 or Qt 5 ifeq "$(HAVE_QT5)" "Y" @@ -722,7 +723,7 @@ $(QT4)/%.moc : $(QT4)/%.h ifeq "$(SKIP_NETHACKW)" "Y" NETHACKW_EXE = else -NETHACKW_EXE = $(GAMEDIR)/NetHack.exe +NETHACKW_EXE = $(GAMEDIR)/NetHackW.exe endif SHELL=CMD.EXE @@ -835,10 +836,10 @@ $(O)winres.o: $(TILEBMP16) $(MSWIN)/NetHackW.rc $(MSWIN)/mnsel.bmp \ $(MSWIN)/mnselcnt.bmp $(MSWIN)/mnunsel.bmp \ $(MSWIN)/petmark.bmp $(MSWIN)/pilemark.bmp $(MSWIN)/NetHack.ico $(MSWIN)/rip.bmp \ $(MSWIN)/splash.bmp - $(rc) -o$@ --include-dir $(MSWIN) -i $(MSWIN)/NetHackW.rc + $(rc) -o$@ --include-dir $(MSWIN) $(RESTARGET) -i $(MSWIN)/NetHackW.rc $(O)conres.o: $(MSWSYS)/console.rc $(MSWSYS)/NetHack.ico - $(rc) -o$@ --include-dir $(MSWSYS) --target=pe-i386 -i $(MSWSYS)/console.rc + $(rc) -o$@ --include-dir $(MSWSYS) $(RESTARGET) -i $(MSWSYS)/console.rc #========================================== # The game targets. diff --git a/sys/winnt/win10.c b/sys/winnt/win10.c index abf76d9ebc..9791bbec69 100644 --- a/sys/winnt/win10.c +++ b/sys/winnt/win10.c @@ -2,7 +2,6 @@ /* Copyright (C) 2018 by Bart House */ /* NetHack may be freely redistributed. See license for details. */ -#ifdef _MSC_VER #include "win10.h" #include #include @@ -119,6 +118,3 @@ win10_is_desktop_bridge_application() return FALSE; } - - -#endif /* _MSC_VER */ From 9cdabf0ecfe94a40a3739842e5bd2894260e5138 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 14 Apr 2024 07:49:35 -0400 Subject: [PATCH 16/66] mingw LIB updates went too far --- sys/winnt/Makefile.gcc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/winnt/Makefile.gcc b/sys/winnt/Makefile.gcc index 1a73ee24d3..df37b49bb1 100644 --- a/sys/winnt/Makefile.gcc +++ b/sys/winnt/Makefile.gcc @@ -519,7 +519,7 @@ CFLAGSBASE = -c $(cflags) $(WINPINC) $(cdebug) $(CURSESDEF) #LFLAGSBASEG = $(linkdebug) -mwindows baselibs = -lwinmm -lshell32 -lole32 -luuid conlibs = -lgdi32 $(baselibs) $(BCRYPT) -guilibs = -lgdi32 -lcomctl32 -lcomdlg32 -lole32 -lshell32 -luuid -lwinmm -lshcore $(baselibs) $(BCRYPT) +guilibs = -lgdi32 -lcomctl32 -lcomdlg32 -lwinmm -lshcore $(baselibs) $(BCRYPT) ifeq "$(WANT_WIN_QT4)" "Y" # Might be either Qt 4 or Qt 5 ifeq "$(HAVE_QT5)" "Y" From b0bdc0f8a4414a1281ed15f923d5535e7fad7f80 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 14 Apr 2024 07:55:23 -0400 Subject: [PATCH 17/66] silence a warning --- sys/winnt/nttty.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/winnt/nttty.c b/sys/winnt/nttty.c index 6cb01c9513..504dcc00ea 100644 --- a/sys/winnt/nttty.c +++ b/sys/winnt/nttty.c @@ -1917,7 +1917,7 @@ static boolean qwertz = FALSE; #endif #define inmap(x, vk) (((x) > 'A' && (x) < 'Z') || (vk) == 0xBF || (x) == '2') -const struct pad { +struct pad { uchar normal, shift, cntrl; }; From 8872358b3903ac939a308ae347b17b23ab50cf51 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 14 Apr 2024 09:22:00 -0400 Subject: [PATCH 18/66] mingw fix for NetHack-3.6 --- win/win32/NetHackW.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/win/win32/NetHackW.c b/win/win32/NetHackW.c index c6941d7c05..13ec0e3108 100644 --- a/win/win32/NetHackW.c +++ b/win/win32/NetHackW.c @@ -15,6 +15,10 @@ #include "mhmain.h" #include "mhmap.h" +#if defined(__GNUC__) +extern int mingw_main(int argc, char *argv[]); +#endif + #if !defined(SAFEPROCS) #error You must #define SAFEPROCS to build winhack.c #endif @@ -237,7 +241,11 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, } GUILaunched = 1; /* let main do the argument processing */ +#if defined(__GNUC__) + (void) mingw_main(argc, argv); +#else (void) main(argc, argv); +#endif return 0; } From 978c019b1875d93b74f3d2e85dfe320eb414d06a Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 14 Apr 2024 09:47:15 -0400 Subject: [PATCH 19/66] another warning fix for mingw NetHack-3.6 --- win/win32/mhdlg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win/win32/mhdlg.c b/win/win32/mhdlg.c index 8fdb51d3ec..4bb33047d0 100644 --- a/win/win32/mhdlg.c +++ b/win/win32/mhdlg.c @@ -300,7 +300,7 @@ enum player_selector_control { psc_control_count }; -static const s_psc_id[psc_control_count] = { +static const int s_psc_id[psc_control_count] = { IDC_PLSEL_NAME_GROUP, IDC_PLSEL_ROLE_GROUP, IDC_PLSEL_RACE_GROUP, From fc3bac035c3998f1c1ec3a900a49769d8898e6c4 Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 15 Apr 2024 11:37:59 -0400 Subject: [PATCH 20/66] include manifest in resource file --- sys/winnt/Makefile.gcc | 2 +- win/win32/NetHackW.rc | 18 +++++++----------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/sys/winnt/Makefile.gcc b/sys/winnt/Makefile.gcc index df37b49bb1..78e956930d 100644 --- a/sys/winnt/Makefile.gcc +++ b/sys/winnt/Makefile.gcc @@ -563,7 +563,7 @@ LFLAGSU = $(LFLAGSBASEC) #========================================== CFLAGS = $(CFLAGSBASE) $(WINPFLAG) $(DLBFLG) -DSAFEPROCS -lflags = $(LFLAGSBASEC) $(linkdebuf) +lflags = $(LFLAGSBASEC) $(linkdebug) CXXFLAGS = $(CFLAGS) diff --git a/win/win32/NetHackW.rc b/win/win32/NetHackW.rc index 095c8f07ed..71066940d5 100644 --- a/win/win32/NetHackW.rc +++ b/win/win32/NetHackW.rc @@ -377,17 +377,13 @@ BEGIN END #endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// +#ifndef ID_MANIFEST +#define ID_MANIFEST 1 +#endif +#ifndef RT_MANIFEST +#define RT_MANIFEST MAKEINTRESOURCE(24) +#endif -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED +ID_MANIFEST RT_MANIFEST "NetHackW.exe.manifest" From 6be5edb4c32cede494603fe21df0436190809478 Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 15 Apr 2024 13:00:09 -0400 Subject: [PATCH 21/66] 3.6 work around conflict with visual studio build --- sys/winnt/Makefile.gcc | 2 +- sys/winnt/Makefile.msc | 2 +- win/win32/NetHackW.rc | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/winnt/Makefile.gcc b/sys/winnt/Makefile.gcc index 78e956930d..10a234482f 100644 --- a/sys/winnt/Makefile.gcc +++ b/sys/winnt/Makefile.gcc @@ -836,7 +836,7 @@ $(O)winres.o: $(TILEBMP16) $(MSWIN)/NetHackW.rc $(MSWIN)/mnsel.bmp \ $(MSWIN)/mnselcnt.bmp $(MSWIN)/mnunsel.bmp \ $(MSWIN)/petmark.bmp $(MSWIN)/pilemark.bmp $(MSWIN)/NetHack.ico $(MSWIN)/rip.bmp \ $(MSWIN)/splash.bmp - $(rc) -o$@ --include-dir $(MSWIN) $(RESTARGET) -i $(MSWIN)/NetHackW.rc + $(rc) -o$@ --include-dir $(MSWIN) $(RESTARGET) -DVIA_MAKE -i $(MSWIN)/NetHackW.rc $(O)conres.o: $(MSWSYS)/console.rc $(MSWSYS)/NetHack.ico $(rc) -o$@ --include-dir $(MSWSYS) $(RESTARGET) -i $(MSWSYS)/console.rc diff --git a/sys/winnt/Makefile.msc b/sys/winnt/Makefile.msc index c094182e43..4061840b72 100644 --- a/sys/winnt/Makefile.msc +++ b/sys/winnt/Makefile.msc @@ -778,7 +778,7 @@ $(O)NetHackW.res: $(TILEBMP16) $(MSWIN)\NetHackW.rc $(MSWIN)\mnsel.bmp \ $(MSWIN)\mnselcnt.bmp $(MSWIN)\mnunsel.bmp \ $(MSWIN)\petmark.bmp $(MSWIN)\pilemark.bmp $(MSWIN)\NetHack.ico $(MSWIN)\rip.bmp \ $(MSWIN)\splash.bmp - @$(rc) -r -fo$@ -i$(MSWIN) -dNDEBUG $(MSWIN)\NetHackW.rc + @$(rc) -r -fo$@ -i$(MSWIN) -dNDEBUG -dVIA_MAKE $(MSWIN)\NetHackW.rc $(O)console.res: $(MSWSYS)\console.rc $(MSWSYS)\NetHack.ico @$(rc) -r -fo$@ -i$(MSWSYS) -dNDEBUG $(MSWSYS)\console.rc diff --git a/win/win32/NetHackW.rc b/win/win32/NetHackW.rc index 71066940d5..f9862f710c 100644 --- a/win/win32/NetHackW.rc +++ b/win/win32/NetHackW.rc @@ -378,12 +378,12 @@ END #endif // English (United States) resources +#ifdef VIA_MAKE #ifndef ID_MANIFEST #define ID_MANIFEST 1 #endif #ifndef RT_MANIFEST #define RT_MANIFEST MAKEINTRESOURCE(24) #endif - ID_MANIFEST RT_MANIFEST "NetHackW.exe.manifest" - +#endif From d9110cdcd2111de84b55b785141c74e91f157b5d Mon Sep 17 00:00:00 2001 From: PatR Date: Fri, 26 Apr 2024 11:08:29 -0700 Subject: [PATCH 22/66] DUMPHTML infrastructure Manual cherry-picking of three 3.7 commits dealing with end of game handling that affect DUMPHTML (not supported by nethack). All three ended up being different from their 3.7 edition; the c9992777 one effectively went away entirely. commit 36fef49306ff591da3b4011dc6a4e4cce9309cf5 - don't release level data during savebones() since DUMPHTML accesses it for map tooltips after that has taken place; commits c6992777f580acafc2e7c2f219da1612607842a6 and dfd5ca6cad5cf8cfeeb49259eda967234b610175 - don't add slogan text to formatted T-shirt at end of game if formatting is for something other than final inventory disclosure; in 3.7 it affects attribute disclosure in wizard mode as well as DUMPHTML map tooltips, for 3.6 just those tooltips. --- src/bones.c | 4 ++-- src/objnam.c | 12 +++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/bones.c b/src/bones.c index da0de0f412..3f9ae2f73b 100644 --- a/src/bones.c +++ b/src/bones.c @@ -566,9 +566,9 @@ struct obj *corpse; store_savefileinfo(fd); bwrite(fd, (genericptr_t) &c, sizeof c); bwrite(fd, (genericptr_t) bonesid, (unsigned) c); /* DD.nnn */ - savefruitchn(fd, WRITE_SAVE | FREE_SAVE); + savefruitchn(fd, WRITE_SAVE); update_mlstmv(); /* update monsters for eventual restoration */ - savelev(fd, ledger_no(&u.uz), WRITE_SAVE | FREE_SAVE); + savelev(fd, ledger_no(&u.uz), WRITE_SAVE); bclose(fd); commit_bonesfile(&u.uz); compress_bonesfile(); diff --git a/src/objnam.c b/src/objnam.c index 00edf1fa6c..063e8c95b2 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -739,7 +739,17 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */ if (pluralize) Strcpy(buf, makeplural(buf)); - if (obj->otyp == T_SHIRT && program_state.gameover) { + /* additional information shown during end-of-game inventory disclosure */ + if (obj->otyp == T_SHIRT && program_state.gameover + /* o_id will be 0 for wizard mode attribute disclosure (formatted + via from_what() -> ysimple_name() -> minimal_xname() -> xname() + by the enlightenment code; moot here since T-shirts don't affect + any attributes (but for 3.7, aprons will have comparable text) */ + && obj->o_id + /* distantname is non-0 for do_screen_description() which is used + to produce tooltip text for HTMLDUMP (not supported by nethack) */ + && !distantname + ) { char tmpbuf[BUFSZ]; Sprintf(eos(buf), " with text \"%s\"", tshirt_text(obj, tmpbuf)); From ccbb77f4984c98301381f4b7cb1f0faf1e7eaaa7 Mon Sep 17 00:00:00 2001 From: PatR Date: Fri, 26 Apr 2024 11:14:09 -0700 Subject: [PATCH 23/66] fix warning building makedefs Using hints/macosx10.10 makedefs.c:422:1: warning: unused function 'delete_file' [-Wunused-function] --- util/makedefs.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/util/makedefs.c b/util/makedefs.c index fb10155577..ef8747b764 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -178,7 +178,9 @@ extern void NDECL(objects_init); /* objects.c */ static void NDECL(link_sanity_check); static char *FDECL(name_file, (const char *, const char *)); +#ifdef HAS_NO_MKSTEMP static void FDECL(delete_file, (const char *template, const char *)); +#endif static FILE *FDECL(getfp, (const char *, const char *, const char *, int)); static void FDECL(do_ext_makedefs, (int, char **)); @@ -418,6 +420,7 @@ const char *tag; return namebuf; } +#ifdef HAS_NO_MKSTEMP static void delete_file(template, tag) const char *template; @@ -427,6 +430,7 @@ const char *tag; Unlink(name); } +#endif static FILE * getfp(template, tag, mode, flg) From 83e448cc6ca615d51535127f8e10361a36a88ce4 Mon Sep 17 00:00:00 2001 From: PatR Date: Fri, 10 May 2024 12:21:29 -0700 Subject: [PATCH 24/66] Revert "fix warning building makedefs" This reverts commit ccbb77f4984c98301381f4b7cb1f0faf1e7eaaa7. --- util/makedefs.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/util/makedefs.c b/util/makedefs.c index ef8747b764..fb10155577 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -178,9 +178,7 @@ extern void NDECL(objects_init); /* objects.c */ static void NDECL(link_sanity_check); static char *FDECL(name_file, (const char *, const char *)); -#ifdef HAS_NO_MKSTEMP static void FDECL(delete_file, (const char *template, const char *)); -#endif static FILE *FDECL(getfp, (const char *, const char *, const char *, int)); static void FDECL(do_ext_makedefs, (int, char **)); @@ -420,7 +418,6 @@ const char *tag; return namebuf; } -#ifdef HAS_NO_MKSTEMP static void delete_file(template, tag) const char *template; @@ -430,7 +427,6 @@ const char *tag; Unlink(name); } -#endif static FILE * getfp(template, tag, mode, flg) From 02403379218889ead4fc893272dc784e768fe8d8 Mon Sep 17 00:00:00 2001 From: PatR Date: Fri, 10 May 2024 13:34:46 -0700 Subject: [PATCH 25/66] Revert "backport of fix for GitHub issue #391 to NetHack-3.6" This reverts commit 0792685d64262dff15b94f83995c0bcdf2b2a97a. --- doc/fixes36.7 | 6 --- util/makedefs.c | 113 ++++++++---------------------------------------- 2 files changed, 17 insertions(+), 102 deletions(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index cb333ea141..ed5c4aa33c 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -47,12 +47,6 @@ vms: update winprocs.h to ensure that CLR_MAX is defined; necessary for compiling vmsmail.c which uses winprocs.h but not hack.h curses: when #quitting, just before the high scores are about to be shown status_window was NULL and dereferenced, so add checks (issue #1090) -when make was invoked with -j makedefs instances could end up running in - parallel and could trample on each other's temp files; default to - using mkstemp(); allow a port runtime library implementation that lacks - mkstemp() to define HAS_NO_MKSTEMP to revert to the old behaviour; - provide a work-alike mkstemp() implementation for windows visual studio - so there is no requirement to define HAS_NO_MKSTEMP there fix the mingw32 build of NetHack 3.6.7 by updating sys/winnt/Makefile.gcc, sys/winnt/winnt.c and sys/winnt/stubs.c diff --git a/util/makedefs.c b/util/makedefs.c index fb10155577..cd971bcc0f 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -52,12 +52,6 @@ #define rewind(fp) fseek((fp), 0L, SEEK_SET) /* guarantee a return value */ #endif -#ifndef HAS_NO_MKSTEMP -#ifdef _MSC_VER -static int FDECL(mkstemp, (char *)); -#endif -#endif - #if defined(UNIX) && !defined(LINT) && !defined(GCC_WARN) static const char SCCS_Id[] UNUSED = "@(#)makedefs.c\t3.6\t2020/03/04"; #endif @@ -136,8 +130,6 @@ static struct version_info version; #define CLOSE_OFF_TABLE_STRING "99" /* for the close table */ #define FAR_OFF_TABLE_STRING "0xff" /* for the far table */ -#define FLG_TEMPFILE 0x01 /* flag for temp file */ - #define sign(z) ((z) < 0 ? -1 : ((z) ? 1 : 0)) #ifdef VISION_TABLES static char xclear[MAX_ROW][MAX_COL]; @@ -179,7 +171,7 @@ extern void NDECL(objects_init); /* objects.c */ static void NDECL(link_sanity_check); static char *FDECL(name_file, (const char *, const char *)); static void FDECL(delete_file, (const char *template, const char *)); -static FILE *FDECL(getfp, (const char *, const char *, const char *, int)); +static FILE *FDECL(getfp, (const char *, const char *, const char *)); static void FDECL(do_ext_makedefs, (int, char **)); static void NDECL(make_version); @@ -429,39 +421,16 @@ const char *tag; } static FILE * -getfp(template, tag, mode, flg) +getfp(template, tag, mode) const char *template; const char *tag; const char *mode; -#ifndef HAS_NO_MKSTEMP -int flg; -#else -int flg UNUSED; -#endif { char *name = name_file(template, tag); - FILE *rv = (FILE *) 0; -#ifndef HAS_NO_MKSTEMP - boolean istemp = (flg & FLG_TEMPFILE) != 0; - char tmpfbuf[MAXFNAMELEN]; - int tmpfd; -#endif - -#ifndef HAS_NO_MKSTEMP - if (istemp) { - (void) snprintf(tmpfbuf, sizeof tmpfbuf, DATA_TEMPLATE, "mdXXXXXX"); - tmpfd = mkstemp(tmpfbuf); - if (tmpfd >= 0) - rv = fdopen(tmpfd, WRTMODE); /* temp file is always read+write */ - } else -#endif - rv = fopen(name, mode); + FILE *rv = fopen(name, mode); + if (!rv) { - Fprintf(stderr, "Can't open '%s'.\n", -#ifndef HAS_NO_MKSTEMP - istemp ? tmpfbuf : -#endif - name); + Fprintf(stderr, "Can't open '%s'.\n", name); exit(EXIT_FAILURE); } return rv; @@ -485,7 +454,7 @@ static int FDECL(grep_check_id, (const char *)); static void FDECL(grep_show_wstack, (const char *)); static char *FDECL(do_grep_control, (char *)); static void NDECL(do_grep); -static void FDECL(grep0, (FILE *, FILE *, int)); +static void FDECL(grep0, (FILE *, FILE *)); static int grep_trace = 0; @@ -836,7 +805,7 @@ char *buf; } #endif -static void grep0(FILE *, FILE *, int); +static void grep0(FILE *, FILE *); static void do_grep() @@ -851,26 +820,14 @@ do_grep() exit(EXIT_FAILURE); } - grep0(inputfp, outputfp, 0); + grep0(inputfp, outputfp); } static void -grep0(inputfp0, outputfp0, flg) +grep0(inputfp0, outputfp0) FILE *inputfp0; FILE *outputfp0; -#ifndef HAS_NO_MKSTEMP -int flg; -#else -int flg UNUSED; -#endif { -#ifndef HAS_NO_MKSTEMP - /* if grep0 is passed FLG_TEMPFILE flag, it will - leave the output file open when it returns. - The caller will have to take care of calling - fclose() when it is done with the file */ - boolean istemp = (flg & FLG_TEMPFILE) != 0; -#endif char buf[16384]; /* looong, just in case */ while (!feof(inputfp0) && !ferror(inputfp0)) { @@ -910,12 +867,7 @@ int flg UNUSED; exit(EXIT_FAILURE); } fclose(inputfp0); -#ifndef HAS_NO_MKSTEMP - if (istemp) - rewind(outputfp0); - else -#endif - fclose(outputfp0); + fclose(outputfp0); if (grep_sp) { Fprintf(stderr, "%d unterminated conditional level%s\n", grep_sp, grep_sp == 1 ? "" : "s"); @@ -1041,13 +993,9 @@ const char *deflt_content; more likely to be picked than normal but it's nothing to worry about */ (void) fputs(xcrypt(deflt_content), ofp); - tfp = getfp(DATA_TEMPLATE, "grep.tmp", WRTMODE, FLG_TEMPFILE); - grep0(ifp, tfp, FLG_TEMPFILE); -#ifndef HAS_NO_MKSTEMP - ifp = tfp; -#else - ifp = getfp(DATA_TEMPLATE, "grep.tmp", RDTMODE, 0); -#endif + tfp = getfp(DATA_TEMPLATE, "grep.tmp", WRTMODE); + grep0(ifp, tfp); + ifp = getfp(DATA_TEMPLATE, "grep.tmp", RDTMODE); while ((line = fgetline(ifp)) != 0) { if (line[0] != '#' && line[0] != '\n') @@ -1057,10 +1005,7 @@ const char *deflt_content; Fclose(ifp); Fclose(ofp); -#ifdef HAS_NO_MKSTEMP delete_file(DATA_TEMPLATE, "grep.tmp"); -#endif - return; } @@ -2346,13 +2291,10 @@ do_dungeon() } Fprintf(ofp, "%s", Dont_Edit_Data); - tfp = getfp(DATA_TEMPLATE, "grep.tmp", WRTMODE, FLG_TEMPFILE); - grep0(ifp, tfp, FLG_TEMPFILE); -#ifndef HAS_NO_MKSTEMP - ifp = tfp; -#else - ifp = getfp(DATA_TEMPLATE, "grep.tmp", RDTMODE, 0); -#endif + tfp = getfp(DATA_TEMPLATE, "grep.tmp", WRTMODE); + grep0(ifp, tfp); + ifp = getfp(DATA_TEMPLATE, "grep.tmp", RDTMODE); + while ((line = fgetline(ifp)) != 0) { SpinCursor(3); @@ -2363,13 +2305,10 @@ do_dungeon() (void) fputs(line, ofp); free(line); } - Fclose(ifp); Fclose(ofp); -#ifdef HAS_NO_MKSTEMP delete_file(DATA_TEMPLATE, "grep.tmp"); -#endif return; } @@ -3018,24 +2957,6 @@ char *str; return str; } -#ifndef HAS_NO_MKSTEMP -#ifdef _MSC_VER -int -mkstemp(template) -char *template; -{ - int err; - - err = _mktemp_s(template, strlen(template) + 1); - if( err != 0 ) - return -1; - return _open(template, - _O_RDWR | _O_BINARY | _O_TEMPORARY | _O_CREAT, - _S_IREAD | _S_IWRITE); -} -#endif /* _MSC_VER */ -#endif /* HAS_NO_MKSTEMP */ - /* * macro used to control vision algorithms: * VISION_TABLES => generate tables From 90d23e856aa012b638136560687c4488e1067eeb Mon Sep 17 00:00:00 2001 From: PatR Date: Fri, 10 May 2024 13:36:24 -0700 Subject: [PATCH 26/66] fix building data files with parallel make The previous fix attempt was leaving temporary files behind and probably did not solve the underlying problem so has been reverted. 'makedefs -s' builds three files but dat/Makefile can run it up to three times, possibly simultaneously when using parallel make. When executed in parallel, there was risk of clobbering the final output, not just the intermediate temporary files that the earlier fix was meant to address. Change sys/unix/Makefile.dat to have 'engrave' depend on 'epitaph' and 'epitaph' depend on 'bogusmon' so that they're forced to be built sequentially. After building the first, 'make' might notice that the second and third have become up to date, so only run 'makedefs -s' once. If it doesn't, it will end up replacing each of the three files two extra times but the final result will be correct (and the hardcoded temporary file name won't matter since only one instance will ever be in use at any given time). Also change util/makedefs.c to have 'makedefs -e' use a different temporary file name from 'makedefs -s' so that it won't matter if those two get run in parallel. --- dat/.gitignore | 1 + doc/fixes36.7 | 5 +++++ sys/unix/Makefile.dat | 13 +++++++++---- util/makedefs.c | 12 ++++++------ 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/dat/.gitignore b/dat/.gitignore index 748a8ffe17..506e251a9f 100644 --- a/dat/.gitignore +++ b/dat/.gitignore @@ -9,6 +9,7 @@ rumors bogusmon engrave epitaph +grep*.tmp x11tiles nhtiles.bmp *.lev diff --git a/doc/fixes36.7 b/doc/fixes36.7 index ed5c4aa33c..be02e9c118 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -47,6 +47,11 @@ vms: update winprocs.h to ensure that CLR_MAX is defined; necessary for compiling vmsmail.c which uses winprocs.h but not hack.h curses: when #quitting, just before the high scores are about to be shown status_window was NULL and dereferenced, so add checks (issue #1090) +unix: update Makefile.dat so that if parallel make is used, it will build + the data files "engrave", "epitaph", and "bogusmon" sequentially; + 'makedefs -s' builds all three at once and doing parallel instances + of that can produce seemingly mysterious problems by stomping on + each other's results fix the mingw32 build of NetHack 3.6.7 by updating sys/winnt/Makefile.gcc, sys/winnt/winnt.c and sys/winnt/stubs.c diff --git a/sys/unix/Makefile.dat b/sys/unix/Makefile.dat index 00f6043961..e0df50efbf 100644 --- a/sys/unix/Makefile.dat +++ b/sys/unix/Makefile.dat @@ -112,12 +112,17 @@ quest.dat: quest.txt ../util/makedefs oracles: oracles.txt ../util/makedefs ../util/makedefs -h -engrave: engrave.txt ../util/makedefs +# note: 'makedefs -s' constructs three files at once, but traditional 'make' +# doesn't provide any way for a Makefile to indicate that; use arbitrary +# dependencies to prevent parallel make from running multiple instances of +# 'makedefs -s' at the same time; depending upon how 'make' checks timestamps, +# this might result in building all three of them three times in a row +# [that will still produce the correct result in the end, and the extra +# overhead of doing it should be negligible; 'gnu make' only runs it once] +engrave: epitaph engrave.txt ../util/makedefs ../util/makedefs -s - -epitaph: epitaph.txt ../util/makedefs +epitaph: bogusmon epitaph.txt ../util/makedefs ../util/makedefs -s - bogusmon: bogusmon.txt ../util/makedefs ../util/makedefs -s diff --git a/util/makedefs.c b/util/makedefs.c index cd971bcc0f..b5176d0d9b 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -993,9 +993,9 @@ const char *deflt_content; more likely to be picked than normal but it's nothing to worry about */ (void) fputs(xcrypt(deflt_content), ofp); - tfp = getfp(DATA_TEMPLATE, "grep.tmp", WRTMODE); + tfp = getfp(DATA_TEMPLATE, "grep-s.tmp", WRTMODE); grep0(ifp, tfp); - ifp = getfp(DATA_TEMPLATE, "grep.tmp", RDTMODE); + ifp = getfp(DATA_TEMPLATE, "grep-s.tmp", RDTMODE); while ((line = fgetline(ifp)) != 0) { if (line[0] != '#' && line[0] != '\n') @@ -1005,7 +1005,7 @@ const char *deflt_content; Fclose(ifp); Fclose(ofp); - delete_file(DATA_TEMPLATE, "grep.tmp"); + delete_file(DATA_TEMPLATE, "grep-s.tmp"); return; } @@ -2291,9 +2291,9 @@ do_dungeon() } Fprintf(ofp, "%s", Dont_Edit_Data); - tfp = getfp(DATA_TEMPLATE, "grep.tmp", WRTMODE); + tfp = getfp(DATA_TEMPLATE, "grep-e.tmp", WRTMODE); grep0(ifp, tfp); - ifp = getfp(DATA_TEMPLATE, "grep.tmp", RDTMODE); + ifp = getfp(DATA_TEMPLATE, "grep-e.tmp", RDTMODE); while ((line = fgetline(ifp)) != 0) { SpinCursor(3); @@ -2308,7 +2308,7 @@ do_dungeon() Fclose(ifp); Fclose(ofp); - delete_file(DATA_TEMPLATE, "grep.tmp"); + delete_file(DATA_TEMPLATE, "grep-e.tmp"); return; } From 73c2922c8c0d1fda9f24fc419278f27e1cb6bbc4 Mon Sep 17 00:00:00 2001 From: PatR Date: Sat, 11 May 2024 12:54:31 -0700 Subject: [PATCH 27/66] building data vs parallel make for 3.6 revisited Replace "arbitrary" order of the three recently added 'makedefs -s' dependencies with the specific order used within makedefs. Guarantee that the three temp files used by 'makedefs -s' have distinct names just in case the Makefile gets changed to ignore those extra dependencies and someone runs parallel make. --- sys/unix/Makefile.dat | 18 ++++++++++-------- util/makedefs.c | 34 ++++++++++++++++++++-------------- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/sys/unix/Makefile.dat b/sys/unix/Makefile.dat index e0df50efbf..9535f969e4 100644 --- a/sys/unix/Makefile.dat +++ b/sys/unix/Makefile.dat @@ -112,18 +112,20 @@ quest.dat: quest.txt ../util/makedefs oracles: oracles.txt ../util/makedefs ../util/makedefs -h -# note: 'makedefs -s' constructs three files at once, but traditional 'make' -# doesn't provide any way for a Makefile to indicate that; use arbitrary -# dependencies to prevent parallel make from running multiple instances of -# 'makedefs -s' at the same time; depending upon how 'make' checks timestamps, +# note: 'makedefs -s' constructs three files at once: "epitaph", "engrave", +# and "bogusmon", in that order, but traditional 'make' doesn't provide any +# way for a Makefile to indicate that; make the third depend on the second +# and the second depend on the first so that if someone runs parallel make +# it will be forced to run three instances of 'makedefs -s' sequentially +# rather than simultaneously; depending upon how 'make' checks timestamps, # this might result in building all three of them three times in a row # [that will still produce the correct result in the end, and the extra -# overhead of doing it should be negligible; 'gnu make' only runs it once] -engrave: epitaph engrave.txt ../util/makedefs +# overhead of doing it should be negligible] +bogusmon: engrave bogusmon.txt ../util/makedefs ../util/makedefs -s -epitaph: bogusmon epitaph.txt ../util/makedefs +engrave: epitaph engrave.txt ../util/makedefs ../util/makedefs -s -bogusmon: bogusmon.txt ../util/makedefs +epitaph: epitaph.txt ../util/makedefs ../util/makedefs -s # note: 'options' should have already been made when include/date.h was created diff --git a/util/makedefs.c b/util/makedefs.c index b5176d0d9b..4437c58f6c 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -182,7 +182,8 @@ static char *FDECL(xcrypt, (const char *)); static unsigned long FDECL(read_rumors_file, (const char *, int *, long *, unsigned long)); static boolean FDECL(get_gitinfo, (char *, char *)); -static void FDECL(do_rnd_access_file, (const char *, const char *)); +static void FDECL(do_rnd_access_file, + (const char *, const char *, const char *)); static boolean FDECL(d_filter, (char *)); static boolean FDECL(h_filter, (char *)); static void NDECL(build_savebones_compat_string); @@ -366,16 +367,19 @@ char *options; * post-3.6.5: * File must not be empty to avoid divide by 0 * in core's rn2(), so provide a default entry. + * [Second argument is used to construct a temporary file name + * without worrying about whether the file name macros from + * global.h have been modified with port-specific punctuation.] */ - do_rnd_access_file(EPITAPHFILE, + do_rnd_access_file(EPITAPHFILE, "epitaph", /* default epitaph: parody of the default engraving */ "No matter where I went, here I am."); - do_rnd_access_file(ENGRAVEFILE, + do_rnd_access_file(ENGRAVEFILE, "engrave", /* default engraving: popularized by "The Adventures of Buckaroo Bonzai Across the 8th Dimenstion" but predates that 1984 movie; some attribute it to Confucius */ "No matter where you go, there you are."); - do_rnd_access_file(BOGUSMONFILE, + do_rnd_access_file(BOGUSMONFILE, "bogusmon", /* default bogusmon: iconic monster that isn't in nethack */ "grue"); break; @@ -965,12 +969,13 @@ unsigned long old_rumor_offset; } static void -do_rnd_access_file(fname, deflt_content) -const char *fname; +do_rnd_access_file(fname, basefname, deflt_content) +const char *fname, *basefname; const char *deflt_content; { - char *line; + char *line, greptmp[8 + 1 + 3 + 1]; + Sprintf(greptmp, "grep-%.3s.tmp", basefname); Sprintf(filename, DATA_IN_TEMPLATE, fname); Strcat(filename, ".txt"); if (!(ifp = fopen(filename, RDTMODE))) { @@ -993,9 +998,9 @@ const char *deflt_content; more likely to be picked than normal but it's nothing to worry about */ (void) fputs(xcrypt(deflt_content), ofp); - tfp = getfp(DATA_TEMPLATE, "grep-s.tmp", WRTMODE); + tfp = getfp(DATA_TEMPLATE, greptmp, WRTMODE); grep0(ifp, tfp); - ifp = getfp(DATA_TEMPLATE, "grep-s.tmp", RDTMODE); + ifp = getfp(DATA_TEMPLATE, greptmp, RDTMODE); while ((line = fgetline(ifp)) != 0) { if (line[0] != '#' && line[0] != '\n') @@ -1005,7 +1010,7 @@ const char *deflt_content; Fclose(ifp); Fclose(ofp); - delete_file(DATA_TEMPLATE, "grep-s.tmp"); + delete_file(DATA_TEMPLATE, greptmp); return; } @@ -2273,8 +2278,9 @@ do_oracles() void do_dungeon() { - char *line; + char *line, greptmp[8 + 1 + 3 + 1]; + Sprintf(greptmp, "grep-%.3s.tmp", "dun"); Sprintf(filename, DATA_IN_TEMPLATE, DGN_I_FILE); if (!(ifp = fopen(filename, RDTMODE))) { perror(filename); @@ -2291,9 +2297,9 @@ do_dungeon() } Fprintf(ofp, "%s", Dont_Edit_Data); - tfp = getfp(DATA_TEMPLATE, "grep-e.tmp", WRTMODE); + tfp = getfp(DATA_TEMPLATE, greptmp, WRTMODE); grep0(ifp, tfp); - ifp = getfp(DATA_TEMPLATE, "grep-e.tmp", RDTMODE); + ifp = getfp(DATA_TEMPLATE, greptmp, RDTMODE); while ((line = fgetline(ifp)) != 0) { SpinCursor(3); @@ -2308,7 +2314,7 @@ do_dungeon() Fclose(ifp); Fclose(ofp); - delete_file(DATA_TEMPLATE, "grep-e.tmp"); + delete_file(DATA_TEMPLATE, greptmp); return; } From f66235effbef49509455b6d536cbaccbc6ada1bd Mon Sep 17 00:00:00 2001 From: nhmall Date: Wed, 4 Sep 2024 10:11:30 -0400 Subject: [PATCH 28/66] backport the updated Ixoth tile to 3.6 Reported by Shrigis1. the tile for Ixoth (knight's quest nemesis) depicted a demon rather than a dragon; change it to be a red dragon References: https://github.com/NetHack/NetHack/issues/1239 https://github.com/NetHack/NetHack/commit/5abd1be1754ae1dbb0a0b7c74597c2d5668f28e9 --- win/share/monsters.txt | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/win/share/monsters.txt b/win/share/monsters.txt index f2b81fc6e9..78e856adc9 100644 --- a/win/share/monsters.txt +++ b/win/share/monsters.txt @@ -7059,22 +7059,22 @@ Z = (195, 195, 195) } # tile 370 (Ixoth) { - ....O......O.... - ....O......O.... - ...LOOCDDCOOL... - ...DDDDDDDDDDD.. - .CCDDDGDDGDDDCC. - CCDKDDDDDDDDJCCC - CDDKKKDIIDJJDCCD - CDDKDDKJJJDDDCDD - CCDKDDDDDDDDKCDD - .CCDKKDDDDKKCDDD - .CCDADKDDKDACDD. - .DDDADDDDDDADDD. - ....CCDDDDKKAA.. - ...CDDDAADDDKAA. - ..CDDDAAA.DDDK.. - ................ + ......IIIDA..... + .....GDGDDDA.... + ....IDDDDDDA.... + ..DCHHD..DDA.... + CHCHCD..IDDA.... + HD.D...IDDA..... + ......HIDAAAAAA. + ....IHIDAAAAAAAA + ..IHHIDAJDDJAAA. + .IHHHIDDDDDDJAA. + .IHHHIDDDDDDDAA. + DDHHIIDDDDDDDDA. + ID.HIDDHHDDJDJA. + IDAAID.AADDADDA. + ....IDAAJJJDDJA. + ........DDDDJA.. } # tile 371 (Master Kaen) { From 178f823304cf4604909f5c0e654447438955d1c3 Mon Sep 17 00:00:00 2001 From: nhmall Date: Wed, 4 Sep 2024 10:24:30 -0400 Subject: [PATCH 29/66] backport 3.7 makedefs options for producing individual files This may be useful for some build environments to avoid parallel make issues, and artificially-concocted order dependencies, leaving the ordering up to that specified in the Makefile. This does not update the 3.6 sys/unix/Makefile.dat, since there's already a workaround in place in that file. The related makedefs options are: -s Generate the bogusmon , engrave and epitaph files. -1 Generate the epitaph file. -2 Generate the engrave file. -3 Generate the bogusmon file. --- doc/makedefs.6 | 24 +++++++++++++++---- util/makedefs.c | 61 ++++++++++++++++++++++++++++++++++--------------- 2 files changed, 61 insertions(+), 24 deletions(-) diff --git a/doc/makedefs.6 b/doc/makedefs.6 index 79179969f6..cf78b6d90f 100644 --- a/doc/makedefs.6 +++ b/doc/makedefs.6 @@ -125,11 +125,25 @@ file. .TP .B -s Generate the -.I bogusmon -, -.I engrave -and -.IR epitaph files. +.IR bogusmon ", " engrave ", and " epitaph " files." +.br +.TP +.B -1 +Generate the +.IR epitaph +file. +.br +.TP +.B -2 +Generate the +.IR engrave +file. +.br +.TP +.B -3 +Generate the +.IR bogusmon +file. .br .TP .B -h diff --git a/util/makedefs.c b/util/makedefs.c index 4437c58f6c..5fff4f412a 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -201,6 +201,7 @@ static void FDECL(do_qt_control, (char *)); static void FDECL(do_qt_text, (char *)); static void NDECL(adjust_qt_hdrs); static void NDECL(put_qt_hdrs); +static void FDECL(rafile, (int)); #ifdef VISION_TABLES static void NDECL(H_close_gen); @@ -363,25 +364,14 @@ char *options; break; case 's': case 'S': - /* - * post-3.6.5: - * File must not be empty to avoid divide by 0 - * in core's rn2(), so provide a default entry. - * [Second argument is used to construct a temporary file name - * without worrying about whether the file name macros from - * global.h have been modified with port-specific punctuation.] - */ - do_rnd_access_file(EPITAPHFILE, "epitaph", - /* default epitaph: parody of the default engraving */ - "No matter where I went, here I am."); - do_rnd_access_file(ENGRAVEFILE, "engrave", - /* default engraving: popularized by "The Adventures of - Buckaroo Bonzai Across the 8th Dimenstion" but predates - that 1984 movie; some attribute it to Confucius */ - "No matter where you go, there you are."); - do_rnd_access_file(BOGUSMONFILE, "bogusmon", - /* default bogusmon: iconic monster that isn't in nethack */ - "grue"); + rafile('1'); + rafile('2'); + rafile('3'); + break; + case '1': + case '2': + case '3': + rafile(*options); break; case 'h': case 'H': @@ -424,6 +414,39 @@ const char *tag; Unlink(name); } +void +rafile(whichone) +int whichone; +{ + switch(whichone) { + /* + * post-3.6.5: + * File must not be empty to avoid divide by 0 + * in core's rn2(), so provide a default entry. + * [Second argument is used to construct a temporary file name + * without worrying about whether the file name macros from + * global.h have been modified with port-specific punctuation.] + */ + case '1': + do_rnd_access_file(EPITAPHFILE, "epitaph", + /* default epitaph: parody of the default engraving */ + "No matter where I went, here I am."); + break; + case '2': + do_rnd_access_file(ENGRAVEFILE, "engrave", + /* default engraving: popularized by "The Adventures of + Buckaroo Bonzai Across the 8th Dimenstion" but predates + that 1984 movie; some attribute it to Confucius */ + "No matter where you go, there you are."); + break; + case '3': + do_rnd_access_file(BOGUSMONFILE, "bogusmon", + /* default bogusmon: iconic monster that isn't in nethack */ + "grue"); + break; + } +} + static FILE * getfp(template, tag, mode) const char *template; From f85cebdf2ab3334fd2c012c799ac05c207d7892c Mon Sep 17 00:00:00 2001 From: nhmall Date: Wed, 4 Sep 2024 10:28:06 -0400 Subject: [PATCH 30/66] update fixes36.7 on 2024-09-04 --- doc/fixes36.7 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index be02e9c118..8987decc17 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -54,4 +54,6 @@ unix: update Makefile.dat so that if parallel make is used, it will build each other's results fix the mingw32 build of NetHack 3.6.7 by updating sys/winnt/Makefile.gcc, sys/winnt/winnt.c and sys/winnt/stubs.c +correct the Ixoth tile +makedefs can produce individual bogusmon, epitaph and bogusmon files From 0689b716a366e4733d27169fd01cdc86a50575f1 Mon Sep 17 00:00:00 2001 From: nhmall Date: Wed, 4 Sep 2024 20:01:32 -0400 Subject: [PATCH 31/66] make a correction to latest fixes36.7 entry --- doc/fixes36.7 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index 8987decc17..53b0c046f5 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -55,5 +55,5 @@ unix: update Makefile.dat so that if parallel make is used, it will build fix the mingw32 build of NetHack 3.6.7 by updating sys/winnt/Makefile.gcc, sys/winnt/winnt.c and sys/winnt/stubs.c correct the Ixoth tile -makedefs can produce individual bogusmon, epitaph and bogusmon files +makedefs can produce individual bogusmon, engrave and epitaph files From 52f107e99db11eab8fd5b001fd7a189d097bca71 Mon Sep 17 00:00:00 2001 From: nhmall Date: Wed, 6 Nov 2024 12:58:42 -0500 Subject: [PATCH 32/66] build of 3.6.7 with clang-18 The build of the current release of NetHack 3.6.7 has gotten extremely noisy with Ubuntu clang version 18.1.3 (1ubuntu1) and the hints file sys/unix/hints/linux, resulting in hundreds of these warnings: warning: a function definition without a prototype is deprecated in all versions of C and is not supported in C23 [-Wdeprecated-non-prototype] --- sys/unix/hints/linux | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sys/unix/hints/linux b/sys/unix/hints/linux index 862915053c..573ae1d6c9 100644 --- a/sys/unix/hints/linux +++ b/sys/unix/hints/linux @@ -34,6 +34,16 @@ CFLAGS+=-DCURSES_GRAPHICS #CFLAGS+=-DSCORE_ON_BOTL #CFLAGS+=-DMSGHANDLER #CFLAGS+=-DTTY_TILES_ESCCODES +#detection of clang vs gcc +CCISCLANG := $(shell echo `$(CC) --version` | grep clang) +ifneq "$(CCISCLANG)" "" +# clang-specific follows +CLANGGTEQ18 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 18) +ifeq "$(CLANGGTEQ18)" "1" +CFLAGS+=-Wno-deprecated-non-prototype +endif +endif # clang-specific ends here + LINK=$(CC) # Only needed for GLIBC stack trace: From 55561da637a565bfda0e5fab0f52e6329b939087 Mon Sep 17 00:00:00 2001 From: nhmall Date: Wed, 6 Nov 2024 13:11:43 -0500 Subject: [PATCH 33/66] README.linux: make prerequisites more explicit --- sys/unix/README.linux | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sys/unix/README.linux b/sys/unix/README.linux index 24ab949056..864da755aa 100644 --- a/sys/unix/README.linux +++ b/sys/unix/README.linux @@ -61,6 +61,12 @@ If you have problems, send us some email. nethack-bugs@nethack.org +Prerequisite installations that are needed: + libncurses-dev + flex + bison + clang or gcc + Recommended steps: 1. cd sys/unix From 62981ee9ae7872d5ef3776ad82e233fb669353a4 Mon Sep 17 00:00:00 2001 From: nhmall Date: Wed, 6 Nov 2024 17:22:21 -0500 Subject: [PATCH 34/66] fountain curses object on the wrong chain --- doc/fixes36.7 | 3 ++- src/fountain.c | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index 53b0c046f5..9f99df420f 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -56,4 +56,5 @@ fix the mingw32 build of NetHack 3.6.7 by updating sys/winnt/Makefile.gcc, sys/winnt/winnt.c and sys/winnt/stubs.c correct the Ixoth tile makedefs can produce individual bogusmon, engrave and epitaph files - +drinkfountain() fate 24 to curse objects could end up cursing objects + on the floor chain instead of the intended inventory object chain diff --git a/src/fountain.c b/src/fountain.c index 57e914559f..30051ca994 100644 --- a/src/fountain.c +++ b/src/fountain.c @@ -294,14 +294,16 @@ drinkfountain() dowaterdemon(); break; case 24: /* Curse an item */ { - register struct obj *obj; + register struct obj *obj, *nextobj; pline("This water's no good!"); morehungry(rn1(20, 11)); exercise(A_CON, FALSE); - for (obj = invent; obj; obj = obj->nobj) + for (obj = invent; obj; obj = nextobj) { + nextobj = obj->nobj; if (!rn2(5)) curse(obj); + } break; } case 25: /* See invisible */ From be8a3b594bf65f3bed5cac0133b606018b500ad1 Mon Sep 17 00:00:00 2001 From: nhmall Date: Fri, 23 Feb 2024 09:32:50 -0500 Subject: [PATCH 35/66] Windows GUI: vertical menu row spacing for tiles The menus in nethackw.exe were being spaced according to the vertical tile size of custom tiles, but the tiles were being rendered in menus at the default size anyway, resulting in unnecessary gaps between menu rows. Use the default size of 16 for the vertical spacing calculation. --- doc/fixes36.7 | 4 ++++ win/win32/mhmenu.c | 10 +++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index 9f99df420f..114a9855e2 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -42,6 +42,10 @@ Fixes to 3.6.7 Post-release Problems and other Post-release changes ------------------------------------------------------------------- extend the fix for build failure w/ newer C library headers to macOS (pr #988) Windows: fix range error detected by address sanitizer in plselInitDialog() +Windows: nethackw.exe was vertically spacing out menu items based on + the height of the tileset in use, even though the tiles in the + menu were drawn at the default height of 16 anyway; get rid of + the extraneous vertical spacing between the menu rows hilite_pile can remain on the map after eating food off the floor vms: update winprocs.h to ensure that CLR_MAX is defined; necessary for compiling vmsmail.c which uses winprocs.h but not hack.h diff --git a/win/win32/mhmenu.c b/win/win32/mhmenu.c index 62e78480f1..f9a4c46fde 100644 --- a/win/win32/mhmenu.c +++ b/win/win32/mhmenu.c @@ -950,14 +950,18 @@ onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) /* Set the height of the list box items to max height of the individual * items */ for (i = 0; i < data->menu.size; i++) { - if (NHMENU_HAS_GLYPH(data->menu.items[i]) +/* int map_y = GetNHApp()->mapTile_Y; */ + int map_y = 16; /* leave it at the default size, unless + * we are actually showing the larger + * icons in the menu */ + if (NHMENU_HAS_GLYPH(data->menui.menu.items[i]) && !IS_MAP_ASCII(iflags.wc_map_mode)) { lpmis->itemHeight = max(lpmis->itemHeight, - (UINT) max(tm.tmHeight, GetNHApp()->mapTile_Y) + 2); + (UINT) max(tm.tmHeight, map_y) + 2); } else { lpmis->itemHeight = - max(lpmis->itemHeight, (UINT) max(tm.tmHeight, TILE_Y) + 2); + max(lpmis->itemHeight, (UINT) max(tm.tmHeight, map_y) + 2); } } From 49e80491638ab9197578e656e737d605edc8ca8c Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 22 Dec 2024 19:58:52 -0500 Subject: [PATCH 36/66] try harder to have --showpaths succeed This helps avoid a potential chicken-and-egg scenario with the system configuration file (sysconf). If sysconf wasn't accessible at the expected location, it caused an immediate exit, without relaying any helpful information. That happened even when using: 'nethack --showpaths' That's particularly unhelpful, because the --showpaths output might have been useful towards understanding where NetHack was looking for such things. That left you without an easy recourse to identify where the game is looking for the sysconf file. That might be especially troublesome if you didn't build the game yourself. --- include/decl.h | 6 +++--- include/extern.h | 4 +++- src/decl.c | 2 ++ src/files.c | 36 +++++++++++++++++++++++++++++++++--- sys/vms/vmsmain.c | 6 ++++++ sys/winnt/windmain.c | 17 +++++++---------- 6 files changed, 54 insertions(+), 17 deletions(-) diff --git a/include/decl.h b/include/decl.h index c6e298b43b..e4bbca6a62 100644 --- a/include/decl.h +++ b/include/decl.h @@ -291,9 +291,9 @@ E NEARDATA struct c_color_names { #define NH_GREEN c_color_names.c_green #define NH_SILVER c_color_names.c_silver #define NH_BLUE c_color_names.c_blue -#define NH_PURPLE c_color_names.c_purple -#define NH_WHITE c_color_names.c_white -#define NH_ORANGE c_color_names.c_orange +E boolean deferred_showpaths; /* decl.c */ +E const char *deferred_showpaths_dir; /* decl.c */ + /* The names of the colors used for gems, etc. */ E const char *c_obj_colors[]; diff --git a/include/extern.h b/include/extern.h index e8285c00f4..f205dd7a17 100644 --- a/include/extern.h +++ b/include/extern.h @@ -848,10 +848,11 @@ E void NDECL(really_close); #ifdef DEBUG E boolean FDECL(debugcore, (const char *, BOOLEAN_P)); #endif -E void NDECL(reveal_paths); +E void FDECL(reveal_paths,(int)); E boolean FDECL(read_tribute, (const char *, const char *, int, char *, int, unsigned)); E boolean FDECL(Death_quote, (char *, int)); +extern void FDECL(do_deferred_showpaths, (int)); /* ### fountain.c ### */ @@ -2593,6 +2594,7 @@ E void FDECL(sethanguphandler, (void (*)(int))); E boolean NDECL(authorize_wizard_mode); E boolean FDECL(check_user_string, (char *)); E char *NDECL(get_login_name); +ATTRNORETURN extern void after_opt_showpaths(const char *) NORETURN; #endif /* UNIX */ /* ### unixtty.c ### */ diff --git a/src/decl.c b/src/decl.c index 4ae704d410..b74ea1903b 100644 --- a/src/decl.c +++ b/src/decl.c @@ -334,6 +334,8 @@ NEARDATA struct savefile_info sfrestinfo, sfsaveinfo = { #endif #if defined(ZEROCOMP) | SFI1_ZEROCOMP + FALSE, /* deferred_showpaths */ + NULL, /* deferred_showpaths_dir */ #endif #if defined(RLECOMP) | SFI1_RLECOMP diff --git a/src/files.c b/src/files.c index 60d9aa56a7..8d0d7c90ec 100644 --- a/src/files.c +++ b/src/files.c @@ -3935,6 +3935,8 @@ assure_syscf_file() close(fd); return; } + if (gd.deferred_showpaths) + do_deferred_showpaths(1); /* does not return */ raw_printf("Unable to open SYSCF_FILE.\n"); exit(EXIT_FAILURE); } @@ -3942,6 +3944,26 @@ assure_syscf_file() #endif /* SYSCF_FILE */ #endif /* SYSCF */ +ATTRNORETURN void +do_deferred_showpaths(int code) +{ + gd.deferred_showpaths = FALSE; + reveal_paths(code); + +#ifdef UNIX + after_opt_showpaths(gd.deferred_showpaths_dir); +#else +#ifdef CHDIR + chdirx(gd.deferred_showpaths_dir, 0); +#endif +#if defined(WIN32) || defined(MICRO) || defined(OS2) + nethack_exit(EXIT_SUCCESS); +#else + exit(EXIT_SUCCESS); +#endif +#endif +} + #ifdef DEBUG /* used by debugpline() to decide whether to issue a message * from a particular source file; caller passes __FILE__ and we check @@ -4023,9 +4045,12 @@ boolean wildcards; #endif void -reveal_paths(VOID_ARGS) +reveal_paths(code) +int code; { - const char *fqn, *nodumpreason; + const char *fqn, *nodumpreason, + *sysconffile = "system configuration file"; + char buf[BUFSZ]; #if defined(SYSCF) || !defined(UNIX) || defined(DLB) const char *filep; @@ -4057,7 +4082,8 @@ reveal_paths(VOID_ARGS) #else buf[0] = '\0'; #endif - raw_printf("%s system configuration file%s:", s_suffix(gamename), buf); + raw_printf("%s %s%s:", + s_suffix(gamename), sysconffile, buf); #ifdef SYSCF_FILE filep = SYSCF_FILE; #else @@ -4069,6 +4095,10 @@ reveal_paths(VOID_ARGS) filep = configfile; } raw_printf(" \"%s\"", filep); + if (code == 1) { + raw_printf("NOTE: The %s above is missing or inaccessible!", + sysconffile); + } #else /* !SYSCF */ raw_printf("No system configuration file."); #endif /* ?SYSCF */ diff --git a/sys/vms/vmsmain.c b/sys/vms/vmsmain.c index 0a85720074..327d1af4d0 100644 --- a/sys/vms/vmsmain.c +++ b/sys/vms/vmsmain.c @@ -67,6 +67,12 @@ char *argv[]; dir = nh_getenv("HACKDIR"); #endif if (argc > 1) { + if (argcheck(argc, argv, ARG_VERSION) == 2) + exit(EXIT_SUCCESS); + + if (argcheck(argc, argv, ARG_SHOWPATHS) == 2) { + deferred_showpaths = TRUE; + return; #ifdef CHDIR if (!strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') { /* avoid matching "-dec" for DECgraphics; since the man page diff --git a/sys/winnt/windmain.c b/sys/winnt/windmain.c index 2a4b4f5813..e48d88236d 100644 --- a/sys/winnt/windmain.c +++ b/sys/winnt/windmain.c @@ -24,6 +24,7 @@ static void FDECL(process_options, (int argc, char **argv)); static void NDECL(nhusage); static char *NDECL(get_executable_path); +static void early_options(int argc, char **argv); char *FDECL(translate_path_variables, (const char *, char *)); char *NDECL(exename); boolean NDECL(fakeconsole); @@ -474,6 +475,7 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ check_recordfile((char *) 0); iflags.windowtype_deferred = TRUE; copy_sysconf_content(); + early_options(argc, argv); initoptions(); /* Now that sysconf has had a chance to set the TROUBLEPREFIX, don't @@ -481,7 +483,6 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ fqn_prefix_locked[TROUBLEPREFIX] = TRUE; copy_config_content(); - process_options(argc, argv); /* did something earlier flag a need to exit without starting a game? */ if (windows_startup_state > 0) { @@ -645,19 +646,14 @@ char *argv[]; { int i; - /* - * Process options. - */ if (argc > 1) { if (argcheck(argc, argv, ARG_VERSION) == 2) nethack_exit(EXIT_SUCCESS); if (argcheck(argc, argv, ARG_SHOWPATHS) == 2) { - iflags.initoptions_noterminate = TRUE; - initoptions(); - iflags.initoptions_noterminate = FALSE; - reveal_paths(); - nethack_exit(EXIT_SUCCESS); + gd.deferred_showpaths = TRUE; + /* gd.deferred_showpaths is not used by windows */ + return; } if (argcheck(argc, argv, ARG_DEBUG) == 1) { argc--; @@ -673,7 +669,7 @@ char *argv[]; */ argc--; argv++; - const char * dir = argv[0] + 2; + const char *dir = argv[0] + 2; if (*dir == '=' || *dir == ':') dir++; if (!*dir && argc > 1) { @@ -741,6 +737,7 @@ char *argv[]; case 'u': if (argv[0][2]) (void) strncpy(plname, argv[0] + 2, sizeof(plname) - 1); + sizeof(svp.plname) - 1); else if (argc > 1) { argc--; argv++; From b567f51392402ef12c72c3b92c468fe0f00a5e0a Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 22 Dec 2024 22:26:15 -0500 Subject: [PATCH 37/66] cherry pick --showpaths changes to NetHack-3.6 --- include/decl.h | 7 +++++-- include/extern.h | 4 ++-- src/decl.c | 5 +++-- src/files.c | 15 +++++++++------ src/options.c | 4 ++++ sys/unix/unixmain.c | 35 +++++++++++++++++++++++++++-------- sys/winnt/windmain.c | 11 +++++------ 7 files changed, 55 insertions(+), 26 deletions(-) diff --git a/include/decl.h b/include/decl.h index e4bbca6a62..d550180f12 100644 --- a/include/decl.h +++ b/include/decl.h @@ -291,9 +291,12 @@ E NEARDATA struct c_color_names { #define NH_GREEN c_color_names.c_green #define NH_SILVER c_color_names.c_silver #define NH_BLUE c_color_names.c_blue -E boolean deferred_showpaths; /* decl.c */ -E const char *deferred_showpaths_dir; /* decl.c */ +#define NH_PURPLE c_color_names.c_purple +#define NH_WHITE c_color_names.c_white +#define NH_ORANGE c_color_names.c_orange +E boolean deferred_showpaths; /* decl.c */ +E char *deferred_showpaths_dir; /* decl.c */ /* The names of the colors used for gems, etc. */ E const char *c_obj_colors[]; diff --git a/include/extern.h b/include/extern.h index f205dd7a17..023d249016 100644 --- a/include/extern.h +++ b/include/extern.h @@ -848,7 +848,7 @@ E void NDECL(really_close); #ifdef DEBUG E boolean FDECL(debugcore, (const char *, BOOLEAN_P)); #endif -E void FDECL(reveal_paths,(int)); +E void FDECL(reveal_paths, (int)); E boolean FDECL(read_tribute, (const char *, const char *, int, char *, int, unsigned)); E boolean FDECL(Death_quote, (char *, int)); @@ -2594,7 +2594,7 @@ E void FDECL(sethanguphandler, (void (*)(int))); E boolean NDECL(authorize_wizard_mode); E boolean FDECL(check_user_string, (char *)); E char *NDECL(get_login_name); -ATTRNORETURN extern void after_opt_showpaths(const char *) NORETURN; +E void after_opt_showpaths(const char *) NORETURN; #endif /* UNIX */ /* ### unixtty.c ### */ diff --git a/src/decl.c b/src/decl.c index b74ea1903b..a37b259037 100644 --- a/src/decl.c +++ b/src/decl.c @@ -300,6 +300,9 @@ const char *fqn_prefix_names[PREFIX_COUNT] = { }; #endif +boolean deferred_showpaths = FALSE; +char *deferred_showpaths_dir = (char *) 0; + NEARDATA struct savefile_info sfcap = { #ifdef NHSTDC 0x00000000UL @@ -334,8 +337,6 @@ NEARDATA struct savefile_info sfrestinfo, sfsaveinfo = { #endif #if defined(ZEROCOMP) | SFI1_ZEROCOMP - FALSE, /* deferred_showpaths */ - NULL, /* deferred_showpaths_dir */ #endif #if defined(RLECOMP) | SFI1_RLECOMP diff --git a/src/files.c b/src/files.c index 8d0d7c90ec..0df340d36e 100644 --- a/src/files.c +++ b/src/files.c @@ -3935,7 +3935,7 @@ assure_syscf_file() close(fd); return; } - if (gd.deferred_showpaths) + if (deferred_showpaths) do_deferred_showpaths(1); /* does not return */ raw_printf("Unable to open SYSCF_FILE.\n"); exit(EXIT_FAILURE); @@ -3944,17 +3944,20 @@ assure_syscf_file() #endif /* SYSCF_FILE */ #endif /* SYSCF */ -ATTRNORETURN void -do_deferred_showpaths(int code) +void +do_deferred_showpaths(code) +int code; { - gd.deferred_showpaths = FALSE; + deferred_showpaths = FALSE; reveal_paths(code); #ifdef UNIX - after_opt_showpaths(gd.deferred_showpaths_dir); + after_opt_showpaths(deferred_showpaths_dir); #else +#if !defined(WIN32) #ifdef CHDIR - chdirx(gd.deferred_showpaths_dir, 0); + chdirx(deferred_showpaths_dir, 0); +#endif #endif #if defined(WIN32) || defined(MICRO) || defined(OS2) nethack_exit(EXIT_SUCCESS); diff --git a/src/options.c b/src/options.c index 47145b904a..561782cee3 100644 --- a/src/options.c +++ b/src/options.c @@ -685,6 +685,10 @@ initoptions() */ #endif #endif /* SYSCF */ + /* Carry out options that got deferred from early_options */ + if (deferred_showpaths) + do_deferred_showpaths(0); /* does not return */ + initoptions_finish(); } diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 1e7880165d..8e46308dd8 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -31,6 +31,7 @@ static void FDECL(chdirx, (const char *, BOOLEAN_P)); #endif /* CHDIR */ static boolean NDECL(whoami); static void FDECL(process_options, (int, char **)); +static void NDECL(opt_terminate); #ifdef _M_UNIX extern void NDECL(check_sco_console); @@ -115,14 +116,9 @@ char *argv[]; exit(EXIT_SUCCESS); if (argcheck(argc, argv, ARG_SHOWPATHS) == 2) { -#ifdef CHDIR - chdirx((char *) 0, 0); -#endif - iflags.initoptions_noterminate = TRUE; - initoptions(); - iflags.initoptions_noterminate = FALSE; - reveal_paths(); - exit(EXIT_SUCCESS); + deferred_showpaths = TRUE; + deferred_showpaths_dir = (char *) 0; + return; } if (argcheck(argc, argv, ARG_DEBUG) == 1) { argc--; @@ -807,4 +803,27 @@ sys_random_seed() return seed; } +void +after_opt_showpaths(dir) +const char *dir; +{ +#ifdef CHDIR + chdirx((char *) 0, 0); +#else + nhUse(dir); +#endif + reveal_paths(); + +} + +/* for command-line options that perform some immediate action and then + terminate the program without starting play, like 'nethack --version' + or 'nethack -s Zelda'; do some cleanup before that termination */ +static void +opt_terminate(void) +{ + nh_terminate(EXIT_SUCCESS); + /*NOTREACHED*/ +} + /*unixmain.c*/ diff --git a/sys/winnt/windmain.c b/sys/winnt/windmain.c index e48d88236d..14c2b1c0e3 100644 --- a/sys/winnt/windmain.c +++ b/sys/winnt/windmain.c @@ -24,7 +24,6 @@ static void FDECL(process_options, (int argc, char **argv)); static void NDECL(nhusage); static char *NDECL(get_executable_path); -static void early_options(int argc, char **argv); char *FDECL(translate_path_variables, (const char *, char *)); char *NDECL(exename); boolean NDECL(fakeconsole); @@ -475,7 +474,7 @@ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);*/ check_recordfile((char *) 0); iflags.windowtype_deferred = TRUE; copy_sysconf_content(); - early_options(argc, argv); + process_options(argc, argv); initoptions(); /* Now that sysconf has had a chance to set the TROUBLEPREFIX, don't @@ -651,8 +650,8 @@ char *argv[]; nethack_exit(EXIT_SUCCESS); if (argcheck(argc, argv, ARG_SHOWPATHS) == 2) { - gd.deferred_showpaths = TRUE; - /* gd.deferred_showpaths is not used by windows */ + deferred_showpaths = TRUE; + /* deferred_showpaths is not used by windows */ return; } if (argcheck(argc, argv, ARG_DEBUG) == 1) { @@ -736,8 +735,8 @@ char *argv[]; #endif case 'u': if (argv[0][2]) - (void) strncpy(plname, argv[0] + 2, sizeof(plname) - 1); - sizeof(svp.plname) - 1); + (void) strncpy(plname, argv[0] + 2, + sizeof(plname) - 1); else if (argc > 1) { argc--; argv++; From cf2196041212790df67d7d12c0c7ec369e656079 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 22 Dec 2024 22:28:23 -0500 Subject: [PATCH 38/66] follow-up to be8a3b59 Windows GUI Windows build fix after that merge --- win/win32/mhmenu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win/win32/mhmenu.c b/win/win32/mhmenu.c index f9a4c46fde..5e6884c5b9 100644 --- a/win/win32/mhmenu.c +++ b/win/win32/mhmenu.c @@ -954,7 +954,7 @@ onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) int map_y = 16; /* leave it at the default size, unless * we are actually showing the larger * icons in the menu */ - if (NHMENU_HAS_GLYPH(data->menui.menu.items[i]) + if (NHMENU_HAS_GLYPH(data->menu.items[i]) && !IS_MAP_ASCII(iflags.wc_map_mode)) { lpmis->itemHeight = max(lpmis->itemHeight, From 101abffa3958c82b19a73d5e3943dc31496ef8d0 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 22 Dec 2024 22:45:59 -0500 Subject: [PATCH 39/66] merge cleanup --- sys/unix/unixmain.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 8e46308dd8..ba6031547f 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -118,7 +118,6 @@ char *argv[]; if (argcheck(argc, argv, ARG_SHOWPATHS) == 2) { deferred_showpaths = TRUE; deferred_showpaths_dir = (char *) 0; - return; } if (argcheck(argc, argv, ARG_DEBUG) == 1) { argc--; @@ -812,8 +811,7 @@ const char *dir; #else nhUse(dir); #endif - reveal_paths(); - + reveal_paths(0); } /* for command-line options that perform some immediate action and then From 532872ba577b2e25863f20e0e94e4dea597dd8b4 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 22 Dec 2024 23:07:17 -0500 Subject: [PATCH 40/66] unixmain merge cleanup --- sys/unix/unixmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index ba6031547f..75f95b7e23 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -811,7 +811,7 @@ const char *dir; #else nhUse(dir); #endif - reveal_paths(0); + opt_terminate(); } /* for command-line options that perform some immediate action and then From e41ddd5e9f4d7bc60ca22351f414e66dbab82bac Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 23 Dec 2024 00:16:52 -0500 Subject: [PATCH 41/66] follow-up tweaking for missing sysconf --showpaths --- src/files.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/files.c b/src/files.c index 0df340d36e..df702ee86c 100644 --- a/src/files.c +++ b/src/files.c @@ -4051,6 +4051,7 @@ void reveal_paths(code) int code; { + boolean skip_sysopt = FALSE; const char *fqn, *nodumpreason, *sysconffile = "system configuration file"; @@ -4101,6 +4102,7 @@ int code; if (code == 1) { raw_printf("NOTE: The %s above is missing or inaccessible!", sysconffile); + skip_sysopt = TRUE; } #else /* !SYSCF */ raw_printf("No system configuration file."); @@ -4174,17 +4176,20 @@ int code; /* dumplog */ + fqn = (char *) 0; #ifndef DUMPLOG nodumpreason = "not supported"; #else nodumpreason = "disabled"; #ifdef SYSCF - fqn = sysopt.dumplogfile; + if (!skip_sysopt) { + fqn = sysopt.dumplogfile; + } else { + nodumpreason = "dumplogfile setting unavailable from missing sysconf"; + } #else /* !SYSCF */ #ifdef DUMPLOG_FILE fqn = DUMPLOG_FILE; -#else - fqn = (char *) 0; #endif #endif /* ?SYSCF */ if (fqn && *fqn) { @@ -4192,20 +4197,23 @@ int code; (void) dump_fmtstr(fqn, buf, FALSE); buf[sizeof buf - sizeof " \"\""] = '\0'; raw_printf(" \"%s\"", buf); - } else + } else { + raw_printf("No end-of-game disclosure file (%s)", nodumpreason); + } #endif /* ?DUMPLOG */ - raw_printf("No end-of-game disclosure file (%s).", nodumpreason); #ifdef WIN32 - if (sysopt.portable_device_paths) { - const char *pd = get_portable_device(); - - /* an empty value for pd indicates that portable_device_paths - got set TRUE in a sysconf file other than the one containing - the executable; disregard it */ - if (strlen(pd) > 0) { - raw_printf("portable_device_paths (set in sysconf):"); - raw_printf(" \"%s\"", pd); + if (!skip_sysopt) { + if (sysopt.portable_device_paths) { + const char *pd = get_portable_device(); + + /* an empty value for pd indicates that portable_device_paths + got set TRUE in a sysconf file other than the one containing + the executable; disregard it */ + if (strlen(pd) > 0) { + raw_printf("portable_device_paths (set in sysconf):"); + raw_printf(" \"%s\"", pd); + } } } #endif From 149cb1a0bd6805030ed3e456da394c1a612a92b6 Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 23 Dec 2024 00:33:12 -0500 Subject: [PATCH 42/66] more follow-up tweaking for missing sysconf --showpaths --- src/files.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/files.c b/src/files.c index df702ee86c..e0395bddd9 100644 --- a/src/files.c +++ b/src/files.c @@ -4047,13 +4047,14 @@ boolean wildcards; #endif #endif +#define SYSCONFFILE "system configuration file" + void reveal_paths(code) int code; { boolean skip_sysopt = FALSE; - const char *fqn, *nodumpreason, - *sysconffile = "system configuration file"; + const char *fqn, *nodumpreason; char buf[BUFSZ]; #if defined(SYSCF) || !defined(UNIX) || defined(DLB) @@ -4086,8 +4087,8 @@ int code; #else buf[0] = '\0'; #endif - raw_printf("%s %s%s:", - s_suffix(gamename), sysconffile, buf); + raw_printf("%s %s%s:", s_suffix(gamename), + SYSCONFFILE, buf); #ifdef SYSCF_FILE filep = SYSCF_FILE; #else @@ -4101,7 +4102,7 @@ int code; raw_printf(" \"%s\"", filep); if (code == 1) { raw_printf("NOTE: The %s above is missing or inaccessible!", - sysconffile); + SYSCONFFILE); skip_sysopt = TRUE; } #else /* !SYSCF */ @@ -4184,8 +4185,10 @@ int code; #ifdef SYSCF if (!skip_sysopt) { fqn = sysopt.dumplogfile; + if (!fqn) + nodumpreason = "DUMPLOGFILE is not set in " SYSCONFFILE; } else { - nodumpreason = "dumplogfile setting unavailable from missing sysconf"; + nodumpreason = SYSCONFFILE " is missing; no DUMPLOGFILE setting"; } #else /* !SYSCF */ #ifdef DUMPLOG_FILE @@ -4198,7 +4201,7 @@ int code; buf[sizeof buf - sizeof " \"\""] = '\0'; raw_printf(" \"%s\"", buf); } else { - raw_printf("No end-of-game disclosure file (%s)", nodumpreason); + raw_printf("No end-of-game disclosure file (%s).", nodumpreason); } #endif /* ?DUMPLOG */ From ff220c9e613bc48c093824e247513967a7240c69 Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 23 Dec 2024 00:47:48 -0500 Subject: [PATCH 43/66] fixes36.7 entry for --showpaths tweaking --- doc/fixes36.7 | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index 114a9855e2..9e358e38b3 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -62,3 +62,4 @@ correct the Ixoth tile makedefs can produce individual bogusmon, engrave and epitaph files drinkfountain() fate 24 to curse objects could end up cursing objects on the floor chain instead of the intended inventory object chain +proceed with --showpaths option even if the sysconf file is missing From b1c855615ce4538c93d7999bebc281b67427f5e1 Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 23 Dec 2024 00:51:59 -0500 Subject: [PATCH 44/66] follow-up bit --- doc/fixes36.7 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index 9e358e38b3..74e2de7f81 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -62,4 +62,4 @@ correct the Ixoth tile makedefs can produce individual bogusmon, engrave and epitaph files drinkfountain() fate 24 to curse objects could end up cursing objects on the floor chain instead of the intended inventory object chain -proceed with --showpaths option even if the sysconf file is missing +proceed with showpaths option even if the sysconf file is missing From a38243e0d0c14c15602a4e1793095130b7c86677 Mon Sep 17 00:00:00 2001 From: keni Date: Wed, 25 Dec 2024 15:02:06 -0500 Subject: [PATCH 45/66] 3.6 setup for NHAUTODOCS --- doc/.gitattributes | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/.gitattributes b/doc/.gitattributes index 80fecb1d5d..59f8abbc47 100644 --- a/doc/.gitattributes +++ b/doc/.gitattributes @@ -1,4 +1,5 @@ *.mn NHSUBST +*.tex NHSUBST *.6 NHSUBST *.7 NHSUBST fixes* NHSUBST @@ -10,3 +11,7 @@ tmac.nh NUSUBST fixes* NH_header=no *.txt NH_header=no * NH_filestag=(file%s_for_all_versions) +Guidebook.tex NH_DATESUB +Guidebook.mn NH_DATESUB NHAUTODOCS +*.6 NH_DATESUB NHAUTODOCS +*.7 NH_DATESUB NHAUTODOCS From 57fa6b93d55c7e76a4ce8e8976c403629c01c554 Mon Sep 17 00:00:00 2001 From: keni Date: Wed, 25 Dec 2024 20:21:37 -0500 Subject: [PATCH 46/66] more .gitattributes --- doc/.gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/.gitattributes b/doc/.gitattributes index 59f8abbc47..748efbe699 100644 --- a/doc/.gitattributes +++ b/doc/.gitattributes @@ -15,3 +15,4 @@ Guidebook.tex NH_DATESUB Guidebook.mn NH_DATESUB NHAUTODOCS *.6 NH_DATESUB NHAUTODOCS *.7 NH_DATESUB NHAUTODOCS +fixes* -NHAUTODOCS From 12bcc232b1d5c11c950e5f2893f7e7ff467b50a6 Mon Sep 17 00:00:00 2001 From: nhmall Date: Wed, 1 Jan 2025 08:46:41 -0500 Subject: [PATCH 47/66] update year in COPYRIGHT_BANNER_A to 2025 --- include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/patchlevel.h b/include/patchlevel.h index 0cd31fe1f6..722f6eb5f5 100644 --- a/include/patchlevel.h +++ b/include/patchlevel.h @@ -16,7 +16,7 @@ */ #define EDITLEVEL 0 -#define COPYRIGHT_BANNER_A "NetHack, Copyright 1985-2024" +#define COPYRIGHT_BANNER_A "NetHack, Copyright 1985-2025" #define COPYRIGHT_BANNER_B \ " By Stichting Mathematisch Centrum and M. Stephenson." /* COPYRIGHT_BANNER_C is generated by makedefs into date.h */ From b0e974801236410c9cfbd5f07639015f7af934f7 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 26 Jan 2025 11:55:48 -0500 Subject: [PATCH 48/66] avoid mk_artifact()-related memory leaks cherry-pick of 3cca4f27076e92a3be2ee9286813c18d8813311e from NetHack-3.7. Reported directly to devteam after being discovered in nerfhack. --- src/artifact.c | 35 +++++++++++++++++++++++++---------- src/mkobj.c | 4 +++- src/mplayer.c | 1 + src/pray.c | 2 ++ 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/artifact.c b/src/artifact.c index 03573fe1d1..7959b6381b 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -30,6 +30,7 @@ STATIC_DCL uchar FDECL(abil_to_adtyp, (long *)); STATIC_DCL int FDECL(glow_strength, (int)); STATIC_DCL boolean FDECL(untouchable, (struct obj *, BOOLEAN_P)); STATIC_DCL int FDECL(count_surround_traps, (int, int)); +staticfn void dispose_of_orig_obj(struct obj *); /* The amount added to the victim's total hit points to insure that the victim will be killed even after damage bonus/penalty adjustments. @@ -127,6 +128,7 @@ mk_artifact(otmp, alignment) struct obj *otmp; /* existing object; ignored if alignment specified */ aligntyp alignment; /* target alignment, or A_NONE */ { + struct obj *artiobj; const struct artifact *a; int m, n, altn; boolean by_align = (alignment != A_NONE); @@ -191,23 +193,36 @@ aligntyp alignment; /* target alignment, or A_NONE */ m = eligible[rn2(n)]; /* [0..n-1] */ a = &artilist[m]; - /* make an appropriate object if necessary, then christen it */ - if (by_align) - otmp = mksobj((int) a->otyp, TRUE, FALSE); + /* make an appropriate object, then christen it */ + artiobj = mksobj((int) a->otyp, TRUE, FALSE); - if (otmp) { - otmp = oname(otmp, a->name); - otmp->oartifact = m; - artiexist[m] = TRUE; - } + artiobj = oname(artiobj, a->name); + artiobj->oartifact = m; + artiexist[m] = TRUE; + if (otmp) + dispose_of_orig_obj(otmp); + otmp = artiobj; } else { /* nothing appropriate could be found; return original object */ - if (by_align) - otmp = 0; /* (there was no original object) */ + if (by_align && otmp) { + /* (there shouldn't have been an original object) */ + dispose_of_orig_obj(otmp); + otmp = 0; + } } return otmp; } +void +dispose_of_orig_obj(struct obj *obj) +{ + if (!obj) + return; + + obj_extract_self(obj); + obfree(obj, (struct obj *) 0); +} + /* * Returns the full name (with articles and correct capitalization) of an * artifact named "name" if one exists, or NULL, it not. diff --git a/src/mkobj.c b/src/mkobj.c index 17265ff89c..9c1e624e2e 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -1105,8 +1105,10 @@ boolean artif; } /* unique objects may have an associated artifact entry */ - if (objects[otyp].oc_unique && !otmp->oartifact) + if (objects[otyp].oc_unique && !otmp->oartifact) { + /* mk_artifact() with otmp and A_NONE will never return NULL */ otmp = mk_artifact(otmp, (aligntyp) A_NONE); + } otmp->owt = weight(otmp); return otmp; } diff --git a/src/mplayer.c b/src/mplayer.c index 2dba08e1bc..de3b4261a8 100644 --- a/src/mplayer.c +++ b/src/mplayer.c @@ -267,6 +267,7 @@ register boolean special; otmp->oerodeproof = 1; else if (!rn2(2)) otmp->greased = 1; + /* mk_artifact() with otmp and A_NONE will never return NULL */ if (special && rn2(2)) otmp = mk_artifact(otmp, A_NONE); /* usually increase stack size if stackable weapon */ diff --git a/src/pray.c b/src/pray.c index 79369fc024..9f82dd6d34 100644 --- a/src/pray.c +++ b/src/pray.c @@ -1748,6 +1748,8 @@ dosacrifice() /* The chance goes down as the number of artifacts goes up */ if (u.ulevel > 2 && u.uluck >= 0 && !rn2(10 + (2 * u.ugifts * nartifacts))) { + /* mk_artifact() with NULL obj and a_align() arg + can return NULL */ otmp = mk_artifact((struct obj *) 0, a_align(u.ux, u.uy)); if (otmp) { if (otmp->spe < 0) From b6419e5debdfe58a4c9bc0a1ab85d0aa7b296c8b Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 26 Jan 2025 12:25:27 -0500 Subject: [PATCH 49/66] follow-up: make definition match proto staticfn --- src/artifact.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/artifact.c b/src/artifact.c index 7959b6381b..710a5221b4 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -213,7 +213,7 @@ aligntyp alignment; /* target alignment, or A_NONE */ return otmp; } -void +staticfn void dispose_of_orig_obj(struct obj *obj) { if (!obj) From 87af270e48e3c7e199e7b44eda1d51fffece4796 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 26 Jan 2025 17:45:46 -0500 Subject: [PATCH 50/66] follow-up: cherry-pick k&r style and fixes36.7 --- doc/fixes36.7 | 2 ++ src/artifact.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index 74e2de7f81..458d5a3159 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -63,3 +63,5 @@ makedefs can produce individual bogusmon, engrave and epitaph files drinkfountain() fate 24 to curse objects could end up cursing objects on the floor chain instead of the intended inventory object chain proceed with showpaths option even if the sysconf file is missing +avoid memory leak in mk_artifact(); cherry-pick of 3cca4f27 from 3.7 WIP + diff --git a/src/artifact.c b/src/artifact.c index 710a5221b4..5063ecaa02 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -30,7 +30,7 @@ STATIC_DCL uchar FDECL(abil_to_adtyp, (long *)); STATIC_DCL int FDECL(glow_strength, (int)); STATIC_DCL boolean FDECL(untouchable, (struct obj *, BOOLEAN_P)); STATIC_DCL int FDECL(count_surround_traps, (int, int)); -staticfn void dispose_of_orig_obj(struct obj *); +STATIC_DCL void dispose_of_orig_obj(struct obj *); /* The amount added to the victim's total hit points to insure that the victim will be killed even after damage bonus/penalty adjustments. @@ -213,7 +213,7 @@ aligntyp alignment; /* target alignment, or A_NONE */ return otmp; } -staticfn void +STATIC_OVL void dispose_of_orig_obj(struct obj *obj) { if (!obj) From c2e63959c43da6cd55e1189e06b6d1a8b8a618e1 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 26 Jan 2025 19:22:54 -0500 Subject: [PATCH 51/66] follow-up --- src/artifact.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/artifact.c b/src/artifact.c index 5063ecaa02..33c4c9955a 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -193,15 +193,19 @@ aligntyp alignment; /* target alignment, or A_NONE */ m = eligible[rn2(n)]; /* [0..n-1] */ a = &artilist[m]; - /* make an appropriate object, then christen it */ - artiobj = mksobj((int) a->otyp, TRUE, FALSE); - - artiobj = oname(artiobj, a->name); - artiobj->oartifact = m; - artiexist[m] = TRUE; - if (otmp) - dispose_of_orig_obj(otmp); - otmp = artiobj; + /* make an appropriate object if necessary, then christen it */ + if (by_align) { + artiobj = mksobj((int) a->otyp, TRUE, FALSE); + if (otmp) { + dispose_of_orig_obj(otmp); + otmp = artiobj; + } + } + if (otmp) { + otmp = oname(otmp, a->name); + otmp->oartifact = m; + artiexist[m] = TRUE; + } } else { /* nothing appropriate could be found; return original object */ if (by_align && otmp) { From 47b4a956a1a2084a12364546b0544f2e309abf89 Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 10 Mar 2025 15:59:15 -0400 Subject: [PATCH 52/66] fix Guidebook dependency; add col alternative Add util/stripbs.c, filter that strips character-backspace-character sequences from stdout and writes results to stdout. Can be used for producing the Guidebook on platforms/environments where col has been deprecated. It fixes a missing ../util/makedefs dependency for the Guidebook target in sys/unix/Guidebook.doc. 'make Guidebook' should work even if NetHack has not been built yet. --- doc/Guidebook.mn | 120 ++++++++++++++++++++++++++++++++---------- doc/tmac.nh | 16 ++++-- sys/unix/Makefile.doc | 24 ++++++--- sys/unix/Makefile.top | 5 ++ sys/unix/Makefile.utl | 9 ++++ util/.gitignore | 1 + util/stripbs.c | 42 +++++++++++++++ 7 files changed, 180 insertions(+), 37 deletions(-) create mode 100644 util/stripbs.c diff --git a/doc/Guidebook.mn b/doc/Guidebook.mn index c302200e40..63abbbf1ff 100644 --- a/doc/Guidebook.mn +++ b/doc/Guidebook.mn @@ -13,18 +13,42 @@ .\"| is handled differently depending on whether it terminates an abbrevi- .\"| ation or a sentence. To distinguish both cases, do a line break af- .\"| ter each sentence. -.\"||| +.\"+-- +.\" Guidebook.mn has been updated to adhere to the first two guidelines +.\" but does not yet fully honor the third. New changes should do so. .\" . -.so tmac.nh \" extra macros which aren't in tmac.n +.\" Usage: +.\" to produce Guidebook.ps: +.\" cat Guidebook.mn |tbl tmac.n - |groff >Guidebook.ps +.\" to produce Guidebook.txt: +.\" cat Guidebook.mn |tbl tmac.n - |groff -c -Tascii |col -bx >Guidebook.txt +.\" with an optional filtering step between 'cat' and 'tbl': +.\" cat... |../util/makedefs --grep --input - --output - |tbl... +. +.if n \{\ +.po 5n +.ll 70n +.lt 70n +.\} +. +.so tmac.nh \" extra macros which aren't in tmac.n +.if !\n(nH .so doc/tmac.nh . -.ds h0 "NetHack Guidebook -.ds h1 +.\" building Guidebook.txt doesn't have CR font available; groff 1.23 issues +.\" a warning each time any font can't be loaded; earlier versions silently +.\" proceeded so lack of CR (fixed-width, moot for plain text) didn't matter +.if n .do ftr CR R \" if formatting for a terminal, substitute R for CR +. \" (the substitution affects both '\f' and '.ft') +. +.ds h0 NetHack Guidebook +.ds h1 \" empty .ds h2 % -.ds vr "NetHack 3.6 -.ds f0 "\*(vr -.ds f1 -.ds f2 "February 3, 2023 +.ds vr NetHack 3.6.7 +.ds f0 \*(vr +.ds f1 \" empty +.\"DO NOT REMOVE NH_DATESUB .ds f2 Date(%B %-d, %Y) +.ds f2 February 3, 2023 . .\" A note on some special characters: .\" \(lq = left double quote @@ -32,9 +56,11 @@ .\" \(oq = left (open) single quote .\" \(cq = right (close) single quote \(aq = apostrophe / single quote .\" - = hyphen \- = minus sign -.\" \(em = M-sized dash +.\" \(rs = backslash \(em = dash as wide as 'M' is tall .\" ^ = small circumflex punctuation \(ha = larger circumflex character .\" ~ = small tilde punctuation \(ti = larger tilde character +.\" +.\" See groff_man_style(7) or groff_char(7) for more on these. . . .\" finally, start the actual Guidebook... @@ -44,7 +70,7 @@ A Guide to the Mazes of Menace (Guidebook for NetHack) .au Original version - Eric S. Raymond -(Edited and expanded for 3.6 by Mike Stephenson and others) +(Edited and expanded for \*(vr by Mike Stephenson and others) .sp 1 \*(f2 .hn 1 @@ -92,7 +118,7 @@ travel, you see the ancient ruins that mark the entrance to the Mazes of Menace. It is late at night, so you make camp at the entrance and spend the night sleeping under the open skies. In the morning, you gather your gear, eat what may be your last meal outside, and enter the -dungeon... +dungeon.... . .hn 1 What is going on here? @@ -229,9 +255,20 @@ replaces the \(lqYou see ...\(rq descriptions of text adventure games. Figure 1 is a sample of what a NetHack screen might look like. The way the screen looks for you depends on your platform. . +.\" (Either generated by hand or else the composite of two different +.\" situations. Originally the character had only reached a second room +.\" (unchanged here) by turn 257 (now changed to 752) and was already +.\" Weak from hunger (now changed to just Hungry) and also lacked any of +.\" Tourist's starting gold. Confusion is added to include a +.\" condition.) +.\" +.\" Width is constrained by the margins of plain text output +.\" (Guidebook.txt). Text output might show an extra space inboard of +.\" the left and right box boundaries that does not appear in PostScript +.\" output. This behavior is specific to GNU tbl. .BR 2 .ft CR \" set font to constant-width Roman -.TS S +.TS center box tab(~); L. The bat bites! @@ -245,12 +282,28 @@ The bat bites! -Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral -Dlvl:1 $:0 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak +Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral +Dlvl:1 $:993 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:752 Hungry Conf .TE -.ft \" revert to previous font +.ft R +.ce 1 +.if t .sp 0.5v + Figure 1 +. +.BR 1 +.ft CR +.TS +center box tab(~); +L. +.\" Use trailing spaces to force the same width as Figure 1. +Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 \& +Neutral $:993 HP:9(12) Pw:3(3) AC:10 Exp:1/19 Hungry \& +Dlvl:1 T:752 Conf \& +.TE +.ft R .ce 1 -Figure 1 +.if t .sp 0.5v +Figure 2 . .hn 2 The status lines (bottom) @@ -264,6 +317,11 @@ below): .lp "Rank " Your character's name and professional ranking (based on the experience level, see below). +.pg +Here are explanations of what the various status items mean: +.lp "Title " +Your character's name and professional ranking (based on role and +\fIexperience level\fP, see below). .lp Strength A measure of your character's strength; one of your six basic attributes. A human character's attributes can range from 3 to 18 inclusive; @@ -284,7 +342,7 @@ can carry. With sufficiently high strength, the contribution to carrying capacity from your constitution no longer matters. .lp Intelligence Intelligence affects your ability to cast spells and read spellbooks. -.lp Wisdom +.lp "Wisdom " Wisdom comes from your practical experience (especially when dealing with magic). It affects your magical energy. .lp Charisma @@ -302,7 +360,7 @@ How deep you are in the dungeon. You start at level one and the number increases as you go deeper into the dungeon. Some levels are special, and are identified by a name and not a number. The Amulet of Yendor is reputed to be somewhere beneath the twentieth level. -.lp "Gold " +.lp "Gold " The number of gold pieces you are openly carrying. Gold which you have concealed in containers is not counted. .lp "Hit Points" @@ -311,21 +369,23 @@ damage you can take before you die. The more you get hit in a fight, the lower they get. You can regain hit points by resting, or by using certain magical items or spells. The number in parentheses is the maximum number your hit points can reach. -.lp Power +.lp "Power " Spell points. This tells you how much mystic energy (\fImana\fP) you have available for spell casting. Again, resting will regenerate the amount available. .lp "Armor Class" A measure of how effectively your armor stops blows from unfriendly -creatures. The lower this number is, the more effective the armor; it +creatures. +The lower this number is, the more effective the armor; it is quite possible to have negative armor class. +See the \fIArmor\fP subsection of \fIObjects\fP for more information. .lp Experience Your current experience level and experience points. As you adventure, you gain experience points. At certain experience point totals, you gain an experience level. The more experienced you are, the better you fight and withstand magical attacks. Many dungeons show only your experience level here. -.lp "Time " +.lp "Time " The number of turns elapsed so far, displayed if you have the .op time option set. @@ -5174,26 +5234,31 @@ at .UR https://www.nethack.org/ . .pg .hn 2 -SPECIAL THANKS +Special Thanks .pg On behalf of the NetHack community, thank you very much once again to \fBM. Drew Streib\fP and \fBPasi Kallinen\fP for providing a public NetHack server at nethack.alt.org. Thanks to \fBKeith Simpson\fP and \fBAndy Thomson\fP for hardfought.org. Thanks to all those unnamed dungeoneers who invest their time and effort into annual -NetHack tournaments such as Junethack, The November NetHack Tournament +NetHack tournaments such as Junethack, The November NetHack Tournament, and in days past, devnull.net (gone for now, but not forgotten). +.\" .pg +.\" .ce +.\" - - - - - - - - - -\ \ \ \ \" when centered, the dashes look a little too +.\" . \" far to right, so pad them with a few spaces +.BR 1 .pg -.ce -- - - - - - - - - -\ \ \ \ \" when centered, the dashes look a little too far -. \" to the right, so pad them with a few spaces +.hn 2 +Dungeoneers .pg From time to time, some depraved individual out there in netland sends a particularly intriguing modification to help out with the game. The NetHack Development Team sometimes makes note of the names of the worst of these miscreants in this, the list of Dungeoneers: +.BR 1 . -.TS S +.TS center; c2 c2 c. .\"TABLE_START @@ -5241,6 +5306,7 @@ Irina Rempt-Drijfhout Mike Passaretti Izchak Miller Mike Stephenson .\"TABLE_END Do not delete this line. .TE +.BR 1 .pg .\"Microsoft and MS-DOS are registered trademarks of Microsoft Corporation. .\"Lattice is a trademark of Lattice, Inc. diff --git a/doc/tmac.nh b/doc/tmac.nh index 5a1bd0a607..7604f8e4c2 100644 --- a/doc/tmac.nh +++ b/doc/tmac.nh @@ -1,4 +1,4 @@ -.\" NetHack 3.6 tmac.nh $NHDT-Date: $ $NHDT-Branch: $:$NHDT-Revision: $ +.\" NetHack 3.6 tmac.nh . .\" Miscellaneous tmac.n-style macros specifically for nethack's Guidebook. .\" @@ -8,6 +8,10 @@ .\" cluttered as their number increased. It now uses the '.so' directive .\" to include this file. (tmac.n is passed to 'roff on the command line.) . +.\" Protect against being sourced twice. +.nr nH +1 +.if \n(nH>1 .nx +. .\" labeled paragraph start .\" .PS word .\" set the width for the label column @@ -85,7 +89,8 @@ . if \\n(id=0 \{\ . di \" end diversion . fi \" resume filling -. in -\\n(piu \" dedent +. ie \\n(.i<\\n(pi .in 0 +. el .in -\\n(piu \" dedent . ev \" pop environment . ne \\n(dnu \" be sure you have room . nf \" don't reprocess display @@ -118,7 +123,7 @@ .\" $1 - repeat count for amount of padding (optional; default is 1) .de BR .ie \\.$==0 .nr bR 1v -.el .nr bR (\\$1-0)v +.el .nr bR 0\\$1v \0 .sp \\n(bR .br @@ -129,4 +134,9 @@ \\$1\\$2 .. . +.\" groff and AT&T-descended troffs use different hyphenation patterns. +.\" Don't hyphenate the last word on a page or column, or +.\" before/after last/first 2 characters of a word. +.ie \n(.g .hy 12 +.el .hy 14 .\"tmac.nh/" diff --git a/sys/unix/Makefile.doc b/sys/unix/Makefile.doc index 6fccfd0792..de0fa59807 100644 --- a/sys/unix/Makefile.doc +++ b/sys/unix/Makefile.doc @@ -11,6 +11,9 @@ NHSROOT=.. MAKEDEFS = ../util/makedefs +#STRIPBS= +STRIPBS = ../util/stripbs + # Which version do we want to build? (XXX These are not used anywhere.) GUIDEBOOK = Guidebook # regular ASCII file #GUIDEBOOK = Guidebook.ps # PostScript file @@ -19,22 +22,25 @@ GUIDEBOOK = Guidebook # regular ASCII file # Some versions of col need -x to keep them from converting spaces to tabs; # some versions of col don't do the conversion by default and don't # recognize the option. Sigh. -COLCMD = col -bx -#COLCMD = col -b +#COLCMD ?= col -bx +#COLCMD ?= col -b +COLCMD ?= $(STRIPBS) # The command to use to generate a PostScript file # PSCMD = ditroff | psdit PSCMD = groff -# Use the "cat" GUIDECMD if nroff and/or tbl and/or col are not installed +#NROFF_SWITCHES = -c -tascii +NROFF_SWITCHES = -c -Tascii -wall -Wtab -Wrange -Wel -Wscale + # Not appropriate for creating Guidebook.txt. # GUIDECMD = cat Guidebook.txt # # Single page. Might need adjustment to .pl value # GUIDECMD= $(GUIDE_PREFORMAT) | perl -pe 's/^(.mt)$$/.pl 4720v\n.in 0\n.po 8\n.ll 64m\n$$1/' | nroff -c -Tascii | $(COLCMD) # -GUIDECMD = $(GUIDE_PREFORMAT) | nroff -c -Tascii | $(COLCMD) -ONEPAGECMD = $(ONEPAGE_PREFORMAT) | nroff -c -Tascii | $(COLCMD) \ +GUIDECMD = $(GUIDE_PREFORMAT) | nroff $(NROFF_SWITCHES) | $(COLCMD) +ONEPAGECMD = $(ONEPAGE_PREFORMAT) | nroff $(NROFF_SWITCHES) | $(COLCMD) \ | sed -e '/EOF--EOF/,12345D' # Only generate output for the current configuration: @@ -50,8 +56,8 @@ ONEPAGE_PREFORMAT = cat Gbk-1pg-pfx.mn Guidebook.mn Gbk-1pg-sfx.mn \ | $(NHGREP) | tbl tmac.n - # the basic guidebook -Guidebook: Guidebook.mn tmac.n tmac.nh - $(GUIDECMD) > Guidebook +Guidebook: Guidebook.mn tmac.n tmac.nh $(MAKEDEFS) $(STRIPBS) + -$(GUIDECMD) > Guidebook # Fancier output for those with ditroff, psdit and a PostScript printer. Guidebook.ps: Guidebook.mn tmac.n tmac.nh @@ -65,6 +71,10 @@ Guidebook.dvi: Guidebook.tex latex Guidebook.tex latex Guidebook.tex +../util/makedefs: + ( cd .. ; $(MAKE) makedefs ) +../util/stripbs: + ( cd .. ; $(MAKE) stripbs ) GAME = nethack MANDIR = /usr/man/man6 diff --git a/sys/unix/Makefile.top b/sys/unix/Makefile.top index ad7607cd98..795bb659b3 100644 --- a/sys/unix/Makefile.top +++ b/sys/unix/Makefile.top @@ -236,6 +236,11 @@ dofiles-nodlb: -( cd $(INSTDIR) ; $(CHOWN) $(GAMEUID) $(DAT) ; \ $(CHGRP) $(GAMEGRP) $(DAT) ; \ chmod $(FILEPERM) $(DAT) ) +makedefs: + ( cd util ; $(MAKE) makedefs ) + +stripbs: + ( cd util ; $(MAKE) stripbs ) update: $(GAME) recover $(VARDAT) dungeon spec_levs # (don't yank the old version out from under people who're playing it) diff --git a/sys/unix/Makefile.utl b/sys/unix/Makefile.utl index 78e9d725f5..d955f7ac04 100644 --- a/sys/unix/Makefile.utl +++ b/sys/unix/Makefile.utl @@ -357,6 +357,15 @@ dlb: $(DLBOBJS) dlb_main.o: dlb_main.c $(CONFIG_H) ../include/dlb.h ../include/date.h $(CC) $(CFLAGS) -c dlb_main.c +# dependencies for stripbs, an alternative filter utility to +# strip "character + backspace + character" out of the generated +# Guidebook, leaving only "character" in the final result. +# +stripbs: stripbs.o + $(CC) $(LFLAGS) -o stripbs stripbs.o + +stripbs.o: stripbs.c + $(CC) $(CFLAGS) -c stripbs.c # dependencies for tile utilities diff --git a/util/.gitignore b/util/.gitignore index 28c0b29335..b5d096b0d0 100644 --- a/util/.gitignore +++ b/util/.gitignore @@ -11,6 +11,7 @@ lev_comp dlb dlb_main recover +stripbs tilemap tileedit tile2x11 diff --git a/util/stripbs.c b/util/stripbs.c new file mode 100644 index 0000000000..7141030e7e --- /dev/null +++ b/util/stripbs.c @@ -0,0 +1,42 @@ +/* NetHack 3.6 stripbs.c */ +/* Copyright (c) Michael Allison, 2025. */ +/* NetHack may be freely redistributed. See license for details. */ + +/* + * a simple filter to strip character-backspace-character + * from stdin and write the results to stdout. + */ + +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + int stop = 0, trouble = 0; + char buf[2]; + char *cp = &buf[0], *prev = &buf[1]; + + *prev = 0; + while (!stop) { + if ((fread(buf, 1, 1, stdin)) > 0) { + if (*cp == 8) { + *prev = 0; + } else { + if (*prev) + fputc(*prev, stdout); + *prev = *cp; + } + } else { + if (errno != EOF) + trouble = 1; + if (*prev) + fputc(*prev, stdout); + stop = 1; + } + } + fflush(stdout); + fclose(stdout); + return trouble ? EXIT_FAILURE : EXIT_SUCCESS; +} From 1062e39de611be175e59c9b9f74ea57d0fbc1bf1 Mon Sep 17 00:00:00 2001 From: nhw_cron Date: Mon, 10 Mar 2025 16:24:08 -0400 Subject: [PATCH 53/66] This is cron-daily v1-Apr-1-2024. 000files updated: Files --- Files | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Files b/Files index e315d58c9d..26e96b81b6 100644 --- a/Files +++ b/Files @@ -291,7 +291,7 @@ winnt.c winos.h util: (files for all versions) dgn_main.c dlb_main.c lev_main.c makedefs.c mdgrep.h mdgrep.pl -panic.c recover.c +panic.c recover.c stripbs.c (lex/yacc input for special level and dungeon compilers) dgn_comp.l dgn_comp.y lev_comp.l lev_comp.y From 795e264a5e730b99234f3b40eb815aae40b1a5c0 Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 10 Mar 2025 17:24:23 -0400 Subject: [PATCH 54/66] cron update for Guidebook.txt --- doc/Guidebook.txt | 8352 ++++++++++++++++++++++----------------------- 1 file changed, 4176 insertions(+), 4176 deletions(-) diff --git a/doc/Guidebook.txt b/doc/Guidebook.txt index d9c5287b70..ee4b3021d2 100644 --- a/doc/Guidebook.txt +++ b/doc/Guidebook.txt @@ -8,245 +8,234 @@ - A Guide to the Mazes of Menace - (Guidebook for NetHack) + A Guide to the Mazes of Menace + (Guidebook for NetHack) - Original version - Eric S. Raymond - (Edited and expanded for 3.6 by Mike Stephenson and others) + Original version - Eric S. Raymond + (Edited and expanded for NetHack 3.6.7 by Mike Stephenson and others) - February 3, 2023 + February 3, 2023 - 1. Introduction + 1. Introduction - Recently, you have begun to find yourself unfulfilled and - distant in your daily occupation. Strange dreams of prospecting, - stealing, crusading, and combat have haunted you in your sleep - for many months, but you aren't sure of the reason. You wonder - whether you have in fact been having those dreams all your life, - and somehow managed to forget about them until now. Some nights - you awaken suddenly and cry out, terrified at the vivid recollec- - tion of the strange and powerful creatures that seem to be lurk- - ing behind every corner of the dungeon in your dream. Could - these details haunting your dreams be real? As each night pass- - es, you feel the desire to enter the mysterious caverns near the - ruins grow stronger. Each morning, however, you quickly put the - idea out of your head as you recall the tales of those who en- - tered the caverns before you and did not return. Eventually you - can resist the yearning to seek out the fantastic place in your - dreams no longer. After all, when other adventurers came back - this way after spending time in the caverns, they usually seemed - better off than when they passed through the first time. And who - was to say that all of those who did not return had not just kept - going? + Recently, you have begun to find yourself unfulfilled and distant + in your daily occupation. Strange dreams of prospecting, stealing, + crusading, and combat have haunted you in your sleep for many months, + but you aren't sure of the reason. You wonder whether you have in + fact been having those dreams all your life, and somehow managed to + forget about them until now. Some nights you awaken suddenly and cry + out, terrified at the vivid recollection of the strange and powerful + creatures that seem to be lurking behind every corner of the dungeon + in your dream. Could these details haunting your dreams be real? As + each night passes, you feel the desire to enter the mysterious caverns + near the ruins grow stronger. Each morning, however, you quickly put + the idea out of your head as you recall the tales of those who entered + the caverns before you and did not return. Eventually you can resist + the yearning to seek out the fantastic place in your dreams no longer. + After all, when other adventurers came back this way after spending + time in the caverns, they usually seemed better off than when they + passed through the first time. And who was to say that all of those + who did not return had not just kept going? - Asking around, you hear about a bauble, called the Amulet of - Yendor by some, which, if you can find it, will bring you great - wealth. One legend you were told even mentioned that the one who - finds the amulet will be granted immortality by the gods. The - amulet is rumored to be somewhere beyond the Valley of Gehennom, - deep within the Mazes of Menace. Upon hearing the legends, you - immediately realize that there is some profound and undiscovered - reason that you are to descend into the caverns and seek out that - amulet of which they spoke. Even if the rumors of the amulet's - powers are untrue, you decide that you should at least be able to - sell the tales of your adventures to the local minstrels for a - tidy sum, especially if you encounter any of the terrifying and - magical creatures of your dreams along the way. You spend one - last night fortifying yourself at the local inn, becoming more - and more depressed as you watch the odds of your success being - posted on the inn's walls getting lower and lower. + Asking around, you hear about a bauble, called the Amulet of Yen- + dor by some, which, if you can find it, will bring you great wealth. + One legend you were told even mentioned that the one who finds the + amulet will be granted immortality by the gods. The amulet is rumored + to be somewhere beyond the Valley of Gehennom, deep within the Mazes + of Menace. Upon hearing the legends, you immediately realize that + there is some profound and undiscovered reason that you are to descend + into the caverns and seek out that amulet of which they spoke. Even + if the rumors of the amulet's powers are untrue, you decide that you + should at least be able to sell the tales of your adventures to the + local minstrels for a tidy sum, especially if you encounter any of the + terrifying and magical creatures of your dreams along the way. You + spend one last night fortifying yourself at the local inn, becoming + more and more depressed as you watch the odds of your success being + posted on the inn's walls getting lower and lower. + In the morning you awake, collect your belongings, and set off + for the dungeon. After several days of uneventful travel, you see the - NetHack Guidebook 1 + NetHack Guidebook 1 - NetHack Guidebook 2 + NetHack Guidebook 2 - In the morning you awake, collect your belongings, and set - off for the dungeon. After several days of uneventful travel, - you see the ancient ruins that mark the entrance to the Mazes of - Menace. It is late at night, so you make camp at the entrance - and spend the night sleeping under the open skies. In the morn- - ing, you gather your gear, eat what may be your last meal out- - side, and enter the dungeon... - 2. What is going on here? + ancient ruins that mark the entrance to the Mazes of Menace. It is + late at night, so you make camp at the entrance and spend the night + sleeping under the open skies. In the morning, you gather your gear, + eat what may be your last meal outside, and enter the dungeon.... - You have just begun a game of NetHack. Your goal is to grab - as much treasure as you can, retrieve the Amulet of Yendor, and - escape the Mazes of Menace alive. + 2. What is going on here? - Your abilities and strengths for dealing with the hazards of - adventure will vary with your background and training: + You have just begun a game of NetHack. Your goal is to grab as + much treasure as you can, retrieve the Amulet of Yendor, and escape + the Mazes of Menace alive. - Archeologists understand dungeons pretty well; this enables - them to move quickly and sneak up on the local nasties. They - start equipped with the tools for a proper scientific expedition. + Your abilities and strengths for dealing with the hazards of + adventure will vary with your background and training: - Barbarians are warriors out of the hinterland, hardened to - battle. They begin their quests with naught but uncommon - strength, a trusty hauberk, and a great two-handed sword. + Archeologists understand dungeons pretty well; this enables them + to move quickly and sneak up on the local nasties. They start + equipped with the tools for a proper scientific expedition. - Cavemen and Cavewomen start with exceptional strength but, - unfortunately, with neolithic weapons. + Barbarians are warriors out of the hinterland, hardened to bat- + tle. They begin their quests with naught but uncommon strength, a + trusty hauberk, and a great two-handed sword. - Healers are wise in medicine and apothecary. They know the - herbs and simples that can restore vitality, ease pain, anes- - thetize, and neutralize poisons; and with their instruments, they - can divine a being's state of health or sickness. Their medical - practice earns them quite reasonable amounts of money, with which - they enter the dungeon. + Cavemen and Cavewomen start with exceptional strength but, unfor- + tunately, with neolithic weapons. - Knights are distinguished from the common skirmisher by - their devotion to the ideals of chivalry and by the surpassing - excellence of their armor. + Healers are wise in medicine and apothecary. They know the herbs + and simples that can restore vitality, ease pain, anesthetize, and + neutralize poisons; and with their instruments, they can divine a + being's state of health or sickness. Their medical practice earns + them quite reasonable amounts of money, with which they enter the dun- + geon. - Monks are ascetics, who by rigorous practice of physical and - mental disciplines have become capable of fighting as effectively - without weapons as with. They wear no armor but make up for it - with increased mobility. + Knights are distinguished from the common skirmisher by their + devotion to the ideals of chivalry and by the surpassing excellence of + their armor. - Priests and Priestesses are clerics militant, crusaders ad- - vancing the cause of righteousness with arms, armor, and arts - thaumaturgic. Their ability to commune with deities via prayer - occasionally extricates them from peril, but can also put them in - it. + Monks are ascetics, who by rigorous practice of physical and men- + tal disciplines have become capable of fighting as effectively without + weapons as with. They wear no armor but make up for it with increased + mobility. - Rangers are most at home in the woods, and some say slightly - out of place in a dungeon. They are, however, experts in archery - as well as tracking and stealthy movement. + Priests and Priestesses are clerics militant, crusaders advancing + the cause of righteousness with arms, armor, and arts thaumaturgic. + Their ability to commune with deities via prayer occasionally extri- + cates them from peril, but can also put them in it. + Rangers are most at home in the woods, and some say slightly out + of place in a dungeon. They are, however, experts in archery as well + as tracking and stealthy movement. + Rogues are agile and stealthy thieves, with knowledge of locks, + traps, and poisons. Their advantage lies in surprise, which they + employ to great advantage. - NetHack 3.6 February 3, 2023 + NetHack 3.6.7 February 3, 2023 - NetHack Guidebook 3 + NetHack Guidebook 3 - Rogues are agile and stealthy thieves, with knowledge of - locks, traps, and poisons. Their advantage lies in surprise, - which they employ to great advantage. - Samurai are the elite warriors of feudal Nippon. They are - lightly armored and quick, and wear the dai-sho, two swords of - the deadliest keenness. - Tourists start out with lots of gold (suitable for shopping - with), a credit card, lots of food, some maps, and an expensive - camera. Most monsters don't like being photographed. + Samurai are the elite warriors of feudal Nippon. They are + lightly armored and quick, and wear the dai-sho, two swords of the + deadliest keenness. - Valkyries are hardy warrior women. Their upbringing in the - harsh Northlands makes them strong, inures them to extremes of - cold, and instills in them stealth and cunning. + Tourists start out with lots of gold (suitable for shopping + with), a credit card, lots of food, some maps, and an expensive cam- + era. Most monsters don't like being photographed. - Wizards start out with a knowledge of magic, a selection of - magical items, and a particular affinity for dweomercraft. Al- - though seemingly weak and easy to overcome at first sight, an ex- - perienced Wizard is a deadly foe. + Valkyries are hardy warrior women. Their upbringing in the harsh + Northlands makes them strong, inures them to extremes of cold, and + instills in them stealth and cunning. - You may also choose the race of your character (within lim- - its; most roles have restrictions on which races are eligible for - them): + Wizards start out with a knowledge of magic, a selection of magi- + cal items, and a particular affinity for dweomercraft. Although seem- + ingly weak and easy to overcome at first sight, an experienced Wizard + is a deadly foe. - Dwarves are smaller than humans or elves, but are stocky and - solid individuals. Dwarves' most notable trait is their great - expertise in mining and metalwork. Dwarvish armor is said to be - second in quality not even to the mithril armor of the Elves. + You may also choose the race of your character (within limits; + most roles have restrictions on which races are eligible for them): - Elves are agile, quick, and perceptive; very little of what - goes on will escape an Elf. The quality of Elven craftsmanship - often gives them an advantage in arms and armor. + Dwarves are smaller than humans or elves, but are stocky and + solid individuals. Dwarves' most notable trait is their great exper- + tise in mining and metalwork. Dwarvish armor is said to be second in + quality not even to the mithril armor of the Elves. - Gnomes are smaller than but generally similar to dwarves. - Gnomes are known to be expert miners, and it is known that a se- - cret underground mine complex built by this race exists within - the Mazes of Menace, filled with both riches and danger. + Elves are agile, quick, and perceptive; very little of what goes + on will escape an Elf. The quality of Elven craftsmanship often gives + them an advantage in arms and armor. - Humans are by far the most common race of the surface world, - and are thus the norm to which other races are often compared. - Although they have no special abilities, they can succeed in any - role. + Gnomes are smaller than but generally similar to dwarves. Gnomes + are known to be expert miners, and it is known that a secret under- + ground mine complex built by this race exists within the Mazes of Men- + ace, filled with both riches and danger. - Orcs are a cruel and barbaric race that hate every living - thing (including other orcs). Above all others, Orcs hate Elves - with a passion unequalled, and will go out of their way to kill - one at any opportunity. The armor and weapons fashioned by the - Orcs are typically of inferior quality. + Humans are by far the most common race of the surface world, and + are thus the norm to which other races are often compared. Although + they have no special abilities, they can succeed in any role. - 3. What do all those things on the screen mean? + Orcs are a cruel and barbaric race that hate every living thing + (including other orcs). Above all others, Orcs hate Elves with a pas- + sion unequalled, and will go out of their way to kill one at any + opportunity. The armor and weapons fashioned by the Orcs are typi- + cally of inferior quality. - On the screen is kept a map of where you have been and what - you have seen on the current dungeon level; as you explore more + 3. What do all those things on the screen mean? + On the screen is kept a map of where you have been and what you + have seen on the current dungeon level; as you explore more of the + level, it appears on the screen in front of you. - NetHack 3.6 February 3, 2023 + When NetHack's ancestor rogue first appeared, its screen orienta- + tion was almost unique among computer fantasy games. Since then, + screen orientation has become the norm rather than the exception; + NetHack continues this fine tradition. Unlike text adventure games + NetHack 3.6.7 February 3, 2023 - NetHack Guidebook 4 + NetHack Guidebook 4 - of the level, it appears on the screen in front of you. - When NetHack's ancestor rogue first appeared, its screen - orientation was almost unique among computer fantasy games. - Since then, screen orientation has become the norm rather than - the exception; NetHack continues this fine tradition. Unlike - text adventure games that accept commands in pseudo-English sen- - tences and explain the results in words, NetHack commands are all - one or two keystrokes and the results are displayed graphically - on the screen. A minimum screen size of 24 lines by 80 columns - is recommended; if the screen is larger, only a 21x80 section - will be used for the map. - NetHack can even be played by blind players, with the assis- - tance of Braille readers or speech synthesisers. Instructions - for configuring NetHack for the blind are included later in this - document. + that accept commands in pseudo-English sentences and explain the + results in words, NetHack commands are all one or two keystrokes and + the results are displayed graphically on the screen. A minimum screen + size of 24 lines by 80 columns is recommended; if the screen is + larger, only a 21x80 section will be used for the map. - NetHack generates a new dungeon every time you play it; even - the authors still find it an entertaining and exciting game de- - spite having won several times. + NetHack can even be played by blind players, with the assistance + of Braille readers or speech synthesisers. Instructions for configur- + ing NetHack for the blind are included later in this document. - NetHack offers a variety of display options. The options - available to you will vary from port to port, depending on the - capabilities of your hardware and software, and whether various - compile-time options were enabled when your executable was creat- - ed. The three possible display options are: a monochrome charac- - ter interface, a color character interface, and a graphical in- - terface using small pictures called tiles. The two character in- - terfaces allow fonts with other characters to be substituted, but - the default assignments use standard ASCII characters to repre- - sent everything. There is no difference between the various dis- - play options with respect to game play. Because we cannot repro- - duce the tiles or colors in the Guidebook, and because it is com- - mon to all ports, we will use the default ASCII characters from - the monochrome character display when referring to things you - might see on the screen during your game. + NetHack generates a new dungeon every time you play it; even the + authors still find it an entertaining and exciting game despite having + won several times. - In order to understand what is going on in NetHack, first - you must understand what NetHack is doing with the screen. The - NetHack screen replaces the "You see ..." descriptions of text - adventure games. Figure 1 is a sample of what a NetHack screen - might look like. The way the screen looks for you depends on - your platform. + NetHack offers a variety of display options. The options avail- + able to you will vary from port to port, depending on the capabilities + of your hardware and software, and whether various compile-time + options were enabled when your executable was created. The three pos- + sible display options are: a monochrome character interface, a color + character interface, and a graphical interface using small pictures + called tiles. The two character interfaces allow fonts with other + characters to be substituted, but the default assignments use standard + ASCII characters to represent everything. There is no difference + between the various display options with respect to game play. + Because we cannot reproduce the tiles or colors in the Guidebook, and + because it is common to all ports, we will use the default ASCII char- + acters from the monochrome character display when referring to things + you might see on the screen during your game. + In order to understand what is going on in NetHack, first you + must understand what NetHack is doing with the screen. The NetHack + screen replaces the "You see ..." descriptions of text adventure + games. Figure 1 is a sample of what a NetHack screen might look like. + The way the screen looks for you depends on your platform. @@ -258,5881 +247,5892 @@ - NetHack 3.6 February 3, 2023 - NetHack Guidebook 5 - +----------------------------------------------------------------+ - |The bat bites! | - | | - | ------ | - | |....| ---------- | - | |.<..|####...@...$.| | - | |....-# |...B....+ | - | |....| |.d......| | - | ------ -------|-- | - | | - | | - | | - |Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral | - |Dlvl:1 $:0 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak | - +---------------------------Figure-1-----------------------------+ - 3.1. The status lines (bottom) - The bottom two lines of the screen contain several cryptic - pieces of information describing your current status. If either - status line becomes longer than the width of the screen, you - might not see all of it. Here are explanations of what the vari- - ous status items mean (though your configuration may not have all - the status items listed below): - Rank - Your character's name and professional ranking (based on the - experience level, see below). + NetHack 3.6.7 February 3, 2023 - Strength - A measure of your character's strength; one of your six ba- - sic attributes. A human character's attributes can range - from 3 to 18 inclusive; non-humans may exceed these limits - (occasionally you may get super-strengths of the form 18/xx, - and magic can also cause attributes to exceed the normal - limits). The higher your strength, the stronger you are. - Strength affects how successfully you perform physical - tasks, how much damage you do in combat, and how much loot - you can carry. - Dexterity - Dexterity affects your chances to hit in combat, to avoid - traps, and do other tasks requiring agility or manipulation - of objects. - Constitution - Constitution affects your ability to recover from injuries - and other strains on your stamina. When strength is low or - modest, constitution also affects how much you can carry. - With sufficiently high strength, the contribution to carry- - ing capacity from your constitution no longer matters. - Intelligence - Intelligence affects your ability to cast spells and read + NetHack Guidebook 5 - NetHack 3.6 February 3, 2023 + +---------------------------------------------------------------+ + |The bat bites! | + | | + | ------ | + | |....| ---------- | + | |.<..|####...@...$.| | + | |....-# |...B....+ | + | |....| |.d......| | + | ------ -------|-- | + | | + | | + | | + |Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral | + |Dlvl:1 $:993 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:752 Hungry Conf | + +---------------------------Figure-1----------------------------+ - NetHack Guidebook 6 - spellbooks. - Wisdom - Wisdom comes from your practical experience (especially when - dealing with magic). It affects your magical energy. - Charisma - Charisma affects how certain creatures react toward you. In - particular, it can affect the prices shopkeepers offer you. - Alignment - Lawful, Neutral, or Chaotic. Often, Lawful is taken as good - and Chaotic as evil, but legal and ethical do not always co- - incide. Your alignment influences how other monsters react - toward you. Monsters of a like alignment are more likely to - be non-aggressive, while those of an opposing alignment are - more likely to be seriously offended at your presence. - Dungeon Level - How deep you are in the dungeon. You start at level one and - the number increases as you go deeper into the dungeon. - Some levels are special, and are identified by a name and - not a number. The Amulet of Yendor is reputed to be some- - where beneath the twentieth level. - Gold - The number of gold pieces you are openly carrying. Gold - which you have concealed in containers is not counted. - Hit Points - Your current and maximum hit points. Hit points indicate - how much damage you can take before you die. The more you - get hit in a fight, the lower they get. You can regain hit - points by resting, or by using certain magical items or - spells. The number in parentheses is the maximum number - your hit points can reach. - Power - Spell points. This tells you how much mystic energy (mana) - you have available for spell casting. Again, resting will - regenerate the amount available. - Armor Class - A measure of how effectively your armor stops blows from un- - friendly creatures. The lower this number is, the more ef- - fective the armor; it is quite possible to have negative ar- - mor class. - Experience - Your current experience level and experience points. As you - adventure, you gain experience points. At certain experi- - ence point totals, you gain an experience level. The more - experienced you are, the better you fight and withstand mag- - ical attacks. Many dungeons show only your experience level - NetHack 3.6 February 3, 2023 - NetHack Guidebook 7 - here. - Time - The number of turns elapsed so far, displayed if you have - the time option set. - Status - Hunger: your current hunger status. Values are Satiated, - Not Hungry (or Normal), Hungry, Weak, and Fainting. Not - shown when Normal. - Encumbrance: an indication of how what you are carrying af- - fects your ability to move. Values are Unencumbered, Encum- - bered, Stressed, Strained, Overtaxed, and Overloaded. Not - shown when Unencumbered. - Fatal conditions: Stone (aka Petrifying, turning to stone), - Slime (turning into green slime), Strngl (being strangled), - FoodPois (suffering from acute food poisoning), TermIll - (suffering from a terminal illness). - Non-fatal conditions: Blind (can't see), Deaf (can't hear), - Stun (stunned), Conf (confused), Hallu (hallucinating). - Movement modifiers: Lev (levitating), Fly (flying), Ride - (riding). - Other conditions and modifiers exist, but there isn't enough - room to display them with the other status fields. The `^X' - command shows all relevant status conditions. - 3.2. The message line (top) - The top line of the screen is reserved for messages that de- - scribe things that are impossible to represent visually. If you - see a "--More--" on the top line, this means that NetHack has an- - other message to display on the screen, but it wants to make cer- - tain that you've read the one that is there first. To read the - next message, just press the space bar. - To change how and what messages are shown on the message - line, see "Configuring Message Types" and the verbose option. - 3.3. The map (rest of the screen) - The rest of the screen is the map of the level as you have - explored it so far. Each symbol on the screen represents some- - thing. You can set various graphics options to change some of - the symbols the game uses; otherwise, the game will use default - symbols. Here is a list of what the default symbols mean: - - and | - The walls of a room, or an open door. Or a grave (|). - NetHack 3.6 February 3, 2023 + NetHack 3.6.7 February 3, 2023 - NetHack Guidebook 8 + NetHack Guidebook 6 - . The floor of a room, ice, or a doorless doorway. + +---------------------------------------------------------------+ + |Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 | + |Neutral $:993 HP:9(12) Pw:3(3) AC:10 Exp:1/19 Hungry | + |Dlvl:1 T:752 Conf | + +---------------------------Figure-2----------------------------+ - # A corridor, or iron bars, or a tree, or possibly a kitchen - sink (if your dungeon has sinks), or a drawbridge. + 3.1. The status lines (bottom) - > Stairs down: a way to the next level. + The bottom two lines of the screen contain several cryptic pieces + of information describing your current status. If either status line + becomes longer than the width of the screen, you might not see all of + it. Here are explanations of what the various status items mean + (though your configuration may not have all the status items listed + below): - < Stairs up: a way to the previous level. + Rank + Your character's name and professional ranking (based on the + experience level, see below). - + A closed door, or a spellbook containing a spell you may be - able to learn. + Here are explanations of what the various status items mean: - @ Your character or a human. + Title + Your character's name and professional ranking (based on role and + experience level, see below). - $ A pile of gold. + Strength + A measure of your character's strength; one of your six basic + attributes. A human character's attributes can range from 3 to + 18 inclusive; non-humans may exceed these limits (occasionally + you may get super-strengths of the form 18/xx, and magic can also + cause attributes to exceed the normal limits). The higher your + strength, the stronger you are. Strength affects how success- + fully you perform physical tasks, how much damage you do in com- + bat, and how much loot you can carry. - ^ A trap (once you have detected it). + Dexterity + Dexterity affects your chances to hit in combat, to avoid traps, + and do other tasks requiring agility or manipulation of objects. - ) A weapon. + Constitution + Constitution affects your ability to recover from injuries and + other strains on your stamina. When strength is low or modest, + constitution also affects how much you can carry. With suffi- + ciently high strength, the contribution to carrying capacity from + your constitution no longer matters. - [ A suit or piece of armor. + Intelligence + Intelligence affects your ability to cast spells and read spell- + books. - % Something edible (not necessarily healthy). + Wisdom + Wisdom comes from your practical experience (especially when + dealing with magic). It affects your magical energy. - ? A scroll. - / A wand. - = A ring. + NetHack 3.6.7 February 3, 2023 - ! A potion. - ( A useful item (pick-axe, key, lamp...). - " An amulet or a spider web. - * A gem or rock (possibly valuable, possibly worthless). - ` A boulder or statue. + NetHack Guidebook 7 - 0 An iron ball. - _ An altar, or an iron chain. - { A fountain. + Charisma + Charisma affects how certain creatures react toward you. In par- + ticular, it can affect the prices shopkeepers offer you. - } A pool of water or moat or a pool of lava. + Alignment + Lawful, Neutral, or Chaotic. Often, Lawful is taken as good and + Chaotic as evil, but legal and ethical do not always coincide. + Your alignment influences how other monsters react toward you. + Monsters of a like alignment are more likely to be non-aggres- + sive, while those of an opposing alignment are more likely to be + seriously offended at your presence. - \ An opulent throne. + Dungeon Level + How deep you are in the dungeon. You start at level one and the + number increases as you go deeper into the dungeon. Some levels + are special, and are identified by a name and not a number. The + Amulet of Yendor is reputed to be somewhere beneath the twentieth + level. - a-zA-Z and other symbols - Letters and certain other symbols represent the various in- - habitants of the Mazes of Menace. Watch out, they can be - nasty and vicious. Sometimes, however, they can be helpful. + Gold + The number of gold pieces you are openly carrying. Gold which + you have concealed in containers is not counted. + Hit Points + Your current and maximum hit points. Hit points indicate how + much damage you can take before you die. The more you get hit in + a fight, the lower they get. You can regain hit points by rest- + ing, or by using certain magical items or spells. The number in + parentheses is the maximum number your hit points can reach. - NetHack 3.6 February 3, 2023 + Power + Spell points. This tells you how much mystic energy (mana) you + have available for spell casting. Again, resting will regenerate + the amount available. + Armor Class + A measure of how effectively your armor stops blows from + unfriendly creatures. The lower this number is, the more effec- + tive the armor; it is quite possible to have negative armor + class. See the Armor subsection of Objects for more information. + Experience + Your current experience level and experience points. As you + adventure, you gain experience points. At certain experience + point totals, you gain an experience level. The more experienced + you are, the better you fight and withstand magical attacks. + Many dungeons show only your experience level here. + Time + The number of turns elapsed so far, displayed if you have the + time option set. + Status + Hunger: your current hunger status. Values are Satiated, Not - NetHack Guidebook 9 + NetHack 3.6.7 February 3, 2023 - I This marks the last known location of an invisible or other- - wise unseen monster. Note that the monster could have - moved. The `F' and `m' commands may be useful here. - You need not memorize all these symbols; you can ask the - game what any symbol represents with the `/' command (see the - next section for more info). - 4. Commands - Commands can be initiated by typing one or two characters to - which the command is bound to, or typing the command name in the - extended commands entry. Some commands, like "search", do not - require that any more information be collected by NetHack. Other - commands might require additional information, for example a di- - rection, or an object to be used. For those commands that re- - quire additional information, NetHack will present you with ei- - ther a menu of choices or with a command line prompt requesting - information. Which you are presented with will depend chiefly on - how you have set the menustyle option. + NetHack Guidebook 8 - For example, a common question, in the form "What do you - want to use? [a-zA-Z ?*]", asks you to choose an object you are - carrying. Here, "a-zA-Z" are the inventory letters of your pos- - sible choices. Typing `?' gives you an inventory list of these - items, so you can see what each letter refers to. In this exam- - ple, there is also a `*' indicating that you may choose an object - not on the list, if you wanted to use something unexpected. Typ- - ing a `*' lists your entire inventory, so you can see the inven- - tory letters of every object you're carrying. Finally, if you - change your mind and decide you don't want to do this command af- - ter all, you can press the ESC key to abort the command. - You can put a number before some commands to repeat them - that many times; for example, "10s" will search ten times. If - you have the number_pad option set, you must type `n' to prefix a - count, so the example above would be typed "n10s" instead. Com- - mands for which counts make no sense ignore them. In addition, - movement commands can be prefixed for greater control (see be- - low). To cancel a count or a prefix, press the ESC key. - The list of commands is rather long, but it can be read at - any time during the game through the `?' command, which accesses - a menu of helpful texts. Here are the default key bindings for - your reference: + Hungry (or Normal), Hungry, Weak, and Fainting. Not shown when + Normal. - ? Help menu: display one of several help texts available. + Encumbrance: an indication of how what you are carrying affects + your ability to move. Values are Unencumbered, Encumbered, + Stressed, Strained, Overtaxed, and Overloaded. Not shown when + Unencumbered. - / The "whatis" command, to tell what a symbol represents. You - may choose to specify a location or type a symbol (or even a - whole word) to explain. Specifying a location is done by - moving the cursor to a particular spot on the map and then - pressing one of `.', `,', `;', or `:'. `.' will explain the - symbol at the chosen location, conditionally check for "More + Fatal conditions: Stone (aka Petrifying, turning to stone), Slime + (turning into green slime), Strngl (being strangled), FoodPois + (suffering from acute food poisoning), TermIll (suffering from a + terminal illness). + Non-fatal conditions: Blind (can't see), Deaf (can't hear), Stun + (stunned), Conf (confused), Hallu (hallucinating). - NetHack 3.6 February 3, 2023 + Movement modifiers: Lev (levitating), Fly (flying), Ride (rid- + ing). + Other conditions and modifiers exist, but there isn't enough room + to display them with the other status fields. The `^X' command + shows all relevant status conditions. + 3.2. The message line (top) + The top line of the screen is reserved for messages that describe + things that are impossible to represent visually. If you see a + "--More--" on the top line, this means that NetHack has another mes- + sage to display on the screen, but it wants to make certain that + you've read the one that is there first. To read the next message, + just press the space bar. + To change how and what messages are shown on the message line, + see "Configuring Message Types" and the verbose option. - NetHack Guidebook 10 + 3.3. The map (rest of the screen) + The rest of the screen is the map of the level as you have + explored it so far. Each symbol on the screen represents something. + You can set various graphics options to change some of the symbols the + game uses; otherwise, the game will use default symbols. Here is a + list of what the default symbols mean: + - and | + The walls of a room, or an open door. Or a grave (|). - info?" depending upon whether the help option is on, and - then you will be asked to pick another location; `,' will - explain the symbol but skip any additional information, then - let you pick another location; `;' will skip additional info - and also not bother asking you to choose another location to - examine; `:' will show additional info, if any, without ask- - ing for confirmation. When picking a location, pressing the - ESC key will terminate this command, or pressing `?' will - give a brief reminder about how it works. + . The floor of a room, ice, or a doorless doorway. - If the autodescribe option is on, a short description of - what you see at each location is shown as you move the cur- - sor. Typing `#' while picking a location will toggle that - option on or off. The whatis_coord option controls whether - the short description includes map coordinates. + # A corridor, or iron bars, or a tree, or possibly a kitchen sink + (if your dungeon has sinks), or a drawbridge. - Specifying a name rather than a location always gives any - additional information available about that name. + > Stairs down: a way to the next level. - You may also request a description of nearby monsters, all - monsters currently displayed, nearby objects, or all ob- - jects. The whatis_coord option controls which format of map - coordinate is included with their descriptions. - & Tell what a command does. - < Go up to the previous level (if you are on a staircase or - ladder). - > Go down to the next level (if you are on a staircase or lad- - der). + NetHack 3.6.7 February 3, 2023 - [yuhjklbn] - Go one step in the direction indicated (see Figure 2). If - you sense or remember a monster there, you will fight the - monster instead. Only these one-step movement commands - cause you to fight monsters; the others (below) are "safe." - y k u 7 8 9 - \ | / \ | / - h- . -l 4- . -6 - / | \ / | \ - b j n 1 2 3 - (if number_pad is set) - Figure 2 - [YUHJKLBN] - Go in that direction until you hit a wall or run into some- - thing. - m[yuhjklbn] - Prefix: move without picking up objects or fighting (even - if you remember a monster there). + NetHack Guidebook 9 - NetHack 3.6 February 3, 2023 + < Stairs up: a way to the previous level. + + A closed door, or a spellbook containing a spell you may be able + to learn. + @ Your character or a human. + $ A pile of gold. - NetHack Guidebook 11 + ^ A trap (once you have detected it). + ) A weapon. + [ A suit or piece of armor. - A few non-movement commands use the `m' prefix to request - operating via menu (to temporarily override the - menustyle:Traditional option). Primarily useful for `,' - (pickup) when there is only one class of objects present - (where there won't be any "what kinds of objects?" prompt, - so no opportunity to answer `m' at that prompt). + % Something edible (not necessarily healthy). - A few other commands (eat food, offer sacrifice, apply tin- - ning-kit) use the `m' prefix to skip checking for applicable - objects on the floor and go straight to checking inventory, - or (for "#loot" to remove a saddle), skip containers and go - straight to adjacent monsters. The prefix will make "#trav- - el" command show a menu of interesting targets in sight. In - debug mode (aka "wizard mode"), the `m' prefix may also be - used with the "#teleport" and "#wizlevelport" commands. + ? A scroll. - F[yuhjklbn] - Prefix: fight a monster (even if you only guess one is - there). + / A wand. - M[yuhjklbn] - Prefix: move far, no pickup. + = A ring. - g[yuhjklbn] - Prefix: move until something interesting is found. + ! A potion. - G[yuhjklbn] or [yuhjklbn] - Prefix: same as `g', but forking of corridors is not con- - sidered interesting. + ( A useful item (pick-axe, key, lamp...). - _ Travel to a map location via a shortest-path algorithm. + " An amulet or a spider web. - The shortest path is computed over map locations the hero - knows about (e.g. seen or previously traversed). If there - is no known path, a guess is made instead. Stops on most of - the same conditions as the `G' command, but without picking - up objects, similar to the `M' command. For ports with - mouse support, the command is also invoked when a mouse- - click takes place on a location other than the current posi- - tion. + * A gem or rock (possibly valuable, possibly worthless). - . Wait or rest, do nothing for one turn. + ` A boulder or statue. - a Apply (use) a tool (pick-axe, key, lamp...). + 0 An iron ball. - If used on a wand, that wand will be broken, releasing its - magic in the process. Confirmation is required. + _ An altar, or an iron chain. - A Remove one or more worn items, such as armor. + { A fountain. - Use `T' (take off) to take off only one piece of armor or - `R' (remove) to take off only one accessory. + } A pool of water or moat or a pool of lava. + \ An opulent throne. + a-zA-Z and other symbols + Letters and certain other symbols represent the various inhabi- + tants of the Mazes of Menace. Watch out, they can be nasty and + vicious. Sometimes, however, they can be helpful. + I This marks the last known location of an invisible or otherwise + unseen monster. Note that the monster could have moved. The `F' + and `m' commands may be useful here. - NetHack 3.6 February 3, 2023 + You need not memorize all these symbols; you can ask the game + what any symbol represents with the `/' command (see the next section + NetHack 3.6.7 February 3, 2023 - NetHack Guidebook 12 + NetHack Guidebook 10 - ^A Redo the previous command. - c Close a door. - C Call (name) a monster, an individual object, or a type of - object. + for more info). - Same as extended command "#name". + 4. Commands - ^C Panic button. Quit the game. + Commands can be initiated by typing one or two characters to + which the command is bound to, or typing the command name in the + extended commands entry. Some commands, like "search", do not require + that any more information be collected by NetHack. Other commands + might require additional information, for example a direction, or an + object to be used. For those commands that require additional infor- + mation, NetHack will present you with either a menu of choices or with + a command line prompt requesting information. Which you are presented + with will depend chiefly on how you have set the menustyle option. - d Drop something. + For example, a common question, in the form "What do you want to + use? [a-zA-Z ?*]", asks you to choose an object you are carrying. + Here, "a-zA-Z" are the inventory letters of your possible choices. + Typing `?' gives you an inventory list of these items, so you can see + what each letter refers to. In this example, there is also a `*' + indicating that you may choose an object not on the list, if you + wanted to use something unexpected. Typing a `*' lists your entire + inventory, so you can see the inventory letters of every object you're + carrying. Finally, if you change your mind and decide you don't want + to do this command after all, you can press the ESC key to abort the + command. - For example "d7a" means drop seven items of object a. + You can put a number before some commands to repeat them that + many times; for example, "10s" will search ten times. If you have the + number_pad option set, you must type `n' to prefix a count, so the + example above would be typed "n10s" instead. Commands for which + counts make no sense ignore them. In addition, movement commands can + be prefixed for greater control (see below). To cancel a count or a + prefix, press the ESC key. - D Drop several things. + The list of commands is rather long, but it can be read at any + time during the game through the `?' command, which accesses a menu of + helpful texts. Here are the default key bindings for your reference: - In answer to the question + ? Help menu: display one of several help texts available. - "What kinds of things do you want to drop? [!%= BUCXaium]" + / The "whatis" command, to tell what a symbol represents. You may + choose to specify a location or type a symbol (or even a whole + word) to explain. Specifying a location is done by moving the + cursor to a particular spot on the map and then pressing one of + `.', `,', `;', or `:'. `.' will explain the symbol at the chosen + location, conditionally check for "More info?" depending upon + whether the help option is on, and then you will be asked to pick + another location; `,' will explain the symbol but skip any addi- + tional information, then let you pick another location; `;' will + skip additional info and also not bother asking you to choose + another location to examine; `:' will show additional info, if + any, without asking for confirmation. When picking a location, + pressing the ESC key will terminate this command, or pressing `?' + will give a brief reminder about how it works. - you should type zero or more object symbols possibly fol- - lowed by `a' and/or `i' and/or `u' and/or `m'. In addition, - one or more of the blessed/uncursed/cursed groups may be - typed. - DB - drop all objects known to be blessed. - DU - drop all objects known to be uncursed. - DC - drop all objects known to be cursed. - DX - drop all objects of unknown B/U/C status. - Da - drop all objects, without asking for confirmation. - Di - examine your inventory before dropping anything. - Du - drop only unpaid objects (when in a shop). - Dm - use a menu to pick which object(s) to drop. - D%u - drop only unpaid food. + NetHack 3.6.7 February 3, 2023 - The last example shows a combination. There are three cate- - gories of object filtering: class (`!' for potions, `?' for - scrolls, and so on), shop status (`u' for unpaid, in other - words, owned by the shop), and bless/curse state (`B', `U', - `C', and `X' as shown above). If you specify more than one - value in a category (such as "!?" for potions and scrolls or - "BU" for blessed and uncursed), an inventory object will - meet the criteria if it matches any of the specified values - (so "!?" means `!' or `?'). If you specify more than one - category, an inventory object must meet each of the category - criteria (so "%u" means class `%' and unpaid `u'). Lastly, - you may specify multiple values within multiple categories: - "!?BU" will select all potions and scrolls which are known - to be blessed or uncursed. (In versions prior to 3.6, fil- - ter combinations behaved differently.) - ^D Kick something (usually a door). - NetHack 3.6 February 3, 2023 + NetHack Guidebook 11 + If the autodescribe option is on, a short description of what you + see at each location is shown as you move the cursor. Typing `#' + while picking a location will toggle that option on or off. The + whatis_coord option controls whether the short description + includes map coordinates. + Specifying a name rather than a location always gives any addi- + tional information available about that name. - NetHack Guidebook 13 + You may also request a description of nearby monsters, all mon- + sters currently displayed, nearby objects, or all objects. The + whatis_coord option controls which format of map coordinate is + included with their descriptions. + & Tell what a command does. + < Go up to the previous level (if you are on a staircase or lad- + der). - e Eat food. + > Go down to the next level (if you are on a staircase or ladder). - Normally checks for edible item(s) on the floor, then if - none are found or none are chosen, checks for edible item(s) - in inventory. Precede `e' with the `m' prefix to bypass at- - tempting to eat anything off the floor. + [yuhjklbn] + Go one step in the direction indicated (see Figure 2). If you + sense or remember a monster there, you will fight the monster + instead. Only these one-step movement commands cause you to + fight monsters; the others (below) are "safe." - If you attempt to eat while already satiated, you might - choke to death. If you risk it, you will be asked whether - to "continue eating?" if you survive the first bite. You - can set the paranoid_confirmation:eating option to require a - response of yes instead of just y. + y k u 7 8 9 + \ | / \ | / + h- . -l 4- . -6 + / | \ / | \ + b j n 1 2 3 + (if number_pad is set) - E Engrave a message on the floor. + Figure 2 - E- - write in the dust with your fingers. + [YUHJKLBN] + Go in that direction until you hit a wall or run into something. - Engraving the word "Elbereth" will cause most monsters to - not attack you hand-to-hand (but if you attack, you will rub - it out); this is often useful to give yourself a breather. + m[yuhjklbn] + Prefix: move without picking up objects or fighting (even if you + remember a monster there). - f Fire (shoot or throw) one of the objects placed in your - quiver (or quiver sack, or that you have at the ready). You - may select ammunition with a previous `Q' command, or let - the computer pick something appropriate if autoquiver is - true. + A few non-movement commands use the `m' prefix to request operat- + ing via menu (to temporarily override the menustyle:Traditional + option). Primarily useful for `,' (pickup) when there is only + one class of objects present (where there won't be any "what + kinds of objects?" prompt, so no opportunity to answer `m' at + that prompt). - See also `t' (throw) for more general throwing and shooting. + A few other commands (eat food, offer sacrifice, apply tinning- + kit) use the `m' prefix to skip checking for applicable objects + on the floor and go straight to checking inventory, or (for + "#loot" to remove a saddle), skip containers and go straight to - i List your inventory (everything you're carrying). - I List selected parts of your inventory, usually be specifying - the character for a particular set of objects, like `[' for - armor or `!' for potions. + NetHack 3.6.7 February 3, 2023 - I* - list all gems in inventory; - Iu - list all unpaid items; - Ix - list all used up items that are on your shopping bill; - IB - list all items known to be blessed; - IU - list all items known to be uncursed; - IC - list all items known to be cursed; - IX - list all items whose bless/curse status is unknown; - I$ - count your money. - o Open a door. - O Set options. - A menu showing the current option values will be displayed. - You can change most values simply by selecting the menu en- - try for the given option (ie, by typing its letter or click- - ing upon it, depending on your user interface). For the - non-boolean choices, a further menu or prompt will appear - once you've closed this menu. The available options are + NetHack Guidebook 12 - NetHack 3.6 February 3, 2023 + adjacent monsters. The prefix will make "#travel" command show a + menu of interesting targets in sight. In debug mode (aka "wizard + mode"), the `m' prefix may also be used with the "#teleport" and + "#wizlevelport" commands. + F[yuhjklbn] + Prefix: fight a monster (even if you only guess one is there). + M[yuhjklbn] + Prefix: move far, no pickup. - NetHack Guidebook 14 + g[yuhjklbn] + Prefix: move until something interesting is found. + G[yuhjklbn] or [yuhjklbn] + Prefix: same as `g', but forking of corridors is not considered + interesting. + _ Travel to a map location via a shortest-path algorithm. - listed later in this Guidebook. Options are usually set be- - fore the game rather than with the `O' command; see the sec- - tion on options below. + The shortest path is computed over map locations the hero knows + about (e.g. seen or previously traversed). If there is no known + path, a guess is made instead. Stops on most of the same condi- + tions as the `G' command, but without picking up objects, similar + to the `M' command. For ports with mouse support, the command is + also invoked when a mouse-click takes place on a location other + than the current position. - ^O Show overview. + . Wait or rest, do nothing for one turn. - Shortcut for "#overview": list interesting dungeon levels - visited. + a Apply (use) a tool (pick-axe, key, lamp...). - (Prior to 3.6.0, `^O' was a debug mode command which listed - the placement of all special levels. Use "#wizwhere" to run - that command.) + If used on a wand, that wand will be broken, releasing its magic + in the process. Confirmation is required. - p Pay your shopping bill. + A Remove one or more worn items, such as armor. - P Put on an accessory (ring, amulet, or blindfold). + Use `T' (take off) to take off only one piece of armor or `R' + (remove) to take off only one accessory. - This command may also be used to wear armor. The prompt for - which inventory item to use will only list accessories, but - choosing an unlisted item of armor will attempt to wear it. - (See the `W' command below. It lists armor as the inventory - choices but will accept an accessory and attempt to put that - on.) + ^A Redo the previous command. - ^P Repeat previous message. + c Close a door. - Subsequent `^P's repeat earlier messages. For some inter- - faces, the behavior can be varied via the msg_window option. + C Call (name) a monster, an individual object, or a type of object. - q Quaff (drink) something (potion, water, etc). + Same as extended command "#name". - Q Select an object for your quiver, quiver sack, or just gen- - erally at the ready (only one of these is available at a - time). You can then throw this (or one of these) using the - `f' command. + ^C Panic button. Quit the game. - (In versions prior to 3.3 this was the command to quit the - game, which has been moved to "#quit".) + d Drop something. - r Read a scroll or spellbook. + For example "d7a" means drop seven items of object a. - R Remove a worn accessory (ring, amulet, or blindfold). - If you're wearing more than one, you'll be prompted for - which one to remove. When you're only wearing one, then by - default it will be removed without asking, but you can set - the paranoid_confirmation option to require a prompt. - This command may also be used to take off armor. The prompt - for which inventory item to remove only lists worn acces- - sories, but an item of worn armor can be chosen. (See the - `T' command below. It lists armor as the inventory choices - but will accept an accessory and attempt to remove it.) + NetHack 3.6.7 February 3, 2023 - NetHack 3.6 February 3, 2023 + NetHack Guidebook 13 - NetHack Guidebook 15 + D Drop several things. + In answer to the question + "What kinds of things do you want to drop? [!%= BUCXaium]" - ^R Redraw the screen. + you should type zero or more object symbols possibly followed by + `a' and/or `i' and/or `u' and/or `m'. In addition, one or more + of the blessed/uncursed/cursed groups may be typed. - s Search for secret doors and traps around you. It usually - takes several tries to find something. + DB - drop all objects known to be blessed. + DU - drop all objects known to be uncursed. + DC - drop all objects known to be cursed. + DX - drop all objects of unknown B/U/C status. + Da - drop all objects, without asking for confirmation. + Di - examine your inventory before dropping anything. + Du - drop only unpaid objects (when in a shop). + Dm - use a menu to pick which object(s) to drop. + D%u - drop only unpaid food. - Can also be used to figure out whether there is still a mon- - ster at an adjacent "remembered, unseen monster" marker. + The last example shows a combination. There are three categories + of object filtering: class (`!' for potions, `?' for scrolls, and + so on), shop status (`u' for unpaid, in other words, owned by the + shop), and bless/curse state (`B', `U', `C', and `X' as shown + above). If you specify more than one value in a category (such + as "!?" for potions and scrolls or "BU" for blessed and + uncursed), an inventory object will meet the criteria if it + matches any of the specified values (so "!?" means `!' or `?'). + If you specify more than one category, an inventory object must + meet each of the category criteria (so "%u" means class `%' and + unpaid `u'). Lastly, you may specify multiple values within mul- + tiple categories: "!?BU" will select all potions and scrolls + which are known to be blessed or uncursed. (In versions prior to + 3.6, filter combinations behaved differently.) - S Save the game (which suspends play and exits the program). - The saved game will be restored automatically the next time - you play using the same character name. + ^D Kick something (usually a door). - In normal play, once a saved game is restored the file used - to hold the saved data is deleted. In explore mode, once - restoration is accomplished you are asked whether to keep or - delete the file. Keeping the file makes it feasible to play - for a while then quit without saving and later restore - again. + e Eat food. - There is no "save current game state and keep playing" com- - mand, not even in explore mode where saved game files can be - kept and re-used. + Normally checks for edible item(s) on the floor, then if none are + found or none are chosen, checks for edible item(s) in inventory. + Precede `e' with the `m' prefix to bypass attempting to eat any- + thing off the floor. - t Throw an object or shoot a projectile. + If you attempt to eat while already satiated, you might choke to + death. If you risk it, you will be asked whether to "continue + eating?" if you survive the first bite. You can set the para- + noid_confirmation:eating option to require a response of yes + instead of just y. - There's no separate "shoot" command. If you throw an arrow - while wielding a bow, you are shooting that arrow and any - weapon skill bonus or penalty for bow applies. If you throw - an arrow while not wielding a bow, you are throwing it by - hand and it will generally be less effective than when shot. + E Engrave a message on the floor. - See also `f' (fire) for throwing or shooting an item pre-se- - lected via the `Q' (quiver) command. + E- - write in the dust with your fingers. - T Take off armor. - If you're wearing more than one piece, you'll be prompted - for which one to take off. (Note that this treats a cloak - covering a suit and/or a shirt, or a suit covering a shirt, - as if the underlying items weren't there.) When you're only - wearing one, then by default it will be taken off without - asking, but you can set the paranoid_confirmation option to - require a prompt. - This command may also be used to remove accessories. The - prompt for which inventory item to take off only lists worn - armor, but a worn accessory can be chosen. (See the `R' - command above. It lists accessories as the inventory choic- - es but will accept an item of armor and attempt to take it - off.) + NetHack 3.6.7 February 3, 2023 - ^T Teleport, if you have the ability. - NetHack 3.6 February 3, 2023 + NetHack Guidebook 14 + Engraving the word "Elbereth" will cause most monsters to not + attack you hand-to-hand (but if you attack, you will rub it out); + this is often useful to give yourself a breather. + f Fire (shoot or throw) one of the objects placed in your quiver + (or quiver sack, or that you have at the ready). You may select + ammunition with a previous `Q' command, or let the computer pick + something appropriate if autoquiver is true. - NetHack Guidebook 16 + See also `t' (throw) for more general throwing and shooting. + i List your inventory (everything you're carrying). + I List selected parts of your inventory, usually be specifying the + character for a particular set of objects, like `[' for armor or + `!' for potions. - v Display version number. + I* - list all gems in inventory; + Iu - list all unpaid items; + Ix - list all used up items that are on your shopping bill; + IB - list all items known to be blessed; + IU - list all items known to be uncursed; + IC - list all items known to be cursed; + IX - list all items whose bless/curse status is unknown; + I$ - count your money. - V Display the game history. + o Open a door. - w Wield weapon. + O Set options. - w- - wield nothing, use your bare (or gloved) hands. + A menu showing the current option values will be displayed. You + can change most values simply by selecting the menu entry for the + given option (ie, by typing its letter or clicking upon it, + depending on your user interface). For the non-boolean choices, + a further menu or prompt will appear once you've closed this + menu. The available options are listed later in this Guidebook. + Options are usually set before the game rather than with the `O' + command; see the section on options below. - Some characters can wield two weapons at once; use the `X' - command (or the "#twoweapon" extended command) to do so. + ^O Show overview. - W Wear armor. + Shortcut for "#overview": list interesting dungeon levels vis- + ited. - This command may also be used to put on an accessory (ring, - amulet, or blindfold). The prompt for which inventory item - to use will only list armor, but choosing an unlisted acces- - sory will attempt to put it on. (See the `P' command above. - It lists accessories as the inventory choices but will ac- - cept an item of armor and attempt to wear it.) + (Prior to 3.6.0, `^O' was a debug mode command which listed the + placement of all special levels. Use "#wizwhere" to run that + command.) - x Exchange your wielded weapon with the item in your alternate - weapon slot. + p Pay your shopping bill. - The latter is used as your secondary weapon when engaging in - two-weapon combat. Note that if one of these slots is emp- - ty, the exchange still takes place. + P Put on an accessory (ring, amulet, or blindfold). - X Toggle two-weapon combat, if your character can do it. Also - available via the "#twoweapon" extended command. + This command may also be used to wear armor. The prompt for + which inventory item to use will only list accessories, but - (In versions prior to 3.6 this was the command to switch - from normal play to "explore mode", also known as "discovery - mode", which has now been moved to "#exploremode".) - ^X Display basic information about your character. + NetHack 3.6.7 February 3, 2023 - Displays name, role, race, gender (unless role name makes - that redundant, such as Caveman or Priestess), and align- - ment, along with your patron deity and his or her opposi- - tion. It also shows most of the various items of informa- - tion from the status line(s) in a less terse form, including - several additional things which don't appear in the normal - status display due to space considerations. - In normal play, that's all that `^X' displays. In explore - mode, the role and status feedback is augmented by the in- - formation provided by enlightenment magic. - z Zap a wand. - z. - to aim at yourself, use `.' for the direction. - Z Zap (cast) a spell. + NetHack Guidebook 15 - NetHack 3.6 February 3, 2023 + choosing an unlisted item of armor will attempt to wear it. (See + the `W' command below. It lists armor as the inventory choices + but will accept an accessory and attempt to put that on.) + ^P Repeat previous message. + Subsequent `^P's repeat earlier messages. For some interfaces, + the behavior can be varied via the msg_window option. + q Quaff (drink) something (potion, water, etc). + Q Select an object for your quiver, quiver sack, or just generally + at the ready (only one of these is available at a time). You can + then throw this (or one of these) using the `f' command. - NetHack Guidebook 17 + (In versions prior to 3.3 this was the command to quit the game, + which has been moved to "#quit".) + r Read a scroll or spellbook. + R Remove a worn accessory (ring, amulet, or blindfold). - Z. - to cast at yourself, use `.' for the direction. + If you're wearing more than one, you'll be prompted for which one + to remove. When you're only wearing one, then by default it will + be removed without asking, but you can set the paranoid_confirma- + tion option to require a prompt. - ^Z Suspend the game (UNIX(R) versions with job control only). + This command may also be used to take off armor. The prompt for + which inventory item to remove only lists worn accessories, but + an item of worn armor can be chosen. (See the `T' command below. + It lists armor as the inventory choices but will accept an acces- + sory and attempt to remove it.) - : Look at what is here. + ^R Redraw the screen. - ; Show what type of thing a visible symbol corresponds to. + s Search for secret doors and traps around you. It usually takes + several tries to find something. - , Pick up some things from the floor beneath you. + Can also be used to figure out whether there is still a monster + at an adjacent "remembered, unseen monster" marker. - May be preceded by `m' to force a selection menu. + S Save the game (which suspends play and exits the program). The + saved game will be restored automatically the next time you play + using the same character name. - @ Toggle the autopickup option on and off. + In normal play, once a saved game is restored the file used to + hold the saved data is deleted. In explore mode, once restora- + tion is accomplished you are asked whether to keep or delete the + file. Keeping the file makes it feasible to play for a while + then quit without saving and later restore again. - ^ Ask for the type of an adjacent trap you found earlier. + There is no "save current game state and keep playing" command, + not even in explore mode where saved game files can be kept and + re-used. - ) Tell what weapon you are wielding. - [ Tell what armor you are wearing. + NetHack 3.6.7 February 3, 2023 - = Tell what rings you are wearing. - " Tell what amulet you are wearing. - ( Tell what tools you are using. - * Tell what equipment you are using. - Combines the preceding five type-specific commands into one. + NetHack Guidebook 16 - $ Count your gold pieces. - + List the spells you know. - Using this command, you can also rearrange the order in - which your spells are listed, either by sorting the entire - list or by picking one spell from the menu then picking an- - other to swap places with it. Swapping pairs of spells - changes their casting letters, so the change lasts after the - current `+' command finishes. Sorting the whole list is - temporary. To make the most recent sort order persist be- - yond the current `+' command, choose the sort option again - and then pick "reassign casting letters". (Any spells - learned after that will be added to the end of the list - rather than be inserted into the sorted ordering.) + t Throw an object or shoot a projectile. - \ Show what types of objects have been discovered. + There's no separate "shoot" command. If you throw an arrow while + wielding a bow, you are shooting that arrow and any weapon skill + bonus or penalty for bow applies. If you throw an arrow while + not wielding a bow, you are throwing it by hand and it will gen- + erally be less effective than when shot. - ` Show discovered types for one class of objects. + See also `f' (fire) for throwing or shooting an item pre-selected + via the `Q' (quiver) command. + T Take off armor. + If you're wearing more than one piece, you'll be prompted for + which one to take off. (Note that this treats a cloak covering a + suit and/or a shirt, or a suit covering a shirt, as if the under- + lying items weren't there.) When you're only wearing one, then + by default it will be taken off without asking, but you can set + the paranoid_confirmation option to require a prompt. - __________ - (R)UNIX is a registered trademark of The Open Group. + This command may also be used to remove accessories. The prompt + for which inventory item to take off only lists worn armor, but a + worn accessory can be chosen. (See the `R' command above. It + lists accessories as the inventory choices but will accept an + item of armor and attempt to take it off.) + ^T Teleport, if you have the ability. - NetHack 3.6 February 3, 2023 + v Display version number. + V Display the game history. + w Wield weapon. + w- - wield nothing, use your bare (or gloved) hands. + Some characters can wield two weapons at once; use the `X' com- + mand (or the "#twoweapon" extended command) to do so. - NetHack Guidebook 18 + W Wear armor. + This command may also be used to put on an accessory (ring, + amulet, or blindfold). The prompt for which inventory item to + use will only list armor, but choosing an unlisted accessory will + attempt to put it on. (See the `P' command above. It lists + accessories as the inventory choices but will accept an item of + armor and attempt to wear it.) + x Exchange your wielded weapon with the item in your alternate + weapon slot. - ! Escape to a shell. + The latter is used as your secondary weapon when engaging in two- + weapon combat. Note that if one of these slots is empty, the + exchange still takes place. - # Perform an extended command. + NetHack 3.6.7 February 3, 2023 - As you can see, the authors of NetHack used up all the let- - ters, so this is a way to introduce the less frequently used com- - mands. What extended commands are available depends on what fea- - tures the game was compiled with. - #adjust - Adjust inventory letters (most useful when the fixinv option - is "on"). Autocompletes. Default key is `M-a'. - This command allows you to move an item from one particular - inventory slot to another so that it has a letter which is - more meaningful for you or that it will appear in a particu- - lar location when inventory listings are displayed. You can - move to a currently empty slot, or if the destination is oc- - cupied -- and won't merge -- the item there will swap slots - with the one being moved. "#adjust" can also be used to - split a stack of objects; when choosing the item to adjust, - enter a count prior to its letter. - Adjusting without a count used to collect all compatible - stacks when moving to the destination. That behavior has - been changed; to gather compatible stacks, "#adjust" a stack - into its own inventory slot. If it has a name assigned, - other stacks with the same name or with no name will merge - provided that all their other attributes match. If it does - not have a name, only other stacks with no name are eligi- - ble. In either case, otherwise compatible stacks with a - different name will not be merged. This contrasts with us- - ing "#adjust" to move from one slot to a different slot. In - that situation, moving (no count given) a compatible stack - will merge if either stack has a name when the other doesn't - and give that name to the result, while splitting (count - given) will ignore the source stack's name when deciding - whether to merge with the destination stack. + NetHack Guidebook 17 - #annotate - Allows you to specify one line of text to associate with the - current dungeon level. All levels with annotations are dis- - played by the "#overview" command. Autocompletes. Default - key is `M-A', and also `^N' if number_pad is on. - #apply - Apply (use) a tool such as a pick-axe, a key, or a lamp. - Default key is `a'. - If the tool used acts on items on the floor, using the `m' - prefix skips those items. + X Toggle two-weapon combat, if your character can do it. Also + available via the "#twoweapon" extended command. + (In versions prior to 3.6 this was the command to switch from + normal play to "explore mode", also known as "discovery mode", + which has now been moved to "#exploremode".) + ^X Display basic information about your character. - NetHack 3.6 February 3, 2023 + Displays name, role, race, gender (unless role name makes that + redundant, such as Caveman or Priestess), and alignment, along + with your patron deity and his or her opposition. It also shows + most of the various items of information from the status line(s) + in a less terse form, including several additional things which + don't appear in the normal status display due to space considera- + tions. + In normal play, that's all that `^X' displays. In explore mode, + the role and status feedback is augmented by the information pro- + vided by enlightenment magic. + z Zap a wand. + z. - to aim at yourself, use `.' for the direction. + Z Zap (cast) a spell. - NetHack Guidebook 19 + Z. - to cast at yourself, use `.' for the direction. + ^Z Suspend the game (UNIX(R) versions with job control only). + : Look at what is here. - If used on a wand, that wand will be broken, releasing its - magic in the process. Confirmation is required. + ; Show what type of thing a visible symbol corresponds to. - #attributes - Show your attributes. Default key is `^X'. + , Pick up some things from the floor beneath you. - #autopickup - Toggle the autopickup option on/off. Default key is `@'. + May be preceded by `m' to force a selection menu. - #call - Call (name) a monster, or an object in inventory, on the - floor, or in the discoveries list, or add an annotation for - the current level (same as "#annotate"). Default key is - `C'. + @ Toggle the autopickup option on and off. - #cast - Cast a spell. Default key is `Z'. + ^ Ask for the type of an adjacent trap you found earlier. - #chat - Talk to someone. Default key is `M-c'. + ) Tell what weapon you are wielding. - #close - Close a door. Default key is `c'. + [ Tell what armor you are wearing. - #conduct - List voluntary challenges you have maintained. Autocom- - pletes. Default key is `M-C'. + = Tell what rings you are wearing. - See the section below entitled "Conduct" for details. + " Tell what amulet you are wearing. - #dip - Dip an object into something. Autocompletes. Default key - is `M-d'. - #down - Go down a staircase. Default key is `>'. + __________ + (R)UNIX is a registered trademark of The Open Group. - #drop - Drop an item. Default key is `d'. - #droptype - Drop specific item types. Default key is `D'. + NetHack 3.6.7 February 3, 2023 - #eat - Eat something. Default key is `e'. The `m' prefix skips - eating items on the floor. - #engrave - Engrave writing on the floor. Default key is `E'. - #enhance - Advance or check weapon and spell skills. Autocompletes. - Default key is `M-e'. + NetHack Guidebook 18 - NetHack 3.6 February 3, 2023 + ( Tell what tools you are using. + * Tell what equipment you are using. + Combines the preceding five type-specific commands into one. - NetHack Guidebook 20 + $ Count your gold pieces. + + List the spells you know. + Using this command, you can also rearrange the order in which + your spells are listed, either by sorting the entire list or by + picking one spell from the menu then picking another to swap + places with it. Swapping pairs of spells changes their casting + letters, so the change lasts after the current `+' command fin- + ishes. Sorting the whole list is temporary. To make the most + recent sort order persist beyond the current `+' command, choose + the sort option again and then pick "reassign casting letters". + (Any spells learned after that will be added to the end of the + list rather than be inserted into the sorted ordering.) - #exploremode - Enter the explore mode. + \ Show what types of objects have been discovered. - Requires confirmation; default response is n (no). To real- - ly switch to explore mode, respond with y. You can set the - paranoid_confirmation:quit option to require a response of - yes instead. + ` Show discovered types for one class of objects. - #fire - Fire ammunition from quiver. Default key is `f'. + ! Escape to a shell. - #force - Force a lock. Autocompletes. Default key is `M-f'. + # Perform an extended command. - #glance - Show what type of thing a map symbol corresponds to. De- - fault key is `;'. - #help - Show the help menu. Default key is `?', and also `h' if - number_pad is on. - #herecmdmenu - Show a menu of possible actions in your current location. + As you can see, the authors of NetHack used up all the letters, + so this is a way to introduce the less frequently used commands. What + extended commands are available depends on what features the game was + compiled with. - #history - Show long version and game history. Default key is `V'. + #adjust + Adjust inventory letters (most useful when the fixinv option is + "on"). Autocompletes. Default key is `M-a'. - #inventory - Show your inventory. Default key is `i'. + This command allows you to move an item from one particular + inventory slot to another so that it has a letter which is more + meaningful for you or that it will appear in a particular loca- + tion when inventory listings are displayed. You can move to a + currently empty slot, or if the destination is occupied -- and + won't merge -- the item there will swap slots with the one being + moved. "#adjust" can also be used to split a stack of objects; + when choosing the item to adjust, enter a count prior to its let- + ter. - #inventtype - Inventory specific item types. Default key is `I'. + Adjusting without a count used to collect all compatible stacks + when moving to the destination. That behavior has been changed; + to gather compatible stacks, "#adjust" a stack into its own + inventory slot. If it has a name assigned, other stacks with the - #invoke - Invoke an object's special powers. Autocompletes. Default - key is `M-i'. - #jump - Jump to another location. Autocompletes. Default key is - `M-j', and also `j' if number_pad is on. + NetHack 3.6.7 February 3, 2023 - #kick - Kick something. Default key is `^D', and `k' if number_pad - is on. - #known - Show what object types have been discovered. Default key is - `\'. - #knownclass - Show discovered types for one class of objects. Default key - is ``'. + NetHack Guidebook 19 - NetHack 3.6 February 3, 2023 + same name or with no name will merge provided that all their + other attributes match. If it does not have a name, only other + stacks with no name are eligible. In either case, otherwise com- + patible stacks with a different name will not be merged. This + contrasts with using "#adjust" to move from one slot to a differ- + ent slot. In that situation, moving (no count given) a compati- + ble stack will merge if either stack has a name when the other + doesn't and give that name to the result, while splitting (count + given) will ignore the source stack's name when deciding whether + to merge with the destination stack. + #annotate + Allows you to specify one line of text to associate with the cur- + rent dungeon level. All levels with annotations are displayed by + the "#overview" command. Autocompletes. Default key is `M-A', + and also `^N' if number_pad is on. + #apply + Apply (use) a tool such as a pick-axe, a key, or a lamp. Default + key is `a'. - NetHack Guidebook 21 + If the tool used acts on items on the floor, using the `m' prefix + skips those items. + If used on a wand, that wand will be broken, releasing its magic + in the process. Confirmation is required. + #attributes + Show your attributes. Default key is `^X'. - #levelchange - Change your experience level. Autocompletes. Debug mode - only. + #autopickup + Toggle the autopickup option on/off. Default key is `@'. - #lightsources - Show mobile light sources. Autocompletes. Debug mode only. + #call + Call (name) a monster, or an object in inventory, on the floor, + or in the discoveries list, or add an annotation for the current + level (same as "#annotate"). Default key is `C'. - #look - Look at what is here, under you. Default key is `:'. + #cast + Cast a spell. Default key is `Z'. - #loot - Loot a box or bag on the floor beneath you, or the saddle - from a steed standing next to you. Autocompletes. Precede - with the `m' prefix to skip containers at your location and - go directly to removing a saddle. Default key is `M-l', and - also `l' if number_pad is on. + #chat + Talk to someone. Default key is `M-c'. - #monster - Use a monster's special ability (when polymorphed into mon- - ster form). Autocompletes. Default key is `M-m'. + #close + Close a door. Default key is `c'. - #name - Name a monster, an individual object, or a type of object. - Same as "#call". Autocompletes. Default keys are `N', `M- - n', and `M-N'. + #conduct + List voluntary challenges you have maintained. Autocompletes. + Default key is `M-C'. - #offer - Offer a sacrifice to the gods. Autocompletes. Default key - is `M-o'. + See the section below entitled "Conduct" for details. - You'll need to find an altar to have any chance at success. - Corpses of recently killed monsters are the fodder of - choice. - The `m' prefix skips offering any items which are on the al- - tar. - #open - Open a door. Default key is `o'. - #options - Show and change option settings. Default key is `O'. + NetHack 3.6.7 February 3, 2023 - #overview - Display information you've discovered about the dungeon. - Any visited level (unless forgotten due to amnesia) with an - annotation is included, and many things (altars, thrones, - fountains, and so on; extra stairs leading to another dun- - geon branch) trigger an automatic annotation. If dungeon - overview is chosen during end-of-game disclosure, every vis- - ited level will be included regardless of annotations. Au- - tocompletes. Default keys are `^O', and `M-O'. - NetHack 3.6 February 3, 2023 + NetHack Guidebook 20 + #dip + Dip an object into something. Autocompletes. Default key is `M- + d'. + #down + Go down a staircase. Default key is `>'. - NetHack Guidebook 22 + #drop + Drop an item. Default key is `d'. + #droptype + Drop specific item types. Default key is `D'. + #eat + Eat something. Default key is `e'. The `m' prefix skips eating + items on the floor. - #panic - Test the panic routine. Terminates the current game. Auto- - completes. Debug mode only. + #engrave + Engrave writing on the floor. Default key is `E'. - Asks for confirmation; default is n (no); continue playing. - To really panic, respond with y. You can set the para- - noid_confirmation:quit option to require a response of yes - instead. + #enhance + Advance or check weapon and spell skills. Autocompletes. + Default key is `M-e'. - #pay - Pay your shopping bill. Default key is `p'. + #exploremode + Enter the explore mode. - #pickup - Pick up things at the current location. Default key is `,'. - The `m' prefix forces use of a menu. + Requires confirmation; default response is n (no). To really + switch to explore mode, respond with y. You can set the para- + noid_confirmation:quit option to require a response of yes + instead. - #polyself - Polymorph self. Autocompletes. Debug mode only. + #fire + Fire ammunition from quiver. Default key is `f'. - #pray - Pray to the gods for help. Autocompletes. Default key is - `M-p'. + #force + Force a lock. Autocompletes. Default key is `M-f'. - Praying too soon after receiving prior help is a bad idea. - (Hint: entering the dungeon alive is treated as having re- - ceived help. You probably shouldn't start off a new game by - praying right away.) Since using this command by accident - can cause trouble, there is an option to make you confirm - your intent before praying. It is enabled by default, and - you can reset the paranoid_confirmation option to disable - it. + #glance + Show what type of thing a map symbol corresponds to. Default key + is `;'. - #prevmsg - Show previously displayed game messages. Default key is - `^P'. + #help + Show the help menu. Default key is `?', and also `h' if num- + ber_pad is on. - #puton - Put on an accessory (ring, amulet, etc). Default key is - `P'. + #herecmdmenu + Show a menu of possible actions in your current location. - #quaff - Quaff (drink) something. Default key is `q'. + #history + Show long version and game history. Default key is `V'. - #quit - Quit the program without saving your game. Autocompletes. - Default key is `M-q'. + #inventory + Show your inventory. Default key is `i'. - Since using this command by accident would throw away the - current game, you are asked to confirm your intent before - quitting. Default response is n (no); continue playing. To - really quit, respond with y. You can set the paranoid_con- - firmation:quit option to require a response of yes instead. + NetHack 3.6.7 February 3, 2023 - NetHack 3.6 February 3, 2023 + NetHack Guidebook 21 - NetHack Guidebook 23 + #inventtype + Inventory specific item types. Default key is `I'. + #invoke + Invoke an object's special powers. Autocompletes. Default key + is `M-i'. + #jump + Jump to another location. Autocompletes. Default key is `M-j', + and also `j' if number_pad is on. - #quiver - Select ammunition for quiver. Default key is `Q'. + #kick + Kick something. Default key is `^D', and `k' if number_pad is + on. - #read - Read a scroll, a spellbook, or something else. Default key - is `r'. + #known + Show what object types have been discovered. Default key is `\'. - #redraw - Redraw the screen. Default key is `^R', and also `^L' if - number_pad is on. + #knownclass + Show discovered types for one class of objects. Default key is + ``'. - #remove - Remove an accessory (ring, amulet, etc). Default key is - `R'. + #levelchange + Change your experience level. Autocompletes. Debug mode only. - #ride - Ride (or stop riding) a saddled creature. Autocompletes. - Default key is `M-R'. + #lightsources + Show mobile light sources. Autocompletes. Debug mode only. - #rub - Rub a lamp or a stone. Autocompletes. Default key is `M- - r'. + #look + Look at what is here, under you. Default key is `:'. - #save - Save the game and exit the program. Default key is `S'. + #loot + Loot a box or bag on the floor beneath you, or the saddle from a + steed standing next to you. Autocompletes. Precede with the `m' + prefix to skip containers at your location and go directly to + removing a saddle. Default key is `M-l', and also `l' if num- + ber_pad is on. - #search - Search for traps and secret doors around you. Default key - is `s'. + #monster + Use a monster's special ability (when polymorphed into monster + form). Autocompletes. Default key is `M-m'. - #seeall - Show all equipment in use. Default key is `*'. + #name + Name a monster, an individual object, or a type of object. Same + as "#call". Autocompletes. Default keys are `N', `M-n', and `M- + N'. - #seeamulet - Show the amulet currently worn. Default key is `"'. + #offer + Offer a sacrifice to the gods. Autocompletes. Default key is + `M-o'. - #seearmor - Show the armor currently worn. Default key is `['. + You'll need to find an altar to have any chance at success. + Corpses of recently killed monsters are the fodder of choice. - #seegold - Count your gold. Default key is `$'. - #seenv - Show seen vectors. Autocompletes. Debug mode only. - #seerings - Show the ring(s) currently worn. Default key is `='. + NetHack 3.6.7 February 3, 2023 - #seespells - List and reorder known spells. Default key is `+'. - #seetools - Show the tools currently in use. Default key is `('. - NetHack 3.6 February 3, 2023 + NetHack Guidebook 22 + The `m' prefix skips offering any items which are on the altar. + #open + Open a door. Default key is `o'. - NetHack Guidebook 24 + #options + Show and change option settings. Default key is `O'. + #overview + Display information you've discovered about the dungeon. Any + visited level (unless forgotten due to amnesia) with an annota- + tion is included, and many things (altars, thrones, fountains, + and so on; extra stairs leading to another dungeon branch) trig- + ger an automatic annotation. If dungeon overview is chosen dur- + ing end-of-game disclosure, every visited level will be included + regardless of annotations. Autocompletes. Default keys are + `^O', and `M-O'. + #panic + Test the panic routine. Terminates the current game. Autocom- + pletes. Debug mode only. - #seetrap - Show the type of an adjacent trap. Default key is `^'. + Asks for confirmation; default is n (no); continue playing. To + really panic, respond with y. You can set the paranoid_confirma- + tion:quit option to require a response of yes instead. - #seeweapon - Show the weapon currently wielded. Default key is `)'. + #pay + Pay your shopping bill. Default key is `p'. - #shell - Do a shell escape. Default key is `!'. + #pickup + Pick up things at the current location. Default key is `,'. The + `m' prefix forces use of a menu. - #sit - Sit down. Autocompletes. Default key is `M-s'. + #polyself + Polymorph self. Autocompletes. Debug mode only. - #stats - Show memory usage statistics. Autocompletes. Debug mode - only. + #pray + Pray to the gods for help. Autocompletes. Default key is `M-p'. - #suspend - Suspend the game. Default key is `^Z'. + Praying too soon after receiving prior help is a bad idea. + (Hint: entering the dungeon alive is treated as having received + help. You probably shouldn't start off a new game by praying + right away.) Since using this command by accident can cause + trouble, there is an option to make you confirm your intent + before praying. It is enabled by default, and you can reset the + paranoid_confirmation option to disable it. - #swap - Swap wielded and secondary weapons. Default key is `x'. + #prevmsg + Show previously displayed game messages. Default key is `^P'. - #takeoff - Take off one piece of armor. Default key is `T'. + #puton + Put on an accessory (ring, amulet, etc). Default key is `P'. - #takeoffall - Remove all armor. Default key is `A'. - #teleport - Teleport around the level. Default key is `^T'. - #terrain - Show bare map without displaying monsters, objects, or - traps. Autocompletes. - #therecmdmenu - Show a menu of possible actions in a location next to you. + NetHack 3.6.7 February 3, 2023 - #throw - Throw something. Default key is `t'. - #timeout - Look at the timeout queue. Autocompletes. Debug mode only. - #tip - Tip over a container (bag or box) to pour out its contents. - Autocompletes. Default key is `M-T'. The `m' prefix makes - the command use a menu. - #travel - Travel to a specific location on the map. Default key is - `_'. Using the "request menu" prefix shows a menu of inter- - esting targets in sight without asking to move the cursor. - When picking a target with cursor and the autodescribe + NetHack Guidebook 23 - NetHack 3.6 February 3, 2023 + #quaff + Quaff (drink) something. Default key is `q'. + #quit + Quit the program without saving your game. Autocompletes. + Default key is `M-q'. + Since using this command by accident would throw away the current + game, you are asked to confirm your intent before quitting. + Default response is n (no); continue playing. To really quit, + respond with y. You can set the paranoid_confirmation:quit + option to require a response of yes instead. - NetHack Guidebook 25 + #quiver + Select ammunition for quiver. Default key is `Q'. + #read + Read a scroll, a spellbook, or something else. Default key is + `r'. + #redraw + Redraw the screen. Default key is `^R', and also `^L' if num- + ber_pad is on. - option is on, the top line will show "(no travel path)" if - your character does not know of a path to that location. + #remove + Remove an accessory (ring, amulet, etc). Default key is `R'. - #turn - Turn undead away. Autocompletes. Default key is `M-t'. + #ride + Ride (or stop riding) a saddled creature. Autocompletes. + Default key is `M-R'. - #twoweapon - Toggle two-weapon combat on or off. Autocompletes. Default - key is `X', and also `M-2' if number_pad is off. + #rub + Rub a lamp or a stone. Autocompletes. Default key is `M-r'. - Note that you must use suitable weapons for this type of - combat, or it will be automatically turned off. + #save + Save the game and exit the program. Default key is `S'. - #untrap - Untrap something (trap, door, or chest). Default key is `M- - u', and `u' if number_pad is on. + #search + Search for traps and secret doors around you. Default key is + `s'. - In some circumstances it can also be used to rescue trapped - monsters. + #seeall + Show all equipment in use. Default key is `*'. - #up - Go up a staircase. Default key is `<'. + #seeamulet + Show the amulet currently worn. Default key is `"'. - #vanquished - List vanquished monsters. Autocompletes. Debug mode only. + #seearmor + Show the armor currently worn. Default key is `['. - #version - Print compile time options for this version of NetHack. Au- - tocompletes. Default key is `M-v'. + #seegold + Count your gold. Default key is `$'. - #versionshort - Show version string. Default key is `v'. - #vision - Show vision array. Autocompletes. Debug mode only. - #wait - Rest one move while doing nothing. Default key is `.', and - also ` ' if rest_on_space is on. - #wear - Wear a piece of armor. Default key is `W'. + NetHack 3.6.7 February 3, 2023 - #whatdoes - Tell what a key does. Default key is `&'. - #whatis - Show what type of thing a symbol corresponds to. Default - key is `/'. - #wield - Wield a weapon. Default key is `w'. + NetHack Guidebook 24 - NetHack 3.6 February 3, 2023 + #seenv + Show seen vectors. Autocompletes. Debug mode only. + #seerings + Show the ring(s) currently worn. Default key is `='. + #seespells + List and reorder known spells. Default key is `+'. + #seetools + Show the tools currently in use. Default key is `('. - NetHack Guidebook 26 + #seetrap + Show the type of an adjacent trap. Default key is `^'. + #seeweapon + Show the weapon currently wielded. Default key is `)'. + #shell + Do a shell escape. Default key is `!'. - #wipe - Wipe off your face. Autocompletes. Default key is `M-w'. + #sit + Sit down. Autocompletes. Default key is `M-s'. - #wizbury - Bury objects under and around you. Autocompletes. Debug - mode only. + #stats + Show memory usage statistics. Autocompletes. Debug mode only. - #wizdetect - Search for hidden things (secret doors or traps or unseen - monsters) within a modest radius. Autocompletes. Debug - mode only. Default key is `^E'. + #suspend + Suspend the game. Default key is `^Z'. - #wizgenesis - Create a monster. May be prefixed by a count to create more - than one. Autocompletes. Debug mode only. Default key is - `^G'. + #swap + Swap wielded and secondary weapons. Default key is `x'. - #wizidentify - Identify all items in inventory. Autocompletes. Debug mode - only. Default key is `^I'. + #takeoff + Take off one piece of armor. Default key is `T'. - #wizintrinsic - Set one or more intrinsic attributes. Autocompletes. Debug - mode only. + #takeoffall + Remove all armor. Default key is `A'. - #wizlevelport - Teleport to another level. Autocompletes. Debug mode only. - Default key is `^V'. + #teleport + Teleport around the level. Default key is `^T'. - #wizmap - Map the level. Autocompletes. Debug mode only. Default - key is `^F'. + #terrain + Show bare map without displaying monsters, objects, or traps. + Autocompletes. - #wizrumorcheck - Verify rumor boundaries. Autocompletes. Debug mode only. + #therecmdmenu + Show a menu of possible actions in a location next to you. - #wizsmell - Smell monster. Autocompletes. Debug mode only. + #throw + Throw something. Default key is `t'. - #wizwhere - Show locations of special levels. Autocompletes. Debug - mode only. + #timeout + Look at the timeout queue. Autocompletes. Debug mode only. - #wizwish - Wish for something. Autocompletes. Debug mode only. De- - fault key is `^W'. - #wmode - Show wall modes. Autocompletes. Debug mode only. + NetHack 3.6.7 February 3, 2023 - #zap - Zap a wand. Default key is `z'. - NetHack 3.6 February 3, 2023 + NetHack Guidebook 25 + #tip + Tip over a container (bag or box) to pour out its contents. + Autocompletes. Default key is `M-T'. The `m' prefix makes the + command use a menu. + #travel + Travel to a specific location on the map. Default key is `_'. + Using the "request menu" prefix shows a menu of interesting tar- + gets in sight without asking to move the cursor. When picking a + target with cursor and the autodescribe option is on, the top + line will show "(no travel path)" if your character does not know + of a path to that location. - NetHack Guidebook 27 + #turn + Turn undead away. Autocompletes. Default key is `M-t'. + #twoweapon + Toggle two-weapon combat on or off. Autocompletes. Default key + is `X', and also `M-2' if number_pad is off. + Note that you must use suitable weapons for this type of combat, + or it will be automatically turned off. - #? - Help menu: get the list of available extended commands. + #untrap + Untrap something (trap, door, or chest). Default key is `M-u', + and `u' if number_pad is on. + In some circumstances it can also be used to rescue trapped mon- + sters. + #up + Go up a staircase. Default key is `<'. - If your keyboard has a meta key (which, when pressed in com- - bination with another key, modifies it by setting the "meta" - [8th, or "high"] bit), you can invoke many extended commands by - meta-ing the first letter of the command. + #vanquished + List vanquished monsters. Autocompletes. Debug mode only. - In NT, OS/2, PC and ST NetHack, the "Alt" key can be used in - this fashion; on the Amiga, set the altmeta option to get this - behavior. On other systems, if typing "Alt" plus another key - transmits a two character sequence consisting of an Escape fol- - lowed by the other key, you may set the altmeta option to have - NetHack combine them into meta+key. + #version + Print compile time options for this version of NetHack. Autocom- + pletes. Default key is `M-v'. - M-? #? (not supported by all platforms) + #versionshort + Show version string. Default key is `v'. - M-2 #twoweapon (unless the number_pad option is enabled) + #vision + Show vision array. Autocompletes. Debug mode only. - M-a #adjust + #wait + Rest one move while doing nothing. Default key is `.', and also + ` ' if rest_on_space is on. - M-A #annotate + #wear + Wear a piece of armor. Default key is `W'. - M-c #chat - M-C #conduct - M-d #dip - M-e #enhance + NetHack 3.6.7 February 3, 2023 - M-f #force - M-i #invoke - M-j #jump - M-l #loot - M-m #monster + NetHack Guidebook 26 - M-n #name - M-o #offer - M-O #overview + #whatdoes + Tell what a key does. Default key is `&'. - M-p #pray + #whatis + Show what type of thing a symbol corresponds to. Default key is + `/'. - M-q #quit + #wield + Wield a weapon. Default key is `w'. + #wipe + Wipe off your face. Autocompletes. Default key is `M-w'. + #wizbury + Bury objects under and around you. Autocompletes. Debug mode + only. + #wizdetect + Search for hidden things (secret doors or traps or unseen mon- + sters) within a modest radius. Autocompletes. Debug mode only. + Default key is `^E'. - NetHack 3.6 February 3, 2023 + #wizgenesis + Create a monster. May be prefixed by a count to create more than + one. Autocompletes. Debug mode only. Default key is `^G'. + #wizidentify + Identify all items in inventory. Autocompletes. Debug mode + only. Default key is `^I'. + #wizintrinsic + Set one or more intrinsic attributes. Autocompletes. Debug mode + only. + #wizlevelport + Teleport to another level. Autocompletes. Debug mode only. + Default key is `^V'. + #wizmap + Map the level. Autocompletes. Debug mode only. Default key is + `^F'. - NetHack Guidebook 28 + #wizrumorcheck + Verify rumor boundaries. Autocompletes. Debug mode only. + #wizsmell + Smell monster. Autocompletes. Debug mode only. + #wizwhere + Show locations of special levels. Autocompletes. Debug mode + only. - M-r #rub + #wizwish + Wish for something. Autocompletes. Debug mode only. Default - M-R #ride - M-s #sit + NetHack 3.6.7 February 3, 2023 - M-t #turn - M-T #tip - M-u #untrap - M-v #version - M-w #wipe + NetHack Guidebook 27 - If the number_pad option is on, some additional letter com- - mands are available: + key is `^W'. - h #help + #wmode + Show wall modes. Autocompletes. Debug mode only. - j #jump + #zap + Zap a wand. Default key is `z'. - k #kick + #? + Help menu: get the list of available extended commands. - l #loot - N #name - u #untrap + If your keyboard has a meta key (which, when pressed in combina- + tion with another key, modifies it by setting the "meta" [8th, or + "high"] bit), you can invoke many extended commands by meta-ing the + first letter of the command. - 5. Rooms and corridors + In NT, OS/2, PC and ST NetHack, the "Alt" key can be used in this + fashion; on the Amiga, set the altmeta option to get this behavior. + On other systems, if typing "Alt" plus another key transmits a two + character sequence consisting of an Escape followed by the other key, + you may set the altmeta option to have NetHack combine them into + meta+key. - Rooms and corridors in the dungeon are either lit or dark. - Any lit areas within your line of sight will be displayed; dark - areas are only displayed if they are within one space of you. - Walls and corridors remain on the map as you explore them. + M-? #? (not supported by all platforms) - Secret corridors are hidden. You can find them with the `s' - (search) command. + M-2 #twoweapon (unless the number_pad option is enabled) - 5.1. Doorways + M-a #adjust - Doorways connect rooms and corridors. Some doorways have no - doors; you can walk right through. Others have doors in them, - which may be open, closed, or locked. To open a closed door, use - the `o' (open) command; to close it again, use the `c' (close) - command. + M-A #annotate - You can get through a locked door by using a tool to pick - the lock with the `a' (apply) command, or by kicking it open with - the `^D' (kick) command. + M-c #chat + M-C #conduct - NetHack 3.6 February 3, 2023 + M-d #dip + M-e #enhance + M-f #force + M-i #invoke + M-j #jump - NetHack Guidebook 29 + M-l #loot + M-m #monster + M-n #name - Open doors cannot be entered diagonally; you must approach - them straight on, horizontally or vertically. Doorways without - doors are not restricted in this fashion. - Doors can be useful for shutting out monsters. Most mon- - sters cannot open doors, although a few don't need to (for exam- - ple, ghosts can walk through doors). - Secret doors are hidden. You can find them with the `s' - (search) command. Once found they are in all ways equivalent to - normal doors. - 5.2. Traps (`^') + NetHack 3.6.7 February 3, 2023 - There are traps throughout the dungeon to snare the unwary - delver. For example, you may suddenly fall into a pit and be - stuck for a few turns trying to climb out. Traps don't appear on - your map until you see one triggered by moving onto it, see some- - thing fall into it, or you discover it with the `s' (search) com- - mand. Monsters can fall prey to traps, too, which can be a very - useful defensive strategy. - There is a special pre-mapped branch of the dungeon based on - the classic computer game "Sokoban." The goal is to push the - boulders into the pits or holes. With careful foresight, it is - possible to complete all of the levels according to the tradi- - tional rules of Sokoban. Some allowances are permitted in case - the player gets stuck; however, they will lower your luck. - 5.3. Stairs and ladders (`<', `>') - In general, each level in the dungeon will have a staircase - going up (`<') to the previous level and another going down (`>') - to the next level. There are some exceptions though. For in- - stance, fairly early in the dungeon you will find a level with - two down staircases, one continuing into the dungeon and the oth- - er branching into an area known as the Gnomish Mines. Those - mines eventually hit a dead end, so after exploring them (if you - choose to do so), you'll need to climb back up to the main dun- - geon. - When you traverse a set of stairs, or trigger a trap which - sends you to another level, the level you're leaving will be de- - activated and stored in a file on disk. If you're moving to a - previously visited level, it will be loaded from its file on disk - and reactivated. If you're moving to a level which has not yet - been visited, it will be created (from scratch for most random - levels, from a template for some "special" levels, or loaded from - the remains of an earlier game for a "bones" level as briefly de- - scribed below). Monsters are only active on the current level; - those on other levels are essentially placed into stasis. + NetHack Guidebook 28 - Ordinarily when you climb a set of stairs, you will arrive - on the corresponding staircase at your destination. However, - NetHack 3.6 February 3, 2023 + M-o #offer + M-O #overview + M-p #pray + M-q #quit + M-r #rub - NetHack Guidebook 30 + M-R #ride + M-s #sit + M-t #turn - pets (see below) and some other monsters will follow along if - they're close enough when you travel up or down stairs, and occa- - sionally one of these creatures will displace you during the - climb. When that occurs, the pet or other monster will arrive on - the staircase and you will end up nearby. + M-T #tip - Ladders serve the same purpose as staircases, and the two - types of inter-level connections are nearly indistinguishable - during game play. + M-u #untrap - 5.4. Shops and shopping + M-v #version - Occasionally you will run across a room with a shopkeeper - near the door and many items lying on the floor. You can buy - items by picking them up and then using the `p' command. You can - inquire about the price of an item prior to picking it up by us- - ing the "#chat" command while standing on it. Using an item pri- - or to paying for it will incur a charge, and the shopkeeper won't - allow you to leave the shop until you have paid any debt you owe. + M-w #wipe - You can sell items to a shopkeeper by dropping them to the - floor while inside a shop. You will either be offered an amount - of gold and asked whether you're willing to sell, or you'll be - told that the shopkeeper isn't interested (generally, your item - needs to be compatible with the type of merchandise carried by - the shop). - If you drop something in a shop by accident, the shopkeeper - will usually claim ownership without offering any compensation. - You'll have to buy it back if you want to reclaim it. - Shopkeepers sometimes run out of money. When that happens, - you'll be offered credit instead of gold when you try to sell - something. Credit can be used to pay for purchases, but it is - only good in the shop where it was obtained; other shopkeepers - won't honor it. (If you happen to find a "credit card" in the - dungeon, don't bother trying to use it in shops; shopkeepers will - not accept it.) + If the number_pad option is on, some additional letter commands + are available: - The `$' command, which reports the amount of gold you are - carrying (in inventory, not inside bags or boxes), will also show - current shop debt or credit, if any. The "Iu" command lists un- - paid items (those which still belong to the shop) if you are car- - rying any. The "Ix" command shows an inventory-like display of - any unpaid items which have been used up, along with other shop - fees, if any. + h #help - 5.4.1. Shop idiosyncrasies + j #jump - Several aspects of shop behavior might be unexpected. + k #kick - * The price of a given item can vary due to a variety of factors. + l #loot + N #name + u #untrap + 5. Rooms and corridors - NetHack 3.6 February 3, 2023 + Rooms and corridors in the dungeon are either lit or dark. Any + lit areas within your line of sight will be displayed; dark areas are + only displayed if they are within one space of you. Walls and corri- + dors remain on the map as you explore them. + Secret corridors are hidden. You can find them with the `s' + (search) command. - NetHack Guidebook 31 + NetHack 3.6.7 February 3, 2023 - * A shopkeeper treats the spot immediately inside the door as if - it were outside the shop. - * While the shopkeeper watches you like a hawk, he will generally - ignore any other customers. - * If a shop is "closed for inventory," it will not open of its - own accord. - * Shops do not get restocked with new items, regardless of inven- - tory depletion. - 6. Monsters + NetHack Guidebook 29 - Monsters you cannot see are not displayed on the screen. - Beware! You may suddenly come upon one in a dark place. Some - magic items can help you locate them before they locate you - (which some monsters can do very well). - The commands `/' and `;' may be used to obtain information - about those monsters who are displayed on the screen. The com- - mand "#name" (by default bound to `C'), allows you to assign a - name to a monster, which may be useful to help distinguish one - from another when multiple monsters are present. Assigning a - name which is just a space will remove any prior name. - The extended command "#chat" can be used to interact with an - adjacent monster. There is no actual dialog (in other words, you - don't get to choose what you'll say), but chatting with some mon- - sters such as a shopkeeper or the Oracle of Delphi can produce - useful results. + 5.1. Doorways - 6.1. Fighting + Doorways connect rooms and corridors. Some doorways have no + doors; you can walk right through. Others have doors in them, which + may be open, closed, or locked. To open a closed door, use the `o' + (open) command; to close it again, use the `c' (close) command. - If you see a monster and you wish to fight it, just attempt - to walk into it. Many monsters you find will mind their own - business unless you attack them. Some of them are very dangerous - when angered. Remember: discretion is the better part of valor. + You can get through a locked door by using a tool to pick the + lock with the `a' (apply) command, or by kicking it open with the `^D' + (kick) command. - In most circumstances, if you attempt to attack a peaceful - monster by moving into its location, you'll be asked to confirm - your intent. By default an answer of `y' acknowledges that in- - tent, which can be error prone if you're using `y' to move. You - can set the paranoid_confirmation option to require a response of - "yes" instead. + Open doors cannot be entered diagonally; you must approach them + straight on, horizontally or vertically. Doorways without doors are + not restricted in this fashion. - If you can't see a monster (if it is invisible, or if you - are blinded), the symbol `I' will be shown when you learn of its - presence. If you attempt to walk into it, you will try to fight - it just like a monster that you can see; of course, if the mon- - ster has moved, you will attack empty air. If you guess that the - monster has moved and you don't wish to fight, you can use the - `m' command to move without fighting; likewise, if you don't re- - member a monster but want to try fighting anyway, you can use the + Doors can be useful for shutting out monsters. Most monsters + cannot open doors, although a few don't need to (for example, ghosts + can walk through doors). + Secret doors are hidden. You can find them with the `s' (search) + command. Once found they are in all ways equivalent to normal doors. - NetHack 3.6 February 3, 2023 + 5.2. Traps (`^') + There are traps throughout the dungeon to snare the unwary + delver. For example, you may suddenly fall into a pit and be stuck + for a few turns trying to climb out. Traps don't appear on your map + until you see one triggered by moving onto it, see something fall into + it, or you discover it with the `s' (search) command. Monsters can + fall prey to traps, too, which can be a very useful defensive strat- + egy. + There is a special pre-mapped branch of the dungeon based on the + classic computer game "Sokoban." The goal is to push the boulders + into the pits or holes. With careful foresight, it is possible to + complete all of the levels according to the traditional rules of + Sokoban. Some allowances are permitted in case the player gets stuck; + however, they will lower your luck. + 5.3. Stairs and ladders (`<', `>') + In general, each level in the dungeon will have a staircase going + up (`<') to the previous level and another going down (`>') to the + next level. There are some exceptions though. For instance, fairly + early in the dungeon you will find a level with two down staircases, + one continuing into the dungeon and the other branching into an area + known as the Gnomish Mines. Those mines eventually hit a dead end, so + after exploring them (if you choose to do so), you'll need to climb + back up to the main dungeon. - NetHack Guidebook 32 + When you traverse a set of stairs, or trigger a trap which sends + you to another level, the level you're leaving will be deactivated and + stored in a file on disk. If you're moving to a previously visited + level, it will be loaded from its file on disk and reactivated. If + NetHack 3.6.7 February 3, 2023 - `F' command. - 6.2. Your pet - You start the game with a little dog (`d'), kitten (`f'), or - pony (`u'), which follows you about the dungeon and fights mon- - sters with you. Like you, your pet needs food to survive. Dogs - and cats usually feed themselves on fresh carrion and other - meats; horses need vegetarian food which is harder to come by. - If you're worried about your pet or want to train it, you can - feed it, too, by throwing it food. A properly trained pet can be - very useful under certain circumstances. - Your pet also gains experience from killing monsters, and - can grow over time, gaining hit points and doing more damage. - Initially, your pet may even be better at killing things than - you, which makes pets useful for low-level characters. - Your pet will follow you up and down staircases if it is - next to you when you move. Otherwise your pet will be stranded - and may become wild. Similarly, when you trigger certain types - of traps which alter your location (for instance, a trap door - which drops you to a lower dungeon level), any adjacent pet will - accompany you and any non-adjacent pet will be left behind. Your - pet may trigger such traps itself; you will not be carried along - with it even if adjacent at the time. + NetHack Guidebook 30 - 6.3. Steeds - Some types of creatures in the dungeon can actually be rid- - den if you have the right equipment and skill. Convincing a wild - beast to let you saddle it up is difficult to say the least. - Many a dungeoneer has had to resort to magic and wizardry in or- - der to forge the alliance. Once you do have the beast under your - control however, you can easily climb in and out of the saddle - with the "#ride" command. Lead the beast around the dungeon when - riding, in the same manner as you would move yourself. It is the - beast that you will see displayed on the map. - Riding skill is managed by the "#enhance" command. See the - section on Weapon proficiency for more information about that. + you're moving to a level which has not yet been visited, it will be + created (from scratch for most random levels, from a template for some + "special" levels, or loaded from the remains of an earlier game for a + "bones" level as briefly described below). Monsters are only active + on the current level; those on other levels are essentially placed + into stasis. - Use the `a' (apply) command and pick a saddle in your inven- - tory to attempt to put that saddle on an adjacent creature. If - successful, it will be transferred to that creature's inventory. + Ordinarily when you climb a set of stairs, you will arrive on the + corresponding staircase at your destination. However, pets (see + below) and some other monsters will follow along if they're close + enough when you travel up or down stairs, and occasionally one of + these creatures will displace you during the climb. When that occurs, + the pet or other monster will arrive on the staircase and you will end + up nearby. - Use the "#loot" command while adjacent to a saddled creature - to try to remove the saddle from that creature. If successful, - it will be transferred to your inventory. + Ladders serve the same purpose as staircases, and the two types + of inter-level connections are nearly indistinguishable during game + play. - 6.4. Bones levels + 5.4. Shops and shopping - You may encounter the shades and corpses of other adventur- - ers (or even former incarnations of yourself!) and their personal + Occasionally you will run across a room with a shopkeeper near + the door and many items lying on the floor. You can buy items by + picking them up and then using the `p' command. You can inquire about + the price of an item prior to picking it up by using the "#chat" com- + mand while standing on it. Using an item prior to paying for it will + incur a charge, and the shopkeeper won't allow you to leave the shop + until you have paid any debt you owe. + You can sell items to a shopkeeper by dropping them to the floor + while inside a shop. You will either be offered an amount of gold and + asked whether you're willing to sell, or you'll be told that the shop- + keeper isn't interested (generally, your item needs to be compatible + with the type of merchandise carried by the shop). - NetHack 3.6 February 3, 2023 + If you drop something in a shop by accident, the shopkeeper will + usually claim ownership without offering any compensation. You'll + have to buy it back if you want to reclaim it. + Shopkeepers sometimes run out of money. When that happens, + you'll be offered credit instead of gold when you try to sell some- + thing. Credit can be used to pay for purchases, but it is only good + in the shop where it was obtained; other shopkeepers won't honor it. + (If you happen to find a "credit card" in the dungeon, don't bother + trying to use it in shops; shopkeepers will not accept it.) + The `$' command, which reports the amount of gold you are carry- + ing (in inventory, not inside bags or boxes), will also show current + shop debt or credit, if any. The "Iu" command lists unpaid items + (those which still belong to the shop) if you are carrying any. The + "Ix" command shows an inventory-like display of any unpaid items which + have been used up, along with other shop fees, if any. - NetHack Guidebook 33 + NetHack 3.6.7 February 3, 2023 - effects. Ghosts are hard to kill, but easy to avoid, since - they're slow and do little damage. You can plunder the deceased - adventurer's possessions; however, they are likely to be cursed. - Beware of whatever killed the former player; it is probably still - lurking around, gloating over its last victory. - 6.5. Persistence of Monsters - Monsters (a generic reference which also includes humans and - pets) are only shown while they can be seen or otherwise sensed. - Moving to a location where you can't see or sense a monster any - more will result in it disappearing from your map, similarly if - it is the one who moved rather than you. - However, if you encounter a monster which you can't see or - sense -- perhaps it is invisible and has just tapped you on the - noggin -- a special "remembered, unseen monster" marker will be - displayed at the location where you think it is. That will per- - sist until you have proven that there is no monster there, even - if the unseen monster moves to another location or you move to a - spot where the marker's location ordinarily wouldn't be seen any - more. + NetHack Guidebook 31 - 7. Objects - When you find something in the dungeon, it is common to want - to pick it up. In NetHack, this is accomplished automatically by - walking over the object (unless you turn off the autopickup op- - tion (see below), or move with the `m' prefix (see above)), or - manually by using the `,' command. - If you're carrying too many items, NetHack will tell you so - and you won't be able to pick up anything more. Otherwise, it - will add the object(s) to your pack and tell you what you just - picked up. + 5.4.1. Shop idiosyncrasies - As you add items to your inventory, you also add the weight - of that object to your load. The amount that you can carry de- - pends on your strength and your constitution. The stronger and - sturdier you are, the less the additional load will affect you. - There comes a point, though, when the weight of all of that stuff - you are carrying around with you through the dungeon will encum- - ber you. Your reactions will get slower and you'll burn calories - faster, requiring food more frequently to cope with it. Eventu- - ally, you'll be so overloaded that you'll either have to discard - some of what you're carrying or collapse under its weight. + Several aspects of shop behavior might be unexpected. - NetHack will tell you how badly you have loaded yourself. - If you are encumbered, one of the conditions "Burdened", - "Stressed", "Strained", "Overtaxed" or "Overloaded" will be shown - on the bottom line status display. + * The price of a given item can vary due to a variety of factors. - When you pick up an object, it is assigned an inventory let- - ter. Many commands that operate on objects must ask you to find + * A shopkeeper treats the spot immediately inside the door as if it + were outside the shop. + * While the shopkeeper watches you like a hawk, he will generally + ignore any other customers. - NetHack 3.6 February 3, 2023 + * If a shop is "closed for inventory," it will not open of its own + accord. + * Shops do not get restocked with new items, regardless of inventory + depletion. + 6. Monsters + Monsters you cannot see are not displayed on the screen. Beware! + You may suddenly come upon one in a dark place. Some magic items can + help you locate them before they locate you (which some monsters can + do very well). + The commands `/' and `;' may be used to obtain information about + those monsters who are displayed on the screen. The command "#name" + (by default bound to `C'), allows you to assign a name to a monster, + which may be useful to help distinguish one from another when multiple + monsters are present. Assigning a name which is just a space will + remove any prior name. - NetHack Guidebook 34 + The extended command "#chat" can be used to interact with an + adjacent monster. There is no actual dialog (in other words, you + don't get to choose what you'll say), but chatting with some monsters + such as a shopkeeper or the Oracle of Delphi can produce useful + results. + 6.1. Fighting + If you see a monster and you wish to fight it, just attempt to + walk into it. Many monsters you find will mind their own business + unless you attack them. Some of them are very dangerous when angered. + Remember: discretion is the better part of valor. - out which object you want to use. When NetHack asks you to - choose a particular object you are carrying, you are usually pre- - sented with a list of inventory letters to choose from (see Com- - mands, above). + In most circumstances, if you attempt to attack a peaceful mon- + ster by moving into its location, you'll be asked to confirm your + intent. By default an answer of `y' acknowledges that intent, which + can be error prone if you're using `y' to move. You can set the para- + noid_confirmation option to require a response of "yes" instead. - Some objects, such as weapons, are easily differentiated. - Others, like scrolls and potions, are given descriptions which - vary according to type. During a game, any two objects with the - same description are the same type. However, the descriptions - will vary from game to game. + If you can't see a monster (if it is invisible, or if you are + blinded), the symbol `I' will be shown when you learn of its presence. + If you attempt to walk into it, you will try to fight it just like a - When you use one of these objects, if its effect is obvious, - NetHack will remember what it is for you. If its effect isn't - extremely obvious, you will be asked what you want to call this - type of object so you will recognize it later. You can also use - the "#name" command, for the same purpose at any time, to name - all objects of a particular type or just an individual object. - When you use "#name" on an object which has already been named, - specifying a space as the value will remove the prior name in- - stead of assigning a new one. - 7.1. Curses and Blessings + NetHack 3.6.7 February 3, 2023 - Any object that you find may be cursed, even if the object - is otherwise helpful. The most common effect of a curse is being - stuck with (and to) the item. Cursed weapons weld themselves to - your hand when wielded, so you cannot unwield them. Any cursed - item you wear is not removable by ordinary means. In addition, - cursed arms and armor usually, but not always, bear negative en- - chantments that make them less effective in combat. Other cursed - objects may act poorly or detrimentally in other ways. - Objects can also be blessed. Blessed items usually work - better or more beneficially than normal uncursed items. For ex- - ample, a blessed weapon will do more damage against demons. - Objects which are neither cursed nor blessed are referred to - as uncursed. They could just as easily have been described as - unblessed, but the uncursed designation is what you will see - within the game. A "glass half full versus glass half empty" - situation; make of that what you will. - There are magical means of bestowing or removing curses upon - objects, so even if you are stuck with one, you can still have - the curse lifted and the item removed. Priests and Priestesses - have an innate sensitivity to this property in any object, so - they can more easily avoid cursed objects than other character - roles. - An item with unknown status will be reported in your inven- - tory with no prefix. An item which you know the state of will be - distinguished in your inventory by the presence of the word - "cursed", "uncursed" or "blessed" in the description of the item. - In some cases "uncursed" will be omitted as being redundant when + NetHack Guidebook 32 - NetHack 3.6 February 3, 2023 + monster that you can see; of course, if the monster has moved, you + will attack empty air. If you guess that the monster has moved and + you don't wish to fight, you can use the `m' command to move without + fighting; likewise, if you don't remember a monster but want to try + fighting anyway, you can use the `F' command. + 6.2. Your pet + You start the game with a little dog (`d'), kitten (`f'), or pony + (`u'), which follows you about the dungeon and fights monsters with + you. Like you, your pet needs food to survive. Dogs and cats usually + feed themselves on fresh carrion and other meats; horses need vegetar- + ian food which is harder to come by. If you're worried about your pet + or want to train it, you can feed it, too, by throwing it food. A + properly trained pet can be very useful under certain circumstances. + Your pet also gains experience from killing monsters, and can + grow over time, gaining hit points and doing more damage. Initially, + your pet may even be better at killing things than you, which makes + pets useful for low-level characters. - NetHack Guidebook 35 + Your pet will follow you up and down staircases if it is next to + you when you move. Otherwise your pet will be stranded and may become + wild. Similarly, when you trigger certain types of traps which alter + your location (for instance, a trap door which drops you to a lower + dungeon level), any adjacent pet will accompany you and any non-adja- + cent pet will be left behind. Your pet may trigger such traps itself; + you will not be carried along with it even if adjacent at the time. + 6.3. Steeds + Some types of creatures in the dungeon can actually be ridden if + you have the right equipment and skill. Convincing a wild beast to + let you saddle it up is difficult to say the least. Many a dungeoneer + has had to resort to magic and wizardry in order to forge the + alliance. Once you do have the beast under your control however, you + can easily climb in and out of the saddle with the "#ride" command. + Lead the beast around the dungeon when riding, in the same manner as + you would move yourself. It is the beast that you will see displayed + on the map. - enough other information is displayed. The implicit_uncursed op- - tion can be used to control this; toggle it off to have "un- - cursed" be displayed even when that can be deduced from other at- - tributes. + Riding skill is managed by the "#enhance" command. See the sec- + tion on Weapon proficiency for more information about that. - 7.2. Weapons (`)') + Use the `a' (apply) command and pick a saddle in your inventory + to attempt to put that saddle on an adjacent creature. If successful, + it will be transferred to that creature's inventory. - Given a chance, most monsters in the Mazes of Menace will - gratuitously try to kill you. You need weapons for self-defense - (killing them first). Without a weapon, you do only 1-2 hit - points of damage (plus bonuses, if any). Monk characters are an - exception; they normally do more damage with bare (or gloved) - hands than they do with weapons. + Use the "#loot" command while adjacent to a saddled creature to + try to remove the saddle from that creature. If successful, it will + be transferred to your inventory. - There are wielded weapons, like maces and swords, and thrown - weapons, like arrows and spears. To hit monsters with a weapon, - you must wield it and attack them, or throw it at them. You can - simply elect to throw a spear. To shoot an arrow, you should - first wield a bow, then throw the arrow. Crossbows shoot cross- - bow bolts. Slings hurl rocks and (other) stones (like gems). - Enchanted weapons have a "plus" (or "to hit enhancement" - which can be either positive or negative) that adds to your - chance to hit and the damage you do to a monster. The only way - to determine a weapon's enchantment is to have it magically iden- - tified somehow. Most weapons are subject to some type of damage - like rust. Such "erosion" damage can be repaired. - The chance that an attack will successfully hit a monster, - and the amount of damage such a hit will do, depends upon many - factors. Among them are: type of weapon, quality of weapon (en- - chantment and/or erosion), experience level, strength, dexterity, - encumbrance, and proficiency (see below). The monster's armor - class -- a general defense rating, not necessarily due to wearing - of armor -- is a factor too; also, some monsters are particularly - vulnerable to certain types of weapons. - Many weapons can be wielded in one hand; some require both - hands. When wielding a two-handed weapon, you can not wear a - shield, and vice versa. When wielding a one-handed weapon, you - can have another weapon ready to use by setting things up with - the `x' command, which exchanges your primary (the one being - wielded) and alternate weapons. And if you have proficiency in - the "two weapon combat" skill, you may wield both weapons simul- - taneously as primary and secondary; use the `X' command to engage - or disengage that. Only some types of characters (barbarians, - for instance) have the necessary skill available. Even with that - skill, using two weapons at once incurs a penalty in the chance - to hit your target compared to using just one weapon at a time. - There might be times when you'd rather not wield any weapon - at all. To accomplish that, wield `-', or else use the `A' com- - mand which allows you to unwield the current weapon in addition - to taking off other worn items. + NetHack 3.6.7 February 3, 2023 - NetHack 3.6 February 3, 2023 + NetHack Guidebook 33 - NetHack Guidebook 36 + 6.4. Bones levels + You may encounter the shades and corpses of other adventurers (or + even former incarnations of yourself!) and their personal effects. + Ghosts are hard to kill, but easy to avoid, since they're slow and do + little damage. You can plunder the deceased adventurer's possessions; + however, they are likely to be cursed. Beware of whatever killed the + former player; it is probably still lurking around, gloating over its + last victory. - Those of you in the audience who are AD&D players, be aware - that each weapon which existed in AD&D does roughly the same dam- - age to monsters in NetHack. Some of the more obscure weapons - (such as the aklys, lucern hammer, and bec-de-corbin) are defined - in an appendix to Unearthed Arcana, an AD&D supplement. + 6.5. Persistence of Monsters - The commands to use weapons are `w' (wield), `t' (throw), - `f' (fire, an alternate way of throwing), `Q' (quiver), `x' (ex- - change), `X' (twoweapon), and "#enhance" (see below). + Monsters (a generic reference which also includes humans and + pets) are only shown while they can be seen or otherwise sensed. Mov- + ing to a location where you can't see or sense a monster any more will + result in it disappearing from your map, similarly if it is the one + who moved rather than you. - 7.2.1. Throwing and shooting + However, if you encounter a monster which you can't see or sense + -- perhaps it is invisible and has just tapped you on the noggin -- a + special "remembered, unseen monster" marker will be displayed at the + location where you think it is. That will persist until you have + proven that there is no monster there, even if the unseen monster + moves to another location or you move to a spot where the marker's + location ordinarily wouldn't be seen any more. - You can throw just about anything via the `t' command. It - will prompt for the item to throw; picking `?' will list things - in your inventory which are considered likely to be thrown, or - picking `*' will list your entire inventory. After you've chosen - what to throw, you will be prompted for a direction rather than - for a specific target. The distance something can be thrown de- - pends mainly on the type of object and your strength. Arrows can - be thrown by hand, but can be thrown much farther and will be - more likely to hit when thrown while you are wielding a bow. + 7. Objects - You can simplify the throwing operation by using the `Q' - command to select your preferred "missile", then using the `f' - command to throw it. You'll be prompted for a direction as - above, but you don't have to specify which item to throw each - time you use `f'. There is also an option, autoquiver, which has - NetHack choose another item to automatically fill your quiver (or - quiver sack, or have at the ready) when the inventory slot used - for `Q' runs out. + When you find something in the dungeon, it is common to want to + pick it up. In NetHack, this is accomplished automatically by walking + over the object (unless you turn off the autopickup option (see + below), or move with the `m' prefix (see above)), or manually by using + the `,' command. - Some characters have the ability to fire a volley of multi- - ple items in a single turn. Knowing how to load several rounds - of ammunition at once -- or hold several missiles in your hand -- - and still hit a target is not an easy task. Rangers are among - those who are adept at this task, as are those with a high level - of proficiency in the relevant weapon skill (in bow skill if - you're wielding one to shoot arrows, in crossbow skill if you're - wielding one to shoot bolts, or in sling skill if you're wielding - one to shoot stones). The number of items that the character has - a chance to fire varies from turn to turn. You can explicitly - limit the number of shots by using a numeric prefix before the - `t' or `f' command. For example, "2f" (or "n2f" if using num- - ber_pad mode) would ensure that at most 2 arrows are shot even if - you could have fired 3. If you specify a larger number than - would have been shot ("4f" in this example), you'll just end up - shooting the same number (3, here) as if no limit had been speci- - fied. Once the volley is in motion, all of the items will travel - in the same direction; if the first ones kill a monster, the oth- - ers can still continue beyond that spot. + If you're carrying too many items, NetHack will tell you so and + you won't be able to pick up anything more. Otherwise, it will add + the object(s) to your pack and tell you what you just picked up. + As you add items to your inventory, you also add the weight of + that object to your load. The amount that you can carry depends on + your strength and your constitution. The stronger and sturdier you + are, the less the additional load will affect you. There comes a + point, though, when the weight of all of that stuff you are carrying + around with you through the dungeon will encumber you. Your reactions + will get slower and you'll burn calories faster, requiring food more + frequently to cope with it. Eventually, you'll be so overloaded that + you'll either have to discard some of what you're carrying or collapse + under its weight. + NetHack will tell you how badly you have loaded yourself. If you + are encumbered, one of the conditions "Burdened", "Stressed", + "Strained", "Overtaxed" or "Overloaded" will be shown on the bottom + line status display. + NetHack 3.6.7 February 3, 2023 - NetHack 3.6 February 3, 2023 + NetHack Guidebook 34 - NetHack Guidebook 37 + When you pick up an object, it is assigned an inventory letter. + Many commands that operate on objects must ask you to find out which + object you want to use. When NetHack asks you to choose a particular + object you are carrying, you are usually presented with a list of + inventory letters to choose from (see Commands, above). - 7.2.2. Weapon proficiency + Some objects, such as weapons, are easily differentiated. Oth- + ers, like scrolls and potions, are given descriptions which vary + according to type. During a game, any two objects with the same + description are the same type. However, the descriptions will vary + from game to game. - You will have varying degrees of skill in the weapons avail- - able. Weapon proficiency, or weapon skills, affect how well you - can use particular types of weapons, and you'll be able to im- - prove your skills as you progress through a game, depending on - your role, your experience level, and use of the weapons. + When you use one of these objects, if its effect is obvious, + NetHack will remember what it is for you. If its effect isn't + extremely obvious, you will be asked what you want to call this type + of object so you will recognize it later. You can also use the + "#name" command, for the same purpose at any time, to name all objects + of a particular type or just an individual object. When you use + "#name" on an object which has already been named, specifying a space + as the value will remove the prior name instead of assigning a new + one. - For the purposes of proficiency, weapons have been divided - up into various groups such as daggers, broadswords, and - polearms. Each role has a limit on what level of proficiency a - character can achieve for each group. For instance, wizards can - become highly skilled in daggers or staves but not in swords or - bows. + 7.1. Curses and Blessings - The "#enhance" extended command is used to review current - weapons proficiency (also spell proficiency) and to choose which - skill(s) to improve when you've used one or more skills enough to - become eligible to do so. The skill rankings are "none" (some- - times also referred to as "restricted", because you won't be able - to advance), "unskilled", "basic", "skilled", and "expert". Re- - stricted skills simply will not appear in the list shown by "#en- - hance". (Divine intervention might unrestrict a particular - skill, in which case it will start at unskilled and be limited to - basic.) Some characters can enhance their barehanded combat or - martial arts skill beyond expert to "master" or "grand master". + Any object that you find may be cursed, even if the object is + otherwise helpful. The most common effect of a curse is being stuck + with (and to) the item. Cursed weapons weld themselves to your hand + when wielded, so you cannot unwield them. Any cursed item you wear is + not removable by ordinary means. In addition, cursed arms and armor + usually, but not always, bear negative enchantments that make them + less effective in combat. Other cursed objects may act poorly or + detrimentally in other ways. - Use of a weapon in which you're restricted or unskilled will - incur a modest penalty in the chance to hit a monster and also in - the amount of damage done when you do hit; at basic level, there - is no penalty or bonus; at skilled level, you receive a modest - bonus in the chance to hit and amount of damage done; at expert - level, the bonus is higher. A successful hit has a chance to - boost your training towards the next skill level (unless you've - already reached the limit for this skill). Once such training - reaches the threshold for that next level, you'll be told that - you feel more confident in your skills. At that point you can - use "#enhance" to increase one or more skills. Such skills are - not increased automatically because there is a limit to your to- - tal overall skills, so you need to actively choose which skills - to enhance and which to ignore. + Objects can also be blessed. Blessed items usually work better + or more beneficially than normal uncursed items. For example, a + blessed weapon will do more damage against demons. - 7.2.3. Two-Weapon combat + Objects which are neither cursed nor blessed are referred to as + uncursed. They could just as easily have been described as unblessed, + but the uncursed designation is what you will see within the game. A + "glass half full versus glass half empty" situation; make of that what + you will. - Some characters can use two weapons at once. Setting things - up to do so can seem cumbersome but becomes second nature with - use. To wield two weapons, you need to use the "#twoweapon" com- - mand. But first you need to have a weapon in each hand. (Note - that your two weapons are not fully equal; the one in the hand - you normally wield with is considered primary and the other one - is considered secondary. The most noticeable difference is after - you stop -- or before you begin, for that matter -- wielding two - weapons at once. The primary is your wielded weapon and the sec- - ondary is just an item in your inventory that's been designated + There are magical means of bestowing or removing curses upon + objects, so even if you are stuck with one, you can still have the + curse lifted and the item removed. Priests and Priestesses have an + innate sensitivity to this property in any object, so they can more + easily avoid cursed objects than other character roles. + An item with unknown status will be reported in your inventory + with no prefix. An item which you know the state of will be distin- + guished in your inventory by the presence of the word "cursed", + "uncursed" or "blessed" in the description of the item. In some cases + "uncursed" will be omitted as being redundant when enough other infor- - NetHack 3.6 February 3, 2023 + NetHack 3.6.7 February 3, 2023 - NetHack Guidebook 38 + NetHack Guidebook 35 - as alternate weapon.) - If your primary weapon is wielded but your off hand is empty - or has the wrong weapon, use the sequence `x', `w', `x' to first - swap your primary into your off hand, wield whatever you want as - secondary weapon, then swap them both back into the intended - hands. If your secondary or alternate weapon is correct but your - primary one is not, simply use `w' to wield the primary. Lastly, - if neither hand holds the correct weapon, use `w', `x', `w' to - first wield the intended secondary, swap it to off hand, and then - wield the primary. + mation is displayed. The implicit_uncursed option can be used to con- + trol this; toggle it off to have "uncursed" be displayed even when + that can be deduced from other attributes. - The whole process can be simplified via use of the push- - weapon option. When it is enabled, then using `w' to wield some- - thing causes the currently wielded weapon to become your alter- - nate weapon. So the sequence `w', `w' can be used to first wield - the weapon you intend to be secondary, and then wield the one you - want as primary which will push the first into secondary posi- - tion. + 7.2. Weapons (`)') - When in two-weapon combat mode, using the `X' command tog- - gles back to single-weapon mode. Throwing or dropping either of - the weapons or having one of them be stolen or destroyed will al- - so make you revert to single-weapon combat. + Given a chance, most monsters in the Mazes of Menace will gratu- + itously try to kill you. You need weapons for self-defense (killing + them first). Without a weapon, you do only 1-2 hit points of damage + (plus bonuses, if any). Monk characters are an exception; they nor- + mally do more damage with bare (or gloved) hands than they do with + weapons. - 7.3. Armor (`[') + There are wielded weapons, like maces and swords, and thrown + weapons, like arrows and spears. To hit monsters with a weapon, you + must wield it and attack them, or throw it at them. You can simply + elect to throw a spear. To shoot an arrow, you should first wield a + bow, then throw the arrow. Crossbows shoot crossbow bolts. Slings + hurl rocks and (other) stones (like gems). - Lots of unfriendly things lurk about; you need armor to pro- - tect yourself from their blows. Some types of armor offer better - protection than others. Your armor class is a measure of this - protection. Armor class (AC) is measured as in AD&D, with 10 be- - ing the equivalent of no armor, and lower numbers meaning better - armor. Each suit of armor which exists in AD&D gives the same - protection in NetHack. Here is an (incomplete) list of the armor - classes provided by various suits of armor: - dragon scale mail 1 - plate mail 3 - crystal plate mail 3 - bronze plate mail 4 - splint mail 4 - banded mail 4 - dwarvish mithril-coat 4 - elven mithril-coat 5 - chain mail 5 - orcish chain mail 6 - scale mail 6 - dragon scales 7 - studded leather armor 7 - ring mail 7 - orcish ring mail 8 - leather armor 8 - leather jacket 9 - no armor 10 + Enchanted weapons have a "plus" (or "to hit enhancement" which + can be either positive or negative) that adds to your chance to hit + and the damage you do to a monster. The only way to determine a + weapon's enchantment is to have it magically identified somehow. Most + weapons are subject to some type of damage like rust. Such "erosion" + damage can be repaired. + The chance that an attack will successfully hit a monster, and + the amount of damage such a hit will do, depends upon many factors. + Among them are: type of weapon, quality of weapon (enchantment and/or + erosion), experience level, strength, dexterity, encumbrance, and pro- + ficiency (see below). The monster's armor class -- a general defense + rating, not necessarily due to wearing of armor -- is a factor too; + also, some monsters are particularly vulnerable to certain types of + weapons. + Many weapons can be wielded in one hand; some require both hands. + When wielding a two-handed weapon, you can not wear a shield, and vice + versa. When wielding a one-handed weapon, you can have another weapon + ready to use by setting things up with the `x' command, which + exchanges your primary (the one being wielded) and alternate weapons. + And if you have proficiency in the "two weapon combat" skill, you may + wield both weapons simultaneously as primary and secondary; use the + `X' command to engage or disengage that. Only some types of charac- + ters (barbarians, for instance) have the necessary skill available. + Even with that skill, using two weapons at once incurs a penalty in + the chance to hit your target compared to using just one weapon at a + time. - NetHack 3.6 February 3, 2023 + There might be times when you'd rather not wield any weapon at + all. To accomplish that, wield `-', or else use the `A' command which + allows you to unwield the current weapon in addition to taking off + other worn items. + NetHack 3.6.7 February 3, 2023 - NetHack Guidebook 39 - You can also wear other pieces of armor (for example hel- - mets, boots, shields, cloaks) to lower your armor class even fur- - ther, but you can only wear one item of each category (one suit - of armor, one cloak, one helmet, one shield, and so on) at a - time. + NetHack Guidebook 36 - If a piece of armor is enchanted, its armor protection will - be better (or worse) than normal, and its "plus" (or minus) will - subtract from your armor class. For example, a +1 chain mail - would give you better protection than normal chain mail, lowering - your armor class one unit further to 4. When you put on a piece - of armor, you immediately find out the armor class and any - "plusses" it provides. Cursed pieces of armor usually have nega- - tive enchantments (minuses) in addition to being unremovable. - Many types of armor are subject to some kind of damage like - rust. Such damage can be repaired. Some types of armor may in- - hibit spell casting. - The commands to use armor are `W' (wear) and `T' (take off). - The `A' command can also be used to take off armor as well as - other worn items. + Those of you in the audience who are AD&D players, be aware that + each weapon which existed in AD&D does roughly the same damage to mon- + sters in NetHack. Some of the more obscure weapons (such as the + aklys, lucern hammer, and bec-de-corbin) are defined in an appendix to + Unearthed Arcana, an AD&D supplement. - 7.4. Food (`%') + The commands to use weapons are `w' (wield), `t' (throw), `f' + (fire, an alternate way of throwing), `Q' (quiver), `x' (exchange), + `X' (twoweapon), and "#enhance" (see below). - Food is necessary to survive. If you go too long without - eating you will faint, and eventually die of starvation. Some - types of food will spoil, and become unhealthy to eat, if not - protected. Food stored in ice boxes or tins ("cans") will usual- - ly stay fresh, but ice boxes are heavy, and tins take a while to - open. + 7.2.1. Throwing and shooting - When you kill monsters, they usually leave corpses which are - also "food." Many, but not all, of these are edible; some also - give you special powers when you eat them. A good rule of thumb - is "you are what you eat." + You can throw just about anything via the `t' command. It will + prompt for the item to throw; picking `?' will list things in your + inventory which are considered likely to be thrown, or picking `*' + will list your entire inventory. After you've chosen what to throw, + you will be prompted for a direction rather than for a specific tar- + get. The distance something can be thrown depends mainly on the type + of object and your strength. Arrows can be thrown by hand, but can be + thrown much farther and will be more likely to hit when thrown while + you are wielding a bow. - Some character roles and some monsters are vegetarian. Veg- - etarian monsters will typically never eat animal corpses, while - vegetarian players can, but with some rather unpleasant side-ef- - fects. + You can simplify the throwing operation by using the `Q' command + to select your preferred "missile", then using the `f' command to + throw it. You'll be prompted for a direction as above, but you don't + have to specify which item to throw each time you use `f'. There is + also an option, autoquiver, which has NetHack choose another item to + automatically fill your quiver (or quiver sack, or have at the ready) + when the inventory slot used for `Q' runs out. - You can name one food item after something you like to eat - with the fruit option. + Some characters have the ability to fire a volley of multiple + items in a single turn. Knowing how to load several rounds of ammuni- + tion at once -- or hold several missiles in your hand -- and still hit + a target is not an easy task. Rangers are among those who are adept + at this task, as are those with a high level of proficiency in the + relevant weapon skill (in bow skill if you're wielding one to shoot + arrows, in crossbow skill if you're wielding one to shoot bolts, or in + sling skill if you're wielding one to shoot stones). The number of + items that the character has a chance to fire varies from turn to + turn. You can explicitly limit the number of shots by using a numeric + prefix before the `t' or `f' command. For example, "2f" (or "n2f" if + using number_pad mode) would ensure that at most 2 arrows are shot + even if you could have fired 3. If you specify a larger number than + would have been shot ("4f" in this example), you'll just end up shoot- + ing the same number (3, here) as if no limit had been specified. Once + the volley is in motion, all of the items will travel in the same + direction; if the first ones kill a monster, the others can still con- + tinue beyond that spot. - The command to eat food is `e'. + 7.2.2. Weapon proficiency - 7.5. Scrolls (`?') + You will have varying degrees of skill in the weapons available. + Weapon proficiency, or weapon skills, affect how well you can use par- + ticular types of weapons, and you'll be able to improve your skills as - Scrolls are labeled with various titles, probably chosen by - ancient wizards for their amusement value (for example "READ ME," - or "THANX MAUD" backwards). Scrolls disappear after you read - them (except for blank ones, without magic spells on them). + NetHack 3.6.7 February 3, 2023 - NetHack 3.6 February 3, 2023 + NetHack Guidebook 37 - NetHack Guidebook 40 + you progress through a game, depending on your role, your experience + level, and use of the weapons. + For the purposes of proficiency, weapons have been divided up + into various groups such as daggers, broadswords, and polearms. Each + role has a limit on what level of proficiency a character can achieve + for each group. For instance, wizards can become highly skilled in + daggers or staves but not in swords or bows. + + The "#enhance" extended command is used to review current weapons + proficiency (also spell proficiency) and to choose which skill(s) to + improve when you've used one or more skills enough to become eligible + to do so. The skill rankings are "none" (sometimes also referred to + as "restricted", because you won't be able to advance), "unskilled", + "basic", "skilled", and "expert". Restricted skills simply will not + appear in the list shown by "#enhance". (Divine intervention might + unrestrict a particular skill, in which case it will start at + unskilled and be limited to basic.) Some characters can enhance their + barehanded combat or martial arts skill beyond expert to "master" or + "grand master". - One of the most useful of these is the scroll of identify, - which can be used to determine what another object is, whether it - is cursed or blessed, and how many uses it has left. Some ob- - jects of subtle enchantment are difficult to identify without - these. + Use of a weapon in which you're restricted or unskilled will + incur a modest penalty in the chance to hit a monster and also in the + amount of damage done when you do hit; at basic level, there is no + penalty or bonus; at skilled level, you receive a modest bonus in the + chance to hit and amount of damage done; at expert level, the bonus is + higher. A successful hit has a chance to boost your training towards + the next skill level (unless you've already reached the limit for this + skill). Once such training reaches the threshold for that next level, + you'll be told that you feel more confident in your skills. At that + point you can use "#enhance" to increase one or more skills. Such + skills are not increased automatically because there is a limit to + your total overall skills, so you need to actively choose which skills + to enhance and which to ignore. + + 7.2.3. Two-Weapon combat - A mail daemon may run up and deliver mail to you as a scroll - of mail (on versions compiled with this feature). To use this - feature on versions where NetHack mail delivery is triggered by - electronic mail appearing in your system mailbox, you must let - NetHack know where to look for new mail by setting the "MAIL" en- - vironment variable to the file name of your mailbox. You may al- - so want to set the "MAILREADER" environment variable to the file - name of your favorite reader, so NetHack can shell to it when you - read the scroll. On versions of NetHack where mail is randomly - generated internal to the game, these environment variables are - ignored. You can disable the mail daemon by turning off the mail - option. + Some characters can use two weapons at once. Setting things up + to do so can seem cumbersome but becomes second nature with use. To + wield two weapons, you need to use the "#twoweapon" command. But + first you need to have a weapon in each hand. (Note that your two + weapons are not fully equal; the one in the hand you normally wield + with is considered primary and the other one is considered secondary. + The most noticeable difference is after you stop -- or before you + begin, for that matter -- wielding two weapons at once. The primary + is your wielded weapon and the secondary is just an item in your + inventory that's been designated as alternate weapon.) - The command to read a scroll is `r'. + If your primary weapon is wielded but your off hand is empty or + has the wrong weapon, use the sequence `x', `w', `x' to first swap + your primary into your off hand, wield whatever you want as secondary + weapon, then swap them both back into the intended hands. If your + secondary or alternate weapon is correct but your primary one is not, + simply use `w' to wield the primary. Lastly, if neither hand holds - 7.6. Potions (`!') - Potions are distinguished by the color of the liquid inside - the flask. They disappear after you quaff them. + NetHack 3.6.7 February 3, 2023 - Clear potions are potions of water. Sometimes these are - blessed or cursed, resulting in holy or unholy water. Holy water - is the bane of the undead, so potions of holy water are good - things to throw (`t') at them. It is also sometimes very useful - to dip ("#dip") an object into a potion. - The command to drink a potion is `q' (quaff). - 7.7. Wands (`/') - Wands usually have multiple magical charges. Some types of - wands require a direction in which to zap them. You can also zap - them at yourself (just give a `.' or `s' for the direction). Be - warned, however, for this is often unwise. Other types of wands - don't require a direction. The number of charges in a wand is - random and decreases by one whenever you use it. - When the number of charges left in a wand becomes zero, at- - tempts to use the wand will usually result in nothing happening. - Occasionally, however, it may be possible to squeeze the last few - mana points from an otherwise spent wand, destroying it in the - process. A wand may be recharged by using suitable magic, but - doing so runs the risk of causing it to explode. The chance for - such an explosion starts out very small and increases each time - the wand is recharged. + NetHack Guidebook 38 - In a truly desperate situation, when your back is up against - the wall, you might decide to go for broke and break your wand. - NetHack 3.6 February 3, 2023 + the correct weapon, use `w', `x', `w' to first wield the intended sec- + ondary, swap it to off hand, and then wield the primary. + The whole process can be simplified via use of the pushweapon + option. When it is enabled, then using `w' to wield something causes + the currently wielded weapon to become your alternate weapon. So the + sequence `w', `w' can be used to first wield the weapon you intend to + be secondary, and then wield the one you want as primary which will + push the first into secondary position. + When in two-weapon combat mode, using the `X' command toggles + back to single-weapon mode. Throwing or dropping either of the weap- + ons or having one of them be stolen or destroyed will also make you + revert to single-weapon combat. + 7.3. Armor (`[') + Lots of unfriendly things lurk about; you need armor to protect + yourself from their blows. Some types of armor offer better protec- + tion than others. Your armor class is a measure of this protection. + Armor class (AC) is measured as in AD&D, with 10 being the equivalent + of no armor, and lower numbers meaning better armor. Each suit of + armor which exists in AD&D gives the same protection in NetHack. Here + is an (incomplete) list of the armor classes provided by various suits + of armor: + dragon scale mail 1 + plate mail 3 + crystal plate mail 3 + bronze plate mail 4 + splint mail 4 + banded mail 4 + dwarvish mithril-coat 4 + elven mithril-coat 5 + chain mail 5 + orcish chain mail 6 + scale mail 6 + dragon scales 7 + studded leather armor 7 + ring mail 7 + orcish ring mail 8 + leather armor 8 + leather jacket 9 + no armor 10 - NetHack Guidebook 41 + You can also wear other pieces of armor (for example helmets, + boots, shields, cloaks) to lower your armor class even further, but + you can only wear one item of each category (one suit of armor, one + cloak, one helmet, one shield, and so on) at a time. + If a piece of armor is enchanted, its armor protection will be + better (or worse) than normal, and its "plus" (or minus) will subtract + from your armor class. For example, a +1 chain mail would give you + better protection than normal chain mail, lowering your armor class + one unit further to 4. When you put on a piece of armor, you immedi- - This is not for the faint of heart. Doing so will almost cer- - tainly cause a catastrophic release of magical energies. + NetHack 3.6.7 February 3, 2023 - When you have fully identified a particular wand, inventory - display will include additional information in parentheses: the - number of times it has been recharged followed by a colon and - then by its current number of charges. A current charge count of - -1 is a special case indicating that the wand has been cancelled. - The command to use a wand is `z' (zap). To break one, use - the `a' (apply) command. - 7.8. Rings (`=') - Rings are very useful items, since they are relatively per- - manent magic, unlike the usually fleeting effects of potions, - scrolls, and wands. - Putting on a ring activates its magic. You can wear only - two rings, one on each ring finger. + NetHack Guidebook 39 - Most rings also cause you to grow hungry more rapidly, the - rate varying with the type of ring. - The commands to use rings are `P' (put on) and `R' (remove). - 7.9. Spellbooks (`+') + ately find out the armor class and any "plusses" it provides. Cursed + pieces of armor usually have negative enchantments (minuses) in addi- + tion to being unremovable. - Spellbooks are tomes of mighty magic. When studied with the - `r' (read) command, they transfer to the reader the knowledge of - a spell (and therefore eventually become unreadable) -- unless - the attempt backfires. Reading a cursed spellbook or one with - mystic runes beyond your ken can be harmful to your health! + Many types of armor are subject to some kind of damage like rust. + Such damage can be repaired. Some types of armor may inhibit spell + casting. - A spell (even when learned) can also backfire when you cast - it. If you attempt to cast a spell well above your experience - level, or if you have little skill with the appropriate spell - type, or cast it at a time when your luck is particularly bad, - you can end up wasting both the energy and the time required in - casting. + The commands to use armor are `W' (wear) and `T' (take off). The + `A' command can also be used to take off armor as well as other worn + items. - Casting a spell calls forth magical energies and focuses - them with your naked mind. Some of the magical energy released - comes from within you. Casting temporarily drains your magical - power, which will slowly be recovered, and causes you to need ad- - ditional food. Casting of spells also requires practice. With - practice, your skill in each category of spell casting will im- - prove. Over time, however, your memory of each spell will dim, - and you will need to relearn it. + 7.4. Food (`%') - Some spells require a direction in which to cast them, simi- - lar to wands. To cast one at yourself, just give a `.' or `s' - for the direction. A few spells require you to pick a target lo- - cation rather than just specify a particular direction. Other + Food is necessary to survive. If you go too long without eating + you will faint, and eventually die of starvation. Some types of food + will spoil, and become unhealthy to eat, if not protected. Food + stored in ice boxes or tins ("cans") will usually stay fresh, but ice + boxes are heavy, and tins take a while to open. + When you kill monsters, they usually leave corpses which are also + "food." Many, but not all, of these are edible; some also give you + special powers when you eat them. A good rule of thumb is "you are + what you eat." - NetHack 3.6 February 3, 2023 + Some character roles and some monsters are vegetarian. Vegetar- + ian monsters will typically never eat animal corpses, while vegetarian + players can, but with some rather unpleasant side-effects. + You can name one food item after something you like to eat with + the fruit option. + The command to eat food is `e'. + 7.5. Scrolls (`?') + Scrolls are labeled with various titles, probably chosen by + ancient wizards for their amusement value (for example "READ ME," or + "THANX MAUD" backwards). Scrolls disappear after you read them + (except for blank ones, without magic spells on them). - NetHack Guidebook 42 + One of the most useful of these is the scroll of identify, which + can be used to determine what another object is, whether it is cursed + or blessed, and how many uses it has left. Some objects of subtle + enchantment are difficult to identify without these. + A mail daemon may run up and deliver mail to you as a scroll of + mail (on versions compiled with this feature). To use this feature on + versions where NetHack mail delivery is triggered by electronic mail + appearing in your system mailbox, you must let NetHack know where to + look for new mail by setting the "MAIL" environment variable to the + file name of your mailbox. You may also want to set the "MAILREADER" + environment variable to the file name of your favorite reader, so + NetHack can shell to it when you read the scroll. On versions of - spells don't require any direction or target. + NetHack 3.6.7 February 3, 2023 - Just as weapons are divided into groups in which a character - can become proficient (to varying degrees), spells are similarly - grouped. Successfully casting a spell exercises its skill group; - using the "#enhance" command to advance a sufficiently exercised - skill will affect all spells within the group. Advanced skill - may increase the potency of spells, reduce their risk of failure - during casting attempts, and improve the accuracy of the estimate - for how much longer they will be retained in your memory. Skill - slots are shared with weapons skills. (See also the section on - "Weapon proficiency".) - Casting a spell also requires flexible movement, and wearing - various types of armor may interfere with that. - The command to read a spellbook is the same as for scrolls, - `r' (read). The `+' command lists each spell you know along with - its level, skill category, chance of failure when casting, and an - estimate of how strongly it is remembered. The `Z' (cast) com- - mand casts a spell. - 7.10. Tools (`(') - Tools are miscellaneous objects with various purposes. Some - tools have a limited number of uses, akin to wand charges. For - example, lamps burn out after a while. Other tools are contain- - ers, which objects can be placed into or taken out of. + NetHack Guidebook 40 - The command to use a tool is `a' (apply). - 7.10.1. Containers - You may encounter bags, boxes, and chests in your travels. - A tool of this sort can be opened with the "#loot" extended com- - mand when you are standing on top of it (that is, on the same - floor spot), or with the `a' (apply) command when you are carry- - ing it. However, chests are often locked, and are in any case - unwieldy objects. You must set one down before unlocking it by - using a key or lock-picking tool with the `a' (apply) command, by - kicking it with the `^D' command, or by using a weapon to force - the lock with the "#force" extended command. + NetHack where mail is randomly generated internal to the game, these + environment variables are ignored. You can disable the mail daemon by + turning off the mail option. - Some chests are trapped, causing nasty things to happen when - you unlock or open them. You can check for and try to deactivate - traps with the "#untrap" extended command. + The command to read a scroll is `r'. - 7.11. Amulets (`"') + 7.6. Potions (`!') - Amulets are very similar to rings, and often more powerful. - Like rings, amulets have various magical properties, some benefi- - cial, some harmful, which are activated by putting them on. + Potions are distinguished by the color of the liquid inside the + flask. They disappear after you quaff them. + Clear potions are potions of water. Sometimes these are blessed + or cursed, resulting in holy or unholy water. Holy water is the bane + of the undead, so potions of holy water are good things to throw (`t') + at them. It is also sometimes very useful to dip ("#dip") an object + into a potion. + The command to drink a potion is `q' (quaff). + 7.7. Wands (`/') - NetHack 3.6 February 3, 2023 + Wands usually have multiple magical charges. Some types of wands + require a direction in which to zap them. You can also zap them at + yourself (just give a `.' or `s' for the direction). Be warned, how- + ever, for this is often unwise. Other types of wands don't require a + direction. The number of charges in a wand is random and decreases by + one whenever you use it. + When the number of charges left in a wand becomes zero, attempts + to use the wand will usually result in nothing happening. Occasion- + ally, however, it may be possible to squeeze the last few mana points + from an otherwise spent wand, destroying it in the process. A wand + may be recharged by using suitable magic, but doing so runs the risk + of causing it to explode. The chance for such an explosion starts out + very small and increases each time the wand is recharged. + In a truly desperate situation, when your back is up against the + wall, you might decide to go for broke and break your wand. This is + not for the faint of heart. Doing so will almost certainly cause a + catastrophic release of magical energies. + When you have fully identified a particular wand, inventory dis- + play will include additional information in parentheses: the number of + times it has been recharged followed by a colon and then by its cur- + rent number of charges. A current charge count of -1 is a special + case indicating that the wand has been cancelled. + The command to use a wand is `z' (zap). To break one, use the + `a' (apply) command. - NetHack Guidebook 43 + 7.8. Rings (`=') + Rings are very useful items, since they are relatively permanent + magic, unlike the usually fleeting effects of potions, scrolls, and - Only one amulet may be worn at a time, around your neck. + NetHack 3.6.7 February 3, 2023 - The commands to use amulets are the same as for rings, `P' - (put on) and `R' (remove). - 7.12. Gems (`*') - Some gems are valuable, and can be sold for a lot of gold. - They are also a far more efficient way of carrying your riches. - Valuable gems increase your score if you bring them with you when - you exit. - Other small rocks are also categorized as gems, but they are - much less valuable. All rocks, however, can be used as projec- - tile weapons (if you have a sling). In the most desperate of - cases, you can still throw them by hand. - 7.13. Large rocks (``') + NetHack Guidebook 41 - Statues and boulders are not particularly useful, and are - generally heavy. It is rumored that some statues are not what - they seem. - Very large humanoids (giants and their ilk) have been known - to use boulders as weapons. - For some configurations of the program, statues are no - longer shown as ``' but by the letter representing the monster - they depict instead. + wands. - 7.14. Gold (`$') + Putting on a ring activates its magic. You can wear only two + rings, one on each ring finger. - Gold adds to your score, and you can buy things in shops - with it. There are a number of monsters in the dungeon that may - be influenced by the amount of gold you are carrying (shopkeepers - aside). + Most rings also cause you to grow hungry more rapidly, the rate + varying with the type of ring. - 7.15. Persistence of Objects + The commands to use rings are `P' (put on) and `R' (remove). - Normally, if you have seen an object at a particular map lo- - cation and move to another location where you can't directly see - that object any more, it will continue to be displayed on your - map. That remains the case even if it is not actually there any - more -- perhaps a monster has picked it up or it has rotted away - -- until you can see or feel that location again. One notable - exception is that if the object gets covered by the "remembered, - unseen monster" marker. When that marker is later removed after - you've verified that no monster is there, you will forget that - there was any object there regardless of whether the unseen mon- - ster actually took the object. If the object is still there, - then once you see or feel that location again you will re-discov- - er the object and resume remembering it. + 7.9. Spellbooks (`+') + Spellbooks are tomes of mighty magic. When studied with the `r' + (read) command, they transfer to the reader the knowledge of a spell + (and therefore eventually become unreadable) -- unless the attempt + backfires. Reading a cursed spellbook or one with mystic runes beyond + your ken can be harmful to your health! + A spell (even when learned) can also backfire when you cast it. + If you attempt to cast a spell well above your experience level, or if + you have little skill with the appropriate spell type, or cast it at a + time when your luck is particularly bad, you can end up wasting both + the energy and the time required in casting. + Casting a spell calls forth magical energies and focuses them + with your naked mind. Some of the magical energy released comes from + within you. Casting temporarily drains your magical power, which will + slowly be recovered, and causes you to need additional food. Casting + of spells also requires practice. With practice, your skill in each + category of spell casting will improve. Over time, however, your mem- + ory of each spell will dim, and you will need to relearn it. - NetHack 3.6 February 3, 2023 + Some spells require a direction in which to cast them, similar to + wands. To cast one at yourself, just give a `.' or `s' for the direc- + tion. A few spells require you to pick a target location rather than + just specify a particular direction. Other spells don't require any + direction or target. + Just as weapons are divided into groups in which a character can + become proficient (to varying degrees), spells are similarly grouped. + Successfully casting a spell exercises its skill group; using the + "#enhance" command to advance a sufficiently exercised skill will + affect all spells within the group. Advanced skill may increase the + potency of spells, reduce their risk of failure during casting + attempts, and improve the accuracy of the estimate for how much longer + they will be retained in your memory. Skill slots are shared with + weapons skills. (See also the section on "Weapon proficiency".) + Casting a spell also requires flexible movement, and wearing var- + ious types of armor may interfere with that. + The command to read a spellbook is the same as for scrolls, `r' + (read). The `+' command lists each spell you know along with its + level, skill category, chance of failure when casting, and an estimate - NetHack Guidebook 44 + NetHack 3.6.7 February 3, 2023 - The situation is the same for a pile of objects, except that - only the top item of the pile is displayed. The hilite_pile op- - tion can be enabled in order to show an item differently when it - is the top one of a pile. - 8. Conduct - As if winning NetHack were not difficult enough, certain - players seek to challenge themselves by imposing restrictions on - the way they play the game. The game automatically tracks some - of these challenges, which can be checked at any time with the - #conduct command or at the end of the game. When you perform an - action which breaks a challenge, it will no longer be listed. - This gives players extra "bragging rights" for winning the game - with these challenges. Note that it is perfectly acceptable to - win the game without resorting to these restrictions and that it - is unusual for players to adhere to challenges the first time - they win the game. + NetHack Guidebook 42 - Several of the challenges are related to eating behavior. - The most difficult of these is the foodless challenge. Although - creatures can survive long periods of time without food, there is - a physiological need for water; thus there is no restriction on - drinking beverages, even if they provide some minor food bene- - fits. Calling upon your god for help with starvation does not - violate any food challenges either. - A strict vegan diet is one which avoids any food derived - from animals. The primary source of nutrition is fruits and veg- - etables. The corpses and tins of blobs (`b'), jellies (`j'), and - fungi (`F') are also considered to be vegetable matter. Certain - human food is prepared without animal products; namely, lembas - wafers, cram rations, food rations (gunyoki), K-rations, and C- - rations. Metal or another normally indigestible material eaten - while polymorphed into a creature that can digest it is also con- - sidered vegan food. Note however that eating such items still - counts against foodless conduct. - Vegetarians do not eat animals; however, they are less se- - lective about eating animal byproducts than vegans. In addition - to the vegan items listed above, they may eat any kind of pudding - (`P') other than the black puddings, eggs and food made from eggs - (fortune cookies and pancakes), food made with milk (cream pies - and candy bars), and lumps of royal jelly. Monks are expected to - observe a vegetarian diet. + of how strongly it is remembered. The `Z' (cast) command casts a + spell. - Eating any kind of meat violates the vegetarian, vegan, and - foodless conducts. This includes tripe rations, the corpses or - tins of any monsters not mentioned above, and the various other - chunks of meat found in the dungeon. Swallowing and digesting a - monster while polymorphed is treated as if you ate the creature's - corpse. Eating leather, dragon hide, or bone items while poly- - morphed into a creature that can digest it, or eating monster - brains while polymorphed into a mind flayer, is considered eating + 7.10. Tools (`(') + Tools are miscellaneous objects with various purposes. Some + tools have a limited number of uses, akin to wand charges. For exam- + ple, lamps burn out after a while. Other tools are containers, which + objects can be placed into or taken out of. - NetHack 3.6 February 3, 2023 + The command to use a tool is `a' (apply). + 7.10.1. Containers + You may encounter bags, boxes, and chests in your travels. A + tool of this sort can be opened with the "#loot" extended command when + you are standing on top of it (that is, on the same floor spot), or + with the `a' (apply) command when you are carrying it. However, + chests are often locked, and are in any case unwieldy objects. You + must set one down before unlocking it by using a key or lock-picking + tool with the `a' (apply) command, by kicking it with the `^D' com- + mand, or by using a weapon to force the lock with the "#force" + extended command. + Some chests are trapped, causing nasty things to happen when you + unlock or open them. You can check for and try to deactivate traps + with the "#untrap" extended command. + 7.11. Amulets (`"') - NetHack Guidebook 45 + Amulets are very similar to rings, and often more powerful. Like + rings, amulets have various magical properties, some beneficial, some + harmful, which are activated by putting them on. + Only one amulet may be worn at a time, around your neck. + The commands to use amulets are the same as for rings, `P' (put + on) and `R' (remove). - an animal, although wax is only an animal byproduct. + 7.12. Gems (`*') - Regardless of conduct, there will be some items which are - indigestible, and others which are hazardous to eat. Using a - swallow-and-digest attack against a monster is equivalent to eat- - ing the monster's corpse. Please note that the term "vegan" is - used here only in the context of diet. You are still free to - choose not to use or wear items derived from animals (e.g. - leather, dragon hide, bone, horns, coral), but the game will not - keep track of this for you. Also note that "milky" potions may - be a translucent white, but they do not contain milk, so they are - compatible with a vegan diet. Slime molds or player-defined - "fruits", although they could be anything from "cherries" to - "pork chops", are also assumed to be vegan. + Some gems are valuable, and can be sold for a lot of gold. They + are also a far more efficient way of carrying your riches. Valuable + gems increase your score if you bring them with you when you exit. - An atheist is one who rejects religion. This means that you - cannot #pray, #offer sacrifices to any god, #turn undead, or - #chat with a priest. Particularly selective readers may argue - that playing Monk or Priest characters should violate this con- - duct; that is a choice left to the player. Offering the Amulet - of Yendor to your god is necessary to win the game and is not - counted against this conduct. You are also not penalized for be- - ing spoken to by an angry god, priest(ess), or other religious - figure; a true atheist would hear the words but attach no special - meaning to them. + Other small rocks are also categorized as gems, but they are much + less valuable. All rocks, however, can be used as projectile weapons + (if you have a sling). In the most desperate of cases, you can still + throw them by hand. - Most players fight with a wielded weapon (or tool intended - to be wielded as a weapon). Another challenge is to win the game - without using such a wielded weapon. You are still permitted to - throw, fire, and kick weapons; use a wand, spell, or other type - of item; or fight with your hands and feet. + 7.13. Large rocks (``') - In NetHack, a pacifist refuses to cause the death of any - other monster (i.e. if you would get experience for the death). - This is a particularly difficult challenge, although it is still - possible to gain experience by other means. + Statues and boulders are not particularly useful, and are gener- + ally heavy. It is rumored that some statues are not what they seem. - An illiterate character cannot read or write. This includes - reading a scroll, spellbook, fortune cookie message, or t-shirt; - writing a scroll; or making an engraving of anything other than a - single "X" (the traditional signature of an illiterate person). - Reading an engraving, or any item that is absolutely necessary to - win the game, is not counted against this conduct. The identity - of scrolls and spellbooks (and knowledge of spells) in your - starting inventory is assumed to be learned from your teachers - prior to the start of the game and isn't counted. - There are several other challenges tracked by the game. It - is possible to eliminate one or more species of monsters by geno- - cide; playing without this feature is considered a challenge. - When the game offers you an opportunity to genocide monsters, you - may respond with the monster type "none" if you want to decline. - You can change the form of an item into another item of the same - type ("polypiling") or the form of your own body into another + NetHack 3.6.7 February 3, 2023 - NetHack 3.6 February 3, 2023 + NetHack Guidebook 43 - NetHack Guidebook 46 + Very large humanoids (giants and their ilk) have been known to + use boulders as weapons. + For some configurations of the program, statues are no longer + shown as ``' but by the letter representing the monster they depict + instead. - creature ("polyself") by wand, spell, or potion of polymorph; - avoiding these effects are each considered challenges. Polymor- - phing monsters, including pets, does not break either of these - challenges. Finally, you may sometimes receive wishes; a game - without an attempt to wish for any items is a challenge, as is a - game without wishing for an artifact (even if the artifact imme- - diately disappears). When the game offers you an opportunity to - make a wish for an item, you may choose "nothing" if you want to - decline. + 7.14. Gold (`$') - 9. Options + Gold adds to your score, and you can buy things in shops with it. + There are a number of monsters in the dungeon that may be influenced + by the amount of gold you are carrying (shopkeepers aside). - Due to variations in personal tastes and conceptions of how - NetHack should do things, there are options you can set to change - how NetHack behaves. + 7.15. Persistence of Objects - 9.1. Setting the options + Normally, if you have seen an object at a particular map location + and move to another location where you can't directly see that object + any more, it will continue to be displayed on your map. That remains + the case even if it is not actually there any more -- perhaps a mon- + ster has picked it up or it has rotted away -- until you can see or + feel that location again. One notable exception is that if the object + gets covered by the "remembered, unseen monster" marker. When that + marker is later removed after you've verified that no monster is + there, you will forget that there was any object there regardless of + whether the unseen monster actually took the object. If the object is + still there, then once you see or feel that location again you will + re-discover the object and resume remembering it. - Options may be set in a number of ways. Within the game, - the `O' command allows you to view all options and change most of - them. You can also set options automatically by placing them in - a configuration file, or in the NETHACKOPTIONS environment vari- - able. Some versions of NetHack also have front-end programs that - allow you to set options before starting the game or a global - configuration for system administrators. + The situation is the same for a pile of objects, except that only + the top item of the pile is displayed. The hilite_pile option can be + enabled in order to show an item differently when it is the top one of + a pile. - 9.2. Using a configuration file + 8. Conduct - The default name of the configuration file varies on differ- - ent operating systems. + As if winning NetHack were not difficult enough, certain players + seek to challenge themselves by imposing restrictions on the way they + play the game. The game automatically tracks some of these chal- + lenges, which can be checked at any time with the #conduct command or + at the end of the game. When you perform an action which breaks a + challenge, it will no longer be listed. This gives players extra + "bragging rights" for winning the game with these challenges. Note + that it is perfectly acceptable to win the game without resorting to + these restrictions and that it is unusual for players to adhere to + challenges the first time they win the game. - On UNIX, Linux, and Mac OS X it is ".nethackrc" in the us- - er's home directory. The file may not exist, but it is a normal - ASCII text file and can be created with any text editor. + Several of the challenges are related to eating behavior. The + most difficult of these is the foodless challenge. Although creatures + can survive long periods of time without food, there is a physiologi- + cal need for water; thus there is no restriction on drinking bever- + ages, even if they provide some minor food benefits. Calling upon + your god for help with starvation does not violate any food challenges + either. - On Windows, it is ".nethackrc" in the folder "\%USERPRO- - FILE%\NetHack\(rq. The file may not exist, but it is a normal - ASCII text file can can be created with any text editor. After - running NetHack for the first time, you should find a default - template for the configuration file named ".nethackrc.template" - in "\%USERPROFILE%\NetHack\(rq. If you had not created the con- - figuration file, NetHack will create the configuration file for - you using the default template file. - On MS-DOS, it is "defaults.nh" in the same folder as - nethack.exe. - Any line in the configuration file starting with `#' is - treated as a comment. Empty lines are ignored. + NetHack 3.6.7 February 3, 2023 - Any line beginning with `[' and ending in `]' is considered - a section marker. The text between the square brackets is the - section name. Lines after a section marker belong to that sec- - tion, and are ignored unless a CHOOSE statement was used to - NetHack 3.6 February 3, 2023 + NetHack Guidebook 44 - NetHack Guidebook 47 + A strict vegan diet is one which avoids any food derived from + animals. The primary source of nutrition is fruits and vegetables. + The corpses and tins of blobs (`b'), jellies (`j'), and fungi (`F') + are also considered to be vegetable matter. Certain human food is + prepared without animal products; namely, lembas wafers, cram rations, + food rations (gunyoki), K-rations, and C-rations. Metal or another + normally indigestible material eaten while polymorphed into a creature + that can digest it is also considered vegan food. Note however that + eating such items still counts against foodless conduct. + Vegetarians do not eat animals; however, they are less selective + about eating animal byproducts than vegans. In addition to the vegan + items listed above, they may eat any kind of pudding (`P') other than + the black puddings, eggs and food made from eggs (fortune cookies and + pancakes), food made with milk (cream pies and candy bars), and lumps + of royal jelly. Monks are expected to observe a vegetarian diet. + Eating any kind of meat violates the vegetarian, vegan, and food- + less conducts. This includes tripe rations, the corpses or tins of + any monsters not mentioned above, and the various other chunks of meat + found in the dungeon. Swallowing and digesting a monster while poly- + morphed is treated as if you ate the creature's corpse. Eating + leather, dragon hide, or bone items while polymorphed into a creature + that can digest it, or eating monster brains while polymorphed into a + mind flayer, is considered eating an animal, although wax is only an + animal byproduct. - select that section. Section names are case insensitive. + Regardless of conduct, there will be some items which are indi- + gestible, and others which are hazardous to eat. Using a swallow-and- + digest attack against a monster is equivalent to eating the monster's + corpse. Please note that the term "vegan" is used here only in the + context of diet. You are still free to choose not to use or wear + items derived from animals (e.g. leather, dragon hide, bone, horns, + coral), but the game will not keep track of this for you. Also note + that "milky" potions may be a translucent white, but they do not con- + tain milk, so they are compatible with a vegan diet. Slime molds or + player-defined "fruits", although they could be anything from "cher- + ries" to "pork chops", are also assumed to be vegan. - You can use different configuration statements in the file, - some of which can be used multiple times. In general, the state- - ments are written in capital letters, followed by an equals sign, - followed by settings particular to that statement. + An atheist is one who rejects religion. This means that you can- + not #pray, #offer sacrifices to any god, #turn undead, or #chat with a + priest. Particularly selective readers may argue that playing Monk or + Priest characters should violate this conduct; that is a choice left + to the player. Offering the Amulet of Yendor to your god is necessary + to win the game and is not counted against this conduct. You are also + not penalized for being spoken to by an angry god, priest(ess), or + other religious figure; a true atheist would hear the words but attach + no special meaning to them. - Here is a list of allowed statements: + Most players fight with a wielded weapon (or tool intended to be + wielded as a weapon). Another challenge is to win the game without + using such a wielded weapon. You are still permitted to throw, fire, + and kick weapons; use a wand, spell, or other type of item; or fight + with your hands and feet. - OPTIONS - There are two types of options, boolean and compound options. - Boolean options toggle a setting on or off, while compound op- - tions take more diverse values. Prefix a boolean option with - "no" or `!' to turn it off. For compound options, the option - name and value are separated by a colon. Some options are per- - sistent, and apply only to new games. You can specify multiple - OPTIONS statements, and multiple options separated by commas in - a single OPTIONS statement. (Comma separated options are pro- - cessed from right to left.) - Example: + NetHack 3.6.7 February 3, 2023 - OPTIONS=dogname:Fido - OPTIONS=!legacy,autopickup,pickup_types:$"=/!?+ - HACKDIR - Default location of files NetHack needs. On Windows HACKDIR - defaults to the location of the NetHack.exe or NetHackw.exe - file so setting HACKDIR to override that is not usually neces- - sary or recommended. - LEVELDIR - The location that in-progress level files are stored. Defaults - to HACKDIR, must be writable. - SAVEDIR - The location where saved games are kept. Defaults to HACKDIR, - must be writable. - BONESDIR - The location that bones files are kept. Defaults to HACKDIR, - must be writable. + NetHack Guidebook 45 - LOCKDIR - The location that file synchronization locks are stored. - Defaults to HACKDIR, must be writable. - TROUBLEDIR - The location that a record of game aborts and self-diagnosed - game problems is kept. Defaults to HACKDIR, must be writable. - AUTOCOMPLETE - Enable or disable an extended command autocompletion. Autocom- - pletion has no effect for the X11 windowport. You can specify + In NetHack, a pacifist refuses to cause the death of any other + monster (i.e. if you would get experience for the death). This is a + particularly difficult challenge, although it is still possible to + gain experience by other means. + An illiterate character cannot read or write. This includes + reading a scroll, spellbook, fortune cookie message, or t-shirt; writ- + ing a scroll; or making an engraving of anything other than a single + "X" (the traditional signature of an illiterate person). Reading an + engraving, or any item that is absolutely necessary to win the game, + is not counted against this conduct. The identity of scrolls and + spellbooks (and knowledge of spells) in your starting inventory is + assumed to be learned from your teachers prior to the start of the + game and isn't counted. - NetHack 3.6 February 3, 2023 + There are several other challenges tracked by the game. It is + possible to eliminate one or more species of monsters by genocide; + playing without this feature is considered a challenge. When the game + offers you an opportunity to genocide monsters, you may respond with + the monster type "none" if you want to decline. You can change the + form of an item into another item of the same type ("polypiling") or + the form of your own body into another creature ("polyself") by wand, + spell, or potion of polymorph; avoiding these effects are each consid- + ered challenges. Polymorphing monsters, including pets, does not + break either of these challenges. Finally, you may sometimes receive + wishes; a game without an attempt to wish for any items is a chal- + lenge, as is a game without wishing for an artifact (even if the arti- + fact immediately disappears). When the game offers you an opportunity + to make a wish for an item, you may choose "nothing" if you want to + decline. + 9. Options + Due to variations in personal tastes and conceptions of how + NetHack should do things, there are options you can set to change how + NetHack behaves. + 9.1. Setting the options + Options may be set in a number of ways. Within the game, the `O' + command allows you to view all options and change most of them. You + can also set options automatically by placing them in a configuration + file, or in the NETHACKOPTIONS environment variable. Some versions of + NetHack also have front-end programs that allow you to set options + before starting the game or a global configuration for system adminis- + trators. - NetHack Guidebook 48 + 9.2. Using a configuration file + The default name of the configuration file varies on different + operating systems. + On UNIX, Linux, and Mac OS X it is ".nethackrc" in the user's + home directory. The file may not exist, but it is a normal ASCII text - multiple autocompletions. To enable autocompletion, list the - extended command. Prefix the command with "!" to disable the - autocompletion for that command. - Example: + NetHack 3.6.7 February 3, 2023 - AUTOCOMPLETE=zap,!annotate - AUTOPICKUP_EXCEPTION - Set exceptions to the pickup_types option. See the "Configur- - ing Autopickup Exceptions" section. - BINDINGS - Change the key bindings of some special keys, menu accelera- - tors, or extended commands. You can specify multiple bindings. - Format is key followed by the command, separated by a colon. - See the "Changing Key Bindings" section for more information. - Example: - BIND=^X:getpos.autodescribe + NetHack Guidebook 46 - CHOOSE - Chooses at random one of the comma-separated parameters as an - active section name. Lines in other sections are ignored. - Example: - OPTIONS=color - CHOOSE=char A,char B - [char A] - OPTIONS=role:arc,race:dwa,align:law,gender:fem - [char B] - OPTIONS=role:wiz,race:elf,align:cha,gender:mal + file and can be created with any text editor. - MENUCOLOR - Highlight menu lines with different colors. See the "Configur- - ing Menu Colors" section. + On Windows, it is ".nethackrc" in the folder "\%USERPRO- + FILE%\NetHack\(rq. The file may not exist, but it is a normal ASCII + text file can can be created with any text editor. After running + NetHack for the first time, you should find a default template for the + configuration file named ".nethackrc.template" in "\%USERPRO- + FILE%\NetHack\(rq. If you had not created the configuration file, + NetHack will create the configuration file for you using the default + template file. - MSGTYPE - Change the way messages are shown in the top status line. See - the "Configuring Message Types" section. + On MS-DOS, it is "defaults.nh" in the same folder as nethack.exe. - ROGUESYMBOLS - Custom symbols for for the rogue level's symbol set. See SYM- - BOLS below. + Any line in the configuration file starting with `#' is treated + as a comment. Empty lines are ignored. - SOUND - Define a sound mapping. See the "Configuring User Sounds" sec- - tion. + Any line beginning with `[' and ending in `]' is considered a + section marker. The text between the square brackets is the section + name. Lines after a section marker belong to that section, and are + ignored unless a CHOOSE statement was used to select that section. + Section names are case insensitive. - SOUNDDIR - Define the directory that contains the sound files. See the - "Configuring User Sounds" section. + You can use different configuration statements in the file, some + of which can be used multiple times. In general, the statements are + written in capital letters, followed by an equals sign, followed by + settings particular to that statement. + Here is a list of allowed statements: - NetHack 3.6 February 3, 2023 + OPTIONS + There are two types of options, boolean and compound options. Bool- + ean options toggle a setting on or off, while compound options take + more diverse values. Prefix a boolean option with "no" or `!' to + turn it off. For compound options, the option name and value are + separated by a colon. Some options are persistent, and apply only + to new games. You can specify multiple OPTIONS statements, and mul- + tiple options separated by commas in a single OPTIONS statement. + (Comma separated options are processed from right to left.) + Example: + OPTIONS=dogname:Fido + OPTIONS=!legacy,autopickup,pickup_types:$"=/!?+ + HACKDIR + Default location of files NetHack needs. On Windows HACKDIR defaults + to the location of the NetHack.exe or NetHackw.exe file so setting + HACKDIR to override that is not usually necessary or recommended. + LEVELDIR + The location that in-progress level files are stored. Defaults to + HACKDIR, must be writable. - NetHack Guidebook 49 - SYMBOLS - Override one or more symbols in the symbol set used for all - dungeon levels except for the special rogue level. See the - "Modifying NetHack Symbols" section. + NetHack 3.6.7 February 3, 2023 - Example: - # replace small punctuation (tick marks) with digits - SYMBOLS=S_boulder:0,S_golem:7 - WIZKIT - Debug mode only: extra items to add to initial inventory. - Value is the name of a text file containing a list of item - names, one per line, up to a maximum of 128 lines. Each line - is processed by the function that handles wishing. - Example: - WIZKIT=~/wizkit.txt + NetHack Guidebook 47 - Here is an example of configuration file contents: + SAVEDIR + The location where saved games are kept. Defaults to HACKDIR, must + be writable. - # Set your character's role, race, gender, and alignment. - OPTIONS=role:Valkyrie, race:Human, gender:female, align:lawful - # - # Turn on autopickup, set automatically picked up object types - OPTIONS=autopickup,pickup_types:$"=/!?+ - # - # Map customization - OPTIONS=color # Display things in color if possible - OPTIONS=lit_corridor # Show lit corridors differently - OPTIONS=hilite_pet,hilite_pile - # Replace small punctuation (tick marks) with digits - SYMBOLS=S_boulder:0,S_golem:7 - # - # No startup splash screen. Windows GUI only. - OPTIONS=!splash_screen + BONESDIR + The location that bones files are kept. Defaults to HACKDIR, must be + writable. + LOCKDIR + The location that file synchronization locks are stored. Defaults to + HACKDIR, must be writable. + TROUBLEDIR + The location that a record of game aborts and self-diagnosed game + problems is kept. Defaults to HACKDIR, must be writable. - 9.3. Using the NETHACKOPTIONS environment variable + AUTOCOMPLETE + Enable or disable an extended command autocompletion. Autocomple- + tion has no effect for the X11 windowport. You can specify multiple + autocompletions. To enable autocompletion, list the extended com- + mand. Prefix the command with "!" to disable the autocompletion for + that command. - The NETHACKOPTIONS variable is a comma-separated list of - initial values for the various options. Some can only be turned - on or off. You turn one of these on by adding the name of the - option to the list, and turn it off by typing a `!' or "no" be- - fore the name. Others take a character string as a value. You - can set string options by typing the option name, a colon or - equals sign, and then the value of the string. The value is ter- - minated by the next comma or the end of string. + Example: + AUTOCOMPLETE=zap,!annotate + AUTOPICKUP_EXCEPTION + Set exceptions to the pickup_types option. See the "Configuring + Autopickup Exceptions" section. + BINDINGS + Change the key bindings of some special keys, menu accelerators, or + extended commands. You can specify multiple bindings. Format is + key followed by the command, separated by a colon. See the "Chang- + ing Key Bindings" section for more information. - NetHack 3.6 February 3, 2023 + Example: + BIND=^X:getpos.autodescribe + CHOOSE + Chooses at random one of the comma-separated parameters as an active + section name. Lines in other sections are ignored. + Example: + OPTIONS=color + CHOOSE=char A,char B + [char A] + OPTIONS=role:arc,race:dwa,align:law,gender:fem + [char B] + OPTIONS=role:wiz,race:elf,align:cha,gender:mal - NetHack Guidebook 50 + NetHack 3.6.7 February 3, 2023 - For example, to set up an environment variable so that color - is on, legacy is off, character name is set to "Blue Meanie", and - named fruit is set to "lime", you would enter the command - % setenv NETHACKOPTIONS "color,\!leg,name:Blue Meanie,fruit:lime" - in csh (note the need to escape the `!' since it's special to - that shell), or the pair of commands - $ NETHACKOPTIONS="color,!leg,name:Blue Meanie,fruit:lime" - $ export NETHACKOPTIONS - in sh, ksh, or bash. + NetHack Guidebook 48 - The NETHACKOPTIONS value is effectively the same as a single - OPTIONS statement in a configuration file. The "OPTIONS=" prefix - is implied and comma separated options are processed from right - to left. Other types of configuration statements such as BIND or - MSGTYPE are not allowed. - Instead of a comma-separated list of options, NETHACKOPTIONS - can be set to the full name of a configuration file you want to - use. If that full name doesn't start with a slash, precede it - with `@' (at-sign) to let NetHack know that the rest is intended - as a file name. If it does start with `/', the at-sign is op- - tional. - 9.4. Customization options + MENUCOLOR + Highlight menu lines with different colors. See the "Configuring + Menu Colors" section. - Here are explanations of what the various options do. Char- - acter strings that are too long may be truncated. Some of the - options listed may be inactive in your dungeon. + MSGTYPE + Change the way messages are shown in the top status line. See the + "Configuring Message Types" section. - Some options are persistent, and are saved and reloaded - along with the game. Changing a persistent option in the config- - uration file applies only to new games. + ROGUESYMBOLS + Custom symbols for for the rogue level's symbol set. See SYMBOLS + below. - acoustics - Enable messages about what your character hears (default on). - Note that this has nothing to do with your computer's audio ca- - pabilities. Persistent. + SOUND + Define a sound mapping. See the "Configuring User Sounds" section. - align - Your starting alignment (align:lawful, align:neutral, or - align:chaotic). You may specify just the first letter. The - default is to randomly pick an appropriate alignment. If you - prefix the value with `!' or "no", you will exclude that align- - ment from being picked randomly. Cannot be set with the `O' - command. Persistent. + SOUNDDIR + Define the directory that contains the sound files. See the "Con- + figuring User Sounds" section. - autodescribe - Automatically describe the terrain under cursor when asked to - get a location on the map (default true). The whatis_coord op- - tion controls whether the description includes map coordinates. + SYMBOLS + Override one or more symbols in the symbol set used for all dungeon + levels except for the special rogue level. See the "Modifying + NetHack Symbols" section. + Example: - NetHack 3.6 February 3, 2023 + # replace small punctuation (tick marks) with digits + SYMBOLS=S_boulder:0,S_golem:7 + WIZKIT + Debug mode only: extra items to add to initial inventory. Value is + the name of a text file containing a list of item names, one per + line, up to a maximum of 128 lines. Each line is processed by the + function that handles wishing. + Example: + WIZKIT=~/wizkit.txt - NetHack Guidebook 51 + Here is an example of configuration file contents: - autodig - Automatically dig if you are wielding a digging tool and moving - into a place that can be dug (default false). Persistent. - autoopen - Walking into a door attempts to open it (default true). Persis- - tent. - autopickup - Automatically pick up things onto which you move (default on). - Persistent. See pickup_types to refine the behavior. - autoquiver - This option controls what happens when you attempt the `f' - (fire) command when nothing is quivered or readied (default - false). When true, the computer will fill your quiver or - quiver sack or make ready some suitable weapon. Note that it - will not take into account the blessed/cursed status, enchant- - ment, damage, or quality of the weapon; you are free to manual- - ly fill your quiver or quiver sack or make ready with the `Q' - command instead. If no weapon is found or the option is false, - the `t' (throw) command is executed instead. Persistent. - blind - Start the character permanently blind (default false). Persis- - tent. - bones - Allow saving and loading bones files (default true). Persis- - tent. - boulder - Set the character used to display boulders (default is the - "large rock" class symbol, ``'). - catname - Name your starting cat (for example "catname:Morris"). Cannot - be set with the `O' command. - character - Synonym for "role" to pick the type of your character (for ex- - ample "character:Monk"). See role for more details. - checkpoint - Save game state after each level change, for possible recovery - after program crash (default on). Persistent. - checkspace - 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 - (because too much space might overflow the calculation and end - up looking like insufficient space). Only applies when MFLOPPY - was defined during compilation. - NetHack 3.6 February 3, 2023 + NetHack 3.6.7 February 3, 2023 - NetHack Guidebook 52 + NetHack Guidebook 49 - clicklook - Allows looking at things on the screen by navigating the mouse - over them and clicking the right mouse button (default off). + # Set your character's role, race, gender, and alignment. + OPTIONS=role:Valkyrie, race:Human, gender:female, align:lawful + # + # Turn on autopickup, set automatically picked up object types + OPTIONS=autopickup,pickup_types:$"=/!?+ + # + # Map customization + OPTIONS=color # Display things in color if possible + OPTIONS=lit_corridor # Show lit corridors differently + OPTIONS=hilite_pet,hilite_pile + # Replace small punctuation (tick marks) with digits + SYMBOLS=S_boulder:0,S_golem:7 + # + # No startup splash screen. Windows GUI only. + OPTIONS=!splash_screen - cmdassist - Have the game provide some additional command assistance for - new players if it detects some anticipated mistakes (default - on). - confirm - Have user confirm attacks on pets, shopkeepers, and other - peaceable creatures (default on). Persistent. - dark_room - Show out-of-sight areas of lit rooms (default on). Persistent. + 9.3. Using the NETHACKOPTIONS environment variable - disclose - Controls what information the program reveals when the game - ends. Value is a space separated list of prompting/category - pairs (default is "ni na nv ng nc no", prompt with default re- - sponse of `n' for each candidate). Persistent. The possibili- - ties are: + The NETHACKOPTIONS variable is a comma-separated list of initial + values for the various options. Some can only be turned on or off. + You turn one of these on by adding the name of the option to the list, + and turn it off by typing a `!' or "no" before the name. Others take + a character string as a value. You can set string options by typing + the option name, a colon or equals sign, and then the value of the + string. The value is terminated by the next comma or the end of + string. - i - disclose your inventory; - a - disclose your attributes; - v - summarize monsters that have been vanquished; - g - list monster species that have been genocided; - c - display your conduct; - o - display dungeon overview. + For example, to set up an environment variable so that color is + on, legacy is off, character name is set to "Blue Meanie", and named + fruit is set to "lime", you would enter the command - Each disclosure possibility can optionally be preceded by a - prefix which lets you refine how it behaves. Here are the - valid prefixes: + % setenv NETHACKOPTIONS "color,\!leg,name:Blue Meanie,fruit:lime" - y - prompt you and default to yes on the prompt; - n - prompt you and default to no on the prompt; - + - disclose it without prompting; - - - do not disclose it and do not prompt. + in csh (note the need to escape the `!' since it's special to that + shell), or the pair of commands - The listing of vanquished monsters can be sorted, so there are - two additional choices for `v': + $ NETHACKOPTIONS="color,!leg,name:Blue Meanie,fruit:lime" + $ export NETHACKOPTIONS - ? - prompt you and default to ask on the prompt; - # - disclose it without prompting, ask for sort order. + in sh, ksh, or bash. - Asking refers to picking one of the orderings from a menu. The - `+' disclose without prompting choice, or being prompted and - answering `y' rather than `a', will default to showing monsters - in the traditional order, from high level to low level. + The NETHACKOPTIONS value is effectively the same as a single + OPTIONS statement in a configuration file. The "OPTIONS=" prefix is + implied and comma separated options are processed from right to left. + Other types of configuration statements such as BIND or MSGTYPE are + not allowed. - Omitted categories are implicitly added with `n' prefix. Spec- - ified categories with omitted prefix implicitly use `+' prefix. - Order of the disclosure categories does not matter, program - display for end-of-game disclosure follows a set sequence. + Instead of a comma-separated list of options, NETHACKOPTIONS can + be set to the full name of a configuration file you want to use. If + that full name doesn't start with a slash, precede it with `@' (at- + sign) to let NetHack know that the rest is intended as a file name. + If it does start with `/', the at-sign is optional. - NetHack 3.6 February 3, 2023 + NetHack 3.6.7 February 3, 2023 - NetHack Guidebook 53 + NetHack Guidebook 50 - (for example "disclose:yi na +v -g o") The example sets inven- - tory to prompt and default to yes, attributes to prompt and de- - fault to no, vanquished to disclose without prompting, genocid- - ed to not disclose and not prompt, conduct to implicitly prompt - and default to no, and overview to disclose without prompting. + 9.4. Customization options - Note that the vanquished monsters list includes all monsters - killed by traps and each other as well as by you. And the dun- - geon overview shows all levels you had visited but does not re- - veal things about them that you hadn't discovered. + Here are explanations of what the various options do. Character + strings that are too long may be truncated. Some of the options + listed may be inactive in your dungeon. - dogname - Name your starting dog (for example "dogname:Fang"). Cannot be - set with the `O' command. + Some options are persistent, and are saved and reloaded along + with the game. Changing a persistent option in the configuration file + applies only to new games. - extmenu - Changes the extended commands interface to pop-up a menu of - available commands. It is keystroke compatible with the tradi- - tional interface except that it does not require that you hit - Enter. It is implemented for the tty interface (default off). + acoustics + Enable messages about what your character hears (default on). Note + that this has nothing to do with your computer's audio capabilities. + Persistent. - For the X11 interface, which always uses a menu for choosing an - extended command, it controls whether the menu shows all avail- - able commands (on) or just the subset of commands which have - traditionally been considered extended ones (off). + align + Your starting alignment (align:lawful, align:neutral, or + align:chaotic). You may specify just the first letter. The default + is to randomly pick an appropriate alignment. If you prefix the + value with `!' or "no", you will exclude that alignment from being + picked randomly. Cannot be set with the `O' command. Persistent. - female - An obsolete synonym for "gender:female". Cannot be set with - the `O' command. + autodescribe + Automatically describe the terrain under cursor when asked to get a + location on the map (default true). The whatis_coord option con- + trols whether the description includes map coordinates. - fixinv - An object's inventory letter sticks to it when it's dropped - (default on). If this is off, dropping an object shifts all - the remaining inventory letters. Persistent. + autodig + Automatically dig if you are wielding a digging tool and moving into + a place that can be dug (default false). Persistent. - force_invmenu - Commands asking for an inventory item show a menu instead of a - text query with possible menu letters. Default is off. + autoopen + Walking into a door attempts to open it (default true). Persistent. - fruit - Name a fruit after something you enjoy eating (for example - "fruit:mango") (default "slime mold"). Basically a nostalgic - whimsy that NetHack uses from time to time. You should set - this to something you find more appetizing than slime mold. - Apples, oranges, pears, bananas, and melons already exist in - NetHack, so don't use those. + autopickup + Automatically pick up things onto which you move (default on). Per- + sistent. See pickup_types to refine the behavior. - gender - Your starting gender (gender:male or gender:female). You may - specify just the first letter. Although you can still denote - your gender using the "male" and "female" options, the "gender" - option will take precedence. The default is to randomly pick - an appropriate gender. If you prefix the value with `!' or - "no", you will exclude that gender from being picked randomly. + autoquiver + This option controls what happens when you attempt the `f' (fire) + command when nothing is quivered or readied (default false). When + true, the computer will fill your quiver or quiver sack or make + ready some suitable weapon. Note that it will not take into account + the blessed/cursed status, enchantment, damage, or quality of the + weapon; you are free to manually fill your quiver or quiver sack or + make ready with the `Q' command instead. If no weapon is found or + the option is false, the `t' (throw) command is executed instead. + Persistent. + blind + Start the character permanently blind (default false). Persistent. - NetHack 3.6 February 3, 2023 + bones + Allow saving and loading bones files (default true). Persistent. + NetHack 3.6.7 February 3, 2023 - NetHack Guidebook 54 + NetHack Guidebook 51 - Cannot be set with the `O' command. Persistent. - goldX - When filtering objects based on bless/curse state (BUCX), - whether to treat gold pieces as X (unknown bless/curse state, - when "on") or U (known to be uncursed, when "off", the de- - fault). Gold is never blessed or cursed, but it is not de- - scribed as "uncursed" even when the implicit_uncursed option is - "off". - help - If more information is available for an object looked at with - the `/' command, ask if you want to see it (default on). Turn- - ing help off makes just looking at things faster, since you - aren't interrupted with the "More info?" prompt, but it also - means that you might miss some interesting and/or important in- - formation. Persistent. + boulder + Set the character used to display boulders (default is the "large + rock" class symbol, ``'). - herecmd_menu - When using a windowport that supports mouse and clicking on - yourself or next to you, show a menu of possible actions for - the location. Same as "#herecmdmenu" and "#therecmdmenu" com- - mands. + catname + Name your starting cat (for example "catname:Morris"). Cannot be + set with the `O' command. - hilite_pet - Visually distinguish pets from similar animals (default off). - The behavior of this option depends on the type of windowing - you use. In text windowing, text highlighting or inverse video - is often used; with tiles, generally displays a heart symbol - near pets. + character + Synonym for "role" to pick the type of your character (for example + "character:Monk"). See role for more details. - With the curses interface, the petattr option controls how to - highlight pets and setting it will turn the hilite_pet option - on or off as warranted. + checkpoint + Save game state after each level change, for possible recovery after + program crash (default on). Persistent. - hilite_pile - Visually distinguish piles of objects from individual objects - (default off). The behavior of this option depends on the type - of windowing you use. In text windowing, text highlighting or - inverse video is often used; with tiles, generally displays a - small plus-symbol beside the object on the top of the pile. + checkspace + 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 (because too + much space might overflow the calculation and end up looking like + insufficient space). Only applies when MFLOPPY was defined during + compilation. - hitpointbar - Show a hit point bar graph behind your name and title. Only - available for TTY and Windows GUI, and only when statushilites - is on. + clicklook + Allows looking at things on the screen by navigating the mouse over + them and clicking the right mouse button (default off). - horsename - Name your starting horse (for example "horsename:Trigger"). - Cannot be set with the `O' command. + cmdassist + Have the game provide some additional command assistance for new + players if it detects some anticipated mistakes (default on). - ignintr - Ignore interrupt signals, including breaks (default off). Per- - sistent. + confirm + Have user confirm attacks on pets, shopkeepers, and other peaceable + creatures (default on). Persistent. + dark_room + Show out-of-sight areas of lit rooms (default on). Persistent. - NetHack 3.6 February 3, 2023 + disclose + Controls what information the program reveals when the game ends. + Value is a space separated list of prompting/category pairs (default + is "ni na nv ng nc no", prompt with default response of `n' for each + candidate). Persistent. The possibilities are: + i - disclose your inventory; + a - disclose your attributes; + v - summarize monsters that have been vanquished; + g - list monster species that have been genocided; + c - display your conduct; + o - display dungeon overview. + Each disclosure possibility can optionally be preceded by a prefix + which lets you refine how it behaves. Here are the valid prefixes: + NetHack 3.6.7 February 3, 2023 - NetHack Guidebook 55 - implicit_uncursed - Omit "uncursed" from inventory lists, if possible (default on). - legacy - Display an introductory message when starting the game (default - on). Persistent. + NetHack Guidebook 52 - lit_corridor - Show corridor squares seen by night vision or a light source - held by your character as lit (default off). Persistent. - lootabc - When using a menu to interact with a container, use the old - `a', `b', and `c' keyboard shortcuts rather than the mnemonics - `o', `i', and `b' (default off). Persistent. - mail - Enable mail delivery during the game (default on). Persistent. + y - prompt you and default to yes on the prompt; + n - prompt you and default to no on the prompt; + + - disclose it without prompting; + - - do not disclose it and do not prompt. - male - An obsolete synonym for "gender:male". Cannot be set with the - `O' command. + The listing of vanquished monsters can be sorted, so there are two + additional choices for `v': - mention_walls - Give feedback when walking against a wall (default off). + ? - prompt you and default to ask on the prompt; + # - disclose it without prompting, ask for sort order. - menucolors - Enable coloring menu lines (default off). See "Configuring - Menu Colors" on how to configure the colors. + Asking refers to picking one of the orderings from a menu. The `+' + disclose without prompting choice, or being prompted and answering + `y' rather than `a', will default to showing monsters in the tradi- + tional order, from high level to low level. - menustyle - Controls the interface used when you need to choose various ob- - jects (in response to the Drop command, for instance). The - value specified should be the first letter of one of the fol- - lowing: traditional, combination, full, or partial. Tradi- - tional was the only interface available for early versions; it - consists of a prompt for object class characters, followed by - an object-by-object prompt for all items matching the selected - object class(es). Combination starts with a prompt for object - class(es) of interest, but then displays a menu of matching ob- - jects rather than prompting one-by-one. Full displays a menu - of object classes rather than a character prompt, and then a - menu of matching objects for selection. Partial skips the ob- - ject class filtering and immediately displays a menu of all ob- - jects. Persistent. + Omitted categories are implicitly added with `n' prefix. Specified + categories with omitted prefix implicitly use `+' prefix. Order of + the disclosure categories does not matter, program display for end- + of-game disclosure follows a set sequence. - menu_deselect_all - Menu character accelerator to deselect all items in a menu. - Implemented by the Amiga, Gem, X11 and tty ports. Default `-'. + (for example "disclose:yi na +v -g o") The example sets inventory to + prompt and default to yes, attributes to prompt and default to no, + vanquished to disclose without prompting, genocided to not disclose + and not prompt, conduct to implicitly prompt and default to no, and + overview to disclose without prompting. - menu_deselect_page - Menu character accelerator to deselect all items on this page - of a menu. Implemented by the Amiga, Gem and tty ports. De- - fault `\'. + Note that the vanquished monsters list includes all monsters killed + by traps and each other as well as by you. And the dungeon overview + shows all levels you had visited but does not reveal things about + them that you hadn't discovered. + dogname + Name your starting dog (for example "dogname:Fang"). Cannot be set + with the `O' command. - NetHack 3.6 February 3, 2023 + extmenu + Changes the extended commands interface to pop-up a menu of avail- + able commands. It is keystroke compatible with the traditional + interface except that it does not require that you hit Enter. It is + implemented for the tty interface (default off). + For the X11 interface, which always uses a menu for choosing an + extended command, it controls whether the menu shows all available + commands (on) or just the subset of commands which have tradition- + ally been considered extended ones (off). + female + An obsolete synonym for "gender:female". Cannot be set with the `O' + command. + fixinv + An object's inventory letter sticks to it when it's dropped (default + on). If this is off, dropping an object shifts all the remaining - NetHack Guidebook 56 + NetHack 3.6.7 February 3, 2023 - menu_first_page - Menu character accelerator to jump to the first page in a menu. - Implemented by the Amiga, Gem and tty ports. Default `^'. - menu_headings - Controls how the headings in a menu are highlighted. Values - are "none", "bold", "dim", "underline", "blink", or "inverse". - Not all ports can actually display all types. - menu_invert_all - Menu character accelerator to invert all items in a menu. Im- - plemented by the Amiga, Gem, X11 and tty ports. Default `@'. + NetHack Guidebook 53 - menu_invert_page - Menu character accelerator to invert all items on this page of - a menu. Implemented by the Amiga, Gem and tty ports. Default - `~'. - menu_last_page - Menu character accelerator to jump to the last page in a menu. - Implemented by the Amiga, Gem and tty ports. Default `|'. - menu_next_page - Menu character accelerator to goto the next menu page. Imple- - mented by the Amiga, Gem and tty ports. Default `>'. + inventory letters. Persistent. - menu_objsyms - Show object symbols in menu headings in menus where the object - symbols act as menu accelerators (default off). + force_invmenu + Commands asking for an inventory item show a menu instead of a text + query with possible menu letters. Default is off. - menu_overlay - Do not clear the screen before drawing menus, and align menus - to the right edge of the screen. Only for the tty port. (de- - fault on) + fruit + Name a fruit after something you enjoy eating (for example + "fruit:mango") (default "slime mold"). Basically a nostalgic whimsy + that NetHack uses from time to time. You should set this to some- + thing you find more appetizing than slime mold. Apples, oranges, + pears, bananas, and melons already exist in NetHack, so don't use + those. - menu_previous_page - Menu character accelerator to goto the previous menu page. Im- - plemented by the Amiga, Gem and tty ports. Default `<'. + gender + Your starting gender (gender:male or gender:female). You may spec- + ify just the first letter. Although you can still denote your gen- + der using the "male" and "female" options, the "gender" option will + take precedence. The default is to randomly pick an appropriate + gender. If you prefix the value with `!' or "no", you will exclude + that gender from being picked randomly. Cannot be set with the `O' + command. Persistent. - menu_search - Menu character accelerator to search for a menu item. Imple- - mented by the Amiga, Gem, X11 and tty ports. Default `:'. + goldX + When filtering objects based on bless/curse state (BUCX), whether to + treat gold pieces as X (unknown bless/curse state, when "on") or U + (known to be uncursed, when "off", the default). Gold is never + blessed or cursed, but it is not described as "uncursed" even when + the implicit_uncursed option is "off". - menu_select_all - Menu character accelerator to select all items in a menu. Im- - plemented by the Amiga, Gem, X11 and tty ports. Default `.'. + help + If more information is available for an object looked at with the + `/' command, ask if you want to see it (default on). Turning help + off makes just looking at things faster, since you aren't inter- + rupted with the "More info?" prompt, but it also means that you + might miss some interesting and/or important information. Persis- + tent. - menu_select_page - Menu character accelerator to select all items on this page of - a menu. Implemented by the Amiga, Gem and tty ports. Default - `,'. + herecmd_menu + When using a windowport that supports mouse and clicking on yourself + or next to you, show a menu of possible actions for the location. + Same as "#herecmdmenu" and "#therecmdmenu" commands. - monpolycontrol - Prompt for new form whenever any monster changes shape (default + hilite_pet + Visually distinguish pets from similar animals (default off). The + behavior of this option depends on the type of windowing you use. + In text windowing, text highlighting or inverse video is often used; + with tiles, generally displays a heart symbol near pets. + With the curses interface, the petattr option controls how to high- + light pets and setting it will turn the hilite_pet option on or off + as warranted. - NetHack 3.6 February 3, 2023 + NetHack 3.6.7 February 3, 2023 - NetHack Guidebook 57 - off). Debug mode only. + NetHack Guidebook 54 - mouse_support - Allow use of the mouse for input and travel. Valid settings - are: - 0 - disabled - 1 - enabled and make OS adjustments to support mouse use - 2 - like 1 but does not make any OS adjustments - Omitting a value is the same as specifying 1 and negating - mouse_support is the same as specifying 0. + hilite_pile + Visually distinguish piles of objects from individual objects + (default off). The behavior of this option depends on the type of + windowing you use. In text windowing, text highlighting or inverse + video is often used; with tiles, generally displays a small plus- + symbol beside the object on the top of the pile. - msghistory - The number of top line messages to keep (and be able to recall - with `^P') (default 20). Cannot be set with the `O' command. + hitpointbar + Show a hit point bar graph behind your name and title. Only avail- + able for TTY and Windows GUI, and only when statushilites is on. - msg_window - Allows you to change the way recalled messages are displayed. - Currently it is only supported for tty (all four choices) and - for curses (`f' and `r' choices, default `r'). The possible - values are: + horsename + Name your starting horse (for example "horsename:Trigger"). Cannot + be set with the `O' command. - s - single message (default; only choice prior to 3.4.0); - c - combination, two messages as "single", then as "full"; - f - full window, oldest message first; - r - full window reversed, newest message first. + ignintr + Ignore interrupt signals, including breaks (default off). Persis- + tent. - For backward compatibility, no value needs to be specified - (which defaults to "full"), or it can be negated (which - defaults to "single"). + implicit_uncursed + Omit "uncursed" from inventory lists, if possible (default on). - name - Set your character's name (defaults to your user name). You - can also set your character's role by appending a dash and one - or more letters of the role (that is, by suffixing one of -A -B - -C -H -K -M -P -Ra -Ro -S -T -V -W). If -@ is used for the - role, then a random one will be automatically chosen. Cannot - be set with the `O' command. + legacy + Display an introductory message when starting the game (default on). + Persistent. - news - Read the NetHack news file, if present (default on). Since the - news is shown at the beginning of the game, there's no point in - setting this with the `O' command. + lit_corridor + Show corridor squares seen by night vision or a light source held by + your character as lit (default off). Persistent. - nudist - Start the character with no armor (default false). Persistent. + lootabc + When using a menu to interact with a container, use the old `a', + `b', and `c' keyboard shortcuts rather than the mnemonics `o', `i', + and `b' (default off). Persistent. - null - Send padding nulls to the terminal (default on). Persistent. + mail + Enable mail delivery during the game (default on). Persistent. - number_pad - Use digit keys instead of letters to move (default 0 or off). - Valid settings are: + male + An obsolete synonym for "gender:male". Cannot be set with the `O' + command. + mention_walls + Give feedback when walking against a wall (default off). - NetHack 3.6 February 3, 2023 + menucolors + Enable coloring menu lines (default off). See "Configuring Menu + Colors" on how to configure the colors. + menustyle + Controls the interface used when you need to choose various objects + (in response to the Drop command, for instance). The value speci- + fied should be the first letter of one of the following: tradi- + tional, combination, full, or partial. Traditional was the only + NetHack 3.6.7 February 3, 2023 - NetHack Guidebook 58 - 0 - move by letters; "yuhjklbn" - 1 - move by numbers; digit `5' acts as `G' movement prefix - 2 - like 1 but `5' works as `g' prefix instead of as `G' - 3 - by numbers using phone key layout; 123 above, 789 below - 4 - combines 3 with 2; phone layout plus MS-DOS compatibility - -1 - by letters but use `z' to go northwest, `y' to zap wands + NetHack Guidebook 55 - For backward compatibility, omitting a value is the same as - specifying 1 and negating number_pad is the same as specifying - 0. (Settings 2 and 4 are for compatibility with MS-DOS or old - PC Hack; in addition to the different behavior for `5', `Alt-5' - acts as `G' and `Alt-0' acts as `I'. Setting -1 is to accommo- - date some QWERTZ keyboards which have the location of the `y' - and `z' keys swapped.) When moving by numbers, to enter a - count prefix for those commands which accept one (such as "12s" - to search twelve times), precede it with the letter `n' - ("n12s"). - packorder - Specify the order to list object types in (default - "")[%?+!=/(*`0_"). The value of this option should be a string - containing the symbols for the various object types. Any omit- - ted types are filled in at the end from the previous order. - paranoid_confirmation - A space separated list of specific situations where alternate - prompting is desired. The default is paranoid_confirma- - tion:pray. + interface available for early versions; it consists of a prompt for + object class characters, followed by an object-by-object prompt for + all items matching the selected object class(es). Combination + starts with a prompt for object class(es) of interest, but then dis- + plays a menu of matching objects rather than prompting one-by-one. + Full displays a menu of object classes rather than a character + prompt, and then a menu of matching objects for selection. Partial + skips the object class filtering and immediately displays a menu of + all objects. Persistent. - Confirm - for any prompts which are set to require "yes" - rather than `y', also require "no" to reject in- - stead of accepting any non-yes response as no - quit - require "yes" rather than `y' to confirm quitting - the game or switching into non-scoring explore - mode; - die - require "yes" rather than `y' to confirm dying - (not useful in normal play; applies to explore - mode); - bones - require "yes" rather than `y' to confirm saving - bones data when dying in debug mode; - attack - require "yes" rather than `y' to confirm attack- - ing a peaceful monster; - wand-break - require "yes" rather than `y' to confirm breaking - a wand; - eating - require "yes" rather than `y' to confirm whether - to continue eating; - Were-change - require "yes" rather than `y' to confirm changing - form due to lycanthropy when hero has polymorph - control; - pray - require `y' to confirm an attempt to pray rather - than immediately praying; on by default; - Remove - require selection from inventory for `R' and `T' - commands even when wearing just one applicable - item. + menu_deselect_all + Menu character accelerator to deselect all items in a menu. Imple- + mented by the Amiga, Gem, X11 and tty ports. Default `-'. + menu_deselect_page + Menu character accelerator to deselect all items on this page of a + menu. Implemented by the Amiga, Gem and tty ports. Default `\'. - NetHack 3.6 February 3, 2023 + menu_first_page + Menu character accelerator to jump to the first page in a menu. + Implemented by the Amiga, Gem and tty ports. Default `^'. + menu_headings + Controls how the headings in a menu are highlighted. Values are + "none", "bold", "dim", "underline", "blink", or "inverse". Not all + ports can actually display all types. + menu_invert_all + Menu character accelerator to invert all items in a menu. Imple- + mented by the Amiga, Gem, X11 and tty ports. Default `@'. + menu_invert_page + Menu character accelerator to invert all items on this page of a + menu. Implemented by the Amiga, Gem and tty ports. Default `~'. + menu_last_page + Menu character accelerator to jump to the last page in a menu. + Implemented by the Amiga, Gem and tty ports. Default `|'. - NetHack Guidebook 59 + menu_next_page + Menu character accelerator to goto the next menu page. Implemented + by the Amiga, Gem and tty ports. Default `>'. + menu_objsyms + Show object symbols in menu headings in menus where the object sym- + bols act as menu accelerators (default off). + menu_overlay + Do not clear the screen before drawing menus, and align menus to the + right edge of the screen. Only for the tty port. (default on) - all - turn on all of the above. + menu_previous_page + Menu character accelerator to goto the previous menu page. Imple- + mented by the Amiga, Gem and tty ports. Default `<'. - By default, the pray choice is enabled, the others disabled. - To disable it without setting any of the other choices, use - "paranoid_confirmation:none". To keep it enabled while setting - any of the others, include it in the list, such as "para- - noid_confirmation:attack pray Remove". - perm_invent - If true, always display your current inventory in a window. - This only makes sense for windowing system interfaces that im- - plement this feature. + NetHack 3.6.7 February 3, 2023 - petattr - Specifies one or more text highlighting attributes to use when - showing pets on the map. Effectively a superset of the - hilite_pet boolean option. Curses interface only; value is one - or more of the following letters. - n - Normal text (no highlighting) - i - Inverse video (default) - b - Bold text - u - Underlined text - k - blinKing text - d - Dim text - t - iTalic text - l - Left line indicator - r - Right line indicator - Some of those choices might not work, particularly the final - three, depending upon terminal hardware or terminal emulation - software. - Currently multiple highlight-style letters can be combined by - simply stringing them together (for example, "bk"), but in the - future they might require being separated by plus signs (such - as "b+k", which works already). When using the `n' choice, it - should be specified on its own, not in combination with any of - the other letters. - pettype - Specify the type of your initial pet, if you are playing a - character class that uses multiple types of pets; or choose to - have no initial pet at all. Possible values are "cat", "dog", - "horse", and "none". If the choice is not allowed for the role - you are currently playing, it will be silently ignored. For - example, "horse" will only be honored when playing a knight. - Cannot be set with the `O' command. + NetHack Guidebook 56 - pickup_burden - When you pick up an item that would exceed this encumbrance - level (Unencumbered, Burdened, streSsed, straiNed, overTaxed, - or overLoaded), you will be asked if you want to continue. - (Default `S'). Persistent. - NetHack 3.6 February 3, 2023 + menu_search + Menu character accelerator to search for a menu item. Implemented + by the Amiga, Gem, X11 and tty ports. Default `:'. + menu_select_all + Menu character accelerator to select all items in a menu. Imple- + mented by the Amiga, Gem, X11 and tty ports. Default `.'. + menu_select_page + Menu character accelerator to select all items on this page of a + menu. Implemented by the Amiga, Gem and tty ports. Default `,'. + monpolycontrol + Prompt for new form whenever any monster changes shape (default + off). Debug mode only. + mouse_support + Allow use of the mouse for input and travel. Valid settings are: - NetHack Guidebook 60 + 0 - disabled + 1 - enabled and make OS adjustments to support mouse use + 2 - like 1 but does not make any OS adjustments + Omitting a value is the same as specifying 1 and negating mouse_sup- + port is the same as specifying 0. + msghistory + The number of top line messages to keep (and be able to recall with + `^P') (default 20). Cannot be set with the `O' command. - pickup_thrown - If this option is on and autopickup is also on, try to pick up - things that you threw, even if they aren't in pickup_types or - match an autopickup exception. Default is on. Persistent. + msg_window + Allows you to change the way recalled messages are displayed. Cur- + rently it is only supported for tty (all four choices) and for + curses (`f' and `r' choices, default `r'). The possible values are: - pickup_types - Specify the object types to be picked up when autopickup is on. - Default is all types. You can use autopickup_exception config- - uration file lines to further refine autopickup behavior. Per- - sistent. + s - single message (default; only choice prior to 3.4.0); + c - combination, two messages as "single", then as "full"; + f - full window, oldest message first; + r - full window reversed, newest message first. - pile_limit - When walking across a pile of objects on the floor, threshold - at which the message "there are few/several/many objects here" - is given instead of showing a popup list of those objects. A - value of 0 means "no limit" (always list the objects); a value - of 1 effectively means "never show the objects" since the pile - size will always be at least that big; default value is 5. - Persistent. + For backward compatibility, no value needs to be specified (which + defaults to "full"), or it can be negated (which defaults to "sin- + gle"). - playmode - Values are "normal", "explore", or "debug". Allows selection - of explore mode (also known as discovery mode) or debug mode - (also known as wizard mode) instead of normal play. Debug mode - might only be allowed for someone logged in under a particular - user name (on multi-user systems) or specifying a particular - character name (on single-user systems) or it might be disabled - entirely. Requesting it when not allowed or not possible re- - sults in explore mode instead. Default is normal play. + name + Set your character's name (defaults to your user name). You can + also set your character's role by appending a dash and one or more + letters of the role (that is, by suffixing one of -A -B -C -H -K -M + -P -Ra -Ro -S -T -V -W). If -@ is used for the role, then a random + one will be automatically chosen. Cannot be set with the `O' com- + mand. - pushweapon - Using the `w' (wield) command when already wielding something - pushes the old item into your alternate weapon slot (default - off). Likewise for the `a' (apply) command if it causes the - applied item to become wielded. Persistent. + news + Read the NetHack news file, if present (default on). Since the news - race - Selects your race (for example, "race:human"). Default is ran- - dom. If you prefix the value with `!' or "no", you will ex- - clude that race from being picked randomly. Cannot be set with - the `O' command. Persistent. - rest_on_space - Make the space bar a synonym for the `.' (#wait) command (de- - fault off). Persistent. + NetHack 3.6.7 February 3, 2023 - role - Pick your type of character (for example "role:Samurai"); syn- - onym for "character". See "name" for an alternate method of - specifying your role. Normally only the first letter of the - value is examined; `r' is an exception with "Rogue", "Ranger", - and "random" values. If you prefix the value with `!' or "no", - you will exclude that role from being picked randomly. Cannot - be set with the `O' command. Persistent. - NetHack 3.6 February 3, 2023 + NetHack Guidebook 57 - NetHack Guidebook 61 + is shown at the beginning of the game, there's no point in setting + this with the `O' command. + nudist + Start the character with no armor (default false). Persistent. + null + Send padding nulls to the terminal (default on). Persistent. - roguesymset - This option may be used to select one of the named symbol sets - found within "symbols" to alter the symbols displayed on the - screen on the rogue level. + number_pad + Use digit keys instead of letters to move (default 0 or off). Valid + settings are: - rlecomp - When writing out a save file, perform run length compression of - the map. Not all ports support run length compression. It has - no effect on reading an existing save file. + 0 - move by letters; "yuhjklbn" + 1 - move by numbers; digit `5' acts as `G' movement prefix + 2 - like 1 but `5' works as `g' prefix instead of as `G' + 3 - by numbers using phone key layout; 123 above, 789 below + 4 - combines 3 with 2; phone layout plus MS-DOS compatibility + -1 - by letters but use `z' to go northwest, `y' to zap wands - runmode - Controls the amount of screen updating for the map window when - engaged in multi-turn movement (running via shift+direction or - control+direction and so forth, or via the travel command or - mouse click). The possible values are: + For backward compatibility, omitting a value is the same as specify- + ing 1 and negating number_pad is the same as specifying 0. (Set- + tings 2 and 4 are for compatibility with MS-DOS or old PC Hack; in + addition to the different behavior for `5', `Alt-5' acts as `G' and + `Alt-0' acts as `I'. Setting -1 is to accommodate some QWERTZ key- + boards which have the location of the `y' and `z' keys swapped.) + When moving by numbers, to enter a count prefix for those commands + which accept one (such as "12s" to search twelve times), precede it + with the letter `n' ("n12s"). - teleport - update the map after movement has finished; - run - update the map after every seven or so steps; - walk - update the map after each step; - crawl - like walk, but pause briefly after each step. + packorder + Specify the order to list object types in (default + "")[%?+!=/(*`0_"). The value of this option should be a string con- + taining the symbols for the various object types. Any omitted types + are filled in at the end from the previous order. - This option only affects the game's screen display, not the ac- - tual results of moving. The default is "run"; versions prior - to 3.4.1 used "teleport" only. Whether or not the effect is - noticeable will depend upon the window port used or on the type - of terminal. Persistent. + paranoid_confirmation + A space separated list of specific situations where alternate + prompting is desired. The default is paranoid_confirmation:pray. - safe_pet - Prevent you from (knowingly) attacking your pets (default on). - Persistent. + Confirm - for any prompts which are set to require "yes" rather + than `y', also require "no" to reject instead of + accepting any non-yes response as no + quit - require "yes" rather than `y' to confirm quitting the + game or switching into non-scoring explore mode; + die - require "yes" rather than `y' to confirm dying (not + useful in normal play; applies to explore mode); + bones - require "yes" rather than `y' to confirm saving bones + data when dying in debug mode; + attack - require "yes" rather than `y' to confirm attacking a + peaceful monster; + wand-break - require "yes" rather than `y' to confirm breaking a + wand; + eating - require "yes" rather than `y' to confirm whether to - sanity_check - Evaluate monsters, objects, and map prior to each turn (default - off). Debug mode only. - scores - Control what parts of the score list you are shown at the end - (for example "scores:5 top scores/4 around my score/own - scores"). Only the first letter of each category (`t', `a', or - `o') is necessary. Persistent. + NetHack 3.6.7 February 3, 2023 - showexp - Show your accumulated experience points on bottom line (default - off). Persistent. - showrace - Display yourself as the glyph for your race, rather than the - glyph for your role (default off). Note that this setting af- - fects only the appearance of the display, not the way the game - treats you. Persistent. - showscore - Show your approximate accumulated score on bottom line (default - off). Persistent. - NetHack 3.6 February 3, 2023 + NetHack Guidebook 58 + continue eating; + Were-change - require "yes" rather than `y' to confirm changing form + due to lycanthropy when hero has polymorph control; + pray - require `y' to confirm an attempt to pray rather than + immediately praying; on by default; + Remove - require selection from inventory for `R' and `T' com- + mands even when wearing just one applicable item. + all - turn on all of the above. + By default, the pray choice is enabled, the others disabled. To + disable it without setting any of the other choices, use "para- + noid_confirmation:none". To keep it enabled while setting any of + the others, include it in the list, such as "paranoid_confirma- + tion:attack pray Remove". - NetHack Guidebook 62 + perm_invent + If true, always display your current inventory in a window. This + only makes sense for windowing system interfaces that implement this + feature. + petattr + Specifies one or more text highlighting attributes to use when show- + ing pets on the map. Effectively a superset of the hilite_pet bool- + ean option. Curses interface only; value is one or more of the fol- + lowing letters. + n - Normal text (no highlighting) + i - Inverse video (default) + b - Bold text + u - Underlined text + k - blinKing text + d - Dim text + t - iTalic text + l - Left line indicator + r - Right line indicator - silent - Suppress terminal beeps (default on). Persistent. + Some of those choices might not work, particularly the final three, + depending upon terminal hardware or terminal emulation software. - sortloot - Controls the sorting behavior of the pickup lists for inventory - and #loot commands and some others. Persistent. The possible - values are: + Currently multiple highlight-style letters can be combined by simply + stringing them together (for example, "bk"), but in the future they + might require being separated by plus signs (such as "b+k", which + works already). When using the `n' choice, it should be specified + on its own, not in combination with any of the other letters. - full - always sort the lists; - loot - only sort the lists that don't use inventory letters, - like with the #loot and pickup commands; - none - show lists the traditional way without sorting. + pettype + Specify the type of your initial pet, if you are playing a character + class that uses multiple types of pets; or choose to have no initial + pet at all. Possible values are "cat", "dog", "horse", and "none". + If the choice is not allowed for the role you are currently playing, + it will be silently ignored. For example, "horse" will only be hon- + ored when playing a knight. Cannot be set with the `O' command. - sortpack - Sort the pack contents by type when displaying inventory (de- - fault on). Persistent. - sparkle - Display a sparkly effect when a monster (including yourself) is - hit by an attack to which it is resistant (default on). Per- - sistent. - standout - Boldface monsters and "--More--" (default off). Persistent. - statushilites - Controls how many turns status hilite behaviors highlight the - field. If negated or set to zero, disables status hiliting. - See "Configuring Status Hilites" for further information. + NetHack 3.6.7 February 3, 2023 - status_updates - Allow updates to the status lines at the bottom of the screen - (default true). - suppress_alert - This option may be set to a NetHack version level to suppress - alert notification messages about feature changes for that and - prior versions (for example "suppress_alert:3.3.1"). - symset - This option may be used to select one of the named symbol sets - found within "symbols" to alter the symbols displayed on the - screen. Use "symset:default" to explicitly select the default - symbols. - time - Show the elapsed game time in turns on bottom line (default - off). Persistent. - timed_delay - When pausing momentarily for display effect, such as with ex- - plosions and moving objects, use a timer rather than sending - extra characters to the screen. (Applies to "tty" interface - only; "X11" interface always uses a timer based delay. The + NetHack Guidebook 59 - NetHack 3.6 February 3, 2023 + pickup_burden + When you pick up an item that would exceed this encumbrance level + (Unencumbered, Burdened, streSsed, straiNed, overTaxed, or over- + Loaded), you will be asked if you want to continue. (Default `S'). + Persistent. + pickup_thrown + If this option is on and autopickup is also on, try to pick up + things that you threw, even if they aren't in pickup_types or match + an autopickup exception. Default is on. Persistent. + pickup_types + Specify the object types to be picked up when autopickup is on. + Default is all types. You can use autopickup_exception configura- + tion file lines to further refine autopickup behavior. Persistent. + pile_limit + When walking across a pile of objects on the floor, threshold at + which the message "there are few/several/many objects here" is given + instead of showing a popup list of those objects. A value of 0 + means "no limit" (always list the objects); a value of 1 effectively + means "never show the objects" since the pile size will always be at + least that big; default value is 5. Persistent. - NetHack Guidebook 63 + playmode + Values are "normal", "explore", or "debug". Allows selection of + explore mode (also known as discovery mode) or debug mode (also + known as wizard mode) instead of normal play. Debug mode might only + be allowed for someone logged in under a particular user name (on + multi-user systems) or specifying a particular character name (on + single-user systems) or it might be disabled entirely. Requesting + it when not allowed or not possible results in explore mode instead. + Default is normal play. + pushweapon + Using the `w' (wield) command when already wielding something pushes + the old item into your alternate weapon slot (default off). Like- + wise for the `a' (apply) command if it causes the applied item to + become wielded. Persistent. + race + Selects your race (for example, "race:human"). Default is random. + If you prefix the value with `!' or "no", you will exclude that race + from being picked randomly. Cannot be set with the `O' command. + Persistent. - default is on if configured into the program.) Persistent. + rest_on_space + Make the space bar a synonym for the `.' (#wait) command (default + off). Persistent. - tombstone - Draw a tombstone graphic upon your death (default on). Persis- - tent. + role + Pick your type of character (for example "role:Samurai"); synonym + for "character". See "name" for an alternate method of specifying + your role. Normally only the first letter of the value is examined; - toptenwin - Put the ending display in a NetHack window instead of on stdout - (default off). Setting this option makes the score list visi- - ble when a windowing version of NetHack is started without a - parent window, but it no longer leaves the score list around - after game end on a terminal or emulating window. - travel - Allow the travel command (default on). Turning this option off - will prevent the game from attempting unintended moves if you - make inadvertent mouse clicks on the map window. Persistent. + NetHack 3.6.7 February 3, 2023 - verbose - Provide more commentary during the game (default on). Persis- - tent. - whatis_coord - When using the `/' or `;' commands to look around on the map - with autodescribe on, display coordinates after the descrip- - tion. Also works in other situations where you are asked to - pick a location. - The possible settings are: - c - compass ("east" or "3s" or "2n,4w"); - f - full compass ("east" or "3south" or "2north,4west"); - m - map (map column x=0 is not used); - s - screen [row,column] (row is offset to match tty usage); - n - none (no coordinates shown) [default]. - The whatis_coord option is also used with the "/m", "/M", "/o", - and "/O" sub-commands of `/', where the "none" setting is over- - ridden with "map". + NetHack Guidebook 60 - whatis_filter - When getting a location on the map, and using the keys to cycle - through next and previous targets, allows filtering the possi- - ble targets. - n - no filtering [default] - v - in view only - a - in same area only - The area-filter tries to be slightly predictive -- if you're - standing on a doorway, it will consider the area on the side of - the door you were last moving towards. + `r' is an exception with "Rogue", "Ranger", and "random" values. If + you prefix the value with `!' or "no", you will exclude that role + from being picked randomly. Cannot be set with the `O' command. + Persistent. + roguesymset + This option may be used to select one of the named symbol sets found + within "symbols" to alter the symbols displayed on the screen on the + rogue level. + rlecomp + When writing out a save file, perform run length compression of the + map. Not all ports support run length compression. It has no effect + on reading an existing save file. + runmode + Controls the amount of screen updating for the map window when + engaged in multi-turn movement (running via shift+direction or con- + trol+direction and so forth, or via the travel command or mouse + click). The possible values are: - NetHack 3.6 February 3, 2023 + teleport - update the map after movement has finished; + run - update the map after every seven or so steps; + walk - update the map after each step; + crawl - like walk, but pause briefly after each step. + This option only affects the game's screen display, not the actual + results of moving. The default is "run"; versions prior to 3.4.1 + used "teleport" only. Whether or not the effect is noticeable will + depend upon the window port used or on the type of terminal. Per- + sistent. + safe_pet + Prevent you from (knowingly) attacking your pets (default on). Per- + sistent. + sanity_check + Evaluate monsters, objects, and map prior to each turn (default + off). Debug mode only. + scores + Control what parts of the score list you are shown at the end (for + example "scores:5 top scores/4 around my score/own scores"). Only + the first letter of each category (`t', `a', or `o') is necessary. + Persistent. - NetHack Guidebook 64 + showexp + Show your accumulated experience points on bottom line (default + off). Persistent. + showrace + Display yourself as the glyph for your race, rather than the glyph + for your role (default off). Note that this setting affects only + the appearance of the display, not the way the game treats you. - Filtering can also be changed when getting a location with the - "getpos.filter" key. + NetHack 3.6.7 February 3, 2023 - whatis_menu - When getting a location on the map, and using a key to cycle - through next and previous targets, use a menu instead to pick a - target. (default off) - whatis_moveskip - When getting a location on the map, and using shifted movement - keys or meta-digit keys to fast-move, instead of moving 8 units - at a time, move by skipping the same glyphs. (default off) - windowtype - When the program has been built to support multiple interfaces, - select which one to use, such as "tty" or "X11" (default de- - pends on build-time settings; use "#version" to check). Cannot - be set with the `O' command. - When used, it should be the first option set since its value - might enable or disable the availability of various other op- - tions. For multiple lines in a configuration file, that would - be the first non-comment line. For a comma-separated list in - NETHACKOPTIONS or an OPTIONS line in a configuration file, that - would be the rightmost option in the list. - wizweight - Augment object descriptions with their objects' weight (default - off). Debug mode only. + NetHack Guidebook 61 - zerocomp - When writing out a save file, perform zero-comp compression of - the contents. Not all ports support zero-comp compression. It - has no effect on reading an existing save file. - 9.5. Window Port Customization options - Here are explanations of the various options that are used - to customize and change the characteristics of the windowtype - that you have chosen. Character strings that are too long may be - truncated. Not all window ports will adjust for all settings - listed here. You can safely add any of these options to your - configuration file, and if the window port is capable of adjust- - ing to suit your preferences, it will attempt to do so. If it - can't it will silently ignore it. You can find out if an option - is supported by the window port that you are currently using by - checking to see if it shows up in the Options list. Some options - are dynamic and can be specified during the game with the `O' - command. + Persistent. - align_message - Where to align or place the message window (top, bottom, left, - or right) + showscore + Show your approximate accumulated score on bottom line (default + off). Persistent. + silent + Suppress terminal beeps (default on). Persistent. + sortloot + Controls the sorting behavior of the pickup lists for inventory and + #loot commands and some others. Persistent. The possible values + are: - NetHack 3.6 February 3, 2023 + full - always sort the lists; + loot - only sort the lists that don't use inventory letters, like + with the #loot and pickup commands; + none - show lists the traditional way without sorting. + sortpack + Sort the pack contents by type when displaying inventory (default + on). Persistent. + sparkle + Display a sparkly effect when a monster (including yourself) is hit + by an attack to which it is resistant (default on). Persistent. + standout + Boldface monsters and "--More--" (default off). Persistent. + statushilites + Controls how many turns status hilite behaviors highlight the field. + If negated or set to zero, disables status hiliting. See "Configur- + ing Status Hilites" for further information. - NetHack Guidebook 65 + status_updates + Allow updates to the status lines at the bottom of the screen + (default true). + suppress_alert + This option may be set to a NetHack version level to suppress alert + notification messages about feature changes for that and prior ver- + sions (for example "suppress_alert:3.3.1"). + symset + This option may be used to select one of the named symbol sets found + within "symbols" to alter the symbols displayed on the screen. Use + "symset:default" to explicitly select the default symbols. - align_status - Where to align or place the status window (top, bottom, left, - or right). + time + Show the elapsed game time in turns on bottom line (default off). + Persistent. - ascii_map - If NetHack can, it should display an ascii character map if it - can. - color - If NetHack can, it should display color if it can for different - monsters, objects, and dungeon features. - eight_bit_tty - If NetHack can, it should pass eight-bit character values (for - example, specified with the traps option) straight through to - your terminal (default off). - font_map - if NetHack can, it should use a font by the chosen name for the - map window. + NetHack 3.6.7 February 3, 2023 - font_menu - If NetHack can, it should use a font by the chosen name for - menu windows. - font_message - If NetHack can, it should use a font by the chosen name for the - message window. - font_status - If NetHack can, it should use a font by the chosen name for the - status window. - font_text - If NetHack can, it should use a font by the chosen name for - text windows. - font_size_map - If NetHack can, it should use this size font for the map win- - dow. + NetHack Guidebook 62 - font_size_menu - If NetHack can, it should use this size font for menu windows. - font_size_message - If NetHack can, it should use this size font for the message - window. - font_size_status - If NetHack can, it should use this size font for the status - window. + timed_delay + When pausing momentarily for display effect, such as with explosions + and moving objects, use a timer rather than sending extra characters + to the screen. (Applies to "tty" interface only; "X11" interface + always uses a timer based delay. The default is on if configured + into the program.) Persistent. - font_size_text - If NetHack can, it should use this size font for text windows. + tombstone + Draw a tombstone graphic upon your death (default on). Persistent. + toptenwin + Put the ending display in a NetHack window instead of on stdout + (default off). Setting this option makes the score list visible + when a windowing version of NetHack is started without a parent win- + dow, but it no longer leaves the score list around after game end on + a terminal or emulating window. - NetHack 3.6 February 3, 2023 + travel + Allow the travel command (default on). Turning this option off will + prevent the game from attempting unintended moves if you make inad- + vertent mouse clicks on the map window. Persistent. + verbose + Provide more commentary during the game (default on). Persistent. + whatis_coord + When using the `/' or `;' commands to look around on the map with + autodescribe on, display coordinates after the description. Also + works in other situations where you are asked to pick a location. + The possible settings are: + c - compass ("east" or "3s" or "2n,4w"); + f - full compass ("east" or "3south" or "2north,4west"); + m - map (map column x=0 is not used); + s - screen [row,column] (row is offset to match tty usage); + n - none (no coordinates shown) [default]. - NetHack Guidebook 66 + The whatis_coord option is also used with the "/m", "/M", "/o", and + "/O" sub-commands of `/', where the "none" setting is overridden + with "map". + whatis_filter + When getting a location on the map, and using the keys to cycle + through next and previous targets, allows filtering the possible + targets. + n - no filtering [default] + v - in view only + a - in same area only - fullscreen - If NetHack can, it should try and display on the entire screen - rather than in a window. + The area-filter tries to be slightly predictive -- if you're stand- + ing on a doorway, it will consider the area on the side of the door + you were last moving towards. - guicolor - Use color text and/or highlighting attributes when displaying - some non-map data (such as menu selector letters). Curses in- - terface only; default is on. - large_font - If NetHack can, it should use a large font. + NetHack 3.6.7 February 3, 2023 - map_mode - If NetHack can, it should display the map in the manner speci- - fied. - player_selection - If NetHack can, it should pop up dialog boxes, or use prompts - for character selection. - popup_dialog - If NetHack can, it should pop up dialog boxes for input. - preload_tiles - If NetHack can, it should preload tiles into memory. For exam- - ple, in the protected mode MS-DOS version, control whether - tiles get pre-loaded into RAM at the start of the game. Doing - so enhances performance of the tile graphics, but uses more - memory. (default on). Cannot be set with the `O' command. - scroll_amount - If NetHack can, it should scroll the display by this number of - cells when the hero reaches the scroll_margin. + NetHack Guidebook 63 - scroll_margin - If NetHack can, it should scroll the display when the hero or - cursor is this number of cells away from the edge of the win- - dow. - selectsaved - If NetHack can, it should display a menu of existing saved - games for the player to choose from at game startup, if it can. - Not all ports support this option. - softkeyboard - Display an onscreen keyboard. Handhelds are most likely to - support this option. + Filtering can also be changed when getting a location with the "get- + pos.filter" key. - splash_screen - If NetHack can, it should display an opening splash screen when - it starts up (default yes). + whatis_menu + When getting a location on the map, and using a key to cycle through + next and previous targets, use a menu instead to pick a target. + (default off) - statuslines - Number of lines for traditional below-the-map status display. + whatis_moveskip + When getting a location on the map, and using shifted movement keys + or meta-digit keys to fast-move, instead of moving 8 units at a + time, move by skipping the same glyphs. (default off) + windowtype + When the program has been built to support multiple interfaces, + select which one to use, such as "tty" or "X11" (default depends on + build-time settings; use "#version" to check). Cannot be set with + the `O' command. - NetHack 3.6 February 3, 2023 + When used, it should be the first option set since its value might + enable or disable the availability of various other options. For + multiple lines in a configuration file, that would be the first non- + comment line. For a comma-separated list in NETHACKOPTIONS or an + OPTIONS line in a configuration file, that would be the rightmost + option in the list. + wizweight + Augment object descriptions with their objects' weight (default + off). Debug mode only. + zerocomp + When writing out a save file, perform zero-comp compression of the + contents. Not all ports support zero-comp compression. It has no + effect on reading an existing save file. + 9.5. Window Port Customization options + Here are explanations of the various options that are used to + customize and change the characteristics of the windowtype that you + have chosen. Character strings that are too long may be truncated. + Not all window ports will adjust for all settings listed here. You + can safely add any of these options to your configuration file, and if + the window port is capable of adjusting to suit your preferences, it + will attempt to do so. If it can't it will silently ignore it. You + can find out if an option is supported by the window port that you are + currently using by checking to see if it shows up in the Options list. + Some options are dynamic and can be specified during the game with the + `O' command. - NetHack Guidebook 67 + align_message + Where to align or place the message window (top, bottom, left, or + right) - Acceptable values are 2 and 3 (default is 2). Curses and tty - interfaces only. - term_cols and + NetHack 3.6.7 February 3, 2023 - term_rows - Curses interface only. Number of columns and rows to use for - the display. Curses will attempt to resize to the values spec- - ified but will settle for smaller sizes if they are too big. - Default is the current window size. - tiled_map - If NetHack can, it should display a tiled map if it can. - tile_file - Specify the name of an alternative tile file to override the - default. - tile_height - Specify the preferred height of each tile in a tile capable - port. - tile_width - Specify the preferred width of each tile in a tile capable port + NetHack Guidebook 64 - use_darkgray - Use bold black instead of blue for black glyphs (TTY only). - use_inverse - If NetHack can, it should display inverse when the game speci- - fies it. - vary_msgcount - If NetHack can, it should display this number of messages at a - time in the message window. + align_status + Where to align or place the status window (top, bottom, left, or + right). - windowborders - Whether to draw boxes around the map, status area, message - area, and persistent inventory window if enabled. Curses in- - terface only. Acceptable values are + ascii_map + If NetHack can, it should display an ascii character map if it can. - 0 - off, never show borders - 1 - on, always show borders - 2 - auto, on if display is at least (24+2)x(80+2) (default) + color + If NetHack can, it should display color if it can for different mon- + sters, objects, and dungeon features. - (The 26x82 size threshold for `2' refers to number of rows and - columns of the display. A width of at least 110 columns - (80+2+26+2) is needed for align_status set to left or right.) + eight_bit_tty + If NetHack can, it should pass eight-bit character values (for exam- + ple, specified with the traps option) straight through to your ter- + minal (default off). - windowcolors - If NetHack can, it should display windows with the specified - foreground/background colors. Windows GUI only. The format is + font_map + if NetHack can, it should use a font by the chosen name for the map + window. + font_menu + If NetHack can, it should use a font by the chosen name for menu + windows. + font_message + If NetHack can, it should use a font by the chosen name for the mes- + sage window. + font_status + If NetHack can, it should use a font by the chosen name for the sta- + tus window. - NetHack 3.6 February 3, 2023 + font_text + If NetHack can, it should use a font by the chosen name for text + windows. + font_size_map + If NetHack can, it should use this size font for the map window. + font_size_menu + If NetHack can, it should use this size font for menu windows. + font_size_message + If NetHack can, it should use this size font for the message window. + font_size_status + If NetHack can, it should use this size font for the status window. - NetHack Guidebook 68 + font_size_text + If NetHack can, it should use this size font for text windows. + fullscreen + If NetHack can, it should try and display on the entire screen + rather than in a window. - OPTION=windowcolors:wintype foreground/background + NetHack 3.6.7 February 3, 2023 - where wintype is one of "menu", "message", "status", or - "text", and foreground and background are colors, either a hexa- - decimal \'#rrggbb', one of the named colors (black, red, green, - brown, blue, magenta, cyan, orange, brightgreen, yellow, bright- - blue, brightmagenta, brightcyan, white, trueblack, gray, purple, - silver, maroon, fuchsia, lime, olive, navy, teal, aqua), or one - of Windows UI colors (activeborder, activecaption, appworkspace, - background, btnface, btnshadow, btntext, captiontext, graytext, - greytext, highlight, highlighttext, inactiveborder, inactivecap- - tion, menu, menutext, scrollbar, window, windowframe, window- - text). - wraptext - If NetHack can, it should wrap long lines of text if they don't - fit in the visible area of the window. - 9.6. Platform-specific Customization options - Here are explanations of options that are used by specific - platforms or ports to customize and change the port behavior. - altkeyhandling - Select an alternate way to handle keystrokes (Win32 tty NetHack - only). The name of the handling type is one of "default", - "ray", "340". + NetHack Guidebook 65 - altmeta - On Amiga, this option controls whether typing "Alt" plus anoth- - er key functions as a meta-shift for that key (default on). - altmeta - On other (non-Amiga) systems where this option is available, it - can be set to tell NetHack to convert a two character sequence - beginning with ESC into a meta-shifted version of the second - character (default off). - This conversion is only done for commands, not for other input - prompts. Note that typing one or more digits as a count prefix - prior to a command -- preceded by n if the number_pad option is - set -- is also subject to this conversion, so attempting to - abort the count by typing ESC will leave NetHack waiting for - another character to complete the two character sequence. Type - a second ESC to finish cancelling such a count. At other - prompts a single ESC suffices. + guicolor + Use color text and/or highlighting attributes when displaying some + non-map data (such as menu selector letters). Curses interface + only; default is on. - BIOS - Use BIOS calls to update the screen display quickly and to read - the keyboard (allowing the use of arrow keys to move) on ma- - chines with an IBM PC compatible BIOS ROM (default off, OS/2, - PC, and ST NetHack only). + large_font + If NetHack can, it should use a large font. + map_mode + If NetHack can, it should display the map in the manner specified. + player_selection + If NetHack can, it should pop up dialog boxes, or use prompts for + character selection. + popup_dialog + If NetHack can, it should pop up dialog boxes for input. - NetHack 3.6 February 3, 2023 + preload_tiles + If NetHack can, it should preload tiles into memory. For example, + in the protected mode MS-DOS version, control whether tiles get pre- + loaded into RAM at the start of the game. Doing so enhances perfor- + mance of the tile graphics, but uses more memory. (default on). + Cannot be set with the `O' command. + scroll_amount + If NetHack can, it should scroll the display by this number of cells + when the hero reaches the scroll_margin. + scroll_margin + If NetHack can, it should scroll the display when the hero or cursor + is this number of cells away from the edge of the window. + selectsaved + If NetHack can, it should display a menu of existing saved games for + the player to choose from at game startup, if it can. Not all ports + support this option. + softkeyboard + Display an onscreen keyboard. Handhelds are most likely to support + this option. - NetHack Guidebook 69 + splash_screen + If NetHack can, it should display an opening splash screen when it + starts up (default yes). + statuslines + Number of lines for traditional below-the-map status display. + Acceptable values are 2 and 3 (default is 2). Curses and tty inter- + faces only. + term_cols and - flush - (default off, Amiga NetHack only). - MACgraphics - (default on, Mac NetHack only). - page_wait - (default on, Mac NetHack only). - rawio - Force raw (non-cbreak) mode for faster output and more bullet- - proof input (MS-DOS sometimes treats `^P' as a printer toggle - without it) (default off, OS/2, PC, and ST NetHack only). - Note: DEC Rainbows hang if this is turned on. Cannot be set - with the `O' command. + NetHack 3.6.7 February 3, 2023 - soundcard - (default on, PC NetHack only). Cannot be set with the `O' com- - mand. - subkeyvalue - (Win32 tty NetHack only). May be used to alter the value of - keystrokes that the operating system returns to NetHack to help - compensate for international keyboard issues. OPTIONS=subkey- - value:171/92 will return 92 to NetHack, if 171 was originally - going to be returned. You can use multiple subkeyvalue state- - ments in the configuration file if needed. Cannot be set with - the `O' command. - video - Set the video mode used (PC NetHack only). Values are "autode- - tect", "default", or "vga". Setting "vga" (or "autodetect" - with vga hardware present) will cause the game to display - tiles. Cannot be set with the `O' command. - videocolors - Set the color palette for PC systems using NO_TERMS (default - 4-2-6-1-5-3-15-12-10-14-9-13-11, (PC NetHack only). The order - of colors is red, green, brown, blue, magenta, cyan, - bright.white, bright.red, bright.green, yellow, bright.blue, - bright.magenta, and bright.cyan. Cannot be set with the `O' - command. - videoshades - Set the intensity level of the three gray scales available (de- - fault dark normal light, PC NetHack only). If the game display - is difficult to read, try adjusting these scales; if this does - not correct the problem, try !color. Cannot be set with the - `O' command. + NetHack Guidebook 66 - 9.7. Regular Expressions - Regular expressions are normally POSIX extended regular ex- - pressions. It is possible to compile NetHack without regular + term_rows + Curses interface only. Number of columns and rows to use for the + display. Curses will attempt to resize to the values specified but + will settle for smaller sizes if they are too big. Default is the + current window size. - NetHack 3.6 February 3, 2023 + tiled_map + If NetHack can, it should display a tiled map if it can. + tile_file + Specify the name of an alternative tile file to override the + default. + tile_height + Specify the preferred height of each tile in a tile capable port. + tile_width + Specify the preferred width of each tile in a tile capable port + use_darkgray + Use bold black instead of blue for black glyphs (TTY only). - NetHack Guidebook 70 + use_inverse + If NetHack can, it should display inverse when the game specifies + it. + vary_msgcount + If NetHack can, it should display this number of messages at a time + in the message window. + windowborders + Whether to draw boxes around the map, status area, message area, and + persistent inventory window if enabled. Curses interface only. + Acceptable values are - expression support on a platform where there is no regular ex- - pression library. While this is not true of any modern platform, - if your NetHack was built this way, patterns are instead glob - patterns. This applies to Autopickup exceptions, Message types, - Menu colors, and User sounds. + 0 - off, never show borders + 1 - on, always show borders + 2 - auto, on if display is at least (24+2)x(80+2) (default) - 9.8. Configuring Autopickup Exceptions + (The 26x82 size threshold for `2' refers to number of rows and col- + umns of the display. A width of at least 110 columns (80+2+26+2) is + needed for align_status set to left or right.) - You can further refine the behavior of the autopickup option - beyond what is available through the pickup_types option. + windowcolors + If NetHack can, it should display windows with the specified fore- + ground/background colors. Windows GUI only. The format is - By placing autopickup_exception lines in your configuration - file, you can define patterns to be checked when the game is - about to autopickup something. + OPTION=windowcolors:wintype foreground/background - autopickup_exception - Sets an exception to the pickup_types option. The autopick- - up_exception option should be followed by a regular expression - to be used as a pattern to match against the singular form of - the description of an object at your location. + where wintype is one of "menu", "message", "status", or "text", + and foreground and background are colors, either a hexadecimal + \'#rrggbb', one of the named colors (black, red, green, brown, blue, + magenta, cyan, orange, brightgreen, yellow, brightblue, brightmagenta, + brightcyan, white, trueblack, gray, purple, silver, maroon, fuchsia, - In addition, some characters are treated specially if they oc- - cur as the first character in the pattern, specifically: - < - always pickup an object that matches rest of pattern; - > - never pickup an object that matches rest of pattern. + NetHack 3.6.7 February 3, 2023 - The autopickup_exception rules are processed in the order in - which they appear in your configuration file, thus allowing a - later rule to override an earlier rule. - Exceptions can be set with the `O' command, but because they - are not included in your configuration file, they won't be in - effect if you save and then restore your game. autopickup_ex- - ception rules and not saved with the game. - Here are some examples: - autopickup_exception="<*arrow" - autopickup_exception=">*corpse" - autopickup_exception=">* cursed*" - The first example above will result in autopickup of any - type of arrow. The second example results in the exclusion of - any corpse from autopickup. The last example results in the ex- - clusion of items known to be cursed from autopickup. + NetHack Guidebook 67 - 9.9. Changing Key Bindings - It is possible to change the default key bindings of some - special commands, menu accelerator keys, and extended commands, - by using BIND stanzas in the configuration file. Format is key, - followed by the command to bind to, separated by a colon. The - key can be a single character ("x"), a control key ("^X", "C-x"), + lime, olive, navy, teal, aqua), or one of Windows UI colors (active- + border, activecaption, appworkspace, background, btnface, btnshadow, + btntext, captiontext, graytext, greytext, highlight, highlighttext, + inactiveborder, inactivecaption, menu, menutext, scrollbar, window, + windowframe, windowtext). - NetHack 3.6 February 3, 2023 + wraptext + If NetHack can, it should wrap long lines of text if they don't fit + in the visible area of the window. + 9.6. Platform-specific Customization options + Here are explanations of options that are used by specific plat- + forms or ports to customize and change the port behavior. + altkeyhandling + Select an alternate way to handle keystrokes (Win32 tty NetHack + only). The name of the handling type is one of "default", "ray", + "340". + altmeta + On Amiga, this option controls whether typing "Alt" plus another key + functions as a meta-shift for that key (default on). - NetHack Guidebook 71 + altmeta + On other (non-Amiga) systems where this option is available, it can + be set to tell NetHack to convert a two character sequence beginning + with ESC into a meta-shifted version of the second character + (default off). + This conversion is only done for commands, not for other input + prompts. Note that typing one or more digits as a count prefix + prior to a command -- preceded by n if the number_pad option is set + -- is also subject to this conversion, so attempting to abort the + count by typing ESC will leave NetHack waiting for another character + to complete the two character sequence. Type a second ESC to finish + cancelling such a count. At other prompts a single ESC suffices. + BIOS + Use BIOS calls to update the screen display quickly and to read the + keyboard (allowing the use of arrow keys to move) on machines with + an IBM PC compatible BIOS ROM (default off, OS/2, PC, and ST NetHack + only). - a meta key ("M-x"), or a three-digit decimal ASCII code. + flush + (default off, Amiga NetHack only). - For example: + MACgraphics + (default on, Mac NetHack only). - BIND=^X:getpos.autodescribe - BIND={:menu_first_page - BIND=v:loot + page_wait + (default on, Mac NetHack only). - Extended command keys - You can bind multiple keys to the same extended command. Un- - bind a key by using "nothing" as the extended command to bind - to. You can also bind the "", "", and "" - keys. - Menu accelerator keys - The menu control or accelerator keys can also be rebound via - OPTIONS lines in the configuration file. You cannot bind ob- - ject symbols into menu accelerators. - Special command keys - Below are the special commands you can rebind. Some of them - can be bound to same keys with no problems, others are in the - same "context", and if bound to same keys, only one of those - commands will be available. Special command can only be bound - to a single key. - count - Prefix key to start a count, to repeat a command this many - times. With number_pad only. Default is `n'. + NetHack 3.6.7 February 3, 2023 - doinv - Show inventory. With number_pad only. Default is `0'. - fight - Prefix key to force fight a direction. Default is `F'. - fight.numpad - Prefix key to force fight a direction. With number_pad only. - Default is `-'. - getdir.help - When asked for a direction, the key to show the help. Default - is `?'. - getdir.self - When asked for a direction, the key to target yourself. De- - fault is `.'. + NetHack Guidebook 68 - getdir.self2 - When asked for a direction, the key to target yourself. De- - fault is `s'. - getpos.autodescribe - When asked for a location, the key to toggle autodescribe. + rawio + Force raw (non-cbreak) mode for faster output and more bulletproof + input (MS-DOS sometimes treats `^P' as a printer toggle without it) + (default off, OS/2, PC, and ST NetHack only). Note: DEC Rainbows + hang if this is turned on. Cannot be set with the `O' command. - NetHack 3.6 February 3, 2023 + soundcard + (default on, PC NetHack only). Cannot be set with the `O' command. + subkeyvalue + (Win32 tty NetHack only). May be used to alter the value of key- + strokes that the operating system returns to NetHack to help compen- + sate for international keyboard issues. OPTIONS=subkeyvalue:171/92 + will return 92 to NetHack, if 171 was originally going to be + returned. You can use multiple subkeyvalue statements in the con- + figuration file if needed. Cannot be set with the `O' command. + video + Set the video mode used (PC NetHack only). Values are "autodetect", + "default", or "vga". Setting "vga" (or "autodetect" with vga hard- + ware present) will cause the game to display tiles. Cannot be set + with the `O' command. + videocolors + Set the color palette for PC systems using NO_TERMS (default + 4-2-6-1-5-3-15-12-10-14-9-13-11, (PC NetHack only). The order of + colors is red, green, brown, blue, magenta, cyan, bright.white, + bright.red, bright.green, yellow, bright.blue, bright.magenta, and + bright.cyan. Cannot be set with the `O' command. + videoshades + Set the intensity level of the three gray scales available (default + dark normal light, PC NetHack only). If the game display is diffi- + cult to read, try adjusting these scales; if this does not correct + the problem, try !color. Cannot be set with the `O' command. - NetHack Guidebook 72 + 9.7. Regular Expressions + Regular expressions are normally POSIX extended regular expres- + sions. It is possible to compile NetHack without regular expression + support on a platform where there is no regular expression library. + While this is not true of any modern platform, if your NetHack was + built this way, patterns are instead glob patterns. This applies to + Autopickup exceptions, Message types, Menu colors, and User sounds. + 9.8. Configuring Autopickup Exceptions - Default is `#'. + You can further refine the behavior of the autopickup option + beyond what is available through the pickup_types option. - getpos.all.next - When asked for a location, the key to go to next closest inter- - esting thing. Default is `a'. + By placing autopickup_exception lines in your configuration file, + you can define patterns to be checked when the game is about to + autopickup something. - getpos.all.prev - When asked for a location, the key to go to previous closest - interesting thing. Default is `A'. - getpos.door.next - When asked for a location, the key to go to next closest door - or doorway. Default is `d'. - getpos.door.prev - When asked for a location, the key to go to previous closest - door or doorway. Default is `D'. + NetHack 3.6.7 February 3, 2023 - getpos.help - When asked for a location, the key to show help. Default is - `?'. - getpos.mon.next - When asked for a location, the key to go to next closest mon- - ster. Default is `m'. - getpos.mon.prev - When asked for a location, the key to go to previous closest - monster. Default is `M'. - getpos.obj.next - When asked for a location, the key to go to next closest ob- - ject. Default is `o'. - getpos.obj.prev - When asked for a location, the key to go to previous closest - object. Default is `O'. + NetHack Guidebook 69 - getpos.menu - When asked for a location, and using one of the next or previ- - ous keys to cycle through targets, toggle showing a menu in- - stead. Default is `!'. - getpos.moveskip - When asked for a location, and using the shifted movement keys - or meta-digit keys to fast-move around, move by skipping the - same glyphs instead of by 8 units. Default is `*'. - getpos.filter - When asked for a location, change the filtering mode when using - one of the next or previous keys to cycle through targets. - Toggles between no filtering, in view only, and in the same - area only. Default is `"'. + autopickup_exception + Sets an exception to the pickup_types option. The autopickup_excep- + tion option should be followed by a regular expression to be used as + a pattern to match against the singular form of the description of + an object at your location. + In addition, some characters are treated specially if they occur as + the first character in the pattern, specifically: + < - always pickup an object that matches rest of pattern; + > - never pickup an object that matches rest of pattern. - NetHack 3.6 February 3, 2023 + The autopickup_exception rules are processed in the order in which + they appear in your configuration file, thus allowing a later rule + to override an earlier rule. + Exceptions can be set with the `O' command, but because they are not + included in your configuration file, they won't be in effect if you + save and then restore your game. autopickup_exception rules and not + saved with the game. + Here are some examples: + autopickup_exception="<*arrow" + autopickup_exception=">*corpse" + autopickup_exception=">* cursed*" + The first example above will result in autopickup of any type of + arrow. The second example results in the exclusion of any corpse from + autopickup. The last example results in the exclusion of items known + to be cursed from autopickup. - NetHack Guidebook 73 + 9.9. Changing Key Bindings + It is possible to change the default key bindings of some special + commands, menu accelerator keys, and extended commands, by using BIND + stanzas in the configuration file. Format is key, followed by the + command to bind to, separated by a colon. The key can be a single + character ("x"), a control key ("^X", "C-x"), a meta key ("M-x"), or a + three-digit decimal ASCII code. + For example: - getpos.pick - When asked for a location, the key to choose the location, and - possibly ask for more info. Default is `.'. + BIND=^X:getpos.autodescribe + BIND={:menu_first_page + BIND=v:loot - getpos.pick.once - When asked for a location, the key to choose the location, and - skip asking for more info. Default is `,'. + Extended command keys + You can bind multiple keys to the same extended command. Unbind a + key by using "nothing" as the extended command to bind to. You can + also bind the "", "", and "" keys. - getpos.pick.quick - When asked for a location, the key to choose the location, skip - asking for more info, and exit the location asking loop. De- - fault is `;'. + Menu accelerator keys + The menu control or accelerator keys can also be rebound via OPTIONS - getpos.pick.verbose - When asked for a location, the key to choose the location, and - show more info without asking. Default is `:'. - getpos.self - When asked for a location, the key to go to your location. De- - fault is `@'. + NetHack 3.6.7 February 3, 2023 - getpos.unexplored.next - When asked for a location, the key to go to next closest unex- - plored location. Default is `x'. - getpos.unexplored.prev - When asked for a location, the key to go to previous closest - unexplored location. Default is `X'. - getpos.valid - When asked for a location, the key to go to show valid target - locations. Default is `$'. - getpos.valid.next - When asked for a location, the key to go to next closest valid - location. Default is `z'. - getpos.valid.prev - When asked for a location, the key to go to previous closest - valid location. Default is `Z'. + NetHack Guidebook 70 - nopickup - Prefix key to move without picking up items. Default is `m'. - redraw - Key to redraw the screen. Default is `^R'. - redraw.numpad - Key to redraw the screen. With number_pad only. Default is - `^L'. + lines in the configuration file. You cannot bind object symbols + into menu accelerators. - repeat - Key to repeat previous command. Default is `^A'. + Special command keys + Below are the special commands you can rebind. Some of them can be + bound to same keys with no problems, others are in the same "con- + text", and if bound to same keys, only one of those commands will be + available. Special command can only be bound to a single key. + count + Prefix key to start a count, to repeat a command this many times. + With number_pad only. Default is `n'. + doinv + Show inventory. With number_pad only. Default is `0'. - NetHack 3.6 February 3, 2023 + fight + Prefix key to force fight a direction. Default is `F'. + fight.numpad + Prefix key to force fight a direction. With number_pad only. + Default is `-'. + getdir.help + When asked for a direction, the key to show the help. Default is + `?'. + getdir.self + When asked for a direction, the key to target yourself. Default is + `.'. + getdir.self2 + When asked for a direction, the key to target yourself. Default is + `s'. - NetHack Guidebook 74 + getpos.autodescribe + When asked for a location, the key to toggle autodescribe. Default + is `#'. + getpos.all.next + When asked for a location, the key to go to next closest interesting + thing. Default is `a'. + getpos.all.prev + When asked for a location, the key to go to previous closest inter- + esting thing. Default is `A'. - reqmenu - Prefix key to request menu from some commands. Default is `m'. + getpos.door.next + When asked for a location, the key to go to next closest door or + doorway. Default is `d'. - run - Prefix key to run towards a direction. Default is `G'. + getpos.door.prev + When asked for a location, the key to go to previous closest door or + doorway. Default is `D'. - run.nopickup - Prefix key to run towards a direction without picking up items - on the way. Default is `M'. - run.numpad - Prefix key to run towards a direction. With number_pad only. - Default is `5'. + NetHack 3.6.7 February 3, 2023 - rush - Prefix key to rush towards a direction. Default is `g'. - 9.10. Configuring Message Types - You can change the way the messages are shown in the message - area, when the message matches a user-defined pattern. - In general, the configuration file entries to describe the - message types look like this: MSGTYPE=type "pattern" - type - how the message should be shown; - pattern - the pattern to match. + NetHack Guidebook 71 - The pattern should be a regular expression. - Allowed types are: - show - show message normally; - hide - never show the message; - stop - wait for user with more-prompt; - norep - show the message once, but not again if no other mes- - sage is shown in between. + getpos.help + When asked for a location, the key to show help. Default is `?'. - Here's an example of message types using NetHack's internal - pattern matching facility: + getpos.mon.next + When asked for a location, the key to go to next closest monster. + Default is `m'. - MSGTYPE=stop "You feel hungry." - MSGTYPE=hide "You displaced *." + getpos.mon.prev + When asked for a location, the key to go to previous closest mon- + ster. Default is `M'. - specifies that whenever a message "You feel hungry" is shown, - the user is prompted with more-prompt, and a message matching - "You displaced ." is not shown at all. + getpos.obj.next + When asked for a location, the key to go to next closest object. + Default is `o'. - The order of the defined MSGTYPE lines is important; the last - matching rule is used. Put the general case first, exceptions - below them. + getpos.obj.prev + When asked for a location, the key to go to previous closest object. + Default is `O'. + getpos.menu + When asked for a location, and using one of the next or previous + keys to cycle through targets, toggle showing a menu instead. + Default is `!'. + getpos.moveskip + When asked for a location, and using the shifted movement keys or + meta-digit keys to fast-move around, move by skipping the same + glyphs instead of by 8 units. Default is `*'. + getpos.filter + When asked for a location, change the filtering mode when using one + of the next or previous keys to cycle through targets. Toggles + between no filtering, in view only, and in the same area only. + Default is `"'. + getpos.pick + When asked for a location, the key to choose the location, and pos- + sibly ask for more info. Default is `.'. - NetHack 3.6 February 3, 2023 + getpos.pick.once + When asked for a location, the key to choose the location, and skip + asking for more info. Default is `,'. + getpos.pick.quick + When asked for a location, the key to choose the location, skip ask- + ing for more info, and exit the location asking loop. Default is + `;'. + getpos.pick.verbose + When asked for a location, the key to choose the location, and show + more info without asking. Default is `:'. + getpos.self + When asked for a location, the key to go to your location. Default - NetHack Guidebook 75 + NetHack 3.6.7 February 3, 2023 - 9.11. Configuring Menu Colors - Some platforms allow you to define colors used in menu lines - when the line matches a user-defined pattern. At this time the - tty, curses, win32tty and win32gui interfaces support this. - In general, the configuration file entries to describe the - menu color mappings look like this: + NetHack Guidebook 72 - MENUCOLOR="pattern"=color&attribute - pattern - the pattern to match; - color - the color to use for lines matching the pat- - tern; - attribute - the attribute to use for lines matching the - pattern. The attribute is optional, and if - left out, you must also leave out the preced- - ing ampersand. If no attribute is defined, - no attribute is used. - The pattern should be a regular expression. + is `@'. - Allowed colors are black, red, green, brown, blue, magenta, - cyan, gray, orange, light-green, yellow, light-blue, light-ma- - genta, light-cyan, and white. And no-color, the default fore- - ground color, which isn't necessarily the same as any of the - other colors. + getpos.unexplored.next + When asked for a location, the key to go to next closest unexplored + location. Default is `x'. - Allowed attributes are none, bold, dim, underline, blink, and - inverse. "Normal" is a synonym for "none". Note that the - platform used may interpret the attributes any way it wants. + getpos.unexplored.prev + When asked for a location, the key to go to previous closest unex- + plored location. Default is `X'. - Here's an example of menu colors using NetHack's internal pat- - tern matching facility: + getpos.valid + When asked for a location, the key to go to show valid target loca- + tions. Default is `$'. - MENUCOLOR="* blessed *"=green - MENUCOLOR="* cursed *"=red - MENUCOLOR="* cursed *(being worn)"=red&underline + getpos.valid.next + When asked for a location, the key to go to next closest valid loca- + tion. Default is `z'. - specifies that any menu line with " blessed " contained in it - will be shown in green color, lines with " cursed " will be - shown in red, and lines with " cursed " followed by "(being - worn)" on the same line will be shown in red color and under- - lined. You can have multiple MENUCOLOR entries in your config- - uration file, and the last MENUCOLOR line that matches a menu - line will be used for the line. + getpos.valid.prev + When asked for a location, the key to go to previous closest valid + location. Default is `Z'. - Note that if you intend to have one or more color specifica- - tions match " uncursed ", you will probably want to turn the im- - plicit_uncursed option off so that all items known to be uncursed - are actually displayed with the "uncursed" description. + nopickup + Prefix key to move without picking up items. Default is `m'. + redraw + Key to redraw the screen. Default is `^R'. + redraw.numpad + Key to redraw the screen. With number_pad only. Default is `^L'. + repeat + Key to repeat previous command. Default is `^A'. + reqmenu + Prefix key to request menu from some commands. Default is `m'. - NetHack 3.6 February 3, 2023 + run + Prefix key to run towards a direction. Default is `G'. + run.nopickup + Prefix key to run towards a direction without picking up items on + the way. Default is `M'. + run.numpad + Prefix key to run towards a direction. With number_pad only. + Default is `5'. + rush + Prefix key to rush towards a direction. Default is `g'. - NetHack Guidebook 76 - 9.12. Configuring User Sounds - Some platforms allow you to define sound files to be played - when a message that matches a user-defined pattern is delivered - to the message window. At this time the Qt port and the win32tty - and win32gui ports support the use of user sounds. + NetHack 3.6.7 February 3, 2023 - The following configuration file entries are relevant to - mapping user sounds to messages: - SOUNDDIR - The directory that houses the sound files to be played. - SOUND - An entry that maps a sound file to a user-specified message - pattern. Each SOUND entry is broken down into the following - parts: - MESG - message window mapping (the only one supported in - 3.6); + + NetHack Guidebook 73 + + + + 9.10. Configuring Message Types + + You can change the way the messages are shown in the message + area, when the message matches a user-defined pattern. + + In general, the configuration file entries to describe the mes- + sage types look like this: MSGTYPE=type "pattern" + + type - how the message should be shown; + pattern - the pattern to match. + + The pattern should be a regular expression. + + Allowed types are: + + show - show message normally; + hide - never show the message; + stop - wait for user with more-prompt; + norep - show the message once, but not again if no other message is + shown in between. + + Here's an example of message types using NetHack's internal pattern + matching facility: + + MSGTYPE=stop "You feel hungry." + MSGTYPE=hide "You displaced *." + + specifies that whenever a message "You feel hungry" is shown, the + user is prompted with more-prompt, and a message matching "You dis- + placed ." is not shown at all. + + The order of the defined MSGTYPE lines is important; the last match- + ing rule is used. Put the general case first, exceptions below them. + + 9.11. Configuring Menu Colors + + Some platforms allow you to define colors used in menu lines when + the line matches a user-defined pattern. At this time the tty, + curses, win32tty and win32gui interfaces support this. + + In general, the configuration file entries to describe the menu + color mappings look like this: + + MENUCOLOR="pattern"=color&attribute + pattern - the pattern to match; - sound file - the sound file to play; - volume - the volume to be set while playing the sound file. + color - the color to use for lines matching the pattern; + attribute - the attribute to use for lines matching the pat- + tern. The attribute is optional, and if left out, + you must also leave out the preceding ampersand. + If no attribute is defined, no attribute is used. + + The pattern should be a regular expression. + + + + NetHack 3.6.7 February 3, 2023 + + + + + + NetHack Guidebook 74 + + + + Allowed colors are black, red, green, brown, blue, magenta, cyan, + gray, orange, light-green, yellow, light-blue, light-magenta, light- + cyan, and white. And no-color, the default foreground color, which + isn't necessarily the same as any of the other colors. + + Allowed attributes are none, bold, dim, underline, blink, and + inverse. "Normal" is a synonym for "none". Note that the platform + used may interpret the attributes any way it wants. + + Here's an example of menu colors using NetHack's internal pattern + matching facility: + + MENUCOLOR="* blessed *"=green + MENUCOLOR="* cursed *"=red + MENUCOLOR="* cursed *(being worn)"=red&underline + + specifies that any menu line with " blessed " contained in it will + be shown in green color, lines with " cursed " will be shown in red, + and lines with " cursed " followed by "(being worn)" on the same + line will be shown in red color and underlined. You can have multi- + ple MENUCOLOR entries in your configuration file, and the last MENU- + COLOR line that matches a menu line will be used for the line. + + Note that if you intend to have one or more color specifications + match " uncursed ", you will probably want to turn the + implicit_uncursed option off so that all items known to be uncursed + are actually displayed with the "uncursed" description. + + 9.12. Configuring User Sounds + + Some platforms allow you to define sound files to be played when + a message that matches a user-defined pattern is delivered to the mes- + sage window. At this time the Qt port and the win32tty and win32gui + ports support the use of user sounds. + + The following configuration file entries are relevant to mapping + user sounds to messages: + + SOUNDDIR + The directory that houses the sound files to be played. + + SOUND + An entry that maps a sound file to a user-specified message pattern. + Each SOUND entry is broken down into the following parts: + + MESG - message window mapping (the only one supported in 3.6); + pattern - the pattern to match; + sound file - the sound file to play; + volume - the volume to be set while playing the sound file. + + The pattern should be a POSIX extended regular expression. + + + + + + NetHack 3.6.7 February 3, 2023 + + + + + + NetHack Guidebook 75 + + + + 9.13. Configuring Status Hilites + + Your copy of NetHack may have been compiled with support for + "Status Hilites". If so, you can customize your game display by set- + ting thresholds to change the color or appearance of fields in the + status display. + + The format for defining status colors is: + + OPTION=hilite_status:field-name/behavior/color&attributes + + For example, the following line in your configuration file will + cause the hitpoints field to display in the color red if your hit- + points drop to or below a threshold of 30%: + + OPTION=hilite_status:hitpoints/<=30%/red/normal + + (That example is actually specifying red&normal for <=30% and no- + color&normal for >30%.) + + For another example, the following line in your configuration + file will cause wisdom to be displayed red if it drops and green if it + rises: + + OPTION=hilite_status:wisdom/down/red/up/green + + Allowed colors are black, red, green, brown, blue, magenta, cyan, + gray, orange, light-green, yellow, light-blue, light-magenta, light- + cyan, and white. And "no-color", the default foreground color on the + display, which is not necessarily the same as black or white or any of + the other colors. + + Allowed attributes are none, bold, dim, underline, blink, and + inverse. "Normal" is a synonym for "none"; they should not be used in + combination with any of the other attributes. + + To specify both a color and an attribute, use `&' to combine + them. To specify multiple attributes, use `+' to combine those. For + example: "magenta&inverse+dim". + + Note that the display may substitute or ignore particular + attributes depending upon its capabilities, and in general may inter- + pret the attributes any way it wants. For example, on some display + systems a request for bold might yield blink or vice versa. On oth- + ers, issuing an attribute request while another is already set up will + replace the earlier attribute rather than combine with it. Since + NetHack issues attribute requests sequentially (at least with the tty + interface) rather than all at once, the only way a situation like that + can be controlled is to specify just one attribute. + + You can adjust the appearance of the following status fields: + title dungeon-level experience-level + strength gold experience + + + + NetHack 3.6.7 February 3, 2023 + + + + + + NetHack Guidebook 76 + + + + dexterity hitpoints HD + constitution hitpoints-max time + intelligence power hunger + wisdom power-max carrying-capacity + charisma armor-class condition + alignment score + + The pseudo-field "characteristics" can be used to set all six of + Str, Dex, Con, Int, Wis, and Cha at once. "HD" is "hit dice", an + approximation of experience level displayed when polymorphed. + "experience", "time", and "score" are conditionally displayed + depending upon your other option settings. + + Instead of a behavior, "condition" takes the following condition + flags: stone, slime, strngl, foodpois, termill, blind, deaf, stun, + conf, hallu, lev, fly, and ride. You can use "major_troubles" as an + alias for stone through termill, "minor_troubles" for blind through + hallu, "movement" for lev, fly, and ride, and "all" for every condi- + tion. + + Allowed behaviors are "always", "up", "down", "changed", a percent- + age or absolute number threshold, or text to match against. + + * "always" will set the default attributes for that field. + + * "up", "down" set the field attributes for when the field value + changes upwards or downwards. This attribute times out after + statushilites turns. + + * "changed" sets the field attribute for when the field value + changes. This attribute times out after statushilites turns. + (If a field has both a "changed" rule and an "up" or "down" + rule which matches a change in the field's value, the "up" or + "down" one takes precedence.) + + * percentage sets the field attribute when the field value + matches the percentage. It is specified as a number between 0 + and 100, followed by `%' (percent sign). If the percentage is + prefixed with `<=' or `>=', it also matches when value is below + or above the percentage. Use prefix `<' or `>' to match when + strictly below or above. (The numeric limit is relaxed + slightly for those: >-1% and <101% are allowed.) Only four + fields support percentage rules. Percentages for "hitpoints" + and "power" are straightforward; they're based on the corre- + sponding maximum field. Percentage highlight rules are also + allowed for "experience level" and "experience points" (valid + when the showexp option is enabled). For those, the percentage + is based on the progress from the start of the current experi- + ence level to the start of the next level. So if level 2 + starts at 20 points and level 3 starts at 40 points, having 30 + points is 50% and 35 points is 75%. 100% is unattainable for + experience because you'll gain a level and the calculations + will be reset for that new level, but a rule for =100% is + allowed and matches the special case of being exactly 1 experi- + + + NetHack 3.6.7 February 3, 2023 + + + + + + NetHack Guidebook 77 + + + + ence point short of the next level. + + * absolute value sets the attribute when the field value matches + that number. The number must be 0 or higher, except for + "armor-class' which allows negative values, and may optionally + be preceded by `='. If the number is preceded by `<=' or `>=' + instead, it also matches when value is below or above. If the + prefix is `<' or `>', only match when strictly above or below. + + * text match sets the attribute when the field value matches the + text. Text matches can only be used for "alignment", "carry- + ing-capacity", "hunger", "dungeon-level", and "title". For + title, only the role's rank title is tested; the character's + name is ignored. + + The in-game options menu can help you determine the correct syn- + tax for a configuration file. + + The whole feature can be disabled by setting option statushilites + to 0. + + Example hilites: + + OPTION=hilite_status: gold/up/yellow/down/brown + OPTION=hilite_status: characteristics/up/green/down/red + OPTION=hilite_status: hitpoints/100%/gray&normal + OPTION=hilite_status: hitpoints/<100%/green&normal + OPTION=hilite_status: hitpoints/<66%/yellow&normal + OPTION=hilite_status: hitpoints/<50%/orange&normal + OPTION=hilite_status: hitpoints/<33%/red&bold + OPTION=hilite_status: hitpoints/<15%/red&inverse + OPTION=hilite_status: condition/major/orange&inverse + OPTION=hilite_status: condition/lev+fly/red&inverse + + 9.14. Modifying NetHack Symbols + + NetHack can load entire symbol sets from the symbol file. + + The options that are used to select a particular symbol set from + the symbol file are: + + symset + Set the name of the symbol set that you want to load. + + roguesymset + Set the name of the symbol set that you want to load for display on + the rogue level. + + You can also override one or more symbols using the SYMBOLS and + ROGUESYMBOLS configuration file options. Symbols are specified as + name:value pairs. Note that NetHack escape-processes the value string + in conventional C fashion. This means that \ is a prefix to take the + following character literally. Thus \ needs to be represented as \\. + The special prefix form \m switches on the meta bit in the symbol + + + NetHack 3.6.7 February 3, 2023 + + + + + + NetHack Guidebook 78 + + + + value, and the ^ prefix causes the following character to be treated + as a control character. + + NetHack Symbols + Symbol Name Description + ----------------------------------------------------------------- + S_air (air) + _ S_altar (altar) + " S_amulet (amulet) + A S_angel (angelic being) + a S_ant (ant or other insect) + ^ S_anti_magic_trap (anti-magic field) + [ S_armor (suit or piece of armor) + [ S_armour (suit or piece of armor) + ^ S_arrow_trap (arrow trap) + 0 S_ball (iron ball) + # S_bars (iron bars) + B S_bat (bat or bird) + ^ S_bear_trap (bear trap) + - S_blcorn (bottom left corner) + b S_blob (blob) + + S_book (spellbook) + ) S_boomleft (boomerang open left) + ( S_boomright (boomerang open right) + ` S_boulder (boulder) + - S_brcorn (bottom right corner) + C S_centaur (centaur) + _ S_chain (iron chain) + # S_cloud (cloud) + c S_cockatrice (cockatrice) + $ S_coin (pile of coins) + # S_corr (corridor) + - S_crwall (wall) + # S_darkroom (dark room) + ^ S_dart_trap (dart trap) + & S_demon (major demon) + * S_digbeam (dig beam) + > S_dnladder (ladder down) + > S_dnstair (staircase down) + d S_dog (dog or other canine) + D S_dragon (dragon) + ; S_eel (sea monster) + E S_elemental (elemental) + / S_explode1 (explosion top left) + - S_explode2 (explosion top center) + \ S_explode3 (explosion top right) + | S_explode4 (explosion middle left) + S_explode5 (explosion middle center) + | S_explode6 (explosion middle right) + \ S_explode7 (explosion bottom left) + - S_explode8 (explosion bottom center) + / S_explode9 (explosion bottom right) + e S_eye (eye or sphere) + + + + NetHack 3.6.7 February 3, 2023 + + + + + + NetHack Guidebook 79 + + + + ^ S_falling_rock_trap (falling rock trap) + f S_feline (cat or other feline) + ^ S_fire_trap (fire trap) + ! S_flashbeam (flash beam) + % S_food (piece of food) + { S_fountain (fountain) + F S_fungus (fungus or mold) + * S_gem (gem or rock) + S_ghost (ghost) + H S_giant (giant humanoid) + G S_gnome (gnome) + ' S_golem (golem) + | S_grave (grave) + g S_gremlin (gremlin) + - S_hbeam (horizontal beam [zap animation]) + # S_hcdbridge (horizontal raised drawbridge) + + S_hcdoor (closed door in horizontal wall) + . S_hodbridge (horizontal lowered drawbridge) + | S_hodoor (open door in horizontal wall) + ^ S_hole (hole) + @ S_human (human or elf) + h S_humanoid (humanoid) + - S_hwall (horizontal wall) + . S_ice (ice) + i S_imp (imp or minor demon) + I S_invisible (invisible monster) + J S_jabberwock (jabberwock) + j S_jelly (jelly) + k S_kobold (kobold) + K S_kop (Keystone Kop) + ^ S_land_mine (land mine) + } S_lava (molten lava) + l S_leprechaun (leprechaun) + ^ S_level_teleporter (level teleporter) + L S_lich (lich) + y S_light (light) + # S_litcorr (lit corridor) + : S_lizard (lizard) + \ S_lslant (diagonal beam [zap animation]) + ^ S_magic_portal (magic portal) + ^ S_magic_trap (magic trap) + m S_mimic (mimic) + ] S_mimic_def (mimic) + M S_mummy (mummy) + N S_naga (naga) + . S_ndoor (doorway without door) + n S_nymph (nymph) + O S_ogre (ogre) + o S_orc (orc) + p S_piercer (piercer) + ^ S_pit (pit) + # S_poisoncloud (poison cloud) + ^ S_polymorph_trap (polymorph trap) + + + + NetHack 3.6.7 February 3, 2023 + + + + + + NetHack Guidebook 80 + + + + } S_pool (water) + ! S_potion (potion) + P S_pudding (pudding or ooze) + q S_quadruped (quadruped) + Q S_quantmech (quantum mechanic) + = S_ring (ring) + ` S_rock (boulder or statue) + r S_rodent (rodent) + ^ S_rolling_boulder_trap (rolling boulder trap) + . S_room (floor of a room) + / S_rslant (diagonal beam [zap animation]) + ^ S_rust_trap (rust trap) + R S_rustmonst (rust monster or disenchanter) + ? S_scroll (scroll) + # S_sink (sink) + ^ S_sleeping_gas_trap (sleeping gas trap) + S S_snake (snake) + s S_spider (arachnid or centipede) + ^ S_spiked_pit (spiked pit) + ^ S_squeaky_board (squeaky board) + 0 S_ss1 (magic shield 1 of 4) + # S_ss2 (magic shield 2 of 4) + @ S_ss3 (magic shield 3 of 4) + * S_ss4 (magic shield 4 of 4) + ^ S_statue_trap (statue trap) + S_stone (solid rock or unexplored terrain + or dark part of a room) + ] S_strange_obj (strange object) + - S_sw_bc (swallow bottom center) + \ S_sw_bl (swallow bottom left) + / S_sw_br (swallow bottom right) + | S_sw_ml (swallow middle left) + | S_sw_mr (swallow middle right) + - S_sw_tc (swallow top center) + / S_sw_tl (swallow top left) + \ S_sw_tr (swallow top right) + - S_tdwall (wall) + ^ S_teleportation_trap (teleportation trap) + \ S_throne (opulent throne) + - S_tlcorn (top left corner) + | S_tlwall (wall) + ( S_tool (useful item (pick-axe, key, lamp...)) + ^ S_trap_door (trap door) + t S_trapper (trapper or lurker above) + - S_trcorn (top right corner) + # S_tree (tree) + T S_troll (troll) + | S_trwall (wall) + - S_tuwall (wall) + U S_umber (umber hulk) + u S_unicorn (unicorn or horse) + < S_upladder (ladder up) + < S_upstair (staircase up) + + + + NetHack 3.6.7 February 3, 2023 + + + + + + NetHack Guidebook 81 + + + + V S_vampire (vampire) + | S_vbeam (vertical beam [zap animation]) + # S_vcdbridge (vertical raised drawbridge) + + S_vcdoor (closed door in vertical wall) + . S_venom (splash of venom) + ^ S_vibrating_square (vibrating square) + . S_vodbridge (vertical lowered drawbridge) + - S_vodoor (open door in vertical wall) + v S_vortex (vortex) + | S_vwall (vertical wall) + / S_wand (wand) + } S_water (water) + ) S_weapon (weapon) + " S_web (web) + w S_worm (worm) + ~ S_worm_tail (long worm tail) + W S_wraith (wraith) + x S_xan (xan or other extraordinary insect) + X S_xorn (xorn) + Y S_yeti (apelike creature) + Z S_zombie (zombie) + z S_zruty (zruty) + S_pet_override (any pet if ACCESSIBILITY=1 is set) + S_hero_override (hero if ACCESSIBILITY=1 is set) + + Notes: + + * Several symbols in this table appear to be blank. They are the + space character, except for S_pet_override and S_hero_override which + don't have any default value and can only be used if enabled in the + "sysconf" file. + + * S_rock is misleadingly named; rocks and stones use S_gem. Statues + and boulders are the rock being referred to, but since version + 3.6.0, statues are displayed as the monster they depict. So S_rock + is only used for boulders and not used at all if overridden by the + more specific S_boulder. + + 9.15. Configuring NetHack for Play by the Blind + + NetHack can be set up to use only standard ASCII characters for + making maps of the dungeons. This makes the MS-DOS versions of NetHack + completely accessible to the blind who use speech and/or Braille + access technologies. Players will require a good working knowledge of + their screen-reader's review features, and will have to know how to + navigate horizontally and vertically character by character. They will + also find the search capabilities of their screen-readers to be quite + valuable. Be certain to examine this Guidebook before playing so you + have an idea what the screen layout is like. You'll also need to be + able to locate the PC cursor. It is always where your character is + located. Merely searching for an @-sign will not always find your + character since there are other humanoids represented by the same + sign. Your screen-reader should also have a function which gives you + the row and column of your review cursor and the PC cursor. These co- + + + NetHack 3.6.7 February 3, 2023 + + + + + + NetHack Guidebook 82 + + + + ordinates are often useful in giving players a better sense of the + overall location of items on the screen. + + NetHack can also be compiled with support for sending the game + messages to an external program, such as a text-to-speech synthesizer. + If the "#version" extended command shows "external program as a mes- + sage handler", your NetHack has been compiled with the capability. + When compiling NetHack from source on Linux and other POSIX systems, + define MSGHANDLER to enable it. To use the capability, set the envi- + ronment variable NETHACK_MSGHANDLER to an executable, which will be + executed with the game message as the program's only parameter. + + While it is not difficult for experienced users to edit the + defaults.nh file to accomplish this, novices may find this task some- + what daunting. Included within the "symbols" file of all official + distributions of NetHack is a symset called NHAccess. Selecting that + symset in your configuration file will cause the game to run in a man- + ner accessible to the blind. After you have gained some experience + with the game and with editing files, you may want to alter settings + via SYMBOLS= and ROGUESYMBOLS= in your configuration file to better + suit your preferences. See the previous section for the special sym- + bols S_pet_override to force a consistent symbol for all pets and + S_hero_override to force a unique symbol for the player character if + accessibility is enabled in the sysconf file. + + The most crucial settings to make the game more accessible are: + + symset:NHAccess + Load a symbol set appropriate for use by blind players. + + roguesymset:NHAccess + Load a symbol set for the rogue level that is appropriate for use by + blind players. + + menustyle:traditional + This will assist in the interface to speech synthesizers. + + nomenu_overlay + Show menus on a cleared screen and aligned to the left edge. + + number_pad + A lot of speech access programs use the number-pad to review the + screen. If this is the case, disable the number_pad option and use + the traditional Rogue-like commands. + + autodescribe + Automatically describe the terrain under the cursor when targeting. + + mention_walls + Give feedback messages when walking towards a wall or when travel + command was interrupted. + + whatis_coord:compass + When targeting with cursor, describe the cursor position with coor- + + + NetHack 3.6.7 February 3, 2023 + + + + + + NetHack Guidebook 83 + + + + dinates relative to your character. + + whatis_filter:area + When targeting with cursor, filter possible locations so only those + in the same area (eg. same room, or same corridor) are considered. + + whatis_moveskip + When targeting with cursor and using fast-move, skip the same glyphs + instead of moving 8 units at a time. + + nostatus_updates + Prevent updates to the status lines at the bottom of the screen, if + your screen-reader reads those lines. The same information can be + seen via the "#attributes" command. + + 9.16. Global Configuration for System Administrators + + If NetHack is compiled with the SYSCF option, a system adminis- + trator should set up a global configuration; this is a file in the + same format as the traditional per-user configuration file (see + above). This file should be named sysconf and placed in the same + directory as the other NetHack support files. The options recognized + in this file are listed below. Any option not set uses a compiled-in + default (which may not be appropriate for your system). + + WIZARDS = A space-separated list of user names who are allowed to + play in debug mode (commonly referred to as wizard mode). A value + of a single asterisk (*) allows anyone to start a game in debug + mode. + + SHELLERS = A list of users who are allowed to use the shell escape + command (!). The syntax is the same as WIZARDS. + + EXPLORERS = A list of users who are allowed to use the explore mode. + The syntax is the same as WIZARDS. + + MAXPLAYERS = Limit the maximum number of games that can be running + at the same time. + + SUPPORT = A string explaining how to get local support (no default + value). + + RECOVER = A string explaining how to recover a game on this system + (no default value). + + SEDUCE = 0 or 1 to disable or enable, respectively, the SEDUCE + option. When disabled, incubi and succubi behave like nymphs. + + CHECK_PLNAME = Setting this to 1 will make the EXPLORERS, WIZARDS, + and SHELLERS check for the player name instead of the user's login + name. + + CHECK_SAVE_UID = 0 or 1 to disable or enable, respectively, the UID + (used identification number) checking for save files (to verify that + + + NetHack 3.6.7 February 3, 2023 + + + + + + NetHack Guidebook 84 + + + + the user who is restoring is the same one who saved). + + The following options affect the score file: + + PERSMAX = Maximum number of entries for one person. + + ENTRYMAX = Maximum number of entries in the score file. + + POINTSMIN = Minimum number of points to get an entry in the score + file. + + PERS_IS_UID = 0 or 1 to use user names or numeric userids, respec- + tively, to identify unique people for the score file. + + MAX_STATUENAME_RANK = Maximum number of score file entries to use + for random statue names (default is 10). + + ACCESSIBILITY = 0 or 1 to disable or enable, respectively, the abil- + ity for players to set S_pet_override and S_hero_override symbols in + their configuration file. + + PORTABLE_DEVICE_PATHS = 0 or 1 Windows OS only, the game will look + for all of its external files, and write to all of its output files + in one place rather than at the standard locations. + + DUMPLOGFILE = A filename where the end-of-game dumplog is saved. + Not defining this will prevent dumplog from being created. Only + available if your game is compiled with DUMPLOG. Allows the follow- + ing placeholders: + + %% - literal `%' + %v - version (eg. "3.6.3-0") + %u - game UID + %t - game start time, UNIX timestamp format + %T - current time, UNIX timestamp format + %d - game start time, YYYYMMDDhhmmss format + %D - current time, YYYYMMDDhhmmss format + %n - player name + %N - first character of player name + + 10. Scoring - The pattern should be a POSIX extended regular expression. + NetHack maintains a list of the top scores or scorers on your + machine, depending on how it is set up. In the latter case, each + account on the machine can post only one non-winning score on this + list. If you score higher than someone else on this list, or better + your previous score, you will be inserted in the proper place under + your current name. How many scores are kept can also be set up when + NetHack is compiled. - 9.13. Configuring Status Hilites + Your score is chiefly based upon how much experience you gained, + how much loot you accumulated, how deep you explored, and how the game + ended. If you quit the game, you escape with all of your gold intact. + If, however, you get killed in the Mazes of Menace, the guild will - Your copy of NetHack may have been compiled with support for - "Status Hilites". If so, you can customize your game display by - setting thresholds to change the color or appearance of fields in - the status display. - The format for defining status colors is: + NetHack 3.6.7 February 3, 2023 - OPTION=hilite_status:field-name/behavior/color&attributes - For example, the following line in your configuration file - will cause the hitpoints field to display in the color red if - your hitpoints drop to or below a threshold of 30%: - OPTION=hilite_status:hitpoints/<=30%/red/normal - (That example is actually specifying red&normal for <=30% and no- - color&normal for >30%.) - For another example, the following line in your configura- - tion file will cause wisdom to be displayed red if it drops and - green if it rises: + NetHack Guidebook 85 - OPTION=hilite_status:wisdom/down/red/up/green - Allowed colors are black, red, green, brown, blue, magenta, - cyan, gray, orange, light-green, yellow, light-blue, light- + only hear about 90% of your gold when your corpse is discovered + (adventurers have been known to collect finder's fees). So, consider + whether you want to take one last hit at that monster and possibly + live, or quit and stop with whatever you have. If you quit, you keep + all your gold, but if you swing and live, you might find more. - NetHack 3.6 February 3, 2023 + If you just want to see what the current top players/games list + is, you can type nethack -s all on most versions. + 11. Explore mode + NetHack is an intricate and difficult game. Novices might falter + in fear, aware of their ignorance of the means to survive. Well, fear + not. Your dungeon comes equipped with an "explore" or "discovery" + mode that enables you to keep old save files and cheat death, at the + paltry cost of not getting on the high score list. + There are two ways of enabling explore mode. One is to start the + game with the -X command-line switch or with the playmode:explore + option. The other is to issue the "#exploremode" extended command + while already playing the game. Starting a new game in explore mode + provides your character with a wand of wishing in initial inventory; + switching during play does not. The other benefits of explore mode + are left for the trepid reader to discover. + 11.1. Debug mode - NetHack Guidebook 77 + Debug mode, also known as wizard mode, is undocumented aside from + this brief description and the various "debug mode only" commands + listed among the command descriptions. It is intended for tracking + down problems within the program rather than to provide god-like pow- + ers to your character, and players who attempt debugging are expected + to figure out how to use it themselves. It is initiated by starting + the game with the -D command-line switch or with the playmode:debug + option. + For some systems, the player must be logged in under a particular + user name to be allowed to use debug mode; for others, the hero must + be given a particular character name (but may be any role; there's no + connection between "wizard mode" and the Wizard role). Attempting to + start a game in debug mode when not allowed or not available will + result in falling back to explore mode instead. + 12. Credits - magenta, light-cyan, and white. And "no-color", the default - foreground color on the display, which is not necessarily the - same as black or white or any of the other colors. + The original hack game was modeled on the Berkeley UNIX rogue + game. Large portions of this paper were shamelessly cribbed from A + Guide to the Dungeons of Doom, by Michael C. Toy and Kenneth C. R. C. + Arnold. Small portions were adapted from Further Exploration of the + Dungeons of Doom, by Ken Arromdee. - Allowed attributes are none, bold, dim, underline, blink, - and inverse. "Normal" is a synonym for "none"; they should not - be used in combination with any of the other attributes. + NetHack is the product of literally dozens of people's work. + Main events in the course of the game development are described below: - To specify both a color and an attribute, use `&' to combine - them. To specify multiple attributes, use `+' to combine those. - For example: "magenta&inverse+dim". - Note that the display may substitute or ignore particular - attributes depending upon its capabilities, and in general may - interpret the attributes any way it wants. For example, on some - display systems a request for bold might yield blink or vice ver- - sa. On others, issuing an attribute request while another is al- - ready set up will replace the earlier attribute rather than com- - bine with it. Since NetHack issues attribute requests sequen- - tially (at least with the tty interface) rather than all at once, - the only way a situation like that can be controlled is to speci- - fy just one attribute. - You can adjust the appearance of the following status - fields: - title dungeon-level experience-level - strength gold experience - dexterity hitpoints HD - constitution hitpoints-max time - intelligence power hunger - wisdom power-max carrying-capacity - charisma armor-class condition - alignment score + NetHack 3.6.7 February 3, 2023 - The pseudo-field "characteristics" can be used to set all six - of Str, Dex, Con, Int, Wis, and Cha at once. "HD" is "hit - dice", an approximation of experience level displayed when - polymorphed. "experience", "time", and "score" are condition- - ally displayed depending upon your other option settings. - Instead of a behavior, "condition" takes the following condi- - tion flags: stone, slime, strngl, foodpois, termill, blind, - deaf, stun, conf, hallu, lev, fly, and ride. You can use "ma- - jor_troubles" as an alias for stone through termill, "mi- - nor_troubles" for blind through hallu, "movement" for lev, fly, - and ride, and "all" for every condition. - Allowed behaviors are "always", "up", "down", "changed", a per- - centage or absolute number threshold, or text to match against. - * "always" will set the default attributes for that field. - * "up", "down" set the field attributes for when the field - value changes upwards or downwards. This attribute times + NetHack Guidebook 86 - NetHack 3.6 February 3, 2023 + Jay Fenlason wrote the original Hack, with help from Kenny Wood- + land, Mike Thome and Jon Payne. + Andries Brouwer did a major re-write, transforming Hack into a + very different game, and published (at least) three versions (1.0.1, + 1.0.2, and 1.0.3) for UNIX machines to the Usenet. + Don G. Kneller ported Hack 1.0.3 to Microsoft C and MS-DOS, pro- + ducing PC HACK 1.01e, added support for DEC Rainbow graphics in ver- + sion 1.03g, and went on to produce at least four more versions (3.0, + 3.2, 3.51, and 3.6). + R. Black ported PC HACK 3.51 to Lattice C and the Atari + 520/1040ST, producing ST Hack 1.03. - NetHack Guidebook 78 + Mike Stephenson merged these various versions back together, + incorporating many of the added features, and produced NetHack 1.4. + He then coordinated a cast of thousands in enhancing and debugging + NetHack 1.4 and released NetHack versions 2.2 and 2.3. + Later, Mike coordinated a major rewrite of the game, heading a + team which included Ken Arromdee, Jean-Christophe Collet, Steve Creps, + Eric Hendrickson, Izchak Miller, John Rupley, Mike Threepoint, and + Janet Walz, to produce NetHack 3.0c. + NetHack 3.0 was ported to the Atari by Eric R. Smith, to OS/2 by + Timo Hakulinen, and to VMS by David Gentzel. The three of them and + Kevin Darcy later joined the main NetHack Development Team to produce + subsequent revisions of 3.0. - out after statushilites turns. + Olaf Seibert ported NetHack 2.3 and 3.0 to the Amiga. Norm + Meluch, Stephen Spackman and Pierre Martineau designed overlay code + for PC NetHack 3.0. Johnny Lee ported NetHack 3.0 to the Macintosh. + Along with various other Dungeoneers, they continued to enhance the + PC, Macintosh, and Amiga ports through the later revisions of 3.0. - * "changed" sets the field attribute for when the field val- - ue changes. This attribute times out after statushilites - turns. (If a field has both a "changed" rule and an "up" - or "down" rule which matches a change in the field's val- - ue, the "up" or "down" one takes precedence.) + Headed by Mike Stephenson and coordinated by Izchak Miller and + Janet Walz, the NetHack Development Team which now included Ken + Arromdee, David Cohrs, Jean-Christophe Collet, Kevin Darcy, Matt Day, + Timo Hakulinen, Steve Linhart, Dean Luick, Pat Rankin, Eric Raymond, + and Eric Smith undertook a radical revision of 3.0. They re-struc- + tured the game's design, and re-wrote major parts of the code. They + added multiple dungeons, a new display, special individual character + quests, a new endgame and many other new features, and produced + NetHack 3.1. - * percentage sets the field attribute when the field value - matches the percentage. It is specified as a number be- - tween 0 and 100, followed by `%' (percent sign). If the - percentage is prefixed with `<=' or `>=', it also matches - when value is below or above the percentage. Use prefix - `<' or `>' to match when strictly below or above. (The - numeric limit is relaxed slightly for those: >-1% and - <101% are allowed.) Only four fields support percentage - rules. Percentages for "hitpoints" and "power" are - straightforward; they're based on the corresponding maxi- - mum field. Percentage highlight rules are also allowed - for "experience level" and "experience points" (valid when - the showexp option is enabled). For those, the percentage - is based on the progress from the start of the current ex- - perience level to the start of the next level. So if lev- - el 2 starts at 20 points and level 3 starts at 40 points, - having 30 points is 50% and 35 points is 75%. 100% is - unattainable for experience because you'll gain a level - and the calculations will be reset for that new level, but - a rule for =100% is allowed and matches the special case - of being exactly 1 experience point short of the next lev- - el. + Ken Lorber, Gregg Wonderly and Greg Olson, with help from Richard + Addison, Mike Passaretti, and Olaf Seibert, developed NetHack 3.1 for + the Amiga. - * absolute value sets the attribute when the field value - matches that number. The number must be 0 or higher, ex- - cept for "armor-class' which allows negative values, and - may optionally be preceded by `='. If the number is pre- - ceded by `<=' or `>=' instead, it also matches when value - is below or above. If the prefix is `<' or `>', only - match when strictly above or below. + Norm Meluch and Kevin Smolkowski, with help from Carl Schelin, + Stephen Spackman, Steve VanDevender, and Paul Winner, ported NetHack + 3.1 to the PC. - * text match sets the attribute when the field value matches - the text. Text matches can only be used for "alignment", - "carrying-capacity", "hunger", "dungeon-level", and "ti- - tle". For title, only the role's rank title is tested; - the character's name is ignored. - The in-game options menu can help you determine the correct - syntax for a configuration file. - The whole feature can be disabled by setting option sta- - tushilites to 0. + NetHack 3.6.7 February 3, 2023 - Example hilites: - NetHack 3.6 February 3, 2023 + NetHack Guidebook 87 + Jon W{tte and Hao-yang Wang, with help from Ross Brown, Mike Eng- + ber, David Hairston, Michael Hamel, Jonathan Handler, Johnny Lee, Tim + Lennan, Rob Menke, and Andy Swanson, developed NetHack 3.1 for the + Macintosh, porting it for MPW. Building on their development, Bart + House added a Think C port. + Timo Hakulinen ported NetHack 3.1 to OS/2. Eric Smith ported + NetHack 3.1 to the Atari. Pat Rankin, with help from Joshua + Delahunty, was responsible for the VMS version of NetHack 3.1. + Michael Allison ported NetHack 3.1 to Windows NT. - NetHack Guidebook 79 + Dean Luick, with help from David Cohrs, developed NetHack 3.1 for + X11. Warwick Allison wrote a tiled version of NetHack for the Atari; + he later contributed the tiles to the NetHack Development Team and + tile support was then added to other platforms. + The 3.2 NetHack Development Team, comprised of Michael Allison, + Ken Arromdee, David Cohrs, Jessie Collet, Steve Creps, Kevin Darcy, + Timo Hakulinen, Steve Linhart, Dean Luick, Pat Rankin, Eric Smith, + Mike Stephenson, Janet Walz, and Paul Winner, released version 3.2 in + April of 1996. + Version 3.2 marked the tenth anniversary of the formation of the + development team. In a testament to their dedication to the game, all + thirteen members of the original NetHack Development Team remained on + the team at the start of work on that release. During the interval + between the release of 3.1.3 and 3.2, one of the founding members of + the NetHack Development Team, Dr. Izchak Miller, was diagnosed with + cancer and passed away. That release of the game was dedicated to him + by the development and porting teams. - OPTION=hilite_status: gold/up/yellow/down/brown - OPTION=hilite_status: characteristics/up/green/down/red - OPTION=hilite_status: hitpoints/100%/gray&normal - OPTION=hilite_status: hitpoints/<100%/green&normal - OPTION=hilite_status: hitpoints/<66%/yellow&normal - OPTION=hilite_status: hitpoints/<50%/orange&normal - OPTION=hilite_status: hitpoints/<33%/red&bold - OPTION=hilite_status: hitpoints/<15%/red&inverse - OPTION=hilite_status: condition/major/orange&inverse - OPTION=hilite_status: condition/lev+fly/red&inverse + During the lifespan of NetHack 3.1 and 3.2, several enthusiasts + of the game added their own modifications to the game and made these + "variants" publicly available: - 9.14. Modifying NetHack Symbols + Tom Proudfoot and Yuval Oren created NetHack++, which was quickly + renamed NetHack--. Working independently, Stephen White wrote NetHack + Plus. Tom Proudfoot later merged NetHack Plus and his own NetHack-- + to produce SLASH. Larry Stewart-Zerba and Warwick Allison improved + the spell casting system with the Wizard Patch. Warwick Allison also + ported NetHack to use the Qt interface. - NetHack can load entire symbol sets from the symbol file. + Warren Cheung combined SLASH with the Wizard Patch to produce + Slash'EM, and with the help of Kevin Hugo, added more features. Kevin + later joined the NetHack Development Team and incorporated the best of + these ideas in NetHack 3.3. - The options that are used to select a particular symbol set - from the symbol file are: - - symset - Set the name of the symbol set that you want to load. - - roguesymset - Set the name of the symbol set that you want to load for dis- - play on the rogue level. + The final update to 3.2 was the bug fix release 3.2.3, which was + released simultaneously with 3.3.0 in December 1999 just in time for + the Year 2000. - You can also override one or more symbols using the SYMBOLS - and ROGUESYMBOLS configuration file options. Symbols are speci- - fied as name:value pairs. Note that NetHack escape-processes the - value string in conventional C fashion. This means that \ is a - prefix to take the following character literally. Thus \ needs - to be represented as \\. The special prefix form \m switches on - the meta bit in the symbol value, and the ^ prefix causes the - following character to be treated as a control character. - - NetHack Symbols - Symbol Name Description - ----------------------------------------------------------------- - S_air (air) - _ S_altar (altar) - " S_amulet (amulet) - A S_angel (angelic being) - a S_ant (ant or other insect) - ^ S_anti_magic_trap (anti-magic field) - [ S_armor (suit or piece of armor) - [ S_armour (suit or piece of armor) - ^ S_arrow_trap (arrow trap) - 0 S_ball (iron ball) - # S_bars (iron bars) - B S_bat (bat or bird) - ^ S_bear_trap (bear trap) - - S_blcorn (bottom left corner) - b S_blob (blob) - + S_book (spellbook) - - - - NetHack 3.6 February 3, 2023 - - - - - - NetHack Guidebook 80 - - - - ) S_boomleft (boomerang open left) - ( S_boomright (boomerang open right) - ` S_boulder (boulder) - - S_brcorn (bottom right corner) - C S_centaur (centaur) - _ S_chain (iron chain) - # S_cloud (cloud) - c S_cockatrice (cockatrice) - $ S_coin (pile of coins) - # S_corr (corridor) - - S_crwall (wall) - # S_darkroom (dark room) - ^ S_dart_trap (dart trap) - & S_demon (major demon) - * S_digbeam (dig beam) - > S_dnladder (ladder down) - > S_dnstair (staircase down) - d S_dog (dog or other canine) - D S_dragon (dragon) - ; S_eel (sea monster) - E S_elemental (elemental) - / S_explode1 (explosion top left) - - S_explode2 (explosion top center) - \ S_explode3 (explosion top right) - | S_explode4 (explosion middle left) - S_explode5 (explosion middle center) - | S_explode6 (explosion middle right) - \ S_explode7 (explosion bottom left) - - S_explode8 (explosion bottom center) - / S_explode9 (explosion bottom right) - e S_eye (eye or sphere) - ^ S_falling_rock_trap (falling rock trap) - f S_feline (cat or other feline) - ^ S_fire_trap (fire trap) - ! S_flashbeam (flash beam) - % S_food (piece of food) - { S_fountain (fountain) - F S_fungus (fungus or mold) - * S_gem (gem or rock) - S_ghost (ghost) - H S_giant (giant humanoid) - G S_gnome (gnome) - ' S_golem (golem) - | S_grave (grave) - g S_gremlin (gremlin) - - S_hbeam (horizontal beam [zap animation]) - # S_hcdbridge (horizontal raised drawbridge) - + S_hcdoor (closed door in horizontal wall) - . S_hodbridge (horizontal lowered drawbridge) - | S_hodoor (open door in horizontal wall) - ^ S_hole (hole) - @ S_human (human or elf) - h S_humanoid (humanoid) - - - - NetHack 3.6 February 3, 2023 - - - - - - NetHack Guidebook 81 - - - - - S_hwall (horizontal wall) - . S_ice (ice) - i S_imp (imp or minor demon) - I S_invisible (invisible monster) - J S_jabberwock (jabberwock) - j S_jelly (jelly) - k S_kobold (kobold) - K S_kop (Keystone Kop) - ^ S_land_mine (land mine) - } S_lava (molten lava) - l S_leprechaun (leprechaun) - ^ S_level_teleporter (level teleporter) - L S_lich (lich) - y S_light (light) - # S_litcorr (lit corridor) - : S_lizard (lizard) - \ S_lslant (diagonal beam [zap animation]) - ^ S_magic_portal (magic portal) - ^ S_magic_trap (magic trap) - m S_mimic (mimic) - ] S_mimic_def (mimic) - M S_mummy (mummy) - N S_naga (naga) - . S_ndoor (doorway without door) - n S_nymph (nymph) - O S_ogre (ogre) - o S_orc (orc) - p S_piercer (piercer) - ^ S_pit (pit) - # S_poisoncloud (poison cloud) - ^ S_polymorph_trap (polymorph trap) - } S_pool (water) - ! S_potion (potion) - P S_pudding (pudding or ooze) - q S_quadruped (quadruped) - Q S_quantmech (quantum mechanic) - = S_ring (ring) - ` S_rock (boulder or statue) - r S_rodent (rodent) - ^ S_rolling_boulder_trap (rolling boulder trap) - . S_room (floor of a room) - / S_rslant (diagonal beam [zap animation]) - ^ S_rust_trap (rust trap) - R S_rustmonst (rust monster or disenchanter) - ? S_scroll (scroll) - # S_sink (sink) - ^ S_sleeping_gas_trap (sleeping gas trap) - S S_snake (snake) - s S_spider (arachnid or centipede) - ^ S_spiked_pit (spiked pit) - ^ S_squeaky_board (squeaky board) - 0 S_ss1 (magic shield 1 of 4) - # S_ss2 (magic shield 2 of 4) - - - - NetHack 3.6 February 3, 2023 - - - - - - NetHack Guidebook 82 - - - - @ S_ss3 (magic shield 3 of 4) - * S_ss4 (magic shield 4 of 4) - ^ S_statue_trap (statue trap) - S_stone (solid rock or unexplored terrain - or dark part of a room) - ] S_strange_obj (strange object) - - S_sw_bc (swallow bottom center) - \ S_sw_bl (swallow bottom left) - / S_sw_br (swallow bottom right) - | S_sw_ml (swallow middle left) - | S_sw_mr (swallow middle right) - - S_sw_tc (swallow top center) - / S_sw_tl (swallow top left) - \ S_sw_tr (swallow top right) - - S_tdwall (wall) - ^ S_teleportation_trap (teleportation trap) - \ S_throne (opulent throne) - - S_tlcorn (top left corner) - | S_tlwall (wall) - ( S_tool (useful item (pick-axe, key, lamp...)) - ^ S_trap_door (trap door) - t S_trapper (trapper or lurker above) - - S_trcorn (top right corner) - # S_tree (tree) - T S_troll (troll) - | S_trwall (wall) - - S_tuwall (wall) - U S_umber (umber hulk) - u S_unicorn (unicorn or horse) - < S_upladder (ladder up) - < S_upstair (staircase up) - V S_vampire (vampire) - | S_vbeam (vertical beam [zap animation]) - # S_vcdbridge (vertical raised drawbridge) - + S_vcdoor (closed door in vertical wall) - . S_venom (splash of venom) - ^ S_vibrating_square (vibrating square) - . S_vodbridge (vertical lowered drawbridge) - - S_vodoor (open door in vertical wall) - v S_vortex (vortex) - | S_vwall (vertical wall) - / S_wand (wand) - } S_water (water) - ) S_weapon (weapon) - " S_web (web) - w S_worm (worm) - ~ S_worm_tail (long worm tail) - W S_wraith (wraith) - x S_xan (xan or other extraordinary insect) - X S_xorn (xorn) - Y S_yeti (apelike creature) - Z S_zombie (zombie) - z S_zruty (zruty) - - - - NetHack 3.6 February 3, 2023 - - - - - - NetHack Guidebook 83 - - - - S_pet_override (any pet if ACCESSIBILITY=1 is set) - S_hero_override (hero if ACCESSIBILITY=1 is set) - - Notes: - - * Several symbols in this table appear to be blank. They are the - space character, except for S_pet_override and S_hero_override - which don't have any default value and can only be used if en- - abled in the "sysconf" file. + The 3.3 NetHack Development Team, consisting of Michael Allison, + Ken Arromdee, David Cohrs, Jessie Collet, Steve Creps, Kevin Darcy, + Timo Hakulinen, Kevin Hugo, Steve Linhart, Ken Lorber, Dean Luick, Pat - * S_rock is misleadingly named; rocks and stones use S_gem. - Statues and boulders are the rock being referred to, but since - version 3.6.0, statues are displayed as the monster they de- - pict. So S_rock is only used for boulders and not used at all - if overridden by the more specific S_boulder. - 9.15. Configuring NetHack for Play by the Blind + NetHack 3.6.7 February 3, 2023 - NetHack can be set up to use only standard ASCII characters - for making maps of the dungeons. This makes the MS-DOS versions - of NetHack completely accessible to the blind who use speech - and/or Braille access technologies. Players will require a good - working knowledge of their screen-reader's review features, and - will have to know how to navigate horizontally and vertically - character by character. They will also find the search capabili- - ties of their screen-readers to be quite valuable. Be certain to - examine this Guidebook before playing so you have an idea what - the screen layout is like. You'll also need to be able to locate - the PC cursor. It is always where your character is located. - Merely searching for an @-sign will not always find your charac- - ter since there are other humanoids represented by the same sign. - Your screen-reader should also have a function which gives you - the row and column of your review cursor and the PC cursor. - These co-ordinates are often useful in giving players a better - sense of the overall location of items on the screen. - NetHack can also be compiled with support for sending the - game messages to an external program, such as a text-to-speech - synthesizer. If the "#version" extended command shows "external - program as a message handler", your NetHack has been compiled - with the capability. When compiling NetHack from source on Linux - and other POSIX systems, define MSGHANDLER to enable it. To use - the capability, set the environment variable NETHACK_MSGHANDLER - to an executable, which will be executed with the game message as - the program's only parameter. - While it is not difficult for experienced users to edit the - defaults.nh file to accomplish this, novices may find this task - somewhat daunting. Included within the "symbols" file of all of- - ficial distributions of NetHack is a symset called NHAccess. Se- - lecting that symset in your configuration file will cause the - game to run in a manner accessible to the blind. After you have - gained some experience with the game and with editing files, you - may want to alter settings via SYMBOLS= and ROGUESYMBOLS= in your - NetHack 3.6 February 3, 2023 + NetHack Guidebook 88 + Rankin, Eric Smith, Mike Stephenson, Janet Walz, and Paul Winner, + released 3.3.0 in December 1999 and 3.3.1 in August of 2000. + Version 3.3 offered many firsts. It was the first version to sep- + arate race and profession. The Elf class was removed in preference to + an elf race, and the races of dwarves, gnomes, and orcs made their + first appearance in the game alongside the familiar human race. Monk + and Ranger roles joined Archeologists, Barbarians, Cavemen, Healers, + Knights, Priests, Rogues, Samurai, Tourists, Valkyries and of course, + Wizards. It was also the first version to allow you to ride a steed, + and was the first version to have a publicly available web-site list- + ing all the bugs that had been discovered. Despite that constantly + growing bug list, 3.3 proved stable enough to last for more than a + year and a half. - NetHack Guidebook 84 + The 3.4 NetHack Development Team initially consisted of Michael + Allison, Ken Arromdee, David Cohrs, Jessie Collet, Kevin Hugo, Ken + Lorber, Dean Luick, Pat Rankin, Mike Stephenson, Janet Walz, and Paul + Winner, with Warwick Allison joining just before the release of + NetHack 3.4.0 in March 2002. + As with version 3.3, various people contributed to the game as a + whole as well as supporting ports on the different platforms that + NetHack runs on: + Pat Rankin maintained 3.4 for VMS. - configuration file to better suit your preferences. See the pre- - vious section for the special symbols S_pet_override to force a - consistent symbol for all pets and S_hero_override to force a - unique symbol for the player character if accessibility is en- - abled in the sysconf file. + Michael Allison maintained NetHack 3.4 for the MS-DOS platform. + Paul Winner and Yitzhak Sapir provided encouragement. - The most crucial settings to make the game more accessible - are: + Dean Luick, Mark Modrall, and Kevin Hugo maintained and enhanced + the Macintosh port of 3.4. - symset:NHAccess - Load a symbol set appropriate for use by blind players. + Michael Allison, David Cohrs, Alex Kompel, Dion Nicolaas, and + Yitzhak Sapir maintained and enhanced 3.4 for the Microsoft Windows + platform. Alex Kompel contributed a new graphical interface for the + Windows port. Alex Kompel also contributed a Windows CE port for + 3.4.1. - roguesymset:NHAccess - Load a symbol set for the rogue level that is appropriate for - use by blind players. + Ron Van Iwaarden was the sole maintainer of NetHack for OS/2 the + past several releases. Unfortunately Ron's last OS/2 machine stopped + working in early 2006. A great many thanks to Ron for keeping NetHack + alive on OS/2 all these years. - menustyle:traditional - This will assist in the interface to speech synthesizers. + Janne Salmijarvi and Teemu Suikki maintained and enhanced the + Amiga port of 3.4 after Janne Salmijarvi resurrected it for 3.3.1. - nomenu_overlay - Show menus on a cleared screen and aligned to the left edge. + Christian "Marvin" Bressler maintained 3.4 for the Atari after he + resurrected it for 3.3.1. - number_pad - A lot of speech access programs use the number-pad to review - the screen. If this is the case, disable the number_pad option - and use the traditional Rogue-like commands. + The release of NetHack 3.4.3 in December 2003 marked the begin- + ning of a long release hiatus. 3.4.3 proved to be a remarkably stable + version that provided continued enjoyment by the community for more + than a decade. The NetHack Development Team slowly and quietly contin- - autodescribe - Automatically describe the terrain under the cursor when tar- - geting. - mention_walls - Give feedback messages when walking towards a wall or when - travel command was interrupted. + NetHack 3.6.7 February 3, 2023 - whatis_coord:compass - When targeting with cursor, describe the cursor position with - coordinates relative to your character. - whatis_filter:area - When targeting with cursor, filter possible locations so only - those in the same area (eg. same room, or same corridor) are - considered. - whatis_moveskip - When targeting with cursor and using fast-move, skip the same - glyphs instead of moving 8 units at a time. - nostatus_updates - Prevent updates to the status lines at the bottom of the - screen, if your screen-reader reads those lines. The same in- - formation can be seen via the "#attributes" command. + NetHack Guidebook 89 - NetHack 3.6 February 3, 2023 + ued to work on the game behind the scenes during the tenure of 3.4.3. + It was during that same period that several new variants emerged + within the NetHack community. Notably sporkhack by Derek S. Ray, + unnethack by Patric Mueller, nitrohack and its successors originally + by Daniel Thaler and then by Alex Smith, and Dynahack by Tung Nguyen. + Some of those variants continue to be developed, maintained, and + enjoyed by the community to this day. + In September 2014, an interim snapshot of the code under develop- + ment was released publicly by other parties. Since that code was a + work-in-progress and had not gone through the process of debugging it + as a suitable release, it was decided that the version numbers present + on that code snapshot would be retired and never used in an official + NetHack release. An announcement was posted on the NetHack Development + Team's official nethack.org website to that effect, stating that there + would never be a 3.4.4, 3.5, or 3.5.0 official release version. + In January 2015, preparation began for the release of NetHack + 3.6. + At the beginning of development for what would eventually get + released as 3.6.0, the NetHack Development Team consisted of Warwick + Allison, Michael Allison, Ken Arromdee, David Cohrs, Jessie Collet, + Ken Lorber, Dean Luick, Pat Rankin, Mike Stephenson, Janet Walz, and + Paul Winner. In early 2015, ahead of the release of 3.6.0, new mem- + bers Sean Hunt, Pasi Kallinen, and Derek S. Ray joined the NetHack + Development Team. + Near the end of the development of 3.6.0, one of the significant + inspirations for many of the humorous and fun features found in the + game, author Terry Pratchett, passed away. NetHack 3.6.0 introduced a + tribute to him. - NetHack Guidebook 85 + 3.6.0 was released in December 2015, and merged work done by the + development team since the release of 3.4.3 with some of the beloved + community patches. Many bugs were fixed and some code was restruc- + tured. + The NetHack Development Team, as well as Steve VanDevender and + Kevin Smolkowski, ensured that NetHack 3.6 continued to operate on + various UNIX flavors and maintained the X11 interface. + Ken Lorber, Haoyang Wang, Pat Rankin, and Dean Luick maintained + the port of NetHack 3.6 for Mac OSX. - 9.16. Global Configuration for System Administrators + Michael Allison, David Cohrs, Bart House, Pasi Kallinen, Alex + Kompel, Dion Nicolaas, Derek S. Ray and Yitzhak Sapir maintained the + port of NetHack 3.6 for Microsoft Windows. - If NetHack is compiled with the SYSCF option, a system ad- - ministrator should set up a global configuration; this is a file - in the same format as the traditional per-user configuration file - (see above). This file should be named sysconf and placed in the - same directory as the other NetHack support files. The options - recognized in this file are listed below. Any option not set us- - es a compiled-in default (which may not be appropriate for your - system). + Pat Rankin attempted to keep the VMS port running for NetHack + 3.6, hindered by limited access. Kevin Smolkowski has updated and + tested it for the most recent version of OpenVMS (V8.4 as of this + writing) on Alpha and Integrity (aka Itanium aka IA64) but not VAX. - WIZARDS = A space-separated list of user names who are allowed - to play in debug mode (commonly referred to as wizard mode). A - value of a single asterisk (*) allows anyone to start a game in - debug mode. - SHELLERS = A list of users who are allowed to use the shell es- - cape command (!). The syntax is the same as WIZARDS. - EXPLORERS = A list of users who are allowed to use the explore - mode. The syntax is the same as WIZARDS. + NetHack 3.6.7 February 3, 2023 - MAXPLAYERS = Limit the maximum number of games that can be run- - ning at the same time. - SUPPORT = A string explaining how to get local support (no de- - fault value). - RECOVER = A string explaining how to recover a game on this - system (no default value). - SEDUCE = 0 or 1 to disable or enable, respectively, the SEDUCE - option. When disabled, incubi and succubi behave like nymphs. - CHECK_PLNAME = Setting this to 1 will make the EXPLORERS, WIZ- - ARDS, and SHELLERS check for the player name instead of the us- - er's login name. + NetHack Guidebook 90 - CHECK_SAVE_UID = 0 or 1 to disable or enable, respectively, the - UID (used identification number) checking for save files (to - verify that the user who is restoring is the same one who - saved). - The following options affect the score file: - PERSMAX = Maximum number of entries for one person. + Ray Chason resurrected the msdos port for 3.6 and contributed the + necessary updates to the community at large. - ENTRYMAX = Maximum number of entries in the score file. + In late April 2018, several hundred bug fixes for 3.6.0 and some + new features were assembled and released as NetHack 3.6.1. The + NetHack Development Team at the time of release of 3.6.1 consisted of + Warwick Allison, Michael Allison, Ken Arromdee, David Cohrs, Jessie + Collet, Pasi Kallinen, Ken Lorber, Dean Luick, Patric Mueller, Pat + Rankin, Derek S. Ray, Alex Smith, Mike Stephenson, Janet Walz, and + Paul Winner. - POINTSMIN = Minimum number of points to get an entry in the - score file. + In early May 2019, another 320 bug fixes along with some enhance- + ments and the adopted curses window port, were released as 3.6.2. - PERS_IS_UID = 0 or 1 to use user names or numeric userids, re- - spectively, to identify unique people for the score file. + Bart House, who had contributed to the game as a porting team + participant for decades, joined the NetHack Development Team in late + May 2019. + NetHack 3.6.3 was released on December 5, 2019 containing over + 190 bug fixes to NetHack 3.6.2. - NetHack 3.6 February 3, 2023 + NetHack 3.6.4 was released on December 18, 2019 containing a + security fix and a few bug fixes. + NetHack 3.6.5 was released on January 27, 2020 containing some + security fixes and a small number of bug fixes. + NetHack 3.6.6 was released on March 8, 2020 containing a security + fix and some bug fixes. + NetHack 3.6.7 was released in February 2023 containing a security + fix and some bug fixes. + The official NetHack web site is maintained by Ken Lorber at + https://www.nethack.org/. - NetHack Guidebook 86 + 12.1. Special Thanks + On behalf of the NetHack community, thank you very much once + again to M. Drew Streib and Pasi Kallinen for providing a public + NetHack server at nethack.alt.org. Thanks to Keith Simpson and Andy + Thomson for hardfought.org. Thanks to all those unnamed dungeoneers + who invest their time and effort into annual NetHack tournaments such + as Junethack, The November NetHack Tournament, and in days past, + devnull.net (gone for now, but not forgotten). - MAX_STATUENAME_RANK = Maximum number of score file entries to - use for random statue names (default is 10). - ACCESSIBILITY = 0 or 1 to disable or enable, respectively, the - ability for players to set S_pet_override and S_hero_override - symbols in their configuration file. - PORTABLE_DEVICE_PATHS = 0 or 1 Windows OS only, the game will - look for all of its external files, and write to all of its - output files in one place rather than at the standard loca- - tions. - DUMPLOGFILE = A filename where the end-of-game dumplog is - saved. Not defining this will prevent dumplog from being cre- - ated. Only available if your game is compiled with DUMPLOG. Al- - lows the following placeholders: - %% - literal `%' - %v - version (eg. "3.6.3-0") - %u - game UID - %t - game start time, UNIX timestamp format - %T - current time, UNIX timestamp format - %d - game start time, YYYYMMDDhhmmss format - %D - current time, YYYYMMDDhhmmss format - %n - player name - %N - first character of player name - 10. Scoring - NetHack maintains a list of the top scores or scorers on - your machine, depending on how it is set up. In the latter case, - each account on the machine can post only one non-winning score - on this list. If you score higher than someone else on this - list, or better your previous score, you will be inserted in the - proper place under your current name. How many scores are kept - can also be set up when NetHack is compiled. - Your score is chiefly based upon how much experience you - gained, how much loot you accumulated, how deep you explored, and - how the game ended. If you quit the game, you escape with all of - your gold intact. If, however, you get killed in the Mazes of - Menace, the guild will only hear about 90% of your gold when your - corpse is discovered (adventurers have been known to collect - finder's fees). So, consider whether you want to take one last - hit at that monster and possibly live, or quit and stop with - whatever you have. If you quit, you keep all your gold, but if - you swing and live, you might find more. - If you just want to see what the current top players/games - list is, you can type nethack -s all on most versions. + NetHack 3.6.7 February 3, 2023 - NetHack 3.6 February 3, 2023 + NetHack Guidebook 91 + 12.2. Dungeoneers + From time to time, some depraved individual out there in netland + sends a particularly intriguing modification to help out with the + game. The NetHack Development Team sometimes makes note of the names + of the worst of these miscreants in this, the list of Dungeoneers: - NetHack Guidebook 87 - 11. Explore mode - NetHack is an intricate and difficult game. Novices might - falter in fear, aware of their ignorance of the means to survive. - Well, fear not. Your dungeon comes equipped with an "explore" or - "discovery" mode that enables you to keep old save files and - cheat death, at the paltry cost of not getting on the high score - list. - There are two ways of enabling explore mode. One is to - start the game with the -X command-line switch or with the play- - mode:explore option. The other is to issue the "#exploremode" - extended command while already playing the game. Starting a new - game in explore mode provides your character with a wand of wish- - ing in initial inventory; switching during play does not. The - other benefits of explore mode are left for the trepid reader to - discover. - 11.1. Debug mode - Debug mode, also known as wizard mode, is undocumented aside - from this brief description and the various "debug mode only" - commands listed among the command descriptions. It is intended - for tracking down problems within the program rather than to pro- - vide god-like powers to your character, and players who attempt - debugging are expected to figure out how to use it themselves. - It is initiated by starting the game with the -D command-line - switch or with the playmode:debug option. - For some systems, the player must be logged in under a par- - ticular user name to be allowed to use debug mode; for others, - the hero must be given a particular character name (but may be - any role; there's no connection between "wizard mode" and the - Wizard role). Attempting to start a game in debug mode when not - allowed or not available will result in falling back to explore - mode instead. - 12. Credits - The original hack game was modeled on the Berkeley UNIX - rogue game. Large portions of this paper were shamelessly - cribbed from A Guide to the Dungeons of Doom, by Michael C. Toy - and Kenneth C. R. C. Arnold. Small portions were adapted from - Further Exploration of the Dungeons of Doom, by Ken Arromdee. - NetHack is the product of literally dozens of people's work. - Main events in the course of the game development are described - below: - Jay Fenlason wrote the original Hack, with help from Kenny - Woodland, Mike Thome and Jon Payne. - Andries Brouwer did a major re-write, transforming Hack into - a very different game, and published (at least) three versions - NetHack 3.6 February 3, 2023 - NetHack Guidebook 88 - (1.0.1, 1.0.2, and 1.0.3) for UNIX machines to the Usenet. - Don G. Kneller ported Hack 1.0.3 to Microsoft C and MS-DOS, - producing PC HACK 1.01e, added support for DEC Rainbow graphics - in version 1.03g, and went on to produce at least four more ver- - sions (3.0, 3.2, 3.51, and 3.6). - R. Black ported PC HACK 3.51 to Lattice C and the Atari - 520/1040ST, producing ST Hack 1.03. - Mike Stephenson merged these various versions back together, - incorporating many of the added features, and produced NetHack - 1.4. He then coordinated a cast of thousands in enhancing and - debugging NetHack 1.4 and released NetHack versions 2.2 and 2.3. - Later, Mike coordinated a major rewrite of the game, heading - a team which included Ken Arromdee, Jean-Christophe Collet, Steve - Creps, Eric Hendrickson, Izchak Miller, John Rupley, Mike Threep- - oint, and Janet Walz, to produce NetHack 3.0c. - NetHack 3.0 was ported to the Atari by Eric R. Smith, to - OS/2 by Timo Hakulinen, and to VMS by David Gentzel. The three - of them and Kevin Darcy later joined the main NetHack Development - Team to produce subsequent revisions of 3.0. - Olaf Seibert ported NetHack 2.3 and 3.0 to the Amiga. Norm - Meluch, Stephen Spackman and Pierre Martineau designed overlay - code for PC NetHack 3.0. Johnny Lee ported NetHack 3.0 to the - Macintosh. Along with various other Dungeoneers, they continued - to enhance the PC, Macintosh, and Amiga ports through the later - revisions of 3.0. - Headed by Mike Stephenson and coordinated by Izchak Miller - and Janet Walz, the NetHack Development Team which now included - Ken Arromdee, David Cohrs, Jean-Christophe Collet, Kevin Darcy, - Matt Day, Timo Hakulinen, Steve Linhart, Dean Luick, Pat Rankin, - Eric Raymond, and Eric Smith undertook a radical revision of 3.0. - They re-structured the game's design, and re-wrote major parts of - the code. They added multiple dungeons, a new display, special - individual character quests, a new endgame and many other new - features, and produced NetHack 3.1. - Ken Lorber, Gregg Wonderly and Greg Olson, with help from - Richard Addison, Mike Passaretti, and Olaf Seibert, developed - NetHack 3.1 for the Amiga. - Norm Meluch and Kevin Smolkowski, with help from Carl Sche- - lin, Stephen Spackman, Steve VanDevender, and Paul Winner, ported - NetHack 3.1 to the PC. - Jon W{tte and Hao-yang Wang, with help from Ross Brown, Mike - Engber, David Hairston, Michael Hamel, Jonathan Handler, Johnny - Lee, Tim Lennan, Rob Menke, and Andy Swanson, developed NetHack - 3.1 for the Macintosh, porting it for MPW. Building on their - NetHack 3.6 February 3, 2023 + Adam Aronow J. Ali Harlow Mikko Juola + Alex Kompel Janet Walz Nathan Eady + Alex Smith Janne Salmijarvi Norm Meluch + Andreas Dorn Jean-Christophe Collet Olaf Seibert + Andy Church Jeff Bailey Pasi Kallinen + Andy Swanson Jochen Erwied Pat Rankin + Andy Thomson John Kallen Patric Mueller - NetHack Guidebook 89 + NetHack 3.6.7 February 3, 2023 - development, Bart House added a Think C port. - Timo Hakulinen ported NetHack 3.1 to OS/2. Eric Smith port- - ed NetHack 3.1 to the Atari. Pat Rankin, with help from Joshua - Delahunty, was responsible for the VMS version of NetHack 3.1. - Michael Allison ported NetHack 3.1 to Windows NT. - Dean Luick, with help from David Cohrs, developed NetHack - 3.1 for X11. Warwick Allison wrote a tiled version of NetHack - for the Atari; he later contributed the tiles to the NetHack De- - velopment Team and tile support was then added to other plat- - forms. - The 3.2 NetHack Development Team, comprised of Michael Alli- - son, Ken Arromdee, David Cohrs, Jessie Collet, Steve Creps, Kevin - Darcy, Timo Hakulinen, Steve Linhart, Dean Luick, Pat Rankin, Er- - ic Smith, Mike Stephenson, Janet Walz, and Paul Winner, released - version 3.2 in April of 1996. - Version 3.2 marked the tenth anniversary of the formation of - the development team. In a testament to their dedication to the - game, all thirteen members of the original NetHack Development - Team remained on the team at the start of work on that release. - During the interval between the release of 3.1.3 and 3.2, one of - the founding members of the NetHack Development Team, Dr. Izchak - Miller, was diagnosed with cancer and passed away. That release - of the game was dedicated to him by the development and porting - teams. + NetHack Guidebook 92 - During the lifespan of NetHack 3.1 and 3.2, several enthusi- - asts of the game added their own modifications to the game and - made these "variants" publicly available: - Tom Proudfoot and Yuval Oren created NetHack++, which was - quickly renamed NetHack--. Working independently, Stephen White - wrote NetHack Plus. Tom Proudfoot later merged NetHack Plus and - his own NetHack-- to produce SLASH. Larry Stewart-Zerba and War- - wick Allison improved the spell casting system with the Wizard - Patch. Warwick Allison also ported NetHack to use the Qt inter- - face. - Warren Cheung combined SLASH with the Wizard Patch to pro- - duce Slash'EM, and with the help of Kevin Hugo, added more fea- - tures. Kevin later joined the NetHack Development Team and in- - corporated the best of these ideas in NetHack 3.3. + Ari Huttunen John Rupley Paul Winner + Bart House John S. Bien Pierre Martineau + Benson I. Margulies Johnny Lee Ralf Brown + Bill Dyer Jon W{tte Ray Chason + Boudewijn Waijers Jonathan Handler Richard Addison + Bruce Cox Joshua Delahunty Richard Beigel + Bruce Holloway Karl Garrison Richard P. Hughey + Bruce Mewborne Keizo Yamamoto Rob Menke + Carl Schelin Keith Simpson Robin Bandy + Chris Russo Ken Arnold Robin Johnson + David Cohrs Ken Arromdee Roderick Schertler + David Damerell Ken Lorber Roland McGrath + David Gentzel Ken Washikita Ron Van Iwaarden + David Hairston Kevin Darcy Ronnen Miller + Dean Luick Kevin Hugo Ross Brown + Del Lamb Kevin Sitze Sascha Wostmann + Derek S. Ray Kevin Smolkowski Scott Bigham + Deron Meranda Kevin Sweet Scott R. Turner + Dion Nicolaas Lars Huttar Sean Hunt + Dylan O'Donnell Leon Arnott Stephen Spackman + Eric Backus M. Drew Streib Stefan Thielscher + Eric Hendrickson Malcolm Ryan Stephen White + Eric R. Smith Mark Gooderum Steve Creps + Eric S. Raymond Mark Modrall Steve Linhart + Erik Andersen Marvin Bressler Steve VanDevender + Fredrik Ljungdahl Matthew Day Teemu Suikki + Frederick Roeber Merlyn LeRoy Tim Lennan + Gil Neiger Michael Allison Timo Hakulinen + Greg Laskin Michael Feir Tom Almy + Greg Olson Michael Hamel Tom West + Gregg Wonderly Michael Sokolov Warren Cheung + Hao-yang Wang Mike Engber Warwick Allison + Helge Hafting Mike Gallop Yitzhak Sapir + Irina Rempt-Drijfhout Mike Passaretti + Izchak Miller Mike Stephenson - The final update to 3.2 was the bug fix release 3.2.3, which - was released simultaneously with 3.3.0 in December 1999 just in - time for the Year 2000. - The 3.3 NetHack Development Team, consisting of Michael Al- - lison, Ken Arromdee, David Cohrs, Jessie Collet, Steve Creps, - Kevin Darcy, Timo Hakulinen, Kevin Hugo, Steve Linhart, Ken Lor- - ber, Dean Luick, Pat Rankin, Eric Smith, Mike Stephenson, Janet - NetHack 3.6 February 3, 2023 - NetHack Guidebook 90 - Walz, and Paul Winner, released 3.3.0 in December 1999 and 3.3.1 - in August of 2000. - Version 3.3 offered many firsts. It was the first version to - separate race and profession. The Elf class was removed in pref- - erence to an elf race, and the races of dwarves, gnomes, and orcs - made their first appearance in the game alongside the familiar - human race. Monk and Ranger roles joined Archeologists, Barbar- - ians, Cavemen, Healers, Knights, Priests, Rogues, Samurai, - Tourists, Valkyries and of course, Wizards. It was also the - first version to allow you to ride a steed, and was the first - version to have a publicly available web-site listing all the - bugs that had been discovered. Despite that constantly growing - bug list, 3.3 proved stable enough to last for more than a year - and a half. - The 3.4 NetHack Development Team initially consisted of - Michael Allison, Ken Arromdee, David Cohrs, Jessie Collet, Kevin - Hugo, Ken Lorber, Dean Luick, Pat Rankin, Mike Stephenson, Janet - Walz, and Paul Winner, with Warwick Allison joining just before - the release of NetHack 3.4.0 in March 2002. - As with version 3.3, various people contributed to the game - as a whole as well as supporting ports on the different platforms - that NetHack runs on: - Pat Rankin maintained 3.4 for VMS. - Michael Allison maintained NetHack 3.4 for the MS-DOS plat- - form. Paul Winner and Yitzhak Sapir provided encouragement. - Dean Luick, Mark Modrall, and Kevin Hugo maintained and en- - hanced the Macintosh port of 3.4. - Michael Allison, David Cohrs, Alex Kompel, Dion Nicolaas, - and Yitzhak Sapir maintained and enhanced 3.4 for the Microsoft - Windows platform. Alex Kompel contributed a new graphical inter- - face for the Windows port. Alex Kompel also contributed a Win- - dows CE port for 3.4.1. - Ron Van Iwaarden was the sole maintainer of NetHack for OS/2 - the past several releases. Unfortunately Ron's last OS/2 machine - stopped working in early 2006. A great many thanks to Ron for - keeping NetHack alive on OS/2 all these years. - Janne Salmijarvi and Teemu Suikki maintained and enhanced - the Amiga port of 3.4 after Janne Salmijarvi resurrected it for - 3.3.1. + NetHack 3.6.7 February 3, 2023 - Christian "Marvin" Bressler maintained 3.4 for the Atari af- - ter he resurrected it for 3.3.1. - The release of NetHack 3.4.3 in December 2003 marked the be- - ginning of a long release hiatus. 3.4.3 proved to be a remarkably - NetHack 3.6 February 3, 2023 + NetHack Guidebook 93 + Brand and product names are trademarks or registered trademarks + of their respective holders. - NetHack Guidebook 91 - stable version that provided continued enjoyment by the community - for more than a decade. The NetHack Development Team slowly and - quietly continued to work on the game behind the scenes during - the tenure of 3.4.3. It was during that same period that several - new variants emerged within the NetHack community. Notably - sporkhack by Derek S. Ray, unnethack by Patric Mueller, nitrohack - and its successors originally by Daniel Thaler and then by Alex - Smith, and Dynahack by Tung Nguyen. Some of those variants con- - tinue to be developed, maintained, and enjoyed by the community - to this day. - In September 2014, an interim snapshot of the code under de- - velopment was released publicly by other parties. Since that code - was a work-in-progress and had not gone through the process of - debugging it as a suitable release, it was decided that the ver- - sion numbers present on that code snapshot would be retired and - never used in an official NetHack release. An announcement was - posted on the NetHack Development Team's official nethack.org - website to that effect, stating that there would never be a - 3.4.4, 3.5, or 3.5.0 official release version. - In January 2015, preparation began for the release of - NetHack 3.6. - At the beginning of development for what would eventually - get released as 3.6.0, the NetHack Development Team consisted of - Warwick Allison, Michael Allison, Ken Arromdee, David Cohrs, - Jessie Collet, Ken Lorber, Dean Luick, Pat Rankin, Mike Stephen- - son, Janet Walz, and Paul Winner. In early 2015, ahead of the - release of 3.6.0, new members Sean Hunt, Pasi Kallinen, and Derek - S. Ray joined the NetHack Development Team. - Near the end of the development of 3.6.0, one of the signif- - icant inspirations for many of the humorous and fun features - found in the game, author Terry Pratchett, passed away. NetHack - 3.6.0 introduced a tribute to him. - 3.6.0 was released in December 2015, and merged work done by - the development team since the release of 3.4.3 with some of the - beloved community patches. Many bugs were fixed and some code was - restructured. - The NetHack Development Team, as well as Steve VanDevender - and Kevin Smolkowski, ensured that NetHack 3.6 continued to oper- - ate on various UNIX flavors and maintained the X11 interface. - Ken Lorber, Haoyang Wang, Pat Rankin, and Dean Luick main- - tained the port of NetHack 3.6 for Mac OSX. - Michael Allison, David Cohrs, Bart House, Pasi Kallinen, - Alex Kompel, Dion Nicolaas, Derek S. Ray and Yitzhak Sapir main- - tained the port of NetHack 3.6 for Microsoft Windows. - NetHack 3.6 February 3, 2023 - NetHack Guidebook 92 - Pat Rankin attempted to keep the VMS port running for - NetHack 3.6, hindered by limited access. Kevin Smolkowski has up- - dated and tested it for the most recent version of OpenVMS (V8.4 - as of this writing) on Alpha and Integrity (aka Itanium aka IA64) - but not VAX. - Ray Chason resurrected the msdos port for 3.6 and contrib- - uted the necessary updates to the community at large. - In late April 2018, several hundred bug fixes for 3.6.0 and - some new features were assembled and released as NetHack 3.6.1. - The NetHack Development Team at the time of release of 3.6.1 con- - sisted of Warwick Allison, Michael Allison, Ken Arromdee, David - Cohrs, Jessie Collet, Pasi Kallinen, Ken Lorber, Dean Luick, - Patric Mueller, Pat Rankin, Derek S. Ray, Alex Smith, Mike - Stephenson, Janet Walz, and Paul Winner. - In early May 2019, another 320 bug fixes along with some en- - hancements and the adopted curses window port, were released as - 3.6.2. - Bart House, who had contributed to the game as a porting - team participant for decades, joined the NetHack Development Team - in late May 2019. - NetHack 3.6.3 was released on December 5, 2019 containing - over 190 bug fixes to NetHack 3.6.2. - NetHack 3.6.4 was released on December 18, 2019 containing a - security fix and a few bug fixes. - NetHack 3.6.5 was released on January 27, 2020 containing - some security fixes and a small number of bug fixes. - NetHack 3.6.6 was released on March 8, 2020 containing a se- - curity fix and some bug fixes. - NetHack 3.6.7 was released in February 2023 containing a se- - curity fix and some bug fixes. - The official NetHack web site is maintained by Ken Lorber at - https://www.nethack.org/. - 12.1. SPECIAL THANKS - On behalf of the NetHack community, thank you very much once - again to M. Drew Streib and Pasi Kallinen for providing a public - NetHack server at nethack.alt.org. Thanks to Keith Simpson and - Andy Thomson for hardfought.org. Thanks to all those unnamed dun- - geoneers who invest their time and effort into annual NetHack - tournaments such as Junethack, The November NetHack Tournament - and in days past, devnull.net (gone for now, but not forgotten). - NetHack 3.6 February 3, 2023 - NetHack Guidebook 93 - - - - - - - - - - - - From time to time, some depraved individual out there in - netland sends a particularly intriguing modification to help out - with the game. The NetHack Development Team sometimes makes note - of the names of the worst of these miscreants in this, the list - of Dungeoneers: - Adam Aronow J. Ali Harlow Mikko Juola - Alex Kompel Janet Walz Nathan Eady - Alex Smith Janne Salmijarvi Norm Meluch - Andreas Dorn Jean-Christophe Collet Olaf Seibert - Andy Church Jeff Bailey Pasi Kallinen - Andy Swanson Jochen Erwied Pat Rankin - Andy Thomson John Kallen Patric Mueller - Ari Huttunen John Rupley Paul Winner - Bart House John S. Bien Pierre Martineau - Benson I. Margulies Johnny Lee Ralf Brown - Bill Dyer Jon W{tte Ray Chason - Boudewijn Waijers Jonathan Handler Richard Addison - Bruce Cox Joshua Delahunty Richard Beigel - Bruce Holloway Karl Garrison Richard P. Hughey - Bruce Mewborne Keizo Yamamoto Rob Menke - Carl Schelin Keith Simpson Robin Bandy - Chris Russo Ken Arnold Robin Johnson - David Cohrs Ken Arromdee Roderick Schertler - David Damerell Ken Lorber Roland McGrath - David Gentzel Ken Washikita Ron Van Iwaarden - David Hairston Kevin Darcy Ronnen Miller - Dean Luick Kevin Hugo Ross Brown - Del Lamb Kevin Sitze Sascha Wostmann - Derek S. Ray Kevin Smolkowski Scott Bigham - Deron Meranda Kevin Sweet Scott R. Turner - Dion Nicolaas Lars Huttar Sean Hunt - Dylan O'Donnell Leon Arnott Stephen Spackman - Eric Backus M. Drew Streib Stefan Thielscher - Eric Hendrickson Malcolm Ryan Stephen White - Eric R. Smith Mark Gooderum Steve Creps - Eric S. Raymond Mark Modrall Steve Linhart - Erik Andersen Marvin Bressler Steve VanDevender - Fredrik Ljungdahl Matthew Day Teemu Suikki - Frederick Roeber Merlyn LeRoy Tim Lennan - Gil Neiger Michael Allison Timo Hakulinen - Greg Laskin Michael Feir Tom Almy - Greg Olson Michael Hamel Tom West - Gregg Wonderly Michael Sokolov Warren Cheung - Hao-yang Wang Mike Engber Warwick Allison - Helge Hafting Mike Gallop Yitzhak Sapir - Irina Rempt-Drijfhout Mike Passaretti - Izchak Miller Mike Stephenson - Brand and product names are trademarks or registered trade- - marks of their respective holders. - NetHack 3.6 February 3, 2023 + NetHack 3.6.7 February 3, 2023 From f66ed8e7f89f808432b1a845b614aaa94ae0dfbf Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 11 Mar 2025 15:15:48 -0400 Subject: [PATCH 55/66] a couple of post-3.6.7 fixes36.7 updates --- doc/fixes36.7 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index 458d5a3159..54dc6f1086 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -64,4 +64,6 @@ drinkfountain() fate 24 to curse objects could end up cursing objects on the floor chain instead of the intended inventory object chain proceed with showpaths option even if the sysconf file is missing avoid memory leak in mk_artifact(); cherry-pick of 3cca4f27 from 3.7 WIP - +avoid using col in Guidebook build, since some distros no longer include + it, particularly some that use musl libc +back-port some nroff macro updates for Guidebook From 17f3bd17b53c3fdd604acf1c627ae9a7864e9430 Mon Sep 17 00:00:00 2001 From: nhmall Date: Wed, 12 Mar 2025 01:18:31 -0400 Subject: [PATCH 56/66] a couple of warnings got reported --- sys/unix/unixmain.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 75f95b7e23..09efb27f63 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -31,7 +31,7 @@ static void FDECL(chdirx, (const char *, BOOLEAN_P)); #endif /* CHDIR */ static boolean NDECL(whoami); static void FDECL(process_options, (int, char **)); -static void NDECL(opt_terminate); +static void NDECL(opt_terminate) NORETURN; #ifdef _M_UNIX extern void NDECL(check_sco_console); @@ -804,7 +804,7 @@ sys_random_seed() void after_opt_showpaths(dir) -const char *dir; +const char *dir UNUSED; { #ifdef CHDIR chdirx((char *) 0, 0); From a812127bf403af1d46acb5801b275ef4ed15afeb Mon Sep 17 00:00:00 2001 From: nhmall Date: Wed, 19 Mar 2025 08:48:38 -0400 Subject: [PATCH 57/66] resolution for GitHub #1400 - artifact gift The cherry-pick of a 3.7 fix was imperfectly done. Resolve #1400 --- src/artifact.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/artifact.c b/src/artifact.c index 33c4c9955a..9d157c9495 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -6,6 +6,7 @@ #include "hack.h" #include "artifact.h" #include "artilist.h" +#include "assert.h" /* * Note: both artilist[] and artiexist[] have a dummy element #0, @@ -128,7 +129,6 @@ mk_artifact(otmp, alignment) struct obj *otmp; /* existing object; ignored if alignment specified */ aligntyp alignment; /* target alignment, or A_NONE */ { - struct obj *artiobj; const struct artifact *a; int m, n, altn; boolean by_align = (alignment != A_NONE); @@ -195,17 +195,23 @@ aligntyp alignment; /* target alignment, or A_NONE */ /* make an appropriate object if necessary, then christen it */ if (by_align) { - artiobj = mksobj((int) a->otyp, TRUE, FALSE); - if (otmp) { + struct obj *artiobj = mksobj((int) a->otyp, TRUE, FALSE); + + /* nonnull value of 'otmp' is unexpected. Cope. */ + if (otmp) /* just in case; avoid orphaning */ dispose_of_orig_obj(otmp); - otmp = artiobj; - } - } - if (otmp) { - otmp = oname(otmp, a->name); - otmp->oartifact = m; - artiexist[m] = TRUE; + otmp = artiobj; } + /* + * otmp should be nonnull at this point: + * either the passed argument (if !by_align == A_NONE), or + * the result of mksobj() just above if by_align is an alignment. */ + assert(otmp != 0); + /* prevent erosion from generating */ + otmp->oeroded = otmp->oeroded2 = 0; + otmp = oname(otmp, a->name); + otmp->oartifact = m; /* probably already set by this point, but */ + artiexist[m] = 1; } else { /* nothing appropriate could be found; return original object */ if (by_align && otmp) { From 5db114a746bed252ed8176cc139d61b816fbac41 Mon Sep 17 00:00:00 2001 From: nhmall Date: Thu, 17 Apr 2025 13:37:08 -0400 Subject: [PATCH 58/66] allow build to complete with gcc-15 on Linux --- include/system.h | 12 ++++++++++++ sys/unix/hints/linux | 7 ++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/system.h b/include/system.h index a2cb51f409..14b15d09b6 100644 --- a/include/system.h +++ b/include/system.h @@ -60,9 +60,13 @@ typedef long off_t; #endif #ifndef SIG_RET_TYPE #if defined(NHSTDC) || defined(POSIX_TYPES) || defined(OS2) || defined(__DECC) +#if defined(LINUX) && defined(__GNUC__) +#define SIG_RET_TYPE __sighandler_t +#else #define SIG_RET_TYPE void (*)() #endif #endif +#endif #ifndef SIG_RET_TYPE #if defined(ULTRIX) || defined(SUNOS4) || defined(SVR3) || defined(SVR4) /* SVR3 is defined automatically by some systems */ @@ -95,8 +99,10 @@ E int FDECL(srandom, (unsigned int)); E long NDECL(lrand48); E void FDECL(srand48, (long)); #else +#ifndef LINUX E long lrand48(); E void srand48(); +#endif #endif /* MACOSX */ #endif /* BSD || ULTRIX || RANDOM */ @@ -351,6 +357,7 @@ E char *FDECL(memset, (char *, int, int)); #endif /* TOS */ #endif /* MICRO */ +#ifndef LINUX #if defined(BSD) && defined(ultrix) /* i.e., old versions of Ultrix */ E void sleep(); #endif @@ -360,6 +367,7 @@ E unsigned sleep(); #if defined(HPUX) E unsigned int FDECL(sleep, (unsigned int)); #endif +#endif #ifdef VMS E int FDECL(sleep, (unsigned)); #endif @@ -519,7 +527,11 @@ E char *FDECL(tgoto, (const char *, int, int)); #else #if !(defined(HPUX) && defined(_POSIX_SOURCE)) E int FDECL(tgetent, (char *, const char *)); +#if !(defined(LINUX) && defined(__GNUC__)) E void FDECL(tputs, (const char *, int, int (*)())); +#else +E int tputs(const char *, int, int (*)(int)); +#endif #endif E int FDECL(tgetnum, (const char *)); E int FDECL(tgetflag, (const char *)); diff --git a/sys/unix/hints/linux b/sys/unix/hints/linux index 573ae1d6c9..72d9f26baa 100644 --- a/sys/unix/hints/linux +++ b/sys/unix/hints/linux @@ -42,7 +42,12 @@ CLANGGTEQ18 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 18) ifeq "$(CLANGGTEQ18)" "1" CFLAGS+=-Wno-deprecated-non-prototype endif -endif # clang-specific ends here +# clang-specific ends here +else +# gcc-specific starts here +CFLAGS+=-Wno-old-style-definition +# gcc-specific here +endif # clang-specific or gcc-specific ends here LINK=$(CC) From 02337f21303b31a67593885d82e52a237c19e422 Mon Sep 17 00:00:00 2001 From: nhmall Date: Fri, 18 Apr 2025 08:51:12 -0400 Subject: [PATCH 59/66] build GitHub NetHack-3.6 with gcc-15 on Linux without warnings --- sys/unix/hints/linux | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sys/unix/hints/linux b/sys/unix/hints/linux index 72d9f26baa..fa7db7c237 100644 --- a/sys/unix/hints/linux +++ b/sys/unix/hints/linux @@ -37,19 +37,18 @@ CFLAGS+=-DCURSES_GRAPHICS #detection of clang vs gcc CCISCLANG := $(shell echo `$(CC) --version` | grep clang) ifneq "$(CCISCLANG)" "" -# clang-specific follows CLANGGTEQ18 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 18) ifeq "$(CLANGGTEQ18)" "1" +# clang-specific starts here CFLAGS+=-Wno-deprecated-non-prototype endif # clang-specific ends here else # gcc-specific starts here -CFLAGS+=-Wno-old-style-definition -# gcc-specific here +CFLAGS+=-Wno-old-style-definition -Wno-unused-result -Wno-format-overflow +# gcc-specific ends here endif # clang-specific or gcc-specific ends here - LINK=$(CC) # Only needed for GLIBC stack trace: LFLAGS=-rdynamic From 959c091320f808ded04f391cfd3b2877cd0de097 Mon Sep 17 00:00:00 2001 From: George Huebner Date: Sat, 23 Aug 2025 13:45:21 -0500 Subject: [PATCH 60/66] config.nh: fix example MENUCOLOR regex Matching literal parentheses requires escaping them with `\` --- doc/config.nh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/config.nh b/doc/config.nh index 4371582508..fced3d40c9 100644 --- a/doc/config.nh +++ b/doc/config.nh @@ -486,7 +486,7 @@ # Show all unholy water in red #MENUCOLOR=" unholy " = red # Show all cursed worn items in orange and underlined -#MENUCOLOR=" cursed .* (being worn)" = orange&underline +#MENUCOLOR=" cursed .* \(being worn\)" = orange&underline # Use the IBM character set rather than just plain ascii characters From 726701eb95c080f4def28d2a3ebecca19e41b5aa Mon Sep 17 00:00:00 2001 From: PatR Date: Fri, 12 Sep 2025 12:51:08 -0700 Subject: [PATCH 61/66] include crash-preventing 3.7 fix in 3.6 Using 'O' to interactively set a text match highlight for hunger can trigger a crash. Bug report #S14367 indicated in was an X11 issue but it is more general than that. Fixed a year ago with commit 4e2494c8595fce30de9a028a6ac0e21197c30972 in 3.7 when the fuzzer found it. --- src/botl.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/botl.c b/src/botl.c index 4c7dbf33a1..8908edb4c9 100644 --- a/src/botl.c +++ b/src/botl.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 botl.c $NHDT-Date: 1573178085 2019/11/08 01:54:45 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.148 $ */ +/* NetHack 3.6 botl.c $NHDT-Date: 1757734870 2025/09/12 19:41:10 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.149 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2006. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1970,6 +1970,13 @@ int arrmin, arrmax; start_menu(tmpwin); for (i = arrmin; i < arrmax; i++) { + /* 3.6.7+: manually cherry-picked from 3.7 commit + 4e2494c8595fce30de9a028a6ac0e21197c30972; + when interactively setting a text match highlight + for hunger, skip Null placeholder for "not hungry" */ + if (!arr[i]) + continue; + any = zeroany; any.a_int = i + adj; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, From 7fe59ef1dfe35b40a823f18c679b85b392b43b89 Mon Sep 17 00:00:00 2001 From: nhmall Date: Fri, 26 Sep 2025 08:45:25 -0400 Subject: [PATCH 62/66] fixes36.7 update --- doc/fixes36.7 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index 54dc6f1086..7f14da15f2 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -67,3 +67,5 @@ avoid memory leak in mk_artifact(); cherry-pick of 3cca4f27 from 3.7 WIP avoid using col in Guidebook build, since some distros no longer include it, particularly some that use musl libc back-port some nroff macro updates for Guidebook +prevent a crash when using 'O' to interactively set a text match highlight + for hunger From 9168d49a1f4ae54ec3ad030dfb79ab44587e0857 Mon Sep 17 00:00:00 2001 From: Aaron Lebahn Date: Thu, 2 Oct 2025 11:36:49 -0500 Subject: [PATCH 63/66] Fix typo in encyclopedia --- dat/data.base | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dat/data.base b/dat/data.base index 4046259a26..97473b6aac 100644 --- a/dat/data.base +++ b/dat/data.base @@ -2736,7 +2736,7 @@ knight And was a bugbear in men's eyes; But had the fortune in his age To live a fool and die a sage. - [ Don Quixote of La Mancha, by Miquel de Cervantes Saavedra ] + [ Don Quixote of La Mancha, by Miguel de Cervantes Saavedra ] ~kobold ??m* *kobold* The race of kobolds are reputed to be an artificial creation @@ -2852,7 +2852,7 @@ lance his lance into shivers, carrying him and his horse after it, and finally tumbled him a good way off from it on the field in evil plight. - [ Don Quixote of La Mancha, by Miquel de Cervantes Saavedra ] + [ Don Quixote of La Mancha, by Miguel de Cervantes Saavedra ] land mine Your heart is intact, your brain is not badly damaged, but the rest of your injuries are comparable to stepping on a land mine. You'd From 1452c803bdc7d2b85df41ba5e999ce780696508c Mon Sep 17 00:00:00 2001 From: nhmall Date: Wed, 14 Jan 2026 14:28:41 -0500 Subject: [PATCH 64/66] update COPYRIGHT_BANNER_A --- include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/patchlevel.h b/include/patchlevel.h index 722f6eb5f5..c933307d70 100644 --- a/include/patchlevel.h +++ b/include/patchlevel.h @@ -16,7 +16,7 @@ */ #define EDITLEVEL 0 -#define COPYRIGHT_BANNER_A "NetHack, Copyright 1985-2025" +#define COPYRIGHT_BANNER_A "NetHack, Copyright 1985-2026" #define COPYRIGHT_BANNER_B \ " By Stichting Mathematisch Centrum and M. Stephenson." /* COPYRIGHT_BANNER_C is generated by makedefs into date.h */ From be3d248a4fd56cf789270a8232c62def5a1fbe9a Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 9 Feb 2026 08:39:21 -0500 Subject: [PATCH 65/66] avoid a reported obuf reuse in use_misc() Report: https://github.com/NetHack/NetHack/issues/1486 Resolves #1486 --- src/muse.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/muse.c b/src/muse.c index 2dfb92f3fd..25661ad775 100644 --- a/src/muse.c +++ b/src/muse.c @@ -1914,7 +1914,7 @@ struct monst *mtmp; int where_to = rn2(4); struct obj *obj = uwep; const char *hand; - char the_weapon[BUFSZ]; + char the_weapon[BUFSZ], hand_buf[BUFSZ]; if (!obj || !canletgo(obj, "") || (u.twoweap && canletgo(uswapwep, "") && rn2(2))) @@ -1926,10 +1926,12 @@ struct monst *mtmp; hand = body_part(HAND); if (bimanual(obj)) hand = makeplural(hand); + (void) strncpy(hand_buf, hand, sizeof hand_buf - 1); + hand_buf[sizeof hand_buf - 1] = '\0'; if (vismon) pline("%s flicks a bullwhip towards your %s!", Monnam(mtmp), - hand); + hand_buf); if (obj->otyp == HEAVY_IRON_BALL) { pline("%s fails to wrap around %s.", The_whip, the_weapon); return 1; @@ -1938,7 +1940,7 @@ struct monst *mtmp; the_weapon); if (welded(obj)) { pline("%s welded to your %s%c", - !is_plural(obj) ? "It is" : "They are", hand, + !is_plural(obj) ? "It is" : "They are", hand_buf, !obj->bknown ? '!' : '.'); /* obj->bknown = 1; */ /* welded() takes care of this */ where_to = 0; @@ -1957,7 +1959,7 @@ struct monst *mtmp; switch (where_to) { case 1: /* onto floor beneath mon */ pline("%s yanks %s from your %s!", Monnam(mtmp), the_weapon, - hand); + hand_buf); place_object(obj, mtmp->mx, mtmp->my); break; case 2: /* onto floor beneath you */ From 6ccc74e4acb0e7b73b76777323687f493afeceb8 Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 9 Feb 2026 08:48:37 -0500 Subject: [PATCH 66/66] fixes36.7 entry --- doc/fixes36.7 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/fixes36.7 b/doc/fixes36.7 index 7f14da15f2..fe6629dbd7 100644 --- a/doc/fixes36.7 +++ b/doc/fixes36.7 @@ -69,3 +69,5 @@ avoid using col in Guidebook build, since some distros no longer include back-port some nroff macro updates for Guidebook prevent a crash when using 'O' to interactively set a text match highlight for hunger +avoid a reported obuf reuse in use_misc() when using a bullwhip +