From 089b2410104511147c247b6398b9f5bc56dbc1a0 Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 17 Dec 2019 15:32:10 -0500 Subject: [PATCH 1/8] Windows portable_device support: skip the "illegal folder" check for now --- sys/winnt/windmain.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/winnt/windmain.c b/sys/winnt/windmain.c index 010c11eda..29c12ffbc 100644 --- a/sys/winnt/windmain.c +++ b/sys/winnt/windmain.c @@ -311,8 +311,10 @@ set_default_prefix_locations(const char *programPath) if (test_portable_config(executable_path, portable_device_top_path, sizeof portable_device_top_path)) { +#if 0 if (illegal_dir(portable_device_top_path, executable_path)) windows_startup_state = 2; +#endif fqn_prefix[SYSCONFPREFIX] = executable_path; fqn_prefix[CONFIGPREFIX] = portable_device_top_path; fqn_prefix[HACKPREFIX] = portable_device_top_path; From f001de79542b8c38b1f8e6d7eaefbbd28ab94b47 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 17 Dec 2019 15:41:58 -0800 Subject: [PATCH 2/8] parse_conf_file fix fix --- src/files.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/files.c b/src/files.c index 5e500ae3a..a25a038e6 100644 --- a/src/files.c +++ b/src/files.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 files.c $NHDT-Date: 1574116097 2019/11/18 22:28:17 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.272 $ */ +/* NetHack 3.6 files.c $NHDT-Date: 1576626110 2019/12/17 23:41:50 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.276 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -3160,7 +3160,8 @@ boolean FDECL((*proc), (char *)); free(buf); } buf = strcat(tmpbuf, ep); - buf[sizeof inbuf - 1] = '\0'; + if (strlen(buf) >= sizeof inbuf) + buf[sizeof inbuf - 1] = '\0'; } if (morelines || (ignoreline && !oldline)) From 0ee445ce0bc35ce7744d1e630d0d6d0d409f5f90 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 17 Dec 2019 15:48:37 -0800 Subject: [PATCH 3/8] ceiling_hider() Just groundwork so far; no change in game play. --- include/mondata.h | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/include/mondata.h b/include/mondata.h index 41b5f70f4..155ebfa5b 100644 --- a/include/mondata.h +++ b/include/mondata.h @@ -1,4 +1,4 @@ -/* NetHack 3.6 mondata.h $NHDT-Date: 1550524558 2019/02/18 21:15:58 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.37 $ */ +/* NetHack 3.6 mondata.h $NHDT-Date: 1576626512 2019/12/17 23:48:32 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.39 $ */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ @@ -31,6 +31,7 @@ (is_minion((mon)->data) && mon_aligntyp(mon) == A_LAWFUL) #define is_flyer(ptr) (((ptr)->mflags1 & M1_FLY) != 0L) #define is_floater(ptr) ((ptr)->mlet == S_EYE || (ptr)->mlet == S_LIGHT) +/* clinger: piercers, mimics, wumpus -- generally don't fall down holes */ #define is_clinger(ptr) (((ptr)->mflags1 & M1_CLING) != 0L) #define is_swimmer(ptr) (((ptr)->mflags1 & M1_SWIM) != 0L) #define breathless(ptr) (((ptr)->mflags1 & M1_BREATHLESS) != 0L) @@ -41,14 +42,24 @@ #define noncorporeal(ptr) ((ptr)->mlet == S_GHOST) #define tunnels(ptr) (((ptr)->mflags1 & M1_TUNNEL) != 0L) #define needspick(ptr) (((ptr)->mflags1 & M1_NEEDPICK) != 0L) +/* hides_under() requires an object at the location in order to hide */ #define hides_under(ptr) (((ptr)->mflags1 & M1_CONCEAL) != 0L) +/* is_hider() is True for mimics but when hiding they appear as something + else rather than become mon->mundetected, so use is_hider() with care */ #define is_hider(ptr) (((ptr)->mflags1 & M1_HIDE) != 0L) +/* piercers cling to the ceiling; lurkers above are hiders but they fly + so aren't classified as clingers; unfortunately mimics are classified + as both hiders and clingers but have nothing to do with ceilings; + wumpuses (not wumpi :-) cling but aren't hiders */ +#define ceiling_hider(ptr) \ + (is_hider(ptr) && ((is_clinger(ptr) && (ptr)->mlet != S_MIMIC) \ + || is_flyer(ptr))) /* lurker above */ #define haseyes(ptr) (((ptr)->mflags1 & M1_NOEYES) == 0L) -#define eyecount(ptr) \ - (!haseyes(ptr) ? 0 : ((ptr) == &mons[PM_CYCLOPS] \ - || (ptr) == &mons[PM_FLOATING_EYE]) \ - ? 1 \ - : 2) +/* used to decide whether plural applies so no need for 'more than 2' */ +#define eyecount(ptr) \ + (!haseyes(ptr) ? 0 \ + : ((ptr) == &mons[PM_CYCLOPS] || (ptr) == &mons[PM_FLOATING_EYE]) ? 1 \ + : 2) #define nohands(ptr) (((ptr)->mflags1 & M1_NOHANDS) != 0L) #define nolimbs(ptr) (((ptr)->mflags1 & M1_NOLIMBS) == M1_NOLIMBS) #define notake(ptr) (((ptr)->mflags1 & M1_NOTAKE) != 0L) From 512f886ca66943e2d5dbba77a743cd8eee7af834 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 17 Dec 2019 18:14:08 -0800 Subject: [PATCH 4/8] wizard mode wishing for terrain Fix some issues noticed when experimenting with ceiling hiders. They're all blind (at least without the monks' Eyes) and some of the behavior while blind seemed to be incorrect (though some that I thought was wrong turned out to be ok; feel_newsym() won't update the map if the hero can't reach the floor). Fixing that made me notice that some terrain side-effects (being underwater or stuck in lava) weren't getting disabled when the underlying terrain wasn't the corresponding type anymore. --- doc/fixes36.4 | 5 ++- src/objnam.c | 94 +++++++++++++++++++++++++-------------------------- src/trap.c | 4 ++- 3 files changed, 54 insertions(+), 49 deletions(-) diff --git a/doc/fixes36.4 b/doc/fixes36.4 index 441dd7770..25dd5bc0a 100644 --- a/doc/fixes36.4 +++ b/doc/fixes36.4 @@ -1,4 +1,4 @@ -$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.4 $ $NHDT-Date: 1576287569 2019/12/14 01:39:29 $ +$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.11 $ $NHDT-Date: 1576635242 2019/12/18 02:14:02 $ fixes36.4 contains a terse summary of changes made to 3.6.3 in order to produce 3.6.4. @@ -16,6 +16,9 @@ message "your knapsack can't accomodate any more items" when picking stuff up pending; vary the message rather than add more convoluted pickup code dozen-ish assorted spelling/typo fixes in messages and source comments fix potential buffer overflow when parsing run-time configuration file +wizard mode wishing for terrain would leave it unmapped if done while blind +wizard mode terrain wish could leave hero in water (severe vision limits) or + in lava (trapped, sinking) which wasn't there any more Platform- and/or Interface-Specific Fixes or Features diff --git a/src/objnam.c b/src/objnam.c index e54b20732..4e7e3e2c6 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 objnam.c $NHDT-Date: 1575245076 2019/12/02 00:04:36 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.255 $ */ +/* NetHack 3.6 objnam.c $NHDT-Date: 1576635242 2019/12/18 02:14:02 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.256 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2011. */ /* NetHack may be freely redistributed. See license for details. */ @@ -3663,14 +3663,17 @@ struct obj *no_wish; goto typfnd; } } -/* Let wizards wish for traps and furniture. - * Must come after objects check so wizards can still wish for - * trap objects like beartraps. - * Disallow such topology tweaks for WIZKIT startup wishes. - */ + + /* + * Let wizards wish for traps and furniture. + * Must come after objects check so wizards can still wish for + * trap objects like beartraps. + * Disallow such topology tweaks for WIZKIT startup wishes. + */ wiztrap: if (wizard && !program_state.wizkit_wishing) { struct rm *lev; + boolean madeterrain = FALSE; int trap, x = u.ux, y = u.uy; for (trap = NO_TRAP + 1; trap < TRAPNUM; trap++) { @@ -3693,7 +3696,8 @@ struct obj *no_wish; return (struct obj *) &zeroobj; } - /* furniture and terrain */ + /* furniture and terrain (use at your own risk; can clobber stairs + or place furniture on existing traps which shouldn't be allowed) */ lev = &levl[x][y]; p = eos(bp); if (!BSTRCMPI(bp, p - 8, "fountain")) { @@ -3702,43 +3706,36 @@ struct obj *no_wish; if (!strncmpi(bp, "magic ", 6)) lev->blessedftn = 1; pline("A %sfountain.", lev->blessedftn ? "magic " : ""); - newsym(x, y); - return (struct obj *) &zeroobj; - } - if (!BSTRCMPI(bp, p - 6, "throne")) { + madeterrain = TRUE; + } else if (!BSTRCMPI(bp, p - 6, "throne")) { lev->typ = THRONE; pline("A throne."); - newsym(x, y); - return (struct obj *) &zeroobj; - } - if (!BSTRCMPI(bp, p - 4, "sink")) { + madeterrain = TRUE; + } else if (!BSTRCMPI(bp, p - 4, "sink")) { lev->typ = SINK; level.flags.nsinks++; pline("A sink."); - newsym(x, y); - return (struct obj *) &zeroobj; - } + madeterrain = TRUE; + /* ("water" matches "potion of water" rather than terrain) */ - if (!BSTRCMPI(bp, p - 4, "pool") || !BSTRCMPI(bp, p - 4, "moat")) { + } else if (!BSTRCMPI(bp, p - 4, "pool") + || !BSTRCMPI(bp, p - 4, "moat")) { lev->typ = !BSTRCMPI(bp, p - 4, "pool") ? POOL : MOAT; del_engr_at(x, y); pline("A %s.", (lev->typ == POOL) ? "pool" : "moat"); /* Must manually make kelp! */ water_damage_chain(level.objects[x][y], TRUE); - newsym(x, y); - return (struct obj *) &zeroobj; - } - if (!BSTRCMPI(bp, p - 4, "lava")) { /* also matches "molten lava" */ + madeterrain = TRUE; + + /* also matches "molten lava" */ + } else if (!BSTRCMPI(bp, p - 4, "lava")) { lev->typ = LAVAPOOL; del_engr_at(x, y); pline("A pool of molten lava."); if (!(Levitation || Flying)) (void) lava_effects(); - newsym(x, y); - return (struct obj *) &zeroobj; - } - - if (!BSTRCMPI(bp, p - 5, "altar")) { + madeterrain = TRUE; + } else if (!BSTRCMPI(bp, p - 5, "altar")) { aligntyp al; lev->typ = ALTAR; @@ -3751,37 +3748,40 @@ struct obj *no_wish; else if (!strncmpi(bp, "unaligned ", 10)) al = A_NONE; else /* -1 - A_CHAOTIC, 0 - A_NEUTRAL, 1 - A_LAWFUL */ - al = (!rn2(6)) ? A_NONE : rn2((int) A_LAWFUL + 2) - 1; + al = !rn2(6) ? A_NONE : (rn2((int) A_LAWFUL + 2) - 1); lev->altarmask = Align2amask(al); pline("%s altar.", An(align_str(al))); - newsym(x, y); - return (struct obj *) &zeroobj; - } - - if (!BSTRCMPI(bp, p - 5, "grave") - || !BSTRCMPI(bp, p - 9, "headstone")) { + madeterrain = TRUE; + } else if (!BSTRCMPI(bp, p - 5, "grave") + || !BSTRCMPI(bp, p - 9, "headstone")) { make_grave(x, y, (char *) 0); pline("%s.", IS_GRAVE(lev->typ) ? "A grave" : "Can't place a grave here"); - newsym(x, y); - return (struct obj *) &zeroobj; - } - - if (!BSTRCMPI(bp, p - 4, "tree")) { + madeterrain = TRUE; + } else if (!BSTRCMPI(bp, p - 4, "tree")) { lev->typ = TREE; pline("A tree."); - newsym(x, y); block_point(x, y); - return (struct obj *) &zeroobj; - } - - if (!BSTRCMPI(bp, p - 4, "bars")) { + madeterrain = TRUE; + } else if (!BSTRCMPI(bp, p - 4, "bars")) { lev->typ = IRONBARS; pline("Iron bars."); - newsym(x, y); + madeterrain = TRUE; + } + + if (madeterrain) { + feel_newsym(x, y); + if (u.uinwater && !is_pool(x, y)) { + u.uinwater = 0; /* leave the water */ + docrt(); + vision_full_recalc = 1; + } else if (u.utrap && u.utraptype == TT_LAVA && !is_lava(x, y)) { + reset_utrap(FALSE); + } + /* cast 'const' away; caller won't modify this */ return (struct obj *) &zeroobj; } - } + } /* end of wizard mode traps and terrain */ if (!oclass && !typ) { if (!strncmpi(bp, "polearm", 7)) { diff --git a/src/trap.c b/src/trap.c index cc15f22cc..ea7336336 100644 --- a/src/trap.c +++ b/src/trap.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 trap.c $NHDT-Date: 1576274483 2019/12/13 22:01:23 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.325 $ */ +/* NetHack 3.6 trap.c $NHDT-Date: 1576635243 2019/12/18 02:14:03 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.328 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -3746,6 +3746,7 @@ drown() boolean inpool_ok = FALSE, crawl_ok; int i, x, y; + feel_newsym(u.ux, u.uy); /* in case Blind, map the water here */ /* happily wading in the same contiguous pool */ if (u.uinwater && is_pool(u.ux - u.dx, u.uy - u.dy) && (Swimming || Amphibious)) { @@ -5262,6 +5263,7 @@ lava_effects() int dmg = d(6, 6); /* only applicable for water walking */ boolean usurvive, boil_away; + feel_newsym(u.ux, u.uy); /* in case Blind, map the lava here */ burn_away_slime(); if (likes_lava(youmonst.data)) return FALSE; From 8349d959921723b8758920af28ea7516d6391c68 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 17 Dec 2019 19:08:26 -0800 Subject: [PATCH 5/8] ceiling hiders vs '>' Poly'd hero hiding on the ceiling was told "you can't go down here" if using '>' at a spot that didn't have down stairs, trap door, hole, or pit. Let '>' bring a ceiling hider out of hiding; lurker above resumes flying, piercer falls to floor or whatever is underneath it. --- doc/fixes36.4 | 5 ++++- src/do.c | 20 +++++++++++++++++++- src/hack.c | 6 +++++- src/objnam.c | 13 ++++++++----- src/trap.c | 12 ++++++++---- 5 files changed, 44 insertions(+), 12 deletions(-) diff --git a/doc/fixes36.4 b/doc/fixes36.4 index 25dd5bc0a..0cd176e40 100644 --- a/doc/fixes36.4 +++ b/doc/fixes36.4 @@ -1,4 +1,4 @@ -$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.11 $ $NHDT-Date: 1576635242 2019/12/18 02:14:02 $ +$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.12 $ $NHDT-Date: 1576638499 2019/12/18 03:08:19 $ fixes36.4 contains a terse summary of changes made to 3.6.3 in order to produce 3.6.4. @@ -19,6 +19,9 @@ fix potential buffer overflow when parsing run-time configuration file wizard mode wishing for terrain would leave it unmapped if done while blind wizard mode terrain wish could leave hero in water (severe vision limits) or in lava (trapped, sinking) which wasn't there any more +flying hero can go down (via '>') holes or trap doors instead of escaping trap +polymorphed hero hiding on the ceiling can now use '>' to unhide instead of + being told "you can't go down here" Platform- and/or Interface-Specific Fixes or Features diff --git a/src/do.c b/src/do.c index b7bb737b9..8bbed39de 100644 --- a/src/do.c +++ b/src/do.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 do.c $NHDT-Date: 1576181796 2019/12/12 20:16:36 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.197 $ */ +/* NetHack 3.6 do.c $NHDT-Date: 1576638499 2019/12/18 03:08:19 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.198 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1000,6 +1000,24 @@ dodown() : surface(u.ux, u.uy)); return 0; /* didn't move */ } + + if (Upolyd && ceiling_hider(&mons[u.umonnum]) && u.uundetected) { + u.uundetected = 0; + if (Flying) { /* lurker above */ + You("fly out of hiding."); + } else { /* piercer */ + You("drop to the %s.", surface(u.ux, u.uy)); + if (is_pool_or_lava(u.ux, u.uy)) { + pooleffects(FALSE); + } else { + (void) pickup(1); + if ((trap = t_at(u.ux, u.uy)) != 0) + dotrap(trap, TOOKPLUNGE); + } + } + return 1; /* came out of hiding; might need '>' again to go down */ + } + if (!stairs_down && !ladder_down) { trap = t_at(u.ux, u.uy); if (trap && (uteetering_at_seen_pit(trap) || uescaped_shaft(trap))) { diff --git a/src/hack.c b/src/hack.c index a48b92cf5..79fe7408c 100644 --- a/src/hack.c +++ b/src/hack.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 hack.c $NHDT-Date: 1568509227 2019/09/15 01:00:27 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.216 $ */ +/* NetHack 3.6 hack.c $NHDT-Date: 1576638500 2019/12/18 03:08:20 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.220 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -2124,6 +2124,10 @@ boolean newspot; /* true if called by spoteffects */ } /* not mounted */ + /* if hiding on ceiling then don't automatically enter pool */ + if (Upolyd && ceiling_hider(&mons[u.umonnum]) && u.uundetected) + return FALSE; + /* drown(),lava_effects() return true if hero changes location while surviving the problem */ if (is_lava(u.ux, u.uy)) { diff --git a/src/objnam.c b/src/objnam.c index 4e7e3e2c6..aa5d7713d 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 objnam.c $NHDT-Date: 1576635242 2019/12/18 02:14:02 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.256 $ */ +/* NetHack 3.6 objnam.c $NHDT-Date: 1576638500 2019/12/18 03:08:20 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.257 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2011. */ /* NetHack may be freely redistributed. See license for details. */ @@ -3733,7 +3733,7 @@ struct obj *no_wish; del_engr_at(x, y); pline("A pool of molten lava."); if (!(Levitation || Flying)) - (void) lava_effects(); + pooleffects(FALSE); madeterrain = TRUE; } else if (!BSTRCMPI(bp, p - 5, "altar")) { aligntyp al; @@ -3770,12 +3770,15 @@ struct obj *no_wish; } if (madeterrain) { - feel_newsym(x, y); - if (u.uinwater && !is_pool(x, y)) { + feel_newsym(x, y); /* map the spot where the wish occurred */ + /* hero started at but might not be there anymore (create + lava, decline to die, and get teleported away to safety) */ + if (u.uinwater && !is_pool(u.ux, u.uy)) { u.uinwater = 0; /* leave the water */ docrt(); vision_full_recalc = 1; - } else if (u.utrap && u.utraptype == TT_LAVA && !is_lava(x, y)) { + } else if (u.utrap && u.utraptype == TT_LAVA + && !is_lava(u.ux, u.uy)) { reset_utrap(FALSE); } /* cast 'const' away; caller won't modify this */ diff --git a/src/trap.c b/src/trap.c index ea7336336..b6db81148 100644 --- a/src/trap.c +++ b/src/trap.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 trap.c $NHDT-Date: 1576635243 2019/12/18 02:14:03 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.328 $ */ +/* NetHack 3.6 trap.c $NHDT-Date: 1576638501 2019/12/18 03:08:21 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.329 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -489,8 +489,9 @@ unsigned ftflags; ; /* KMH -- You can't escape the Sokoban level traps */ else if (Levitation || u.ustuck || (!Can_fall_thru(&u.uz) && !levl[u.ux][u.uy].candig) - || ((Flying || is_clinger(youmonst.data)) - && !(ftflags & TOOKPLUNGE)) + || ((Flying || is_clinger(youmonst.data) + || (ceiling_hider(youmonst.data) && u.uundetected)) + && !(ftflags & TOOKPLUNGE)) || (Inhell && !u.uevent.invoked && newlevel == bottom)) { dont_fall = "don't fall in."; } else if (youmonst.data->msize >= MZ_HUGE) { @@ -5388,7 +5389,10 @@ sink_into_lava() static const char sink_deeper[] = "You sink deeper into the lava."; if (!u.utrap || u.utraptype != TT_LAVA) { - ; /* do nothing; this shouldn't happen */ + ; /* do nothing; this usually won't happen but could after + * polymorphing from a flier into a ceiling hider and then hiding; + * allmain() only checks whether the hero is at a lava location, + * not whether he or she is currently sinking */ } else if (!is_lava(u.ux, u.uy)) { reset_utrap(FALSE); /* this shouldn't happen either */ } else if (!u.uinvulnerable) { From 5f0d06fb80ac4945a863b11ff06a2481b2254af0 Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 17 Dec 2019 23:16:44 -0500 Subject: [PATCH 6/8] update and simplify the windows portable_device_paths sysconf option Requires a sysconf file in the windows executable directory in order to work --- doc/Guidebook.mn | 7 +++ doc/Guidebook.tex | 10 +++ doc/fixes36.4 | 3 +- include/sys.h | 6 +- src/files.c | 21 ++++--- src/sys.c | 12 +--- sys/winnt/windmain.c | 142 ++++++++++--------------------------------- 7 files changed, 70 insertions(+), 131 deletions(-) diff --git a/doc/Guidebook.mn b/doc/Guidebook.mn index 8d753d9f8..7466911c4 100644 --- a/doc/Guidebook.mn +++ b/doc/Guidebook.mn @@ -4789,6 +4789,13 @@ 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). .lp +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. +.lp +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. +.lp 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 following placeholders: diff --git a/doc/Guidebook.tex b/doc/Guidebook.tex index 36d459db0..8c6214a57 100644 --- a/doc/Guidebook.tex +++ b/doc/Guidebook.tex @@ -5297,6 +5297,16 @@ Minimum number of points to get an entry in the score file. 0 or 1 to use user names or numeric userids, respectively, to identify unique people for the score file %.lp +\item[\ib{ACCESSIBILITY}] +0 or 1 to disable or enable, respectively, the ability for players +to set S\verb+_+pet\verb+_+override and S\verb+_+hero\verb+_+override +symbols in their configuration file. +%.lp +\item[\ib{PORTABLE\verb+_+DEVICE\verb+_+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. +%.lp \item[\ib{DUMPLOGFILE}] A filename where the end-of-game dumplog is saved. Not defining this will prevent dumplog from being created. Only available diff --git a/doc/fixes36.4 b/doc/fixes36.4 index 441dd7770..529cbfeca 100644 --- a/doc/fixes36.4 +++ b/doc/fixes36.4 @@ -21,7 +21,8 @@ fix potential buffer overflow when parsing run-time configuration file Platform- and/or Interface-Specific Fixes or Features ----------------------------------------------------- fix compilation on platforms that split the ncurses and tinfo libraries -allow run-from-removable-device on Windows +Windows: allow all game files to be on a portable device via the sysconf + option 'portable_device_paths' General New Features diff --git a/include/sys.h b/include/sys.h index 392987660..ed2f57859 100644 --- a/include/sys.h +++ b/include/sys.h @@ -17,9 +17,6 @@ struct sysopt { char *debugfiles; /* files to show debugplines in. '*' is all. */ #ifdef DUMPLOG char *dumplogfile; /* where the dump file is saved */ -#endif -#ifdef WIN32 - char *portable_device_top; /* nethack configuration for a portable drive */ #endif int env_dbgfl; /* 1: debugfiles comes from getenv("DEBUGFILES") * so sysconf's DEBUGFILES shouldn't override it; @@ -47,6 +44,9 @@ struct sysopt { /* enable accessibility options */ int accessibility; +#ifdef WIN32 + int portable_device_paths; /* nethack configuration for a portable device */ +#endif }; extern struct sysopt sysopt; diff --git a/src/files.c b/src/files.c index a25a038e6..44413f230 100644 --- a/src/files.c +++ b/src/files.c @@ -2466,12 +2466,6 @@ char *origbuf; if (sysopt.dumplogfile) free((genericptr_t) sysopt.dumplogfile); sysopt.dumplogfile = dupstr(bufp); -#endif -#ifdef WIN32 - } else if (src == SET_IN_SYS && match_varname(buf, "portable_device_top", 8)) { - if (sysopt.portable_device_top) - free((genericptr_t) sysopt.portable_device_top); - sysopt.portable_device_top = dupstr(bufp); #endif } else if (src == SET_IN_SYS && match_varname(buf, "GENERICUSERS", 12)) { if (sysopt.genericusers) @@ -2605,6 +2599,16 @@ char *origbuf; return FALSE; } sysopt.accessibility = n; +#ifdef WIN32 + } else if (src == SET_IN_SYS + && match_varname(buf, "portable_device_paths", 8)) { + n = atoi(bufp); + if (n < 0 || n > 1) { + config_error_add("Illegal value in portable_device_paths (not 0,1)."); + return FALSE; + } + sysopt.portable_device_paths = n; +#endif #endif /* SYSCF */ } else if (match_varname(buf, "BOULDER", 3)) { @@ -4160,11 +4164,10 @@ reveal_paths(VOID_ARGS) raw_printf("No end-of-game disclosure file (%s).", nodumpreason); #ifdef WIN32 - if (sysopt.portable_device_top) { + if (sysopt.portable_device_paths) { const char *pd = get_portable_device(); - raw_printf("Writable folder for portable device config (sysconf %s):", - "portable_device_top"); + raw_printf("portable_device_paths (set in sysconf):"); raw_printf(" \"%s\"", pd); } #endif diff --git a/src/sys.c b/src/sys.c index f8c0a91c5..6a0c52da8 100644 --- a/src/sys.c +++ b/src/sys.c @@ -34,9 +34,6 @@ sys_early_init() #endif #ifdef DUMPLOG sysopt.dumplogfile = (char *) 0; -#endif -#ifdef WIN32 - sysopt.portable_device_top = (char *) 0; #endif sysopt.env_dbgfl = 0; /* haven't checked getenv("DEBUGFILES") yet */ sysopt.shellers = (char *) 0; @@ -84,6 +81,9 @@ sys_early_init() sysopt.seduce = 1; /* if it's compiled in, default to on */ sysopt_seduce_set(sysopt.seduce); sysopt.accessibility = 0; +#ifdef WIN32 + sysopt.portable_device_paths = 0; +#endif return; } @@ -106,12 +106,6 @@ sysopt_release() #ifdef DUMPLOG if (sysopt.dumplogfile) free((genericptr_t)sysopt.dumplogfile), sysopt.dumplogfile=(char *)0; -#endif -#ifdef WIN32 - if (sysopt.portable_device_top) { - free((genericptr_t) sysopt.portable_device_top); - sysopt.portable_device_top = (char *) 0; - } #endif if (sysopt.genericusers) free((genericptr_t) sysopt.genericusers), diff --git a/sys/winnt/windmain.c b/sys/winnt/windmain.c index 29c12ffbc..4ca0c6bfc 100644 --- a/sys/winnt/windmain.c +++ b/sys/winnt/windmain.c @@ -168,25 +168,16 @@ folder_file_exists(const char * folder, const char * file_name) boolean test_portable_config( const char *executable_path, - char *portable_device_top_path, - size_t portable_device_top_path_size) + char *portable_device_path, + size_t portable_device_path_size) { + int lth = 0; + const char *sysconf = "sysconf"; + char tmppath[MAX_PATH]; boolean retval = FALSE, save_initoptions_noterminate = iflags.initoptions_noterminate; - char tmppath[MAX_PATH], *toppath, *sysconftop; -#ifdef UNICODE - TCHAR wdrive[_MAX_DRIVE]; - TCHAR wthisdir[_MAX_DIR]; - TCHAR wfname[_MAX_FNAME]; - TCHAR wext[_MAX_EXT]; -#endif - char drive[_MAX_DRIVE]; - char thisdir[_MAX_DIR]; - char fname[_MAX_FNAME]; - char ext[_MAX_EXT]; - errno_t err; - if (portable_device_top_path && folder_file_exists(executable_path, "sysconf")) { + if (portable_device_path && folder_file_exists(executable_path, "sysconf")) { /* There is a sysconf file (not just sysconf.template) present in the exe path, which is not the way NetHack is initially distributed, @@ -196,101 +187,38 @@ test_portable_config( delve into that... */ - *portable_device_top_path = '\0'; - (void) strncpy(tmppath, executable_path, sizeof tmppath - (1 + sizeof "sysconf")); - tmppath[sizeof tmppath - (1 + sizeof "sysconf")] = '\0'; - (void) strcat(tmppath, "sysconf"); - /* split the path up */ -#ifdef UNICODE - { - int sz, wchars_num = MultiByteToWideChar( CP_ACP, 0, tmppath, -1, NULL, 0); - wchar_t *wstr; - - if (wchars_num) { - wstr = (wchar_t *) alloc(wchars_num * sizeof(wchar_t)); - MultiByteToWideChar( CP_ACP, 0, tmppath, -1, wstr, wchars_num); - err = _wsplitpath_s(wstr, wdrive, _MAX_DRIVE, wthisdir, _MAX_DIR, - wfname, _MAX_FNAME, wext, _MAX_EXT); - free(wstr); - } - sz = WideCharToMultiByte(CP_ACP, 0, wdrive, -1, drive, - 0, NULL, NULL); - if (sz <= sizeof drive) - WideCharToMultiByte(CP_ACP, 0, wdrive, -1, drive, - sz, NULL, NULL); - - } -#else - err = _splitpath_s(tmppath, drive, _MAX_DRIVE, thisdir, _MAX_DIR, - fname, _MAX_FNAME, ext, _MAX_EXT); -#endif - if (err != 0) - goto done_test; - - toppath = (char *) alloc(portable_device_top_path_size); - *toppath = '\0'; - /* -2 because we need to append the path separator */ - (void) strncpy(toppath, drive, portable_device_top_path_size - 2); - toppath[portable_device_top_path_size - 2] = '\0'; - (void) strcat(toppath, "\\"); + *portable_device_path = '\0'; + lth = sizeof tmppath - strlen(sysconf); + (void) strncpy(tmppath, executable_path, lth - 1); + tmppath[lth - 1] = '\0'; + (void) strcat(tmppath, sysconf); iflags.initoptions_noterminate = 1; /* assure_syscf_file(); */ config_error_init(TRUE, tmppath, FALSE); /* ... and _must_ parse correctly. */ if (read_config_file(tmppath, SET_IN_SYS) - && sysopt.portable_device_top - && (strlen(sysopt.portable_device_top) + strlen(toppath) - < portable_device_top_path_size - 3)) { - sysconftop = sysopt.portable_device_top; - if (sysconftop[1] == ':') - sysconftop += 2; /* skip the device if specified */ - if (*sysconftop == '\\') - sysconftop += 1; /* skip the root folder if specified */ - (void) strcat(toppath, sysconftop); - append_slash(toppath); + && sysopt.portable_device_paths) retval = TRUE; - } else { - if (config_error_done()) - retval = FALSE; - } + (void) config_error_done(); iflags.initoptions_noterminate = save_initoptions_noterminate; - sysopt_release(); - if (retval) - Strcpy(portable_device_top_path, toppath); - free(toppath); + sysopt_release(); /* the real sysconf processing comes later */ + } + if (retval) { + lth = strlen(executable_path); + if (lth <= (int) portable_device_path_size - 1) + Strcpy(portable_device_path, executable_path); + else + retval = FALSE; } - done_test: - return retval; } -static char portable_device_top_path[MAX_PATH]; +static char portable_device_path[MAX_PATH]; const char *get_portable_device() { - return (const char *) portable_device_top_path; -} - -boolean illegal_dir(const char *d1, const char *d2) -{ - int i; - char tmpbuf[MAX_PATH]; - - if (!strcmpi(d1, d2)) { - (void) strncpy(tmpbuf, &portable_device_top_path[3], - sizeof tmpbuf - 1); - tmpbuf[sizeof tmpbuf - 1] = '\0'; - i = (int) strlen(tmpbuf) - 1; - if (tmpbuf[i] == '\\') - tmpbuf[i] = '\0'; - raw_printf("Illegal \"portable_device_top = %s\" in your sysconf file", - tmpbuf); - raw_printf("because the exe is running from that folder."); - raw_printf("Point 'portable_device_top' to a different folder."); - return TRUE; - } - return FALSE; + return (const char *) portable_device_path; } void @@ -309,21 +237,17 @@ set_default_prefix_locations(const char *programPath) strcpy(executable_path, get_executable_path()); append_slash(executable_path); - if (test_portable_config(executable_path, portable_device_top_path, - sizeof portable_device_top_path)) { -#if 0 - if (illegal_dir(portable_device_top_path, executable_path)) - windows_startup_state = 2; -#endif + if (test_portable_config(executable_path, + portable_device_path, sizeof portable_device_path)) { fqn_prefix[SYSCONFPREFIX] = executable_path; - fqn_prefix[CONFIGPREFIX] = portable_device_top_path; - fqn_prefix[HACKPREFIX] = portable_device_top_path; - fqn_prefix[SAVEPREFIX] = portable_device_top_path; - fqn_prefix[LEVELPREFIX] = portable_device_top_path; - fqn_prefix[BONESPREFIX] = portable_device_top_path; - fqn_prefix[SCOREPREFIX] = portable_device_top_path; - fqn_prefix[LOCKPREFIX] = portable_device_top_path; - fqn_prefix[TROUBLEPREFIX] = portable_device_top_path; + fqn_prefix[CONFIGPREFIX] = portable_device_path; + fqn_prefix[HACKPREFIX] = portable_device_path; + fqn_prefix[SAVEPREFIX] = portable_device_path; + fqn_prefix[LEVELPREFIX] = portable_device_path; + fqn_prefix[BONESPREFIX] = portable_device_path; + fqn_prefix[SCOREPREFIX] = portable_device_path; + fqn_prefix[LOCKPREFIX] = portable_device_path; + fqn_prefix[TROUBLEPREFIX] = portable_device_path; fqn_prefix[DATAPREFIX] = executable_path; } else { build_known_folder_path(&FOLDERID_Profile, profile_path, From 96155c7e02599bfa9b7e9ee2c0274e3580e54204 Mon Sep 17 00:00:00 2001 From: nhmall Date: Tue, 17 Dec 2019 23:38:06 -0500 Subject: [PATCH 7/8] housekeeping updates --- README | 22 +++++++++++++++++++--- dat/history | 2 +- doc/Guidebook.mn | 4 ++-- doc/Guidebook.tex | 4 ++-- include/patchlevel.h | 29 +++++++++++++++++++++++------ 5 files changed, 47 insertions(+), 14 deletions(-) diff --git a/README b/README index b252f7833..ae5eab50f 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ - NetHack 3.6.4 -- General information December 17, 2019 + NetHack 3.6.4 -- General information December 18, 2019 NetHack 3.6 is an enhancement to the dungeon exploration game NetHack, which is a distant descendent of Rogue and Hack, and a direct descendent of @@ -16,12 +16,28 @@ section. Below you will find some other general notes that were not considered spoilers: + * fix potential buffer overflow when parsing run-time configuration file * GDBPATH and GREPPATH from sysconf or -D... on compilation command line were * being processed even if PANICTRACE was disabled but only being freed * at end of game when that was enabled - * fix the article used in the message when your steed encounters a polymorph trap + * fix the article used in the message when your steed encounters a polymorph + * trap + * allow teleporting onto the vibrating square + * message "your knapsack can't accomodate any more items" when picking stuff + * up or removing such from container was inaccurate if there was some + * gold pending; vary the message rather than add more convoluted pickup + * code * dozen-ish assorted spelling/typo fixes in messages and source comments - * fix potential buffer overflow when parsing run-time configuration file + * wizard mode wishing for terrain would leave it unmapped if done while blind + * wizard mode terrain wish could leave hero in water (severe vision limits) + * or in lava (trapped, sinking) which wasn't there any more + * flying hero can go down (via '>') holes or trap doors instead of escaping + * trap + * polymorphed hero hiding on the ceiling can now use '>' to unhide instead of + * being told "you can't go down here" + * fix compilation on platforms that split the ncurses and tinfo libraries + * Windows: allow all game files to be on a portable device via the sysconf + * option 'portable_device_paths' - - - - - - - - - - - diff --git a/dat/history b/dat/history index 7dcaaca18..9e5979862 100644 --- a/dat/history +++ b/dat/history @@ -223,7 +223,7 @@ 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 17, 2019 containing a security +NetHack 3.6.4 was released on December 18, 2019 containing a security fix and a few bug fixes. The official NetHack web site is maintained by Ken Lorber at diff --git a/doc/Guidebook.mn b/doc/Guidebook.mn index 7466911c4..47d4f84c1 100644 --- a/doc/Guidebook.mn +++ b/doc/Guidebook.mn @@ -24,7 +24,7 @@ .ds vr "NetHack 3.6 .ds f0 "\*(vr .ds f1 -.ds f2 "December 17, 2019 +.ds f2 "December 18, 2019 . .\" A note on some special characters: .\" \(lq = left double quote @@ -5158,7 +5158,7 @@ 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. .pg -NetHack 3.6.4 was released on December 17, 2019 containing a security fix +NetHack 3.6.4 was released on December 18, 2019 containing a security fix and a few bug fixes. .pg The official NetHack web site is maintained by \fBKen Lorber\fP diff --git a/doc/Guidebook.tex b/doc/Guidebook.tex index 8c6214a57..d90873480 100644 --- a/doc/Guidebook.tex +++ b/doc/Guidebook.tex @@ -45,7 +45,7 @@ %.au \author{Original version - Eric S. Raymond\\ (Edited and expanded for 3.6 by Mike Stephenson and others)} -\date{December 17, 2019} +\date{December 18, 2019} \maketitle @@ -5765,7 +5765,7 @@ fixes to NetHack 3.6.2. %.pg \medskip -NetHack 3.6.4 was released on December 17, 2019 containing a security fix and +NetHack 3.6.4 was released on December 18, 2019 containing a security fix and a few bug fixes. %.pg diff --git a/include/patchlevel.h b/include/patchlevel.h index 01e1c3438..b2188ab09 100644 --- a/include/patchlevel.h +++ b/include/patchlevel.h @@ -36,13 +36,30 @@ /****************************************************************************/ /* Version 3.6.x */ -/* Patch 4, December 17, 2019 +/* Patch 4, December 18, 2019 + * + * fix potential buffer overflow when parsing run-time configuration file * GDBPATH and GREPPATH from sysconf or -D... on compilation command line were * being processed even if PANICTRACE was disabled but only being freed * at end of game when that was enabled - * fix the article used in the message when your steed encounters a polymorph trap + * fix the article used in the message when your steed encounters a polymorph + * trap + * allow teleporting onto the vibrating square + * message "your knapsack can't accomodate any more items" when picking stuff + * up or removing such from container was inaccurate if there was some + * gold pending; vary the message rather than add more convoluted pickup + * code * dozen-ish assorted spelling/typo fixes in messages and source comments - * fix potential buffer overflow when parsing run-time configuration file + * wizard mode wishing for terrain would leave it unmapped if done while blind + * wizard mode terrain wish could leave hero in water (severe vision limits) + * or in lava (trapped, sinking) which wasn't there any more + * flying hero can go down (via '>') holes or trap doors instead of escaping + * trap + * polymorphed hero hiding on the ceiling can now use '>' to unhide instead of + * being told "you can't go down here" + * fix compilation on platforms that split the ncurses and tinfo libraries + * Windows: allow all game files to be on a portable device via the sysconf + * option 'portable_device_paths' */ /* Patch 3, December 5, 2019 @@ -61,7 +78,7 @@ * Added several grammar corrections * Improved recognition of deafness for several situations including the * playing of musical instruments and bribing negotiations with demon lords - * Fixed ignoring of god's wrath when hero injured himself during altar kick + * Fixed ignoring of god's wrath when hero injured himself during altar kick * Fixed several cases where persistent inventory window was not updated * Fixed temple priests or shopkeepers moving over other monsters * Fixed a crash-causing bug when putting on levitation boots over a sink @@ -74,14 +91,14 @@ * the Windows platform * Improved the layout and display of the player selection dialog used on the * Windows graphical implementation - * Improved performance of some tty versions by reducing the number of + * Improved performance of some tty versions by reducing the number of * function calls made from mapglyph * Allowed the msdos implementation to build with curses and PDCurses * Included over 100 other fixes and improvements as outlined in doc/fixes36.3 */ /* Patch 2, May 7, 2019 - * + * * Over 320 bug fixes including a couple of crash bug fixes as outlined in * doc/fixes36.2 * More than 15 enhancements or improvements From 7348621e41df53b51116f0ed03b2e8fc5b48c56a Mon Sep 17 00:00:00 2001 From: nhw_cron Date: Wed, 18 Dec 2019 04:17:25 -0500 Subject: [PATCH 8/8] This is cron-daily v1-Dec-12-2019. guidebook updated: doc/Guidebook.txt --- doc/Guidebook.txt | 636 +++++++++++++++++++++++----------------------- 1 file changed, 318 insertions(+), 318 deletions(-) diff --git a/doc/Guidebook.txt b/doc/Guidebook.txt index 86672da0d..4d50ed951 100644 --- a/doc/Guidebook.txt +++ b/doc/Guidebook.txt @@ -15,7 +15,7 @@ Original version - Eric S. Raymond (Edited and expanded for 3.6 by Mike Stephenson and others) - December 17, 2019 + December 18, 2019 @@ -126,7 +126,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -192,7 +192,7 @@ you have seen on the current dungeon level; as you explore more - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -258,7 +258,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -324,7 +324,7 @@ Intelligence affects your ability to cast spells and read - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -390,7 +390,7 @@ ical attacks. Many dungeons show only your experience level - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -456,7 +456,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -522,7 +522,7 @@ nasty and vicious. Sometimes, however, they can be helpful. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -588,7 +588,7 @@ symbol at the chosen location, conditionally check for "More - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -654,7 +654,7 @@ if you remember a monster there). - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -720,7 +720,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -786,7 +786,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -852,7 +852,7 @@ once you've closed this menu. The available options are - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -918,7 +918,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -984,7 +984,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1050,7 +1050,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1116,7 +1116,7 @@ (R)UNIX is a registered trademark of The Open Group. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1182,7 +1182,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1248,7 +1248,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1314,7 +1314,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1380,7 +1380,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1446,7 +1446,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1512,7 +1512,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1578,7 +1578,7 @@ When picking a target with cursor and the autodescribe - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1644,7 +1644,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1710,7 +1710,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1776,7 +1776,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1842,7 +1842,7 @@ the `^D' (kick) command. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1908,7 +1908,7 @@ on the corresponding staircase at your destination. However, - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -1974,7 +1974,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2040,7 +2040,7 @@ member a monster but want to try fighting anyway, you can use the - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2106,7 +2106,7 @@ ers (or even former incarnations of yourself!) and their personal - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2172,7 +2172,7 @@ ter. Many commands that operate on objects must ask you to find - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2238,7 +2238,7 @@ In some cases "uncursed" will be omitted as being redundant when - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2304,7 +2304,7 @@ to taking off other worn items. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2370,7 +2370,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2436,7 +2436,7 @@ ondary is just an item in your inventory that's been designated - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2502,7 +2502,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2568,7 +2568,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2634,7 +2634,7 @@ the wall, you might decide to go for broke and break your wand. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2700,7 +2700,7 @@ cation rather than just specify a particular direction. Other - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2766,7 +2766,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2832,7 +2832,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2898,7 +2898,7 @@ brains while polymorphed into a mind flayer, is considered eating - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -2964,7 +2964,7 @@ type ("polypiling") or the form of your own body into another - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3030,7 +3030,7 @@ tion, and are ignored unless a CHOOSE statement was used to - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3096,7 +3096,7 @@ pletion has no effect for the X11 windowport. You can specify - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3162,7 +3162,7 @@ "Configuring User Sounds" section. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3228,7 +3228,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3294,7 +3294,7 @@ tion controls whether the description includes map coordinates. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3360,7 +3360,7 @@ was defined during compilation. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3426,7 +3426,7 @@ display for end-of-game disclosure follows a set sequence. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3492,7 +3492,7 @@ "no", you will exclude that gender from being picked randomly. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3558,7 +3558,7 @@ sistent. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3624,7 +3624,7 @@ fault `\'. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3690,7 +3690,7 @@ Prompt for new form whenever any monster changes shape (default - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3756,7 +3756,7 @@ Valid settings are: - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3822,7 +3822,7 @@ item. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3888,7 +3888,7 @@ (Default `S'). Persistent. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -3954,7 +3954,7 @@ be set with the `O' command. Persistent. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4020,7 +4020,7 @@ off). Persistent. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4086,7 +4086,7 @@ only; "X11" interface always uses a timer based delay. The - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4152,7 +4152,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4218,7 +4218,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4284,7 +4284,7 @@ If NetHack can, it should use this size font for text windows. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4350,7 +4350,7 @@ Number of lines for traditional below-the-map status display. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4416,7 +4416,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4482,7 +4482,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4548,7 +4548,7 @@ pressions. It is possible to compile NetHack without regular - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4614,7 +4614,7 @@ key can be a single character ("x"), a control key ("^X", "C-x"), - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4680,7 +4680,7 @@ When asked for a location, the key to toggle autodescribe. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4746,7 +4746,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4812,7 +4812,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4878,7 +4878,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -4944,7 +4944,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5010,7 +5010,7 @@ cyan, gray, orange, light-green, yellow, light-blue, light- - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5076,7 +5076,7 @@ value changes upwards or downwards. This attribute times - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5142,7 +5142,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5208,7 +5208,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5274,7 +5274,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5340,7 +5340,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5406,7 +5406,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5472,7 +5472,7 @@ may want to alter settings via SYMBOLS= and ROGUESYMBOLS= in your - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5538,7 +5538,7 @@ - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5604,7 +5604,7 @@ spectively, to identify unique people for the score file. - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5617,8 +5617,17 @@ 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- + 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: @@ -5634,43 +5643,34 @@ 10. Scoring - NetHack maintains a list of the top scores or scorers on + 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 + 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 + 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 + 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 + 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 + 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 play- - mode:explore option. The other is to issue the "#exploremode" - NetHack 3.6 December 17, 2019 + + + + NetHack 3.6 December 18, 2019 @@ -5680,63 +5680,63 @@ - extended command while already playing the game. Starting a new + 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 + 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 + 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 + 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 + 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 + 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 + Main events in the course of the game development are described below: - Jay Fenlason wrote the original Hack, with help from Kenny + 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 - (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 + a very different game, and published (at least) three versions - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5746,7 +5746,19 @@ - 1.4. He then coordinated a cast of thousands in enhancing and + (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 @@ -5754,55 +5766,43 @@ 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 + 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 + 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, + 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 + 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 + 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- + 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 de- - velopment, 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. + 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 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5812,63 +5812,63 @@ + 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 + 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 + 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. During the lifespan of NetHack 3.1 and 3.2, several enthusi- - asts of the game added their own modifications to the game and + 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 + 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- + 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- + 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. 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 + 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 - 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 + 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 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5878,40 +5878,53 @@ - bug list, 3.3 proved stable enough to last for more than a year + 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 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 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- + 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- + 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 + 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- + 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 + 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 + Janne Salmijarvi and Teemu Suikki maintained and enhanced + the Amiga port of 3.4 after Janne Salmijarvi resurrected it for 3.3.1. Christian "Marvin" Bressler maintained 3.4 for the Atari af- @@ -5919,22 +5932,9 @@ 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 - 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 - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019 @@ -5944,63 +5944,63 @@ - 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 + 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 + 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 + 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 + 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 + 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 + 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- + 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- + 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. - 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, - NetHack 3.6 December 17, 2019 + + NetHack 3.6 December 18, 2019 @@ -6010,21 +6010,35 @@ - Patric Mueller, Pat Rankin, Derek S. Ray, Alex Smith, Mike + 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 + hancements and the adopted curses window port, were released as 3.6.2. - Bart House, who had contributed to the game as a porting + 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 + 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 17, 2019 containing a + NetHack 3.6.4 was released on December 18, 2019 containing a security fix and a few bug fixes. The official NetHack web site is maintained by Ken Lorber at @@ -6033,22 +6047,35 @@ 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 + 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 + 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). - - - - - - - - - - - From time to time, some depraved individual out there in - netland sends a particularly intriguing modification to help out + 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 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 + + + + NetHack 3.6 December 18, 2019 + + + + + + NetHack Guidebook 93 + + + Alex Smith Janne Salmijarvi Norm Meluch Andreas Dorn Jean-Christophe Collet Olaf Seibert Andy Church Jeff Bailey Pasi Kallinen @@ -6063,19 +6090,6 @@ Bruce Holloway Karl Garrison Richard P. Hughey Bruce Mewborne Keizo Yamamoto Rob Menke Carl Schelin Keith Simpson Robin Bandy - - - - NetHack 3.6 December 17, 2019 - - - - - - NetHack Guidebook 93 - - - Chris Russo Ken Arnold Robin Johnson David Cohrs Ken Arromdee Roderick Schertler David Damerell Ken Lorber Roland McGrath @@ -6103,7 +6117,7 @@ Irina Rempt-Drijfhout Mike Passaretti Izchak Miller Mike Stephenson - Brand and product names are trademarks or registered trade- + Brand and product names are trademarks or registered trade- marks of their respective holders. @@ -6118,21 +6132,7 @@ - - - - - - - - - - - - - - - NetHack 3.6 December 17, 2019 + NetHack 3.6 December 18, 2019