From bc94d7a3558868fc9f1e33a54a57eed7f84e3a60 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 14 Apr 2026 11:28:07 +0100 Subject: [PATCH 1/7] More interesting rolling boulder traps Rolling boulder traps now react to having boulders pushed onto them; the boulder will roll until reaching the trap's launch spot (resetting the trap if the boulder was removed), or until it hits a wall otherwise. Because they can now be reset, they aren't removed when stepping on them with a misplaced boulder (although no boulder moves unless there's one on the appropriate spot). --- doc/fixes3-7-0.txt | 6 ++++-- src/hack.c | 20 ++++++++++++++++++++ src/trap.c | 10 +++++++--- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index 4a0bb71e4..8861dc69f 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -1583,8 +1583,8 @@ allow rogues to also backstab sleeping or paralyzed monsters rogues cannot backstab monsters that have no backside give experience if opening Schroedinger's Box causes death of the cat inside priest donation amounts are explicitly stated, randomized slightly, based on - peak rather than current level, and allow for bulk donations (buying - larger amounts of clairvoyance/protection) if you have a lot of gold + peak rather than current level, and allow for bulk donations (buying + larger amounts of clairvoyance/protection) if you have a lot of gold amulet of magical breathing increases power regeneration change some command keys, 'v' is now chronicle, 'V' is versionshort, m-prefix 'V' is longer version, remove key binding of #history @@ -1596,6 +1596,8 @@ prevent phaseable monsters hiding deep inside nondiggable walls blessed potion of see invisible does not guarantee the intrinsic prevent selecting all options in #optionsfull menu shapeshifters change shape less +rolling boulder traps aren't removed when stepped on and move boulders + pushed onto them Fixes to 3.7.0-x General Problems Exposed Via git Repository diff --git a/src/hack.c b/src/hack.c index ebdc126c2..38a24c6a7 100644 --- a/src/hack.c +++ b/src/hack.c @@ -592,6 +592,26 @@ moverock_core(coordxy sx, coordxy sy) } seetrap(ttmp); return sobj_at(BOULDER, sx, sy) ? -1 : 0; + case ROLLING_BOULDER_TRAP: + { + int tox = rx; + int toy = ry; + /* the boulder continues until it reaches one of + the trap's launch spots or hits a wall / out-of-bounds */ + while (isok(tox + u.dx, toy + u.dy)) { + tox += u.dx; + toy += u.dy; + if (tox == ttmp->launch.x && toy == ttmp->launch.y) + break; + if (tox == ttmp->launch2.x && toy == ttmp->launch2.y) + break; + } + pline("%s away from you!", + Tobjnam(otmp, "suddenly roll")); + feeltrap(ttmp); + launch_obj(BOULDER, sx, sy, tox, toy, ROLL | LAUNCH_KNOWN); + return sobj_at(BOULDER, sx, sy) ? -1 : 0; + } default: break; /* boulder not affected by this trap */ } diff --git a/src/trap.c b/src/trap.c index 8444e9b30..e44da9133 100644 --- a/src/trap.c +++ b/src/trap.c @@ -2671,9 +2671,13 @@ trapeffect_rolling_boulder_trap( !Deaf ? "Click! " : ""); if (!launch_obj(BOULDER, trap->launch.x, trap->launch.y, trap->launch2.x, trap->launch2.y, style)) { - deltrap(trap); - newsym(u.ux, u.uy); /* get rid of trap symbol */ - pline("Fortunately for you, no boulder was released."); + /* if this is a known trap, the player may have known there wasn't + a lined up boulder, so use a shorter message to avoid --More-- + spam */ + if (style & LAUNCH_KNOWN) + pline("No boulder was released."); + else + pline("Fortunately for you, no boulder was released."); } } else { if (!m_in_air(mtmp)) { From acfbd6d0e4ae3112b66a1564943228f429413441 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 14 Apr 2026 12:47:13 +0100 Subject: [PATCH 2/7] Add rolling boulder traps in Sokoban to reduce wrist strain When playtesting NetHack heavily, I observed that most of the time it wasn't placing much strain on my wrists, but Sokoban was an exception: travel, farmove, etc. can normally be used to avoid the need to spam keys, but they don't work while pushing a boulder, and the boulders often need to be pushed along precise routes, so you have to tap out every movement. This becomes particularly straining when pushing in the last few boulders, as you have to push them a long way along the goal corridor. This commit adds rolling boulder traps to Sokoban that will automatically roll boulders along the goal corridor, meaning that you don't have to push them there manually. This considerably reduces the number of keystrokes needed to solve Sokoban, without making any significant change to the difficulty of the levels. Some of the designs had to change slightly in order to make room for them, but not in a way that meaningfully changes the solution. --- dat/soko1-1.lua | 5 +++-- dat/soko1-2.lua | 5 +++-- dat/soko2-1.lua | 1 + dat/soko2-2.lua | 38 ++++++++++++++++++++------------------ dat/soko3-1.lua | 1 + dat/soko3-2.lua | 3 ++- dat/soko4-1.lua | 13 +++++++++---- dat/soko4-2.lua | 7 +++++-- src/trap.c | 4 +++- 9 files changed, 47 insertions(+), 30 deletions(-) diff --git a/dat/soko1-1.lua b/dat/soko1-1.lua index ba5a9dfd7..ac9bcdf31 100644 --- a/dat/soko1-1.lua +++ b/dat/soko1-1.lua @@ -60,9 +60,10 @@ des.object("boulder", 09, 12); des.object("boulder", 03, 14); -- prevent monster generation over the (filled) holes -des.exclusion({ type = "monster-generation", region = { 08,01, 23,01 } }); +des.exclusion({ type = "monster-generation", region = { 07,01, 23,01 } }); -- Traps -des.trap("hole", 08, 01); +des.trap("hole", 07, 01); +des.trap("rolling boulder", 08, 01); des.trap("hole", 09, 01); des.trap("hole", 10, 01); des.trap("hole", 11, 01); diff --git a/dat/soko1-2.lua b/dat/soko1-2.lua index 2ff3a9feb..36ab90721 100644 --- a/dat/soko1-2.lua +++ b/dat/soko1-2.lua @@ -61,9 +61,9 @@ des.object("boulder",12,09); des.object("boulder",11,10); -- prevent monster generation over the (filled) holes -des.exclusion({ type = "monster-generation", region = { 05,01, 22,01 } }); +des.exclusion({ type = "monster-generation", region = { 05,01, 23,01 } }); -- Traps -des.trap("hole",05,01) +des.trap("rolling boulder",05,01) des.trap("hole",06,01) des.trap("hole",07,01) des.trap("hole",08,01) @@ -81,6 +81,7 @@ des.trap("hole",19,01) des.trap("hole",20,01) des.trap("hole",21,01) des.trap("hole",22,01) +des.trap("hole",23,01) des.monster({ id = "giant mimic", appear_as = "obj:boulder" }); des.monster({ id = "giant mimic", appear_as = "obj:boulder" }); diff --git a/dat/soko2-1.lua b/dat/soko2-1.lua index eb66e0fbf..e8b56efef 100644 --- a/dat/soko2-1.lua +++ b/dat/soko2-1.lua @@ -49,6 +49,7 @@ des.object("boulder",06,06) -- prevent monster generation over the (filled) holes des.exclusion({ type = "monster-generation", region = { 07,09, 18,09 } }); -- Traps +des.trap("rolling boulder",07,09) des.trap("hole",08,09) des.trap("hole",09,09) des.trap("hole",10,09) diff --git a/dat/soko2-2.lua b/dat/soko2-2.lua index 1302a1b5e..f11702c1e 100644 --- a/dat/soko2-2.lua +++ b/dat/soko2-2.lua @@ -7,26 +7,27 @@ des.level_init({ style = "solidfill", fg = " " }); des.level_flags("mazelevel", "noteleport", "premapped", "sokoban", "solidify"); des.map([[ - -------- ---|.|....| -|........|---------- -|.-...-..|.|.......| -|...-......|.......| -|.-....|...|.......| -|....-.--.-|.......| -|..........|.......| -|.--...|...|.......| -|....-.|---|.......| ---|....|----------+| - |................| - ------------------ + -------- +--|.|....| +|........|---------- +|.-...-..|.|.......| +|...-......|.......| +|.-....|...|.......| +|....-.--.-|.......| +|..........|.......| +|.--...|...|.......--- +|....-.|---|.......+.| +--|....|------------.| + |................+.| + -------------------- ]]); des.stair("down", 06,11) des.stair("up", 15,06) -des.door("locked",18,10) -des.region(selection.area(00,00,19,12), "lit"); -des.non_diggable(selection.area(00,00,19,12)); -des.non_passwall(selection.area(00,00,19,12)); +des.door("locked",19,09) +des.door("locked",19,11) +des.region(selection.area(00,00,21,12), "lit"); +des.non_diggable(selection.area(00,00,21,12)); +des.non_passwall(selection.area(00,00,21,12)); -- Boulders des.object("boulder",04,02) @@ -49,7 +50,7 @@ des.object("boulder",05,11) -- prevent monster generation over the (filled) holes des.exclusion({ type = "monster-generation", region = { 06,11, 18,11 } }); -- Traps -des.trap("hole",07,11) +des.trap("rolling boulder",07,11) des.trap("hole",08,11) des.trap("hole",09,11) des.trap("hole",10,11) @@ -60,6 +61,7 @@ des.trap("hole",14,11) des.trap("hole",15,11) des.trap("hole",16,11) des.trap("hole",17,11) +des.trap("hole",18,11) -- Random objects des.object({ class = "%" }); diff --git a/dat/soko3-1.lua b/dat/soko3-1.lua index 2515ffca1..1c7715858 100644 --- a/dat/soko3-1.lua +++ b/dat/soko3-1.lua @@ -55,6 +55,7 @@ des.object("boulder",10,10) -- prevent monster generation over the (filled) holes des.exclusion({ type = "monster-generation", region = { 11,10, 27,10 } }); -- Traps +des.trap("rolling boulder",11,10) des.trap("hole",12,10) des.trap("hole",13,10) des.trap("hole",14,10) diff --git a/dat/soko3-2.lua b/dat/soko3-2.lua index 1015125d6..24236efe2 100644 --- a/dat/soko3-2.lua +++ b/dat/soko3-2.lua @@ -48,8 +48,9 @@ des.object("boulder",10,10) des.object("boulder",03,11) -- prevent monster generation over the (filled) holes -des.exclusion({ type = "monster-generation", region = { 12,10, 24,10 } }); +des.exclusion({ type = "monster-generation", region = { 11,10, 24,10 } }); -- Traps +des.trap("rolling boulder",11,10) des.trap("hole",12,10) des.trap("hole",13,10) des.trap("hole",14,10) diff --git a/dat/soko4-1.lua b/dat/soko4-1.lua index 4c8f6d162..3768c1cf7 100644 --- a/dat/soko4-1.lua +++ b/dat/soko4-1.lua @@ -74,16 +74,21 @@ des.object("boulder",10,10) -- prevent monster generation over the (filled) pits des.exclusion({ type = "monster-generation", region = { 01,06, 07,11 } }); + -- Traps -des.trap("pit",03,06) des.trap("pit",04,06) -des.trap("pit",05,06) + +des.trap("pit",02,06) +des.trap("pit",02,07) des.trap("pit",02,08) -des.trap("pit",02,09) +des.trap("rolling boulder",02,09) + +des.trap("pit",02,10) +des.trap("pit",03,10) des.trap("pit",04,10) des.trap("pit",05,10) des.trap("pit",06,10) -des.trap("pit",07,10) +des.trap("rolling boulder",07,10) -- A little help des.object("scroll of earth",02,11) diff --git a/dat/soko4-2.lua b/dat/soko4-2.lua index de749ad37..d0606dc6a 100644 --- a/dat/soko4-2.lua +++ b/dat/soko4-2.lua @@ -50,11 +50,14 @@ des.trap("pit",01,03) des.trap("pit",01,04) des.trap("pit",01,05) des.trap("pit",01,06) -des.trap("pit",01,07) +des.trap("rolling boulder",01,07) + +des.trap("pit",01,08) +des.trap("pit",02,08) des.trap("pit",03,08) des.trap("pit",04,08) des.trap("pit",05,08) -des.trap("pit",06,08) +des.trap("rolling boulder",06,08) -- A little help des.object("scroll of earth",01,09) diff --git a/src/trap.c b/src/trap.c index e44da9133..ce00d3403 100644 --- a/src/trap.c +++ b/src/trap.c @@ -2820,6 +2820,8 @@ immune_to_trap(struct monst *mon, unsigned ttype) hanging to the ceiling */ if (Sokoban && (is_pit(ttype) || is_hole(ttype))) return TRAP_NOT_IMMUNE; + if (In_sokoban(&u.uz) && ttype == ROLLING_BOULDER_TRAP) + return TRAP_CLEARLY_IMMUNE; /* not dangerous in Sokoban */ if (is_floater(pm) || is_flyer(pm) || (is_clinger(pm) && has_ceiling(&u.uz))) return TRAP_CLEARLY_IMMUNE; @@ -3589,7 +3591,7 @@ find_random_launch_coord(struct trap *ttmp, coord *cc) coordxy dx, dy; coordxy x, y; - if (!ttmp || !cc) + if (!ttmp || !cc || Sokoban) return FALSE; x = ttmp->tx; From 89473216ae083b14f876532aec8ee30b3689eef9 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 14 Apr 2026 16:51:20 +0100 Subject: [PATCH 3/7] Iron footwear and traps balance fixes Any sort of iron footwear now protects from traps, and polymorph traps change one sort of iron footwear into a different sort of iron footwear (removing any incentive to try to farm them, because you will see both options very quickly). --- doc/fixes3-7-0.txt | 2 +- include/extern.h | 1 + src/muse.c | 6 ++++-- src/trap.c | 17 +++++++---------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index 8861dc69f..b4078d700 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -2917,7 +2917,7 @@ add "make fetch-docs" to download pre-formatted documentation monsters will use throw-and-return weapons such as an aklys archeologists can identify scrolls by deciphering their labels monster destroy armor -spell first erodes armor -iron shoes protect the wearer against certain floor-based traps +iron footwear protects the wearer against certain floor-based traps ring of stealth prevents hero from leaving tracks the game now automatically tracks which sell prices and buy prices you have seen for each type of item; these are visible in the discoveries list, diff --git a/include/extern.h b/include/extern.h index 66a5120b4..3b357ec0d 100644 --- a/include/extern.h +++ b/include/extern.h @@ -3289,6 +3289,7 @@ extern struct monst *activate_statue_trap(struct trap *, coordxy, coordxy, extern int immune_to_trap(struct monst *, unsigned) NO_NNARGS; /* revisit */ extern void set_utrap(unsigned, unsigned); extern void reset_utrap(boolean); +extern boolean wearing_iron_shoes(struct monst *); extern boolean m_harmless_trap(struct monst *, struct trap *) NONNULLPTRS; extern void dotrap(struct trap *, unsigned) NONNULLARG1; extern void seetrap(struct trap *) NONNULLARG1; diff --git a/src/muse.c b/src/muse.c index 2d5e82bd4..78b61c10b 100644 --- a/src/muse.c +++ b/src/muse.c @@ -2131,8 +2131,10 @@ find_misc(struct monst *mtmp) if ((t = t_at(xx, yy)) != 0 && (ignore_boulders || !sobj_at(BOULDER, xx, yy)) && !onscary(xx, yy, mtmp)) { - /* use trap if it's the correct type */ - if (t->ttyp == POLY_TRAP) { + /* use trap if it's the correct type and will + polymorph the monster */ + if (t->ttyp == POLY_TRAP && + !wearing_iron_shoes(mtmp)) { gt.trapx = xx; gt.trapy = yy; gm.m.has_misc = MUSE_POLY_TRAP; diff --git a/src/trap.c b/src/trap.c index ce00d3403..630334228 100644 --- a/src/trap.c +++ b/src/trap.c @@ -16,7 +16,6 @@ staticfn boolean mu_maybe_destroy_web(struct monst *, boolean, struct trap *); staticfn struct obj *t_missile(int, struct trap *); staticfn boolean floor_trigger(int); staticfn boolean check_in_air(struct monst *, unsigned); -staticfn boolean wearing_iron_shoes(struct monst *); staticfn int trapeffect_arrow_trap(struct monst *, struct trap *, unsigned); staticfn int trapeffect_dart_trap(struct monst *, struct trap *, unsigned); staticfn int trapeffect_rocktrap(struct monst *, struct trap *, unsigned); @@ -1094,12 +1093,12 @@ check_in_air(struct monst *mtmp, unsigned trflags) || ((is_you ? Flying : is_flyer(mtmp->data)) && !plunged)); } -/* return TRUE if mtmp is wearing iron shoes */ -staticfn boolean +/* return TRUE if mtmp is wearing shoes made of iron (iron/kicking) */ +boolean wearing_iron_shoes(struct monst *mtmp) { struct obj *armf = which_armor(mtmp, W_ARMF); - return armf && armf->otyp == IRON_SHOES; + return armf && objects[armf->otyp].oc_material == IRON; } /* is trap ttmp harmless to monster mtmp? */ @@ -2453,10 +2452,6 @@ trapeffect_poly_trap( struct trap *trap, unsigned int trflags) { - static int possible_boots[] = { - ELVEN_BOOTS, KICKING_BOOTS, FUMBLE_BOOTS, LEVITATION_BOOTS, - JUMPING_BOOTS, SPEED_BOOTS, WATER_WALKING_BOOTS }; - if (mtmp == &gy.youmonst) { boolean viasitting = (trflags & VIASITTING) != 0; int steed_article = ARTICLE_THE; @@ -2480,7 +2475,8 @@ trapeffect_poly_trap( if (wearing_iron_shoes(mtmp)) { deltrap(trap); pline("%s warps strangely.", Yname2(uarmf)); - poly_obj(uarmf, ROLL_FROM(possible_boots)); + poly_obj( + uarmf, uarmf->otyp == IRON_SHOES ? KICKING_BOOTS : IRON_SHOES); update_inventory(); if (uarmf) prinv(NULL, uarmf, 0); @@ -2506,7 +2502,8 @@ trapeffect_poly_trap( impossible("re-equipping iron shoes destroyed them?"); return Trap_Effect_Finished; } - shoes = poly_obj(shoes, ROLL_FROM(possible_boots)); + shoes = poly_obj( + shoes, shoes->otyp == IRON_SHOES ? KICKING_BOOTS : IRON_SHOES); /* now equip them again */ if (shoes) { mtmp->misc_worn_check |= W_ARMF; From a5be241bd4be9c4eabaa0fccad00901c8bf8cbdc Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 14 Apr 2026 17:42:03 +0100 Subject: [PATCH 4/7] Fix polymorphing into a large monster while wearing unusual cloaks Most cloaks have a clasp, but some don't, so they need different messages (and occasionally different behaviour). --- src/polyself.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/polyself.c b/src/polyself.c index 973cc053b..43c76cf40 100644 --- a/src/polyself.c +++ b/src/polyself.c @@ -1176,9 +1176,20 @@ break_armor(void) if ((otmp = uarmc) != 0 /* mummy wrapping adapts to small and very big sizes */ && (otmp->otyp != MUMMY_WRAPPING || !WrappingAllowed(uptr))) { - pline_The("clasp on your %s breaks open!", cloak_simple_name(otmp)); - (void) Cloak_off(); - dropp(otmp); + if (otmp->otyp == MUMMY_WRAPPING) { + /* doesn't have a clasp to break open */ + Your("%s tears apart!", cloak_simple_name(otmp)); + (void) Cloak_off(); + useup(otmp); + } else if (otmp->otyp == ALCHEMY_SMOCK) { + pline_The("knot on your %s is pulled apart!", cloak_simple_name(otmp)); + (void) Cloak_off(); + dropp(otmp); + } else { + pline_The("clasp on your %s breaks open!", cloak_simple_name(otmp)); + (void) Cloak_off(); + dropp(otmp); + } } if (uarmu) { Your("shirt rips to shreds!"); From b67c624034e5fb74d7c062265fae115ba52e7a8f Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 14 Apr 2026 17:48:49 +0100 Subject: [PATCH 5/7] Vampires are not polymorphed by Vlad's throne The throne was intended for one specific vampire, but the others are "close enough" to not be warped into a different shape. --- src/sit.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/sit.c b/src/sit.c index 6ae51fdec..b8ea2cd79 100644 --- a/src/sit.c +++ b/src/sit.c @@ -325,9 +325,13 @@ special_throne_effect(int effect) { case 11: /* polymorph effect (not blocked by magic resistance, but other things that protect from polymorphs work) */ - pline("This throne was not meant for those such as you!"); - You_feel("a change coming over you."); - polyself(POLY_NOFLAGS); + if (is_vampire(gy.youmonst.data)) { + pline("You feel unworthy."); + } else { + pline("This throne was not meant for those such as you!"); + You_feel("a change coming over you."); + polyself(POLY_NOFLAGS); + } break; case 12: /* acid damage */ From 620d8890168358f43e2993d89737a920999f4ff0 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 14 Apr 2026 17:53:58 +0100 Subject: [PATCH 6/7] Correctly abbreviate a message to shrink executable size No player-visible gameplay changes. --- src/sit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sit.c b/src/sit.c index b8ea2cd79..15c16dbdf 100644 --- a/src/sit.c +++ b/src/sit.c @@ -326,7 +326,7 @@ special_throne_effect(int effect) { /* polymorph effect (not blocked by magic resistance, but other things that protect from polymorphs work) */ if (is_vampire(gy.youmonst.data)) { - pline("You feel unworthy."); + You_feel("unworthy."); } else { pline("This throne was not meant for those such as you!"); You_feel("a change coming over you."); From 45e83059187c2011d780f91d648f0495655fbe3d Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 14 Apr 2026 20:35:40 +0100 Subject: [PATCH 7/7] True rumor and oracularity update This removes or updates several true rumors that have become misleading or inaccurate due to changes to the mechanics they were describing, and adds several new rumors describing mechanics that are either new, or are intended to be a larger part of the game than they were in previous versions. More oracularities describing the new mechanics are needed, but I haven't managed to get into the write frame of mind to write in the Oracle's voice yet... --- dat/oracles.txt | 3 ++- dat/rumors.tru | 32 ++++++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/dat/oracles.txt b/dat/oracles.txt index d4d5ae250..cbaeb5d3b 100644 --- a/dat/oracles.txt +++ b/dat/oracles.txt @@ -100,5 +100,6 @@ be old and miserly. The name of Elbereth may strike fear into the hearts of thine enemies, if thou dost write it upon the ground at thy feet. If thou maintainest the utmost calm, thy safety will be aided greatly, but beware lest thy clumsy -feet scuff the inscription, cancelling its potence. +feet scuff the inscription, cancelling its potence, or thy wayward +sword-arm break the truce. ----- diff --git a/dat/rumors.tru b/dat/rumors.tru index 97d66495a..432b220de 100644 --- a/dat/rumors.tru +++ b/dat/rumors.tru @@ -2,6 +2,7 @@ A blindfold can be very useful if you're telepathic. A candelabrum affixed with seven candles shows the way with a magical light. A cream pie has two uses: food... and entertainment. A crystal plate mail will not rust. +A dead body may protect your live body. But only an item can protect an item. A katana might slice a worm in two. A magic vomit pump could be useful for gourmands. A nymph knows how to unlock chains. @@ -29,7 +30,6 @@ Bandaging wounds helps keep up appearances. Bashing monsters with a bow is not such a good idea. Be careful! The Wizard may plan an ambush! Be nice to a nurse: Put away your weapon and take off your clothes. -Being digested is a painfully slow process. Blank scrolls make more interesting reading. Blind? Catch a floating eye! Booksellers never read scrolls; they might get carried away. @@ -45,6 +45,7 @@ Don't forget! Large dogs are MUCH harder to kill than little dogs. Don't lash out at people while blinded. Don't mess with shopkeepers, or you'll get the Guild after you. Dragons never whip their children; they wouldn't feel it! +Dwarves use their cloaks to keep their drinks cool. Eat your carrots. They're good for your eyes. Eating a freezing sphere is like eating a yeti. Eating a killer bee is like eating a scorpion. @@ -56,9 +57,10 @@ Elf corpses are incompatible with the sandman, and at times the gods as well. Elven cloaks cannot rust. Elves can help you feel less tired. Even evil players have a guardian angel. +Even the most powerful heroes sometimes need to quaff away their injuries. Ever fought with an enchanted tooth? Ever tried reading while confused? -Ever tried to put a troll into a large box? +Ever tried to lock a troll inside a large box? Ever wondered why one would want to dip something in a potion? Expensive cameras have penetrating flash lights. Extra staircases lead to extra levels. @@ -74,6 +76,7 @@ Got a question? Try rec.games.roguelike.nethack. Grave robbers sometimes get rich. Guy Montag keeps his scrolls in a bag. Handle your flasks carefully -- there might be a ghost inside! +Heavy-duty boots can protect more than just your feet. Holy water has many uses. Horses trust their riders, even when not so deserved. Hunger is a confusing experience for a dog! @@ -90,6 +93,7 @@ If you want to hit, use a dagger. If you want to rob a shop, train your dog. If you're lost, try buying a map next time you're in a shop. If your hands are greasy, why not wash them? +If your items get destroyed, you weren't wearing the right ring. Inside a shop you better take a look at the price tags before buying anything. It is bad manners to use a wand in a shop. It is dangerous to visit a graveyard at midnight. @@ -98,7 +102,7 @@ It is rumored that the Wizard has hired some help. It is the letter 'c' and not 'e' that changes status to statue. It might be a good idea to offer the unicorn a ruby. It would be peculiarly sad were your dog turned to stone. -It's a `d' eats `d' world. +It's a 'd' eats 'd' world. Just because it says READ ME doesn't mean you should. Keep your armors away from rust. Keep your weaponry away from acids. @@ -119,6 +123,7 @@ Nurses are trained to touch naked persons: they don't harm them. Nymphs can unlink more than your chain mail. Once your little dog will be a big dog, and you will be proud of it. Only female monsters can lay eggs. +Only the most confused adventurers would read cursed destroy armor scrolls. Opening a tin is difficult, especially when you attempt it bare handed! Orcs and killer bees share their lifestyle. Orcs do not procreate in dark rooms. @@ -155,12 +160,14 @@ Sometimes monsters are more likely to fight each other than attack you. Spinach, carrot, and jelly -- a meal fit for a nurse! Surviving the full extent of the mines could mean that your luck is changing. Tainted meat is even more sickening than poison! +Take your healing potions to the next level! Telepathy is just a trick: once you know how to do it, it's easy. The Leprechaun Gold Tru$t is no division of the Magic Memory Vault. The Wizard finds death to be quite an experience. The best equipment for your work is, of course, the most expensive. The gods don't appreciate pesky priesthood. The gods will get angry if you kill your dog. +The less magic in your armor, the more you can add. The magic marker is mightier than the sword. The moon is not the only heavenly body to influence this game. The orc swings his orcish broadsword named Elfrist at you. You die... @@ -173,10 +180,10 @@ There is no harm in praising a large dog. There is nothing like eating a mimic. There once was a Knight named Lancelot who liked to ride with his lance a lot. They say a gelatinous cube can paralyze you... -They say that Juiblex is afraid of a wand of digging. +They say that Juiblex is somewhat afraid of a wand of digging. They say that Medusa would like to put you on a pedestal. -They say that Vlad lives!!! ... in the mazes. -They say that `Elbereth' is often written about. +They say that Vlad lives!!! ... near the mazes. +They say that 'Elbereth' is often written about. They say that a bag of holding can't hold everything. They say that a blessed tin of quasit meat is a quick meal. They say that a cat avoids traps. @@ -205,6 +212,7 @@ They say that a unicorn might bring you luck. They say that a wand of cancellation is like a wand of polymorph. They say that a wand of locking can close more than just doors. They say that a wand of polymorph can change your game. +They say that a wise choice of donations lets you choose your blessings. They say that a wizard is even more powerful the second time around. They say that a xorn knows of no obstacles when pursuing you. They say that abusing a credit card could shock you sooner or later. @@ -216,7 +224,6 @@ They say that antique dealers are always interested in precious stones. They say that bandaging one's wounds helps to keep up one's appearance. They say that booze can be diluted but not cancelled. They say that by listening carefully, you can hear a secret door! -They say that calculating your donations lets you choose your blessings. They say that carrots and carrot juice may improve your vision. They say that cave spiders are not considered expensive health food. They say that demigods must leave behind their prized earthly possessions. @@ -227,11 +234,12 @@ They say that dwarves lawfully mind their own business. They say that eating a bat corpse will make you batty, for a while. They say that eating a cram ration is a smart move. They say that eating blue jelly is cool if you don't fight the feeling. +They say that elven armor can hold the most magic. They say that escaping a dungeon is only the beginning of the end. They say that feeling an unexpected draft of air is sort of a breakthrough. They say that finding a cursed gray stone is always bad luck. They say that gaining a level is an experience that can raise your sights. -They say that garter snake meat rarely tastes good but it's still healthy. +They say that garter snake meat may not taste good but it's still healthy. They say that gauntlets of dexterity have a hidden enchanted touch. They say that going to heaven is just another way of escaping the dungeon. They say that golden nagas are law-abiding denizens as long as you are too. @@ -239,6 +247,7 @@ They say that gremlins can make you feel cooler than you are now. They say that grid bugs only exist in a strictly Cartesian sense. They say that hackers often feel jumpy about eating nymphs. They say that having polymorph control won't shock you. +They say that healing potions often come in pairs. They say that if it's hard getting your food down another bite could kill. They say that if you don't wear glasses why bother with carrots? They say that if you notice a loose board beneath you, don't step on it. @@ -271,6 +280,7 @@ They say that only chaotics can kill shopkeepers and get away with it. They say that only female monsters can lay eggs. They say that playing a horn really bad is really good. They say that prayer at an altar can sometimes make the water there holy. +They say that the right wand may help you chase a nymph. They say that rubbing a glowing potion does not make it a magic lamp. They say that scalpels become dull because they're not athames. They say that shopkeepers don't like pick-axes. @@ -280,6 +290,7 @@ They say that shopkeepers often have a large amount of money in their purses. They say that shopkeepers often remember things that you might forget. They say that sinks and armor don't mix, take your cloak off now! They say that sinks run hot and cold and many flavors in between. +They say that sitting on a vampire's throne is worth the danger. They say that snake charmers aren't charismatic, just musical. They say that soldiers are always prepared and usually protected. They say that some eggs could hatch in your pack, lucky or not. @@ -296,6 +307,7 @@ They say that teleport traps are the devil's work. They say that tengu don't wear rings, why should you? They say that tengu never steal gold although they would be good at it. They say that that which was stolen once can be stolen again, ask any nymph. +They say that the best way to fix your injuries is a potion. They say that the Delphic Oracle knows that lizard corpses aren't confusing. They say that the Hand of Elbereth can hold up your prayers. They say that the Leprechaun King is rich as Croesus. @@ -313,6 +325,7 @@ They say that the view from a fog cloud is really very moving. They say that the walls in shops are made of extra hard material. They say that there are at least 15 ways to lose a pair of levitation boots. They say that throwing glass gems is the same as throwing rocks. +They say that to block a shocking sphere, you need the right shield. They say that trespassing a boulder is probably beneath you. They say that true power comes from within...except when it doesn't. They say that unicorns are fond of precious gems. @@ -324,6 +337,7 @@ They say that with a floating eye you could see in the dark. They say that you are lucky if you can get a unicorn to catch a ruby. They say that you are what you eat. They say that you can find named weapons at an altar if you're lucky. +They say that you can give potions of extra healing new energy. They say that you can safely touch cockatrice eggs but why bother? They say that you can't break an amulet of reflection. They say that you don't always get what you wish for. @@ -351,6 +365,7 @@ Vampires hate garlic. Vault guards never disturb their Lords. Vegetarians enjoy lichen and seaweed. Visitors are requested not to apply genocide to shopkeepers. +Want to heal faster? Dip your potions of healing in a potion of speed! Watch out, the Wizard might come back. Water traps have no effect on dragons. What is a cockatrice going to eat when it gets hungry? @@ -361,6 +376,7 @@ Why would anybody in his sane mind engrave "Elbereth"? Wishing too much may bring you too little. You can't bribe soldier ants. You can't leave a shop through the back door: there isn't one! +You can't reflect explosions. But you might resist them. You may discover a fine spirit inside a potion bottle. You may want to dip into a potion of bottled blessings. You might be able to bribe a demon lord.