home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume16 / nethack31 / part74 (.txt) < prev    next >
LaTeX Document  |  1993-02-06  |  59KB  |  1,742 lines

  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: v16i082:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part74/108
  5. Message-ID: <4445@master.CNA.TEK.COM>
  6. Date: 5 Feb 93 19:19:51 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 2037
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1633
  11. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  12. Posting-number: Volume 16, Issue 82
  13. Archive-name: nethack31/Part74
  14. Supersedes: nethack3p9: Volume 10, Issue 46-102
  15. Environment: Amiga, Atari, Mac, MS-DOS, OS2, Unix, VMS, X11
  16. #! /bin/sh
  17. # This is a shell archive.  Remove anything before this line, then unpack
  18. # it by saving it into a file and typing "sh file".  To overwrite existing
  19. # files, type "sh file -c".  You can also feed this as standard input via
  20. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  21. # will see the following message at the end:
  22. #        "End of archive 74 (of 108)."
  23. # Contents:  doc/Guidebook.te1 src/artifact.c
  24. # Wrapped by billr@saab on Wed Jan 27 16:09:16 1993
  25. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  26. if test -f 'doc/Guidebook.te1' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'doc/Guidebook.te1'\"
  28. echo shar: Extracting \"'doc/Guidebook.te1'\" \(25557 characters\)
  29. sed "s/^X//" >'doc/Guidebook.te1' <<'END_OF_FILE'
  30. X\documentstyle[titlepage]{article}
  31. X\textheight 215mm
  32. X\textwidth 160mm
  33. X\oddsidemargin 0mm
  34. X\evensidemargin 0mm
  35. X\topmargin 0mm
  36. X\newcommand{\nd}{\noindent}
  37. X\newcommand{\tb}[1]{\tt #1 \hfill}
  38. X\newcommand{\bb}[1]{\bf #1 \hfill}
  39. X\newcommand{\ib}[1]{\it #1 \hfill}
  40. X\newcommand{\blist}[1]
  41. X{\begin{list}{$\bullet$}
  42. X    {\leftmargin 30mm \topsep 2mm \partopsep 0mm \parsep 0mm \itemsep 1mm
  43. X     \labelwidth 28mm \labelsep 2mm
  44. X     #1}}
  45. X\newcommand{\elist}{\end{list}}
  46. X% this will make \tt underscores look better, but requires that
  47. X% math subscripts will never be used in this document
  48. X\catcode`\_=12
  49. X\begin{document}
  50. X% input file: guideboo.mn
  51. X%.ds h0 "
  52. X%.ds h1 %.ds h2 \%
  53. X%.ds f0 "
  54. X%.mt
  55. X\title{\LARGE A Guide to the Mazes of Menace:\\
  56. X\Large Guidebook for {\it NetHack\/} 3.1}
  57. X%.au
  58. X\author{Eric S. Raymond\\
  59. X(Extensively edited and expanded for 3.0 by Mike Threepoint)\\
  60. X%.ai
  61. XThyrsus Enterprises\\
  62. XMalvern, PA 19355
  63. X\date{January 9, 1993}
  64. X\maketitle
  65. X%.hn 1
  66. X\section{Introduction}
  67. X%.pg
  68. XYou have just finished your years as a student at the local adventurer's
  69. Xguild.  After much practice and sweat you have finally completed your
  70. Xtraining and are ready to embark upon a perilous adventure.  To prove
  71. Xyour worthiness, the local guildmasters have sent you into the Mazes of
  72. XMenace.  Your quest is to return with the Amulet of Yendor.  According
  73. Xto legend, the gods will grant immortality to the one who recovers this
  74. Xartifact; true or not, its recovery will bring honor and full guild
  75. Xmembership (not to mention the attentions of certain wealthy wizards).
  76. X%.pg
  77. XYour abilities and strengths for dealing with the hazards of adventure
  78. Xwill vary with your background and training.
  79. X%.pg
  80. X\blist{}
  81. X\item[\bb{Archeologists}]%
  82. Xunderstand dungeons pretty well; this enables them
  83. Xto move quickly and sneak up on dungeon nasties.  They start equipped
  84. Xwith proper tools for a scientific expedition.
  85. X%.pg
  86. X\item[\bb{Barbarians}]%
  87. Xare warriors out of the hinterland, hardened to battle.
  88. XThey begin their quests with naught but uncommon strength, a trusty hauberk,
  89. Xand a great two-handed sword.
  90. X%.pg
  91. X\item[\bb{Cavemen {\rm and} Cavewomen}]
  92. Xstart with exceptional strength and neolithic weapons.
  93. X%.pg
  94. X\item[\bb{Elves}]%
  95. Xare agile, quick, and sensitive; very little of what goes
  96. Xon will escape an Elf.  The quality of Elven craftsmanship often gives
  97. Xthem an advantage in arms and armor.
  98. X%.pg
  99. X\item[\bb{Healers}]%
  100. Xare wise in medicine and the apothecary.  They know the
  101. Xherbs and simples that can restore vitality, ease pain, anesthetize,
  102. Xand neutralize
  103. Xpoisons; and with their instruments, they can divine a being's state
  104. Xof health or sickness.  Their medical practice earns them quite reasonable
  105. Xamounts of money, which they enter the dungeon with.
  106. X%.pg
  107. X\item[\bb{Knights}]%
  108. Xare distinguished from the common skirmisher by their
  109. Xdevotion to the ideals of chivalry and by the surpassing excellence of
  110. Xtheir armor.
  111. X%.pg
  112. X\item[\bb{Priests {\rm and} Priestesses}]%
  113. Xare clerics militant, crusaders
  114. Xadvancing the cause of righteousness with arms, armor, and arts
  115. Xthaumaturgic.  Their ability to commune with deities via prayer
  116. Xoccasionally extricates them from peril---but can also put them in it.
  117. X%.pg
  118. X\item[\bb{Rogues}]%
  119. Xare agile and stealthy thieves, who carry daggers, lock
  120. Xpicks, and poisons to put on darts.
  121. X%.pg
  122. X\item[\bb{Samurai}]%
  123. Xare the elite warriors of feudal Nippon.  They are lightly
  124. Xarmored and quick, and wear the %
  125. X{\it dai-sho}, two swords of the deadliest
  126. Xkeenness.
  127. X%.pg
  128. X\item[\bb{Tourists}]%
  129. Xstart out with lots of gold (suitable for shopping with),
  130. Xa credit card, lots of food, some maps, and an expensive camera.  Most
  131. Xmonsters don't like being photographed.
  132. X%.pg
  133. X\item[\bb{Valkyries}]%
  134. Xare hardy warrior women.  Their upbringing in the harsh
  135. XNorthlands makes them strong and inures them to extremes of cold, and instills
  136. Xin them stealth and cunning.
  137. X%.pg
  138. X\item[\bb{Wizards}]%
  139. Xstart out with a fair selection of magical goodies and
  140. Xa particular affinity for dweomercraft.
  141. X\elist
  142. X%.pg
  143. X\nd You set out for the dungeon and after several days of uneventful
  144. Xtravel, you see the ancient ruins that mark the entrance to the Mazes
  145. Xof Menace.  It is late at night, so you make camp at the entrance and
  146. Xspend the night sleeping under the open skies.  In the morning, you
  147. Xgather your gear, eat what may be your last meal outside, and enter
  148. Xthe dungeon.
  149. X%.hn 1
  150. X\section{What is going on here?}
  151. X%.pg
  152. XYou have just begun a game of {\it NetHack}.  Your goal is to grab as much
  153. Xtreasure as you can, retrieve the Amulet of Yendor, and escape the
  154. XMazes of Menace alive.  On the screen is kept a map of where you have
  155. Xbeen and what you have seen on the current dungeon level; as you
  156. Xexplore more of the level, it appears on the screen in front of you.
  157. X%.pg
  158. XWhen {\it NetHack\/}'s ancestor {\it rogue\/} first appeared, its screen
  159. Xorientation was almost unique among computer fantasy games.  Since
  160. Xthen, screen orientation has become the norm rather than the
  161. Xexception; {\it NetHack\/} continues this fine tradition.  Unlike text
  162. Xadventure games that input commands in pseudo-English sentences and
  163. Xexplain the results in words, {\it NetHack\/} commands are all one or two
  164. Xkeystrokes and the results are displayed graphically on the screen.  A
  165. Xminimum screen size of 24 lines by 80 columns is recommended; if the
  166. Xscreen is larger, only a $21\times80$ section will be used for the map.
  167. X%.pg
  168. X{\it NetHack\/} generates a new dungeon every time you play it; even the
  169. Xauthors still find it an entertaining and exciting game despite
  170. Xhaving won several times.
  171. X%.hn 1
  172. X\section{What do all those things on the screen mean?}
  173. X%.pg
  174. XIn order to understand what is going on in {\it NetHack}, first you must
  175. Xunderstand what {\it NetHack\/} is doing with the screen.  The {\it NetHack\/}
  176. Xscreen replaces the ``You see \ldots'' descriptions of text adventure games.
  177. XFigure 1 is a sample of what a {\it NetHack\/} screen might look like.
  178. X\vbox{
  179. X\begin{verbatim}
  180. X        The bat bites!
  181. X                ------
  182. X                |....|    ----------
  183. X                |.<..|####...@...$.|
  184. X                |....-#   |...B....+
  185. X                |....|    |.d......|
  186. X                ------    -------|--
  187. X        Player the Rambler         St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15  Neutral
  188. X        Dlvl:1  G:0  HP:9(12) Pw:3(3) AC:10 Xp:1/19 T:257 Weak
  189. X\end{verbatim}
  190. X\begin{center}
  191. XFigure 1
  192. X\end{center}
  193. X%.hn 2
  194. X\subsection*{The status lines (bottom)}
  195. X%.pg
  196. XThe bottom two lines of the screen contain several cryptic pieces of
  197. Xinformation describing your current status.  If either status line
  198. Xbecomes longer than the width of the screen, you might not see all of
  199. Xit.  Here are explanations of what the various status items mean
  200. X(though your configuration may not have all the status items listed
  201. Xbelow):
  202. X%.lp
  203. X\blist{}
  204. X\item[\bb{Rank}]
  205. XYour character's name and professional ranking (based on the
  206. Xexperience level, see below).
  207. X%.lp
  208. X\item[\bb{Strength}]
  209. XA measure of your character's strength, one of your six basic
  210. Xattributes.  Your attributes can range from 3 to 18 inclusive
  211. X(occasionally you may get super-strengths of the form 18/xx).  The
  212. Xhigher your strength, the stronger you are.  Strength affects how
  213. Xsuccessfully you perform physical tasks and how much damage you do in
  214. Xcombat.
  215. X%.lp
  216. X\item[\bb{Dexterity}]
  217. XDexterity affects your chances to hit in combat, to avoid traps, and
  218. Xdo other tasks requiring agility or manipulation of objects.
  219. X%.lp
  220. X\item[\bb{Constitution}]
  221. XConstitution affects your ability to withstand injuries and other
  222. Xstrains on your stamina.
  223. X%.lp
  224. X\item[\bb{Intelligence}]
  225. XIntelligence affects your ability to cast spells.
  226. X%.lp
  227. X\item[\bb{Wisdom}]
  228. XWisdom comes from your religious affairs.  It affects your magical energy.
  229. X%.lp
  230. X\item[\bb{Charisma}]
  231. XCharisma affects how certain creatures react toward you.  In
  232. Xparticular, it can affect the prices shopkeepers offer you.
  233. X%.lp
  234. X\item[\bb{Alignment}]
  235. X{\it Lawful}, {\it Neutral\/} or {\it Chaotic}.  Basically, Lawful is
  236. Xgood and Chaotic is evil.  Your alignment influences how other
  237. Xmonsters react toward you.
  238. X%.lp
  239. X\item[\bb{Dungeon Level}]
  240. XHow deep you have gone into the dungeon.  It starts at one and
  241. Xincreases as you go deeper into the dungeon.  The Amulet of Yendor is
  242. Xreputed to be somewhere beneath the twentieth level.
  243. X%.lp
  244. X\item[\bb{Gold}]
  245. XThe number of gold pieces you have.
  246. X%.lp
  247. X\item[\bb{Hit Points}]
  248. XYour current and maximum hit points.  Hit points indicate how much
  249. Xdamage you can take before you die.  The more you get hit in a fight,
  250. Xthe lower they get.  You can regain hit points by resting.  The number
  251. Xin parentheses is the maximum number your hit points can reach.
  252. X%.lp
  253. X\item[\bb{Power}]
  254. XSpell points.  This tells you how much mystic energy ({\it mana\/})
  255. Xyou have available for spell casting.  When you type `{\tt +}' to
  256. Xlist your spells, each will have a spell point cost beside
  257. Xit in parentheses.  You will not see this if your dungeon
  258. Xhas been set up without spells.
  259. X%.lp
  260. X\item[\bb{Armor Class}]
  261. XA measure of how effectively your armor stops blows from unfriendly
  262. Xcreatures.  The lower this number is, the more effective the armor; it
  263. Xis quite possible to have negative armor class.
  264. X%.lp
  265. X\item[\bb{Experience}]
  266. XYour current experience level and experience points.  As you
  267. Xadventure, you gain experience points.  At certain experience point
  268. Xtotals, you gain an experience level.  The more experienced you are,
  269. Xthe better you fight and withstand magical attacks.  Many dungeons
  270. Xshow only your experience level here.
  271. X%.lp
  272. X\item[\bb{Time}]
  273. XThe number of turns elapsed so far, displayed if you have the
  274. X{\it time\/} option set.
  275. X%.lp
  276. X\item[\bb{Hunger Status}]
  277. XYour current hunger status, ranging from %
  278. X{\it Satiated\/} down to {\it Fainting}.  If your hunger status is normal,
  279. Xit is not displayed.
  280. X%.pg
  281. XAdditional status flags may appear after the hunger status:
  282. X{\it Conf\/} when you're confused, {\it Sick\/} when sick, {\it Blind\/}
  283. Xwhen you can't see, {\it Stun\/} when stunned, and {\it Hallu\/} when
  284. Xhallucinating.
  285. X\elist
  286. X%.hn 2
  287. X\subsection*{The message line (top)}
  288. X%.pg
  289. XThe top line of the screen is reserved for messages that describe
  290. Xthings that are impossible to represent visually.  If you see a
  291. X``{\tt --More--}'' on the top line, this means that {\it NetHack\/} has
  292. Xanother message to display on the screen, but it wants to make certain
  293. Xthat you've read the one that is there first.  To read the next message,
  294. Xjust press the space bar.
  295. X%.hn 2
  296. X\subsection*{The map (rest of the screen)}
  297. X%.pg
  298. XThe rest of the screen is the map of the level as you have explored it
  299. Xso far.  Each symbol on the screen represents something.  You can set
  300. Xthe {\it graphics\/}
  301. Xoption to change some of the symbols the game uses; otherwise, the
  302. Xgame will use default symbols.  Here is a list of what the default
  303. Xsymbols mean:
  304. X\blist{}
  305. X%.lp
  306. X\item[\tb{- and |}]
  307. XThe walls of a room, or an open door.
  308. X%.lp
  309. X\item[\tb{.}]
  310. XThe floor of a room, or a doorless doorway.
  311. X%.lp
  312. X\item[\tb{\#}]
  313. XA corridor, or possibly a kitchen sink or drawbridge (if your dungeon
  314. Xhas sinks).
  315. X%.lp
  316. X\item[\tb{<}]
  317. XA way to the previous level.
  318. X%.lp
  319. X\item[\tb{>}]
  320. XA way to the next level.
  321. X%.lp
  322. X\item[\tb{+}]
  323. XA closed door, or a spell book containing a spell you can learn (if your
  324. Xdungeon has spell books).
  325. X%.lp
  326. X\item[\tb{@}]
  327. XA human (you, usually).
  328. X%.lp
  329. X\item[\tb{\$}]
  330. XA pile of gold.
  331. X%.lp
  332. X\item[\tb{\^}]
  333. XA trap (once you detect it).
  334. X%.lp
  335. X\item[\tb{)}]
  336. XA weapon.
  337. X%.lp
  338. X\item[\tb{[}]
  339. XA suit or piece of armor.
  340. X%.lp
  341. X\item[\tb{\%}]
  342. XA piece of food (not necessarily healthy).
  343. X%.lp
  344. X\item[\tb{?}]
  345. XA scroll.
  346. X%.lp
  347. X\item[\tb{/}]
  348. XA wand.
  349. X%.lp
  350. X\item[\tb{=}]
  351. XA ring.
  352. X%.lp
  353. X\item[\tb{!}]
  354. XA potion.
  355. X%.lp
  356. X\item[\tb{(}]
  357. XA useful item (pick-axe, key, lamp \ldots).
  358. X%.lp
  359. X\item[\tb{"}]
  360. XAn amulet, or a spider web.
  361. X%.lp
  362. X\item[\tb{*}]
  363. XA gem or rock (possibly valuable, possibly worthless).
  364. X%.lp
  365. X\item[\tb{`}]
  366. XA boulder or statue.
  367. X%.lp
  368. X\item[\tb{0}]
  369. XAn iron ball.
  370. X%.lp
  371. X\item[\tb{_}]
  372. XAn altar, or an iron chain.
  373. X%.lp
  374. X\item[\tb{\}}]
  375. XA pool of water or moat or a pool of lava.
  376. X%.lp
  377. X\item[\tb{\{}]
  378. XA fountain (your dungeon may not have fountains).
  379. X%.lp
  380. X\item[\tb{$\backslash$}]
  381. XAn opulent throne (your dungeon may not have thrones either).
  382. X%.lp
  383. X\item[\tb{a-zA-Z \& other symbols}]
  384. XLetters and certain other symbols represent the various inhabitants
  385. Xof the Mazes of Menace.  Watch out, they can be nasty and vicious.
  386. XSometimes, however, they can be helpful.
  387. X%.pg
  388. XYou need not memorize all these symbols; you can ask the game what any
  389. Xsymbol represents with the `{\tt /}' command (see the Commands section for
  390. Xmore info).
  391. X\elist
  392. X%.hn 1
  393. X\section{Commands}
  394. X%.pg
  395. XCommands are given to {\it NetHack\/} by typing one or two characters;
  396. X{\it NetHack\/} then asks questions to find out what it needs to know to do
  397. Xyour bidding.
  398. X%.pg
  399. XFor example, a common question in the form ``{\tt What do you want to
  400. Xuse? [a-zA-Z\ ?*]}'', asks you to choose an object you are carrying.
  401. XHere, ``{\tt a-zA-Z}'' are the inventory letters of your possible choices.
  402. XTyping `{\tt ?}' gives you an inventory list of these items, so you can see
  403. Xwhat each letter refers to.  In this example, there is also a `{\tt *}'
  404. Xindicating that you may choose an object not on the list, if you
  405. Xwanted to use something unexpected.  Typing a `{\tt *}' lists your entire
  406. Xinventory, so you can see the inventory letters of every object you're
  407. Xcarrying.  Finally, if you change your mind and decide you don't want
  408. Xto do this command after all, you can press the `ESC' key to abort the
  409. Xcommand.
  410. X%.pg
  411. XYou can put a number before most commands to repeat them that many
  412. Xtimes; for example, ``{\tt 10s}'' will search ten times.  If you have the
  413. X{\it number\_pad\/}
  414. Xoption set, you must type `{\tt n}' to prefix a count, so the example above
  415. Xwould be typed ``{\tt n10s}'' instead.  Commands for which counts make no
  416. Xsense ignore them.  In addition, movement commands can be prefixed for
  417. Xgreater control (see below).  To cancel a count or a prefix, press the
  418. X`ESC' key.
  419. X%.pg
  420. XThe list of commands is rather long, but it can be read at any time
  421. Xduring the game through the `{\tt ?}' command, which accesses a menu of
  422. Xhelpful texts.  Here are the commands for your reference:
  423. X\blist{}
  424. X%.lp
  425. X\item[\tb{?}]
  426. XHelp menu:  display one of several help texts available.
  427. X%.lp
  428. X\item[\tb{/}]
  429. XTell what a symbol represents.  You may choose to specify a location
  430. Xor type a symbol (or even a whole word) to define.  If the {\it help\/}
  431. Xoption is on, and {\it NetHack\/} has some special information about an object
  432. Xor a monster that you looked at, you'll be asked if you want ``{\tt More
  433. Xinfo?}''.
  434. XIf {\it help\/} is off, then you'll only get the special information if you
  435. Xexplicitly ask for it by typing in the name of the monster or object.
  436. X%.lp
  437. X\item[\tb{\&}]
  438. XTell what a command does.
  439. X%.lp
  440. X\item[\tb{<}]
  441. XGo up a staircase to the previous level (if you are on the stairs).
  442. X%.lp
  443. X\item[\tb{>}]
  444. XGo down a staircase to the next level (if you are on the stairs).
  445. X%.lp
  446. X\item[\tb{[yuhjklbn]}]
  447. XGo one step in the direction indicated (see Figure 2).  If there is
  448. Xa monster there, you will fight the monster instead.  Only these
  449. Xone-step movement commands cause you to fight monsters; the others
  450. X(below) are ``safe.''
  451. X%.sd
  452. X\begin{center}
  453. X\begin{tabular}{cc}
  454. X\verb+   y  k  u   + & \verb+   7  8  9   +\\
  455. X\verb+    \ | /    + & \verb+    \ | /    +\\
  456. X\verb+   h- . -l   + & \verb+   4- . -6   +\\
  457. X\verb+    / | \    + & \verb+    / | \    +\\
  458. X\verb+   b  j  n   + & \verb+   1  2  3   +\\
  459. X                     & (if {\it number\_pad\/} set)
  460. X\end{tabular}
  461. X\end{center}
  462. X%.ed
  463. X\begin{center}
  464. XFigure 2
  465. X\end{center}
  466. X%.lp
  467. X\item[\tb{[YUHJKLBN]}]
  468. XGo in that direction until you hit a wall or run into something.
  469. X%.lp
  470. X\item[\tb{m[yuhjklbn]}]
  471. XPrefix:  Move without picking up any objects.
  472. X%.lp
  473. X\item[\tb{M[yuhjklbn]}]
  474. XPrefix:  Move far, no pickup.
  475. X%.lp
  476. X\item[\tb{g[yuhjklbn]}]
  477. XPrefix:  Move until something interesting is found.
  478. X%.lp
  479. X\item[\tb{G[yuhjklbn] or <CONTROL->[yuhjklbn]}]
  480. XPrefix:  Same as `{\tt g}', but forking of corridors is not considered
  481. Xinteresting.
  482. X%.lp
  483. X\item[\tb{.}]
  484. XRest, do nothing for one turn.
  485. X%.lp
  486. X\item[\tb{a}]
  487. XApply (use) a tool (pick-axe, key, lamp \ldots).
  488. X%.lp
  489. X\item[\tb{A}]
  490. XRemove all armor.  Use `{\tt T}' (take off) to take off only one piece of
  491. Xarmor.
  492. X%.lp
  493. X\item[\tb{\^{}A}]
  494. XRedo the previous command.
  495. X%.lp
  496. X\item[\tb{c}]
  497. XClose a door.
  498. X%.lp
  499. X\item[\tb{C}]
  500. XCall (name) an individual monster.
  501. X%.lp
  502. X\item[\tb{\^{}C}]
  503. XPanic button.  Quit the game.
  504. X%.lp
  505. X\item[\tb{d}]
  506. XDrop something.\\
  507. X{\tt d7a} -- drop seven items of object
  508. X{\it a}.
  509. X%.lp
  510. X\item[\tb{D}]
  511. XDrop several things.  In answer to the question
  512. X``{\tt What kinds of things do you want to drop? [!\%= au]}''
  513. Xyou should type zero or more object symbols possibly followed by
  514. X`{\tt a}' and/or `{\tt u}'.\\
  515. X%.sd
  516. X%.si
  517. X{\tt Da}  -- drop all objects, without asking for confirmation.\\
  518. X{\tt Du}  -- drop only unpaid objects (when in a shop).\\
  519. X{\tt D\%u} -- drop only unpaid food.
  520. X%.ei
  521. X%.ed
  522. X%.lp
  523. X\item[\tb{\^{}D}]
  524. XKick something (usually a door).
  525. X%.lp
  526. X\item[\tb{e}]
  527. XEat food.
  528. X%.lp
  529. X\item[\tb{E}]
  530. XEngrave a message on the floor.
  531. XEngraving the word ``{\tt Elbereth}'' will cause most monsters to not attack
  532. Xyou hand-to-hand (but if you attack, you will rub it out); this is
  533. Xoften useful to give yourself a breather.  (This feature may be compiled out
  534. Xof the game, so your version might not necessarily have it.)\\
  535. X%.sd
  536. X%.si
  537. X{\tt E-} -- write in the dust with your fingers.
  538. X%.ei
  539. X%.ed
  540. X%.lp
  541. X\item[\tb{i}]
  542. XList your inventory (everything you're carrying).
  543. X%.lp
  544. X\item[\tb{I}]
  545. XList selected parts of your inventory.\\
  546. X%.sd
  547. X%.si
  548. X{\tt I*} -- list all gems in inventory;\\
  549. X{\tt Iu} -- list all unpaid items;\\
  550. X{\tt Ix} -- list all used up items that are on your shopping bill;\\
  551. X{\tt I\$} -- count your money.
  552. X%.ei
  553. X%.ed
  554. X%.lp
  555. X\item[\tb{o}]
  556. XOpen a door.
  557. X%.lp
  558. X\item[\tb{O}]
  559. XSet options.  You will be asked to enter an option line.  If you enter
  560. Xa blank line, the current options are reported.  Entering `{\tt ?}' will
  561. Xget you explanations of the various options.  Otherwise, you should
  562. Xenter a list of options separated by commas.  The available options
  563. Xare listed later in this Guidebook.  Options are usually set before
  564. Xthe game, not with the `{\tt O}' command; see the section on options below.
  565. X%.lp
  566. X\item[\tb{p}]
  567. XPay your shopping bill.
  568. X%.lp
  569. X\item[\tb{P}]
  570. XPut on a ring.
  571. X%.lp
  572. X\item[\tb{\^{}P}]
  573. XRepeat previous message (subsequent {\tt \^{}P}'s repeat earlier messages).
  574. X%.lp
  575. X\item[\tb{q}]
  576. XQuaff (drink) a potion.
  577. X%.lp
  578. X\item[\tb{Q}]
  579. XQuit the game.
  580. X%.lp
  581. X\item[\tb{r}]
  582. XRead a scroll or spell book.
  583. X%.lp
  584. X\item[\tb{R}]
  585. XRemove a ring.
  586. X%.lp
  587. X\item[\tb{\^{}R}]
  588. XRedraw the screen.
  589. X%.lp
  590. X\item[\tb{s}]
  591. XSearch for secret doors and traps around you.  It usually takes several
  592. Xtries to find something.
  593. X%.lp
  594. X\item[\tb{S}]
  595. XSave the game.  The game will be restored automatically the next time
  596. Xyou play.
  597. X%.lp
  598. X\item[\tb{t}]
  599. XThrow an object or shoot a projectile.
  600. X%.lp
  601. X\item[\tb{T}]
  602. XTake off armor.
  603. X%.lp
  604. X\item[\tb{\^{}T}]
  605. XTeleport, if you have the ability.
  606. X%.lp
  607. X\item[\tb{v}]
  608. XDisplay version number.
  609. X%.lp
  610. X\item[\tb{V}]
  611. XDisplay the game history.
  612. X%.lp
  613. X\item[\tb{w}]
  614. XWield weapon.\\
  615. X{\tt w-} -- wield nothing, use your bare hands.
  616. X%.lp
  617. X\item[\tb{W}]
  618. XWear armor.
  619. X%.lp
  620. X\item[\tb{x}]
  621. XList the spells you know (same as `{\tt +}').
  622. X%.lp
  623. X\item[\tb{X}]
  624. XEnter explore (discovery) mode.
  625. X%.lp
  626. X\item[\tb{z}]
  627. XZap a wand.
  628. X%.lp
  629. X\item[\tb{Z}]
  630. XZap (cast) a spell.
  631. X%.lp
  632. X\item[\tb{\^{}Z}]
  633. XSuspend the game (UNIX versions with job control only).
  634. X%.lp
  635. X\item[\tb{:}]
  636. XLook at what is here.
  637. X%.lp
  638. X\item[\tb{,}]
  639. XPick up some things.
  640. X%.lp
  641. X\item[\tb{@}]
  642. XToggle the {\it pickup\/} option on and off.
  643. X%.lp
  644. X\item[\tb{\^{}}]
  645. XAsk for the type of a trap you found earlier.
  646. X%.lp
  647. X\item[\tb{)}]
  648. XTell what weapon you are wielding.
  649. X%.lp
  650. X\item[\tb{[}]
  651. XTell what armor you are wearing.
  652. X%.lp
  653. X\item[\tb{=}]
  654. XTell what rings you are wearing.
  655. X%.lp
  656. X\item[\tb{"}]
  657. XTell what amulet you are wearing.
  658. X%.lp
  659. X\item[\tb{(}]
  660. XTell what tools you are using.
  661. X%.lp
  662. X\item[\tb{\$}]
  663. XCount your gold pieces.
  664. X%.lp
  665. X\item[\tb{+}]
  666. XList the spells you know (same as `{\tt x}').
  667. X%.lp
  668. X\item[\tb{$\backslash$}]
  669. XShow what types of objects have been discovered.
  670. X%.lp
  671. X\item[\tb{!}]
  672. XEscape to a shell.
  673. X%.lp
  674. X\item[\tb{\#}]
  675. XPerform an extended command.  As you can see, the authors of {\it NetHack\/}
  676. Xused up all the letters, so this is a way to introduce the less useful
  677. Xcommands, or commands used under limited circumstances.  You may obtain a
  678. Xlist of them by entering `{\tt ?}'.  What extended commands are available
  679. Xdepend on what features the game was compiled with.
  680. X\elist
  681. X%.pg
  682. X\nd If your keyboard has a meta key (which, when pressed in combination
  683. Xwith another key, modifies it by setting the `meta' [8th, or `high']
  684. Xbit), you can invoke the extended commands by meta-ing the first
  685. Xletter of the command.  In {\it OS/2, PC\/ {\rm and} ST NetHack}, the `Alt'
  686. Xkey can be used in this fashion.
  687. X\blist{}
  688. X%.lp
  689. X\item[\tb{M-a}]
  690. XAdjust inventory letters (the {\it fixinv\/} option must be ``on'' to do this).
  691. X%.lp
  692. X\item[\tb{M-c}]
  693. XTalk to someone.
  694. X%.lp
  695. X\item[\tb{M-d}]
  696. XDip an object into something.
  697. X%.lp
  698. X\item[\tb{M-f}]
  699. XForce a lock.
  700. X%.lp
  701. X\item[\tb{M-i}]
  702. XInvoke an object's special powers.
  703. X%.lp
  704. X\item[\tb{M-j}]
  705. XJump to another location.
  706. X%.lp
  707. X\item[\tb{M-l}]
  708. XLoot a box on the floor.
  709. X%.lp
  710. X\item[\tb{M-m}]
  711. XUse a monster's special ability.
  712. X%.lp
  713. X\item[\tb{M-n}]
  714. XName an item or type of object.
  715. X%.lp
  716. X\item[\tb{M-o}]
  717. XOffer a sacrifice to the gods.
  718. X%.lp
  719. X\item[\tb{M-p}]
  720. XPray to the gods for help.
  721. X%.lp
  722. X\item[\tb{M-r}]
  723. XRub a lamp.
  724. X%.lp
  725. X\item[\tb{M-s}]
  726. XSit down.
  727. X%.lp
  728. X\item[\tb{M-t}]
  729. XTurn undead.
  730. X%.lp
  731. X\item[\tb{M-u}]
  732. XUntrap something (usually a trapped object).
  733. X%.lp
  734. X\item[\tb{M-v}]
  735. XPrint compile time options for this version of {\it NetHack}.
  736. X%.lp
  737. X\item[\tb{M-w}]
  738. XWipe off your face.
  739. X\elist
  740. X%.pg
  741. X\nd If the {\it number\_pad\/} option is on, some additional letter commands
  742. Xare available:
  743. X\blist{}
  744. X%.lp
  745. X\item[\tb{j}]
  746. XJump to another location.  Same as ``{\tt \#jump}'' or ``{\tt M-j}''.
  747. X%.lp
  748. X\item[\tb{k}]
  749. XKick something (usually a door).  Same as `{\tt \^{}D}'.
  750. X%.lp
  751. X\item[\tb{l}]
  752. XLoot a box on the floor.  Same as ``{\tt \#loot}'' or ``{\tt M-l}''.
  753. X%.lp
  754. X\item[\tb{N}]
  755. XName an object or type of object.  Same as ``{\tt \#name}'' or ``{\tt M-N}''.
  756. X%.lp
  757. X\item[\tb{u}]
  758. XUntrap a trapped object or door.  Same as ``{\tt \#untrap}'' or ``{\tt M-u}''.
  759. X\elist
  760. X%.hn 1
  761. X\section{Rooms and corridors}
  762. X%.pg
  763. XRooms and corridors in the dungeon are either lit or dark.
  764. XAny lit areas within your line of sight will be displayed;
  765. Xdark areas are only displayed if they are within one space of you. 
  766. XWalls and corridors remain on the map as you explore them.
  767. X%.pg
  768. XSecret corridors are hidden.  You can find them with the `{\tt s}' (search)
  769. Xcommand.
  770. X%.hn 2
  771. X\subsection*{Doorways}
  772. X%.pg
  773. XDoorways connect rooms and corridors.  Some doorways have no doors;
  774. Xyou can walk right through.  Others have doors in them, which may be
  775. Xopen, closed, or locked.  To open a closed door, use the `{\tt o}' (open)
  776. Xcommand; to close it again, use the `{\tt c}' (close) command.
  777. X%.pg
  778. XYou can get through a locked door by using a tool to pick the lock
  779. Xwith the `{\tt a}' (apply) command, or by kicking it open with the
  780. X`{\tt \^{}D}' (kick) command.
  781. X%.pg
  782. XOpen doors cannot be entered diagonally; you must approach them
  783. Xstraight on, horizontally or vertically.  Doorways without doors are
  784. Xnot restricted.
  785. X%.pg
  786. XDoors can be useful for shutting out monsters.  Most monsters cannot
  787. Xopen doors, although a few don't need to (ex.\ ghosts can walk through
  788. Xdoors).
  789. X%.pg
  790. XSecret doors are hidden.  You can find them with the `{\tt s}' (search)
  791. Xcommand.
  792. X%.hn 2
  793. X\subsection*{Traps (`{\tt \^{}}')}
  794. X%.pg
  795. XThere are traps throughout the dungeon to snare the unwary delver.
  796. XFor example, you may suddenly fall into a pit and be stuck for a few
  797. Xturns.  Traps don't appear on your map until you see one triggered
  798. Xby moving onto it, or you discover it with the `{\tt s}' (search) command.
  799. XMonsters can fall prey to traps, too.
  800. X%.hn 1
  801. X\section{Monsters}
  802. X%.pg
  803. XMonsters you cannot see are not displayed on the screen.  Beware!
  804. XYou may suddenly come upon one in a dark place.  Some magic items can
  805. Xhelp you locate them before they locate you, which some monsters do
  806. Xvery well.
  807. X%.hn 2
  808. X\subsection*{Fighting}
  809. X%.pg
  810. XIf you see a monster and you wish to fight it, just attempt to walk
  811. Xinto it.  Many monsters you find will mind their own business unless
  812. Xyou attack them.  Some of them are very dangerous when angered.
  813. XRemember:  Discretion is the better part of valor.
  814. X%.hn 2
  815. X\subsection*{Your pet}
  816. X%.pg
  817. XYou start the game with a little dog (`{\tt d}') or cat (`{\tt f}'),
  818. Xwhich follows
  819. Xyou about the dungeon and fights monsters with you.  Like you, your
  820. Xpet needs food to survive.  It usually feeds itself on fresh carrion
  821. Xand other meats.  If you're worried about it or want to train it, you
  822. Xcan feed it, too, by throwing it food.
  823. X%.pg
  824. XYour pet also gains experience from killing monsters, and can grow
  825. Xover time, gaining hit points and doing more damage.  Initially, your
  826. Xpet may even be better at killing things than you, which makes pets
  827. Xuseful for low-level characters.
  828. X%.pg
  829. XYour pet will follow you up and down staircases, if it is next to you
  830. Xwhen you move.  Otherwise, your pet will be stranded, and may become
  831. Xwild.
  832. X%.hn 2
  833. X\subsection*{Ghost levels}
  834. X%.pg
  835. XYou may encounter the shades and corpses of other adventurers (or even
  836. Xformer incarnations of yourself!) and their personal effects.  Ghosts
  837. Xare hard to kill, but easy to avoid, since they're slow and do little
  838. Xdamage.  You can plunder the deceased adventurer's possessions;
  839. Xhowever, they are likely to be cursed.  Beware of whatever killed the
  840. Xformer player.
  841. END_OF_FILE
  842. if test 25557 -ne `wc -c <'doc/Guidebook.te1'`; then
  843.     echo shar: \"'doc/Guidebook.te1'\" unpacked with wrong size!
  844. # end of 'doc/Guidebook.te1'
  845. if test -f 'src/artifact.c' -a "${1}" != "-c" ; then 
  846.   echo shar: Will not clobber existing file \"'src/artifact.c'\"
  847. echo shar: Extracting \"'src/artifact.c'\" \(28827 characters\)
  848. sed "s/^X//" >'src/artifact.c' <<'END_OF_FILE'
  849. X/*    SCCS Id: @(#)artifact.c    3.1    93/01/17    */
  850. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  851. X/* NetHack may be freely redistributed.  See license for details. */
  852. X#include "hack.h"
  853. X#include "artifact.h"
  854. X#ifdef OVLB
  855. X#include "artilist.h"
  856. X#else
  857. XSTATIC_DCL const struct artifact artilist[];
  858. X#endif
  859. X * Note:  both artilist[] and artiexist[] have a dummy element #0,
  860. X *      so loops over them should normally start at #1.  The primary
  861. X *      exception is the save & restore code, which doesn't care about
  862. X *      the contents, just the total size.
  863. Xextern boolean notonhead;    /* for long worms */
  864. X#define get_artifact(o) \
  865. X        (((o)&&(o)->oartifact) ? &artilist[(int) (o)->oartifact] : 0)
  866. XSTATIC_DCL int FDECL(spec_applies, (const struct artifact*,struct permonst*));
  867. XSTATIC_DCL int FDECL(arti_invoke, (struct obj*));
  868. X#ifndef OVLB
  869. XSTATIC_DCL int spec_dbon_applies;
  870. X#else    /* OVLB */
  871. X/* coordinate effects from spec_dbon() with messages in artifact_hit() */
  872. XSTATIC_OVL int spec_dbon_applies = 0;
  873. X/* flags including which artifacts have already been created */
  874. Xstatic boolean artiexist[1+NROFARTIFACTS+1];
  875. Xstatic boolean FDECL(attacks, (int,struct obj *));
  876. X/* zero out the artifact existence list */
  877. Xvoid
  878. Xinit_artifacts()
  879. X    (void) memset((genericptr_t) artiexist, 0, sizeof artiexist);
  880. Xvoid
  881. Xsave_artifacts(fd)
  882. Xint fd;
  883. X    bwrite(fd, (genericptr_t) artiexist, sizeof artiexist);
  884. Xvoid
  885. Xrestore_artifacts(fd)
  886. Xint fd;
  887. X    mread(fd, (genericptr_t) artiexist, sizeof artiexist);
  888. Xconst char *
  889. Xartiname(artinum)
  890. Xint artinum;
  891. X    if (artinum <= 0 || artinum > NROFARTIFACTS) return("");
  892. X    return(artilist[artinum].name);
  893. X   Make an artifact.  If a specific alignment is specified, then an object of
  894. X   the appropriate alignment is created from scratch, or NULL is returned if
  895. X   none is available.  If no alignment is given, then 'otmp' is converted
  896. X   into an artifact of matching type, or returned as-is if that's not possible.
  897. X   For the 2nd case, caller should use ``obj = mk_artifact(obj, A_NONE);''
  898. X   for the 1st, ``obj = mk_artifact(NULL, some_alignment);''.
  899. Xstruct obj *
  900. Xmk_artifact(otmp, alignment)
  901. Xstruct obj *otmp;    /* existing object; ignored if alignment specified */
  902. Xaligntyp alignment;    /* target alignment, or A_NONE */
  903. X    register const struct artifact *a;
  904. X    register int n = 0, m;
  905. X    register boolean by_align = (alignment != A_NONE);
  906. X    register short o_typ = (by_align || !otmp) ? 0 : otmp->otyp;
  907. X    boolean unique = !by_align && otmp && objects[o_typ].oc_unique;
  908. X    /* count eligible artifacts */
  909. X    for (a = artilist+1,m = 1; a->otyp; a++,m++)
  910. X        if ((by_align ? a->alignment == alignment : a->otyp == o_typ) &&
  911. X        (!(a->spfx & SPFX_NOGEN) || unique) && !artiexist[m]) {
  912. X        if (by_align && a->class == pl_character[0])
  913. X            goto make_artif;    /* 'a' points to the desired one */
  914. X        else
  915. X            n++;
  916. X        }
  917. X    if (n) {        /* found at least one candidate */
  918. X        /* select one, then find it again */
  919. X        if (n > 1) n = rnd(n);    /* [1..n] */
  920. X        for (a = artilist+1,m = 1; a->otyp; a++,m++)
  921. X        if ((by_align ? a->alignment == alignment : a->otyp == o_typ)&&
  922. X            (!(a->spfx & SPFX_NOGEN) || unique) && !artiexist[m]) {
  923. X            if (!--n) break;    /* stop when chosen one reached */
  924. X        /* make an appropriate object if necessary, then christen it */
  925. Xmake_artif: if (by_align) otmp = mksobj((int)a->otyp, TRUE, FALSE);
  926. X        otmp = oname(otmp, a->name, 0);
  927. X        otmp->oartifact = m;
  928. X        artiexist[m] = TRUE;
  929. X    } else {
  930. X        /* nothing appropriate could be found; return the original object */
  931. X        if (by_align) otmp = 0;    /* (there was no original object) */
  932. X    return otmp;
  933. X * Returns the full name (with articles and correct capitalization) of an
  934. X * artifact named "name" if one exists, or NULL, it not.
  935. X * The given name must be rather close to the real name for it to match.
  936. X * The object type of the artifact is returned in otyp if the return value
  937. X * is non-NULL.
  938. Xconst char*
  939. Xartifact_name(name, otyp)
  940. Xconst char *name;
  941. Xshort *otyp;
  942. X    register const struct artifact *a;
  943. X    register const char *aname;
  944. X    if(!strncmpi(name, "the ", 4)) name += 4;
  945. X    for (a = artilist+1; a->otyp; a++) {
  946. X    aname = a->name;
  947. X    if(!strncmpi(aname, "the ", 4)) aname += 4;
  948. X    if(!strcmpi(name, aname)) {
  949. X        *otyp = a->otyp;
  950. X        return a->name;
  951. X    }
  952. X    return NULL;
  953. Xboolean
  954. Xexist_artifact(otyp, name)
  955. Xregister int otyp;
  956. Xregister const char *name;
  957. X    register const struct artifact *a;
  958. X    register boolean *arex;
  959. X    if (otyp && *name)
  960. X        for (a = artilist+1,arex = artiexist+1; a->otyp; a++,arex++)
  961. X        if ((int) a->otyp == otyp && !strcmp(a->name, name))
  962. X            return *arex;
  963. X    return FALSE;
  964. Xvoid
  965. Xartifact_exists(otmp, name, mod)
  966. Xregister struct obj *otmp;
  967. Xregister const char *name;
  968. Xregister boolean mod;
  969. X    register const struct artifact *a;
  970. X    if (otmp && *name)
  971. X        for (a = artilist+1; a->otyp; a++)
  972. X        if (a->otyp == otmp->otyp && !strcmp(a->name, name)) {
  973. X            register int m = a - artilist;
  974. X            otmp->oartifact = (char)(mod ? m : 0);
  975. X            otmp->age = 0;
  976. X            if(otmp->otyp == RIN_INCREASE_DAMAGE)
  977. X            otmp->spe = 0;
  978. X            artiexist[m] = mod;
  979. X            break;
  980. X    return;
  981. Xnartifact_exist()
  982. X    int a = 0;
  983. X    int n = SIZE(artiexist);
  984. X    while(n > 1)
  985. X    if(artiexist[--n]) a++;
  986. X    return a;
  987. X#endif /* OVLB */
  988. X#ifdef OVL0
  989. Xboolean
  990. Xspec_ability(otmp, abil)
  991. Xstruct obj *otmp;
  992. Xunsigned abil;
  993. X    const struct artifact *arti = get_artifact(otmp);
  994. X    return(arti && (arti->spfx & abil));
  995. X#endif /* OVL0 */
  996. X#ifdef OVLB
  997. Xboolean
  998. Xrestrict_name(otmp, name)  /* returns 1 if name is restricted for otmp->otyp */
  999. Xregister struct obj *otmp;
  1000. Xregister const char *name;
  1001. X    register const struct artifact *a;
  1002. X    if (!*name) return FALSE;
  1003. X        /* Since almost every artifact is SPFX_RESTR, it doesn't cost
  1004. X           us much to do the string comparison before the spfx check.
  1005. X           Bug fix:  don't name multiple elven daggers "Sting".
  1006. X         */
  1007. X    for (a = artilist+1; a->otyp; a++)
  1008. X        if (a->otyp == otmp->otyp && !strcmp(a->name, name))
  1009. X        return ((a->spfx & (SPFX_NOGEN|SPFX_RESTR)) != 0 ||
  1010. X            otmp->quan > 1L);
  1011. X    return FALSE;
  1012. Xstatic boolean
  1013. Xattacks(adtyp, otmp)
  1014. Xregister int adtyp;
  1015. Xregister struct obj *otmp;
  1016. X    register const struct artifact *weap;
  1017. X    if ((weap = get_artifact(otmp)) != 0)
  1018. X        return(weap->attk.adtyp == adtyp);
  1019. X    return(0);
  1020. Xboolean
  1021. Xdefends(adtyp, otmp)
  1022. Xregister int adtyp;
  1023. Xregister struct obj *otmp;
  1024. X    register const struct artifact *weap;
  1025. X    if ((weap = get_artifact(otmp)) != 0)
  1026. X        return(weap->defn.adtyp == adtyp);
  1027. X    return(0);
  1028. X * a potential artifact has just been worn/wielded/picked-up or
  1029. X * unworn/unwielded/dropped.  Pickup/drop only set/reset the W_ART mask.
  1030. Xvoid
  1031. Xset_artifact_intrinsic(otmp,on,wp_mask)
  1032. Xregister struct obj *otmp;
  1033. Xboolean on;
  1034. Xlong wp_mask;
  1035. X    long *mask = 0;
  1036. X    register const struct artifact *oart = get_artifact(otmp);
  1037. X    uchar dtyp;
  1038. X    long spfx;
  1039. X    if (!oart) return;
  1040. X    /* effects from the defn field */
  1041. X    dtyp = (wp_mask != W_ART) ? oart->defn.adtyp : oart->cary.adtyp;
  1042. X    if (dtyp == AD_FIRE)
  1043. X        mask = &HFire_resistance;
  1044. X    else if (dtyp == AD_COLD)
  1045. X        mask = &HCold_resistance;
  1046. X    else if (dtyp == AD_ELEC)
  1047. X        mask = &HShock_resistance;
  1048. X    else if (dtyp == AD_MAGM)
  1049. X        mask = &Antimagic;
  1050. X    else if (dtyp == AD_DISN)
  1051. X        mask = &HDisint_resistance;
  1052. X    if(mask && wp_mask == W_ART && !on) {
  1053. X        /* find out if some other artifact also confers this intrinsic */
  1054. X        /* if so, leave the mask alone */
  1055. X        register struct obj* obj;
  1056. X        for(obj = invent; obj; obj = obj->nobj)
  1057. X        if(obj != otmp && obj->oartifact) {
  1058. X            register const struct artifact *art = get_artifact(obj);
  1059. X            if(art->cary.adtyp == dtyp) {
  1060. X            mask = (long *) 0;
  1061. X            break;
  1062. X            }
  1063. X    if(mask) {
  1064. X        if (on) *mask |= wp_mask;
  1065. X        else *mask &= ~wp_mask;
  1066. X    /* intrinsics from the spfx field; there could be more than one */
  1067. X    spfx = (wp_mask != W_ART) ? oart->spfx : oart->cspfx;
  1068. X    if(spfx && wp_mask == W_ART && !on) {
  1069. X        /* don't change any spfx also conferred by other artifacts */
  1070. X        register struct obj* obj;
  1071. X        for(obj = invent; obj; obj = obj->nobj)
  1072. X        if(obj != otmp && obj->oartifact) {
  1073. X            register const struct artifact *art = get_artifact(obj);
  1074. X            spfx &= ~art->cspfx;
  1075. X    if (spfx & SPFX_SEARCH) {
  1076. X        if(on) Searching |= wp_mask;
  1077. X        else Searching &= ~wp_mask;
  1078. X    if (spfx & SPFX_HALRES) {
  1079. X        /* make_hallucinated must (re)set the mask itself to get
  1080. X         * the display right */
  1081. X        make_hallucinated((long)!on, TRUE, wp_mask);
  1082. X    if (spfx & SPFX_ESP) {
  1083. X        if(on) HTelepat |= wp_mask;
  1084. X        else HTelepat &= ~wp_mask;
  1085. X        see_monsters();
  1086. X    if (spfx & SPFX_STLTH) {
  1087. X        if (on) Stealth |= wp_mask;
  1088. X        else Stealth &= ~wp_mask;
  1089. X    if (spfx & SPFX_REGEN) {
  1090. X        if (on) HRegeneration |= wp_mask;
  1091. X        else HRegeneration &= ~wp_mask;
  1092. X    if (spfx & SPFX_TCTRL) {
  1093. X        if (on) HTeleport_control |= wp_mask;
  1094. X        else HTeleport_control &= ~wp_mask;
  1095. X    if (spfx & SPFX_WARN) {
  1096. X        if (on) Warning |= wp_mask;
  1097. X        else Warning &= ~wp_mask;
  1098. X    if (spfx & SPFX_EREGEN) {
  1099. X        if (on) Energy_regeneration |= wp_mask;
  1100. X        else Energy_regeneration &= ~wp_mask;
  1101. X    if (spfx & SPFX_HSPDAM) {
  1102. X        if (on) Half_spell_damage |= wp_mask;
  1103. X        else Half_spell_damage &= ~wp_mask;
  1104. X    if (spfx & SPFX_HPHDAM) {
  1105. X        if (on) Half_physical_damage |= wp_mask;
  1106. X        else Half_physical_damage &= ~wp_mask;
  1107. X    if(wp_mask == W_ART && !on && oart->inv_prop) {
  1108. X        /* might have to turn off invoked power too */
  1109. X        if (oart->inv_prop <= LAST_PROP &&
  1110. X        (u.uprops[oart->inv_prop].p_flgs & W_ARTI))
  1111. X        (void) arti_invoke(otmp);
  1112. X * creature (usually player) tries to touch (pick up or wield) an artifact obj.
  1113. X * Returns 0 if the object refuses to be touched.
  1114. X * This routine does not change any object chains.
  1115. X * Ignores such things as gauntlets, assuming the artifact is not
  1116. X * fooled by such trappings.
  1117. Xtouch_artifact(obj,mon)
  1118. X    struct obj *obj;
  1119. X    struct monst *mon;
  1120. X    register const struct artifact *oart = get_artifact(obj);
  1121. X    boolean badclass, badalign;
  1122. X    boolean yours = (mon == &youmonst);
  1123. X    if(!oart) return 1;
  1124. X    badclass = (oart->class && (!yours || oart->class != pl_character[0]));
  1125. X    badalign = (oart->spfx & SPFX_RESTR) &&
  1126. X    ((oart->alignment !=
  1127. X      (yours ? u.ualign.type : sgn(mon->data->maligntyp))) ||
  1128. X     (yours && u.ualign.record < 0));
  1129. X    /*
  1130. X     * hack: Excalibur allows all lawfuls to touch it, but "class" is
  1131. X     * set to 'K' to allow Knights to get it via sacrifice.  This requires an
  1132. X     * additional artifact field to fix, or some similar treatment. -dlc
  1133. X     */
  1134. X    if (obj->oartifact == ART_EXCALIBUR && !badalign) badclass = FALSE;
  1135. X    if(((badclass || badalign) && (oart->spfx & SPFX_INTEL)) ||
  1136. X       (badalign && (!yours || !rn2(4))))  {
  1137. X    int dmg;
  1138. X    char buf[BUFSZ];
  1139. X    if (!yours) return 0;
  1140. X    You("feel a blast of power flow from %s!", the(xname(obj)));
  1141. X    dmg = d((Antimagic ? 2 : 4) , ((oart->spfx & SPFX_INTEL) ? 10 : 4));
  1142. X    Sprintf(buf, "touching %s", oart->name);
  1143. X    losehp(dmg, buf, KILLED_BY);
  1144. X    exercise(A_WIS, FALSE);
  1145. X    }
  1146. X    /* can pick it up unless you're totally non-synch'd with the artifact */
  1147. X    if(badclass && badalign && (oart->spfx & SPFX_INTEL)) {
  1148. X    if (yours) pline("%s refuses to be held by you!", The(xname(obj)));
  1149. X    return 0;
  1150. X    }
  1151. X    return 1;
  1152. X#endif /* OVLB */
  1153. X#ifdef OVL1
  1154. XSTATIC_OVL int
  1155. Xspec_applies(weap, ptr)
  1156. Xregister const struct artifact *weap;
  1157. Xstruct permonst *ptr;
  1158. X    boolean yours = (ptr == &playermon);
  1159. X    if(!(weap->spfx & (SPFX_DBONUS | SPFX_ATTK)))
  1160. X        return(weap->attk.adtyp == AD_PHYS);
  1161. X    if(weap->spfx & SPFX_DMONS)
  1162. X        return((ptr == &mons[(int)weap->mtype]));
  1163. X    else if(weap->spfx & SPFX_DCLAS)
  1164. X        return((weap->mtype == ptr->mlet));
  1165. X    else if(weap->spfx & SPFX_DFLAG1)
  1166. X        return((ptr->mflags1 & weap->mtype) != 0L);
  1167. X    else if(weap->spfx & SPFX_DFLAG2)
  1168. X        return((ptr->mflags2 & weap->mtype) != 0L);
  1169. X    else if(weap->spfx & SPFX_DALIGN)
  1170. X        return(ptr->maligntyp == A_NONE ||
  1171. X           sgn(ptr->maligntyp) != sgn(weap->alignment));
  1172. X    else if(weap->spfx & SPFX_ATTK) {
  1173. X        switch(weap->attk.adtyp) {
  1174. X        case AD_FIRE:
  1175. X            return(!(yours ? Fire_resistance : resists_fire(ptr)));
  1176. X        case AD_COLD:
  1177. X            return(!(yours ? Cold_resistance : resists_cold(ptr)));
  1178. X        case AD_ELEC:
  1179. X            return(!(yours ? Shock_resistance : resists_elec(ptr)));
  1180. X        case AD_MAGM:
  1181. X        case AD_STUN:
  1182. X            return(!(yours ? Antimagic : (rn2(101) < ptr->mr)));
  1183. X        case AD_DRLI:
  1184. X            if (!yours) return(!resists_drli(ptr));
  1185. X            else return(
  1186. X#ifdef POLYSELF
  1187. X                resists_drli(uasmon) ||
  1188. X#endif
  1189. X                defends(AD_DRLI, uwep));
  1190. X        case AD_STON:
  1191. X#ifdef POLYSELF
  1192. X            if (yours) return(!resists_ston(uasmon));
  1193. X            else
  1194. X#endif
  1195. X                return(!resists_ston(ptr));
  1196. X        default:    impossible("Weird weapon special attack.");
  1197. X        }
  1198. X    return(0);
  1199. Xspec_abon(otmp, ptr)
  1200. Xstruct obj *otmp;
  1201. Xstruct permonst *ptr;
  1202. X    register const struct artifact *weap;
  1203. X    if ((weap = get_artifact(otmp)) != 0)
  1204. X        if(spec_applies(weap, ptr))
  1205. X            return((weap->attk.damn) ? rnd((int)weap->attk.damn) : 0);
  1206. X    return(0);
  1207. Xspec_dbon(otmp, ptr, tmp)
  1208. Xregister struct obj *otmp;
  1209. Xregister struct permonst *ptr;
  1210. Xregister int    tmp;
  1211. X    register const struct artifact *weap;
  1212. X    if ((weap = get_artifact(otmp)) != 0)
  1213. X        if ((spec_dbon_applies = spec_applies(weap, ptr)) != 0)
  1214. X        return((weap->attk.damd) ? rnd((int)weap->attk.damd) : tmp);
  1215. X    else spec_dbon_applies = 0;
  1216. X    return(0);
  1217. X#endif /* OVL1 */
  1218. X#ifdef OVLB
  1219. X/* Function used when someone attacks someone else with an artifact
  1220. X * weapon.  Only adds the special (artifact) damage, and returns a 1 if it
  1221. X * did something special (in which case the caller won't print the normal
  1222. X * hit message).  This should be called once upon every artifact attack;
  1223. X * dmgval() no longer takes artifact bonuses into account.  Possible
  1224. X * extension: change the killer so that when an orc kills you with
  1225. X * Stormbringer it's "killed by Stormbringer" instead of "killed by an orc".
  1226. Xboolean
  1227. Xartifact_hit(magr, mdef, otmp, dmgptr, dieroll)
  1228. Xstruct monst *magr, *mdef;
  1229. Xstruct obj *otmp;
  1230. Xint *dmgptr;
  1231. Xint dieroll; /* needed for Magicbane and vorpal blades */
  1232. X    boolean youattack = (magr == &youmonst);
  1233. X    boolean youdefend = (mdef == &youmonst);
  1234. X    boolean vis = (!youattack && magr && cansee(magr->mx, magr->my))
  1235. X        || (!youdefend && cansee(mdef->mx, mdef->my));
  1236. X    boolean realizes_damage;
  1237. X    static const char you[] = "you";
  1238. X    const char *hittee = youdefend ? you : mon_nam(mdef);
  1239. X    /* The following takes care of most of the damage, but not all--
  1240. X     * the exception being for level draining, which is specially
  1241. X     * handled.  Messages are done in this function, however.
  1242. X     */
  1243. X    *dmgptr += spec_dbon(otmp, youdefend ? &playermon
  1244. X        : mdef->data, *dmgptr);
  1245. X    if (youattack && youdefend) {
  1246. X        impossible("attacking yourself with weapon?");
  1247. X        return FALSE;
  1248. X    realizes_damage = (youdefend || vis) && spec_dbon_applies;
  1249. X    /* the four basic attacks: fire, cold, shock and missiles */
  1250. X    if (attacks(AD_FIRE, otmp)) {
  1251. X        if (realizes_damage) {
  1252. X            pline("The fiery blade burns %s!", hittee);
  1253. X            return TRUE;
  1254. X    if (attacks(AD_COLD, otmp)) {
  1255. X        if (realizes_damage) {
  1256. X            pline("The chilling blade freezes %s!", hittee);
  1257. X            return TRUE;
  1258. X    if (attacks(AD_ELEC, otmp)) {
  1259. X        if (realizes_damage) {
  1260. X            if(youattack && otmp != uwep)
  1261. X                pline("%s hits %s!", The(xname(otmp)), hittee);
  1262. X            pline("A bolt of lightning zaps %s!", hittee);
  1263. X            return TRUE;
  1264. X    if (attacks(AD_MAGM, otmp)) {
  1265. X        if (realizes_damage) {
  1266. X            if(youattack && otmp != uwep)
  1267. X                pline("%s hits %s!", The(xname(otmp)), hittee);
  1268. X            pline("A hail of magic missiles strikes %s!", hittee);
  1269. X            return TRUE;
  1270. X     * Magicbane's intrinsic magic is incompatible with normal
  1271. X     * enchantment magic.  Thus, its effects have a negative
  1272. X     * dependence on spe.  Against low mr victims, it typically
  1273. X     * does "double athame" damage, 2d4.  Occasionally, it will
  1274. X     * cast unbalancing magic which effectively averages out to
  1275. X     * 4d4 damage (2.5d4 against high mr victims), for spe = 0.
  1276. X     */
  1277. X#define MB_MAX_DIEROLL        8    /* rolls above this aren't magical */
  1278. X#define MB_INDEX_INIT        (-1)
  1279. X#define MB_INDEX_PROBE        0
  1280. X#define MB_INDEX_STUN        1
  1281. X#define MB_INDEX_SCARE        2
  1282. X#define MB_INDEX_PURGE        3
  1283. X#define MB_RESIST_ATTACK    (resist_index = attack_index)
  1284. X#define MB_RESISTED_ATTACK    (resist_index == attack_index)
  1285. X#define MB_UWEP_ATTACK        (youattack && (otmp == uwep))
  1286. X    if (attacks(AD_STUN, otmp) && (dieroll <= MB_MAX_DIEROLL)) {
  1287. X        int attack_index = MB_INDEX_INIT;
  1288. X        int resist_index = MB_INDEX_INIT;
  1289. X        int scare_dieroll = MB_MAX_DIEROLL / 2;
  1290. X        if (otmp->spe >= 3)
  1291. X            scare_dieroll /= (1 << (otmp->spe / 3));
  1292. X        *dmgptr += rnd(4);            /* 3d4 */
  1293. X        if (otmp->spe > rn2(10))        /* probe */
  1294. X            attack_index = MB_INDEX_PROBE;
  1295. X        else {                    /* stun */
  1296. X            attack_index = MB_INDEX_STUN;
  1297. X            *dmgptr += rnd(4);        /* 4d4 */
  1298. X            if (youdefend)
  1299. X                make_stunned((HStun + 3), FALSE);
  1300. X            else
  1301. X                mdef->mstun = 1;
  1302. X        if (dieroll <= scare_dieroll) {        /* scare */
  1303. X            attack_index = MB_INDEX_SCARE;
  1304. X            *dmgptr += rnd(4);        /* 5d4 */
  1305. X            if (youdefend) {
  1306. X                if (Antimagic)
  1307. X                    MB_RESIST_ATTACK;
  1308. X                else {
  1309. X                    nomul(-3);
  1310. X                    nomovemsg = "";
  1311. X#ifdef POLYSELF
  1312. X                    if ((magr == u.ustuck)
  1313. X                        && sticks(uasmon)) {
  1314. X                        u.ustuck = (struct monst *)0;
  1315. X                        You("release %s!", mon_nam(magr));
  1316. X                    }
  1317. X#endif
  1318. X                }
  1319. X            } else if (youattack) {
  1320. X                if (rn2(2) && resist(mdef,SPBOOK_CLASS,0,0)) {
  1321. X                    MB_RESIST_ATTACK;
  1322. X                } else {
  1323. X                    if (mdef == u.ustuck) {
  1324. X                    if (u.uswallow)
  1325. X                        expels(mdef,mdef->data,TRUE);
  1326. X                    else {
  1327. X#ifdef POLYSELF
  1328. X                        if (!sticks(uasmon))
  1329. X#endif
  1330. X                        {
  1331. X                        u.ustuck = (struct monst *)0;
  1332. X                        You("get released!");
  1333. X                        }
  1334. X                    }
  1335. X                    }
  1336. X                    mdef->mflee = 1;
  1337. X                    mdef->mfleetim += 3;
  1338. X                }
  1339. X            }
  1340. X        if (dieroll <= (scare_dieroll / 2)) {    /* purge */
  1341. X            struct obj *ospell;
  1342. X#ifdef POLYSELF
  1343. X            struct permonst *old_uasmon = uasmon;
  1344. X#endif
  1345. X            attack_index = MB_INDEX_PURGE;
  1346. X            *dmgptr += rnd(4);        /* 6d4 */
  1347. X            /* Create a fake spell object, ala spell.c */
  1348. X            ospell = mksobj(SPE_CANCELLATION, FALSE, FALSE);
  1349. X            ospell->blessed = ospell->cursed = 0;
  1350. X            ospell->quan = 20L;
  1351. X            cancel_monst(mdef, ospell, youattack, FALSE, FALSE);
  1352. X#ifdef POLYSELF
  1353. X            if (youdefend && (old_uasmon != uasmon))
  1354. X                /* rehumanized, no more damage */
  1355. X                *dmgptr = 0;
  1356. X#endif
  1357. X            if (youdefend) {
  1358. X                if (Antimagic)
  1359. X                    MB_RESIST_ATTACK;
  1360. X            } else {
  1361. X                if (!mdef->mcan)
  1362. X                    MB_RESIST_ATTACK;
  1363. X                /* cancelled clay golems will die ... */
  1364. X                else if (mdef->data == &mons[PM_CLAY_GOLEM])
  1365. X                    mdef->mhp = 1;
  1366. X            }
  1367. X            obfree(ospell, (struct obj *)0);
  1368. X        if (youdefend || mdef->mhp > 0) {  /* ??? -dkh- */
  1369. X            static const char *mb_verb[4] =
  1370. X                {"probe", "stun", "scare", "purge"};
  1371. X            if (youattack || youdefend || vis) {
  1372. X                pline("The magic-absorbing blade %ss %s!",
  1373. X                    mb_verb[attack_index], hittee);
  1374. X                if (MB_RESISTED_ATTACK) {
  1375. X                    pline("%s resist%s!",
  1376. X                    youdefend ? "You" : Monnam(mdef),
  1377. X                    youdefend ? "" : "s");
  1378. X                    shieldeff(youdefend ? u.ux : mdef->mx,
  1379. X                        youdefend ? u.uy : mdef->my);
  1380. X                }
  1381. X            }
  1382. X            /* Much ado about nothing.  More magic fanfare! */
  1383. X            if (MB_UWEP_ATTACK) {
  1384. X                if (attack_index == MB_INDEX_PURGE) {
  1385. X                    if (!MB_RESISTED_ATTACK &&
  1386. X                    attacktype(mdef->data, AT_MAGC)) {
  1387. X                    You("absorb magical energy!");
  1388. X                    u.uenmax++;
  1389. X                    u.uen++;
  1390. X                    flags.botl = 1;
  1391. X                    }
  1392. X                } else if (attack_index == MB_INDEX_PROBE) {
  1393. X                    if (!rn2(4 * otmp->spe)) {
  1394. X                    pline("The probe is insightful!");
  1395. X                    /* pre-damage status */
  1396. X                    mstatusline(mdef);
  1397. X                    }
  1398. X                }
  1399. X            } else if (youdefend && !MB_RESISTED_ATTACK
  1400. X                   && (attack_index == MB_INDEX_PURGE)) {
  1401. X                You("lose some magical energy!");
  1402. X                if (u.uenmax > 0) u.uenmax--;
  1403. X                if (u.uen > 0) u.uen--;
  1404. X                    flags.botl = 1;
  1405. X            }
  1406. X            /* all this magic is confusing ... */
  1407. X            if (!rn2(12)) {
  1408. X                if (youdefend)
  1409. X                make_confused((HConfusion + 4), FALSE);
  1410. X                else
  1411. X                mdef->mconf = 1;
  1412. X                if (youattack || youdefend || vis)
  1413. X                pline("%s %s confused.",
  1414. X                      youdefend ? "You" : Monnam(mdef),
  1415. X                      youdefend ? "are" : "is");
  1416. X            }
  1417. X        return TRUE;
  1418. X    /* end of Magicbane code */
  1419. X    /* We really want "on a natural 19 or 20" but Nethack does it in */
  1420. X    /* reverse from AD&D. */
  1421. X    if (spec_ability(otmp, SPFX_BEHEAD)) {
  1422. X#ifdef MULDGN
  1423. X        if (otmp->oartifact == ART_TSURUGI_OF_MURAMASA && dieroll <= 2) {
  1424. X        /* not really beheading, but so close, why add another SPFX */
  1425. X        if (youattack && u.uswallow && mdef == u.ustuck) {
  1426. X            You("slice %s wide open!", mon_nam(mdef));
  1427. X            *dmgptr = mdef->mhp;
  1428. X            return TRUE;
  1429. X        if (!youdefend) {
  1430. X            /* allow normal cutworm() call to add extra damage */
  1431. X            if(notonhead)
  1432. X                return FALSE;
  1433. X            if (bigmonst(mdef->data)) {
  1434. X                if (youattack)
  1435. X                    You("slice deeply into %s!",
  1436. X                        mon_nam(mdef));
  1437. X                else if (vis)
  1438. X                    pline("%s cuts deeply into %s!",
  1439. X                          Monnam(magr), mon_nam(mdef));
  1440. X                *dmgptr *= 2;
  1441. X                return TRUE;
  1442. X            }
  1443. X            *dmgptr = mdef->mhp;
  1444. X            pline("The razorsharp blade cuts %s in half!",
  1445. X                  mon_nam(mdef));
  1446. X            otmp->dknown = TRUE;
  1447. X            return TRUE;
  1448. X        } else {
  1449. X#ifdef POLYSELF
  1450. X            if (bigmonst(uasmon)) {
  1451. X                pline("%s cuts deeply into you!",
  1452. X                    Monnam(magr));
  1453. X                *dmgptr *= 2;
  1454. X                return TRUE;
  1455. X            }
  1456. X#endif
  1457. X            *dmgptr = u.uhp;
  1458. X            pline("The razorsharp blade cuts you in half!");
  1459. X            otmp->dknown = TRUE;
  1460. X            return TRUE;
  1461. X        } else 
  1462. X#endif /* MULDGN */
  1463. X            if (otmp->oartifact == ART_VORPAL_BLADE &&
  1464. X            (dieroll <= 2 || mdef->data == &mons[PM_JABBERWOCK])) {
  1465. X        if (youattack && u.uswallow && mdef == u.ustuck)
  1466. X            return FALSE;
  1467. X        if (!youdefend) {
  1468. X            if (!has_head(mdef->data) || notonhead) {
  1469. X                if (youattack)
  1470. X                    pline("Somehow you miss %s wildly.",
  1471. X                        mon_nam(mdef));
  1472. X                else if (vis)
  1473. X                    pline("Somehow %s misses wildly.",
  1474. X                        mon_nam(magr));
  1475. X                *dmgptr = 0;
  1476. X                return (youattack || vis);
  1477. X            }
  1478. X            *dmgptr = mdef->mhp;
  1479. X            pline("%s cuts off %s head!",
  1480. X                    artilist[ART_VORPAL_BLADE].name,
  1481. X                    s_suffix(mon_nam(mdef)));
  1482. X            otmp->dknown = TRUE;
  1483. X            return TRUE;
  1484. X        } else {
  1485. X#ifdef POLYSELF
  1486. X            if (!has_head(uasmon)) {
  1487. X                pline("Somehow %s misses you wildly.",
  1488. X                    mon_nam(magr));
  1489. X                *dmgptr = 0;
  1490. X                return TRUE;
  1491. X            }
  1492. X#endif
  1493. X            *dmgptr = u.uhp;
  1494. X            pline("%s cuts off your head!",
  1495. X                    artilist[ART_VORPAL_BLADE].name);
  1496. X            otmp->dknown = TRUE;
  1497. X            /* Should amulets fall off? */
  1498. X            return TRUE;
  1499. X        }
  1500. X    if (spec_ability(otmp, SPFX_DRLI)) {
  1501. X        if (!youdefend && !resists_drli(mdef->data)) {
  1502. X            if (vis) {
  1503. X                if(otmp->oartifact == ART_STORMBRINGER)
  1504. X                pline("The %s blade draws the life from %s!",
  1505. X                      Hallucination ? hcolor() : Black,
  1506. X                      mon_nam(mdef));
  1507. X                else
  1508. X                pline("%s draws the life from %s!",
  1509. X                      The(distant_name(otmp, xname)),
  1510. X                      mon_nam(mdef));
  1511. X            }
  1512. X            if (mdef->m_lev == 0) *dmgptr = mdef->mhp;
  1513. X            else {
  1514. X                int drain = rnd(8);
  1515. X                *dmgptr += drain;
  1516. X                mdef->mhpmax -= drain;
  1517. X                mdef->m_lev--;
  1518. X                drain /= 2;
  1519. X                if (drain) healup(drain, 0, FALSE, FALSE);
  1520. X            }
  1521. X            return vis;
  1522. X        } else if (youdefend
  1523. X#ifdef POLYSELF
  1524. X                    && !resists_drli(uasmon)
  1525. X#endif
  1526. X                    && !defends(AD_DRLI, uwep)) {
  1527. X            if (Blind)
  1528. X                You("feel an %s drain your life!",
  1529. X                    otmp->oartifact == ART_STORMBRINGER ?
  1530. X                    "unholy blade" : "object");
  1531. X            else {
  1532. X                if(otmp->oartifact == ART_STORMBRINGER)
  1533. X                pline("The %s blade drains your life!",
  1534. X                    Hallucination ? hcolor() : Black);
  1535. X                else
  1536. X                pline("%s drains your life!",
  1537. X                      The(distant_name(otmp, xname)));
  1538. X            }
  1539. X            losexp();
  1540. X            if (magr->mhp < magr->mhpmax) {
  1541. X                magr->mhp += rnd(4);
  1542. X                /* TODO: Should be related to # of HP you lost. */
  1543. X                if (magr->mhp > magr->mhpmax) magr->mhp = magr->mhpmax;
  1544. X            }
  1545. X            return TRUE;
  1546. X    return FALSE;
  1547. Xstatic const char recharge_type[] = { ALLOW_COUNT, ALL_CLASSES, 0 };
  1548. Xstatic const char NEARDATA invoke_types[] =
  1549. X    { ALL_CLASSES, WEAPON_CLASS, ARMOR_CLASS, RING_CLASS, AMULET_CLASS,
  1550. X          TOOL_CLASS, 0 };
  1551. Xdoinvoke()
  1552. X    register struct obj *obj;
  1553. X    obj = getobj(invoke_types, "invoke");
  1554. X    if(!obj) return 0;
  1555. X    return arti_invoke(obj);
  1556. XSTATIC_OVL int
  1557. Xarti_invoke(obj)
  1558. X    register struct obj *obj;
  1559. X    register const struct artifact *oart = get_artifact(obj);
  1560. X    if(!oart || !oart->inv_prop) {
  1561. X    if(obj->otyp == CRYSTAL_BALL)
  1562. X        use_crystal_ball(obj);
  1563. X    else
  1564. X        pline("Nothing happens.");
  1565. X    return 1;
  1566. X    }
  1567. X    if(oart->inv_prop > LAST_PROP) {
  1568. X    /* It's a special power, not "just" a property */
  1569. X    if(obj->age > monstermoves) {
  1570. X        /* the artifact is tired :-) */
  1571. X        You("feel that %s is ignoring you.", the(xname(obj)));
  1572. X        return 1;
  1573. X    obj->age = monstermoves + rnz(100);
  1574. X    switch(oart->inv_prop) {
  1575. X    case TAMING: {
  1576. X        struct obj *pseudo = mksobj(SPE_CHARM_MONSTER, FALSE, FALSE);
  1577. X        pseudo->blessed = pseudo->cursed = 0;
  1578. X        pseudo->quan = 20L;            /* do not let useup get it */
  1579. X        (void) seffects(pseudo);
  1580. X        obfree(pseudo, (struct obj *)0);    /* now, get rid of it */
  1581. X        break;
  1582. X      }
  1583. X    case HEALING: {
  1584. X        int healamt = (u.uhpmax + 1 - u.uhp) / 2;
  1585. X        if(healamt || Sick || (Blinded > 1))
  1586. X        You("feel better.");
  1587. X        else
  1588. X        goto nothing_special;
  1589. X        if(healamt) u.uhp += healamt;
  1590. X        if(Sick) make_sick(0L,FALSE);
  1591. X        if(Blinded > 1) make_blinded(0L,FALSE);
  1592. X        flags.botl = 1;
  1593. X        break;
  1594. X      }
  1595. X    case ENERGY_BOOST: {
  1596. X        int epboost = (u.uenmax + 1 - u.uen) / 2;
  1597. X        if(epboost) {
  1598. X        You("feel re-energized.");
  1599. X        u.uen += epboost;
  1600. X        } else
  1601. X        goto nothing_special;
  1602. X        break;
  1603. X      }
  1604. X    case UNTRAP: {
  1605. X        if(!untrap(TRUE)) {
  1606. X        obj->age = 0; /* don't charge for changing their mind */
  1607. X        return 0;
  1608. X        }
  1609. X        break;
  1610. X      }
  1611. X    case CHARGE_OBJ: {
  1612. X        struct obj *otmp = getobj(recharge_type, "charge");
  1613. X        if (!otmp) {
  1614. X        obj->age = 0;
  1615. X        return 0;
  1616. X        }
  1617. X        recharge(otmp, obj->blessed ? 1 : obj->cursed ? -1 : 0);
  1618. X        break;
  1619. X      }
  1620. X    case LEV_TELE:
  1621. X        level_tele();
  1622. X        break;
  1623. X    case CREATE_PORTAL: {
  1624. X        register int i;
  1625. X        d_level newlev;
  1626. X        char buf[BUFSIZ];
  1627. X        extern int n_dgns; /* from dungeon.c */
  1628. X        winid tmpwin = create_nhwindow(NHW_MENU);
  1629. X        char hc;
  1630. X        start_menu(tmpwin);
  1631. X        add_menu(tmpwin, 0, 0, "Dungeons:");
  1632. X        add_menu(tmpwin, 0, 0, "");
  1633. X        for (i = 0, hc = 'a'; i < n_dgns; i++) {
  1634. X        if (!dungeons[i].dunlev_ureached) continue;
  1635. X        Sprintf(buf, "%c - %s", hc, dungeons[i].dname);
  1636. X        add_menu(tmpwin, hc, 0, buf);
  1637. X        hc++;
  1638. X        }
  1639. X        add_menu(tmpwin, 0, 0, "");
  1640. X        end_menu(tmpwin, '\033', "\033","Open a portal to which dungeon?");
  1641. X        if (hc > 'b') {
  1642. X        /* more than one entry; display menu for choices */
  1643. X        hc = select_menu(tmpwin);
  1644. X        } else
  1645. X        hc = 'a';
  1646. X        destroy_nhwindow(tmpwin);
  1647. X        /* assume there won't be more than 26 dungeons */
  1648. X        if (hc < 'a' || hc > 'z')
  1649. X        goto nothing_special;
  1650. X        /* run thru dungeon array to find the one they selected */
  1651. X        for (i = 0; hc >= 'a'; i++)
  1652. X        if (dungeons[i].dunlev_ureached) hc--;
  1653. X        i--; /* we added one extra */
  1654. X        /*
  1655. X         * i is now index into dungeon structure for the new dungeon.
  1656. X         * Find the closest level in the given dungeon, open
  1657. X         * a use-once portal to that dungeon and go there.
  1658. X         * The closest level is either the entry or dunlev_ureached.
  1659. X         */
  1660. X        newlev.dnum = i;
  1661. X        if(dungeons[i].depth_start >= depth(&u.uz))
  1662. X        newlev.dlevel = dungeons[i].entry_lev;
  1663. X        else
  1664. X        newlev.dlevel = dungeons[i].dunlev_ureached;
  1665. X        if(u.uhave.amulet || In_endgame(&u.uz) || In_endgame(&newlev) ||
  1666. X           newlev.dnum == u.uz.dnum) {
  1667. X        You("feel very disoriented for a moment.");
  1668. X        } else {
  1669. X        if(!Blind) You("are surrounded by a shimmering sphere!");
  1670. X        else You("momentarily feel weightless.");
  1671. X        goto_level(&newlev, FALSE, FALSE, FALSE);
  1672. X        }
  1673. X        break;
  1674. X      }
  1675. X    } else {
  1676. X    boolean on;
  1677. X    unsigned long cprop;
  1678. X    cprop = u.uprops[oart->inv_prop].p_flgs ^= W_ARTI;
  1679. X    on = (cprop & W_ARTI) != 0; /* did we just turn on the invoked prop? */
  1680. X    if(on && obj->age > monstermoves) {
  1681. X        /* the artifact is tired :-) */
  1682. X        u.uprops[oart->inv_prop].p_flgs ^= W_ARTI;
  1683. X        You("feel that %s is ignoring you.", the(xname(obj)));
  1684. X        return 1;
  1685. X    } else if(!on) {
  1686. X        /* when turning off property, determine downtime */
  1687. X        /* arbitrary for now until we can tune this -dlc */
  1688. X        obj->age = monstermoves + rnz(100);
  1689. X    if(cprop & ~W_ARTI) {
  1690. X    nothing_special:
  1691. X        /* you had the property from some other source too */
  1692. X        if (carried(obj))
  1693. X        You("feel a surge of power, but notice no effect.");
  1694. X        return 1;
  1695. X    switch(oart->inv_prop) {
  1696. X    case CONFLICT:
  1697. X        if(on) You("feel like a rabble-rouser.");
  1698. X        else You("feel the tension decrease in your vicinity.");
  1699. X        break;
  1700. X    case LEVITATION:
  1701. X        if(on) float_up();
  1702. X        else (void) float_down();
  1703. X        break;
  1704. X    case INVIS:
  1705. X        if (!See_invisible && !Blind) {
  1706. X        newsym(u.ux,u.uy);
  1707. X        if (on) {
  1708. X            Your("body takes on a %s transparency...",
  1709. X             Hallucination ? "normal" : "strange");
  1710. X        } else {
  1711. X            Your("body seems to unfade...");
  1712. X        } else goto nothing_special;
  1713. X        break;
  1714. X    }
  1715. X    return 1;
  1716. X#endif /* OVLB */
  1717. X/*artifact.c*/
  1718. END_OF_FILE
  1719. if test 28827 -ne `wc -c <'src/artifact.c'`; then
  1720.     echo shar: \"'src/artifact.c'\" unpacked with wrong size!
  1721. # end of 'src/artifact.c'
  1722. echo shar: End of archive 74 \(of 108\).
  1723. cp /dev/null ark74isdone
  1724. MISSING=""
  1725. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  1726. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  1727. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  1728. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  1729. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  1730. 101 102 103 104 105 106 107 108 ; do
  1731.     if test ! -f ark${I}isdone ; then
  1732.     MISSING="${MISSING} ${I}"
  1733.     fi
  1734. if test "${MISSING}" = "" ; then
  1735.     echo You have unpacked all 108 archives.
  1736.     echo "Now execute 'rebuild.sh'"
  1737.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  1738.     echo You still need to unpack the following archives:
  1739.     echo "        " ${MISSING}
  1740. ##  End of shell archive.
  1741. exit 0
  1742.