home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume16 / nethack31 / part68 < prev    next >
Internet Message Format  |  1993-02-04  |  60KB

  1. Path: uunet!news.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v16i076:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part68/108
  5. Message-ID: <4379@master.CNA.TEK.COM>
  6. Date: 1 Feb 93 19:51:36 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 1882
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1626
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 76
  14. Archive-name: nethack31/Part68
  15. Supersedes: nethack3p9: Volume 10, Issue 46-102
  16. Environment: Amiga, Atari, Mac, MS-DOS, OS2, Unix, VMS, X11
  17.  
  18.  
  19.  
  20. #! /bin/sh
  21. # This is a shell archive.  Remove anything before this line, then unpack
  22. # it by saving it into a file and typing "sh file".  To overwrite existing
  23. # files, type "sh file -c".  You can also feed this as standard input via
  24. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  25. # will see the following message at the end:
  26. #        "End of archive 68 (of 108)."
  27. # Contents:  dat/rumors.tru src/rect.c src/zap.c1
  28. # Wrapped by billr@saab on Wed Jan 27 16:09:13 1993
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'dat/rumors.tru' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'dat/rumors.tru'\"
  32. else
  33. echo shar: Extracting \"'dat/rumors.tru'\" \(19319 characters\)
  34. sed "s/^X//" >'dat/rumors.tru' <<'END_OF_FILE'
  35. XA blindfold can be very useful if you're telepathic.
  36. XA candelabrum affixed with seven candles shows the way with a magical light.
  37. XA crystal plate mail will not rust.
  38. XA katana might slice a worm in two.
  39. XA magic vomit pump could be useful for gourmands.
  40. XA nymph knows how to unlock chains.
  41. XA potion of blindness lets you see invisible things.
  42. XA priest can get the gods to listen easily.
  43. XA priest can go to hell just like the rest of us.
  44. XA priestess and a virgin you might be, but that unicorn won't care.
  45. XA ring of conflict is a bad thing if there is a nurse in the room.
  46. XA short sword is not as good as a long sword.
  47. XA succubus will go farther than a nymph.
  48. XAcid blobs should be attacked bare-handed.
  49. XAffairs with nymphs are often very expensive.
  50. XAfraid of nymphs?  Wear a ring of adornment.
  51. XAfraid of your valuables being stolen?  Carry more junk!
  52. XAlways be aware of the phase of the moon!
  53. XAlways sweep the floor before engraving important messages.
  54. XAmulets are hard to make.  Even for a wand of wishing.
  55. XAn elven cloak protects against magic.
  56. XAn umber hulk can be a confusing sight.
  57. XAsking about monsters may be very useful.
  58. XAttack long worms from the rear -- that is so much safer!
  59. XAttacking an eel where there is none is usually a fatal mistake!
  60. XBashing monsters with a bow is not such a good idea.
  61. XBe careful!  The Wizard may plan an ambush!
  62. XBe nice to a nurse:  Put away your weapon and take off your clothes.
  63. XBeing digested is a painfully slow process.
  64. XBlank scrolls make more interesting reading.
  65. XBlind?  Catch a floating eye!
  66. XBooksellers never read scrolls; they might get carried away.
  67. XConcise conquest:  Control, confuse, conjure, condemn.
  68. XDilithium crystals are rare indeed.
  69. XDogs are attracted by the smell of tripe.
  70. XDogs are superstitious; they never step on cursed items.
  71. XDogs of ghosts aren't angry, just hungry.
  72. XDon't bother about money:  only leprechauns and shopkeepers are interested.
  73. XDon't forget!  Large dogs are MUCH harder to kill than little dogs.
  74. XDon't mess with shopkeepers, or you'll get the Guild after you.
  75. XDragons never whip their children; they wouldn't feel it!
  76. XEat your carrots.  They're good for your eyes.
  77. XEating a freezing sphere is like eating a yeti.
  78. XEating a killer bee is like eating a scorpion.
  79. XEating a tengu is like eating a nymph.
  80. XEating a wraith is a rewarding experience!
  81. XEating unpaid leprechauns may be advantageous.
  82. XElbereth has quite a reputation around these parts.
  83. XElf has extra speed.
  84. XElven cloaks cannot rust.
  85. XEver fought with an enchanted tooth?
  86. XEver tried reading while confused?
  87. XEver tried to put a troll into a large box?
  88. XEver wondered why one would want to dip something in a potion?
  89. XExpensive cameras have penetrating flash lights.
  90. XExtra staircases lead to extra levels.
  91. XFiery letters might deter monsters.
  92. XGems are too precious to be thrown away carelessly.
  93. XGetting hungry?  Stop wearing rings!
  94. XGods expect the best from their priesthood.
  95. XGods look down their noses at demigods.
  96. XHandle your flasks carefully -- there might be a ghost inside!
  97. XHoly water has many uses.
  98. XHunger is a confusing experience for a dog!
  99. XI once knew a hacker who ate too fast and choked to death.
  100. XI smell a maze of twisty little passages.
  101. XI wish I never wished a wand of wishing.  (Wishful thinking.)
  102. XI wouldn't advise playing catch with a giant.
  103. XI'm watching you.  -- The Wizard of Yendor
  104. XIce boxes keep your food fresh.
  105. XIf you are being punished, it's done with a deadly weapon.
  106. XIf you kill the Wizard, you get promoted to demi-god.
  107. XIf you need a wand of digging, kindly ask the minotaur.
  108. XIf you want a sex change, you must get it before the game.
  109. XIf you want to hit, use a dagger.
  110. XIf you want to rob a shop, train your dog.
  111. XIf you're lost, try buying a map next time you're in a shop.
  112. XInside a shop you better take a look at the price tags before buying anything.
  113. XIt is bad manners to use a wand in a shop.
  114. XIt is dangerous to visit a graveyard at midnight.
  115. XIt is not always a good idea to whistle for your dog.
  116. XIt is rumored that the Wizard has hired some help.
  117. XIt might be a good idea to offer the unicorn a ruby.
  118. XIt would be peculiarly sad were your dog turned to stone.
  119. XKeep your armors away from rust.
  120. XKeep your weaponry away from acids.
  121. XKill a unicorn of your color and you kill your luck.
  122. XLeather is waterproof.  Ever see a cow with an umbrella?
  123. XLeprechauns are the most skilled cutpurses in this dungeon.
  124. XLizard corpses protect against cockatrices.
  125. XMost monsters can't swim.
  126. XMusic hath charms to affect the stubborn drawbridge.
  127. XMusic hath charms to soothe the savage beast.
  128. XNever attack a guard.
  129. XNever ride a long worm.
  130. XNever use your best weapon to engrave a curse.
  131. XNo easy fighting with a heavy load!
  132. XNurses are accustomed to touch naked persons:  they don't harm them.
  133. XNymphs can unlink more than your chain mail.
  134. XOnce your little dog will be a big dog, and you will be proud of it.
  135. XOpening a tin is difficult, especially when you attempt it bare handed!
  136. XOrcs and killer bees share their lifestyle.
  137. XOrcs do not procreate in dark rooms.
  138. XPlain nymphs are harmless.
  139. XPlaying AD&D may be helpful.
  140. XPlaying Gauntlet might be enlightening in some situations.
  141. XPlaying billiards pays when you are in a shop.
  142. XPolymorphing a shopkeeper might make you safer.
  143. XPolymorphing your dog probably makes you safer.
  144. XPotions don't usually mix, but sometimes...
  145. XPsst!  It's done with mirrors!
  146. XPut on a ring of teleportation:  it will take you away from onslaught.
  147. XRays aren't boomerangs, of course, but still...
  148. XRead the manual before entering the cave -- you might get killed otherwise.
  149. XReading Herbert might be enlightening in one case.
  150. XReading Tolkien might help you.
  151. XReading scrolls after drinking booze can give confusing results.
  152. XRust monsters love water.  There are potions they hate, however.
  153. XShopkeepers accept credit cards, as long as you pay cash.
  154. XShopkeepers can spot a tourist a mile away with those Hawaiian shirts.
  155. XShopkeepers can't read, so what use is engraving in a shop?
  156. XShopkeepers can't swim.
  157. XShopkeepers can't tell identical twins apart.
  158. XShopkeepers have incredible patience.
  159. XShopkeepers might raise their prices for tourists.
  160. XShopkeepers value money more than revenge.
  161. XSome monsters can be tamed.  I once saw a hacker with a tame dragon!
  162. XSomeone's been spiking the pits!
  163. XSometimes monsters are more likely to fight each other than attack you.
  164. XSpinach, carrot, and a melon -- a meal fit for a nurse!
  165. XTainted meat is even more sickening than poison!
  166. XTelepathy is just a trick:  once you know how to do it, it's easy.
  167. XThe darker the warning, the more dire the danger.
  168. XThe Leprechaun Gold Tru$t is no division of the Magic Memory Vault.
  169. XThe Wizard finds death to be quite an experience.
  170. XThe best equipment for your work is, of course, the most expensive.
  171. XThe gods don't appreciate pesky priesthood.
  172. XThe moon is not the only heavenly body to influence this game.
  173. XThe orc swings his two handed sword named Elfrist at you.  You die...
  174. XThe secret of wands of Nothing Happens:  try again!
  175. XThere has always been something mystical about mirrors.
  176. XThere is a Mastermind deep in the dungeon.
  177. XThere is a big treasure hidden in the zoo!
  178. XThere is more magic in this cave than meets the eye.
  179. XThere is no harm in praising a large dog.
  180. XThere is nothing like eating a mimic.
  181. XThey say a gelatinous cube can paralyze you...
  182. XThey say that Juiblex is afraid of a wand of digging.
  183. XThey say that Medusa would like to put you on a pedestal.
  184. XThey say that Vlad lives!!! ... in the mazes.
  185. XThey say that `Elbereth' is often written about.
  186. XThey say that a bag of holding can't hold everything.
  187. XThey say that a blessed tin of quasit meat is a quick meal.
  188. XThey say that a cat avoids traps.
  189. XThey say that a cave spider will occasionally eat cave spider eggs.
  190. XThey say that a clever wizard can have stats:  18/** 24 18 24 24 24.
  191. XThey say that a clove of garlic makes a good talisman if handled right.
  192. XThey say that a cursed scroll of teleportation could land you in trouble.
  193. XThey say that a diamond is another kind of luck stone.
  194. XThey say that a dog can be trained to fetch objects.
  195. XThey say that a gelatinous cube makes a healthy breakfast.
  196. XThey say that a giant gets strong by eating right, try it!
  197. XThey say that a grid bug won't hit you when you cross it.
  198. XThey say that a lembas wafer is a very light snack.
  199. XThey say that a loadstone has a strange attraction and is not bad luck.
  200. XThey say that a lock pick by any other name is still a lock pick.
  201. XThey say that a lucky amulet will block poisoned arrows.
  202. XThey say that a mirror will freeze a floating eye but you can still see it.
  203. XThey say that a neutral character would get either Fire or Frost Brand.
  204. XThey say that a polymorph trap is magic and magic protection prevents it.
  205. XThey say that a potion of healing can cancel a potion of sickness.
  206. XThey say that a potion of monster detection sometimes works both ways.
  207. XThey say that a sink looks different from high above the floor.
  208. XThey say that a summoned demon could improve your game.
  209. XThey say that a tin of wraith meat is a rare dining experience.
  210. XThey say that a unicorn might bring you luck.
  211. XThey say that a wand of cancellation is like a wand of polymorph.
  212. XThey say that a wand of locking can close more than just doors.
  213. XThey say that a wand of polymorph can change your game.
  214. XThey say that a wizard is even more powerful the second time around.
  215. XThey say that a xorn knows of no obstacles when pursuing you.
  216. XThey say that abusing a credit card could shock you sooner or later.
  217. XThey say that amulets, like most things, can be deadly or life saving.
  218. XThey say that an altar can identify blessings.
  219. XThey say that an ooze will bite your boots and a rockmole will eat them.
  220. XThey say that an unlucky hacker was once killed by an exploding tin.
  221. XThey say that antique dealers are always interested in precious stones.
  222. XThey say that booze can be diluted but not cancelled.
  223. XThey say that by listening carefully, you can hear a secret door!
  224. XThey say that carrots and carrot juice may improve your vision.
  225. XThey say that cave spiders are not considered expensive health food.
  226. XThey say that demigods must leave behind their prized earthly possessions.
  227. XThey say that disturbing a djinni can be a costly mistake.
  228. XThey say that dragon scales can be quite enchanting.
  229. XThey say that dropping coins into a fountain will not grant you a wish.
  230. XThey say that dwarves lawfully mind their own business.
  231. XThey say that eating a bat corpse will make you batty, for awhile.
  232. XThey say that eating a cram ration is a smart move.
  233. XThey say that eating blue jelly is cool if you don't fight the feeling.
  234. XThey say that escaping a dungeon is only the beginning of the end.
  235. XThey say that feeling an unexpected draft of air is sort of a breakthrough.
  236. XThey say that finding a cursed gray stone is always bad luck.
  237. XThey say that for a good time engrave `Elbereth'.
  238. XThey say that gaining a level is an experience that can raise your sights.
  239. XThey say that garter snake meat rarely tastes good but it's still healthy.
  240. XThey say that gauntlets of dexterity have a hidden enchanted touch.
  241. XThey say that going to heaven is just another way of escaping the dungeon.
  242. XThey say that golden nagas are law-abiding denizens as long as you are too.
  243. XThey say that gremlins can make you feel cooler than you are now.
  244. XThey say that grid bugs only exist in a strictly Cartesian sense.
  245. XThey say that hackers often feel jumpy about eating nymphs.
  246. XThey say that having polymorph control won't shock you.
  247. XThey say that hell hath no fury like Medusa scorned.
  248. XThey say that if it's hard getting your food down another bite could kill.
  249. XThey say that if you don't wear glasses why bother with carrots?
  250. XThey say that if you notice a loose board beneath you, don't step on it.
  251. XThey say that if you start at the bottom the only place to go is up.
  252. XThey say that if you teleport to heaven you're presumed to be dead already.
  253. XThey say that in a shop you can be charged for old charges.
  254. XThey say that in lighter moments you could think of ways to pass a stone.
  255. XThey say that in the dungeon breaking a mirror can be seven years bad luck.
  256. XThey say that in the dungeon you don't usually have any luck at all.
  257. XThey say that in time a blessed luckstone can make your god happy.
  258. XThey say that it is easier to kill the Wizard than to make him stand still.
  259. XThey say that it only takes 1 zorkmid to meet the Kops.
  260. XThey say that it's a blast when you mix the right potions together.
  261. XThey say that it's not blind luck if you catch a glimpse of Medusa.
  262. XThey say that killing a shopkeeper brings bad luck.
  263. XThey say that monsters never step on a scare monster scroll.
  264. XThey say that most monsters find flute recitals extremely boring.
  265. XThey say that mummy corpses are not well preserved.
  266. XThey say that naturally a wand of wishing would be heavily guarded.
  267. XThey say that no one notices the junk underneath a boulder.
  268. XThey say that nobody expects a unicorn horn to rust.
  269. XThey say that nobody knows if an explorer can live forever.  Do you?
  270. XThey say that nothing can change the fact that some potions contain a djinni.
  271. XThey say that nothing can change the fact that some potions contain a ghost.
  272. XThey say that nymphs always fall for rock'n'roll, try it!
  273. XThey say that once an Olog-Hai is canned it never shows its face again.
  274. XThey say that once upon a time xans would never scratch your boots.
  275. XThey say that only an experienced wizard can do the tengu shuffle.
  276. XThey say that only chaotics can kill shopkeepers and get away with it.
  277. XThey say that playing a horn really bad is really good.
  278. XThey say that rubbing a glowing potion does not make it a magic lamp.
  279. XThey say that scalpels become dull because they're not athames.
  280. XThey say that shopkeepers don't like pick-axes.
  281. XThey say that shopkeepers don't mind you bringing your pets in the shop.
  282. XThey say that shopkeepers don't usually mind if you sneak into a shop.
  283. XThey say that shopkeepers often have a large amount of money in their purses.
  284. XThey say that shopkeepers often remember things that you might forget.
  285. XThey say that sinks and armor don't mix, take your cloak off now!
  286. XThey say that sinks run hot and cold and many flavors in between.
  287. XThey say that snake charmers aren't charismatic, just musical.
  288. XThey say that soldiers are always prepared and usually protected.
  289. XThey say that some eggs could hatch in your pack, lucky or not.
  290. XThey say that some fire ants will make you a hot meal.
  291. XThey say that some horns play hot music and others are too cool for words.
  292. XThey say that some humanoids are nonetheless quite human.
  293. XThey say that some shopkeepers consider gems to be family heirlooms.
  294. XThey say that some shopkeepers recognize gems but they won't tell you.
  295. XThey say that some stones are much much heavier than others.
  296. XThey say that some yetis are full of hot air.
  297. XThey say that something very special would be in a well-protected place.
  298. XThey say that speed boots aren't fast enough to let you walk on water.
  299. XThey say that teleport traps are the devil's work.
  300. XThey say that tengus don't wear rings, why should you?
  301. XThey say that tengus never steal gold although they would be good at it.
  302. XThey say that that which was stolen once can be stolen again, ask any nymph.
  303. XThey say that the Delphic Oracle knows that lizard corpses aren't confusing.
  304. XThey say that the Hand of Elbereth can hold up your prayers.
  305. XThey say that the Leprechaun King is rich as Croesus.
  306. XThey say that the Wizard of Yendor is schizophrenic and suicidal.
  307. XThey say that the experienced character knows how to convert an altar.
  308. XThey say that the gods are happy when they drop objects at your feet.
  309. XThey say that the idea of invisible Nazguls has a certain ring to it.
  310. XThey say that the lady of the lake now lives in a fountain somewhere.
  311. XThey say that the local shopkeeper frowns upon the rude tourist.
  312. XThey say that the only door to the vampire's tower is on its lowest level.
  313. XThey say that the only good djinni is a grateful djinni.
  314. XThey say that the road through hell is a one-way street.
  315. XThey say that the road to hell begins with Medusa.
  316. XThey say that the thing about genocide is that it works both ways.
  317. XThey say that the unicorn horn rule is if it ain't broke then don't fix it.
  318. XThey say that the view from a fog cloud is really very moving.
  319. XThey say that the walls in shops are made of extra hard material.
  320. XThey say that there are at least 15 ways to lose a pair of levitation boots.
  321. XThey say that throwing glass gems is the same as throwing rocks.
  322. XThey say that trespassing a boulder is probably beneath you.
  323. XThey say that unicorns are fond of precious gems.
  324. XThey say that prayer at an altar can sometimes make the water there holy.
  325. XThey say that what goes down the drain might come back up.
  326. XThey say that wielded, a long sword named Fire Brand makes you feel cooler.
  327. XThey say that wielded, a long sword named Frost Brand makes you hot stuff.
  328. XThey say that wiping its face is impossible for a floating eye.
  329. XThey say that with a floating eye you could see in the dark.
  330. XThey say that you are lucky if you can get a unicorn to catch a ruby.
  331. XThey say that you are what you eat.
  332. XThey say that you can find named weapons at an altar if you're lucky.
  333. XThey say that you can safely touch cockatrices eggs but why bother?
  334. XThey say that you can't break an amulet of reflection.
  335. XThey say that you don't always get what you wish for.
  336. XThey say that you might find broken smoky potions in the morgue.
  337. XThey say that you should always be prepared for a final challenge.
  338. XThey say that you should ask a dwarf to let you into a locked shop.
  339. XThey say that you should pray for divine inspiration.
  340. XThey say that you should religiously give your gold away.
  341. XThey say that you will never get healthy by eating geckos.
  342. XThey say that zapping yourself with a wand of undead turning is stupid.
  343. XThey say the Wizard's castle is booby-trapped!
  344. XThey say the gods get angry if you pray too much.
  345. XThey say the shopkeepers are insured by Croesus himself!
  346. XThey say there is a powerful magic item hidden in a castle deep down!
  347. XThose who wield a cockatrice corpse have a rocky road ahead of them.
  348. XThrowing food at a wild dog might tame him.
  349. XTo a full belly all food is bad.
  350. XTrolls are described as rubbery:  they keep bouncing back.
  351. XTry the fall-back end-run play against ghosts.
  352. XTry using your magic marker on wet scrolls.
  353. XValkyries come from the north, and have commensurate abilities.
  354. XVampires hate garlic.
  355. XVault guards never disturb their Lords.
  356. XVisitors are requested not to apply genocide to shopkeepers.
  357. XWarning:  people who eat red dragons can go to hell!
  358. XWatch out, the Wizard might come back.
  359. XWater traps have no effect on dragons.
  360. XWhat is a cockatrice going to eat when it gets hungry?
  361. XWhere do you think all those demons come from?  From hell, of course.
  362. XWhere do you think hell is located?  It must be deep, deep down.
  363. XWhy do you suppose they call them MAGIC markers?
  364. XWhy would anybody in his sane mind engrave "Elbereth"?
  365. XWishing too much may bring you too little.
  366. XYou can't leave a shop through the back door:  there ain't one!
  367. XYou may discover a fine spirit inside a potion bottle.
  368. XYou may want to dip into a potion of bottled blessings.
  369. XYou might be able to bribe a demon lord.
  370. XYou might trick a shopkeeper if you're invisible.
  371. XYou should certainly learn about quantum mechanics.
  372. XYou're going into the morgue at midnight???
  373. XYour dog knows what to eat; maybe you should take lessons.
  374. XZap yourself and see what happens...
  375. XZapping a wand of undead turning might bring your dog back to life.
  376. END_OF_FILE
  377. if test 19319 -ne `wc -c <'dat/rumors.tru'`; then
  378.     echo shar: \"'dat/rumors.tru'\" unpacked with wrong size!
  379. fi
  380. # end of 'dat/rumors.tru'
  381. fi
  382. if test -f 'src/rect.c' -a "${1}" != "-c" ; then 
  383.   echo shar: Will not clobber existing file \"'src/rect.c'\"
  384. else
  385. echo shar: Extracting \"'src/rect.c'\" \(3667 characters\)
  386. sed "s/^X//" >'src/rect.c' <<'END_OF_FILE'
  387. X/*    SCCS Id: @(#)rect.c    3.1    90/22/02 */
  388. X/* Copyright (c) 1990 by Jean-Christophe Collet     */
  389. X/* NetHack may be freely redistributed.  See license for details. */
  390. X
  391. X#include "hack.h"
  392. X
  393. Xint FDECL(get_rect_ind, (NhRect *));
  394. X
  395. Xstatic boolean FDECL(intersect, (NhRect *,NhRect *,NhRect *));
  396. X
  397. X    /* 
  398. X     * In this file, we will handle the various rectangle functions we
  399. X     * need for room generation.
  400. X     */
  401. X
  402. X#define    MAXRECT    50
  403. X#define XLIM    4
  404. X#define YLIM    3
  405. X
  406. Xstatic NhRect rect[MAXRECT+1];
  407. Xstatic int rect_cnt;
  408. X
  409. X/* 
  410. X * Initialisation of internal structures. Should be called for every
  411. X * new level to be build...
  412. X */
  413. X
  414. Xvoid
  415. Xinit_rect()
  416. X{
  417. X    rect_cnt = 1;
  418. X    rect[0].lx = rect[0].ly = 0;
  419. X    rect[0].hx = COLNO - 1;
  420. X    rect[0].hy = ROWNO - 1;
  421. X}
  422. X
  423. X/* 
  424. X * Search Index of one precise NhRect.
  425. X * 
  426. X */
  427. X
  428. Xint
  429. Xget_rect_ind(r)
  430. XNhRect *r;
  431. X{
  432. X    register NhRect *rectp;
  433. X    register int lx, ly, hx, hy;
  434. X    register int i;
  435. X
  436. X    lx = r->lx; ly = r->ly;
  437. X    hx = r->hx; hy = r->hy;
  438. X    for (i=0,rectp = &rect[0];i<rect_cnt;i++,rectp++)
  439. X        if ( lx == rectp->lx && ly == rectp->ly &&
  440. X         hx == rectp->hx && hy == rectp->hy)
  441. X        return i;
  442. X    return -1;
  443. X}
  444. X
  445. X/* 
  446. X * Search a free rectangle that include the one given in arg
  447. X */
  448. X
  449. XNhRect *
  450. Xget_rect(r)
  451. XNhRect *r;
  452. X{
  453. X    register NhRect *rectp;
  454. X    register int lx, ly, hx, hy;
  455. X    register int i;
  456. X
  457. X    lx = r->lx; ly = r->ly;
  458. X    hx = r->hx; hy = r->hy;
  459. X    for (i=0,rectp = &rect[0];i<rect_cnt;i++,rectp++)
  460. X        if ( lx >= rectp->lx && ly >= rectp->ly &&
  461. X         hx <= rectp->hx && hy <= rectp->hy)
  462. X        return rectp;
  463. X    return 0;
  464. X}
  465. X
  466. X/* 
  467. X * Get some random NhRect from the list.
  468. X */
  469. X
  470. XNhRect *
  471. Xrnd_rect()
  472. X{
  473. X        return rect_cnt > 0 ? &rect[rn2(rect_cnt)] : 0;
  474. X}
  475. X
  476. X/* 
  477. X * Search intersection between two rectangles (r1 & r2).
  478. X * return TRUE if intersection exist and put it in r3.
  479. X * otherwise returns FALSE
  480. X */
  481. X
  482. Xstatic boolean
  483. Xintersect(r1, r2, r3)
  484. XNhRect *r1, *r2, *r3;
  485. X{
  486. X    if (r2->lx > r1->hx || r2->ly > r1->hy ||
  487. X        r2->hx < r1->lx || r2->hy < r1->ly)
  488. X        return FALSE;
  489. X
  490. X    r3->lx = (r2->lx > r1->lx ? r2->lx : r1->lx);
  491. X    r3->ly = (r2->ly > r1->ly ? r2->ly : r1->ly);
  492. X    r3->hx = (r2->hx > r1->hx ? r1->hx : r2->hx);
  493. X    r3->hy = (r2->hy > r1->hy ? r1->hy : r2->hy);
  494. X
  495. X    if (r3->lx > r3->hx || r3->ly > r3->hy)
  496. X        return FALSE;
  497. X    return TRUE;
  498. X}
  499. X
  500. X/* 
  501. X * Remove a rectangle from the list of free NhRect.
  502. X */
  503. X
  504. Xvoid
  505. Xremove_rect(r)
  506. XNhRect *r;
  507. X{
  508. X    int ind;
  509. X
  510. X    ind = get_rect_ind(r);
  511. X    if ( ind >=0 )
  512. X        rect[ind] = rect[--rect_cnt];
  513. X}
  514. X
  515. X/* 
  516. X * Add a NhRect to the list.
  517. X */
  518. X
  519. Xvoid
  520. Xadd_rect(r)
  521. XNhRect *r;
  522. X{
  523. X    if (rect_cnt >= MAXRECT) {
  524. X#ifdef WIZARD
  525. X        if (wizard) pline("MAXRECT may be too small.");
  526. X#endif
  527. X        return;
  528. X    }
  529. X    /* Check that this NhRect is not included in another one */
  530. X    if (get_rect(r))
  531. X        return;
  532. X    rect[rect_cnt] = *r;
  533. X    rect_cnt++;
  534. X}
  535. X
  536. X/* 
  537. X * Okay, here we have two rectangles (r1 & r2).
  538. X * r1 was already in the list and r2 is included in r1.
  539. X * What we want is to allocate r2, that is split r1 into smaller rectangles
  540. X * then remove it.
  541. X */
  542. X
  543. Xvoid
  544. Xsplit_rects(r1, r2)
  545. XNhRect *r1, *r2;
  546. X{
  547. X    NhRect r, old_r;
  548. X    int i;
  549. X
  550. X    old_r = *r1;
  551. X    remove_rect(r1);
  552. X
  553. X    /* Walk down since rect_cnt & rect[] will change... */
  554. X    for (i=rect_cnt-1; i>=0; i--)
  555. X        if (intersect(&rect[i], r2, &r))
  556. X        split_rects(&rect[i], &r);
  557. X    
  558. X    if (r2->ly - old_r.ly-1 > (old_r.hy < ROWNO - 1 ? 2*YLIM : YLIM+1)+4) {
  559. X        r = old_r;
  560. X        r.hy = r2->ly - 2;
  561. X        add_rect(&r);
  562. X    }
  563. X    if (r2->lx - old_r.lx-1 > (old_r.hx < COLNO - 1 ? 2*XLIM : XLIM+1)+4) {
  564. X        r = old_r;
  565. X        r.hx = r2->lx - 2;
  566. X        add_rect(&r);
  567. X    }
  568. X    if (old_r.hy - r2->hy-1 > (old_r.ly > 0 ? 2*YLIM : YLIM+1)+4) {
  569. X        r = old_r;
  570. X        r.ly = r2->hy + 2;
  571. X        add_rect(&r);
  572. X    }
  573. X    if (old_r.hx - r2->hx-1 > (old_r.lx > 0 ? 2*XLIM : XLIM+1)+4) {
  574. X        r = old_r;
  575. X        r.lx = r2->hx + 2;
  576. X        add_rect(&r);
  577. X    }
  578. X}
  579. X
  580. X/*rect.c*/
  581. END_OF_FILE
  582. if test 3667 -ne `wc -c <'src/rect.c'`; then
  583.     echo shar: \"'src/rect.c'\" unpacked with wrong size!
  584. fi
  585. # end of 'src/rect.c'
  586. fi
  587. if test -f 'src/zap.c1' -a "${1}" != "-c" ; then 
  588.   echo shar: Will not clobber existing file \"'src/zap.c1'\"
  589. else
  590. echo shar: Extracting \"'src/zap.c1'\" \(31925 characters\)
  591. sed "s/^X//" >'src/zap.c1' <<'END_OF_FILE'
  592. X/*    SCCS Id: @(#)zap.c    3.1    92/10/21    */
  593. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  594. X/* NetHack may be freely redistributed.  See license for details. */
  595. X
  596. X#include "hack.h"
  597. X
  598. X/* Disintegration rays have special treatment; corpses are never left.
  599. X * But the routine which calculates the damage is separate from the routine
  600. X * which kills the monster.  The damage routine returns this cookie to
  601. X * indicate that the monster should be disintegrated.
  602. X */
  603. X#define MAGIC_COOKIE 1000
  604. X
  605. Xstatic boolean NEARDATA obj_zapped;
  606. Xstatic int NEARDATA poly_zapped;
  607. X
  608. X#ifdef MUSE
  609. X/* kludge to use mondied instead of killed */
  610. Xextern boolean m_using;
  611. X#endif
  612. X
  613. Xstatic boolean FDECL(obj_resists, (struct obj *));
  614. Xstatic boolean FDECL(obj_shudders, (struct obj *));
  615. Xstatic void FDECL(polyuse,(struct obj*, int, int));
  616. Xstatic void FDECL(do_osshock, (struct obj *));
  617. Xstatic void FDECL(create_polymon, (struct obj *));
  618. Xstatic int FDECL(burn_floor_paper,(int,int));
  619. Xstatic void FDECL(cancel_item,(struct obj *));
  620. Xstatic int FDECL(bhitm, (struct monst *,struct obj *));
  621. X#ifndef MUSE
  622. XSTATIC_PTR int FDECL(bhito,(struct obj *,struct obj *));
  623. X#endif
  624. XSTATIC_PTR int FDECL(bhitpile,(struct obj *,int (*)(OBJ_P,OBJ_P),int,int));
  625. Xstatic void FDECL(backfire,(struct obj *));
  626. Xstatic int FDECL(zhit,(struct monst *,int,int));
  627. X
  628. X#define ZT_MAGIC_MISSILE    (AD_MAGM-1)
  629. X#define ZT_FIRE            (AD_FIRE-1)
  630. X#define ZT_COLD            (AD_COLD-1)
  631. X#define ZT_SLEEP        (AD_SLEE-1)
  632. X#define ZT_DEATH        (AD_DISN-1)    /* or disintegration */
  633. X#define ZT_LIGHTNING        (AD_ELEC-1)
  634. X#define ZT_POISON_GAS        (AD_DRST-1)
  635. X#define ZT_ACID            (AD_ACID-1)
  636. X/* 8 and 9 are currently unassigned */
  637. X
  638. X#define ZT_WAND(x)        (x)
  639. X#define ZT_SPELL(x)        (10+(x))
  640. X#define ZT_BREATH(x)    (20+(x))
  641. X
  642. Xconst char *fl[]= {
  643. X    "magic missile",    /* Wands must be 0-9 */
  644. X    "bolt of fire",
  645. X    "bolt of cold",
  646. X    "sleep ray",
  647. X    "death ray",
  648. X    "bolt of lightning",
  649. X    "",
  650. X    "",
  651. X    "",
  652. X    "",
  653. X
  654. X    "magic missile",    /* Spell equivalents must be 10-19 */
  655. X    "fireball",
  656. X    "cone of cold",
  657. X    "sleep ray",
  658. X    "finger of death",
  659. X    "bolt of lightning",
  660. X    "",
  661. X    "",
  662. X    "",
  663. X    "",
  664. X
  665. X    "blast of missiles",    /* Dragon breath equivalents 20-29*/
  666. X    "blast of fire",
  667. X    "blast of frost",
  668. X    "blast of sleep gas",
  669. X    "blast of disintegration",
  670. X    "blast of lightning",
  671. X    "blast of poison gas",
  672. X    "blast of acid",
  673. X    "",
  674. X    ""
  675. X};
  676. X
  677. X
  678. X/* Routines for IMMEDIATE wands and spells. */
  679. X/* bhitm: monster mtmp was hit by the effect of wand or spell otmp */
  680. Xstatic int
  681. Xbhitm(mtmp, otmp)
  682. Xregister struct monst *mtmp;
  683. Xregister struct obj *otmp;
  684. X{
  685. X    register boolean wake = FALSE;
  686. X#ifdef MULDGN
  687. X    boolean dbldam = (pl_character[0] == 'K') && u.uhave.questart;
  688. X#endif
  689. X    register int dmg;
  690. X
  691. X    switch(otmp->otyp) {
  692. X    case WAN_STRIKING:
  693. X    case SPE_FORCE_BOLT:
  694. X        wake = TRUE;
  695. X        if (u.uswallow || rnd(20) < 10 + find_mac(mtmp)) {
  696. X            dmg = d(2,12);
  697. X#ifdef MULDGN
  698. X            if(dbldam) dmg *= 2;
  699. X#endif
  700. X            hit((otmp->otyp == WAN_STRIKING) ? "wand" :
  701. X                        "spell", mtmp, exclam(dmg));
  702. X            (void) resist(mtmp, otmp->oclass, dmg, TELL);
  703. X        } else miss((otmp->otyp == WAN_STRIKING) ? "wand" :
  704. X                        "spell", mtmp);
  705. X        makeknown(otmp->otyp);
  706. X        break;
  707. X    case WAN_SLOW_MONSTER:
  708. X    case SPE_SLOW_MONSTER:
  709. X        wake = TRUE;
  710. X        if (!resist(mtmp, otmp->oclass, 0, NOTELL)) {
  711. X            if (mtmp->mspeed == MFAST) mtmp->mspeed = 0;
  712. X            else mtmp->mspeed = MSLOW;
  713. X            if (u.uswallow && (mtmp == u.ustuck) &&
  714. X                is_whirly(mtmp->data)) {
  715. X                You("disrupt %s!", mon_nam(mtmp));
  716. X                pline("A huge hole opens up...");
  717. X                expels(mtmp, mtmp->data, TRUE);
  718. X            }
  719. X        }
  720. X        break;
  721. X    case WAN_SPEED_MONSTER:
  722. X        if (!resist(mtmp, otmp->oclass, 0, NOTELL))
  723. X            if (mtmp->mspeed == MSLOW) mtmp->mspeed = 0;
  724. X            else mtmp->mspeed = MFAST;
  725. X        wake = TRUE;
  726. X        break;
  727. X    case WAN_UNDEAD_TURNING:
  728. X    case SPE_TURN_UNDEAD:
  729. X        if (is_undead(mtmp->data)) {
  730. X            dmg = rnd(8);
  731. X#ifdef MULDGN
  732. X            if(dbldam) dmg *= 2;
  733. X#endif
  734. X            if(!resist(mtmp, otmp->oclass, dmg, NOTELL))
  735. X                mtmp->mflee = TRUE;
  736. X            wake = TRUE;
  737. X        }
  738. X        break;
  739. X    case WAN_POLYMORPH:
  740. X    case SPE_POLYMORPH:
  741. X        wake = TRUE;
  742. X        if(!resist(mtmp, otmp->oclass, 0, NOTELL)) {
  743. X            if (!rn2(25)) {
  744. X            if (canseemon(mtmp)) {
  745. X                pline("%s shudders!", Monnam(mtmp));
  746. X                makeknown(otmp->otyp);
  747. X            }
  748. X            /* no corpse after system shock */
  749. X            xkilled(mtmp, 3);
  750. X            }
  751. X            else if (newcham(mtmp, (struct permonst *)0) )
  752. X            if (!Hallucination && (!Blind || sensemon(mtmp)))
  753. X                makeknown(otmp->otyp);
  754. X        }
  755. X        break;
  756. X    case WAN_CANCELLATION:
  757. X    case SPE_CANCELLATION:
  758. X        wake = TRUE;
  759. X        cancel_monst(mtmp, otmp, TRUE, TRUE, FALSE);
  760. X        break;
  761. X    case WAN_TELEPORTATION:
  762. X    case SPE_TELEPORT_AWAY:
  763. X        if(mtmp->ispriest && *in_rooms(mtmp->mx, mtmp->my, TEMPLE)) {
  764. X            pline("%s resists your magic!", Monnam(mtmp));
  765. X            wake = TRUE;
  766. X            break;
  767. X        }
  768. X        wake = TRUE;
  769. X        if(mtmp->isshk) rloc_shk(mtmp);
  770. X        else rloc(mtmp);
  771. X        break;
  772. X    case WAN_MAKE_INVISIBLE:
  773. X        mtmp->minvis = TRUE;
  774. X        newsym(mtmp->mx,mtmp->my);    /* make monster disappear */
  775. X        if (mtmp->wormno) see_wsegs(mtmp); /* and tail too */
  776. X        wake = TRUE;
  777. X        break;
  778. X    case WAN_NOTHING:
  779. X        break;
  780. X    case WAN_PROBING:
  781. X        makeknown(otmp->otyp);
  782. X        mstatusline(mtmp);
  783. X        break;
  784. X    case WAN_OPENING:
  785. X        if(u.uswallow && mtmp == u.ustuck) {
  786. X            if (is_animal(mtmp->data)) {
  787. X                if (Blind) pline("Its mouth opens!");
  788. X                else pline("%s opens its mouth!", Monnam(mtmp));
  789. X            }
  790. X            expels(mtmp, mtmp->data, TRUE);
  791. X            break;
  792. X        }
  793. X    case WAN_LOCKING:
  794. X    case SPE_KNOCK:
  795. X    case SPE_WIZARD_LOCK:
  796. X        break;
  797. X    default:
  798. X        impossible("What an interesting effect (%u)", otmp->otyp);
  799. X    }
  800. X    if(wake) {
  801. X        if(mtmp->mhp > 0) {
  802. X        wakeup(mtmp);
  803. X        m_respond(mtmp);
  804. X        if(mtmp->isshk && !*u.ushops) hot_pursuit(mtmp);
  805. X        } else if(mtmp->m_ap_type)
  806. X        seemimic(mtmp); /* might unblock if mimicing a boulder/door */
  807. X    }
  808. X    return 0;
  809. X}
  810. X
  811. Xstruct monst *
  812. Xrevive(obj,ininv)
  813. Xregister struct obj *obj;
  814. Xboolean ininv;
  815. X{
  816. X    register struct monst *mtmp = (struct monst *)0;
  817. X
  818. X    if(obj->otyp == CORPSE) {
  819. X        int montype = obj->corpsenm;
  820. X        int x = ininv ? u.ux : obj->ox;
  821. X        int y = ininv ? u.uy : obj->oy;
  822. X
  823. X        if (cant_create(&montype)) { /* will make zombie instead */
  824. X            mtmp = makemon(&mons[PM_HUMAN_ZOMBIE], x, y);
  825. X            if (mtmp) {
  826. X                mtmp->mhp = mtmp->mhpmax = 100;
  827. X                mtmp->mspeed = MFAST;
  828. X            }
  829. X        } else {
  830. X            struct obj *otmp;
  831. X#if defined(ARMY) && !defined(MUSE)
  832. X            if (is_mercenary(&mons[montype]))
  833. X                montype = PM_UNARMORED_SOLDIER;
  834. X#endif
  835. X            mtmp = makemon(&mons[montype], x, y);
  836. X            if (mtmp) {
  837. X                /* Monster retains its name */
  838. X                if (obj->onamelth)
  839. X                    mtmp = christen_monst(mtmp, ONAME(obj));
  840. X                /* No inventory for newly revived monsters */
  841. X                while ((otmp = (mtmp->minvent)) != 0) {
  842. X                    mtmp->minvent = otmp->nobj;
  843. X                    dealloc_obj(otmp);
  844. X                }
  845. X            }
  846. X        }
  847. X        if (mtmp && obj->oeaten)
  848. X            mtmp->mhp = eaten_stat(mtmp->mhp, obj);
  849. X        if (ininv) useup(obj);
  850. X        else {
  851. X            /* not useupf(), which charges */
  852. X            if (obj->quan > 1L) obj->quan--;
  853. X            else delobj(obj);
  854. X        }
  855. X        if (x != u.ux || y != u.uy || Invisible)
  856. X            newsym(x, y);
  857. X    }
  858. X    return mtmp;
  859. X}
  860. X
  861. Xstatic const char NEARDATA charged_objs[] = { WAND_CLASS, WEAPON_CLASS, ARMOR_CLASS, 0 };
  862. X
  863. X/* cancel obj, possibly carried by you or a monster */
  864. Xstatic void
  865. Xcancel_item(obj)
  866. Xregister struct obj *obj;
  867. X{
  868. X    boolean    u_ring = (obj == uleft) || (obj == uright);
  869. X
  870. X    switch(obj->otyp) {
  871. X        case RIN_GAIN_STRENGTH:
  872. X            if ((obj->owornmask & W_RING) && u_ring) {
  873. X                ABON(A_STR) -= obj->spe;
  874. X                flags.botl = 1;
  875. X            }
  876. X            break;
  877. X        case RIN_ADORNMENT:
  878. X            if ((obj->owornmask & W_RING) && u_ring) {
  879. X                ABON(A_CHA) -= obj->spe;
  880. X                flags.botl = 1;
  881. X            }
  882. X            break;
  883. X        case RIN_INCREASE_DAMAGE:
  884. X            if ((obj->owornmask & W_RING) && u_ring)
  885. X                u.udaminc -= obj->spe;
  886. X            break;
  887. X        case GAUNTLETS_OF_DEXTERITY:
  888. X            if ((obj->owornmask & W_ARMG) && (obj == uarmg)) {
  889. X                ABON(A_DEX) -= obj->spe;
  890. X                flags.botl = 1;
  891. X            }
  892. X            break;
  893. X        case HELM_OF_BRILLIANCE:
  894. X            if ((obj->owornmask & W_ARMH) && (obj == uarmh)) {
  895. X                ABON(A_INT) -= obj->spe;
  896. X                ABON(A_WIS) -= obj->spe;
  897. X                flags.botl = 1;
  898. X            }
  899. X            break;
  900. X        /* case RIN_PROTECTION: /* not needed */
  901. X    }
  902. X    if(obj->spe &&
  903. X      !(obj->otyp == WAN_CANCELLATION || /* can't cancel cancellation */
  904. X        obj->otyp == TIN || obj->otyp == EGG ||
  905. X        obj->otyp == STATUE ||
  906. X        obj->otyp == MAGIC_LAMP ||
  907. X#ifdef MAIL
  908. X        obj->otyp == SCR_MAIL ||
  909. X#endif
  910. X#ifdef TUTTI_FRUTTI
  911. X        obj->otyp == SLIME_MOLD ||
  912. X#endif
  913. X        obj->otyp == SKELETON_KEY ||
  914. X        obj->otyp == LARGE_BOX || obj->otyp == CHEST))
  915. X        obj->spe = (obj->oclass == WAND_CLASS) ? -1 : 0;
  916. X
  917. X    if (obj->otyp == OIL_LAMP || obj->otyp == BRASS_LANTERN
  918. X        || Is_candle(obj) || obj->otyp == CANDELABRUM_OF_INVOCATION) {
  919. X
  920. X        /* reducing a candle's age to 0 is */
  921. X        /* the same as destroying it.      */
  922. X        if (!Is_candle(obj)) obj->age = 0;
  923. X
  924. X        /* reducing a candelabrum age to 0 */
  925. X        /* is the same as de-candling it.  */
  926. X        if(obj->otyp == CANDELABRUM_OF_INVOCATION) obj->spe = 0;
  927. X
  928. X        obj->lamplit = 0;
  929. X        check_lamps();
  930. X    }
  931. X
  932. X    if (obj->oclass == SCROLL_CLASS
  933. X#ifdef MAIL
  934. X        && obj->otyp != SCR_MAIL
  935. X#endif
  936. X       )
  937. X        obj->otyp = SCR_BLANK_PAPER;
  938. X
  939. X    if (obj->oclass == SPBOOK_CLASS && obj->otyp != SPE_BOOK_OF_THE_DEAD)
  940. X        obj->otyp = SPE_BLANK_PAPER;
  941. X
  942. X    if (obj->oclass == POTION_CLASS && obj->otyp != POT_BOOZE)
  943. X        obj->otyp = (obj->otyp==POT_SICKNESS || obj->otyp==POT_SEE_INVISIBLE || obj->otyp==POT_FRUIT_JUICE) ? POT_FRUIT_JUICE : POT_WATER;
  944. X        /* sickness is "biologically contaminated" fruit juice; cancel it
  945. X         * and it just becomes fruit juice... whereas see invisible
  946. X         * tastes like "enchanted" fruit juice, it similarly cancels.
  947. X         */
  948. X    unbless(obj);
  949. X    uncurse(obj);
  950. X}
  951. X
  952. Xstatic boolean
  953. Xobj_resists(obj)
  954. Xstruct obj *obj;
  955. X{
  956. X    if (obj->otyp == AMULET_OF_YENDOR ||
  957. X        obj->otyp == SPE_BOOK_OF_THE_DEAD ||
  958. X        obj->otyp == CANDELABRUM_OF_INVOCATION ||
  959. X        obj->otyp == BELL_OF_OPENING ||
  960. X        (obj->otyp == CORPSE && is_rider(&mons[obj->corpsenm]))) {
  961. X        return TRUE;
  962. X    } else {
  963. X        int chance = rn2(20);
  964. X        /* artifacts resist 95% of the time; normal objects 5% */
  965. X        return (obj->oartifact ? !!chance : !chance);
  966. X    }
  967. X}
  968. X
  969. Xstatic boolean
  970. Xobj_shudders(obj)
  971. Xstruct obj *obj;
  972. X{
  973. X    int    zap_odds;
  974. X
  975. X    if (obj->oclass == WAND_CLASS)
  976. X        zap_odds = 3;    /* half-life = 2 zaps */
  977. X    else if (obj->cursed)
  978. X        zap_odds = 3;    /* half-life = 2 zaps */
  979. X    else if (obj->blessed)
  980. X        zap_odds = 12;    /* half-life = 8 zaps */
  981. X    else
  982. X        zap_odds = 8;    /* half-life = 6 zaps */
  983. X
  984. X    /* adjust for "large" quantities of identical things */
  985. X    if(obj->quan > 4L) zap_odds /= 2;
  986. X
  987. X    return (! rn2(zap_odds));
  988. X}
  989. X
  990. X/* Use up at least minwt number of things made of material mat.
  991. X * There's also a chance that other stuff will be used up.  Finally,
  992. X * there's a random factor here to keep from always using the stuff
  993. X * at the top of the pile.
  994. X */
  995. Xstatic void
  996. Xpolyuse(objhdr, mat, minwt)
  997. X    struct obj *objhdr;
  998. X    int mat, minwt;
  999. X{
  1000. X    register struct obj *otmp, *otmp2;
  1001. X
  1002. X    for(otmp = objhdr; minwt > 0 && otmp; otmp = otmp2) {
  1003. X    otmp2 = otmp->nexthere;
  1004. X    if((objects[otmp->otyp].oc_material == mat) == (rn2(minwt+1) != 0)) {
  1005. X        /* appropriately add damage to bill */
  1006. X        if (costly_spot(otmp->ox, otmp->oy))
  1007. X        if (*u.ushops)
  1008. X            addtobill(otmp, FALSE, FALSE, FALSE);
  1009. X        else
  1010. X            (void)stolen_value(otmp, 
  1011. X                       otmp->ox, otmp->oy, FALSE, FALSE);
  1012. X        minwt -= (int)otmp->quan;
  1013. X        delobj(otmp);
  1014. X    }
  1015. X    }
  1016. X}
  1017. X
  1018. X/*
  1019. X * Polymorph some of the stuff in this pile into a monster, preferably
  1020. X * a golem of some sort.
  1021. X */
  1022. Xstatic void
  1023. Xcreate_polymon(obj)
  1024. X    struct obj *obj;
  1025. X{
  1026. X    struct permonst *mdat = (struct permonst *)0;
  1027. X    struct monst *mtmp;
  1028. X    int pm_index;
  1029. X
  1030. X    /* no golems if you zap only one object -- not enough stuff */
  1031. X    if(!obj || (!obj->nexthere && obj->quan == 1L)) return;
  1032. X
  1033. X    /* some of these choices are arbitrary */
  1034. X    switch(poly_zapped) {
  1035. X    case IRON:
  1036. X    case METAL:
  1037. X    case MITHRIL:
  1038. X        pm_index = PM_IRON_GOLEM;
  1039. X        break;
  1040. X    case COPPER:
  1041. X    case SILVER:
  1042. X    case GOLD:
  1043. X    case PLATINUM:
  1044. X    case GEMSTONE:
  1045. X    case GLASS:
  1046. X    case MINERAL:
  1047. X        pm_index = rn2(2) ? PM_STONE_GOLEM : PM_CLAY_GOLEM;
  1048. X        break;
  1049. X    case 0:
  1050. X        /* there is no flesh type, but all food is type 0, so we use it */
  1051. X        pm_index = PM_FLESH_GOLEM;
  1052. X        break;
  1053. X    case WOOD:
  1054. X        pm_index = PM_WOOD_GOLEM;
  1055. X        break;
  1056. X    case LEATHER:
  1057. X        pm_index = PM_LEATHER_GOLEM;
  1058. X        break;
  1059. X    case CLOTH:
  1060. X        pm_index = PM_ROPE_GOLEM;
  1061. X        break;
  1062. X    default:
  1063. X        /* if all else fails... */
  1064. X        pm_index = PM_STRAW_GOLEM;
  1065. X        break;
  1066. X    }
  1067. X
  1068. X    if (! (mons[pm_index].geno & G_GENOD))
  1069. X        mdat = &mons[pm_index];
  1070. X
  1071. X    mtmp = makemon(mdat, obj->ox, obj->oy);
  1072. X    polyuse(obj, poly_zapped, (int)mons[pm_index].cwt);
  1073. X
  1074. X    if(!Blind && mtmp) {
  1075. X        pline("Some objects in the pile merge.");
  1076. X        pline("%s rises from the pile!", Amonnam(mtmp));
  1077. X    }
  1078. X}
  1079. X
  1080. Xstatic void
  1081. Xdo_osshock(obj)
  1082. Xstruct obj *obj;
  1083. X{
  1084. X    long i;
  1085. X    obj_zapped = TRUE;
  1086. X
  1087. X    if(poly_zapped < 0) {
  1088. X        /* some may metamorphosize */
  1089. X        for(i=obj->quan; i; i--)
  1090. X        if (! rn2(Luck + 45)) {
  1091. X            poly_zapped = objects[obj->otyp].oc_material;
  1092. X            break;
  1093. X        }
  1094. X    }
  1095. X
  1096. X    /* if quan > 1 then some will survive intact */
  1097. X    if (obj->quan > 1L) {
  1098. X        struct obj *obj2;
  1099. X
  1100. X        obj2 = splitobj(obj, (long)rnd((int)obj->quan - 1));
  1101. X        move_object(obj2, obj->ox, obj->oy);
  1102. X    }
  1103. X
  1104. X    /* appropriately add damage to bill */
  1105. X    if (costly_spot(obj->ox, obj->oy))
  1106. X        if (*u.ushops)
  1107. X            addtobill(obj, FALSE, FALSE, FALSE);
  1108. X        else
  1109. X            (void)stolen_value(obj, 
  1110. X                       obj->ox, obj->oy, FALSE, FALSE);
  1111. X
  1112. X    /* zap the object */
  1113. X    delobj(obj);
  1114. X}
  1115. X
  1116. X#ifndef MUSE
  1117. XSTATIC_PTR
  1118. X#endif
  1119. Xint
  1120. Xbhito(obj, otmp)    /* object obj was hit by the effect of wand otmp */
  1121. Xregister struct obj *obj, *otmp;    /* returns TRUE if sth was done */
  1122. X{
  1123. X    register int res = 1;
  1124. X    struct obj *otmp2;
  1125. X
  1126. X    if(obj == uball || obj == uchain)
  1127. X        res = 0;
  1128. X    else
  1129. X    switch(otmp->otyp) {
  1130. X    case WAN_POLYMORPH:
  1131. X    case SPE_POLYMORPH:
  1132. X        if (obj_resists(obj)) {
  1133. X            res = 0;
  1134. X            break;
  1135. X        } else if (obj_shudders(obj)) {
  1136. X            if (cansee(obj->ox, obj->oy))
  1137. X            makeknown(otmp->otyp);
  1138. X            do_osshock(obj);
  1139. X            break;
  1140. X        }
  1141. X
  1142. X        /* preserve symbol and quantity */
  1143. X        otmp2 = mkobj_at(obj->oclass, obj->ox, obj->oy, FALSE);
  1144. X        otmp2->quan = obj->quan;
  1145. X        /* preserve the shopkeepers (lack of) interest */
  1146. X        otmp2->no_charge = obj->no_charge;
  1147. X#ifdef MAIL
  1148. X        /* You can't send yourself 100 mail messages and then
  1149. X         * polymorph them into useful scrolls
  1150. X         */
  1151. X        if (obj->otyp == SCR_MAIL) {
  1152. X            otmp2->otyp = SCR_MAIL;
  1153. X            otmp2->spe = 1;
  1154. X        }
  1155. X#endif
  1156. X
  1157. X        /* avoid abusing eggs laid by you */
  1158. X        if (obj->otyp == EGG && obj->spe) {
  1159. X            otmp2->otyp = EGG;
  1160. X            otmp2->spe = 1;
  1161. X            otmp2->corpsenm = random_monster();
  1162. X            while (!lays_eggs(&mons[otmp2->corpsenm]))
  1163. X                otmp2->corpsenm = random_monster();
  1164. X        }
  1165. X
  1166. X        /* keep special fields (including charges on wands) */
  1167. X        if (index(charged_objs, otmp2->oclass)) otmp2->spe = obj->spe;
  1168. X
  1169. X        otmp2->cursed = obj->cursed;
  1170. X        otmp2->blessed = obj->blessed;
  1171. X        otmp2->oeroded = obj->oeroded;
  1172. X        otmp2->oerodeproof = obj->oerodeproof;
  1173. X
  1174. X        /* Keep chest/box traps and poisoned ammo if we may */
  1175. X        if (obj->otrapped && Is_box(otmp2))
  1176. X            otmp2->otrapped = TRUE;
  1177. X        if (obj->opoisoned &&
  1178. X            (otmp2->oclass == WEAPON_CLASS && otmp2->otyp <= SHURIKEN))
  1179. X            otmp2->opoisoned = TRUE;
  1180. X
  1181. X        if (obj->otyp == CORPSE) {
  1182. X        /* turn crocodile corpses into shoes */
  1183. X            if (obj->corpsenm == PM_CROCODILE) {
  1184. X            otmp2->otyp = LOW_BOOTS;
  1185. X            otmp2->oclass = ARMOR_CLASS;
  1186. X            otmp2->spe = 0;
  1187. X            otmp2->oerodeproof = TRUE;
  1188. X            otmp2->quan = 1L;
  1189. X            otmp2->cursed = FALSE;
  1190. X            }
  1191. X        }
  1192. X
  1193. X        /* no box contents --KAA */
  1194. X        if (Is_container(otmp2) || otmp2->otyp == STATUE)
  1195. X            delete_contents(otmp2);
  1196. X
  1197. X        /* 'n' merged objects may be fused into 1 object */
  1198. X        if (otmp2->quan > 1L &&
  1199. X            (!objects[otmp2->otyp].oc_merge ||
  1200. X                otmp2->quan > (long)rn2(1000)))
  1201. X            otmp2->quan = 1L;
  1202. X
  1203. X        if(otmp2->otyp == MAGIC_LAMP) otmp2->otyp = OIL_LAMP;
  1204. X
  1205. X        while(otmp2->otyp == WAN_WISHING ||
  1206. X                        otmp2->otyp == WAN_POLYMORPH)
  1207. X            otmp2->otyp = rnd_class(WAN_LIGHT, WAN_LIGHTNING);
  1208. X
  1209. X        /* update the weight */
  1210. X        otmp2->owt = weight(otmp2);
  1211. X
  1212. X        if(costly_spot(obj->ox, obj->oy)) {
  1213. X            register struct monst *shkp =
  1214. X                  shop_keeper(*in_rooms(obj->ox, obj->oy, SHOPBASE));
  1215. X
  1216. X            if ((!obj->no_charge ||
  1217. X             (Is_container(obj) &&
  1218. X                (contained_cost(obj, shkp, 0L, FALSE) != 0L)))
  1219. X               && inhishop(shkp)) {
  1220. X                if(shkp->mpeaceful) {
  1221. X                if(*u.ushops && *in_rooms(u.ux, u.uy, 0) ==
  1222. X                        *in_rooms(shkp->mx, shkp->my, 0) &&
  1223. X                        !costly_spot(u.ux, u.uy))
  1224. X                make_angry_shk(shkp, obj->ox, obj->oy);
  1225. X                else {
  1226. X                    pline("%s gets angry!", Monnam(shkp));
  1227. X                hot_pursuit(shkp);
  1228. X                }
  1229. X            } else Norep("%s is furious!", Monnam(shkp));
  1230. X            }
  1231. X        }
  1232. X        delobj(obj);
  1233. X        break;
  1234. X    case WAN_STRIKING:
  1235. X    case SPE_FORCE_BOLT:
  1236. X        if (obj->otyp == BOULDER)
  1237. X            fracture_rock(obj);
  1238. X        else if (obj->otyp == STATUE)
  1239. X            (void) break_statue(obj);
  1240. X        else
  1241. X            res = 0;
  1242. X        makeknown(otmp->otyp);
  1243. X        break;
  1244. X    case WAN_CANCELLATION:
  1245. X    case SPE_CANCELLATION:
  1246. X        cancel_item(obj);
  1247. X        break;
  1248. X    case WAN_TELEPORTATION:
  1249. X    case SPE_TELEPORT_AWAY:
  1250. X        rloco(obj);
  1251. X        break;
  1252. X    case WAN_MAKE_INVISIBLE:
  1253. X        obj->oinvis = TRUE;
  1254. X        newsym(obj->ox,obj->oy);    /* make object disappear */
  1255. X        break;
  1256. X    case WAN_UNDEAD_TURNING:
  1257. X    case SPE_TURN_UNDEAD:
  1258. X        res = !!revive(obj,FALSE);
  1259. X        break;
  1260. X    case WAN_OPENING:
  1261. X    case SPE_KNOCK:
  1262. X        /* Zap it at the chain, not the ball */
  1263. X        if (obj == uchain) {
  1264. X            unpunish();
  1265. X            res = 1;
  1266. X            makeknown(obj->otyp);
  1267. X            break;
  1268. X        }
  1269. X        /* fall through */
  1270. X    case WAN_LOCKING:
  1271. X    case SPE_WIZARD_LOCK:
  1272. X        if(Is_box(obj))
  1273. X            res = boxlock(obj, otmp);
  1274. X        else
  1275. X            res = 0;
  1276. X        if (res /* && obj->oclass == WAND_CLASS */)
  1277. X            makeknown(obj->otyp);
  1278. X        break;
  1279. X    case WAN_SLOW_MONSTER:        /* no effect on objects */
  1280. X    case SPE_SLOW_MONSTER:
  1281. X    case WAN_SPEED_MONSTER:
  1282. X    case WAN_NOTHING:
  1283. X    case WAN_PROBING:
  1284. X        res = 0;
  1285. X        break;
  1286. X    default:
  1287. X        impossible("What an interesting effect (%u)", otmp->otyp);
  1288. X    }
  1289. X    return(res);
  1290. X}
  1291. X
  1292. XSTATIC_PTR
  1293. Xint
  1294. Xbhitpile(obj,fhito,tx,ty)
  1295. X    register struct obj *obj;    /* returns nonzero of something was hit */
  1296. X    int FDECL((*fhito), (OBJ_P, OBJ_P));
  1297. X    int tx, ty;
  1298. X{
  1299. X    int hitanything = 0;
  1300. X    register struct obj *otmp, *next_obj = (struct obj *)0;
  1301. X
  1302. X    /* modified by GAN to hit all objects */
  1303. X    /* pre-reverse the polymorph pile,  -dave- 3/90 */
  1304. X    poly_zapped = -1;
  1305. X    if(obj->otyp == SPE_POLYMORPH || obj->otyp == WAN_POLYMORPH) {
  1306. X    otmp = level.objects[tx][ty];
  1307. X    level.objects[tx][ty] = next_obj;
  1308. X    while(otmp) {
  1309. X        next_obj = otmp->nexthere;
  1310. X        otmp->nexthere = level.objects[tx][ty];
  1311. X        level.objects[tx][ty] = otmp;
  1312. X        otmp = next_obj;
  1313. X    }
  1314. X    }
  1315. X    for(otmp = level.objects[tx][ty]; otmp; otmp = next_obj) {
  1316. X    /* Fix for polymorph bug, Tim Wright */
  1317. X    next_obj = otmp->nexthere;
  1318. X    hitanything += (*fhito)(otmp, obj);
  1319. X    }
  1320. X    if(poly_zapped >= 0)
  1321. X    create_polymon(level.objects[tx][ty]);
  1322. X
  1323. X    return hitanything;
  1324. X}
  1325. X
  1326. X/*
  1327. X * zappable - returns 1 if zap is available, 0 otherwise.
  1328. X *          it removes a charge from the wand if zappable.
  1329. X * added by GAN 11/03/86
  1330. X */
  1331. Xint
  1332. Xzappable(wand)
  1333. Xregister struct obj *wand;
  1334. X{
  1335. X    if(wand->spe < 0 || (wand->spe == 0 && rn2(121)))
  1336. X        return 0;
  1337. X    if(wand->spe == 0)
  1338. X        You("wrest one more spell from the worn-out wand.");
  1339. X    wand->spe--;
  1340. X    return 1;
  1341. X}
  1342. X
  1343. X/*
  1344. X * zapnodir - zaps a NODIR wand/spell.
  1345. X * added by GAN 11/03/86
  1346. X */
  1347. Xvoid
  1348. Xzapnodir(obj)
  1349. Xregister struct obj *obj;
  1350. X{
  1351. X    switch(obj->otyp) {
  1352. X        case WAN_LIGHT:
  1353. X        case SPE_LIGHT:
  1354. X            litroom(TRUE,obj);
  1355. X            break;
  1356. X        case WAN_SECRET_DOOR_DETECTION:
  1357. X        case SPE_DETECT_UNSEEN:
  1358. X            if(!findit()) return;
  1359. X            break;
  1360. X        case WAN_CREATE_MONSTER:
  1361. X            { register int cnt = 1;
  1362. X            if(!rn2(23)) cnt += rn2(7) + 1;
  1363. X            while(cnt--)
  1364. X                (void) makemon((struct permonst *) 0, u.ux, u.uy);
  1365. X            }
  1366. X            break;
  1367. X        case WAN_WISHING:
  1368. X            if(Luck + rn2(5) < 0) {
  1369. X                pline("Unfortunately, nothing happens.");
  1370. X                break;
  1371. X            }
  1372. X            makewish();
  1373. X            break;
  1374. X    }
  1375. X    if (!objects[obj->otyp].oc_name_known &&
  1376. X        (!Blind || obj->otyp == WAN_WISHING)) {
  1377. X            makeknown(obj->otyp);
  1378. X            more_experienced(0,10);
  1379. X    }
  1380. X}
  1381. X
  1382. Xstatic void
  1383. Xbackfire(otmp)
  1384. X
  1385. X    register struct obj * otmp;
  1386. X{
  1387. X    pline("%s suddenly explodes!", The(xname(otmp)));
  1388. X    losehp(d(otmp->spe+2,6), "exploding wand", KILLED_BY_AN);
  1389. X    useup(otmp);
  1390. X}
  1391. X
  1392. Xstatic const char NEARDATA zap_syms[] = { WAND_CLASS, 0 };
  1393. X
  1394. Xint
  1395. Xdozap()
  1396. X{
  1397. X    register struct obj *obj;
  1398. X    int    damage;
  1399. X
  1400. X    if(check_capacity(NULL)) return(0);
  1401. X    obj = getobj(zap_syms, "zap");
  1402. X    if(!obj) return(0);
  1403. X
  1404. X    check_unpaid(obj);
  1405. X
  1406. X    /* zappable addition done by GAN 11/03/86 */
  1407. X    if(!zappable(obj)) pline(nothing_happens);
  1408. X    else if(obj->cursed && !rn2(100)) {
  1409. X        backfire(obj);    /* the wand blows up in your face! */
  1410. X        exercise(A_STR, FALSE);
  1411. X        return(1);
  1412. X    } else if(!(objects[obj->otyp].oc_dir == NODIR) && !getdir(NULL)) {
  1413. X        if (!Blind)
  1414. X            pline("%s glows and fades.", The(xname(obj)));
  1415. X        /* make him pay for knowing !NODIR */
  1416. X    } else if(!u.dx && !u.dy && !u.dz && !(objects[obj->otyp].oc_dir == NODIR)) {
  1417. X        if((damage = zapyourself(obj)))
  1418. X        losehp(damage, self_pronoun("zapped %sself with a wand", "him"),
  1419. X            NO_KILLER_PREFIX);
  1420. X    } else {
  1421. X        weffects(obj);
  1422. X    }
  1423. X    if (obj->spe < 0) {
  1424. X        pline ("%s %sturns to dust.",
  1425. X           The(xname(obj)), Blind ? "" : "glows violently, then ");
  1426. X        useup(obj);
  1427. X    }
  1428. X    return(1);
  1429. X}
  1430. X
  1431. Xint
  1432. Xzapyourself(obj)
  1433. X    register struct obj    *obj;
  1434. X{
  1435. X    int    damage = 0;
  1436. X
  1437. X    switch(obj->otyp) {
  1438. X        case WAN_STRIKING:
  1439. X        case SPE_FORCE_BOLT:
  1440. X            if(Antimagic) {
  1441. X            shieldeff(u.ux, u.uy);
  1442. X            pline("Boing!");
  1443. X            } else {
  1444. X            You("magically bash yourself!");
  1445. X            damage=d(8,6);
  1446. X            exercise(A_STR, FALSE);
  1447. X            }
  1448. X            makeknown(obj->otyp);
  1449. X            break;
  1450. X        case WAN_LIGHTNING:
  1451. X            makeknown(WAN_LIGHTNING);
  1452. X            if (!Shock_resistance) {
  1453. X            pline("Idiot!  You've shocked yourself!");
  1454. X            damage = d(12,6);
  1455. X            exercise(A_CON, FALSE);
  1456. X            } else {
  1457. X            shieldeff(u.ux, u.uy);
  1458. X            You("zap yourself, but seem unharmed.");
  1459. X#ifdef POLYSELF
  1460. X            ugolemeffects(AD_ELEC, d(12,6));
  1461. X#endif
  1462. X            }
  1463. X            destroy_item(WAND_CLASS, AD_ELEC);
  1464. X            destroy_item(RING_CLASS, AD_ELEC);
  1465. X            if(!Blind) {
  1466. X                You("are blinded by the flash!");
  1467. X                make_blinded((long)rnd(100),FALSE);
  1468. X            }
  1469. X            break;
  1470. X        case SPE_FIREBALL:
  1471. X            You("explode a fireball on top of yourself!");
  1472. X            explode(u.ux, u.uy, 11, d(6,6), WAND_CLASS);
  1473. X            break;
  1474. X        case WAN_FIRE:
  1475. X            makeknown(WAN_FIRE);
  1476. X        case FIRE_HORN:
  1477. X            pline("You've set light to yourself!");
  1478. X            if (Fire_resistance) {
  1479. X            shieldeff(u.ux, u.uy);
  1480. X            You("feel mildly hot.");
  1481. X#ifdef POLYSELF
  1482. X            ugolemeffects(AD_FIRE, d(12,6));
  1483. X#endif
  1484. X            } else
  1485. X            damage = d(12,6);
  1486. X            destroy_item(SCROLL_CLASS, AD_FIRE);
  1487. X            destroy_item(POTION_CLASS, AD_FIRE);
  1488. X            destroy_item(SPBOOK_CLASS, AD_FIRE);
  1489. X            break;
  1490. X        case WAN_COLD:
  1491. X            makeknown(WAN_COLD);
  1492. X        case SPE_CONE_OF_COLD:
  1493. X        case FROST_HORN:
  1494. X            if (Cold_resistance) {
  1495. X            shieldeff(u.ux, u.uy);
  1496. X            You("feel mildly chilly.");
  1497. X#ifdef POLYSELF
  1498. X            ugolemeffects(AD_COLD, d(12,6));
  1499. X#endif
  1500. X            } else {
  1501. X            You("imitate a popsicle!");
  1502. X            damage = d(12,6);
  1503. X            }
  1504. X            destroy_item(POTION_CLASS, AD_COLD);
  1505. X            break;
  1506. X        case WAN_MAGIC_MISSILE:
  1507. X            makeknown(WAN_MAGIC_MISSILE);
  1508. X        case SPE_MAGIC_MISSILE:
  1509. X            if(Antimagic) {
  1510. X            shieldeff(u.ux, u.uy);
  1511. X            pline("The missiles bounce!");
  1512. X            } else {
  1513. X            damage = d(4,6);
  1514. X            pline("Idiot!  You've shot yourself!");
  1515. X            }
  1516. X            break;
  1517. X        case WAN_POLYMORPH:
  1518. X#ifdef POLYSELF
  1519. X            makeknown(WAN_POLYMORPH);
  1520. X#endif
  1521. X        case SPE_POLYMORPH:
  1522. X#ifdef POLYSELF
  1523. X            polyself();
  1524. X#else
  1525. X            newman();
  1526. X#endif
  1527. X            break;
  1528. X        case WAN_CANCELLATION:
  1529. X        case SPE_CANCELLATION:
  1530. X            cancel_monst(&youmonst, obj, TRUE, FALSE, TRUE);
  1531. X            break;
  1532. X           case WAN_MAKE_INVISIBLE: {
  1533. X            /* have to test before changing HInvis but must change
  1534. X             * HInvis before doing newsym().
  1535. X             */
  1536. X            int msg = (!Blind && !Invis && !See_invisible);
  1537. X
  1538. X            HInvis |= FROMOUTSIDE;
  1539. X            if (msg) {
  1540. X            makeknown(WAN_MAKE_INVISIBLE);
  1541. X            newsym(u.ux, u.uy);
  1542. X            pline(Hallucination ?
  1543. X             "Far out, man!  You can see right through yourself!" :
  1544. X             "Gee!  All of a sudden, you can't see yourself.");
  1545. X            }
  1546. X            break;
  1547. X        }
  1548. X           case WAN_SPEED_MONSTER:
  1549. X            if (!(Fast & INTRINSIC)) {
  1550. X            You("seem to be moving faster.");
  1551. X            makeknown(WAN_SPEED_MONSTER);
  1552. X            exercise(A_DEX, TRUE);
  1553. X            }
  1554. X            Fast |= FROMOUTSIDE;
  1555. X            break;
  1556. X           case WAN_SLEEP:
  1557. X            makeknown(WAN_SLEEP);
  1558. X        case SPE_SLEEP:
  1559. X            if(Sleep_resistance) {
  1560. X            shieldeff(u.ux, u.uy);
  1561. X            You("don't feel sleepy!");
  1562. X            } else {
  1563. X            pline("The sleep ray hits you!");
  1564. X            nomul(-rn2(50));
  1565. X            u.usleep = 1;
  1566. X            nomovemsg = "You wake up.";
  1567. X            }
  1568. X            break;
  1569. X        case WAN_SLOW_MONSTER:
  1570. X        case SPE_SLOW_MONSTER:
  1571. X            if(Fast & (TIMEOUT | INTRINSIC)) {
  1572. X            Fast &= ~(TIMEOUT | INTRINSIC);
  1573. X            You("seem to be moving slower.");
  1574. X            exercise(A_DEX, FALSE);
  1575. X            }
  1576. X            break;
  1577. X        case WAN_TELEPORTATION:
  1578. X        case SPE_TELEPORT_AWAY:
  1579. X            tele();
  1580. X            break;
  1581. X        case WAN_DEATH:
  1582. X        case SPE_FINGER_OF_DEATH:
  1583. X#ifdef POLYSELF
  1584. X            if (is_undead(uasmon)) {
  1585. X            pline((obj->otyp == WAN_DEATH) ?
  1586. X              "The wand shoots an apparently harmless beam at you."
  1587. X              : "You seem no deader than before.");
  1588. X            break;
  1589. X            }
  1590. X#endif
  1591. X            killer_format = NO_KILLER_PREFIX;
  1592. X            killer = self_pronoun("shot %sself with a death ray","him");
  1593. X            You("irradiate yourself with pure energy!");
  1594. X            You("die.");
  1595. X            makeknown(WAN_DEATH);
  1596. X            /* They might survive with an amulet of life saving */
  1597. X            done(DIED);
  1598. X            break;
  1599. X        case SPE_TURN_UNDEAD:
  1600. X        case WAN_UNDEAD_TURNING:
  1601. X#ifdef POLYSELF
  1602. X            if (is_undead(uasmon)) {
  1603. X            You("feel frightened and %sstunned.",
  1604. X                 Stunned ? "even more " : "");
  1605. X            make_stunned(HStun + rnd(30), FALSE);
  1606. X            }
  1607. X#endif
  1608. X            break;
  1609. X        case SPE_DIG:
  1610. X        case SPE_DETECT_UNSEEN:
  1611. X        case WAN_DIGGING:
  1612. X        case WAN_NOTHING:
  1613. X        case WAN_OPENING:
  1614. X        case WAN_LOCKING:
  1615. X        case SPE_KNOCK:
  1616. X        case SPE_WIZARD_LOCK:
  1617. X            break;
  1618. X        case WAN_PROBING:
  1619. X            makeknown(WAN_PROBING);
  1620. X            ustatusline();
  1621. X            break;
  1622. X        default: impossible("object %d used?",obj->otyp);
  1623. X    }
  1624. X    return(damage);
  1625. X}
  1626. X
  1627. X/*
  1628. X * cancel a monster (possibly the hero).  inventory is cancelled only
  1629. X * if the monster is zapping itself directly, since otherwise the
  1630. X * effect is too strong.  currently non-hero monsters do not zap
  1631. X * themselves with cancellation.
  1632. X */
  1633. Xvoid
  1634. Xcancel_monst(mdef, obj, youattack, allow_cancel_kill, self_cancel)
  1635. Xregister struct monst    *mdef;
  1636. Xregister struct obj    *obj;
  1637. Xboolean            youattack, allow_cancel_kill, self_cancel;
  1638. X{
  1639. X    boolean    youdefend = (mdef == &youmonst);
  1640. X    static const char writing_vanishes[] =
  1641. X                "Some writing vanishes from %s head!";
  1642. X    static const char your[] = "your";    /* should be extern */
  1643. X
  1644. X    if (youdefend ? (!youattack && Antimagic)
  1645. X              : resist(mdef, obj->oclass, 0, NOTELL))
  1646. X        return;        /* resisted cancellation */
  1647. X
  1648. X    if (self_cancel) {    /* 1st cancel inventory */
  1649. X        struct obj *otmp;
  1650. X
  1651. X        for (otmp = (youdefend ? invent : mdef->minvent);
  1652. X                otmp; otmp = otmp->nobj)
  1653. X        cancel_item(otmp);
  1654. X        if (youdefend) {
  1655. X        flags.botl = 1;    /* potential AC change */
  1656. X        find_ac();
  1657. X        }
  1658. X    }
  1659. X
  1660. X    /* now handle special cases */
  1661. X    if (youdefend) {
  1662. X#ifdef POLYSELF
  1663. X        if (u.mtimedone) {
  1664. X        if ((u.umonnum == PM_CLAY_GOLEM) && !Blind)
  1665. X            pline(writing_vanishes, your);
  1666. X        rehumanize();
  1667. X        }
  1668. X#endif
  1669. X    } else {
  1670. X        mdef->mcan = TRUE;
  1671. X
  1672. X        if (is_were(mdef->data) && mdef->data->mlet != S_HUMAN)
  1673. X        were_change(mdef);
  1674. X
  1675. X        if (mdef->data == &mons[PM_CLAY_GOLEM]) {
  1676. X        if (canseemon(mdef))
  1677. X            pline(writing_vanishes, s_suffix(mon_nam(mdef)));
  1678. X
  1679. X        if (allow_cancel_kill) {
  1680. X            if (youattack)
  1681. X            killed(mdef);
  1682. X            else
  1683. X            monkilled(mdef, "", AD_SPEL);
  1684. X        }
  1685. X        }
  1686. X    }
  1687. X}
  1688. X
  1689. X/* called for various wand and spell effects - M. Stephenson */
  1690. Xvoid
  1691. Xweffects(obj)
  1692. Xregister struct    obj    *obj;
  1693. X{
  1694. X    xchar zx,zy;
  1695. X
  1696. X    exercise(A_WIS, TRUE);
  1697. X    if(objects[obj->otyp].oc_dir == IMMEDIATE) {
  1698. X        obj_zapped = FALSE;
  1699. X
  1700. X        if(u.uswallow)    (void)bhitm(u.ustuck, obj);
  1701. X        else if(u.dz) {
  1702. X        if(u.dz > 0) {
  1703. X            if(levl[u.ux][u.uy].typ == DRAWBRIDGE_DOWN &&
  1704. X               (obj->otyp == WAN_LOCKING
  1705. X               || obj->otyp == SPE_WIZARD_LOCK))
  1706. X                close_drawbridge(u.ux, u.uy);
  1707. X            else
  1708. X            (void) bhitpile(obj, bhito, u.ux, u.uy);
  1709. X        }
  1710. X        } else (void) bhit(u.dx,u.dy,rn1(8,6),ZAPPED_WAND,bhitm,bhito,obj);
  1711. X
  1712. X        /* give a clue if obj_zapped */
  1713. X        if (obj_zapped)
  1714. X        You("feel shuddering vibrations.");
  1715. X
  1716. X    } else if(objects[obj->otyp].oc_dir == NODIR) {
  1717. X        zapnodir(obj);
  1718. X    } else {
  1719. X        switch(obj->otyp) {
  1720. X        case WAN_DIGGING:
  1721. X        case SPE_DIG:
  1722. X            /* Original effect (approximately):
  1723. X             * from CORR: dig until we pierce a wall
  1724. X             * from ROOM: piece wall and dig until we reach
  1725. X             * an ACCESSIBLE place.
  1726. X             * Currently: dig for digdepth positions;
  1727. X             * also down on request of Lennart Augustsson.
  1728. X             */
  1729. X            {   register struct rm *room;
  1730. X            register int digdepth; 
  1731. X            register boolean shopdoor, shopwall;
  1732. X
  1733. X            shopdoor = shopwall = FALSE;
  1734. X            if(u.uswallow) {
  1735. X                register struct monst *mtmp = u.ustuck;
  1736. X
  1737. X                if (!is_whirly(mtmp->data)) {
  1738. X                    if (is_animal(mtmp->data))
  1739. X                        You("pierce %s stomach wall!",
  1740. X                               s_suffix(mon_nam(mtmp)));
  1741. X                    mtmp->mhp = 1;    /* almost dead */
  1742. X                    expels(mtmp, mtmp->data,
  1743. X                           !is_animal(mtmp->data));
  1744. X                }
  1745. X                break;
  1746. X            }
  1747. X            if(u.dz) {
  1748. X                if(!Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz) &&
  1749. X                   !Underwater) {
  1750. X                if(u.dz < 0 || On_stairs(u.ux, u.uy)) {
  1751. X                    if(On_stairs(u.ux, u.uy))
  1752. X                    pline(
  1753. X            "The beam bounces off the %s and hits the ceiling.",
  1754. X                          (u.ux == xdnladder ||
  1755. X                           u.ux == xupladder) ?
  1756. X                          "ladder" : "stairs");
  1757. X                    You("loosen a rock from the ceiling.");
  1758. X                    pline("It falls on your %s!",
  1759. X                      body_part(HEAD));
  1760. X                    losehp(1, "falling rock", KILLED_BY_AN);
  1761. X                    (void) mksobj_at((int)ROCK, u.ux, u.uy, FALSE);
  1762. X                    stackobj(fobj);
  1763. X                    if(Invisible) newsym(u.ux, u.uy);
  1764. X                } else {
  1765. X                    dighole();
  1766. X                }
  1767. X                }
  1768. X                break;
  1769. X            }
  1770. X            zx = u.ux+u.dx;
  1771. X            zy = u.uy+u.dy;
  1772. X            digdepth = 8 + rn2(18);
  1773. X            tmp_at(DISP_BEAM, cmap_to_glyph(S_digbeam));
  1774. X            while(--digdepth >= 0) {
  1775. X                if(!isok(zx,zy)) break;
  1776. X                room = &levl[zx][zy];
  1777. X                tmp_at(zx,zy);
  1778. X                delay_output();    /* wait a little bit */
  1779. X                if(level.flags.is_maze_lev &&
  1780. X                                !Is_earthlevel(&u.uz)) {
  1781. X                if(IS_WALL(room->typ)) {
  1782. X                    if(!(room->diggable & W_NONDIGGABLE)) {
  1783. X                    if(*in_rooms(zx,zy,SHOPBASE)) { 
  1784. X                        add_damage(zx, zy, 200L);
  1785. X                        shopwall = TRUE;
  1786. X                    }
  1787. X                    room->typ = ROOM;
  1788. X                    unblock_point(zx,zy); /* vision */
  1789. X                    } else if(!Blind)
  1790. X                    pline("The wall glows then fades.");
  1791. X                    break;
  1792. X                }
  1793. X                if(room->typ == STONE) {
  1794. X                    if(!(room->diggable & W_NONDIGGABLE)) {
  1795. X                    room->typ = CORR;
  1796. X                    unblock_point(zx,zy); /* vision */
  1797. X                    }else if (!Blind && !Is_airlevel(&u.uz))
  1798. X                    pline("The rock glows then fades.");
  1799. X                    break;
  1800. X                }
  1801. X                } else if(IS_ROCK(room->typ)) {
  1802. X                if(may_dig(zx,zy)) {
  1803. X                    if(IS_WALL(room->typ) ||
  1804. X                       room->typ == SDOOR) {
  1805. X                    if(*in_rooms(zx,zy,SHOPBASE)) {
  1806. X                        add_damage(zx, zy, 200L);
  1807. X                        shopwall = TRUE;
  1808. X                    }
  1809. X                    if (level.flags.is_cavernous_lev) {
  1810. X                        room->typ = CORR;
  1811. X                    } else {
  1812. X                        room->typ = DOOR;
  1813. X                        room->doormask = D_NODOOR;
  1814. X                    }
  1815. X                    digdepth -= 2;
  1816. X                    } else {
  1817. X                    room->typ = CORR;
  1818. X                    digdepth--;
  1819. X                    }
  1820. X                    unblock_point(zx,zy); /* vision */
  1821. X                } else
  1822. X                    break;
  1823. X                } else if(closed_door(zx, zy)) {
  1824. X                if(*in_rooms(zx,zy,SHOPBASE)) {
  1825. X                    shopdoor = TRUE;
  1826. X                    add_damage(zx, zy, 400L);
  1827. X                }
  1828. X                room->doormask = D_NODOOR;
  1829. X                unblock_point(zx,zy); /* vision */
  1830. X                digdepth -= 2;
  1831. X                }
  1832. X                zx += u.dx;
  1833. X                zy += u.dy;
  1834. X            } /* while */
  1835. X            tmp_at(DISP_END,0);    /* closing call */
  1836. X            if(shopdoor || shopwall)
  1837. X                pay_for_damage(shopdoor? "destroy" : "dig into");
  1838. X            break;
  1839. X            }
  1840. X        default:
  1841. X            if((int) obj->otyp >= SPE_MAGIC_MISSILE &&
  1842. X                (int) obj->otyp <= SPE_FINGER_OF_DEATH) {
  1843. X
  1844. X                buzz((int) obj->otyp - SPE_MAGIC_MISSILE + 10,
  1845. X                 (int)u.ulevel / 2 + 1, u.ux, u.uy, u.dx, u.dy);
  1846. X
  1847. X            } else if((int) obj->otyp >= WAN_MAGIC_MISSILE &&
  1848. X                    (int) obj->otyp <= WAN_LIGHTNING) {
  1849. X
  1850. X                buzz((int) obj->otyp - WAN_MAGIC_MISSILE,
  1851. X                (obj->otyp == WAN_MAGIC_MISSILE) ? 2 : 6,
  1852. X                 u.ux, u.uy, u.dx, u.dy);
  1853. X            } else
  1854. X                impossible("weffects: unexpected spell or wand");
  1855. X            break;
  1856. X        }
  1857. X        if(!objects[obj->otyp].oc_name_known) {
  1858. X            makeknown(obj->otyp);
  1859. X            more_experienced(0,10);
  1860. X        }
  1861. X    }
  1862. X    return;
  1863. X}
  1864. X
  1865. END_OF_FILE
  1866. if test 31925 -ne `wc -c <'src/zap.c1'`; then
  1867.     echo shar: \"'src/zap.c1'\" unpacked with wrong size!
  1868. fi
  1869. # end of 'src/zap.c1'
  1870. fi
  1871. echo shar: End of archive 68 \(of 108\).
  1872. cp /dev/null ark68isdone
  1873. MISSING=""
  1874. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  1875. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  1876. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  1877. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  1878. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  1879. 101 102 103 104 105 106 107 108 ; do
  1880.     if test ! -f ark${I}isdone ; then
  1881.     MISSING="${MISSING} ${I}"
  1882.     fi
  1883. done
  1884. if test "${MISSING}" = "" ; then
  1885.     echo You have unpacked all 108 archives.
  1886.     echo "Now execute 'rebuild.sh'"
  1887.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  1888. else
  1889.     echo You still need to unpack the following archives:
  1890.     echo "        " ${MISSING}
  1891. fi
  1892. ##  End of shell archive.
  1893. exit 0
  1894.