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

  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: v16i023:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part23/108
  5. Message-ID: <4311@master.CNA.TEK.COM>
  6. Date: 29 Jan 93 20:44:19 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 1338
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1580
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 23
  14. Archive-name: nethack31/Part23
  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 23 (of 108)."
  27. # Contents:  src/objects.c src/timeout.c
  28. # Wrapped by billr@saab on Wed Jan 27 16:08:55 1993
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'src/objects.c' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'src/objects.c'\"
  32. else
  33. echo shar: Extracting \"'src/objects.c'\" \(41735 characters\)
  34. sed "s/^X//" >'src/objects.c' <<'END_OF_FILE'
  35. X/*    SCCS Id: @(#)objects.c    3.1    92/12/13    */
  36. X/*    Copyright (c) Mike Threepoint, 1989 (890110) */
  37. X/* NetHack may be freely redistributed.  See license for details. */
  38. X
  39. X#ifndef OBJECTS_PASS_2_
  40. X/* first pass */
  41. X# include "config.h"
  42. X# include "obj.h"
  43. X# include "objclass.h"
  44. X# include "prop.h"
  45. X
  46. X#else    /* !OBJECTS_PASS_2_ */
  47. X/* second pass */
  48. X# ifdef TEXTCOLOR
  49. X#include "color.h"
  50. X# endif
  51. X#endif    /* !OBJECTS_PASS_2_ */
  52. X
  53. X/* objects have symbols: ) [ = " ( % ! ? + / $ * ` 0 _ . */
  54. X
  55. X#ifndef OBJECTS_PASS_2_
  56. X/* first pass -- object descriptive text */
  57. X# define OBJ(name,desc) name,desc
  58. X# define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color) \
  59. X    {obj}
  60. X/* note:  OBJ and BITS macros used to get around compiler argument limits */
  61. X/*    the ctnr field of BITS currently does not map into struct objclass,
  62. X *    and is ignored in the expansion */
  63. X
  64. Xstruct objdescr NEARDATA obj_descr[] = {
  65. X#else
  66. X/* second pass -- object definitions */
  67. X
  68. X# define BITS(nmkn,mrg,uskn,ctnr,mgc,chrg,uniq,big,dir,mtrl) nmkn,mrg,uskn,mgc,chrg,uniq,big,dir,mtrl /* SCO ODT 1.1 cpp fodder */
  69. X/* SCO's version of MSC 5.x barfs on the line above without a trailing space */
  70. X
  71. X#ifdef TEXTCOLOR
  72. X# define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color) \
  73. X    {0, 0, NULL, bits, prp, sym, dly, color,\
  74. X     prob, wt, cost, sdam, ldam, oc1, oc2, nut}
  75. X#else
  76. X# define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color) \
  77. X    {0, 0, NULL, bits, prp, sym, dly,\
  78. X     prob, wt, cost, sdam, ldam, oc1, oc2, nut}
  79. X#endif
  80. X
  81. Xstruct objclass NEARDATA objects[] = {
  82. X#endif
  83. X/* dummy object[0] -- description [2nd arg] *must* be NULL */
  84. X    OBJECT(OBJ("strange object",NULL), BITS(1,0,0,0,0,0,0,0,0,0), 0,
  85. X            ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
  86. X
  87. X/* weapons ... */
  88. X#define WEAPON(name,app,kn,mg,bi,prob,wt,cost,sdam,ldam,hitbon,metal,color) OBJECT( \
  89. X        OBJ(name,app), BITS(kn,mg,1,0,0,1,0,bi,0,metal), 0, \
  90. X        WEAPON_CLASS, prob, 0, \
  91. X        wt, cost, sdam, ldam, hitbon, 0, wt, color )
  92. X#define PROJECTILE(name,app,kn,prob,wt,cost,sdam,ldam,hitbon,metal,prop,color) OBJECT( \
  93. X        OBJ(name,app), BITS(kn,1,1,0,0,1,0,0,0,metal), 0, \
  94. X        WEAPON_CLASS, prob, 0, \
  95. X        wt, cost, sdam, ldam, hitbon, prop, wt, color )
  96. X#define BOW(name,app,kn,prob,wt,cost,sdam,ldam,hitbon,metal,prop,color) OBJECT( \
  97. X        OBJ(name,app), BITS(kn,0,1,0,0,1,0,0,0,metal), 0, \
  98. X        WEAPON_CLASS, prob, 0, \
  99. X        wt, cost, sdam, ldam, hitbon, -(prop), wt, color )
  100. X
  101. X/* Note: for weapons that don't do an even die of damage (ex. 2-7 or 3-18)
  102. X * the extra damage is added on in weapon.c, not here! */
  103. X
  104. X/* missiles */
  105. XPROJECTILE("arrow",             NULL,           1,  42, 1,  2, 6, 6, 0,
  106. X           IRON, WP_BOW, HI_METAL),
  107. XPROJECTILE("elven arrow",       "runed arrow",  0,  10, 1,  2, 7, 6, 0,
  108. X           IRON, WP_BOW, HI_METAL),
  109. XPROJECTILE("orcish arrow",      "crude arrow",  0,  11, 1,  2, 5, 6, 0,
  110. X           IRON, WP_BOW, BLACK),
  111. XPROJECTILE("silver arrow",      NULL,           1,   8, 1,  2, 6, 6, 0,
  112. X           SILVER, WP_BOW, HI_SILVER),
  113. XPROJECTILE("ya",                "bamboo arrow", 0,   5, 1,  4, 7, 7, 1,
  114. X           METAL, WP_BOW, HI_METAL),
  115. XPROJECTILE("crossbow bolt",     NULL,           1,  50, 1,  2, 4, 6, 0,
  116. X           IRON, WP_CROSSBOW, HI_METAL),
  117. X
  118. XWEAPON("dart",          NULL,           1, 1, 0, 60,  1,  2, 3, 2, 0, IRON, HI_METAL),
  119. XWEAPON("shuriken",      "throwing star",0, 1, 0, 35,  1,  5, 8, 6, 2, IRON, HI_METAL),
  120. XWEAPON("boomerang",     NULL,           1, 1, 0, 15,  5, 20, 9, 9, 0, WOOD, HI_WOOD),
  121. X
  122. X/* spears */
  123. XWEAPON("spear",         NULL,           1, 1, 0, 50, 30,  3, 6, 8, 0, IRON, HI_METAL),
  124. XWEAPON("elven spear",   "runed spear",  0, 1, 0, 10, 30,  3, 7, 8, 0, IRON, HI_METAL),
  125. XWEAPON("orcish spear",  "crude spear",  0, 1, 0, 13, 30,  3, 5, 8, 0, IRON, BLACK),
  126. XWEAPON("dwarvish spear", "stout spear", 0, 1, 0, 12, 35,  3, 8, 8, 0, IRON, HI_METAL),
  127. XWEAPON("javelin",       "throwing spear",0,1, 0, 10, 20,  3, 6, 6, 0, IRON, HI_METAL),
  128. XWEAPON("trident",       NULL,           1, 0, 0,  8, 25,  5, 6, 4, 0, IRON, HI_METAL),
  129. X                        /* +1 small, +2d4 large */
  130. XWEAPON("lance",         NULL,           1, 0, 0,  8,180, 10, 6, 8, 0, IRON, HI_METAL),
  131. X
  132. X/* blades */
  133. XWEAPON("dagger",        NULL,           1, 1, 0, 25, 10,  4,  4,  3, 2, IRON, HI_METAL),
  134. XWEAPON("elven dagger",  "runed dagger", 0, 1, 0,  8, 10,  4,  5,  3, 2, IRON, HI_METAL),
  135. XWEAPON("orcish dagger", "crude dagger", 0, 1, 0, 10, 10,  4,  3,  3, 2, IRON, BLACK),
  136. XWEAPON("athame",        NULL,           1, 1, 0,  0, 10,  4,  4,  3, 2, IRON, HI_METAL),
  137. XWEAPON("scalpel",       NULL,           1, 1, 0,  0,  5,  4,  3,  3, 2, IRON, HI_METAL),
  138. XWEAPON("knife",         NULL,           1, 1, 0, 20,  5,  4,  3,  2, 0, IRON, HI_METAL),
  139. XWEAPON("stiletto",      NULL,           1, 1, 0,  5,  5,  4,  3,  2, 0, IRON, HI_METAL),
  140. XWEAPON("worm tooth",    NULL,           1, 0, 0,  0, 20,  2,  2,  2, 0, 0, WHITE),
  141. XWEAPON("crysknife",     NULL,           1, 0, 0,  0, 20,100, 10, 10, 3, MINERAL, WHITE),
  142. XWEAPON("dwarvish mattock",      "heavy pick",
  143. X                    0, 0, 1, 13,120, 50,12, 8,-1, IRON, HI_METAL),
  144. XWEAPON("axe",           NULL,           1, 0, 0, 40, 60,  8,  6,  4, 0, IRON, HI_METAL),
  145. XWEAPON("battle-axe","double-headed axe",0, 0, 1, 10,120, 40,  8,  6, 0, IRON, HI_METAL),
  146. X                        /* "double-bitted" ? */
  147. X
  148. X/* swords */
  149. XWEAPON("short sword",           NULL,   1, 0, 0,  8, 30, 10,  6,  8, 0, IRON, HI_METAL),
  150. XWEAPON("elven short sword",     "runed short sword",
  151. X                    0, 0, 0,  2, 30, 10,  8,  8, 0, IRON, HI_METAL),
  152. XWEAPON("orcish short sword", "crude short sword",
  153. X                    0, 0, 0,  3, 30, 10,  5,  8, 0, IRON, BLACK),
  154. XWEAPON("dwarvish short sword", "broad short sword",
  155. X                    0, 0, 0,  2, 30, 10,  7,  8, 0, IRON, HI_METAL),
  156. XWEAPON("scimitar", "curved sword",    0, 0, 0, 15, 40, 15,  8,  8, 0, IRON, HI_METAL),
  157. XWEAPON("silver saber", NULL,        1, 0, 0,  6, 40, 75,  8,  8, 0, SILVER, HI_SILVER),
  158. XWEAPON("broadsword", NULL,        1, 0, 0,  8, 70, 10,  4,  6, 0, IRON, HI_METAL),
  159. X                        /* +d4 small, +1 large */
  160. XWEAPON("elven broadsword", "runed broadsword",
  161. X                    0, 0, 0,  4, 70, 10,  6,  6, 0, IRON, HI_METAL),
  162. X                        /* +d4 small, +1 large */
  163. XWEAPON("long sword", NULL,        1, 0, 0, 50, 40, 15,  8, 12, 0, IRON, HI_METAL),
  164. XWEAPON("two-handed sword", NULL,    1, 0, 1, 22,150, 50, 12,  6, 0, IRON, HI_METAL),
  165. X                        /* +2d6 large */
  166. XWEAPON("katana", "samurai sword",    0, 0, 0,  4, 40, 80, 10, 12, 1, IRON, HI_METAL),
  167. X/* two set-up-for-artifacts swords */
  168. X                        /* +2d6 large */
  169. XWEAPON("tsurugi", "long samurai sword", 0, 0, 1,  0, 60,500, 16,  8, 2, METAL, HI_METAL),
  170. X                        /* +5 */
  171. XWEAPON("runesword", "runed broadsword", 0, 0, 0,  0, 40,300,  4,  6, 0, IRON, BLACK),
  172. X                        /* +d4 small, +1 large */
  173. X                        /* +5d2 +d8 from level drain */
  174. X
  175. X/* polearms */
  176. X/* spear-type */
  177. XWEAPON("partisan", "vulgar polearm",    0, 0, 1, 10, 80, 10,  6, 6, 0, IRON, HI_METAL),
  178. X                        /* +1 large */
  179. XWEAPON("ranseur", "hilted polearm",     0, 0, 1, 10, 50,  6,  4, 4, 0, IRON, HI_METAL),
  180. X                        /* +d4 both */
  181. XWEAPON("spetum", "forked polearm",      0, 0, 1, 10, 50,  5,  6, 6, 0, IRON, HI_METAL),
  182. X                        /* +1 small, +d6 large */
  183. XWEAPON("glaive", "single-edged polearm",0, 0, 1, 15, 75,  6,  6,10, 0, IRON, HI_METAL),
  184. X/* axe-type */
  185. XWEAPON("halberd", "angled poleaxe",     0, 0, 1, 16,150, 10, 10, 6, 0, IRON, HI_METAL),
  186. X                        /* +1d6 large */
  187. XWEAPON("bardiche", "long poleaxe",      0, 0, 1,  8,120,  7,  4, 4, 0, IRON, HI_METAL),
  188. X                        /* +1d4 small, +2d4 large */
  189. XWEAPON("voulge", "pole cleaver",        0, 0, 1,  8,125,  5,  4, 4, 0, IRON, HI_METAL),
  190. X                        /* +d4 both */
  191. X/* curved/hooked */
  192. XWEAPON("fauchard",      "pole sickle",  0, 0, 1, 11, 60,  5,  6, 8, 0, IRON, HI_METAL),
  193. XWEAPON("guisarme",      "pruning hook", 0, 0, 1, 11, 80,  5,  4, 8, 0, IRON, HI_METAL),
  194. X                        /* +1d4 small */
  195. XWEAPON("bill-guisarme", "hooked polearm",0,0, 1,  8,120,  7,  4,10, 0, IRON, HI_METAL),
  196. X                        /* +1d4 small */
  197. X/* other */
  198. XWEAPON("lucern hammer", "pronged polearm",0,0,1, 10,150,  7,  4, 6, 0, IRON, HI_METAL),
  199. X                        /* +1d4 small */
  200. XWEAPON("bec de corbin", "beaked polearm",0,0, 1,  8,100,  8,  8, 6, 0, IRON, HI_METAL),
  201. X
  202. X/* blunt */
  203. XWEAPON("mace",          NULL,           1, 0, 0, 40, 30,  5,  6, 6, 0, IRON, HI_METAL),
  204. X                        /* +1 small */
  205. XWEAPON("morning star",  NULL,           1, 0, 0, 12,120, 10,  4, 6, 0, IRON, HI_METAL),
  206. X                        /* +d4 small, +1 large */
  207. XWEAPON("war hammer",    NULL,           1, 0, 0, 15, 50,  5,  4, 4, 0, IRON, HI_METAL),
  208. X                        /* +1 small */
  209. XWEAPON("club",          NULL,           1, 0, 0, 12, 30,  3,  6, 3, 0, WOOD, HI_WOOD),
  210. X#ifdef KOPS
  211. XWEAPON("rubber hose",   NULL,           1, 0, 0,  0, 20,  3,  4, 3, 0, 0, BROWN),
  212. X#endif
  213. XWEAPON("quarterstaff",  "staff",        0, 0, 1, 11, 40,  5,  6, 6, 0, WOOD, HI_WOOD),
  214. X/* two-piece */
  215. XWEAPON("aklys",         "thonged club", 0, 0, 0,  8, 15,  4,  6, 3, 0, IRON, HI_METAL),
  216. XWEAPON("flail",         NULL,           1, 0, 0, 40, 15,  4,  6, 4, 0, IRON, HI_METAL),
  217. X                        /* +1 small, +1d4 large */
  218. X/* whip */
  219. XWEAPON("bullwhip",      NULL,           1, 0, 0,  2, 20,  4,  2, 1, 0, LEATHER, BROWN),
  220. X
  221. X/* bows */
  222. XBOW("bow",        NULL,         1,  24, 30,  60, 30, 6, 0, WOOD, WP_BOW, HI_WOOD),
  223. XBOW("elven bow",  "runed bow",  0,  12, 30,  60, 35, 6, 0, WOOD, WP_BOW, HI_WOOD),
  224. XBOW("orcish bow", "crude bow",  0,  12, 30,  60, 25, 6, 0, WOOD, WP_BOW, BLACK),
  225. XBOW("yumi",       "long bow",   0,   0, 30,  60, 35, 6, 0, WOOD, WP_BOW, HI_WOOD),
  226. XBOW("sling",      NULL,         1,  40,  3,  20,  4, 6, 0, WOOD, WP_SLING, HI_WOOD),
  227. XBOW("crossbow",   NULL,         1,  45, 50,  40, 35, 6, 0, WOOD, WP_CROSSBOW, HI_WOOD),
  228. X#undef WEAPON
  229. X#undef PROJECTILE
  230. X#undef BOW
  231. X
  232. X/* armor ... */
  233. X/* IRON denotes ferrous metals, including steel.
  234. X * Only IRON weapons and armor can rust.
  235. X * Only COPPER (including brass) corrodes.
  236. X * Some creatures are vulnerable to SILVER.
  237. X */
  238. X#define ARMOR(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,metal,c) OBJECT( \
  239. X        OBJ(name,desc), BITS(kn,0,1,0,mgc,1,0,blk,0,metal), power, \
  240. X        ARMOR_CLASS, prob, delay, wt, cost, \
  241. X        0, 0, 10 - ac, can, wt, c )
  242. X
  243. X/* helmets */
  244. XARMOR("elven leather helm", "leather hat",
  245. X        0, 0, 0, 0,  6, 1,  3,     8, 9, 0, LEATHER, HI_LEATHER),
  246. XARMOR("orcish helm", "iron skull cap",
  247. X        0, 0, 0, 0,  6, 1, 30,    10, 9, 0, IRON, BLACK),
  248. XARMOR("dwarvish iron helm", "hard hat",
  249. X        0, 0, 0, 0,  6, 1, 40,    20, 8, 0, IRON, HI_METAL),
  250. XARMOR("fedora", NULL,
  251. X        1, 0, 0, 0,  0, 0,  3,     1,10, 0, CLOTH, BROWN),
  252. XARMOR("dented pot", NULL,
  253. X        1, 0, 0, 0,  2, 0, 10,     8, 9, 0, IRON, BLACK),
  254. XARMOR("helmet", "plumed helmet",
  255. X        0, 0, 0, 0, 10, 1, 30,    10, 9, 0, IRON, HI_METAL),
  256. XARMOR("helm of brilliance", "etched helmet",
  257. X        0, 1, 0, 0,  6, 1, 50,    50, 9, 0, IRON, GREEN),
  258. XARMOR("helm of opposite alignment", "crested helmet",
  259. X        0, 1, 0, 0,  6, 1, 50,    50, 9, 0, IRON, HI_METAL),
  260. XARMOR("helm of telepathy", "visored helmet",
  261. X        0, 1, 0, TELEPAT, 2, 1, 50, 50, 9, 0, IRON, HI_METAL),
  262. X
  263. X/* suits of armor */
  264. X/*
  265. X * There is code in polyself.c that assumes (1) and (2).
  266. X * There is code in objnam.c, mon.c, read.c that assumes (2).
  267. X *
  268. X *    (1) The dragon scale mails and the dragon scales are together.
  269. X *    (2) That the order of the dragon scale mail and dragon scales is the
  270. X *        the same defined in monst.c.
  271. X */
  272. X#define DRGN_ARMR(name,power,cost,ac,color) \
  273. X    ARMOR(name,NULL,1,0,1,power,0,5,40,cost,ac,0,DRAGON_HIDE,color)
  274. XDRGN_ARMR("gray dragon scale mail",   ANTIMAGIC,  1200, 1, GRAY),
  275. XDRGN_ARMR("red dragon scale mail",    FIRE_RES,    900, 1, RED),
  276. XDRGN_ARMR("white dragon scale mail",  COLD_RES,    900, 1, WHITE),
  277. XDRGN_ARMR("orange dragon scale mail", SLEEP_RES,   900, 1, ORANGE_COLORED),
  278. XDRGN_ARMR("black dragon scale mail",  DISINT_RES, 1200, 1, BLACK),
  279. XDRGN_ARMR("blue dragon scale mail",   SHOCK_RES,   900, 1, BLUE),
  280. XDRGN_ARMR("green dragon scale mail",  POISON_RES,  900, 1, GREEN),
  281. XDRGN_ARMR("yellow dragon scale mail", 0,           900, 1, YELLOW),
  282. X
  283. X/* For now, only dragons leave these. */
  284. XDRGN_ARMR("gray dragon scales",   ANTIMAGIC,  700, 7, GRAY),
  285. XDRGN_ARMR("red dragon scales",    FIRE_RES,   500, 7, RED),
  286. XDRGN_ARMR("white dragon scales",  COLD_RES,   500, 7, WHITE),
  287. XDRGN_ARMR("orange dragon scales", SLEEP_RES,  500, 7, ORANGE_COLORED),
  288. XDRGN_ARMR("black dragon scales",  DISINT_RES, 700, 7, BLACK),
  289. XDRGN_ARMR("blue dragon scales",   SHOCK_RES,  500, 7, BLUE),
  290. XDRGN_ARMR("green dragon scales",  POISON_RES, 500, 7, GREEN),
  291. XDRGN_ARMR("yellow dragon scales", 0,          500, 7, YELLOW),
  292. X#undef DRGN_ARMR
  293. X
  294. XARMOR("plate mail", NULL,
  295. X        1, 0, 1, 0,    44, 5, 450, 600,  3, 2, IRON, HI_METAL),
  296. XARMOR("crystal plate mail", NULL,
  297. X        1, 0, 1, 0,    10, 5, 450, 820,  3, 2, GLASS, WHITE),
  298. X#ifdef TOURIST
  299. XARMOR("bronze plate mail", NULL,
  300. X        1, 0, 1, 0,    25, 5, 450, 400,  4, 0, COPPER, HI_COPPER),
  301. X#else
  302. XARMOR("bronze plate mail", NULL,
  303. X        1, 0, 1, 0,    35, 5, 450, 400,  4, 0, COPPER, HI_COPPER),
  304. X#endif
  305. XARMOR("splint mail", NULL,
  306. X        1, 0, 1, 0,    66, 5, 400,  80,  4, 1, IRON, HI_METAL),
  307. XARMOR("banded mail", NULL,
  308. X        1, 0, 1, 0,    76, 5, 350,  90,  4, 0, IRON, HI_METAL),
  309. XARMOR("dwarvish mithril-coat", NULL,
  310. X        1, 0, 0, 0,    10, 1, 150, 240,  4, 3, MITHRIL, HI_METAL),
  311. XARMOR("elven mithril-coat", NULL,
  312. X        1, 0, 0, 0,    15, 1, 150, 240,  5, 3, MITHRIL, HI_METAL),
  313. XARMOR("chain mail", NULL,
  314. X        1, 0, 0, 0,    76, 5, 300,  75,  5, 1, IRON, HI_METAL),
  315. XARMOR("orcish chain mail", "crude chain mail",
  316. X        0, 0, 0, 0,    20, 5, 300,  75,  5, 1, IRON, BLACK),
  317. XARMOR("scale mail", NULL,
  318. X        1, 0, 0, 0,    76, 5, 250,  45,  6, 0, IRON, HI_METAL),
  319. XARMOR("studded leather armor", NULL,
  320. X        1, 0, 0, 0,    76, 3, 200,  15,  7, 1, LEATHER, HI_LEATHER),
  321. XARMOR("ring mail", NULL,
  322. X        1, 0, 0, 0,    76, 5, 250, 100,  7, 0, IRON, HI_METAL),
  323. XARMOR("orcish ring mail", "crude ring mail",
  324. X        0, 0, 0, 0,    20, 5, 250,  80,  8, 1, IRON, BLACK),
  325. XARMOR("leather armor", NULL,
  326. X        1, 0, 0, 0,    85, 3, 150,   5,  8, 0, LEATHER, HI_LEATHER),
  327. XARMOR("leather jacket", NULL,
  328. X        1, 0, 0, 0,    12, 0,  30,  10,  9, 0, LEATHER, BLACK),
  329. X
  330. X/* cloaks */
  331. X/*  'cope' is not a spelling mistake... leave it be */
  332. XARMOR("mummy wrapping", NULL,
  333. X        1, 0, 0, 0,        0, 0,  3,   2, 10, 1, CLOTH, GRAY),
  334. XARMOR("elven cloak", "faded pall",
  335. X        0, 1, 0, STEALTH,      10, 0, 10,  60,    9, 3, CLOTH, BLACK),
  336. XARMOR("orcish cloak", "coarse mantelet",
  337. X        0, 0, 0, 0,           10, 0, 10,  40, 10, 2, CLOTH, BLACK),
  338. XARMOR("dwarvish cloak", "hooded cloak",
  339. X        0, 0, 0, 0,           10, 0, 10,  50, 10, 2, CLOTH, HI_CLOTH),
  340. XARMOR("oilskin cloak", "slippery cloak",
  341. X        0, 0, 0, 0,           10, 0, 10,  50,  9, 3, CLOTH, HI_CLOTH),
  342. XARMOR("cloak of protection", "tattered cape",
  343. X        0, 1, 0, PROTECTION,   10, 0, 10,  50,    7, 3, CLOTH, HI_CLOTH),
  344. XARMOR("cloak of invisibility", "opera cloak",
  345. X        0, 1, 0, INVIS,        11, 0, 10,  60,    9, 2, CLOTH, BRIGHT_MAGENTA),
  346. XARMOR("cloak of magic resistance", "ornamental cope",
  347. X        0, 1, 0, ANTIMAGIC,    2, 0, 10,  60,    9, 3, CLOTH, WHITE),
  348. XARMOR("cloak of displacement", "piece of cloth",
  349. X        0, 1, 0, DISPLACED,    11, 0, 10,  50,    9, 2, CLOTH, HI_CLOTH),
  350. X
  351. X/* shields */
  352. XARMOR("small shield", NULL,
  353. X            1, 0, 0, 0,    6, 0, 30,   3,    9, 0, WOOD, HI_WOOD),
  354. X/* TODO: these shield descriptions should be changed,
  355. X * because you can't see colors when blind.
  356. X */
  357. XARMOR("elven shield", "blue and green shield",
  358. X            0, 0, 0, 0,    2, 0, 50,   7,    8, 0, IRON, GREEN),
  359. XARMOR("Uruk-hai shield", "white-handed shield",
  360. X            0, 0, 0, 0,    2, 0, 50,   7,    9, 0, IRON, HI_METAL),
  361. XARMOR("orcish shield", "red-eyed shield",
  362. X            0, 0, 0, 0,    2, 0, 50,   7,    9, 0, IRON, RED),
  363. XARMOR("large shield", NULL,
  364. X            1, 0, 1, 0,    7, 0,100,  10,    8, 0, IRON, HI_METAL),
  365. XARMOR("dwarvish roundshield", "large round shield",
  366. X            0, 0, 0, 0,    4, 0,100,  10,    8, 0, IRON, HI_METAL),
  367. XARMOR("shield of reflection", "polished silver shield",
  368. X        0, 1, 0, REFLECTING,    3, 0, 50,  50,    8, 0, SILVER,  HI_SILVER),
  369. X
  370. X#ifdef TOURIST
  371. X/* shirt */
  372. XARMOR("Hawaiian shirt", NULL,
  373. X        1, 0, 0, 0,           10, 0,  5,   3, 10, 0, CLOTH,   MAGENTA),
  374. X#endif
  375. X
  376. X/* gloves */
  377. XARMOR("leather gloves", "old gloves",
  378. X    0, 0, 0, 0,           16, 1, 10,   8,    9, 0, LEATHER, HI_LEATHER),
  379. XARMOR("gauntlets of fumbling", "padded gloves",
  380. X    0, 1, 0, FUMBLING,    8, 1, 10,  50,    9, 0, LEATHER, HI_LEATHER),
  381. XARMOR("gauntlets of power", "riding gloves",
  382. X    0, 1, 0, 0,        8, 1, 30,  50,    9, 0, IRON,    BROWN),
  383. XARMOR("gauntlets of dexterity", "fencing gloves",
  384. X    0, 1, 0, 0,        8, 1, 10,  50,    9, 0, LEATHER, HI_LEATHER),
  385. X
  386. X/* boots */
  387. XARMOR("low boots", "walking shoes",
  388. X    0, 0, 0, 0,           25, 2, 10,   8,    9, 0, LEATHER, HI_LEATHER),
  389. XARMOR("iron shoes", "hard shoes",
  390. X    0, 0, 0, 0,        7, 2, 50,  16,    8, 0, IRON,    HI_METAL),
  391. XARMOR("high boots", "jackboots",
  392. X    0, 0, 0, 0,           15, 2, 20,  12,    8, 0, LEATHER, HI_LEATHER),
  393. XARMOR("speed boots", "combat boots",
  394. X    0, 1, 0, FAST,           12, 2, 20,  50,    9, 0, LEATHER, HI_LEATHER),
  395. XARMOR("water walking boots", "jungle boots",
  396. X    0, 1, 0, WWALKING,     12, 2, 20,  50,    9, 0, LEATHER, HI_LEATHER),
  397. XARMOR("jumping boots", "hiking boots",
  398. X    0, 1, 0, JUMPING,      12, 2, 20,  50,    9, 0, LEATHER, HI_LEATHER),
  399. XARMOR("elven boots", "mud boots",
  400. X    0, 1, 0, STEALTH,      12, 2, 15,   8,    9, 0, LEATHER, HI_LEATHER),
  401. XARMOR("fumble boots", "riding boots",
  402. X    0, 1, 0, FUMBLING,     12, 2, 20,  30,    9, 0, LEATHER, HI_LEATHER),
  403. XARMOR("levitation boots", "snow boots",
  404. X    0, 1, 0, LEVITATION,   12, 2, 15,  30,    9, 0, LEATHER, HI_LEATHER),
  405. X#undef ARMOR
  406. X
  407. X/* rings ... */
  408. X#define RING(name,stone,power,cost,mgc,spec,metal,color) OBJECT( \
  409. X        OBJ(name,stone), BITS(0,0,spec,0,mgc,spec,0,0,0,metal), \
  410. X        power, RING_CLASS, 0, 0, 3, cost, 0, 0, 0, 0, 15, color )
  411. XRING("adornment",         "wooden",     ADORNED,        100, 0, 1, WOOD,     HI_WOOD),
  412. XRING("gain strength",     "granite",    0,              150, 1, 1, MINERAL,  HI_MINERAL),
  413. XRING("increase damage",   "coral",      0,              150, 1, 1, MINERAL,  ORANGE_COLORED),
  414. XRING("protection",        "black onyx", PROTECTION,     100, 1, 1, MINERAL,  BLACK),
  415. XRING("regeneration",      "moonstone",  REGENERATION,   200, 1, 0, MINERAL,  HI_MINERAL),
  416. XRING("searching",         "tiger eye",  SEARCHING,      200, 1, 0, GEMSTONE, BROWN),
  417. XRING("stealth",           "jade",       STEALTH,        100, 1, 0, GEMSTONE, GREEN),
  418. XRING("levitation",        "agate",      LEVITATION,     200, 1, 0, GEMSTONE, RED),
  419. XRING("hunger",            "topaz",      HUNGER,         100, 1, 0, GEMSTONE, CYAN),
  420. XRING("aggravate monster", "sapphire",   AGGRAVATE_MONSTER,
  421. X                            150, 1, 0, GEMSTONE, BLUE),
  422. XRING("conflict",          "ruby",       CONFLICT,       300, 1, 0, GEMSTONE, RED),
  423. XRING("warning",           "diamond",    WARNING,        100, 1, 0, GEMSTONE, WHITE),
  424. XRING("poison resistance", "pearl",      POISON_RES,     150, 1, 0, IRON,     WHITE),
  425. XRING("fire resistance",   "iron",       FIRE_RES,       200, 1, 0, IRON,     HI_METAL),
  426. XRING("cold resistance",   "brass",      COLD_RES,       150, 1, 0, COPPER,   HI_COPPER),
  427. XRING("shock resistance",  "copper",     SHOCK_RES,      150, 1, 0, COPPER,   HI_COPPER),
  428. XRING("teleportation",     "silver",     TELEPORT,       200, 1, 0, SILVER,   HI_SILVER),
  429. XRING("teleport control",  "gold",       TELEPORT_CONTROL,
  430. X                            300, 1, 0, GOLD,     HI_GOLD),
  431. X#ifdef POLYSELF
  432. XRING("polymorph",         "ivory",      POLYMORPH,      300, 1, 0, 0,        WHITE),
  433. XRING("polymorph control", "emerald",    POLYMORPH_CONTROL,
  434. X                            300, 1, 0, GEMSTONE, BRIGHT_GREEN),
  435. X#endif
  436. XRING("invisibility",      "wire",       INVIS,          150, 1, 0, IRON,     HI_METAL),
  437. XRING("see invisible",     "engagement", SEE_INVIS,      150, 1, 0, IRON,     HI_METAL),
  438. XRING("protection from shape changers", "shiny", PROT_FROM_SHAPE_CHANGERS,
  439. X                            100, 1, 0, IRON,     BRIGHT_CYAN),
  440. X#undef RING
  441. X
  442. X/* amulets ... - THE Amulet comes last because it is special */
  443. X#define AMULET(name,desc,power,prob) OBJECT( \
  444. X        OBJ(name,desc), BITS(0,0,0,0,1,0,0,0,0,IRON), power, \
  445. X        AMULET_CLASS, prob, 0, 20, 150, 0, 0, 0, 0, 20, HI_METAL )
  446. X
  447. XAMULET("amulet of ESP",           "circular",   TELEPAT,    180),
  448. XAMULET("amulet of life saving",   "spherical",  LIFESAVED,   80),
  449. XAMULET("amulet of strangulation", "oval",       STRANGLED,  140),
  450. XAMULET("amulet of restful sleep", "triangular", SLEEPING,   140),
  451. XAMULET("amulet versus poison",    "pyramidal",  POISON_RES, 170),
  452. XAMULET("amulet of change",        "square",     0,          140),
  453. X                        /* POLYMORPH */
  454. XAMULET("amulet of reflection",    "hexagonal",  REFLECTING,  80),
  455. XAMULET("amulet of magical breathing", "octagonal",    MAGICAL_BREATHING, 70),
  456. XOBJECT(OBJ("cheap plastic imitation of the Amulet of Yendor",
  457. X    "Amulet of Yendor"), BITS(0,0,1,0,0,0,0,0,0,PLASTIC), 0,
  458. X    AMULET_CLASS, 0, 0, 20,    0, 0, 0, 0, 0,  1, HI_METAL),
  459. XOBJECT(OBJ("Amulet of Yendor",NULL), BITS(1,0,1,0,1,0,1,0,0,MITHRIL), 0,
  460. X    AMULET_CLASS, 0, 0, 20, 3500, 0, 0, 0, 0, 20, HI_METAL),
  461. X#undef AMULET
  462. X
  463. X/* tools ... */
  464. X/* tools with weapon characteristics come last */
  465. X#define TOOL(name,desc,kn,mrg,mgc,chg,prob,wt,cost,material,color) OBJECT( \
  466. X        OBJ(name,desc), BITS(kn,mrg,chg,0,mgc,chg,0,0,0,material), 0, \
  467. X        TOOL_CLASS, prob, 0, \
  468. X        wt, cost, 0, 0, 0, 0, wt, color )
  469. X#define CONTAINER(name,desc,kn,mgc,chg,prob,wt,cost,material,color) OBJECT( \
  470. X        OBJ(name,desc), BITS(kn,0,chg,1,mgc,chg,0,0,0,material), 0, \
  471. X        TOOL_CLASS, prob, 0, \
  472. X        wt, cost, 0, 0, 0, 0, wt, color )
  473. X#define WEPTOOL(name,desc,kn,mgc,bi,prob,wt,cost,sdam,ldam,hitbon,material,color) OBJECT( \
  474. X        OBJ(name,desc), BITS(kn,0,1,0,mgc,1,0,bi,0,material), 0, \
  475. X        TOOL_CLASS, prob, 0, \
  476. X        wt, cost, sdam, ldam, hitbon, 0, wt, color )
  477. X/* containers */
  478. XCONTAINER("large box",        NULL,   1, 0, 0,  40,350,   8, WOOD, HI_WOOD),
  479. XCONTAINER("chest",        NULL,   1, 0, 0,  35,600,  16, WOOD, HI_WOOD),
  480. XCONTAINER("ice box",        NULL,   1, 0, 0,   5,900,  42, PLASTIC, WHITE),
  481. XCONTAINER("sack",        "bag",  0, 0, 0,  35, 15,   2, CLOTH, HI_CLOTH),
  482. XCONTAINER("oilskin sack",   "bag",  0, 0, 0,   5, 15, 100, CLOTH, HI_CLOTH),
  483. XCONTAINER("bag of holding", "bag",  0, 1, 0,  20, 15, 100, CLOTH, HI_CLOTH),
  484. XCONTAINER("bag of tricks",  "bag",  0, 1, 1,  20, 15, 100, CLOTH, HI_CLOTH),
  485. X#undef CONTAINER
  486. X/* lock opening tools */
  487. XTOOL("skeleton key",    "key",  0, 0, 0, 0,  80,  3,    10, IRON, HI_METAL),
  488. X#ifdef TOURIST
  489. XTOOL("lock pick",       NULL,   1, 0, 0, 0,  60,  4,    20, IRON, HI_METAL),
  490. XTOOL("credit card",     NULL,   1, 0, 0, 0,  15,  1,    10, PLASTIC, WHITE),
  491. X#else
  492. XTOOL("lock pick",       NULL,   1, 0, 0, 0,  75,  4,    20, IRON, HI_METAL),
  493. X#endif
  494. X/* light sources */
  495. XTOOL("tallow candle", "candle", 0, 1, 0, 0,  20,  2,    10, WAX, WHITE),
  496. XTOOL("wax candle",    "candle", 0, 1, 0, 0,   5,  2,    20, WAX, WHITE),
  497. X#ifdef WALKIES
  498. XTOOL("brass lantern",   NULL,   1, 0, 0, 0,  30,100,    10, COPPER, YELLOW),
  499. XTOOL("oil lamp",        "lamp", 0, 0, 0, 0,  45, 80,    10, COPPER, YELLOW),
  500. X#else
  501. XTOOL("brass lantern",   NULL,   1, 0, 0, 0,  45,100,    10, COPPER, YELLOW),
  502. XTOOL("oil lamp",        "lamp", 0, 0, 0, 0,  75, 80,    10, COPPER, YELLOW),
  503. X#endif
  504. XTOOL("magic lamp",      "lamp", 0, 0, 1, 0,  15, 80,    50, COPPER, YELLOW),
  505. X/* other tools */
  506. X#ifdef TOURIST
  507. XTOOL("expensive camera", NULL,  1, 0, 0, 0,  15, 30,   200, PLASTIC, BLACK),
  508. XTOOL("mirror", "looking glass", 0, 0, 0, 0,  45, 13,    10, GLASS, SILVER),
  509. X#else
  510. XTOOL("mirror", "looking glass", 0, 0, 0, 0,  60, 13,    10, GLASS, SILVER),
  511. X#endif
  512. XTOOL("crystal ball", "glass orb",
  513. X                0, 0, 1, 1,  15,150,    60, GLASS, HI_GLASS),
  514. XTOOL("blindfold",       NULL,   1, 0, 0, 0,  55,  2,    20, CLOTH, BLACK),
  515. X#ifdef WALKIES
  516. XTOOL("towel",           NULL,   1, 0, 0, 0,  50,  2,    50, CLOTH, MAGENTA),
  517. XTOOL("leash",           NULL,   1, 0, 0, 0,  70, 12,    20, LEATHER, HI_LEATHER),
  518. X#else
  519. XTOOL("towel",           NULL,   1, 0, 0, 0,  75,  3,    50, CLOTH, MAGENTA),
  520. X#endif
  521. XTOOL("stethoscope",     NULL,   1, 0, 0, 0,  25,  4,    75, IRON, HI_METAL),
  522. XTOOL("tinning kit",     NULL,   1, 0, 0, 0,  15,100,    30, IRON, HI_METAL),
  523. XTOOL("tin opener",      NULL,   1, 0, 0, 0,  35,  4,    30, IRON, HI_METAL),
  524. XTOOL("can of grease",   NULL,   1, 0, 0, 1,  15, 15,    20, IRON, HI_METAL),
  525. XTOOL("figurine",        NULL,   1, 0, 1, 0,  25, 50,    80, MINERAL, HI_MINERAL),
  526. XTOOL("magic marker",    NULL,   1, 0, 1, 1,  15,  2,    50, PLASTIC, RED),
  527. X/* instruments */
  528. XTOOL("tin whistle",   "whistle",
  529. X                0, 0, 0, 0, 105,  3,    10, METAL, HI_METAL),
  530. XTOOL("magic whistle", "whistle",
  531. X                0, 0, 1, 0,  30,  3,    10, METAL, HI_METAL),
  532. X/* "If tin whistles are made out of tin, what do they make foghorns out of?" */
  533. XTOOL("wooden flute",   "flute", 0, 0, 0, 0,   4,  5,    12, WOOD, HI_WOOD),
  534. XTOOL("magic flute",    "flute", 0, 0, 1, 1,   2,  5,    36, WOOD, HI_WOOD),
  535. XTOOL("tooled horn",     "horn", 0, 0, 0, 0,   5, 18,    15, BONE, WHITE),
  536. XTOOL("frost horn",      "horn", 0, 0, 1, 1,   2, 18,    50, BONE, WHITE),
  537. XTOOL("fire horn",       "horn", 0, 0, 1, 1,   2, 18,    50, BONE, WHITE),
  538. XTOOL("horn of plenty",  "horn", 0, 0, 1, 1,   2, 18,    50, BONE, WHITE),
  539. XTOOL("wooden harp",     "harp", 0, 0, 1, 0,   4, 30,    50, WOOD, HI_WOOD),
  540. XTOOL("magic harp",      "harp", 0, 0, 1, 1,   2, 30,    50, WOOD, HI_WOOD),
  541. XTOOL("bell",            NULL,   1, 0, 0, 0,   2, 30,    50, COPPER, HI_COPPER),
  542. XTOOL("bugle",           NULL,   1, 0, 0, 0,   4, 10,    15, COPPER, HI_COPPER),
  543. XTOOL("leather drum",    "drum", 0, 0, 0, 0,   4, 25,    25, LEATHER, HI_LEATHER),
  544. XTOOL("drum of earthquake", "drum",
  545. X                0, 0, 1, 1,   2, 25,    25, LEATHER, HI_LEATHER),
  546. X/* tools useful as weapons */
  547. XWEPTOOL("pick-axe",     NULL,   1, 0, 1,        20, 100,  50,
  548. X             6,  3, 0,    IRON, HI_METAL),
  549. XWEPTOOL("unicorn horn", NULL,   1, 1, 1,         0,  20, 100,
  550. X            12, 12, 0,    BONE, WHITE),
  551. X/* two special, one of each kind, "tools" */
  552. XOBJECT(OBJ("Candelabrum of Invocation", "candelabrum"),
  553. X        BITS(0,0,1,0,1,0,1,0,0,GOLD), 0,
  554. X        TOOL_CLASS, 0, 0,10, 3000, 0, 0, 0, 0, 200, HI_GOLD),
  555. XOBJECT(OBJ("Bell of Opening", "silver bell"),
  556. X        BITS(0,0,1,0,1,0,1,0,0,SILVER), 0,
  557. X        TOOL_CLASS, 0, 0,10, 1000, 0, 0, 0, 0, 50, HI_SILVER),
  558. X#undef TOOL
  559. X#undef WEPTOOL
  560. X
  561. X/* comestibles ... */
  562. X#define FOOD(name,prob,delay,wt,uk,tin,nutrition,color) OBJECT( \
  563. X        OBJ(name,NULL), BITS(1,1,uk,0,0,0,0,0,0,tin), 0, \
  564. X        FOOD_CLASS, prob, delay, \
  565. X        wt, nutrition/20 + 5, 0, 0, 0, 0, nutrition, color )
  566. X/* all types of food (except tins & corpses) must have a delay of at least 1. */
  567. X/* delay on corpses is computed and is weight dependant */
  568. X/* dog eats foods 0-4 but prefers tripe rations above all others */
  569. X/* fortune cookies can be read */
  570. X/* carrots improve your vision */
  571. X/* +0 tins contain monster meat */
  572. X/* +1 tins (of spinach) make you stronger (like Popeye) */
  573. X/* food CORPSE is a cadaver of some type */
  574. X
  575. X    /* meat */
  576. X    FOOD("tripe ration",       142, 2, 10, 0, FLESH, 200, BROWN),
  577. X    FOOD("corpse",               0, 1,  0, 0, FLESH,   0, BROWN),
  578. X    FOOD("egg",                 85, 1,  1, 1, FLESH,  80, WHITE),
  579. X    /* fruits & veggies */
  580. X    FOOD("apple",               15, 1,  2, 0, VEGGY,  50, RED),
  581. X    FOOD("orange",              10, 1,  2, 0, VEGGY,  80, ORANGE_COLORED),
  582. X    FOOD("pear",                10, 1,  2, 0, VEGGY,  50, BRIGHT_GREEN),
  583. X    FOOD("melon",               10, 1,  5, 0, VEGGY, 100, BRIGHT_GREEN),
  584. X    FOOD("banana",              10, 1,  2, 0, VEGGY,  80, YELLOW),
  585. X    FOOD("carrot",              15, 1,  2, 0, VEGGY,  50, ORANGE_COLORED),
  586. X    FOOD("sprig of wolfsbane",   7, 1,  1, 0, VEGGY,  40, GREEN),
  587. X    FOOD("clove of garlic",      7, 1,  1, 0, VEGGY,  40, WHITE),
  588. X#ifdef TUTTI_FRUTTI
  589. X    FOOD("slime mold",          75, 1,  5, 0, VEGGY, 250, HI_ORGANIC),
  590. X#else
  591. X    FOOD("slice of pizza",      75, 1,  3, 0, VEGGY, 250, RED),
  592. X#endif
  593. X    /* human food */
  594. X    FOOD("lump of royal jelly",  0, 1,  2, 0, VEGGY, 200, YELLOW),
  595. X    FOOD("cream pie",           25, 1, 10, 0, VEGGY, 100, WHITE),
  596. X    FOOD("candy bar",           13, 1,  2, 0, VEGGY, 100, BROWN),
  597. X    FOOD("fortune cookie",      55, 1,  1, 0, VEGGY,  40, BROWN),
  598. X    FOOD("pancake",             25, 2,  2, 0, VEGGY, 200, BROWN),
  599. X    FOOD("lembas wafer",        20, 2,  5, 0, VEGGY, 800, WHITE),
  600. X    FOOD("cram ration",         20, 3, 15, 0, VEGGY, 600, HI_ORGANIC),
  601. X    FOOD("food ration",        381, 5, 20, 0, VEGGY, 800, HI_ORGANIC),
  602. X#ifdef ARMY
  603. X    FOOD("K-ration",             0, 1, 10, 0, VEGGY, 400, HI_ORGANIC),
  604. X    FOOD("C-ration",             0, 1, 10, 0, VEGGY, 300, HI_ORGANIC),
  605. X#endif
  606. X    FOOD("tin",                 75, 0, 10, 1, METAL,   0, HI_METAL),
  607. X#undef FOOD
  608. X
  609. X/* potions ... */
  610. X#define POTION(name,desc,mgc,power,prob,cost,color) OBJECT( \
  611. X        OBJ(name,desc), BITS(0,1,0,0,mgc,0,0,0,0,GLASS), power, \
  612. X        POTION_CLASS, prob, 0, 20, cost, 0, 0, 0, 0, 10, color )
  613. XPOTION("gain ability",      "ruby",           1, 0,          45, 300, RED),
  614. XPOTION("restore ability",   "pink",           1, 0,          45, 100, BRIGHT_MAGENTA),
  615. XPOTION("confusion",         "orange",         1, CONFUSION,  45, 100, ORANGE_COLORED),
  616. XPOTION("blindness",         "yellow",         1, BLINDED,    45, 150, YELLOW),
  617. XPOTION("paralysis",         "emerald",        1, 0,          45, 300, BRIGHT_GREEN),
  618. XPOTION("speed",             "dark green",     1, FAST,       45, 200, GREEN),
  619. XPOTION("levitation",        "cyan",           1, LEVITATION, 45, 200, CYAN),
  620. XPOTION("hallucination",     "sky blue",       1, HALLUC,     45, 100, CYAN),
  621. XPOTION("invisibility",      "brilliant blue", 1, INVIS,      45, 150, BRIGHT_BLUE),
  622. XPOTION("see invisible",     "magenta",        1, SEE_INVIS,  45,  50, MAGENTA),
  623. XPOTION("healing",           "purple-red",     1, 0,          65, 100, MAGENTA),
  624. XPOTION("extra healing",     "puce",           1, 0,          50, 100, RED),
  625. XPOTION("gain level",        "milky",          1, 0,          20, 300, WHITE),
  626. XPOTION("enlightenment",     "swirly",         1, 0,          20, 200, BROWN),
  627. XPOTION("monster detection", "bubbly",         1, 0,          45, 150, WHITE),
  628. XPOTION("object detection",  "smoky",          1, 0,          45, 150, GRAY),
  629. XPOTION("gain energy",       "cloudy",         1, 0,          45, 150, WHITE),
  630. XPOTION("booze",             "brown",          0, 0,          45,  50, BROWN),
  631. XPOTION("sickness",          "fizzy",          0, 0,          45,  50, CYAN),
  632. XPOTION("fruit juice",       "dark",           0, 0,          45,  50, BLACK),
  633. XPOTION("water",             "clear",          0, 0,         125, 100, CYAN),
  634. X#undef POTION
  635. X
  636. X/* scrolls ... */
  637. X#define SCROLL(name,text,mgc,prob,cost) OBJECT( \
  638. X        OBJ(name,text), BITS(0,1,0,0,mgc,0,0,0,0,PAPER), 0, \
  639. X        SCROLL_CLASS, prob, 0, 5, cost, 0, 0, 0, 0, 6, HI_PAPER )
  640. X    SCROLL("enchant armor",         "ZELGO MER",            1,  63,  80),
  641. X    SCROLL("destroy armor",         "JUYED AWK YACC",       1,  45, 100),
  642. X    SCROLL("confuse monster",       "NR 9",                 1,  53, 100),
  643. X    SCROLL("scare monster",         "XIXAXA XOXAXA XUXAXA", 1,  35, 100),
  644. X    SCROLL("remove curse",          "PRATYAVAYAH",          1,  65,  80),
  645. X    SCROLL("enchant weapon",        "DAIYEN FOOELS",        1,  85,  60),
  646. X    SCROLL("create monster",        "LEP GEX VEN ZEA",      1,  45, 200),
  647. X    SCROLL("taming",                "PRIRUTSENIE",          1,  15, 200),
  648. X    SCROLL("genocide",              "ELBIB YLOH",           1,  15, 300),
  649. X    SCROLL("light",                 "VERR YED HORRE",       1,  95,  50),
  650. X    SCROLL("teleportation",         "VENZAR BORGAVVE",      1,  55, 100),
  651. X    SCROLL("gold detection",        "THARR",                1,  33, 100),
  652. X    SCROLL("food detection",        "YUM YUM",              1,  25, 100),
  653. X    SCROLL("identify",              "KERNOD WEL",           1, 185,  20),
  654. X    SCROLL("magic mapping",         "ELAM EBOW",            1,  45, 100),
  655. X    SCROLL("amnesia",               "DUAM XNAHT",           1,  35, 200),
  656. X    SCROLL("fire",                  "ANDOVA BEGARIN",       1,  48, 100),
  657. X    SCROLL("punishment",            "VE FORBRYDERNE",       1,  15, 300),
  658. X    SCROLL("charging",              "HACKEM MUCHE",         1,  15, 300),
  659. X    SCROLL(NULL,            "VELOX NEB",            1,   0, 100),
  660. X    SCROLL(NULL,            "FOOBIE BLETCH",        1,   0, 100),
  661. X    SCROLL(NULL,            "TEMOV",                1,   0, 100),
  662. X    SCROLL(NULL,            "GARVEN DEH",           1,   0, 100),
  663. X    SCROLL(NULL,            "READ ME",              1,   0, 100),
  664. X    SCROLL(NULL,            "KIRJE",                1,   0, 100),
  665. X    /* these must come last because they have special descriptions */
  666. X#ifdef MAIL
  667. X    SCROLL("mail",                  "stamped",          0,   0,   0),
  668. X#endif
  669. X    SCROLL("blank paper",           "unlabeled",        0,  28,  60),
  670. X#undef SCROLL
  671. X
  672. X/* spellbooks ... */
  673. X#define SPELL(name,desc,prob,delay,level,mgc,dir,color) OBJECT( \
  674. X        OBJ(name,desc), BITS(0,1,0,0,mgc,0,0,0,dir,PAPER), 0, \
  675. X        SPBOOK_CLASS, prob, delay, \
  676. X        50, level*100, 0, 0, 0, level, 20, color )
  677. XSPELL("dig",             "parchment",   22,  6, 5, 1, RAY,       HI_PAPER),
  678. XSPELL("magic missile",   "vellum",      45,  3, 2, 1, RAY,       HI_PAPER),
  679. XSPELL("fireball",        "ragged",      20,  6, 4, 1, RAY,       HI_PAPER),
  680. XSPELL("cone of cold",    "dog eared",   10,  8, 5, 1, RAY,       HI_PAPER),
  681. XSPELL("sleep",           "mottled",     50,  1, 1, 1, RAY,       HI_PAPER),
  682. XSPELL("finger of death", "stained",      5, 10, 7, 1, RAY,       HI_PAPER),
  683. XSPELL("light",           "cloth",       45,  1, 1, 1, NODIR,     HI_CLOTH),
  684. XSPELL("detect monsters", "leather",     45,  1, 1, 1, NODIR,     HI_LEATHER),
  685. XSPELL("healing",         "white",       40,  2, 1, 1, NODIR,     WHITE),
  686. XSPELL("knock",           "pink",        36,  1, 1, 1, IMMEDIATE, BRIGHT_MAGENTA),
  687. XSPELL("force bolt",      "red",         35,  2, 1, 1, IMMEDIATE, RED),
  688. XSPELL("confuse monster", "orange",      37,  2, 2, 1, IMMEDIATE, ORANGE_COLORED),
  689. XSPELL("cure blindness",  "yellow",      27,  2, 2, 1, IMMEDIATE, YELLOW),
  690. XSPELL("slow monster",    "light green", 37,  2, 2, 1, IMMEDIATE, BRIGHT_GREEN),
  691. XSPELL("wizard lock",     "dark green",  35,  3, 2, 1, IMMEDIATE, GREEN),
  692. XSPELL("create monster",  "turquoise",   37,  3, 2, 1, NODIR,     BRIGHT_CYAN),
  693. XSPELL("detect food",     "cyan",        37,  3, 2, 1, NODIR,     CYAN),
  694. XSPELL("cause fear",      "light blue",  25,  3, 3, 1, NODIR,     BRIGHT_BLUE),
  695. XSPELL("clairvoyance",    "dark blue",   15,  3, 3, 1, NODIR,     BLUE),
  696. XSPELL("cure sickness",   "indigo",      32,  3, 3, 1, NODIR,     BLUE),
  697. XSPELL("charm monster",   "magenta",     20,  3, 3, 1, IMMEDIATE, MAGENTA),
  698. XSPELL("haste self",      "purple",      33,  4, 3, 1, NODIR,     MAGENTA),
  699. XSPELL("detect unseen",   "violet",      20,  4, 3, 1, NODIR,     MAGENTA),
  700. XSPELL("levitation",      "tan",         20,  4, 4, 1, NODIR,     BROWN),
  701. XSPELL("extra healing",   "plaid",       35,  5, 3, 1, NODIR,     GREEN),
  702. XSPELL("restore ability", "light brown", 25,  5, 4, 1, NODIR,     BROWN),
  703. XSPELL("invisibility",    "dark brown",  32,  5, 4, 1, NODIR,     BROWN),
  704. XSPELL("detect treasure", "gray",        25,  5, 4, 1, NODIR,     GRAY),
  705. XSPELL("remove curse",    "white",       25,  5, 5, 1, NODIR,     WHITE),
  706. XSPELL("magic mapping",   "dusty",       18,  7, 5, 1, NODIR,     HI_PAPER),
  707. XSPELL("identify",        "bronze",      25,  8, 5, 1, NODIR,     HI_COPPER),
  708. XSPELL("turn undead",     "copper",      17,  8, 6, 1, IMMEDIATE, HI_COPPER),
  709. XSPELL("polymorph",       "silver",      10,  8, 6, 1, IMMEDIATE, HI_SILVER),
  710. XSPELL("teleport away",   "gold",        15,  6, 6, 1, IMMEDIATE, HI_GOLD),
  711. XSPELL("create familiar", "glittering",  10,  7, 6, 1, NODIR,     WHITE),
  712. XSPELL("cancellation",    "shining",     15,  8, 7, 1, IMMEDIATE, WHITE),
  713. XSPELL(NULL,         "dull",         0,  0, 0, 1, 0,         HI_PAPER),
  714. XSPELL(NULL,         "thin",         0,  0, 0, 1, 0,         HI_PAPER),
  715. XSPELL(NULL,         "thick",        0,  0, 0, 1, 0,         HI_PAPER),
  716. X/* blank spellbook must come last because it retains its description */
  717. XSPELL("blank paper",     "plain",       20,  0, 0, 0, 0,         HI_PAPER),
  718. X/* a special, one of a kind, spellbook */
  719. XOBJECT(OBJ("Book of the Dead", "papyrus"), BITS(0,0,1,0,1,0,1,0,0,PAPER), 0,
  720. X    SPBOOK_CLASS, 0, 0,20, 3500, 0, 0, 0, 7, 20, HI_PAPER),
  721. X#undef SPELL
  722. X
  723. X/* wands ... */
  724. X#define WAND(name,typ,prob,cost,mgc,dir,metal,color) OBJECT( \
  725. X        OBJ(name,typ), BITS(0,0,1,0,mgc,1,0,0,dir,metal), 0, WAND_CLASS, \
  726. X        prob, 0, 7, cost, 0, 0, 0, 0, 30, color )
  727. XWAND("light",           "glass",        95, 100, 1, NODIR,     GLASS,    HI_GLASS),
  728. XWAND("secret door detection", "balsa",  50, 150, 1, NODIR,     WOOD,     HI_WOOD),
  729. XWAND("create monster",  "maple",        45, 200, 1, NODIR,     WOOD,     HI_WOOD),
  730. XWAND("wishing",         "pine",          5, 500, 1, NODIR,     WOOD,     HI_WOOD),
  731. XWAND("nothing",         "oak",          25, 100, 0, IMMEDIATE, WOOD,     HI_WOOD),
  732. XWAND("striking",        "ebony",        75, 150, 1, IMMEDIATE, WOOD,     HI_WOOD),
  733. XWAND("make invisible",  "marble",       45, 150, 1, IMMEDIATE, MINERAL,  HI_MINERAL),
  734. XWAND("slow monster",    "tin",          55, 150, 1, IMMEDIATE, METAL,    HI_METAL),
  735. XWAND("speed monster",   "brass",        55, 150, 1, IMMEDIATE, COPPER,   HI_COPPER),
  736. XWAND("undead turning",  "copper",       55, 150, 1, IMMEDIATE, COPPER,   HI_COPPER),
  737. XWAND("polymorph",       "silver",       45, 200, 1, IMMEDIATE, SILVER,   HI_SILVER),
  738. XWAND("cancellation",    "platinum",     45, 200, 1, IMMEDIATE, PLATINUM, WHITE),
  739. XWAND("teleportation",   "iridium",      45, 200, 1, IMMEDIATE, METAL,    BRIGHT_CYAN),
  740. XWAND("opening",         "zinc",         25, 150, 1, IMMEDIATE, METAL,    HI_METAL),
  741. XWAND("locking",         "aluminum",     25, 150, 1, IMMEDIATE, METAL,    HI_METAL),
  742. XWAND("probing",         "uranium",      30, 150, 1, IMMEDIATE, METAL,    HI_METAL),
  743. XWAND("digging",         "iron",         55, 150, 1, RAY,       IRON,     HI_METAL),
  744. XWAND("magic missile",   "steel",        50, 150, 1, RAY,       IRON,     HI_METAL),
  745. XWAND("fire",            "hexagonal",    40, 175, 1, RAY,       IRON,     HI_METAL),
  746. XWAND("cold",            "short",        40, 175, 1, RAY,       IRON,     HI_METAL),
  747. XWAND("sleep",           "runed",        50, 175, 1, RAY,       IRON,     HI_METAL),
  748. XWAND("death",           "long",          5, 500, 1, RAY,       IRON,     HI_METAL),
  749. XWAND("lightning",       "curved",       40, 175, 1, RAY,       IRON,     HI_METAL),
  750. XWAND(NULL,        "forked",        0, 150, 1, 0,         WOOD,     HI_WOOD),
  751. XWAND(NULL,        "spiked",        0, 150, 1, 0,         IRON,     HI_METAL),
  752. XWAND(NULL,        "jeweled",       0, 150, 1, 0,         IRON,     HI_MINERAL),
  753. X#undef WAND
  754. X
  755. X/* coins ... - so far, gold is all there is */
  756. X#define COIN(name,prob,metal) OBJECT( \
  757. X        OBJ(name,NULL), BITS(0,1,0,0,0,0,0,0,0,metal), 0, \
  758. X        GOLD_CLASS, prob, 0, 1, 0, 0, 0, 0, 0, 0, HI_GOLD )
  759. X    COIN("gold piece",      1000, GOLD),
  760. X#undef COIN
  761. X
  762. X/* gems ... - includes stones but not boulders */
  763. X#define GEM(name,desc,prob,wt,gval,nutr,glass,color) OBJECT( \
  764. X        OBJ(name,desc), BITS(0,1,0,0,0,0,0,0,0,glass), 0, \
  765. X        GEM_CLASS, prob, 0, 1, gval, 3, 3, 0, WP_SLING, nutr, color )
  766. X#define ROCK(name,desc,kn,prob,wt,gval,mgc,nutr,glass,color) OBJECT( \
  767. X        OBJ(name,desc), BITS(kn,1,0,0,mgc,0,0,0,0,glass), 0, \
  768. X        GEM_CLASS, prob, 0, wt, gval, 3, 3, 0, WP_SLING, nutr, color )
  769. XGEM("dilithium crystal", "white",        3, 1, 4500, 15, GEMSTONE, WHITE),
  770. XGEM("diamond", "white",                  4, 1, 4000, 15, GEMSTONE, WHITE),
  771. XGEM("ruby", "red",                       5, 1, 3500, 15, GEMSTONE, RED),
  772. XGEM("sapphire", "blue",                  6, 1, 3000, 15, GEMSTONE, BLUE),
  773. XGEM("emerald", "green",                  7, 1, 2500, 15, GEMSTONE, GREEN),
  774. XGEM("turquoise", "green",                8, 1, 2000, 15, GEMSTONE, GREEN),
  775. XGEM("aquamarine", "green",              10, 1, 1500, 15, GEMSTONE, GREEN),
  776. XGEM("amber", "yellowish brown",         11, 1, 1000, 15, GEMSTONE, BROWN),
  777. XGEM("topaz", "yellowish brown",         13, 1,  900, 15, GEMSTONE, BROWN),
  778. XGEM("opal", "white",                    15, 1,  800, 15, GEMSTONE, WHITE),
  779. XGEM("garnet", "red",                    17, 1,  700, 15, GEMSTONE, RED),
  780. XGEM("amethyst", "violet",               19, 1,  600, 15, GEMSTONE, MAGENTA),
  781. XGEM("jasper", "red",                    21, 1,  500, 15, GEMSTONE, RED),
  782. XGEM("fluorite", "violet",               22, 1,  400, 15, GEMSTONE, MAGENTA),
  783. XGEM("jade", "green",                    23, 1,  300, 15, GEMSTONE, GREEN),
  784. XGEM("worthless piece of white glass", "white",  116, 1, 0, 6, GLASS, WHITE),
  785. XGEM("worthless piece of blue glass", "blue",    116, 1, 0, 6, GLASS, BLUE),
  786. XGEM("worthless piece of red glass", "red",      116, 1, 0, 6, GLASS, RED),
  787. XGEM("worthless piece of yellowish brown glass", "yellowish brown",
  788. X                        116, 1, 0, 6, GLASS, BROWN),
  789. XGEM("worthless piece of green glass", "green",  116, 1, 0, 6, GLASS, GREEN),
  790. XGEM("worthless piece of violet glass", "violet",116, 1, 0, 6, GLASS, MAGENTA),
  791. XROCK("luckstone", "gray",                0, 10, 10, 60, 1, 10, MINERAL, GRAY),
  792. XROCK("loadstone", "gray",                0, 10,500,  1, 1, 10, MINERAL, GRAY),
  793. XROCK("rock", NULL,                       1,100, 10,  0, 0, 10, MINERAL, GRAY),
  794. X#undef GEM
  795. X#undef ROCK
  796. X
  797. X/* miscellaneous ... */
  798. X/* Note: boulders and rocks are not normally created at random; the
  799. X * probabilities only come into effect when you try to polymorph them.
  800. X * Boulders and statues weigh more than MAX_CARR_CAP.
  801. X */
  802. XOBJECT(OBJ("boulder",NULL), BITS(1,0,0,0,0,0,0,1,0,MINERAL), 0,
  803. X        ROCK_CLASS,   100, 0, 6000,  0, 20, 20, 0, 0, 2000, HI_MINERAL),
  804. XOBJECT(OBJ("statue", NULL), BITS(1,0,0,1,0,0,0,0,0,MINERAL), 0,
  805. X        ROCK_CLASS,   900, 0, 2500,  0, 20, 20, 0, 0, 2500, HI_MINERAL),
  806. XOBJECT(OBJ("heavy iron ball", NULL), BITS(1,0,0,0,0,0,0,0,0,IRON), 0,
  807. X        BALL_CLASS,  1000, 0,  480, 10,  0,  0, 0, 0,  200, HI_METAL),
  808. XOBJECT(OBJ("iron chain", NULL), BITS(1,0,0,0,0,0,0,0,0,IRON), 0,
  809. X        CHAIN_CLASS, 1000, 0,  120,  0,  0,  0, 0, 0,  200, HI_METAL),
  810. XOBJECT(OBJ("blinding venom", "splash of venom"),
  811. X        BITS(0,1,0,0,0,0,0,0,0,LIQUID), 0,
  812. X        VENOM_CLASS,  500, 0,     1,  0,  0,  0, 0, 0,     0, HI_ORGANIC),
  813. XOBJECT(OBJ("acid venom", "splash of venom"),
  814. X        BITS(0,1,0,0,0,0,0,0,0,LIQUID), 0,
  815. X        VENOM_CLASS,  500, 0,     1,  0,  6,  6, 0, 0,     0, HI_ORGANIC),
  816. X        /* +d6 small or large */
  817. X
  818. X/* fencepost -- name [1st arg] *must* be NULL */
  819. X    OBJECT(OBJ(NULL,NULL), BITS(0,0,0,0,0,0,0,0,0,0), 0,
  820. X        ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
  821. X}; /* objects[] */
  822. X
  823. X#ifndef OBJECTS_PASS_2_
  824. X
  825. X/* perform recursive compilation for second structure */
  826. X#  undef OBJ
  827. X#  undef OBJECT
  828. X#  define OBJECTS_PASS_2_
  829. X#include "objects.c"
  830. X
  831. Xvoid NDECL(objects_init);
  832. X
  833. X/* dummy routine used to force linkage */
  834. Xvoid
  835. Xobjects_init()
  836. X{
  837. X    return;
  838. X}
  839. X
  840. X#endif    /* !OBJECTS_PASS_2_ */
  841. X
  842. X/*objects.c*/
  843. END_OF_FILE
  844. if test 41735 -ne `wc -c <'src/objects.c'`; then
  845.     echo shar: \"'src/objects.c'\" unpacked with wrong size!
  846. fi
  847. # end of 'src/objects.c'
  848. fi
  849. if test -f 'src/timeout.c' -a "${1}" != "-c" ; then 
  850.   echo shar: Will not clobber existing file \"'src/timeout.c'\"
  851. else
  852. echo shar: Extracting \"'src/timeout.c'\" \(11863 characters\)
  853. sed "s/^X//" >'src/timeout.c' <<'END_OF_FILE'
  854. X/*    SCCS Id: @(#)timeout.c    3.1    92/11/01    */
  855. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  856. X/* NetHack may be freely redistributed.  See license for details. */
  857. X
  858. X#include    "hack.h"
  859. X
  860. XSTATIC_DCL void NDECL(stoned_dialogue);
  861. XSTATIC_DCL void NDECL(vomiting_dialogue);
  862. XSTATIC_DCL void NDECL(choke_dialogue);
  863. XSTATIC_DCL void FDECL(hatch_it, (struct obj *));
  864. X
  865. Xstatic void FDECL(age_candle, (struct obj *));
  866. X
  867. X#ifdef OVLB
  868. X
  869. X/* He is being petrified - dialogue by inmet!tower */
  870. Xstatic const char NEARDATA *stoned_texts[] = {
  871. X    "You are slowing down.",        /* 5 */
  872. X    "Your limbs are stiffening.",        /* 4 */
  873. X    "Your limbs have turned to stone.",    /* 3 */
  874. X    "You have turned to stone.",        /* 2 */
  875. X    "You are a statue."            /* 1 */
  876. X};
  877. X
  878. XSTATIC_OVL void
  879. Xstoned_dialogue() {
  880. X    register long i = (Stoned & TIMEOUT);
  881. X
  882. X    if(i > 0 && i <= SIZE(stoned_texts))
  883. X        pline(stoned_texts[SIZE(stoned_texts) - i]);
  884. X    if(i == 5)
  885. X        Fast &= ~(TIMEOUT|INTRINSIC);
  886. X    if(i == 3)
  887. X        nomul(-3);
  888. X    exercise(A_DEX, FALSE);
  889. X}
  890. X
  891. X/* He is getting sicker and sicker prior to vomiting */
  892. Xstatic const char NEARDATA *vomiting_texts[] = {
  893. X    "You are feeling mildly nauseous.",    /* 14 */
  894. X    "You feel slightly confused.",        /* 11 */
  895. X    "You can't seem to think straight.",    /* 8 */
  896. X    "You feel incredibly sick.",        /* 5 */
  897. X    "You suddenly vomit!"            /* 2 */
  898. X};
  899. X
  900. XSTATIC_OVL void
  901. Xvomiting_dialogue() {
  902. X    register long i = (Vomiting & TIMEOUT) / 3L;
  903. X
  904. X    if ((((Vomiting & TIMEOUT) % 3L) == 2) && (i >= 0)
  905. X        && (i < SIZE(vomiting_texts)))
  906. X        pline(vomiting_texts[SIZE(vomiting_texts) - i - 1]);
  907. X
  908. X    switch ((int) i) {
  909. X    case 0:
  910. X        vomit();
  911. X        morehungry(20);
  912. X        break;
  913. X    case 2:
  914. X        make_stunned(HStun + d(2,4), FALSE);
  915. X        /* fall through */
  916. X    case 3:
  917. X        make_confused(HConfusion + d(2,4), FALSE);
  918. X        break;
  919. X    }
  920. X    exercise(A_CON, FALSE);
  921. X}
  922. X
  923. Xstatic const char NEARDATA *choke_texts[] = {
  924. X    "You find it hard to breathe.",
  925. X    "You're gasping for air.",
  926. X    "You can no longer breathe.",
  927. X    "You're turning %s.",
  928. X    "You suffocate."
  929. X};
  930. X
  931. XSTATIC_OVL void
  932. Xchoke_dialogue()
  933. X{
  934. X    register long i = (Strangled & TIMEOUT);
  935. X
  936. X    if(i > 0 && i <= SIZE(choke_texts))
  937. X        pline(choke_texts[SIZE(choke_texts) - i], Hallucination ?
  938. X            hcolor() : blue);
  939. X    exercise(A_STR, FALSE);
  940. X}
  941. X
  942. X#endif /* OVLB */
  943. X#ifdef OVL0
  944. X
  945. Xvoid
  946. Xnh_timeout()
  947. X{
  948. X    register struct prop *upp;
  949. X    int sleeptime;
  950. X
  951. X    if(u.uluck && moves % (u.uhave.amulet || u.ugangr ? 300 : 600) == 0) {
  952. X    /* Cursed luckstones stop bad luck from timing out; blessed luckstones
  953. X     * stop good luck from timing out; normal luckstones stop both;
  954. X     * neither is stopped if you don't have a luckstone.
  955. X     * Luck is based at 0 usually, +1 if a full moon and -1 on Friday 13th
  956. X     */
  957. X        register int time_luck = stone_luck(FALSE);
  958. X        boolean nostone = !carrying(LUCKSTONE) && !stone_luck(TRUE);
  959. X        int baseluck = (flags.moonphase == FULL_MOON) ? 1 : 0;
  960. X
  961. X        baseluck -= (flags.friday13 ? 1 : 0);
  962. X
  963. X        if(u.uluck > baseluck && (nostone || time_luck < 0))
  964. X        u.uluck--;
  965. X        else if(u.uluck < baseluck && (nostone || time_luck > 0))
  966. X        u.uluck++;
  967. X    }
  968. X    if(u.uinvulnerable) return; /* things past this point could kill you */
  969. X    if(Stoned) stoned_dialogue();
  970. X    if(Vomiting) vomiting_dialogue();
  971. X    if(Strangled) choke_dialogue();
  972. X#ifdef POLYSELF
  973. X    if(u.mtimedone) if(!--u.mtimedone) rehumanize();
  974. X#endif
  975. X    if(u.ucreamed) u.ucreamed--;
  976. X
  977. X    for(upp = u.uprops; upp < u.uprops+SIZE(u.uprops); upp++)
  978. X        if((upp->p_flgs & TIMEOUT) && !(--upp->p_flgs & TIMEOUT)) {
  979. X        if(upp->p_tofn) (*upp->p_tofn)();
  980. X        else switch(upp - u.uprops){
  981. X        case STONED:
  982. X            if (!killer) {
  983. X                killer_format = KILLED_BY_AN;
  984. X                killer = "cockatrice";
  985. X            } done(STONING);
  986. X            break;
  987. X        case VOMITING:
  988. X            make_vomiting(0L, TRUE);
  989. X            break;
  990. X        case SICK:
  991. X            You("die from your illness.");
  992. X            killer_format = KILLED_BY_AN;
  993. X            killer = u.usick_cause;
  994. X            done(POISONING);
  995. X            break;
  996. X        case FAST:
  997. X            if (Fast & ~INTRINSIC) /* boot speed */
  998. X                ;
  999. X            else
  1000. X                You("feel yourself slowing down%s.",
  1001. X                            Fast ? " a bit" : "");
  1002. X            break;
  1003. X        case CONFUSION:
  1004. X            HConfusion = 1; /* So make_confused works properly */
  1005. X            make_confused(0L, TRUE);
  1006. X            stop_occupation();
  1007. X            break;
  1008. X        case STUNNED:
  1009. X            HStun = 1;
  1010. X            make_stunned(0L, TRUE);
  1011. X            stop_occupation();
  1012. X            break;
  1013. X        case BLINDED:
  1014. X            Blinded = 1;
  1015. X            make_blinded(0L, TRUE);
  1016. X            stop_occupation();
  1017. X            break;
  1018. X        case INVIS:
  1019. X            newsym(u.ux,u.uy);
  1020. X            if (!Invis && !See_invisible && !Blind)
  1021. X                You("are no longer invisible.");
  1022. X            stop_occupation();
  1023. X            break;
  1024. X        case SEE_INVIS:
  1025. X            set_mimic_blocking(); /* do special mimic handling */
  1026. X            see_monsters();        /* make invis mons appear */
  1027. X            newsym(u.ux,u.uy);    /* make self appear */
  1028. X            stop_occupation();
  1029. X            break;
  1030. X        case WOUNDED_LEGS:
  1031. X            heal_legs();
  1032. X            stop_occupation();
  1033. X            break;
  1034. X        case HALLUC:
  1035. X            HHallucination = 1;
  1036. X            make_hallucinated(0L, TRUE, 0L);
  1037. X            stop_occupation();
  1038. X            break;
  1039. X        case SLEEPING:
  1040. X            if (unconscious() || Sleep_resistance)
  1041. X                Sleeping += rnd(100);
  1042. X            else {
  1043. X                You("fall asleep.");
  1044. X                sleeptime = rnd(20);
  1045. X                nomul(-sleeptime);
  1046. X                u.usleep = 1;
  1047. X                nomovemsg = "You wake up.";
  1048. X                Sleeping = sleeptime + rnd(100);
  1049. X            }
  1050. X            break;
  1051. X        case STRANGLED:
  1052. X            killer_format = KILLED_BY;
  1053. X            killer = "strangulation";
  1054. X            done(DIED);
  1055. X            break;
  1056. X        case FUMBLING:
  1057. X            /* call this only when a move took place.  */
  1058. X            /* otherwise handle fumbling msgs locally. */
  1059. X            if (!Levitation && u.umoved) {
  1060. X                if (OBJ_AT(u.ux, u.uy))
  1061. X                You("trip over something.");
  1062. X                else if (rn2(3) && is_ice(u.ux, u.uy))
  1063. X                You("%s on the ice.",
  1064. X                    rn2(2) ? "slip" : "slide");
  1065. X                else
  1066. X                switch (rn2(4)) {
  1067. X                    case 1:
  1068. X                    if (ACCESSIBLE(levl[u.ux][u.uy].typ)) { /* not POOL or STONE */
  1069. X                        if (Hallucination) pline("A rock bites your foot.");
  1070. X                        else You("trip over a rock.");
  1071. X                        break;
  1072. X                    }
  1073. X                    case 2:
  1074. X                    if (ACCESSIBLE(levl[u.ux][u.uy].typ)) { /* not POOL or STONE */
  1075. X                        if (Hallucination) You("slip on a banana peel.");
  1076. X                        else You("slip and nearly fall.");
  1077. X                        break;
  1078. X                    }
  1079. X                    case 3:
  1080. X                    You("flounder.");
  1081. X                    break;
  1082. X                    default:
  1083. X                    You("stumble.");
  1084. X                }
  1085. X                nomul(-2);
  1086. X                nomovemsg = "";
  1087. X                /* Fumbling can be noisy */
  1088. X                if ((inv_weight() > -500)) {
  1089. X                    You("make a lot of noise!");
  1090. X                    wake_nearby();
  1091. X                }
  1092. X            }
  1093. X            Fumbling += rnd(20);
  1094. X            break;
  1095. X        }
  1096. X    }
  1097. X}
  1098. X
  1099. X#endif /* OVL0 */
  1100. X#ifdef OVLB
  1101. X
  1102. XSTATIC_OVL void
  1103. Xhatch_it(otmp)        /* hatch the egg "otmp" if possible */
  1104. Xregister struct obj *otmp;
  1105. X{
  1106. X    register struct monst *mtmp;
  1107. X#ifdef POLYSELF
  1108. X    int yours = otmp->spe;
  1109. X#endif
  1110. X
  1111. X    if(monstermoves-otmp->age > 200)  /* very old egg - it's dead */
  1112. X        otmp->corpsenm = -1;
  1113. X#ifdef LINT    /* long conv. ok */
  1114. X    else if(rnd(150) > 150) {
  1115. X#else
  1116. X    else if(rnd((int)(monstermoves-otmp->age)) > 150) {
  1117. X#endif
  1118. X        mtmp = makemon(&mons[big_to_little(otmp->corpsenm)], u.ux, u.uy);
  1119. X        useup(otmp);
  1120. X        if(mtmp) {
  1121. X
  1122. X        if(Blind)
  1123. X            You("feel something %s from your pack!",
  1124. X            locomotion(mtmp->data, "drop"));
  1125. X        else
  1126. X            You("see %s %s out of your pack!",
  1127. X            an(mtmp->data->mname),
  1128. X            locomotion(mtmp->data, "drop"));
  1129. X
  1130. X#ifdef POLYSELF
  1131. X        if (yours) {
  1132. X            struct monst *mtmp2;
  1133. X
  1134. X            pline("Its cries sound like \"%s.\"",
  1135. X            flags.female ? "mommy" : "daddy");
  1136. X            if (mtmp2 = tamedog(mtmp, (struct obj *)0))
  1137. X            mtmp = mtmp2;
  1138. X            mtmp->mtame = 20;
  1139. X            while(otmp = (mtmp->minvent)) {
  1140. X            mtmp->minvent = otmp->nobj;
  1141. X            dealloc_obj(otmp);
  1142. X            }
  1143. X            return;
  1144. X        }
  1145. X#endif
  1146. X        if(mtmp->data->mlet == S_DRAGON) {
  1147. X            struct monst *mtmp2;
  1148. X
  1149. X            verbalize("Gleep!");        /* Mything eggs :-) */
  1150. X            if (mtmp2 = tamedog(mtmp, (struct obj *)0))
  1151. X            mtmp = mtmp2;
  1152. X            while(otmp = (mtmp->minvent)) {
  1153. X            mtmp->minvent = otmp->nobj;
  1154. X            dealloc_obj(otmp);
  1155. X            }
  1156. X        }
  1157. X        }
  1158. X    }
  1159. X}
  1160. X
  1161. X#endif /* OVLB */
  1162. X#ifdef OVL1
  1163. X
  1164. Xvoid
  1165. Xhatch_eggs()        /* hatch any eggs that have been too long in pack */
  1166. X{
  1167. X    register struct obj *otmp, *otmp2;
  1168. X
  1169. X    for(otmp = invent; otmp; otmp = otmp2) {
  1170. X        otmp2 = otmp->nobj;        /* otmp may hatch */
  1171. X        if(otmp->otyp == EGG && otmp->corpsenm >= 0) hatch_it(otmp);
  1172. X        /* else if (Is_container(otmp) && otmp->cobj) ...        */
  1173. X        /*                                */
  1174. X        /* Check for container here and hatch with the container.    */
  1175. X        /* One of these days...                    */
  1176. X        /* Maybe call hatch_eggs() with invent as a parameter so    */
  1177. X        /* that we can call it recursively.                */
  1178. X    }
  1179. X}
  1180. X
  1181. X/* Burn up lit lamps.  Only applies to non-magic lamps; magic lamps stay
  1182. X * lit as long as there's a genie inside.  We use obj->age to see how long
  1183. X * there is left for the lamp to burn, but this differs from the use of
  1184. X * age for corpses and eggs: for the latter items it's when the object was
  1185. X * created, but for lamps it's the number of moves remaining.
  1186. X */
  1187. Xvoid
  1188. Xburn_lamps()
  1189. X{
  1190. X    register struct obj *obj;
  1191. X
  1192. X    /* Note: magic lamps never go out as long as the genie's inside */
  1193. X    for(obj=invent; obj; obj=obj->nobj) {
  1194. X        if ((obj->otyp == OIL_LAMP || obj->otyp == BRASS_LANTERN)
  1195. X                            && obj->lamplit) {
  1196. X        obj->age--;
  1197. X        switch((int)obj->age) {
  1198. X            case 150:
  1199. X            case 100:
  1200. X            if (obj->otyp == BRASS_LANTERN) goto advmsg;
  1201. X            if (!Blind)
  1202. X                Your("%s flickers.", xname(obj));
  1203. X            break;
  1204. X            case 50:
  1205. X            if (obj->otyp == BRASS_LANTERN) goto advmsg;
  1206. X            if (!Blind)
  1207. X                Your("%s flickers considerably.", xname(obj));
  1208. X            break;
  1209. X            case 25:
  1210. X    advmsg:        if (!Blind) {
  1211. X                if (obj->otyp == BRASS_LANTERN) {
  1212. X                Your("lamp is getting dim.");
  1213. X                if (Hallucination)
  1214. X                    pline("Batteries have not been invented yet.");
  1215. X                } else
  1216. X                Your("%s seems about to go out.", xname(obj));
  1217. X            }
  1218. X            break;
  1219. X            case 0: /* even if blind you'll know */
  1220. X            if (obj->otyp == BRASS_LANTERN)
  1221. X                Your("lamp has run out of power.");
  1222. X            else Your("%s goes out.", xname(obj));
  1223. X            obj->lamplit = 0;
  1224. X            obj->spe = 0;
  1225. X            check_lamps();
  1226. X            break;
  1227. X            default: break;
  1228. X        }
  1229. X        }
  1230. X        if ((obj->otyp == CANDELABRUM_OF_INVOCATION || Is_candle(obj)) &&
  1231. X            obj->lamplit)
  1232. X        age_candle(obj);
  1233. X    }
  1234. X}
  1235. X
  1236. Xstatic void
  1237. Xage_candle(otmp)
  1238. Xregister struct obj *otmp;
  1239. X{
  1240. X    register boolean many, 
  1241. X                     menorah = otmp->otyp == CANDELABRUM_OF_INVOCATION;
  1242. X
  1243. X    otmp->age--;
  1244. X
  1245. X    if (otmp->age == 0L) {
  1246. X        otmp->lamplit = 0;
  1247. X        many = menorah ? otmp->spe > 1 : otmp->quan > 1L;
  1248. X        if (menorah) {
  1249. X        pline("%s's flame%s.", 
  1250. X            The(xname(otmp)), (many ? "s die" : " dies"));
  1251. X        otmp->spe = 0;
  1252. X        } else {
  1253. X        Your("%s %s consumed!  %s",
  1254. X            xname(otmp), (many ? "are" : "is"),
  1255. X            (Hallucination ?
  1256. X                (many ? "They shriek!" : "It shrieks!") :
  1257. X             Blind ? "" :
  1258. X                (many ? "Their flames die." : "Its flame dies.")));
  1259. X        freeinv(otmp);
  1260. X        obfree(otmp, (struct obj *)0);
  1261. X        }
  1262. X        check_lamps();
  1263. X    } else if (Blind) {
  1264. X        return;
  1265. X    } else if (otmp->age == 15L) {
  1266. X        many = menorah ? otmp->spe > 1 : otmp->quan > 1L;
  1267. X        Norep("The %scandle%s flame%s flicker%s low!",
  1268. X            (menorah ? "candelabrum's " : ""),
  1269. X            (many ? "s'" : "'s"),
  1270. X            (many ? "s" : ""),
  1271. X            (many ? "" : "s"));
  1272. X    } else if (otmp->age == 75L) {
  1273. X        many = menorah ? otmp->spe > 1 : otmp->quan > 1L;
  1274. X        Norep("The %scandle%s getting short.",
  1275. X            menorah ? "candelabrum's " : "",
  1276. X            (many ? "s are" : " is"));
  1277. X    }
  1278. X}
  1279. Xvoid
  1280. Xdo_storms()
  1281. X{
  1282. X    int nstrike;
  1283. X    register int x, y;
  1284. X    int dirx, diry;
  1285. X    int count;
  1286. X
  1287. X    /* no lightning if not the air level or too often, even then */
  1288. X    if(!Is_airlevel(&u.uz) || rn2(8))
  1289. X    return;
  1290. X
  1291. X    /* the number of strikes is 8-log2(nstrike) */
  1292. X    for(nstrike = rnd(64); nstrike <= 64; nstrike *= 2) {
  1293. X    count = 0;
  1294. X    do {
  1295. X        x = rnd(COLNO-1);
  1296. X        y = rn2(ROWNO);
  1297. X    } while (++count < 100 && levl[x][y].typ != CLOUD);
  1298. X
  1299. X    if(count < 100) {
  1300. X        dirx = rn2(3) - 1;
  1301. X        diry = rn2(3) - 1;
  1302. X        if(dirx != 0 || diry != 0)
  1303. X        buzz(-15, /* "monster" LIGHTNING spell */
  1304. X             8, x, y, dirx, diry);
  1305. X    }
  1306. X    }
  1307. X
  1308. X    if(levl[u.ux][u.uy].typ == CLOUD) {
  1309. X    /* inside a cloud during a thunder storm is deafening */
  1310. X    pline("Kaboom!!!  Boom!!  Boom!!");
  1311. X    if(!u.uinvulnerable) {
  1312. X        stop_occupation();
  1313. X        nomul(-3);
  1314. X    }
  1315. X    } else
  1316. X    You("hear a rumbling noise.");
  1317. X}
  1318. X#endif /* OVL1 */
  1319. X
  1320. X/*timeout.c*/
  1321. END_OF_FILE
  1322. if test 11863 -ne `wc -c <'src/timeout.c'`; then
  1323.     echo shar: \"'src/timeout.c'\" unpacked with wrong size!
  1324. fi
  1325. # end of 'src/timeout.c'
  1326. fi
  1327. echo shar: End of archive 23 \(of 108\).
  1328. cp /dev/null ark23isdone
  1329. MISSING=""
  1330. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  1331. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  1332. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  1333. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  1334. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  1335. 101 102 103 104 105 106 107 108 ; do
  1336.     if test ! -f ark${I}isdone ; then
  1337.     MISSING="${MISSING} ${I}"
  1338.     fi
  1339. done
  1340. if test "${MISSING}" = "" ; then
  1341.     echo You have unpacked all 108 archives.
  1342.     echo "Now execute 'rebuild.sh'"
  1343.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  1344. else
  1345.     echo You still need to unpack the following archives:
  1346.     echo "        " ${MISSING}
  1347. fi
  1348. ##  End of shell archive.
  1349. exit 0
  1350.