Merge branch 'NetHack-3.7' into twitch-interact

This commit is contained in:
2026-04-15 18:02:20 -07:00
17 changed files with 138 additions and 63 deletions

View File

@@ -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.
-----

View File

@@ -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.

View File

@@ -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);

View File

@@ -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" });

View File

@@ -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)

View File

@@ -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 = "%" });

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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
@@ -2915,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,

View File

@@ -3292,6 +3292,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;

View File

@@ -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 */
}

View File

@@ -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;

View File

@@ -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!");

View File

@@ -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)) {
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 */

View File

@@ -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;
@@ -2671,9 +2668,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)) {
@@ -2816,6 +2817,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;
@@ -3585,7 +3588,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;