home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume7 / nethack3 / part06 < prev    next >
Internet Message Format  |  1989-07-31  |  56KB

  1. Path: uunet!zephyr.ens.tek.com!tektronix!tekgen!tekred!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v07i061:  NetHack3 -  display oriented dungeons & dragons (Ver. 3.0), Part06/38
  5. Message-ID: <4314@tekred.CNA.TEK.COM>
  6. Date: 24 Jul 89 05:00:14 GMT
  7. Sender: nobody@tekred.CNA.TEK.COM
  8. Lines: 2003
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
  12. Posting-number: Volume 7, Issue 61
  13. Archive-name: NetHack3/Part06
  14.  
  15.  
  16.  
  17. #! /bin/sh
  18. # This is a shell archive.  Remove anything before this line, then unpack
  19. # it by saving it into a file and typing "sh file".  To overwrite existing
  20. # files, type "sh file -c".  You can also feed this as standard input via
  21. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  22. # will see the following message at the end:
  23. #        "End of archive 6 (of 38)."
  24. # Contents:  auxil/data.base src/trap.c
  25. # Wrapped by billr@saab on Sun Jul 23 21:32:49 1989
  26. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  27. if test -f 'auxil/data.base' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'auxil/data.base'\"
  29. else
  30. echo shar: Extracting \"'auxil/data.base'\" \(13532 characters\)
  31. sed "s/^X//" >'auxil/data.base' <<'END_OF_FILE'
  32. X    NetHack data file - version 3.0
  33. X@    human;
  34. X        These strange creatures live mostly on the  surface  of  the
  35. X        earth, gathering together in societies of various forms, but
  36. X        occasionally a stray will descend into the depths and commit
  37. X        mayhem  among  the  dungeon  residents who, naturally, often
  38. X        resent the intrusion of such beasts.  They  are  capable  of
  39. X        using  weapons  and  magic,  and it is even rumored that the
  40. X        Wizard of Yendor is a member of this species.
  41. X-    a wall
  42. X|    a wall
  43. X+    a door
  44. X.    the floor of a room
  45. X    a dark part of a room
  46. X#    a corridor
  47. X<    a way to the previous level
  48. X>    a way to the next level
  49. X}    water filled area
  50. X)    a weapon
  51. X[    a suit or piece of armor
  52. X%    a piece of food
  53. X?    a scroll
  54. X/    a wand
  55. X=    a ring
  56. X!    a potion
  57. X(    a useful item (pick-axe, key, lamp, etc.)
  58. X*    a gem or rock
  59. X$    a pile of gold;
  60. X        A metal of characteristic yellow colour, the  most  precious
  61. X        metal  used as a common commercial medium of exchange.  Sym-
  62. X        bol, Au; at.  no. 79; at. wt. 197.2.  It is the most  malle-
  63. X        able  and  ductile  of  all metals, and very heavy (sp. gr.,
  64. X        19.3).  It is quite unalterable by heat, moisture, and  most
  65. X        corrosive  agents,  and therefore well suited for its use in
  66. X        coin and jewelry.
  67. X              [ Webster's New International Dictionary of the
  68. X            English Language, Second Edition ]
  69. X"    an amulet (or a web)
  70. X^    a trap
  71. X0    an iron ball
  72. X_    an iron chain
  73. X`    a boulder or statue
  74. Xa    an ant or other insect
  75. Xb    a blob
  76. Xc    a cockatrice;
  77. X        Once in a great while, when the positions of the  stars  are
  78. X        just right, a seven-year-old rooster will lay an egg.  Then,
  79. X        along will come a snake, to coil around the egg, or a  toad,
  80. X        to  squat  upon  the  egg, keeping it warm and helping it to
  81. X        hatch.  When it hatches, out comes a creature called  basil-
  82. X        isk, or cockatrice, the most deadly of all creatures. A sin-
  83. X        gle glance from its yellow, piercing toad's eyes  will  kill
  84. X        both man  and beast.  Its power of destruction is said to be
  85. X        so great that sometimes simply to hear its  hiss  can  prove
  86. X        fatal.  Its  breath is so venomous  that it causes all vege-
  87. X        tation to wither.
  88. X        There is, however, one  creature  which  can  withstand  the
  89. X        basilisk's deadly gaze, and this is the weasel. No one knows
  90. X        why this is so, but although the fierce weasel can slay  the
  91. X        basilisk, it will itself be killed in the struggle.  Perhaps
  92. X        the weasel knows the basilisk's fatal weakness:  if it  ever
  93. X        sees  its own reflection in a mirror it will perish instant-
  94. X        ly.  But even a dead basilisk is dangerous, for  it is  said
  95. X        that merely touching its lifeless body can cause a person to
  96. X        sicken and die.
  97. X                [Mythical Beasts by Deirdre Headon
  98. X                 (The Leprechaun Library) and other sources]
  99. Xd    a dog or other canine
  100. Xe    an eye or sphere
  101. Xf    a feline
  102. Xg    a gremlin;
  103. X        The  gremlin is a highly  intelligent and  completely   evil
  104. X        creature.   It lives to torment  other creatures and will go
  105. X        to great lengths to inflict pain or cause injury.
  106. Xh    a humanoid;
  107. X        Humanoids  are all approximately  the size of a human,   and
  108. X        may  be  mistaken for one  at a distance.  They  are usually
  109. X        of a tribal  nature, and will  fiercely defend their  lairs.
  110. X        Usually   hostile, they  may even band  together to raid and
  111. X        pillage human settlements.
  112. Xi    an imp or minor demon;
  113. X         ... imps ... little creatures of two feet high  that  could
  114. X        gambol and jump prodigiously; ...
  115. X                   [The Charwoman's Shadow, by Lord Dunsany]
  116. X    
  117. X        An 'imp' is an off-shoot or cutting.  Thus an 'ymp tree' was
  118. X        a grafted tree, or one grown from a cutting, not from seed.
  119. X        'Imp' properly means a small devil, an off-shoot  of  Satan,
  120. X        but  the distinction between goblins or bogles and imps from
  121. X        hell is hard to make, and many in the  Celtic  countries  as
  122. X        well as the English Puritans regarded all fairies as devils.
  123. X        The fairies of tradition often hover  uneasily  between  the
  124. X        ghostly and the diabolic state.
  125. X                 [Katharine Briggs, A Dictionary of Fairies]
  126. Xk    a kobold;
  127. X        The race of kobolds are reputed to be an artificial creation
  128. X        of a master wizard (demi-god?).  They are about 3' tall with
  129. X        a vaguely dog-like face.  They bear a violent dislike of the
  130. X        Elven race, and  will go out  of their way to  cause trouble
  131. X        for Elves at any time.
  132. Xl    a lich;
  133. X        Once in a great  while, an evil master wizard or priest will
  134. X        manage through use of great magics to extend his or her life
  135. X        far beyond the normal  span of a human.  The usual effect of
  136. X        this is to transform the human, over time, into an undead of
  137. X        great magical power.  A Lich  hates life in any form; even a
  138. X        touch from one of these  creatures will cause a numbing cold
  139. X        in the victim.  They all posess the capability to use magic.
  140. Xm    a mimic
  141. Xn    a naga;
  142. X        The naga is a mystical creature with the body of a snake and
  143. X        the head of a man or woman.  They will fiercely  protect the
  144. X        territory they consider their own.  Some nagas can be forced
  145. X        to serve as a guardian by a spell caster of great power.
  146. Xo    an orc
  147. Xp    a piercer;
  148. X        Ye Piercer doth look like unto  a  stalactyte,  and  hangeth
  149. X        from  the  roofs of caves and caverns.  Unto the height of a
  150. X        man, and thicker than a man's thigh do  they  grow,  and  in
  151. X        groups  do they hang.  If a creature doth pass beneath them,
  152. X        they will by its heat and noise perceive it, and  fall  upon
  153. X        it  to kill and devour it, though in any other way they move
  154. X        but exceeding slow.
  155. X                           [ the Bestiary of Xygag ]
  156. Xq    a quadruped;
  157. X        The woodlands and other regions  are inhabited by multitudes
  158. X        of four-legged creatures  which cannot be simply classified.
  159. X        They might not have fiery breath  or deadly stings,  but ad-
  160. X        venturers  have  nevertheless  met their end  numerous times
  161. X        due to the claws, hooves, or bites of such animals.
  162. X    
  163. X        ...the leucrocotta, a wild beast of extraordinary swiftness,
  164. X        the size of the wild ass, with the legs of a Stag, the neck,
  165. X        tail, and breast of a lion,  the head of a badger,  a cloven
  166. X        hoof, the mouth slit up as far as the ears,  and one contin-
  167. X        uous bone  instead of  teeth;  it is said,  too,  that  this
  168. X        animal can imitate the human voice.
  169. X                 [Curious Creatures in Zoology, John Ashton]
  170. Xr    a rodent
  171. Xs    a spider
  172. Xt    a trapper or lurker above
  173. Xu    a unicorn;
  174. X        Men have always sought the elusive unicorn, for  the  single
  175. X        twisted  horn  which projected from its forehead was thought
  176. X        to be a powerful talisman.  It was said that the unicorn had
  177. X        simply  to  dip  the tip of its horn in a muddy pool for the
  178. X        water to become pure.  Men also believed that to  drink from
  179. X        this horn was a protection against all sickness, and that if
  180. X        the horn was ground to a powder it would act as an  antidote
  181. X        to all poisons.  Less than 200 years ago in France, the horn
  182. X        of a unicorn was used in a ceremony to test the  royal  food
  183. X        for poison.
  184. X        Although only the size of a small horse, the  unicorn  is  a
  185. X        very  fierce  beast,  capable  of killing an elephant with a
  186. X        single thrust from its horn.  Its  fleetness  of  foot  also
  187. X        makes  this solitary creature difficult to capture. However,
  188. X        it can be tamed and captured by a maiden. Made gentle by the
  189. X        sight  of a virgin, the unicorn can be lured to lay its head
  190. X        in her lap, and in this docile mood, the maiden  may  secure
  191. X        it with a golden rope.
  192. X        [Mythical Beasts by Deirdre Headon (The Leprechaun Library)]
  193. Xv    a vortex
  194. Xw    a worm;
  195. X        [The crysknife] is manufactured in two forms from teeth tak-
  196. X        en  from dead sandworms.  The two forms are "fixed" and "un-
  197. X        fixed." An unfixed  knife  requires  proximity  to  a  human
  198. X        body's  electrical  field  to prevent disintegration.  Fixed
  199. X        knives are treated for storage.  All are about  20  centime-
  200. X        ters long.
  201. X                        [ Dune, by Frank Herbert ]
  202. Xx    a xan;
  203. X        They sent their friend the mosquito [xan] ahead of  them  to
  204. X        find  out  what lay ahead.  "Since you are the one who sucks
  205. X        the blood of men walking along paths," they told the mosqui-
  206. X        to,  "go  and  sting the men of Xibalba."  The mosquito flew
  207. X        down the dark road to the Underworld.  Entering the house of
  208. X        the Lords of Death, he stung the first person that he saw...
  209. X    
  210. X        The mosquito stung this man as well, and when he yelled, the
  211. X        man  next  to him asked, "Gathered Blood, what's wrong?"  So
  212. X        he flew along the row stinging all the seated men  until  he
  213. X        knew the names of all twelve.
  214. X                [ Popul Vuh, as translated by Ralph Nelson ]
  215. Xy    a yellow light
  216. Xz    a zruty;
  217. X        The zruty are  wild and gigantic beings,  living in the wil-
  218. X        dernesses of the Tatra mountains.
  219. XA    a giant ape
  220. XB    a giant bat
  221. XC    a centaur;
  222. X        Of all the monsters put together by  the  Greek  imagination
  223. X        the  Centaurs (Kentauroi) constituted a class in themselves.
  224. X        Despite a strong streak  of  sensuality  in  their  make-up,
  225. X        their  normal  behaviour  was  moral, and they took a kindly
  226. X        thought of man's welfare. The attempted outrage of Nessos on
  227. X        Deianeira,  and  that  of the whole tribe of Centaurs on the
  228. X        Lapith women,  are more than offset  by the  hospitality  of
  229. X        Pholos and  by  the  wisdom of Cheiron,  physician, prophet,
  230. X        lyrist,  and the instructor of Achilles.  Further,  the Cen-
  231. X        taurs  were  peculiar in that their nature, which united the
  232. X        body of a horse with the trunk and head of a  man,  involved
  233. X        an  unthinkable  duplication  of  vital organs and important
  234. X        members.  So grotesque a combination seems almost  un-Greek.
  235. X        These  strange creatures  were said to live in the caves and
  236. X        clefts of the mountains, myths associating  them  especially
  237. X        with the hills of Thessaly and the range of Erymanthos.
  238. X                   [Mythology of all races, Vol. 1, pp. 270-271]
  239. XD    a dragon;
  240. X        In the West  the dragon was  the  natural  enemy   of   man.
  241. X        Although  preferring  to live in bleak and desolate regions,
  242. X        whenever it was seen among men it left in its wake a   trail
  243. X        of   destruction   and disease. Yet any attempt to slay this
  244. X        beast was a perilous undertaking. For the dragon's assailant
  245. X        had  to  contend not  only  with clouds of  sulphurous fumes
  246. X        pouring from its fire-breathing nostrils, but also with  the
  247. X        thrashings  of  its  tail,  the  most   deadly  part  of its
  248. X        serpent-like body.
  249. X             [Mythical Beasts by Deirdre Headon (The Leprechaun Library)]
  250. XE    an elemental;
  251. X        Elementals are manifestations of the  basic  nature  of  the
  252. X        universe.   There  are four known forms of elementals:  air,
  253. X        fire, water, and earth.  Some mystics  have  postulated  the
  254. X        necessity  for  a fifth type, the spirit elemental, but none
  255. X        have ever been encountered, at least on this  plane  of  ex-
  256. X        istence.
  257. XF    a fungus or mold
  258. XG    a gnome;
  259. X        ...  And then a gnome came by,  carrying a bundle,   an  old
  260. X        fellow three times  as large as an imp  and wearing  clothes
  261. X        of a sort, especially a hat.  And he was  clearly   just  as
  262. X        frightened   as  the  imps  though  he could not go so fast.
  263. X        Ramon Alonzo saw that there must be some great trouble  that
  264. X        was  vexing  magical  things;   and,  since gnomes speak the
  265. X        language of men, and will answer if spoken  to  gently,   he
  266. X        raised  his  hat,   and  asked  of the gnome  his name.  The
  267. X        gnome did not  stop  his  hasty  shuffle  a  moment   as  he
  268. X        answered 'Alaraba' and grabbed the rim of his hat but forgot
  269. X        to doff it.
  270. X        'What is the trouble, Alaraba?' said Ramon Alonzo.
  271. X        'White magic. Run!' said the gnome ...
  272. X                       [The Charwoman's Shadow, by Lord Dunsany.]
  273. XH    a giant humanoid;
  274. X        Giants have always walked the earth, though they are rare in
  275. X        these times.  They range in size from  little over nine feet
  276. X        to a towering twenty feet or more.  The larger ones use huge
  277. X        boulders as weapons, hurling them over large distances.  All
  278. X        types of giants share a love for men  -  roasted, boiled, or
  279. X        fried.  Their table manners are legendary.
  280. XI    an invisible stalker
  281. XJ    a jelly
  282. XK    a Keystone Kop
  283. XL    a leprechaun;
  284. X        The Irish Leprechaun is the Faeries' shoemaker and is  known
  285. X        under  various names  in different parts of Ireland:  Cluri-
  286. X        caune in Cork, Lurican in Kerry, Lurikeen in Kildare and Lu-
  287. X        rigadaun  in  Tipperary.  Although he works for the Faeries,
  288. X        the Leprechaun is not of the same species.  He is small, has
  289. X        dark  skin  and wears strange clothes.  His nature has some-
  290. X        thing of the manic-depressive about it:  first he  is  quite
  291. X        happy, whistling merrily as he nails a sole on to a shoe;  a
  292. X        few minutes later, he is sullen and  morose,  drunk  on  his
  293. X        home-made heather ale.  The Leprechaun's two great loves are
  294. X        tobacco and whiskey, and he is a first-rate con-man,  impos-
  295. X        sible  to  out-fox.  No  one, no matter how clever, has ever
  296. X        managed to cheat him out of his hidden pot of  gold  or  his
  297. X        magic shilling.  At the last minute he always thinks of some
  298. X        way to divert his captor's attention  and  vanishes  in  the
  299. X        twinkling  of  an eye.
  300. X                     [A Field Guide to the Little People
  301. X                    by Nancy Arrowsmith & George Moorse]
  302. XM    a mummy
  303. XN    a nymph
  304. XO    an ogre
  305. XP    a pudding or ooze;
  306. X        These giant amoeboid creatures look like nothing  more  than
  307. X        puddles  of  slime,  but they both live and move, feeding on
  308. X        metal or wood as well as the occasional dungeon explorer  to
  309. X        supplement their diet.
  310. XQ    a quantum mechanic;
  311. X        These creatures are not native to this universe;  they  seem
  312. X        to have strangely derived powers, and unknown motives.
  313. XR    a rust monster;
  314. X        These strange creatures live on a   diet  of  metals.   They
  315. X        will  turn  a  suit  of  armour into so much useless  rusted
  316. X        scrap in no time at all.
  317. XS    a snake
  318. XT    a troll
  319. XU    an umber hulk
  320. XV    a vampire
  321. XW    a wraith
  322. XX    a xorn
  323. XY    a yeti
  324. XZ    a zombie
  325. X&    a demon
  326. X:    a chameleon
  327. X;    a giant eel
  328. END_OF_FILE
  329. if test 13532 -ne `wc -c <'auxil/data.base'`; then
  330.     echo shar: \"'auxil/data.base'\" unpacked with wrong size!
  331. fi
  332. # end of 'auxil/data.base'
  333. fi
  334. if test -f 'src/trap.c' -a "${1}" != "-c" ; then 
  335.   echo shar: Will not clobber existing file \"'src/trap.c'\"
  336. else
  337. echo shar: Extracting \"'src/trap.c'\" \(38220 characters\)
  338. sed "s/^X//" >'src/trap.c' <<'END_OF_FILE'
  339. X/*    SCCS Id: @(#)trap.c    3.0    88/10/22
  340. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  341. X/* NetHack may be freely redistributed.  See license for details. */
  342. X
  343. X#include    "hack.h"
  344. X#include    "edog.h"
  345. X#include    "trapname.h"
  346. X
  347. Xvoid domagictrap();
  348. Xstatic boolean thitm();
  349. X
  350. X/* Generic rust-armor function.  Returns TRUE if a message was printed;
  351. X * "print", if set, means to print a message (and thus to return TRUE) even
  352. X * if the item could not be rusted; otherwise a message is printed and TRUE is
  353. X * returned only for rustable items.
  354. X */
  355. Xboolean
  356. Xrust_dmg(otmp, ostr, type, print)
  357. Xregister struct obj *otmp;
  358. Xregister char *ostr;
  359. Xint type;
  360. Xboolean print;
  361. X{
  362. X    static const char *gook[] = { "slag", "rust", "rot", "corrosion" };
  363. X    static const char *action[] = { "smolder", "rust", "rot", "corrode" };
  364. X    boolean vulnerable = FALSE;
  365. X    boolean plural;
  366. X
  367. X    if (!otmp) return(FALSE);
  368. X    switch(type) {
  369. X        case 0:
  370. X        case 2: vulnerable = is_flammable(otmp); break;
  371. X        case 1: vulnerable = is_rustprone(otmp); break;
  372. X        case 3: vulnerable = (otmp->otyp == BRONZE_PLATE_MAIL); break;
  373. X    }
  374. X
  375. X    if (!print && (!vulnerable || otmp->rustfree || otmp->spe < -2))
  376. X        return FALSE;
  377. X
  378. X    plural = is_gloves(otmp) || is_boots(otmp);
  379. X
  380. X    if (!vulnerable)
  381. X        Your("%s %s not affected!", ostr, plural ? "are" : "is");
  382. X    else if (otmp->spe >= -2) {
  383. X        if (otmp->rustfree)
  384. X            pline("The %s on your %s vanishes instantly!",
  385. X                        gook[type], ostr);
  386. X        else if (otmp->blessed && !rnl(4))
  387. X            pline("Somehow, your %s %s not affected!", ostr,
  388. X                    plural ? "are" : "is");
  389. X        else {
  390. X            Your("%s %s%s!", ostr, action[type],
  391. X                plural ? "" : "s");
  392. X            otmp->spe--;
  393. X            adj_abon(otmp, -1);
  394. X        }
  395. X    } else Your("%s look%s quite rusted.", ostr, plural ? "" : "s");
  396. X    return(TRUE);
  397. X}
  398. X
  399. Xstruct trap *
  400. Xmaketrap(x,y,typ)
  401. Xregister int x, y, typ;
  402. X{
  403. X    register struct trap *ttmp;
  404. X    register struct permonst *ptr;
  405. X
  406. X    ttmp = newtrap();
  407. X    ttmp->ttyp = typ;
  408. X    ttmp->tx = x;
  409. X    ttmp->ty = y;
  410. X    switch(typ) {
  411. X        case MONST_TRAP:        /* create a monster in "hiding" */
  412. X        if(rn2(5) && (ptr = mkclass(S_PIERCER)))
  413. X            ttmp->pm = monsndx(ptr);
  414. X        else
  415. X            ttmp->pm = rndmonnum();
  416. X        break;
  417. X        case STATUE_TRAP:        /* create a "living" statue */
  418. X        ttmp->pm = rndmonnum();
  419. X        (void) mkstatue(&mons[ttmp->pm], x, y);
  420. X        break;
  421. X        default:
  422. X        ttmp->pm = -1;
  423. X        break;
  424. X    }
  425. X    ttmp->tseen = 0;
  426. X    ttmp->once = 0;
  427. X    ttmp->ntrap = ftrap;
  428. X    ftrap = ttmp;
  429. X    return(ttmp);
  430. X}
  431. X
  432. Xint
  433. Xteleok(x, y)
  434. Xregister int x, y;
  435. X{                /* might throw him into a POOL
  436. X                 * removed by GAN 10/20/86
  437. X                 */
  438. X#ifdef STUPID
  439. X    boolean    tmp1, tmp2, tmp3;
  440. X#  ifdef POLYSELF
  441. X    tmp1 = isok(x,y) && (!IS_ROCK(levl[x][y].typ) ||
  442. X        passes_walls(uasmon)) && !levl[x][y].mmask;
  443. X#  else
  444. X    tmp1 = isok(x,y) && !IS_ROCK(levl[x][y].typ) && !levl[x][y].mmask;
  445. X#  endif
  446. X    tmp2 = !sobj_at(BOULDER,x,y) && !t_at(x,y);
  447. X    tmp3 = !(is_pool(x,y) &&
  448. X           !(Levitation || Wwalking
  449. X#ifdef POLYSELF
  450. X         || is_flyer(uasmon)
  451. X#endif
  452. X        )) &&
  453. X           !(IS_DOOR(levl[x][y].typ) &&
  454. X             (levl[x][y].doormask & (D_LOCKED | D_CLOSED)));
  455. X    return(tmp1 && tmp2 && tmp3);
  456. X#else
  457. X    return( isok(x,y) &&
  458. X#  ifdef POLYSELF
  459. X        (!IS_ROCK(levl[x][y].typ) || passes_walls(uasmon)) &&
  460. X#  else
  461. X        !IS_ROCK(levl[x][y].typ) &&
  462. X#  endif
  463. X        !levl[x][y].mmask &&
  464. X        !sobj_at(BOULDER,x,y) && !t_at(x,y) &&
  465. X        !(is_pool(x,y) &&
  466. X        !(Levitation || Wwalking
  467. X#ifdef POLYSELF
  468. X          || is_flyer(uasmon)
  469. X#endif
  470. X          )) &&
  471. X        !(IS_DOOR(levl[x][y].typ) &&
  472. X             (levl[x][y].doormask & (D_LOCKED | D_CLOSED)))
  473. X    );
  474. X#endif
  475. X    /* Note: gold is permitted (because of vaults) */
  476. X}
  477. X
  478. Xstatic void
  479. Xvtele() {
  480. X    register struct mkroom *croom;
  481. X
  482. X    for(croom = &rooms[0]; croom->hx >= 0; croom++)
  483. X        if(croom->rtype == VAULT) {
  484. X        register int x, y;
  485. X
  486. X        x = rn2(2) ? croom->lx : croom->hx;
  487. X        y = rn2(2) ? croom->ly : croom->hy;
  488. X        if(teleok(x,y)) {
  489. X            teleds(x,y);
  490. X            return;
  491. X        }
  492. X        }
  493. X    tele();
  494. X}
  495. X
  496. Xvoid
  497. Xdotrap(trap)
  498. Xregister struct trap *trap;
  499. X{
  500. X    register int ttype = trap->ttyp;
  501. X    register struct monst *mtmp;
  502. X    register struct obj *otmp;
  503. X
  504. X    nomul(0);
  505. X    if(trap->tseen && !Fumbling && !(ttype == PIT
  506. X       || ttype == SPIKED_PIT
  507. X#ifdef SPELLS
  508. X       || ttype == ANTI_MAGIC
  509. X#endif
  510. X        ) && !rn2(5))
  511. X        You("escape a%s.", traps[ttype]);
  512. X    else {
  513. X        trap->tseen = 1;
  514. X        if(Invisible && ttype != MONST_TRAP)
  515. X        newsym(trap->tx,trap->ty);
  516. X        switch(ttype) {
  517. X        case SLP_GAS_TRAP:
  518. X            if(Sleep_resistance) {
  519. X            You("are enveloped in a cloud of gas!");
  520. X            break;
  521. X            }
  522. X            pline("A cloud of gas puts you to sleep!");
  523. X            flags.soundok = 0;
  524. X            nomul(-rnd(25));
  525. X            afternmv = Hear_again;
  526. X            break;
  527. X        case BEAR_TRAP:
  528. X            if(Levitation
  529. X#ifdef POLYSELF
  530. X            || is_flyer(uasmon)
  531. X#endif
  532. X            ) {
  533. X            You("%s over a bear trap.",
  534. X                  Levitation ? "float" : "fly");
  535. X            break;
  536. X            }
  537. X            u.utrap = 4 + rn2(4);
  538. X            u.utraptype = TT_BEARTRAP;
  539. X            pline("A bear trap closes on your %s!",
  540. X            body_part(FOOT));
  541. X#ifdef POLYSELF
  542. X            if(u.umonnum == PM_OWLBEAR)
  543. X            You("howl in anger!");
  544. X#endif
  545. X            break;
  546. X        case STATUE_TRAP:
  547. X            for(otmp=fobj; otmp; otmp=otmp->nobj) {
  548. X            if(otmp->otyp == STATUE && otmp->ox == u.ux &&
  549. X                otmp->oy == u.uy && otmp->corpsenm == trap->pm)
  550. X                if(mtmp=makemon(&mons[trap->pm],u.ux,u.uy)) {
  551. X                pline("The statue comes to life!");
  552. X                delobj(otmp);
  553. X                break;
  554. X                }
  555. X            }
  556. X            deltrap(trap);
  557. X            break;
  558. X        case MONST_TRAP:
  559. X            if(mtmp=makemon(&mons[trap->pm],u.ux,u.uy)) {
  560. X              switch(mtmp->data->mlet) {
  561. X            case S_PIERCER:
  562. X                pline("%s suddenly drops from the ceiling!",
  563. X                  Xmonnam(mtmp));
  564. X                if(uarmh)
  565. X                pline("Its blow glances off your helmet.");
  566. X                else
  567. X                (void) thitu(3,d(4,6),"falling piercer");
  568. X                break;
  569. X            default:    /* monster surprises you. */
  570. X                pline("%s attacks you by surprise!",
  571. X                  Xmonnam(mtmp));
  572. X                break;
  573. X              }
  574. X            }
  575. X            deltrap(trap);
  576. X            break;
  577. X        case ARROW_TRAP:
  578. X            pline("An arrow shoots out at you!");
  579. X            if(!thitu(8,rnd(6),"arrow")){
  580. X            (void) mksobj_at(ARROW, u.ux, u.uy);
  581. X            fobj->quan = 1;
  582. X            fobj->owt = weight(fobj);
  583. X            }
  584. X            break;
  585. X        case TRAPDOOR:
  586. X            if(is_maze_lev
  587. X#ifdef STRONGHOLD
  588. X              && (dlevel > stronghold_level)
  589. X#endif /* STRONGHOLD /**/
  590. X              ) {
  591. X    pline("A trap door in the ceiling opens and a rock falls on your %s!",
  592. X                body_part(HEAD));
  593. X            if(uarmh)
  594. X                pline("Fortunately, you are wearing a helmet!");
  595. X            losehp(uarmh ? 2 : d(2,10),"falling rock");
  596. X            (void) mksobj_at(ROCK, u.ux, u.uy);
  597. X            fobj->quan = 1;
  598. X            fobj->owt = weight(fobj);
  599. X            stackobj(fobj);
  600. X            if(Invisible) newsym(u.ux, u.uy);
  601. X            } else {
  602. X            register int newlevel = dlevel + 1;
  603. X            while(!rn2(4) && newlevel < 29) newlevel++;
  604. X            pline("A trap door opens up under you!");
  605. X            if(Levitation || u.ustuck || dlevel == MAXLEVEL
  606. X#ifdef POLYSELF
  607. X                    || is_flyer(uasmon)
  608. X#endif
  609. X#ifdef ENDGAME
  610. X                    || dlevel == ENDLEVEL
  611. X#endif
  612. X                            ) {
  613. X                You("don't fall in.");
  614. X                break;
  615. X            }
  616. X#ifdef WALKIES
  617. X            if(!next_to_u())
  618. X                You("are jerked back by your pet!");
  619. X            else {
  620. X#endif
  621. X                unsee();
  622. X                (void) fflush(stdout);
  623. X                goto_level(newlevel, FALSE);
  624. X#ifdef WALKIES
  625. X            }
  626. X#endif
  627. X            }
  628. X            break;
  629. X        case DART_TRAP:
  630. X            pline("A little dart shoots out at you!");
  631. X            if(thitu(7,rnd(3),"little dart")) {
  632. X            if(!rn2(6)) poisoned("dart",A_CON,"poison dart");
  633. X            } else {
  634. X            (void) mksobj_at(DART, u.ux, u.uy);
  635. X            fobj->quan = 1;
  636. X            fobj->opoisoned = 1;
  637. X            fobj->owt = weight(fobj);
  638. X            }
  639. X            break;
  640. X        case TELEP_TRAP:
  641. X            if(trap->once) {
  642. X            deltrap(trap);
  643. X#ifdef ENDGAME
  644. X            if(dlevel == ENDLEVEL) {
  645. X                You("feel a wrenching sensation.");
  646. X                break;
  647. X            }
  648. X#endif
  649. X            if(Antimagic) {
  650. X                shieldeff(u.ux, u.uy);
  651. X                You("feel a wrenching sensation.");
  652. X            } else {
  653. X                newsym(u.ux, u.uy);
  654. X                vtele();
  655. X            }
  656. X            } else {
  657. X#ifdef ENDGAME
  658. X            if(dlevel == ENDLEVEL) {
  659. X                pline("A shiver runs down your spine...");
  660. X                break;
  661. X            }
  662. X#endif
  663. X            if(Antimagic) {
  664. X                shieldeff(u.ux, u.uy);
  665. X                You("feel a wrenching sensation.");
  666. X            } else {
  667. X                newsym(u.ux, u.uy);
  668. X                tele();
  669. X            }
  670. X            }
  671. X            break;
  672. X        case RUST_TRAP:
  673. X#ifdef POLYSELF
  674. X#ifdef GOLEMS
  675. X            if (u.umonnum == PM_IRON_GOLEM) {
  676. X            pline("A gush of water hits you!");
  677. X            You("are covered with rust!");
  678. X            rehumanize();
  679. X            break;
  680. X            }
  681. X#endif /* GOLEMS */
  682. X#endif
  683. X        /* Unlike monsters, traps cannot aim their rust attacks at
  684. X         * you, so instead of looping through and taking either the
  685. X         * first rustable one or the body, we take whatever we get,
  686. X         * even if it is not rustable.
  687. X         */
  688. X            switch (rn2(5)) {
  689. X            case 0:
  690. X                pline("A gush of water hits you on the %s!",
  691. X                    body_part(HEAD));
  692. X                (void) rust_dmg(uarmh, "helmet", 1, TRUE);
  693. X                break;
  694. X            case 1:
  695. X                pline("A gush of water hits your left %s!",
  696. X                    body_part(ARM));
  697. X                if (rust_dmg(uarms, "shield", 1, TRUE)) break;
  698. X                if (uwep && bimanual(uwep))
  699. X                goto two_hand;
  700. X                /* Two goto statements in a row--aaarrrgggh! */
  701. Xglovecheck:            (void) rust_dmg(uarmg, "gauntlets", 1, TRUE);
  702. X                /* Not "metal gauntlets" since it gets called
  703. X                 * even if it's leather for the message
  704. X                 */
  705. X                break;
  706. X            case 2:
  707. X                pline("A gush of water hits your right %s!",
  708. X                    body_part(ARM));
  709. Xtwo_hand:            corrode_weapon();
  710. X                goto glovecheck;
  711. X            default:
  712. X                pline("A gush of water hits you!");
  713. X                if (uarmc) (void) rust_dmg(uarmc, "cloak", 1, TRUE);
  714. X                else if (uarm)
  715. X                (void) rust_dmg(uarm, "armor", 1, TRUE);
  716. X#ifdef SHIRT
  717. X                else if (uarmu)
  718. X                (void) rust_dmg(uarmu, "shirt", 1, TRUE);
  719. X#endif
  720. X            }
  721. X            break;
  722. X        case PIT:
  723. X            if (Levitation
  724. X#ifdef POLYSELF
  725. X            || is_flyer(uasmon) || u.umonnum == PM_WUMPUS
  726. X#endif
  727. X            ) {
  728. X            pline("A pit opens up under you!");
  729. X            You("don't fall in!");
  730. X            break;
  731. X            }
  732. X            You("fall into a pit!");
  733. X#ifdef POLYSELF
  734. X            if (!passes_walls(uasmon))
  735. X#endif
  736. X            u.utrap = rn1(6,2);
  737. X            u.utraptype = TT_PIT;
  738. X            losehp(rnd(6),"fall into a pit");
  739. X            selftouch("Falling, you");
  740. X            break;
  741. X        case SPIKED_PIT:
  742. X            if (Levitation
  743. X#ifdef POLYSELF
  744. X            || is_flyer(uasmon) || u.umonnum == PM_WUMPUS
  745. X#endif
  746. X            ) {
  747. X            pline("A pit full of spikes opens up under you!");
  748. X            You("don't fall in!");
  749. X            break;
  750. X            }
  751. X            You("fall into a pit!");
  752. X            You("land on a set of sharp iron spikes!");
  753. X#ifdef POLYSELF
  754. X            if (!passes_walls(uasmon))
  755. X#endif
  756. X            u.utrap = rn1(6,2);
  757. X            u.utraptype = TT_PIT;
  758. X            losehp(rnd(10),"fall onto iron spikes");
  759. X            if(!rn2(6)) poisoned("spikes",A_STR,"poison spikes");
  760. X            selftouch("Falling, you");
  761. X            break;
  762. X        case LEVEL_TELEP:
  763. X            pline("You have %s onto a level teleport trap!",
  764. X#ifdef POLYSELF
  765. X            is_flyer(uasmon) ? "flown" :
  766. X            (Levitation || nolimbs(uasmon)) ? "moved" : "stepped");
  767. X#else
  768. X            Levitation ? "moved" : "stepped");
  769. X#endif
  770. X            if(Antimagic)
  771. X            shieldeff(u.ux, u.uy);
  772. X            if(Antimagic
  773. X#ifdef ENDGAME
  774. X                || dlevel == ENDLEVEL
  775. X#endif
  776. X                            ) {
  777. X            You("feel a wrenching sensation.");
  778. X            break;
  779. X            }
  780. X            if(!Blind)
  781. X              You("are momentarily blinded by a flash of light.");
  782. X            else
  783. X            You("are momentarily disoriented.");
  784. X            deltrap(trap);
  785. X            newsym(u.ux,u.uy);
  786. X            level_tele();
  787. X            break;
  788. X#ifdef SPELLS
  789. X        case ANTI_MAGIC:
  790. X            if(Antimagic) {
  791. X            shieldeff(u.ux, u.uy);
  792. X            You("feel momentarily lethargic.");
  793. X            } else drain_en(rnd((int)u.ulevel) + 1);
  794. X            break;
  795. X#endif
  796. X#ifdef POLYSELF
  797. X        case POLY_TRAP:
  798. X            if(Antimagic) {
  799. X            shieldeff(u.ux, u.uy);
  800. X            You("feel momentarily different.");
  801. X            /* Trap did nothing; don't remove it --KAA */
  802. X            } else {
  803. X            You("feel a change coming over you.");
  804. X            polyself();
  805. X            deltrap(trap);
  806. X            }
  807. X            break;
  808. X#endif
  809. X        case MGTRP:        /* A magic trap. */
  810. X            if (!rn2(30)) {
  811. X            You("are caught in a magical explosion!");
  812. X            losehp(rnd(10), "magical explosion");
  813. X#ifdef SPELLS
  814. X            Your("body absorbs some of the magical energy!");
  815. X            u.uen = (u.uenmax += 2);
  816. X#endif
  817. X            deltrap(trap);
  818. X            if(Invisible) newsym(u.ux,u.uy);
  819. X            } else domagictrap();
  820. X            break;
  821. X        case SQBRD:        /* Stepped on a squeaky board. */
  822. X            if (Levitation
  823. X#ifdef POLYSELF
  824. X            || is_flyer(uasmon)
  825. X#endif
  826. X            ) {
  827. X            if (Hallucination) You("notice a crease in the linoleum.");
  828. X            else You("notice a loose board below you.");
  829. X            } else {
  830. X            pline("A board underfoot gives off a loud squeak!");
  831. X            wake_nearby();
  832. X            }
  833. X            break;
  834. X        case WEB: /* Our luckless player has stumbled into a web. */
  835. X
  836. X            pline("You've %s into a spider web!",
  837. X              Levitation ? "floated" :
  838. X#ifdef POLYSELF
  839. X              is_flyer(uasmon) ? "flown" :
  840. X#endif
  841. X              "stumbled");
  842. X            u.utraptype = TT_WEB;
  843. X
  844. X            /* Time stuck in the web depends on your strength. */
  845. X
  846. X            if (ACURR(A_STR) == 3) u.utrap = rn1(6,6);
  847. X            else if (ACURR(A_STR) < 6) u.utrap = rn1(6,4);
  848. X            else if (ACURR(A_STR) < 9) u.utrap = rn1(4,4);
  849. X            else if (ACURR(A_STR) < 12) u.utrap = rn1(4,2);
  850. X            else if (ACURR(A_STR) < 15) u.utrap = rn1(2,2);
  851. X            else if (ACURR(A_STR) < 18) u.utrap = rnd(2);
  852. X            else if (ACURR(A_STR) < 69) u.utrap = 1;
  853. X            else {
  854. X            u.utrap = 0;
  855. X            You("tear through the web!");
  856. X            deltrap(trap);
  857. X               if(Invisible) newsym(u.ux,u.uy);
  858. X            }
  859. X            break;
  860. X
  861. X        case LANDMINE: {
  862. X#        ifndef LINT
  863. X            register struct monst *mtmp = fmon;
  864. X#        endif /* LINT */
  865. X
  866. X            if (Levitation
  867. X#ifdef POLYSELF
  868. X                        || is_flyer(uasmon)
  869. X#endif
  870. X                                ) {
  871. X            You("see a trigger in a pile of soil below you!");
  872. X            if (rn2(3)) break;
  873. X            pline("KAABLAMM!!!  The air currents set it off!");
  874. X            } else {
  875. X#ifdef POLYSELF
  876. X            pline("KAABLAMM!!!  You %s a land mine!",
  877. X                nolimbs(uasmon) ? "encountered" : "stepped on");
  878. X#else
  879. X            pline("KAABLAMM!!!  You stepped on a land mine!");
  880. X#endif
  881. X            set_wounded_legs(LEFT_SIDE, 40 + rnd(35));
  882. X            set_wounded_legs(RIGHT_SIDE, 40 + rnd(35));
  883. X            }
  884. X            losehp(rnd(16), "land mine");
  885. X            /* wake everything on the level */
  886. X            while(mtmp) {
  887. X            if(mtmp->msleep) mtmp->msleep = 0;
  888. X            mtmp = mtmp->nmon;
  889. X            }
  890. X            deltrap(t_at(u.ux, u.uy)); /* mines only explode once */
  891. X            if(Invisible) newsym(u.ux,u.uy);
  892. X            }
  893. X            break;
  894. X        default:
  895. X            impossible("You hit a trap of type %u", trap->ttyp);
  896. X        }
  897. X    }
  898. X}
  899. X
  900. X#ifdef WALKIES
  901. Xstatic boolean
  902. Xteleport_pet(mtmp)
  903. Xregister struct monst *mtmp;
  904. X{
  905. X    register struct obj *otmp;
  906. X
  907. X    if(mtmp->mleashed) {
  908. X        otmp = get_mleash(mtmp);
  909. X        if(!otmp)
  910. X        impossible("%s is leashed, without a leash.", Monnam(mtmp));
  911. X        if(otmp->cursed) {
  912. X# ifdef SOUNDS
  913. X        yelp(mtmp);
  914. X# endif
  915. X        return FALSE;
  916. X        } else {
  917. X        Your("leash goes slack.");
  918. X        m_unleash(mtmp);
  919. X        return TRUE;
  920. X        }
  921. X    }
  922. X    return TRUE;
  923. X}
  924. X#endif
  925. X
  926. Xint
  927. Xmintrap(mtmp)
  928. Xregister struct monst *mtmp;
  929. X{
  930. X    register struct trap *trap = t_at(mtmp->mx, mtmp->my);
  931. X    register int newlev, wasintrap = mtmp->mtrapped;
  932. X    register boolean trapkilled = FALSE, tdoor = FALSE;
  933. X    struct obj *otmp;
  934. X
  935. X    if(!trap) {
  936. X        mtmp->mtrapped = 0;    /* perhaps teleported? */
  937. X    } else if(wasintrap) {
  938. X        if(!rn2(40)) mtmp->mtrapped = 0;
  939. X    } else {
  940. X        register int tt = trap->ttyp;
  941. X
  942. X    /* A bug fix for dumb messages by ab@unido.
  943. X     */
  944. X        int in_sight = cansee(mtmp->mx,mtmp->my)
  945. X               && (!mtmp->minvis || See_invisible);
  946. X
  947. X        if(mtmp->mtrapseen & (1 << tt)) {
  948. X        /* he has been in such a trap - perhaps he escapes */
  949. X        if(rn2(4)) return(0);
  950. X        }
  951. X        mtmp->mtrapseen |= (1 << tt);
  952. X        switch (tt) {
  953. X        case BEAR_TRAP:
  954. X            if(bigmonst(mtmp->data)) {
  955. X                if(in_sight)
  956. X                  pline("%s is caught in a bear trap!",
  957. X                    Monnam(mtmp));
  958. X                else
  959. X                    if(mtmp->data == &mons[PM_OWLBEAR]
  960. X                    && flags.soundok)
  961. X                You("hear the roaring of an angry bear!");
  962. X                mtmp->mtrapped = 1;
  963. X            }
  964. X            break;
  965. X#ifdef POLYSELF
  966. X        case POLY_TRAP:
  967. X            if(!resist(mtmp, WAND_SYM, 0, NOTELL))
  968. X            (void) newcham(mtmp, (struct permonst *)0);
  969. X            break;
  970. X#endif
  971. X        case RUST_TRAP:
  972. X            if(in_sight)
  973. X                pline("A gush of water hits %s!", mon_nam(mtmp));
  974. X#ifdef GOLEMS
  975. X            if (mtmp->data == &mons[PM_IRON_GOLEM]) {
  976. X                if (in_sight) pline("%s falls to pieces!",
  977. X                                Monnam(mtmp));
  978. X                else if(mtmp->mtame)
  979. X                     pline("May %s rust in peace.",
  980. X                                mon_nam(mtmp));
  981. X                mondied(mtmp);
  982. X                trapkilled = TRUE;
  983. X            }
  984. X#endif /* GOLEMS */
  985. X            break;
  986. X        case PIT:
  987. X        case SPIKED_PIT:
  988. X            /* there should be a mtmp/data -> floating */
  989. X            if(!is_flyer(mtmp->data) /* ab */
  990. X               && mtmp->data != &mons[PM_WUMPUS] /* 3. */) {
  991. X                if (!passes_walls(mtmp->data))
  992. X                  mtmp->mtrapped = 1;
  993. X                if(in_sight)
  994. X                  pline("%s falls into a pit!", Monnam(mtmp));
  995. X                if(thitm(0, mtmp, (struct obj *)0,
  996. X                  rnd((tt==PIT) ? 6 : 10)))
  997. X                  trapkilled = TRUE;
  998. X            }
  999. X            break;
  1000. X        case SLP_GAS_TRAP:
  1001. X            if(!resists_sleep(mtmp->data) &&
  1002. X               !mtmp->msleep && !mtmp->mfroz) {
  1003. X                mtmp->msleep = 1;
  1004. X                if(in_sight)
  1005. X                  pline("%s suddenly falls asleep!",
  1006. X                    Monnam(mtmp));
  1007. X            }
  1008. X            break;
  1009. X        case TELEP_TRAP:
  1010. X#ifdef WALKIES
  1011. X            if(teleport_pet(mtmp)) {
  1012. X#endif
  1013. X                rloc(mtmp);
  1014. X                if(in_sight && !cansee(mtmp->mx,mtmp->my))
  1015. X                pline("%s suddenly disappears!",
  1016. X                    Monnam(mtmp));
  1017. X#ifdef WALKIES
  1018. X            }
  1019. X#endif
  1020. X            break;
  1021. X        case ARROW_TRAP:
  1022. X            otmp = mksobj(ARROW, FALSE);
  1023. X            otmp->quan = 1;
  1024. X            otmp->owt = weight(otmp);
  1025. X            if(thitm(8, mtmp, otmp, 0)) trapkilled = TRUE;
  1026. X            break;
  1027. X        case DART_TRAP:
  1028. X            otmp = mksobj(DART, FALSE);
  1029. X            otmp->quan = 1;
  1030. X            otmp->owt = weight(otmp);
  1031. X            if(thitm(7, mtmp, otmp, 0)) trapkilled = TRUE;
  1032. X            break;
  1033. X        case TRAPDOOR:
  1034. X            if(is_maze_lev
  1035. X#ifdef STRONGHOLD
  1036. X               && (dlevel > stronghold_level && dlevel < MAXLEVEL)
  1037. X#endif
  1038. X              ) {
  1039. X                otmp = mksobj(ROCK, FALSE);
  1040. X                otmp->quan = 1;
  1041. X                otmp->owt = weight(otmp);
  1042. X                if(thitm(0, mtmp, otmp, d(2, 10)))
  1043. X                    trapkilled = TRUE;
  1044. X                break;
  1045. X            }
  1046. X            tdoor = TRUE;
  1047. X            /* Fall through */
  1048. X        case LEVEL_TELEP:
  1049. X            if(!is_flyer(mtmp->data)
  1050. X#ifdef WORM
  1051. X                && !mtmp->wormno
  1052. X                /* long worms cannot be allowed to change levels */
  1053. X#endif
  1054. X                ){
  1055. X#ifdef WALKIES
  1056. X                if(teleport_pet(mtmp)) {
  1057. X#endif
  1058. X                if(tdoor)
  1059. X                    fall_down(mtmp, dlevel+1);
  1060. X                else {
  1061. X                    newlev = rnd(3);
  1062. X                    if(!rn2(2)) newlev = -(newlev);
  1063. X                    newlev = dlevel + newlev;
  1064. X                    if(newlev > MAXLEVEL) {
  1065. X                    if(dlevel != MAXLEVEL)
  1066. X                        newlev = MAXLEVEL;
  1067. X                    else newlev = MAXLEVEL - rnd(3);
  1068. X                    }
  1069. X                    if(newlev < 1) {
  1070. X                    if(dlevel != 1) newlev = 1;
  1071. X                    else newlev = 1 + rnd(3);
  1072. X                    }
  1073. X                    fall_down(mtmp, newlev);
  1074. X                }
  1075. X                if(in_sight)
  1076. X        pline("Suddenly, %s disappears out of sight.", mon_nam(mtmp));
  1077. X                return(2);    /* no longer on this level */
  1078. X#ifdef WALKIES
  1079. X                }
  1080. X#endif
  1081. X            }
  1082. X            break;
  1083. X        case MONST_TRAP:
  1084. X        case STATUE_TRAP:
  1085. X            break;
  1086. X        case MGTRP:
  1087. X            /* A magic trap.  Monsters immune. */
  1088. X            break;
  1089. X        case SQBRD: {
  1090. X            register struct monst *ztmp = fmon;
  1091. X
  1092. X            if(is_flyer(mtmp->data)) break;
  1093. X            /* Stepped on a squeaky board. */
  1094. X            if (in_sight)
  1095. X               pline("%s steps on a squeaky board.", Monnam(mtmp));
  1096. X            else
  1097. X               You("hear a distant squeak.");
  1098. X            /* Wake up nearby monsters. */
  1099. X               while(ztmp) {
  1100. X             if(dist2(mtmp->mx,mtmp->my,ztmp->mx,ztmp->my) < 40)
  1101. X                   if(ztmp->msleep) ztmp->msleep = 0;
  1102. X             ztmp = ztmp->nmon;
  1103. X               }
  1104. X            break;
  1105. X        }
  1106. X           case WEB:
  1107. X               /* Monster in a web. */
  1108. X            /* in_sight check and confused bear by Eric Backus */
  1109. X               if(mtmp->data->mlet != S_SPIDER) {
  1110. X             if(in_sight)
  1111. X                pline("%s is caught in a web!", Monnam(mtmp));
  1112. X              else
  1113. X                if(mtmp->data == &mons[PM_OWLBEAR])
  1114. X                  You("hear the roaring of a confused bear!");
  1115. X             mtmp->mtrapped = 1;
  1116. X               }
  1117. X              break;
  1118. X#ifdef SPELLS
  1119. X        case ANTI_MAGIC:    break;
  1120. X#endif
  1121. X        case LANDMINE: {
  1122. X            register struct monst *mntmp = fmon;
  1123. X
  1124. X            if(rn2(3))
  1125. X                break; /* monsters usually don't set it off */
  1126. X            if(in_sight)
  1127. X                pline("KAABLAMM!!!  %s steps on a land mine!",
  1128. X                      Monnam(mtmp));
  1129. X            else if (flags.soundok)
  1130. X                pline("Kaablamm!  You hear an explosion in the distance!");
  1131. X            deltrap(t_at(mtmp->mx, mtmp->my));
  1132. X            if(thitm(0, mtmp, (struct obj *)0, rnd(16)))
  1133. X                trapkilled = TRUE;
  1134. X            /* wake everything on the level */
  1135. X            while(mntmp) {
  1136. X                if(mntmp->msleep)
  1137. X                    mntmp->msleep = 0;
  1138. X                mntmp = mntmp->nmon;
  1139. X            }
  1140. X            break;
  1141. X        }
  1142. X        default:
  1143. X            impossible("Some monster encountered a strange trap of type %d.",tt);
  1144. X        }
  1145. X    }
  1146. X    if(trapkilled) return 2;
  1147. X    else return mtmp->mtrapped;
  1148. X}
  1149. X
  1150. Xvoid
  1151. Xselftouch(arg)
  1152. Xchar *arg;
  1153. X{
  1154. X    if(uwep && (uwep->otyp == CORPSE && uwep->corpsenm == PM_COCKATRICE)
  1155. X#ifdef POLYSELF
  1156. X            && !resists_ston(uasmon)
  1157. X#endif
  1158. X    ){
  1159. X        pline("%s touch the cockatrice corpse.", arg);
  1160. X        You("turn to stone...");
  1161. X        killer = "cockatrice corpse accident";
  1162. X        done("stoned");
  1163. X    }
  1164. X}
  1165. X
  1166. Xvoid
  1167. Xfloat_up() {
  1168. X    if(u.utrap) {
  1169. X        if(u.utraptype == TT_PIT) {
  1170. X            u.utrap = 0;
  1171. X            You("float up, out of the pit!");
  1172. X        } else {
  1173. X            You("float up, only your %s is still stuck.",
  1174. X                body_part(LEG));
  1175. X        }
  1176. X    } else
  1177. X        if (Hallucination)
  1178. X            pline("Oh wow!  You're floating in the air!");
  1179. X        else
  1180. X            You("start to float in the air!");
  1181. X}
  1182. X
  1183. Xint
  1184. Xfloat_down() {
  1185. X    register struct trap *trap;
  1186. X
  1187. X    if(Levitation) return(0); /* maybe another ring/potion/boots */
  1188. X
  1189. X    /* check for falling into pool - added by GAN 10/20/86 */
  1190. X    if(is_pool(u.ux,u.uy) && !(Wwalking
  1191. X#ifdef POLYSELF
  1192. X                    || is_flyer(uasmon)
  1193. X#endif
  1194. X                    ))
  1195. X        drown();
  1196. X
  1197. X    You("float gently to the ground.");
  1198. X    if(trap = t_at(u.ux,u.uy))
  1199. X        switch(trap->ttyp) {
  1200. X        case MONST_TRAP:
  1201. X        case STATUE_TRAP:
  1202. X            break;
  1203. X        case TRAPDOOR:
  1204. X            if(is_maze_lev
  1205. X#ifdef STRONGHOLD
  1206. X               && (dlevel >= stronghold_level || dlevel < MAXLEVEL)
  1207. X#endif
  1208. X               || u.ustuck) break;
  1209. X            /* fall into next case */
  1210. X        default:
  1211. X            dotrap(trap);
  1212. X    }
  1213. X    if(!flags.nopick && (levl[u.ux][u.uy].omask || levl[u.ux][u.uy].gmask))
  1214. X        pickup(1);
  1215. X    return 0;
  1216. X}
  1217. X
  1218. X
  1219. Xvoid
  1220. Xtele() {
  1221. X    coord cc;
  1222. X    register int nux,nuy;
  1223. X
  1224. X#ifdef STRONGHOLD
  1225. X    /* Disable teleportation in stronghold && Vlad's Tower */
  1226. X    if(dlevel == stronghold_level ||
  1227. X# ifdef ENDGAME
  1228. X       dlevel == ENDLEVEL ||
  1229. X# endif
  1230. X       (dlevel >= tower_level && dlevel <= tower_level + 2)) {
  1231. X# ifdef WIZARD
  1232. X        if (!wizard) {
  1233. X# endif
  1234. X            pline("A mysterious force prevents you from teleporting!");
  1235. X            return;
  1236. X# ifdef WIZARD
  1237. X        }
  1238. X# endif
  1239. X    }
  1240. X#endif /* STRONGHOLD /**/
  1241. X    if((u.uhave_amulet || dlevel == wiz_level) && !rn2(3)) {
  1242. X        You("feel disoriented for a moment.");
  1243. X        return;
  1244. X    }
  1245. X    if(Teleport_control) {
  1246. X        if (unconscious())
  1247. X        pline("Being unconscious, you cannot control your teleport.");
  1248. X        else {
  1249. X            pline("To what position do you want to be teleported?");
  1250. X            getpos(&cc, 1, "the desired position"); /* 1: force valid */
  1251. X            /* possible extensions: introduce a small error if
  1252. X               magic power is low; allow transfer to solid rock */
  1253. X            if(teleok(cc.x, cc.y)){
  1254. X            teleds(cc.x, cc.y);
  1255. X            return;
  1256. X            }
  1257. X            pline("Sorry...");
  1258. X        }
  1259. X    }
  1260. X    do {
  1261. X        nux = rnd(COLNO-1);
  1262. X        nuy = rn2(ROWNO);
  1263. X    } while(!teleok(nux, nuy));
  1264. X    teleds(nux, nuy);
  1265. X}
  1266. X
  1267. Xvoid
  1268. Xteleds(nux, nuy)
  1269. Xregister int nux,nuy;
  1270. X{
  1271. X    if(Punished) unplacebc();
  1272. X    unsee();
  1273. X    u.utrap = 0;
  1274. X    u.ustuck = 0;
  1275. X    u.ux = nux;
  1276. X    u.uy = nuy;
  1277. X#ifdef POLYSELF
  1278. X    if (hides_under(uasmon))
  1279. X        u.uundetected = (levl[nux][nuy].omask || levl[nux][nuy].gmask);
  1280. X    else 
  1281. X        u.uundetected = 0;
  1282. X    if (u.usym == S_MIMIC_DEF) u.usym = S_MIMIC;
  1283. X#endif
  1284. X    setsee();
  1285. X    if(Punished) placebc(1);
  1286. X    if(u.uswallow){
  1287. X        u.uswldtim = u.uswallow = 0;
  1288. X        docrt();
  1289. X    }
  1290. X    nomul(0);
  1291. X    spoteffects();
  1292. X}
  1293. X
  1294. Xint
  1295. Xdotele()
  1296. X{
  1297. X    struct trap *trap;
  1298. X#ifdef SPELLS
  1299. X    boolean castit = FALSE;
  1300. X    register int sp_no;
  1301. X#endif
  1302. X
  1303. X    trap = t_at(u.ux, u.uy);
  1304. X    if (trap && (!trap->tseen || trap->ttyp != TELEP_TRAP || trap->once))
  1305. X        trap = 0;
  1306. X
  1307. X    if (trap) 
  1308. X        You("jump onto the teleportation trap...");
  1309. X    else if(!Teleportation ||
  1310. X       (u.ulevel < (pl_character[0] == 'W' ? 8 : 12)
  1311. X#ifdef POLYSELF
  1312. X        && !can_teleport(uasmon)
  1313. X#endif
  1314. X       )
  1315. X      ) {
  1316. X#ifdef SPELLS
  1317. X        /* Try to use teleport away spell. */
  1318. X        castit = objects[SPE_TELEPORT_AWAY].oc_name_known;
  1319. X        if (castit) {
  1320. X            for (sp_no = 0; sp_no < MAXSPELL &&
  1321. X                spl_book[sp_no].sp_id != NO_SPELL &&
  1322. X                spl_book[sp_no].sp_id != SPE_TELEPORT_AWAY; sp_no++);
  1323. X
  1324. X            if (sp_no == MAXSPELL ||
  1325. X            spl_book[sp_no].sp_id != SPE_TELEPORT_AWAY)
  1326. X                castit = FALSE;
  1327. X        }
  1328. X#endif
  1329. X#ifdef WIZARD
  1330. X        if (!wizard) {
  1331. X#endif
  1332. X#ifdef SPELLS
  1333. X            if (!castit) {
  1334. X            if (!Teleportation)
  1335. X                You("don't know that spell.");
  1336. X            else
  1337. X#endif
  1338. X                You("are not able to teleport at will.");
  1339. X            return(0);
  1340. X#ifdef SPELLS
  1341. X            }
  1342. X#endif
  1343. X#ifdef WIZARD
  1344. X        }
  1345. X#endif
  1346. X    }
  1347. X
  1348. X    if(!trap && (u.uhunger <= 100 || ACURR(A_STR) < 6)) {
  1349. X        You("lack the strength for a teleport spell.");
  1350. X#ifdef WIZARD
  1351. X        if(!wizard)
  1352. X#endif
  1353. X        return(1);
  1354. X    }
  1355. X
  1356. X#ifdef SPELLS
  1357. X    if (castit)
  1358. X# ifdef WIZARD
  1359. X        if (!spelleffects(++sp_no, TRUE) && !wizard) return(0);
  1360. X# else
  1361. X        return spelleffects(++sp_no, TRUE);
  1362. X# endif
  1363. X#endif
  1364. X
  1365. X#ifdef WALKIES
  1366. X    if(next_to_u()) {
  1367. X#endif
  1368. X        tele();
  1369. X#ifdef WALKIES
  1370. X        (void) next_to_u();
  1371. X    } else {
  1372. X        You("shudder for a moment.");
  1373. X        return(0);
  1374. X    }
  1375. X#endif
  1376. X    if (!trap) morehungry(100);
  1377. X    return(1);
  1378. X}
  1379. X
  1380. Xvoid
  1381. Xplacebc(attach)
  1382. Xint attach;
  1383. X{
  1384. X    if(!uchain || !uball){
  1385. X        impossible("Where are your chain and ball??");
  1386. X        return;
  1387. X    }
  1388. X    uball->ox = uchain->ox = u.ux;
  1389. X    uball->oy = uchain->oy = u.uy;
  1390. X    levl[u.ux][u.uy].omask = 1;
  1391. X    if(attach){
  1392. X        uchain->nobj = fobj;
  1393. X        fobj = uchain;
  1394. X        if(!carried(uball)){
  1395. X            uball->nobj = fobj;
  1396. X            fobj = uball;
  1397. X        }
  1398. X    }
  1399. X}
  1400. X
  1401. Xvoid
  1402. Xunplacebc(){
  1403. X    if(!carried(uball)){
  1404. X        freeobj(uball);
  1405. X        unpobj(uball);
  1406. X    }
  1407. X    freeobj(uchain);
  1408. X    unpobj(uchain);
  1409. X}
  1410. X
  1411. Xvoid
  1412. Xlevel_tele() {
  1413. Xregister int newlevel;
  1414. X#ifdef WALKIES
  1415. Xregister boolean pet_by_u = next_to_u();
  1416. X#endif
  1417. X
  1418. X    if(u.uhave_amulet
  1419. X#ifdef ENDGAME
  1420. X        || dlevel == ENDLEVEL
  1421. X#endif
  1422. X    ) {
  1423. X        You("feel very disoriented for a moment.");
  1424. X        return;
  1425. X    }
  1426. X    if(Teleport_control
  1427. X#ifdef WIZARD
  1428. X       || wizard
  1429. X#endif
  1430. X        ) {
  1431. X        char buf[BUFSZ];
  1432. X
  1433. X        do {
  1434. X          pline("To what level do you want to teleport? [type a number] ");
  1435. X          getlin(buf);
  1436. X        } while(!digit(buf[0]) && (buf[0] != '-' || !digit(buf[1])));
  1437. X        newlevel = atoi(buf);
  1438. X    } else {
  1439. X        newlevel = rn2(5) | !Fire_resistance ? rnd(dlevel + 3) :
  1440. X#ifdef STRONGHOLD
  1441. X        stronghold_level + 1;
  1442. X#else
  1443. X        HELLLEVEL;
  1444. X#endif
  1445. X        if(dlevel == newlevel)
  1446. X        if(is_maze_lev) newlevel--; else newlevel++;
  1447. X    }
  1448. X    if(newlevel < 0) {
  1449. X#ifdef WALKIES
  1450. X        if(pet_by_u) {
  1451. X#endif
  1452. X        if(newlevel <= -10) {
  1453. X            You("arrive in heaven.");
  1454. X            pline("\"You are here a bit early, but we'll let you in.\"");
  1455. X            killer = "visit to heaven";
  1456. X            done("died");
  1457. X        } else    if (newlevel == -9) {
  1458. X            You("feel deliriously happy. ");
  1459. X            pline("(In fact, you're on Cloud 9!) ");
  1460. X            more();
  1461. X        } else
  1462. X#ifndef STRONGHOLD
  1463. X            newlevel = 0;
  1464. X#else
  1465. X            newlevel = 1;
  1466. X#endif
  1467. X        You("are now high above the clouds...");
  1468. X        if(Levitation) {
  1469. X            You("float gently down to earth.");
  1470. X#ifndef STRONGHOLD
  1471. X            done("escaped");
  1472. X#endif
  1473. X        }
  1474. X#ifdef POLYSELF
  1475. X        if(is_flyer(uasmon)) {
  1476. X            You("fly down to earth.");
  1477. X# ifndef STRONGHOLD
  1478. X            done("escaped");
  1479. X# endif
  1480. X        }
  1481. X#endif
  1482. X        pline("Unfortunately, you don't know how to fly.");
  1483. X        You("plummet a few thousand feet to your death.");
  1484. X        dlevel = 0;
  1485. X        killer = "long fall";
  1486. X        done("died");
  1487. X#ifdef WALKIES
  1488. X        } else {
  1489. X        You("shudder for a moment...");
  1490. X        return;
  1491. X        }
  1492. X#endif
  1493. X    }
  1494. X    /* calls done("escaped") if newlevel==0 */
  1495. X#ifdef WALKIES
  1496. X    if(!pet_by_u)
  1497. X        You("shudder for a moment...");
  1498. X    else
  1499. X#endif
  1500. X        goto_level(newlevel, FALSE);
  1501. X}
  1502. X
  1503. Xvoid
  1504. Xdomagictrap() {
  1505. X    register int fate = rnd(20);
  1506. X
  1507. X    /* What happened to the poor sucker? */
  1508. X
  1509. X    if (fate < 10) {
  1510. X
  1511. X      /* Most of the time, it creates some monsters. */
  1512. X      register int cnt = rnd(4);
  1513. X
  1514. X      /* below checks for blindness added by GAN 10/30/86 */
  1515. X      if (!Blind)  {
  1516. X        You("are momentarily blinded by a flash of light!");
  1517. X        make_blinded((long)rn1(5,10),FALSE);
  1518. X      }  else
  1519. X        You("hear a deafening roar!");
  1520. X      while(cnt--)
  1521. X       (void) makemon((struct permonst *) 0, u.ux, u.uy);
  1522. X    }
  1523. X    else
  1524. X      switch (fate) {
  1525. X
  1526. X         case 10:
  1527. X         case 11:
  1528. X              /* sometimes nothing happens */
  1529. X            break;
  1530. X         case 12:
  1531. X              /* a flash of fire */
  1532. X              {
  1533. X            register int num;
  1534. X
  1535. X            /* changed to be in conformance with
  1536. X             * SCR_FIRE by GAN 11/02/86
  1537. X             */
  1538. X
  1539. X            pline("A tower of flame bursts from the floor!");
  1540. X            if(Fire_resistance) {
  1541. X                shieldeff(u.ux, u.uy);
  1542. X                You("are uninjured.");
  1543. X                break;
  1544. X            } else {
  1545. X                num = rnd(6);
  1546. X                u.uhpmax -= num;
  1547. X                losehp(num,"a burst of flame");
  1548. X                break;
  1549. X            }
  1550. X              }
  1551. X
  1552. X         /* odd feelings */
  1553. X         case 13:   pline("A shiver runs up and down your spine!");
  1554. X            break;
  1555. X         case 14:   You("hear distant howling.");
  1556. X            break;
  1557. X         case 15:   You("suddenly yearn for your distant homeland.");
  1558. X            break;
  1559. X         case 16:   Your("pack shakes violently!");
  1560. X            break;
  1561. X         case 17:    You("smell charred flesh.");
  1562. X            break;
  1563. X
  1564. X         /* very occasionally something nice happens. */
  1565. X
  1566. X         case 19:
  1567. X            /* tame nearby monsters */
  1568. X           {   register int i,j;
  1569. X               register boolean confused = (Confusion != 0);
  1570. X               register int bd = confused ? 5 : 1;
  1571. X
  1572. X               /* below pline added by GAN 10/30/86 */
  1573. X               adjattrib(A_CHA,1,FALSE);
  1574. X               for(i = -bd; i <= bd; i++) for(j = -bd; j <= bd; j++)
  1575. X               if(levl[u.ux+i][u.uy+j].mmask)
  1576. X               (void) tamedog(m_at(u.ux+i, u.uy+j), (struct obj *)0);
  1577. X               break;
  1578. X           }
  1579. X
  1580. X         case 20:
  1581. X            /* uncurse stuff */
  1582. X           {  register struct obj *obj;
  1583. X              register boolean confused = (Confusion != 0);
  1584. X
  1585. X            /* below plines added by GAN 10/30/86 */
  1586. X            if (confused)
  1587. X                if (Hallucination)
  1588. X                You("feel the power of the Force against you!");
  1589. X                else
  1590. X                You("feel like you need some help.");
  1591. X            else
  1592. X                if (Hallucination)
  1593. X                You("feel in touch with the Universal Oneness.");
  1594. X                else
  1595. X                You("feel like someone is helping you.");
  1596. X               for(obj = invent; obj ; obj = obj->nobj)
  1597. X                   if(obj->owornmask)
  1598. X                    if(confused)
  1599. X                    curse(obj);
  1600. X                    else
  1601. X                    obj->cursed = 0;
  1602. X               if(Punished && !confused)
  1603. X                unpunish();
  1604. X               break;
  1605. X           }
  1606. X         default: break;
  1607. X      }
  1608. X}
  1609. X
  1610. Xvoid
  1611. Xdrown() {
  1612. X    register struct obj *obj;
  1613. X
  1614. X    /* Scrolls and potions get affected by the water */
  1615. X    for(obj = invent; obj; obj = obj->nobj) {
  1616. X        if(obj->olet == SCROLL_SYM && rn2(12) > u.uluck)
  1617. X            obj->otyp = SCR_BLANK_PAPER;
  1618. X        if(obj->olet == POTION_SYM && rn2(12) > u.uluck) {
  1619. X            if (obj->spe == -1) {
  1620. X                obj->otyp = POT_WATER;
  1621. X                obj->blessed = obj->cursed = 0;
  1622. X                obj->spe = 0;
  1623. X            } else obj->spe--;
  1624. X        }
  1625. X    }
  1626. X
  1627. X#ifdef POLYSELF
  1628. X    if(u.usym == S_GREMLIN && rn2(3)) {
  1629. X        struct monst *mtmp;
  1630. X        if(mtmp = cloneu()) {
  1631. X            mtmp->mhpmax = (u.mhmax /= 2);
  1632. X            You("multiply.");
  1633. X        }
  1634. X    }
  1635. X
  1636. X    if(is_swimmer(uasmon)) return;
  1637. X#endif
  1638. X
  1639. X    You("fell into %s!",
  1640. X          levl[u.ux][u.uy].typ == POOL ? "a pool" : "the moat");
  1641. X    You("can't swim!");
  1642. X    if(
  1643. X#ifdef WIZARD
  1644. X    wizard ||
  1645. X#endif
  1646. X    rn2(3) < u.uluck+2) {
  1647. X        You("attempt a teleport spell.");    /* utcsri!carroll */
  1648. X        (void) dotele();
  1649. X        if(!is_pool(u.ux,u.uy)) return;
  1650. X    }
  1651. X    You("drown.");
  1652. X    killer = levl[u.ux][u.uy].typ == POOL ? "pool of water" : "moat";
  1653. X    done("drowned");
  1654. X}
  1655. X
  1656. X#ifdef SPELLS
  1657. Xvoid
  1658. Xdrain_en(n)
  1659. Xregister int n;
  1660. X{
  1661. X    if (!u.uenmax) return;
  1662. X    You("feel your magical energy drain away!");
  1663. X    u.uen -= n;
  1664. X    if(u.uen < 0)  {
  1665. X        u.uenmax += u.uen;
  1666. X        if(u.uenmax < 0) u.uenmax = 0;
  1667. X        u.uen = 0;
  1668. X    }
  1669. X    flags.botl = 1;
  1670. X}
  1671. X#endif
  1672. X
  1673. Xint
  1674. Xdountrap() {    /* disarm a trapped object */
  1675. X    register struct obj *otmp;
  1676. X    register boolean confused = (Confusion > 0);
  1677. X    register int x,y;
  1678. X    int ch;
  1679. X    struct trap *ttmp;
  1680. X
  1681. X#ifdef POLYSELF
  1682. X    if(nohands(uasmon)) {
  1683. X        pline("And just how do you expect to do that?");
  1684. X        return(0);
  1685. X    }
  1686. X#endif
  1687. X    if(!getdir(TRUE)) return(0);
  1688. X    x = u.ux + u.dx;
  1689. X    y = u.uy + u.dy;
  1690. X
  1691. X    if(!u.dx && !u.dy) {
  1692. X        if(levl[x][y].omask)
  1693. X        for(otmp = fobj; otmp; otmp = otmp->nobj)
  1694. X            if((otmp->ox == x) && (otmp->oy == y))
  1695. X            if(Is_box(otmp)) {
  1696. X                pline("There is %s here, check for traps? ",
  1697. X                  doname(otmp));
  1698. X
  1699. X                switch (ynq()) {
  1700. X                case 'q': return(0);
  1701. X                case 'n': continue;
  1702. X                }
  1703. X
  1704. X                if((otmp->otrapped && !confused && rn2(44-dlevel*2) < 10)
  1705. X                   || confused && !rn2(3)) {
  1706. X                You("find a trap on the %s!  Disarm it? ",
  1707. X                       xname(otmp));
  1708. X
  1709. X                switch (ynq()) {
  1710. X                    case 'q': return(1);
  1711. X                    case 'n': continue;
  1712. X                }
  1713. X
  1714. X                if(otmp->otrapped) {
  1715. X                    ch = 15 +
  1716. X                     (pl_character[0] == 'R') ? u.ulevel*3 :
  1717. X                     u.ulevel;
  1718. X                    if(confused || Fumbling || rnd(75+dlevel/2) > ch) {
  1719. X                    You("set it off!");
  1720. X                    chest_trap(otmp, FINGER);
  1721. X                    } else {
  1722. X                    You("disarm it!");
  1723. X                    otmp->otrapped = 0;
  1724. X                    }
  1725. X                } else pline("That %s was not trapped.",
  1726. X                         doname(otmp));
  1727. X                return(1);
  1728. X                } else {
  1729. X                You("find no traps on the %s.",
  1730. X                    xname(otmp));
  1731. X                return(1);
  1732. X                }
  1733. X            }
  1734. X        if ((ttmp = t_at(x,y)) && ttmp->tseen)
  1735. X        You("cannot disable this trap.");
  1736. X        else
  1737. X        You("know of no traps here.");
  1738. X        return(0);
  1739. X    }
  1740. X
  1741. X    if (!IS_DOOR(levl[x][y].typ)) {
  1742. X        if ((ttmp = t_at(x,y)) && ttmp->tseen)
  1743. X        You("cannot disable that trap.");
  1744. X        else
  1745. X        You("know of no traps there.");
  1746. X        return(0);
  1747. X    }
  1748. X
  1749. X    switch (levl[x][y].doormask) {
  1750. X        case D_NODOOR:
  1751. X        You("%s no door there.", Blind ? "feel" : "see");
  1752. X        return(0);
  1753. X        case D_ISOPEN:
  1754. X        pline("This door is safely open.");
  1755. X        return(0);
  1756. X        case D_BROKEN:
  1757. X        pline("This door is broken.");
  1758. X        return(0);
  1759. X    }
  1760. X
  1761. X    if ((levl[x][y].doormask & D_TRAPPED && !confused &&
  1762. X         rn2(44-dlevel*2) < 10)
  1763. X        || confused && !rn2(3)) {
  1764. X        You("find a trap on the door!  Disarm it? ");
  1765. X        if (ynq() != 'y') return(1);
  1766. X        if (levl[x][y].doormask & D_TRAPPED) {
  1767. X            ch = 15 +
  1768. X             (pl_character[0] == 'R') ? u.ulevel*3 :
  1769. X             u.ulevel;
  1770. X            if(confused || Fumbling || rnd(75+dlevel/2) > ch) {
  1771. X                You("set it off!");
  1772. X                b_trapped("door");
  1773. X            } else {
  1774. X                You("disarm it!");
  1775. X                levl[x][y].doormask &= ~D_TRAPPED;
  1776. X            }
  1777. X        } else pline("This door was not trapped.");
  1778. X        return(1);
  1779. X    } else {
  1780. X        You("find no traps on the door.");
  1781. X        return(1);
  1782. X    }
  1783. X}
  1784. X
  1785. X/* this is only called when the player is doing something to the chest
  1786. X * -- i.e., the player and the chest are in the same position */
  1787. Xvoid
  1788. Xchest_trap(obj, bodypart)
  1789. Xregister struct obj *obj;
  1790. Xregister int bodypart;
  1791. X{
  1792. X    register struct obj *otmp,*otmp2;
  1793. X    char    buf[80];
  1794. X
  1795. X    if(rn2(13+u.uluck) > 7) return;
  1796. X
  1797. X    otmp = obj;
  1798. X    switch(rn2(13-u.uluck)) {    /* which trap? */
  1799. X        case 23:
  1800. X        case 22:
  1801. X        case 21:
  1802. X            pline("The %s explodes!", xname(obj));
  1803. X            Sprintf(buf, "exploding %s", xname(obj));
  1804. X
  1805. X            delete_contents(obj);
  1806. X            for(otmp = fobj; otmp; otmp = otmp2) {
  1807. X                otmp2 = otmp->nobj;
  1808. X                if((otmp->ox == u.ux) && (otmp->oy == u.uy))
  1809. X                delobj(otmp);
  1810. X            }
  1811. X
  1812. X            losehp(d(6,6), buf);
  1813. X            wake_nearby();
  1814. X            return;
  1815. X        case 20:
  1816. X        case 19:
  1817. X        case 18:
  1818. X        case 17:
  1819. X            pline("A cloud of noxious gas billows from the %s.",
  1820. X                  xname(obj));
  1821. X            poisoned("gas cloud", A_STR, "cloud of poison gas");
  1822. X            break;
  1823. X        case 16:
  1824. X        case 15:
  1825. X        case 14:
  1826. X        case 13:
  1827. X            pline("A tower of flame erupts from the %s",
  1828. X                  xname(obj));
  1829. X            if(Fire_resistance) {
  1830. X                shieldeff(u.ux, u.uy);
  1831. X                You("don't seem to be affected.");
  1832. X            } else    losehp(d(4, 6), "tower of flame");
  1833. X            destroy_item(SCROLL_SYM, AD_FIRE);
  1834. X#ifdef SPELLS
  1835. X            destroy_item(SPBOOK_SYM, AD_FIRE);
  1836. X#endif
  1837. X            destroy_item(POTION_SYM, AD_FIRE);
  1838. X            break;
  1839. X        case 12:
  1840. X        case 10:
  1841. X        case 9:
  1842. X            You("are jolted by a surge of electricity!");
  1843. X            if(Shock_resistance)  {
  1844. X                shieldeff(u.ux, u.uy);
  1845. X                You("don't seem to be affected.");
  1846. X            } else    losehp(d(4, 4), "electric shock");
  1847. X            destroy_item(RING_SYM, AD_ELEC);
  1848. X            destroy_item(WAND_SYM, AD_ELEC);
  1849. X            break;
  1850. X        case 8:
  1851. X        case 7:
  1852. X        case 6:
  1853. X            pline("Suddenly you are frozen in place!");
  1854. X            nomovemsg = "You can move again.";
  1855. X            multi = -d(5, 6);
  1856. X            break;
  1857. X        case 5:
  1858. X        case 4:
  1859. X        case 3:
  1860. X            pline("A cloud of %s gas billows from the %s",
  1861. X                  hcolor(), xname(obj));
  1862. X            if(!Stunned)
  1863. X                if (Hallucination)
  1864. X                pline("What a groovy feeling!");
  1865. X                else
  1866. X                You("stagger and your vision blurs...");
  1867. X            make_stunned(HStun + rn1(7, 16),FALSE);
  1868. X            make_hallucinated(Hallucination + rn1(5, 16),FALSE);
  1869. X            break;
  1870. X        default:
  1871. X            You("feel a needle prick your %s.",body_part(bodypart));
  1872. X            poisoned("needle", A_CON, "a poisoned needle");
  1873. X            break;
  1874. X    }
  1875. X    otmp->otrapped = 0;        /* these traps are one-shot things */
  1876. X}
  1877. X
  1878. Xvoid
  1879. Xwake_nearby() {            /* Wake up nearby monsters. */
  1880. X    register struct monst *mtmp;
  1881. X
  1882. X    for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
  1883. X        if(dist(mtmp->mx,mtmp->my) < u.ulevel*20) {
  1884. X        if(mtmp->msleep)  mtmp->msleep = 0;
  1885. X        if(mtmp->mtame)   EDOG(mtmp)->whistletime = moves;
  1886. X        }
  1887. X    }
  1888. X}
  1889. X
  1890. Xstruct trap *
  1891. Xt_at(x,y)
  1892. Xregister int x, y;
  1893. X{
  1894. X    register struct trap *trap = ftrap;
  1895. X    while(trap) {
  1896. X        if(trap->tx == x && trap->ty == y) return(trap);
  1897. X        trap = trap->ntrap;
  1898. X    }
  1899. X    return((struct trap *)0);
  1900. X}
  1901. X
  1902. Xvoid
  1903. Xdeltrap(trap)
  1904. Xregister struct trap *trap;
  1905. X{
  1906. X    register struct trap *ttmp;
  1907. X
  1908. X    if(trap == ftrap)
  1909. X        ftrap = ftrap->ntrap;
  1910. X    else {
  1911. X        for(ttmp = ftrap; ttmp->ntrap != trap; ttmp = ttmp->ntrap) ;
  1912. X        ttmp->ntrap = trap->ntrap;
  1913. X    }
  1914. X    free((genericptr_t) trap);
  1915. X}
  1916. X
  1917. Xvoid
  1918. Xb_trapped(item)        /* used for doors. can be used */
  1919. Xregister char *item;    /* for anything else that opens */
  1920. X{
  1921. X    register int dmg = rn2(15) + rnd((int)u.ulevel);
  1922. X
  1923. X    pline("KABOOM!!  The %s was booby-trapped!", item);
  1924. X    make_stunned(HStun + dmg, TRUE);
  1925. X    losehp(dmg, "explosion");
  1926. X}
  1927. X
  1928. X/* Monster is hit by trap. */
  1929. X/* Note: doesn't work if both obj and d_override are null */
  1930. Xstatic boolean
  1931. Xthitm(tlev, mon, obj, d_override)
  1932. Xregister int tlev;
  1933. Xregister struct monst *mon;
  1934. Xregister struct obj *obj;
  1935. Xint d_override;
  1936. X{
  1937. X    register int strike;
  1938. X    register boolean trapkilled = FALSE;
  1939. X
  1940. X    if (d_override) strike = 1;
  1941. X    else if (obj) strike = (mon->data->ac + tlev + obj->spe <= rnd(20));
  1942. X    else strike = (mon->data->ac + tlev <= rnd(20));
  1943. X
  1944. X    /* Actually more accurate than thitu, which doesn't take
  1945. X     * obj->spe into account.
  1946. X     */
  1947. X    if(!strike) {
  1948. X        if (cansee(mon->mx, mon->my))
  1949. X            pline("%s is almost hit by %s!", Monnam(mon),
  1950. X                                doname(obj));
  1951. X    } else {
  1952. X        int dam = 1;
  1953. X
  1954. X        if (obj && cansee(mon->mx, mon->my))
  1955. X            pline("%s is hit by %s!", Monnam(mon), doname(obj));
  1956. X        if (d_override) dam = d_override;
  1957. X        else if (obj) {
  1958. X            dam = dmgval(obj, mon->data);
  1959. X            if (dam < 1) dam = 1;
  1960. X        }
  1961. X        if ((mon->mhp -= dam) <= 0) {
  1962. X            if (cansee(mon->mx, mon->my))
  1963. X                pline("%s is killed!", Monnam(mon));
  1964. X            else if (mon->mtame)
  1965. X    You("have a sad feeling for a moment, then it passes.");
  1966. X            mondied(mon);
  1967. X            trapkilled = TRUE;
  1968. X        }
  1969. X    }
  1970. X    if (obj && (!strike || d_override)) {
  1971. X        obj->ox = mon->mx;
  1972. X        obj->oy = mon->my;
  1973. X        obj->nobj = fobj;
  1974. X        fobj = obj;
  1975. X        stackobj(fobj);
  1976. X        levl[obj->ox][obj->oy].omask = 1;
  1977. X    } else if (obj) free ((genericptr_t)obj);
  1978. X
  1979. X    return trapkilled;
  1980. X}
  1981. X
  1982. Xboolean
  1983. Xunconscious()
  1984. X{
  1985. X    return (multi < 0 && (!nomovemsg ||
  1986. X          !strncmp(nomovemsg,"You wake", 8) ||
  1987. X          !strncmp(nomovemsg,"You awake", 9) ||
  1988. X          !strncmp(nomovemsg,"You regain con", 15) ||
  1989. X          !strncmp(nomovemsg,"You are consci", 15)));
  1990. X}
  1991. END_OF_FILE
  1992. if test 38220 -ne `wc -c <'src/trap.c'`; then
  1993.     echo shar: \"'src/trap.c'\" unpacked with wrong size!
  1994. fi
  1995. # end of 'src/trap.c'
  1996. fi
  1997. echo shar: End of archive 6 \(of 38\).
  1998. cp /dev/null ark6isdone
  1999. MISSING=""
  2000. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ; do
  2001.     if test ! -f ark${I}isdone ; then
  2002.     MISSING="${MISSING} ${I}"
  2003.     fi
  2004. done
  2005. if test "${MISSING}" = "" ; then
  2006.     echo You have unpacked all 38 archives.
  2007.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2008. else
  2009.     echo You still need to unpack the following archives:
  2010.     echo "        " ${MISSING}
  2011. fi
  2012. ##  End of shell archive.
  2013. exit 0
  2014.