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

  1. Path: uunet!zephyr.ens.tek.com!tektronix!tekgen!tekred!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v07i063:  NetHack3 -  display oriented dungeons & dragons (Ver. 3.0), Part08/38
  5. Message-ID: <4316@tekred.CNA.TEK.COM>
  6. Date: 24 Jul 89 05:00:54 GMT
  7. Sender: nobody@tekred.CNA.TEK.COM
  8. Lines: 1454
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
  12. Posting-number: Volume 7, Issue 63
  13. Archive-name: NetHack3/Part08
  14.  
  15.  
  16.  
  17. #! /bin/sh
  18. # This is a shell archive.  Remove anything before this line, then unpack
  19. # it by saving it into a file and typing "sh file".  To overwrite existing
  20. # files, type "sh file -c".  You can also feed this as standard input via
  21. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  22. # will see the following message at the end:
  23. #        "End of archive 8 (of 38)."
  24. # Contents:  src/monst.c2 src/save.c
  25. # Wrapped by billr@saab on Sun Jul 23 21:32:51 1989
  26. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  27. if test -f 'src/monst.c2' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'src/monst.c2'\"
  29. else
  30. echo shar: Extracting \"'src/monst.c2'\" \(35010 characters\)
  31. sed "s/^X//" >'src/monst.c2' <<'END_OF_FILE'
  32. X/*    Leprechauns    */
  33. X    { "leprechaun", S_LEPRECHAUN, 5, 15, 8, 20, 0, (G_GENO | 4),
  34. X      { { AT_CLAW, AD_PHYS, 1, 2 }, { AT_CLAW, AD_SGLD, 0, 0 },
  35. X        NO_ATTK, NO_ATTK, NO_ATTK },
  36. X      30, 300, 0, MS_LAUGH, M1_HUMANOID | M1_TPORT | M1_GREEDY,
  37. X      M2_HOSTILE },
  38. X/*     Mummies        */
  39. X    { "kobold mummy", S_MUMMY, 3, 8, 6, 20, -2, (G_GENO | G_NOCORPSE | 1),
  40. X      { { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  41. X      10, 20, 0, MS_SILENT,
  42. X      M1_HUMANOID | M1_UNDEAD | M1_POIS, M2_HOSTILE },
  43. X    { "gnome mummy", S_MUMMY, 4, 10, 6, 20, -3, (G_GENO | G_NOCORPSE | 1),
  44. X      { { AT_CLAW, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  45. X      20, 25, 0, MS_SILENT,
  46. X      M1_HUMANOID | M1_UNDEAD | M1_POIS, M2_HOSTILE },
  47. X    { "orc mummy", S_MUMMY, 5, 10, 5, 20, -4, (G_GENO | G_NOCORPSE | 1),
  48. X      { { AT_CLAW, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  49. X      30, 30, 0, MS_SILENT, M1_HUMANOID | M1_UNDEAD | M1_POIS |
  50. X      M1_GREEDY | M1_JEWELS, M2_HOSTILE | M2_ORC },
  51. X    { "elf mummy", S_MUMMY, 6, 12, 4, 30, -5, (G_GENO | G_NOCORPSE | 1),
  52. X      { { AT_CLAW, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  53. X      35, 35, 0, MS_SILENT, M1_HUMANOID | M1_UNDEAD | M1_POIS | M1_SLEE_RES,
  54. X      M2_HOSTILE | M2_ELF },
  55. X    { "human mummy", S_MUMMY, 6, 12, 4, 30, -5, (G_GENO | G_NOCORPSE | 1),
  56. X      { { AT_CLAW, AD_PHYS, 2, 4 }, { AT_CLAW, AD_PHYS, 2, 4 },
  57. X        NO_ATTK, NO_ATTK, NO_ATTK },
  58. X      40, 40, 0, MS_SILENT,
  59. X      M1_HUMANOID | M1_UNDEAD | M1_POIS, M2_HOSTILE },
  60. X    { "ettin mummy", S_MUMMY, 7, 12, 4, 30, -6, (G_GENO | G_NOCORPSE | 1),
  61. X      { { AT_CLAW, AD_PHYS, 2, 6 }, { AT_CLAW, AD_PHYS, 2, 6 },
  62. X        NO_ATTK, NO_ATTK, NO_ATTK }, 70, 50, 0, MS_SILENT,
  63. X      M1_HUMANOID | M1_UNDEAD | M1_POIS | M1_BIG,
  64. X      M2_HOSTILE | M2_STRONG },
  65. X    { "giant mummy", S_MUMMY, 8, 14, 3, 30, -7, (G_GENO | G_NOCORPSE | 1),
  66. X      { { AT_CLAW, AD_PHYS, 3, 4 }, { AT_CLAW, AD_PHYS, 3, 4 },
  67. X        NO_ATTK, NO_ATTK, NO_ATTK }, 70, 50, 0, MS_SILENT,
  68. X      M1_HUMANOID | M1_UNDEAD | M1_POIS | M1_BIG | M1_JEWELS,
  69. X      M2_HOSTILE | M2_GIANT | M2_STRONG },
  70. X/*    Nymphs    */
  71. X    { "wood nymph", S_NYMPH, 3, 12, 9, 20, 0, (G_GENO | 2),
  72. X      { { AT_CLAW, AD_SITM, 0, 0 }, { AT_CLAW, AD_SEDU, 0, 0 },
  73. X        NO_ATTK, NO_ATTK, NO_ATTK }, 30, 300, 0, MS_SEDUCE,
  74. X      M1_HUMANOID | M1_TPORT | M1_COLLECT | M1_FEM, M2_HOSTILE },
  75. X    { "water nymph", S_NYMPH, 3, 12, 9, 20, 0, (G_GENO | 2),
  76. X      { { AT_CLAW, AD_SITM, 0, 0 }, { AT_CLAW, AD_SEDU, 0, 0 },
  77. X        NO_ATTK, NO_ATTK, NO_ATTK }, 30, 300, 0, MS_SEDUCE,
  78. X      M1_HUMANOID | M1_TPORT | M1_COLLECT | M1_FEM | M1_SWIM,
  79. X      M2_HOSTILE },
  80. X    { "mountain nymph", S_NYMPH, 3, 12, 9, 20, 0, (G_GENO | 2),
  81. X      { { AT_CLAW, AD_SITM, 0, 0 }, { AT_CLAW, AD_SEDU, 0, 0 },
  82. X        NO_ATTK, NO_ATTK, NO_ATTK }, 30, 300, 0, MS_SEDUCE,
  83. X      M1_HUMANOID | M1_TPORT | M1_COLLECT | M1_FEM, M2_HOSTILE },
  84. X/*    Ogres    */
  85. X    { "ogre", S_OGRE, 5, 10, 5, 0, -3, (G_SGROUP | G_GENO | 1),
  86. X      { { AT_WEAP, AD_PHYS, 2, 5 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  87. X      60, 500, 0, MS_GRUNT,
  88. X      M1_BIG | M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT,
  89. X      M2_STRONG },
  90. X    { "ogre lord", S_OGRE, 7, 12, 3, 30, -5, (G_GENO | 2),
  91. X      { { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  92. X      70, 700, 0, MS_GRUNT,
  93. X      M1_BIG | M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT | M1_LORD,
  94. X      M2_STRONG },
  95. X    { "ogre king", S_OGRE, 7, 14, 4, 60, -7, (G_GENO | 2),
  96. X      { { AT_WEAP, AD_PHYS, 3, 5 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  97. X      70, 750, 0, MS_GRUNT,
  98. X      M1_BIG | M1_HUMANOID | M1_GREEDY | M1_JEWELS | M1_COLLECT | M1_PRINCE,
  99. X      M2_STRONG },
  100. X/*    Puddings */
  101. X    { "gray ooze", S_PUDDING, 3, 1, 8, 0, 0, (G_GENO | 2),
  102. X      { { AT_BITE, AD_RUST, 2, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  103. X      50, 500, 0, MS_SILENT, M1_NOEYES | M1_NOHANDS | M1_POIS_RES, 
  104. X      M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE | M2_AMORPHOUS },
  105. X    { "brown pudding", S_PUDDING, 5, 3, 8, 0, 0, (G_GENO | 1),
  106. X      { { AT_BITE, AD_DCAY, 0, 0 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  107. X      50, 500, 0, MS_SILENT, M1_NOEYES | M1_NOHANDS | M1_POIS_RES |
  108. X      M1_COLD_RES | M1_ELEC_RES,
  109. X      M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE | M2_AMORPHOUS },
  110. X    { "black pudding", S_PUDDING, 10, 6, 6, 0, 0, (G_GENO | 1),
  111. X      { { AT_BITE, AD_RUST, 3, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  112. X      50, 500, 0, MS_SILENT, M1_NOEYES | M1_NOHANDS | M1_POIS_RES |
  113. X      M1_COLD_RES | M1_ELEC_RES,
  114. X      M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE | M2_AMORPHOUS },
  115. X/*    Quantum Mechanics    */
  116. X    { "quantum mechanic", S_QUANTMECH, 7, 12, 3, 10, 0, (G_GENO | 3),
  117. X      { { AT_CLAW, AD_TLPT, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  118. X      2, 20, 0, MS_SILENT, M1_ANIMAL | M1_HUMANOID | M1_POIS, M2_HOSTILE },
  119. X    { "mad scientist", S_QUANTMECH, 8, 12, 2, 20, 0, (G_GENO | 2),
  120. X      { { AT_WEAP, AD_SLEE, 1, 8 }, { AT_CLAW, AD_DREN, 0, 0 },
  121. X        NO_ATTK, NO_ATTK, NO_ATTK },
  122. X      35, 200, 0, MS_SILENT, M1_HUMANOID | M1_POIS | M1_COLLECT,
  123. X      M2_HOSTILE | M2_HUMAN },
  124. X/*    Rust Monster    */
  125. X    { "rust monster", S_RUSTMONST, 5, 18, 2, 0, 0, (G_GENO | 2),
  126. X      { { AT_TUCH, AD_RUST, 0, 0 }, { AT_TUCH, AD_RUST, 0, 0 }, NO_ATTK,
  127. X        NO_ATTK, NO_ATTK },
  128. X      50, 500, 0, MS_SILENT, M1_SWIM | M1_ANIMAL | M1_NOHANDS, M2_HOSTILE },
  129. X/*    Snakes    */
  130. X    { "garter snake", S_SNAKE, 1, 8, 8, 0, 0, (G_LGROUP | G_GENO | 1),
  131. X      { { AT_BITE, AD_PHYS, 1, 2 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  132. X      5, 60, 0, MS_HISS,
  133. X      M1_VSMALL | M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_EGGS, M2_CONCEAL |
  134. X      M2_NOLIMBS | M2_CARNIVORE },
  135. X    { "snake", S_SNAKE, 4, 15, 3, 0, 0, (G_GENO | 2),
  136. X      { { AT_BITE, AD_DRST, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  137. X      10, 80, 0, MS_HISS, M1_VSMALL | M1_SWIM | M1_ANIMAL | M1_NOHANDS |
  138. X      M1_EGGS | M1_POIS | M1_POIS_RES, M2_HOSTILE | M2_CONCEAL |
  139. X      M2_NOLIMBS | M2_CARNIVORE },
  140. X    { "pit viper", S_SNAKE, 6, 15, 2, 0, 0, (G_GENO | 1),
  141. X      { { AT_BITE, AD_DRST, 1, 4 }, { AT_BITE, AD_DRST, 1, 4 },
  142. X        NO_ATTK, NO_ATTK, NO_ATTK }, 5, 60, 0, MS_HISS, M1_VSMALL |
  143. X      M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_EGGS | M1_POIS | M1_POIS_RES,
  144. X      M2_HOSTILE | M2_CONCEAL | M2_NOLIMBS | M2_CARNIVORE },
  145. X    { "cobra", S_SNAKE, 6, 18, 2, 0, 0, (G_GENO | 1),
  146. X      { { AT_BITE, AD_DRST, 2, 4 }, { AT_SPIT, AD_BLND, 0, 0 },
  147. X        NO_ATTK, NO_ATTK, NO_ATTK }, 15, 100, 0, MS_HISS, M1_VSMALL |
  148. X      M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_EGGS | M1_POIS | M1_POIS_RES,
  149. X      M2_HOSTILE | M2_CONCEAL | M2_NOLIMBS | M2_CARNIVORE },
  150. X    { "python", S_SNAKE, 6, 3, 5, 0, 0, (G_GENO | 1),
  151. X      { { AT_BITE, AD_DRST, 1, 4 }, { AT_HUGS, AD_WRAP, 2, 4 },
  152. X        NO_ATTK, NO_ATTK, NO_ATTK }, 15, 100, 0, MS_HISS, M1_BIG |
  153. X      M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_EGGS | M1_POIS | M1_POIS_RES,
  154. X      M2_HOSTILE | M2_STRONG | M2_NOLIMBS | M2_CARNIVORE },
  155. X    { "water moccasin", S_SNAKE, 4, 15, 3, 0, 0,
  156. X      (G_GENO | G_NOGEN | G_LGROUP),
  157. X      { { AT_BITE, AD_DRST, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  158. X      10, 100, 0, MS_HISS, M1_VSMALL | M1_SWIM | M1_ANIMAL | M1_NOHANDS |
  159. X      M1_EGGS | M1_POIS | M1_POIS_RES, M2_HOSTILE | M2_CONCEAL |
  160. X      M2_NOLIMBS | M2_CARNIVORE },
  161. X/*    Trolls    */
  162. X    { "troll", S_TROLL, 7, 12, 4, 0, -3, (G_GENO | 2),
  163. X      { { AT_CLAW, AD_PHYS, 4, 2 }, { AT_CLAW, AD_PHYS, 4, 2 },
  164. X        { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK },
  165. X      40, 400, 0, MS_GRUNT, M1_BIG | M1_HUMANOID | M1_REGEN | M1_STALK,
  166. X      M2_STRONG | M2_CARNIVORE | M2_HOSTILE },
  167. X    { "ice troll", S_TROLL, 9, 10, 2, 20, -3, (G_GENO | 1),
  168. X      { { AT_CLAW, AD_PHYS, 2, 6 }, { AT_CLAW, AD_COLD, 2, 6 },
  169. X        { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK },
  170. X      40, 300, 0, MS_GRUNT,
  171. X      M1_BIG | M1_HUMANOID | M1_COLD_RES | M1_REGEN | M1_STALK,
  172. X      M2_STRONG | M2_CARNIVORE | M2_HOSTILE },
  173. X    { "rock troll", S_TROLL, 9, 12, 0, 0, -3, (G_GENO | 1),
  174. X      { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_WEAP, AD_PHYS, 3, 6 },
  175. X        { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK },
  176. X      40, 300, 0, MS_GRUNT,
  177. X      M1_BIG | M1_HUMANOID | M1_REGEN | M1_STALK | M1_COLLECT,
  178. X      M2_STRONG | M2_CARNIVORE | M2_HOSTILE },
  179. X    { "water troll", S_TROLL, 11, 14, 4, 40, -3, (G_NOGEN | G_GENO),
  180. X      { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_CLAW, AD_PHYS, 2, 8 },
  181. X        { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK },
  182. X      40, 400, 0, MS_GRUNT,
  183. X      M1_BIG | M1_SWIM | M1_HUMANOID | M1_REGEN | M1_STALK,
  184. X      M2_STRONG | M2_CARNIVORE | M2_HOSTILE },
  185. X#ifdef TOLKIEN
  186. X    { "Olog-hai", S_TROLL, 13, 12, -4, 0, -7, (G_GENO | 1),
  187. X      { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_WEAP, AD_PHYS, 3, 6 },
  188. X        { AT_BITE, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK },
  189. X      40, 400, 0, MS_GRUNT,
  190. X      M1_BIG | M1_HUMANOID | M1_REGEN | M1_STALK | M1_COLLECT,
  191. X      M2_STRONG | M2_CARNIVORE | M2_HOSTILE },
  192. X#endif
  193. X/*    Umber Hulk    */
  194. X    { "umber hulk", S_UMBER, 9, 6, 2, 25, 0, (G_GENO | 2),
  195. X      { { AT_CLAW, AD_PHYS, 3, 4 }, { AT_CLAW, AD_PHYS, 3, 4 },
  196. X        { AT_BITE, AD_PHYS, 2, 5 }, { AT_GAZE, AD_CONF, 0, 0 }, NO_ATTK },
  197. X      50, 500, 0, MS_SILENT, M1_BIG, M2_STRONG | M2_TUNNEL | M2_CARNIVORE },
  198. X/*    Vampires    */
  199. X    { "vampire", S_VAMPIRE, 10, 12, 1, 25, -8, (G_GENO | 1),
  200. X      { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_BITE, AD_DRLI, 1, 6 },
  201. X        NO_ATTK, NO_ATTK, NO_ATTK }, 40, 400, 0, MS_VAMPIRE,
  202. X      M1_FLY | M1_HUMANOID | M1_UNDEAD | M1_POIS | M1_REGEN |
  203. X      M1_STALK, M2_HOSTILE | M2_STRONG | M2_NASTY },
  204. X    { "vampire lord", S_VAMPIRE, 12, 14, 0, 50, -9, (G_GENO | 1),
  205. X      { { AT_CLAW, AD_PHYS, 1, 8 }, { AT_BITE, AD_DRLI, 1, 8 },
  206. X        NO_ATTK, NO_ATTK, NO_ATTK }, 40, 400, 0, MS_VAMPIRE,
  207. X      M1_FLY | M1_HUMANOID | M1_UNDEAD | M1_POIS | M1_REGEN |
  208. X      M1_STALK | M1_LORD, M2_HOSTILE | M2_STRONG | M2_NASTY },
  209. X    { "Vlad the Impaler", S_VAMPIRE, 14, 18, -3, 80, -10,
  210. X      (G_NOGEN | G_NOCORPSE | G_UNIQ),
  211. X      { { AT_WEAP, AD_PHYS, 1, 6 }, { AT_BITE, AD_DRLI, 1, 6 },
  212. X        NO_ATTK, NO_ATTK, NO_ATTK }, 40, 400, PL_NSIZ, MS_VAMPIRE,
  213. X      M1_NOPOLY | M1_FLY | M1_HUMANOID | M1_UNDEAD | M1_POIS |
  214. X      M1_REGEN | M1_STALK | M1_PRINCE, 
  215. X      M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY },
  216. X/*    Wraiths     */
  217. X    { "barrow wight", S_WRAITH, 3, 12, 5, 5, -3, (G_GENO | G_NOCORPSE | 1),
  218. X      { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_MAGC, AD_SPEL, 0, 0 },
  219. X        { AT_WEAP, AD_DRLI, 0, 0 }, NO_ATTK, NO_ATTK }, 0, 0, 0, MS_SILENT,
  220. X      M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | M1_STALK | M1_COLLECT, 
  221. X      M2_HOSTILE },
  222. X    { "wraith", S_WRAITH, 6, 12, 4, 15, -6, (G_GENO | 2),
  223. X      { { AT_TUCH, AD_DRLI, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  224. X      0, 0, 0, MS_SILENT, 
  225. X      M1_FLY | M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | M1_STALK, 
  226. X      M2_HOSTILE },
  227. X#ifdef TOLKIEN
  228. X    { "Nazgul", S_WRAITH, 13, 12, 0, 25, -17, (G_GENO | G_NOCORPSE | 1),
  229. X      { { AT_WEAP, AD_DRLI, 1, 4 }, { AT_BREA, AD_SLEE, 0, 0 },
  230. X        NO_ATTK, NO_ATTK, NO_ATTK }, 0, 0, 0, MS_SILENT,
  231. X      M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | M1_STALK | M1_COLLECT, 
  232. X      M2_STRONG },
  233. X#endif
  234. X/*    Xorn    */
  235. X    { "xorn", S_XORN, 8, 9,-2, 20, 0, (G_GENO | 1),
  236. X      { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
  237. X        { AT_CLAW, AD_PHYS, 1, 3 }, { AT_BITE, AD_PHYS, 4, 6 },
  238. X        NO_ATTK }, 70, 700, 0, MS_SILENT,
  239. X      M1_BIG | M1_WALLWALK | M1_FIRE_RES | M1_COLD_RES | M1_STON_RES,
  240. X      M2_HOSTILE | M2_STRONG | M2_THICK_HIDE },
  241. X/*    Yeti    */
  242. X    { "yeti", S_YETI, 5, 15, 6, 0, 0, (G_GENO | 2),
  243. X      { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_CLAW, AD_PHYS, 1, 6 },
  244. X        { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK },
  245. X      70, 700, 0, MS_GROWL, M1_BIG | M1_ANIMAL | M1_HUMANOID | M1_COLD_RES,
  246. X      M2_HOSTILE | M2_STRONG | M2_CARNIVORE },
  247. X/*    Zombies     */
  248. X    { "kobold zombie", S_ZOMBIE, 0, 6, 10, 0, -2, (G_GENO | G_NOCORPSE | 1),
  249. X      { { AT_CLAW, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  250. X      10, 0, 0, MS_SILENT, M1_HUMANOID | M1_UNDEAD | M1_POIS |
  251. X      M1_POIS_RES | M1_STALK, M2_HOSTILE },
  252. X    { "gnome zombie", S_ZOMBIE, 1, 6, 10, 0, -2, (G_GENO | G_NOCORPSE | 1),
  253. X      { { AT_CLAW, AD_PHYS, 1, 5 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  254. X      20, 0, 0, MS_SILENT, M1_HUMANOID | M1_UNDEAD | M1_POIS |
  255. X      M1_POIS_RES | M1_STALK, M2_HOSTILE },
  256. X    { "orc zombie", S_ZOMBIE, 2, 6, 9, 0, -3,
  257. X      (G_GENO | G_SGROUP | G_NOCORPSE | 1),
  258. X      { { AT_CLAW, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  259. X      30, 0, 0, MS_SILENT, M1_HUMANOID | M1_UNDEAD | M1_POIS_RES |
  260. X      M1_STALK | M1_GREEDY | M1_JEWELS, M2_HOSTILE | M2_ORC },
  261. X    { "elf zombie", S_ZOMBIE, 3, 6, 9, 0, -3,
  262. X      (G_GENO | G_SGROUP | G_NOCORPSE | 1),
  263. X      { { AT_CLAW, AD_PHYS, 1, 7 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  264. X      35, 0, 0, MS_SILENT, M1_HUMANOID | M1_UNDEAD | M1_POIS_RES |
  265. X      M1_STALK | M1_SLEE_RES, M2_HOSTILE | M2_ELF },
  266. X    { "human zombie", S_ZOMBIE, 4, 6, 8, 0, -3,
  267. X      (G_GENO | G_SGROUP | G_NOCORPSE | 1),
  268. X      { { AT_CLAW, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  269. X      40, 0, 0, MS_SILENT,
  270. X      M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | M1_STALK, M2_HOSTILE },
  271. X    { "ettin zombie", S_ZOMBIE, 6, 8, 6, 0, -4, (G_GENO | G_NOCORPSE | 1),
  272. X      { { AT_CLAW, AD_PHYS, 1, 10 }, { AT_CLAW, AD_PHYS, 1, 10 },
  273. X        NO_ATTK, NO_ATTK, NO_ATTK }, 70, 0, 0, MS_SILENT,
  274. X      M1_BIG | M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | M1_STALK,
  275. X      M2_HOSTILE | M2_STRONG },
  276. X    { "giant zombie", S_ZOMBIE, 8, 8, 6, 0, -4, (G_GENO | G_NOCORPSE | 1),
  277. X      { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_CLAW, AD_PHYS, 2, 8 },
  278. X        NO_ATTK, NO_ATTK, NO_ATTK }, 70, 0, 0, MS_SILENT,
  279. X      M1_BIG | M1_HUMANOID | M1_UNDEAD | M1_POIS_RES | M1_STALK |
  280. X      M1_JEWELS, M2_HOSTILE | M2_GIANT | M2_STRONG },
  281. X/*    Golems    */
  282. X#ifdef GOLEMS
  283. X    { "straw golem", S_GOLEM, 3, 12, 10, 0, 0, (G_GENO | G_NOCORPSE | 1),
  284. X      { { AT_CLAW, AD_PHYS, 1, 2 }, { AT_CLAW, AD_PHYS, 1, 2 },
  285. X        NO_ATTK, NO_ATTK, NO_ATTK }, 10, 0, 0, MS_SILENT,
  286. X      M1_BIG | M1_HUMANOID | M1_POIS_RES, M2_HOSTILE },
  287. X    { "rope golem", S_GOLEM, 4, 9, 8, 0, 0, (G_GENO | G_NOCORPSE | 1),
  288. X      { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_HUGS, AD_PHYS, 6, 1 },
  289. X        NO_ATTK, NO_ATTK, NO_ATTK }, 20, 0, 0, MS_SILENT,
  290. X      M1_BIG | M1_HUMANOID | M1_POIS_RES, M2_HOSTILE },
  291. X    { "leather golem", S_GOLEM, 6, 6, 6, 0, 0, (G_GENO | G_NOCORPSE | 1),
  292. X      { { AT_CLAW, AD_PHYS, 1, 6 }, { AT_CLAW, AD_PHYS, 1, 6 },
  293. X        NO_ATTK, NO_ATTK, NO_ATTK }, 40, 0, 0, MS_SILENT,
  294. X      M1_BIG | M1_HUMANOID | M1_POIS_RES, M2_HOSTILE },
  295. X    { "wood golem", S_GOLEM, 7, 3, 4, 0, 0, (G_GENO | G_NOCORPSE | 1),
  296. X      { { AT_CLAW, AD_PHYS, 3, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  297. X      50, 0, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_POIS_RES,
  298. X      M2_HOSTILE | M2_THICK_HIDE },
  299. X    { "flesh golem", S_GOLEM, 9, 8, 9, 30, 0, (G_GENO | 1),
  300. X      { { AT_CLAW, AD_PHYS, 2, 8 }, { AT_CLAW, AD_PHYS, 2, 8 },
  301. X        NO_ATTK, NO_ATTK, NO_ATTK },
  302. X      60, 600, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_POIS_RES |
  303. X      M1_FIRE_RES | M1_COLD_RES | M1_ELEC_RES, M2_HOSTILE | M2_STRONG },
  304. X    { "clay golem", S_GOLEM, 11, 7, 7, 40, 0, (G_GENO | G_NOCORPSE | 1),
  305. X      { { AT_CLAW, AD_PHYS, 3, 10 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  306. X      75, 0, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_POIS_RES,
  307. X      M2_HOSTILE | M2_STRONG | M2_THICK_HIDE },
  308. X    { "stone golem", S_GOLEM, 14, 6, 5, 50, 0, (G_GENO | G_NOCORPSE | 1),
  309. X      { { AT_CLAW, AD_PHYS, 3, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  310. X      90, 0, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_POIS_RES | M1_STON_RES,
  311. X      M2_HOSTILE | M2_STRONG | M2_THICK_HIDE },
  312. X    { "iron golem", S_GOLEM, 18, 6, 3, 60, 0, (G_GENO | G_NOCORPSE | 1),
  313. X      { { AT_WEAP, AD_PHYS, 4, 10 }, { AT_BREA, AD_DRST, 4, 6 },
  314. X        NO_ATTK, NO_ATTK, NO_ATTK },
  315. X      100, 0, 0, MS_SILENT, M1_BIG | M1_HUMANOID | M1_POIS |
  316. X      M1_FIRE_RES | M1_COLD_RES | M1_ELEC_RES | M1_COLLECT,
  317. X      M2_HOSTILE | M2_STRONG | M2_THICK_HIDE },
  318. X#endif /* GOLEMS */
  319. X/*    Humans        */
  320. X    { "human", S_HUMAN, 0, 12, 10, 0, 0, G_NOGEN,
  321. X      { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  322. X      35, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT,
  323. X      M2_HUMAN | M2_PEACEFUL | M2_STRONG }, /* for corpses */
  324. X    { "wererat", S_HUMAN, 2, 12, 7, 10, -7, 1,
  325. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  326. X      35, 400, 0, MS_SILENT, M1_NOPOLY | M1_HUMANOID | M1_WERE | M1_POIS |
  327. X      M1_REGEN | M1_COLLECT, M2_HOSTILE | M2_HUMAN },
  328. X    { "werejackal", S_HUMAN, 2, 12, 7, 10, -7, 1,
  329. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  330. X      35, 400, 0, MS_BARK, M1_NOPOLY | M1_HUMANOID | M1_WERE | M1_POIS |
  331. X      M1_REGEN | M1_COLLECT, M2_HOSTILE | M2_HUMAN },
  332. X    { "werewolf", S_HUMAN, 5, 12, 6, 20, -7, 1,
  333. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  334. X      35, 400, 0, MS_BARK, M1_NOPOLY | M1_HUMANOID | M1_WERE | M1_POIS |
  335. X      M1_REGEN | M1_COLLECT, M2_HOSTILE | M2_HUMAN },
  336. X#ifdef TOLKIEN
  337. X    { "Woodland-elf", S_HUMAN, 4, 12, 5, 10, 5, (G_GENO | G_SGROUP | 2),
  338. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  339. X      35, 350, 0, MS_HUMANOID, M1_HUMANOID | M1_COLLECT | M1_SLEE_RES,
  340. X      M2_ELF },
  341. X    { "Green-elf", S_HUMAN, 5, 12, 5, 10, 6, (G_GENO | G_SGROUP | 2),
  342. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  343. X      35, 350, 0, MS_HUMANOID, M1_HUMANOID | M1_COLLECT | M1_SLEE_RES,
  344. X      M2_ELF },
  345. X    { "Grey-elf", S_HUMAN, 6, 12, 5, 10, 7, (G_GENO | G_SGROUP | 2),
  346. X      { { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  347. X      35, 350, 0, MS_HUMANOID, M1_HUMANOID | M1_COLLECT | M1_SLEE_RES,
  348. X      M2_ELF },
  349. X#endif
  350. X    { "elf-lord", S_HUMAN, 8, 12, 5, 20, 9, (G_GENO | G_SGROUP | 2),
  351. X      { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 },
  352. X        NO_ATTK, NO_ATTK, NO_ATTK },
  353. X      35, 350, 0, MS_HUMANOID, M1_HUMANOID | M1_LORD | M1_COLLECT |
  354. X      M1_SLEE_RES, M2_ELF | M2_STRONG },
  355. X    { "Elvenking", S_HUMAN, 9, 12, 5, 25, 10, (G_GENO | 1),
  356. X      { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4},
  357. X        NO_ATTK, NO_ATTK, NO_ATTK },
  358. X      35, 350, 0, MS_HUMANOID, M1_HUMANOID | M1_PRINCE | M1_COLLECT |
  359. X      M1_SLEE_RES, M2_ELF | M2_STRONG },
  360. X    { "nurse", S_HUMAN, 11, 6, 0, 0, 0, (G_GENO | 3),
  361. X      { { AT_CLAW, AD_HEAL, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  362. X      35, 400, 0, MS_NURSE, M1_NOPOLY | M1_HUMANOID | M1_POIS_RES,
  363. X      M2_HUMAN | M2_HOSTILE },
  364. X    { "shopkeeper", S_HUMAN, 12, 18, 0, 50, 0, G_NOGEN,
  365. X      { { AT_WEAP, AD_PHYS, 4, 4 }, { AT_WEAP, AD_PHYS, 4, 4 }, NO_ATTK,
  366. X        NO_ATTK, NO_ATTK }, 40, 400, sizeof(struct eshk), MS_SELL,
  367. X      M1_NOPOLY | M1_HUMANOID | M1_MAGIC | M1_COLLECT,
  368. X      M2_HUMAN | M2_PEACEFUL | M2_STRONG },
  369. X    { "guard", S_HUMAN, 12, 12, -1, 40, 10, G_NOGEN,
  370. X      { { AT_WEAP, AD_PHYS, 4, 10 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  371. X      45, 400, sizeof(struct egd), MS_GUARD,
  372. X      M1_NOPOLY | M1_HUMANOID | M1_COLLECT,
  373. X      M2_HUMAN | M2_MERC | M2_PEACEFUL | M2_STRONG },
  374. X#if defined(ALTARS) && defined(THEOLOGY)
  375. X    { "temple priest", S_HUMAN, 12, 12, 0, 50, 1, G_NOGEN,
  376. X      { { AT_WEAP, AD_PHYS, 4, 10 }, { AT_KICK, AD_PHYS, 1, 4 },
  377. X        { AT_MAGC, AD_CLRC, 0, 0 }, NO_ATTK, NO_ATTK },
  378. X      45, 400, sizeof(struct epri), MS_PRIEST, 
  379. X      M1_NOPOLY | M1_HUMANOID | M1_ELEC_RES | M1_COLLECT, 
  380. X      M2_HUMAN | M2_PEACEFUL },
  381. X    { "temple priestess", S_HUMAN, 12, 12, 0, 50, 1, G_NOGEN,
  382. X      { { AT_WEAP, AD_PHYS, 4, 10 }, { AT_KICK, AD_PHYS, 1, 4 },
  383. X        { AT_MAGC, AD_CLRC, 0, 0 }, NO_ATTK, NO_ATTK },
  384. X      45, 400, sizeof(struct epri), MS_PRIEST,
  385. X      M1_NOPOLY | M1_HUMANOID | M1_ELEC_RES | M1_COLLECT | M1_FEM, 
  386. X      M2_HUMAN | M2_PEACEFUL },
  387. X#endif
  388. X#ifdef ARMY
  389. X    { "unarmored soldier", S_HUMAN, 6, 4, 10, 0, -2, G_NOGEN,
  390. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  391. X      45, 400, 0, MS_SOLDIER,
  392. X      M1_NOPOLY | M1_HUMANOID | M1_STALK | M1_COLLECT,
  393. X      M2_HUMAN | M2_MERC | M2_HOSTILE | M2_STRONG },
  394. X    { "soldier", S_HUMAN, 6, 4, 3, 0, -2, (G_SGROUP | G_GENO | 1),
  395. X      { { AT_WEAP, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  396. X      45, 400, 0, MS_SOLDIER,
  397. X      M1_NOPOLY | M1_HUMANOID | M1_STALK | M1_COLLECT,
  398. X      M2_HUMAN | M2_MERC | M2_HOSTILE | M2_STRONG },
  399. X    { "sergeant", S_HUMAN, 8, 4, 0, 5, -3, (G_SGROUP | G_GENO | 1),
  400. X      { { AT_WEAP, AD_PHYS, 2, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  401. X      45, 400, 0, MS_SOLDIER,
  402. X      M1_NOPOLY | M1_HUMANOID | M1_STALK | M1_COLLECT,
  403. X      M2_HUMAN | M2_MERC | M2_HOSTILE | M2_STRONG },
  404. X    { "lieutenant", S_HUMAN, 10, 4, -2, 15, -4, (G_GENO | 1),
  405. X      { { AT_WEAP, AD_PHYS, 3, 4 }, { AT_WEAP, AD_PHYS, 3, 4 },
  406. X        NO_ATTK, NO_ATTK, NO_ATTK }, 45, 400, 0, MS_SOLDIER,
  407. X      M1_NOPOLY | M1_HUMANOID | M1_STALK | M1_COLLECT,
  408. X      M2_HUMAN | M2_MERC | M2_HOSTILE | M2_STRONG },
  409. X    { "captain", S_HUMAN, 12, 4, -3, 15, -5, (G_GENO | 1),
  410. X      { { AT_WEAP, AD_PHYS, 4, 4 }, { AT_WEAP, AD_PHYS, 4, 4 },
  411. X        NO_ATTK, NO_ATTK, NO_ATTK }, 45, 400, 0, MS_SOLDIER,
  412. X      M1_NOPOLY | M1_HUMANOID | M1_STALK | M1_COLLECT,
  413. X      M2_HUMAN | M2_MERC | M2_HOSTILE | M2_STRONG },
  414. X#endif
  415. X    { "Wizard of Yendor", S_HUMAN, 30, 12, -8, 100, -20, G_NOGEN,
  416. X      { { AT_CLAW, AD_SAMU, 2, 12 }, { AT_MAGC, AD_SPEL, 0, 0 },
  417. X        { AT_BITE, AD_CUSS, 0, 0 }, NO_ATTK, NO_ATTK }, 40, 400, PL_NSIZ,
  418. X      MS_CUSS, M1_NOPOLY | M1_FLY | M1_HUMANOID | M1_POIS_RES |
  419. X      M1_FIRE_RES | M1_REGEN | M1_SEE_INVIS | M1_TPORT |
  420. X      M1_TPORT_CONTROL | M1_MAGIC,
  421. X      M2_HUMAN | M2_PNAME | M2_HOSTILE | M2_STRONG | M2_NASTY },
  422. X#ifdef MEDUSA
  423. X    { "Medusa", S_HUMAN, 20, 12, 2, 50, -15, G_NOGEN | G_UNIQ,
  424. X      { { AT_CLAW, AD_PHYS, 1, 8 }, { AT_GAZE, AD_STON, 0, 0 },
  425. X        { AT_BITE, AD_DRST, 1, 6 }, { AT_WEAP, AD_PHYS, 2, 4 }, NO_ATTK },
  426. X      40, 400, 0, MS_HISS,
  427. X      M1_NOPOLY | M1_BIG | M1_HUMANOID | M1_POIS | M1_POIS_RES |
  428. X      M1_STON_RES | M1_FEM, M2_HOSTILE | M2_STRONG | M2_PNAME },
  429. X#endif
  430. X#ifdef ORACLE
  431. X    { "oracle", S_HUMAN, 12, 0, 0, 50, 0, G_NOGEN | G_UNIQ,
  432. X      { { AT_NONE, AD_MAGM, 0, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  433. X      35, 400, 0, MS_ORACLE, M1_NOPOLY | M1_HUMANOID | M1_FEM,
  434. X      M2_HUMAN | M2_PEACEFUL },
  435. X#endif
  436. X#ifdef CHARON
  437. X    { "Charon", S_HUMAN, 76, 18, -5, 120, 0,
  438. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  439. X      { { AT_WEAP, AD_PHYS, 1, 8 }, { AT_TUCH, AD_PLYS, 1, 8 },
  440. X        NO_ATTK, NO_ATTK, NO_ATTK }, 0, 0, PL_NSIZ, MS_FERRY,
  441. X      M1_NOPOLY | M1_HUMANOID | M1_POIS_RES | M1_FIRE_RES | M1_COLLECT,
  442. X      M2_HUMAN | M2_PEACEFUL },
  443. X#endif
  444. X/*    Ghost        */
  445. X    { "ghost", S_GHOST, 10, 3, -5, 50, -5, (G_NOCORPSE | G_NOGEN),
  446. X      { { AT_TUCH, AD_PHYS, 1, 1 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  447. X      0, 0, PL_NSIZ, MS_SILENT, M1_NOPOLY | M1_FLY | M1_WALLWALK |
  448. X      M1_HUMANOID | M1_UNDEAD | M1_STALK | M1_POIS_RES, M2_HOSTILE },
  449. X/*    (major) Demons    */
  450. X    { "water demon", S_DEMON, 8, 12,-4, 30, -7, (G_NOCORPSE | G_NOGEN),
  451. X      { { AT_WEAP, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
  452. X        { AT_BITE, AD_PHYS, 1, 3 }, NO_ATTK, NO_ATTK },
  453. X      60, 0, 0, MS_SILENT, M1_SWIM | M1_POIS | M1_FIRE_RES |
  454. X      M1_STALK | M1_COLLECT, M2_DEMON | M2_HOSTILE | M2_NASTY },
  455. X#ifndef HARD /* generic type */
  456. X    { "demon", S_DEMON, 10, 12,-4, 30, -7, (G_NOCORPSE | 1),
  457. X      { { AT_WEAP, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
  458. X        { AT_BITE, AD_PHYS, 1, 4 }, NO_ATTK, NO_ATTK },
  459. X      60, 0, 0, MS_JEER, M1_POIS | M1_FIRE_RES | M1_STALK | M1_COLLECT,
  460. X      M2_DEMON | M2_HOSTILE | M2_NASTY },
  461. X#else    /* used in hell for bigger, badder demons! */
  462. X    /* standard demons & devils */
  463. X    { "horned devil", S_DEMON, 6, 9, -5, 50, 11, (G_HELL | G_NOCORPSE | 2),
  464. X      { { AT_WEAP, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
  465. X        { AT_BITE, AD_PHYS, 2, 3 }, { AT_STNG, AD_PHYS, 1, 3 }, NO_ATTK },
  466. X      0, 0, 0, MS_SILENT, M1_POIS | M1_FIRE_RES | M1_STALK,
  467. X      M2_DEMON | M2_HOSTILE | M2_NASTY | M2_THICK_HIDE },
  468. X#ifdef SEDUCE
  469. X    { "succubus", S_DEMON, 6, 12, 0, 70, -9, (G_NOCORPSE | 1),
  470. X      { { AT_BITE, AD_SSEX, 0, 0 }, { AT_CLAW, AD_PHYS, 1, 3 },
  471. X        { AT_CLAW, AD_PHYS, 1, 3 }, NO_ATTK }, 0, 0, 0, MS_SEDUCE,
  472. X      M1_HUMANOID | M1_FLY | M1_POIS | M1_FIRE_RES | M1_STALK | M1_FEM,
  473. X      M2_DEMON | M2_HOSTILE | M2_NASTY },
  474. X    { "incubus", S_DEMON, 6, 12, 0, 70, -9, (G_NOCORPSE | 1),
  475. X      { { AT_BITE, AD_SSEX, 0, 0 }, { AT_CLAW, AD_PHYS, 1, 3 },
  476. X        { AT_CLAW, AD_PHYS, 1, 3 }, NO_ATTK }, 0, 0, 0, MS_SEDUCE,
  477. X      M1_HUMANOID | M1_FLY | M1_POIS | M1_FIRE_RES | M1_STALK,
  478. X      M2_DEMON | M2_HOSTILE | M2_NASTY },
  479. X#else
  480. X    { "succubus", S_DEMON, 6, 12, 0, 70, -9, (G_NOCORPSE | 1),
  481. X      { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
  482. X        { AT_BITE, AD_DRLI, 2, 6 }, NO_ATTK }, 0, 0, 0, MS_SEDUCE,
  483. X      M1_HUMANOID | M1_FLY | M1_POIS | M1_FIRE_RES | M1_STALK | M1_FEM,
  484. X      M2_DEMON | M2_HOSTILE | M2_NASTY },
  485. X    { "incubus", S_DEMON, 6, 12, 0, 70, -9, (G_NOCORPSE | 1),
  486. X      { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
  487. X        { AT_BITE, AD_DRLI, 2, 6 }, NO_ATTK }, 0, 0, 0, MS_SEDUCE,
  488. X      M1_HUMANOID | M1_FLY | M1_POIS | M1_FIRE_RES | M1_STALK,
  489. X      M2_DEMON | M2_HOSTILE | M2_NASTY },
  490. X#endif
  491. X    { "erinyes", S_DEMON, 7, 12, 2, 30, 10,
  492. X      (G_HELL | G_NOCORPSE | G_SGROUP | 2),
  493. X      { { AT_WEAP, AD_DRST, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  494. X      0, 0, 0, MS_SILENT, M1_HUMANOID | M1_POIS | M1_FIRE_RES | M1_STALK |
  495. X      M1_COLLECT | M1_FEM, M2_DEMON | M2_HOSTILE | M2_STRONG | M2_NASTY },
  496. X    { "marilith", S_DEMON, 7, 12, -6, 80, -12, (G_HELL | G_NOCORPSE | 1),
  497. X      { { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 },
  498. X        { AT_WEAP, AD_PHYS, 2, 4 }, { AT_WEAP, AD_PHYS, 2, 4 },
  499. X        { AT_WEAP, AD_PHYS, 2, 4 }, }, 0, 0, 0, MS_SILENT, M1_HUMANOID |
  500. X      M1_POIS | M1_FIRE_RES | M1_STALK | M1_COLLECT | M1_FEM,
  501. X      M2_DEMON | M2_HOSTILE | M2_NASTY },
  502. X    { "barbed devil", S_DEMON, 8, 12, 0, 35, 8,
  503. X      (G_HELL | G_NOCORPSE | G_SGROUP | 2),
  504. X      { { AT_CLAW, AD_PHYS, 2, 4 }, { AT_CLAW, AD_PHYS, 2, 4 },
  505. X        { AT_STNG, AD_PHYS, 3, 4 }, NO_ATTK, NO_ATTK },
  506. X      0, 0, 0, MS_SILENT, M1_POIS | M1_FIRE_RES | M1_STALK,
  507. X      M2_DEMON | M2_HOSTILE | M2_NASTY | M2_THICK_HIDE },
  508. X    { "vrock", S_DEMON, 8, 12, 0, 50, -9,
  509. X      (G_HELL | G_NOCORPSE | G_SGROUP | 2),
  510. X      { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
  511. X        { AT_CLAW, AD_PHYS, 1, 8 }, { AT_CLAW, AD_PHYS, 1, 8 },
  512. X        { AT_BITE, AD_PHYS, 1, 6 }, },
  513. X      0, 0, 0, MS_SILENT, M1_POIS | M1_FIRE_RES | M1_STALK,
  514. X      M2_DEMON | M2_HOSTILE | M2_NASTY },
  515. X    { "hezrou", S_DEMON, 9, 6, -2, 55, -10,
  516. X      (G_HELL | G_NOCORPSE | G_SGROUP | 2),
  517. X      { { AT_CLAW, AD_PHYS, 1, 3 }, { AT_CLAW, AD_PHYS, 1, 3 },
  518. X        { AT_BITE, AD_PHYS, 4, 4 }, NO_ATTK, NO_ATTK }, 0, 0, 0, MS_SILENT,
  519. X      M1_HUMANOID | M1_POIS | M1_FIRE_RES | M1_STALK,
  520. X      M2_DEMON | M2_HOSTILE | M2_NASTY },
  521. X    { "bone devil", S_DEMON, 9, 15, -1, 40, -9,
  522. X      (G_HELL | G_NOCORPSE | G_SGROUP | 2),
  523. X      { { AT_WEAP, AD_PHYS, 3, 4 }, { AT_STNG, AD_DRST, 2, 4 },
  524. X        NO_ATTK, NO_ATTK, NO_ATTK }, 0, 0, 0, MS_SILENT,
  525. X      M1_POIS | M1_FIRE_RES | M1_STALK | M1_COLLECT,
  526. X      M2_DEMON | M2_HOSTILE | M2_NASTY },
  527. X    { "nalfeshnee", S_DEMON, 11, 9, -1, 65, -11, (G_HELL | G_NOCORPSE | 1),
  528. X      { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
  529. X        { AT_BITE, AD_PHYS, 2, 4 }, { AT_MAGC, AD_SPEL, 0, 0 }, NO_ATTK },
  530. X      0, 0, 0, MS_SILENT, M1_HUMANOID | M1_POIS | M1_FIRE_RES | M1_STALK,
  531. X      M2_DEMON | M2_HOSTILE | M2_NASTY },
  532. X    { "ice devil", S_DEMON, 11, 6, -4, 55, -12, (G_HELL | G_NOCORPSE | 2),
  533. X      { { AT_CLAW, AD_PHYS, 1, 4 }, { AT_CLAW, AD_PHYS, 1, 4 },
  534. X        { AT_BITE, AD_PHYS, 2, 4 }, { AT_STNG, AD_COLD, 3, 4 }, NO_ATTK },
  535. X      0, 0, 0, MS_SILENT, M1_POIS | M1_FIRE_RES | M1_COLD_RES | M1_STALK,
  536. X      M2_DEMON | M2_HOSTILE | M2_NASTY },
  537. X    { "pit fiend", S_DEMON, 13, 6, -3, 65, -13, (G_HELL | G_NOCORPSE | 2),
  538. X      { { AT_WEAP, AD_PHYS, 4, 2 }, { AT_WEAP, AD_PHYS, 4, 2 },
  539. X        { AT_HUGS, AD_PHYS, 2, 4 }, NO_ATTK, NO_ATTK }, 0, 0, 0, MS_GROWL,
  540. X      M1_POIS | M1_FIRE_RES | M1_STALK | M1_COLLECT,
  541. X      M2_DEMON | M2_HOSTILE | M2_NASTY },
  542. X    { "balrog", S_DEMON, 16, 5, -2, 75, -14, (G_HELL | G_NOCORPSE | 1),
  543. X      { { AT_WEAP, AD_PHYS, 8, 4 }, { AT_WEAP, AD_PHYS, 4, 6 },
  544. X        NO_ATTK, NO_ATTK, NO_ATTK },
  545. X      0, 0, 0, MS_SILENT, M1_FLY | M1_BIG | M1_COLLECT | M1_STALK |
  546. X      M1_POIS | M1_FIRE_RES, M2_DEMON | M2_HOSTILE | M2_STRONG | M2_NASTY },
  547. X    /* Named demon lords & princes plus Arch-Devils */
  548. X    { "Juiblex", S_DEMON, 50, 3, -7, 65, -15,
  549. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  550. X      { { AT_ENGL, AD_DISE, 4, 10 }, { AT_SPIT, AD_ACID, 3, 6 },
  551. X        NO_ATTK, NO_ATTK, NO_ATTK }, 0, 0, PL_NSIZ, MS_GURGLE, M1_NOPOLY |
  552. X      M1_FLY | M1_NOHANDS | M1_POIS | M1_FIRE_RES | M1_STALK | M1_LORD,
  553. X      M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY | M2_AMORPHOUS },
  554. X    { "Yeenoghu", S_DEMON, 56, 18, -5, 80, -15,
  555. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  556. X      { { AT_WEAP, AD_PHYS, 3, 6 }, { AT_WEAP, AD_CONF, 2, 8 },
  557. X        { AT_WEAP, AD_PLYS, 1, 6 }, { AT_MAGC, AD_MAGM, 2, 6 }, NO_ATTK },
  558. X      0, 0, PL_NSIZ, MS_ORC, M1_NOPOLY | M1_FLY | M1_POIS |
  559. X      M1_FIRE_RES | M1_STALK | M1_COLLECT | M1_LORD,
  560. X      M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY },
  561. X    { "Orcus", S_DEMON, 66, 9, -6, 85, -20,
  562. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  563. X      { { AT_MAGC, AD_SPEL, 8, 6 }, { AT_WEAP, AD_PHYS, 3, 6 },
  564. X        { AT_CLAW, AD_PHYS, 3, 4 }, { AT_CLAW, AD_PHYS, 3, 4 },
  565. X        { AT_STNG, AD_DRST, 2, 4 }, }, 0, 0, PL_NSIZ, MS_ORC,
  566. X      M1_NOPOLY | M1_FLY | M1_POIS | M1_FIRE_RES | M1_STALK |
  567. X      M1_COLLECT | M1_PRINCE, M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY },
  568. X    { "Geryon", S_DEMON, 72, 3, -3, 75, 15,
  569. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  570. X      { { AT_CLAW, AD_PHYS, 3, 6 }, { AT_CLAW, AD_PHYS, 3, 6 },
  571. X        { AT_STNG, AD_DRST, 2, 4 }, NO_ATTK, NO_ATTK }, 0, 0, PL_NSIZ,
  572. X      MS_JEER, M1_NOPOLY | M1_FLY | M1_POIS | M1_FIRE_RES |
  573. X      M1_STALK | M1_PRINCE, M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY },
  574. X    { "Dispater", S_DEMON, 78, 15, -2, 80, 15,
  575. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  576. X      { { AT_WEAP, AD_PHYS, 4, 6 }, { AT_MAGC, AD_SPEL, 6, 6 },
  577. X        NO_ATTK, NO_ATTK, NO_ATTK }, 0, 0, PL_NSIZ, MS_JEER,
  578. X      M1_NOPOLY | M1_FLY | M1_HUMANOID | M1_POIS |
  579. X      M1_FIRE_RES | M1_STALK | M1_COLLECT | M1_PRINCE,
  580. X      M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY },
  581. X    { "Baalzebul", S_DEMON, 89, 9, -5, 85, 20,
  582. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  583. X      { { AT_BITE, AD_DRST, 2, 6 }, { AT_GAZE, AD_STUN, 2, 6 },
  584. X        NO_ATTK, NO_ATTK, NO_ATTK }, 0, 0, PL_NSIZ, MS_JEER,
  585. X      M1_NOPOLY | M1_FLY | M1_POIS | M1_FIRE_RES | M1_STALK |
  586. X      M1_PRINCE, M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY },
  587. X    { "Asmodeus", S_DEMON, 105, 12, -7, 90, 20,
  588. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  589. X      { { AT_CLAW, AD_PHYS, 4, 4 }, { AT_MAGC, AD_COLD, 6, 6 },
  590. X        NO_ATTK, NO_ATTK, NO_ATTK }, 0, 0, PL_NSIZ, MS_JEER,
  591. X      M1_NOPOLY | M1_FLY | M1_HUMANOID | M1_POIS |
  592. X      M1_FIRE_RES | M1_COLD_RES | M1_STALK | M1_PRINCE,
  593. X      M2_DEMON | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY },
  594. X    { "Demogorgon", S_DEMON, 106, 15, -8, 95, -20,
  595. X      (G_HELL | G_NOCORPSE | G_NOGEN | G_UNIQ),
  596. X      { { AT_MAGC, AD_SPEL, 8, 6 }, { AT_STNG, AD_DRLI, 1, 4 },
  597. X        { AT_CLAW, AD_DISE, 1, 6 }, { AT_CLAW, AD_DISE, 1, 6 },
  598. X        NO_ATTK }, 0, 0, PL_NSIZ, MS_GROWL, M1_NOPOLY | M1_FLY |
  599. X      M1_NOHANDS | M1_POIS | M1_FIRE_RES | M1_STALK |
  600. X      M1_PRINCE, M2_DEMON | M2_HOSTILE | M2_PNAME | M2_NASTY },
  601. X#endif
  602. X#ifdef MAIL
  603. X    { "mail daemon", S_DEMON, 56, 24, 10, 127, 0, (G_NOGEN | G_NOCORPSE),
  604. X      { NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, 0, 0, 0, MS_SILENT,
  605. X      M1_NOPOLY | M1_FLY | M1_SWIM | M1_HUMANOID | M1_POIS | M1_FIRE_RES |
  606. X      M1_COLD_RES | M1_SLEE_RES | M1_STALK, M2_PEACEFUL },
  607. X/* Neither rain nor sleet nor gloom of night shall stay this courier... */
  608. X#endif
  609. X    { "djinni", S_DEMON, 7, 12, 4, 30, 0, (G_NOGEN | G_NOCORPSE),
  610. X      { { AT_WEAP, AD_PHYS, 2, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  611. X      0, 0, 0, MS_DJINNI,
  612. X      M1_NOPOLY | M1_FLY | M1_POIS | M1_STALK | M1_COLLECT, 0 },
  613. X/*    eels        */
  614. X    { "giant eel", S_EEL, 5, 9, -1, 0, 0, (G_GENO | G_NOGEN),
  615. X      { { AT_BITE, AD_PHYS, 3, 6 }, { AT_TUCH, AD_WRAP, 0, 0 },
  616. X        NO_ATTK, NO_ATTK, NO_ATTK }, 10, 250, 0, MS_SILENT,
  617. X      M1_BIG | M1_VSMALL | M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_NOPOLY |
  618. X      M1_EGGS, M2_HOSTILE | M2_NOLIMBS | M2_CARNIVORE },
  619. X    { "electric eel", S_EEL, 7, 10, -3, 0, 0, (G_GENO | G_NOGEN),
  620. X      { { AT_BITE, AD_ELEC, 4, 6 }, { AT_TUCH, AD_WRAP, 0, 0 },
  621. X      NO_ATTK, NO_ATTK, NO_ATTK }, 10, 250, 0, MS_SILENT,
  622. X      M1_BIG | M1_VSMALL | M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_NOPOLY |
  623. X      M1_EGGS | M1_ELEC_RES, M2_HOSTILE | M2_NOLIMBS | M2_CARNIVORE },
  624. X/*    kraken    */
  625. X    { "kraken", S_EEL, 20, 3, 6, 0, -3, (G_GENO | G_NOGEN),
  626. X      { { AT_CLAW, AD_PHYS, 2, 4 }, { AT_CLAW, AD_PHYS, 2, 4 },
  627. X        { AT_HUGS, AD_WRAP, 2, 6 }, { AT_BITE, AD_PHYS, 5, 4 }, NO_ATTK },
  628. X      1, 10, 0, MS_SILENT,
  629. X      M1_BIG | M1_SWIM | M1_ANIMAL | M1_NOHANDS | M1_NOPOLY,
  630. X      M2_HOSTILE | M2_STRONG | M2_CARNIVORE },
  631. X/*    chameleon    */
  632. X    { "chameleon", S_CHAMELEON, 6, 5, 6, 10, 0, (G_GENO | 2),
  633. X      { { AT_BITE, AD_PHYS, 4, 2 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  634. X      1, 10, 0, MS_SILENT, M1_VSMALL | M1_ANIMAL,
  635. X      M2_HOSTILE | M2_CARNIVORE },
  636. X
  637. X/*    character classes */
  638. X    { "archeologist", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN,
  639. X      { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  640. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT,
  641. X      M2_HUMAN | M2_STRONG | M2_TUNNEL | M2_NEEDPICK },
  642. X    { "barbarian", S_HUMAN, 1, 10, 10, 1, -3, G_NOGEN,
  643. X      { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  644. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT |
  645. X      M1_POIS_RES, M2_HUMAN | M2_STRONG },
  646. X    { "caveman", S_HUMAN, 1, 10, 10, 0, 1, G_NOGEN,
  647. X      { {AT_WEAP, AD_PHYS, 2, 4}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  648. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT,
  649. X      M2_HUMAN | M2_STRONG | M2_CARNIVORE },
  650. X    { "cavewoman", S_HUMAN, 1, 10, 10, 0, 1, G_NOGEN,
  651. X      { {AT_WEAP, AD_PHYS, 2, 4}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  652. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT | M1_FEM,
  653. X      M2_HUMAN | M2_STRONG | M2_CARNIVORE },
  654. X    { "elf", S_HUMAN, 1, 12, 10, 2, 3, G_NOGEN,
  655. X      { {AT_WEAP, AD_PHYS, 1, 8}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  656. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT |
  657. X      M1_SLEE_RES | M1_SEE_INVIS, M2_ELF | M2_STRONG },
  658. X    { "healer", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN,
  659. X      { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  660. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT |
  661. X      M1_POIS_RES, M2_HUMAN | M2_STRONG },
  662. X    { "knight", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN,
  663. X      { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  664. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT,
  665. X      M2_HUMAN | M2_STRONG },
  666. X    { "priest", S_HUMAN, 1, 10, 10, 2, 0, G_NOGEN,
  667. X      { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  668. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT,
  669. X      M2_HUMAN | M2_STRONG },
  670. X    { "priestess", S_HUMAN, 1, 10, 10, 2, 0, G_NOGEN,
  671. X      { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  672. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT | M1_FEM,
  673. X      M2_HUMAN | M2_STRONG },
  674. X    { "rogue", S_HUMAN, 1, 10, 10, 1, -3, G_NOGEN,
  675. X      { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  676. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT |
  677. X      M1_GREEDY, M2_HUMAN | M2_STRONG },
  678. X    { "samurai", S_HUMAN, 1, 10, 10, 1, 3, G_NOGEN,
  679. X      { {AT_WEAP, AD_PHYS, 1, 8}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  680. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT,
  681. X      M2_HUMAN | M2_STRONG },
  682. X    { "tourist", S_HUMAN, 1, 10, 10, 1, 0, G_NOGEN,
  683. X      { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  684. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT,
  685. X      M2_HUMAN | M2_STRONG },
  686. X    { "valkyrie", S_HUMAN, 1, 10, 10, 1, -1, G_NOGEN,
  687. X      { {AT_WEAP, AD_PHYS, 1, 8}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  688. X      45, 400, 0, MS_HUMANOID, M1_NOPOLY | M1_HUMANOID | M1_COLLECT | 
  689. X      M1_COLD_RES | M1_FEM, M2_HUMAN | M2_STRONG },
  690. X    { "wizard", S_HUMAN, 1, 10, 10, 3, 0, G_NOGEN,
  691. X      { {AT_WEAP, AD_PHYS, 1, 6}, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  692. X      45, 400, 0, MS_HUMANOID,
  693. X      M1_NOPOLY | M1_HUMANOID | M1_MAGIC | M1_COLLECT,
  694. X      M2_HUMAN | M2_STRONG },
  695. X
  696. X/*    ARRAY TERMINATOR    */
  697. X    { "", 0, 0, 0, 0, 0, 0, 0,
  698. X      { NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  699. X      0, 0, 0, 0, 0, 0 }
  700. X};
  701. END_OF_FILE
  702. if test 35010 -ne `wc -c <'src/monst.c2'`; then
  703.     echo shar: \"'src/monst.c2'\" unpacked with wrong size!
  704. fi
  705. # end of 'src/monst.c2'
  706. fi
  707. if test -f 'src/save.c' -a "${1}" != "-c" ; then 
  708.   echo shar: Will not clobber existing file \"'src/save.c'\"
  709. else
  710. echo shar: Extracting \"'src/save.c'\" \(17421 characters\)
  711. sed "s/^X//" >'src/save.c' <<'END_OF_FILE'
  712. X/*    SCCS Id: @(#)save.c    3.0    89/04/13
  713. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  714. X/* NetHack may be freely redistributed.  See license for details. */
  715. X
  716. X/* block some unused #defines to avoid overloading some cpp's */
  717. X#define MONATTK_H
  718. X#include "hack.h"
  719. X#include "lev.h"
  720. X
  721. X#ifdef WORM
  722. X#include "wseg.h"
  723. X#endif
  724. X
  725. X#ifndef TOS
  726. X#include <signal.h>
  727. X#endif /* !TOS */
  728. X#ifdef EXPLORE_MODE
  729. X#include <fcntl.h>
  730. X#endif /* EXPLORE_MODE */
  731. X
  732. Xboolean hu;        /* set during hang-up */
  733. X
  734. X#if defined(DGK) && !defined(TOS)
  735. Xstruct finfo fileinfo[MAXLEVEL+1];
  736. Xlong bytes_counted;
  737. Xint count_only;
  738. X#else
  739. Xboolean level_exists[MAXLEVEL+1];
  740. X#endif
  741. X
  742. X#if defined(DGK) && !defined(TOS)
  743. Xstatic void savelev0();
  744. X#endif /* DGK && !TOS */
  745. Xstatic void saveobjchn();
  746. Xstatic void savemonchn();
  747. Xstatic void savegoldchn();
  748. Xstatic void savetrapchn();
  749. Xstatic void savegenoinfo();
  750. X#if defined(DGK) && !defined(TOS)
  751. Xstatic boolean swapout_oldest();
  752. Xstatic void copyfile();
  753. X#endif /* defined(DGK) && !defined(TOS) */
  754. Xstatic void spill_objs();
  755. X
  756. Xint
  757. Xdosave(){
  758. X    pline("Really save? ");    /* especially useful if COMPRESS defined */
  759. X    if(yn() == 'n') {
  760. X        clrlin();
  761. X        (void) fflush(stdout);
  762. X        if(multi > 0) nomul(0);
  763. X    } else {
  764. X#ifdef EXPLORE_MODE
  765. X        if(!discover) {
  766. X    pline("Do you want to create a non-scoring, restartable save file? ");
  767. X            if(yn() == 'y')  discover = TRUE;
  768. X        }
  769. X#endif
  770. X        clear_screen();
  771. X        (void) fflush(stdout);
  772. X        hu = FALSE;
  773. X        if(dosave0()) {
  774. X            settty("Be seeing you...\n");
  775. X            exit(0);
  776. X        } else (void)doredraw();
  777. X    }
  778. X    return 0;
  779. X}
  780. X
  781. X#ifndef NOSAVEONHANGUP
  782. Xint
  783. Xhangup(){
  784. X    hu = TRUE;
  785. X    (void) dosave0();
  786. X    exit(1);
  787. X    return 0;
  788. X}
  789. X#endif
  790. X
  791. X/* returns 1 if save successful */
  792. Xint
  793. Xdosave0() {
  794. X    register int fd, ofd;
  795. X    int tmp;        /* not register ! */
  796. X    xchar ltmp;
  797. X#if defined(DGK) && !defined(TOS)
  798. X    long fds, needed;
  799. X    int mode;
  800. X#endif
  801. X#ifdef COMPRESS
  802. X    char    cmd[80];
  803. X#endif
  804. X#ifdef UNIX
  805. X    (void) signal(SIGHUP, SIG_IGN);
  806. X#endif
  807. X#if !defined(__TURBOC__) && !defined(TOS)
  808. X    (void) signal(SIGINT, SIG_IGN);
  809. X#endif
  810. X
  811. X#ifdef MSDOS
  812. X# ifdef DGK
  813. X    if(!hu && !saveDiskPrompt(0))    return 0;
  814. X# endif
  815. X# ifdef EXPLORE_MODE
  816. X    if(!hu) {
  817. X
  818. X        fd = open(SAVEF, O_RDONLY);
  819. X        if (fd > 0) {
  820. X        (void) close(fd);
  821. X        clrlin();
  822. X        pline("There seems to be an old save file.  Overwrite it? ");
  823. X        if (yn() == 'n') return 0;
  824. X        }
  825. X    }
  826. X# endif
  827. X# ifdef TOS
  828. X    fd = creat(SAVEF, FCMASK);
  829. X# else
  830. X    fd = open(SAVEF, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FCMASK);
  831. X# endif
  832. X#else /* MSDOS */
  833. X# ifdef EXPLORE_MODE
  834. X    if(!hu) {
  835. X        fd = open(SAVEF, O_RDONLY);
  836. X        if (fd > 0) {
  837. X        (void) close(fd);
  838. X        clrlin();
  839. X        pline("There seems to be an old save file.  Overwrite it? ");
  840. X        if (yn() == 'n') return 0;
  841. X        }
  842. X    }
  843. X# endif
  844. X    fd = creat(SAVEF, FCMASK);
  845. X#endif /* MSDOS */
  846. X    if(fd < 0) {
  847. X        if(!hu) pline("Cannot open save file.");
  848. X        (void) unlink(SAVEF);        /* ab@unido */
  849. X        return(0);
  850. X    }
  851. X    if(flags.moonphase == FULL_MOON)    /* ut-sally!fletcher */
  852. X        change_luck(-1);        /* and unido!ab */
  853. X    home();
  854. X    cl_end();
  855. X#if defined(DGK) && !defined(TOS)
  856. X    if(!hu) msmsg("Saving: ");
  857. X    mode = COUNT;
  858. Xagain:
  859. X    savelev(fd, dlevel, mode);
  860. X    /* count_only will be set properly by savelev */
  861. X#else
  862. X    savelev(fd,dlevel);
  863. X#endif
  864. X    saveobjchn(fd, invent);
  865. X    savemonchn(fd, fallen_down);
  866. X    savegenoinfo(fd);
  867. X    tmp = getuid();
  868. X    bwrite(fd, (genericptr_t) &tmp, sizeof tmp);
  869. X    bwrite(fd, (genericptr_t) &flags, sizeof(struct flag));
  870. X    bwrite(fd, (genericptr_t) &dlevel, sizeof dlevel);
  871. X    bwrite(fd, (genericptr_t) &maxdlevel, sizeof maxdlevel);
  872. X    bwrite(fd, (genericptr_t) &moves, sizeof moves);
  873. X    bwrite(fd, (genericptr_t) &wiz_level, sizeof wiz_level);
  874. X    bwrite(fd, (genericptr_t) &medusa_level, sizeof medusa_level);
  875. X#ifdef ORACLE
  876. X    bwrite(fd, (genericptr_t) &oracle_level, sizeof oracle_level);
  877. X#endif
  878. X#ifdef REINCARNATION
  879. X    bwrite(fd, (genericptr_t) &rogue_level, sizeof rogue_level);
  880. X#endif
  881. X#ifdef STRONGHOLD
  882. X    bwrite(fd, (genericptr_t) &stronghold_level, sizeof stronghold_level);
  883. X    bwrite(fd, (genericptr_t) &tower_level, sizeof tower_level);
  884. X    bwrite(fd, (genericptr_t) tune, sizeof tune);
  885. X#  ifdef MUSIC
  886. X    bwrite(fd, (genericptr_t) &music_heard, sizeof music_heard);
  887. X#  endif
  888. X#endif
  889. X    bwrite(fd, (genericptr_t) &is_maze_lev, sizeof is_maze_lev);
  890. X    bwrite(fd, (genericptr_t) &u, sizeof(struct you));
  891. X#ifdef SPELLS
  892. X    bwrite(fd, (genericptr_t) spl_book, sizeof(struct spell) * (MAXSPELL + 1));
  893. X#endif
  894. X    if(u.ustuck)
  895. X        bwrite(fd, (genericptr_t) &(u.ustuck->m_id), sizeof u.ustuck->m_id);
  896. X    bwrite(fd, (genericptr_t) pl_character, sizeof pl_character);
  897. X    bwrite(fd, (genericptr_t) pl_fruit, sizeof pl_fruit);
  898. X    bwrite(fd, (genericptr_t) ¤t_fruit, sizeof current_fruit);
  899. X    savefruitchn(fd);
  900. X    savenames(fd);
  901. X#if defined(DGK) && !defined(TOS)
  902. X    if (mode == COUNT) {
  903. X# ifdef ZEROCOMP
  904. X        bflush(fd);
  905. X# endif
  906. X        /* make sure there is enough disk space */
  907. X        needed = bytes_counted;
  908. X        for (ltmp = 1; ltmp <= maxdlevel; ltmp++)
  909. X            if (ltmp != dlevel && fileinfo[ltmp].where)
  910. X                needed += fileinfo[ltmp].size + (sizeof ltmp);
  911. X        fds = freediskspace(SAVEF);
  912. X        if(needed > fds) {
  913. X            if(!hu) {
  914. X            pline("There is insufficient space on SAVE disk.");
  915. X            pline("Require %ld bytes but only have %ld.", needed,
  916. X                fds);
  917. X            }
  918. X            flushout();
  919. X            (void) close(fd);
  920. X            (void) unlink(SAVEF);
  921. X            return 0;
  922. X        }
  923. X        mode = WRITE;
  924. X        goto again;
  925. X    }
  926. X#endif
  927. X    for(ltmp = (xchar)1; ltmp <= maxdlevel; ltmp++) {
  928. X#if defined(DGK) && !defined(TOS)
  929. X        if (ltmp == dlevel || !fileinfo[ltmp].where) continue;
  930. X        if (fileinfo[ltmp].where != ACTIVE)
  931. X            swapin_file(ltmp);
  932. X#else
  933. X        if(ltmp == dlevel || !level_exists[ltmp]) continue;
  934. X#endif
  935. X        glo(ltmp);
  936. X#ifdef DGK
  937. X        if(!hu) msmsg(".");
  938. X#endif
  939. X        if((ofd = open(lock, OMASK)) < 0) {
  940. X            if(!hu) pline("Error while saving: cannot read %s.", lock);
  941. X            (void) close(fd);
  942. X            (void) unlink(SAVEF);
  943. X            if(!hu) done("tricked");
  944. X            return(0);
  945. X        }
  946. X#ifdef ZEROCOMP
  947. X        minit();
  948. X#endif
  949. X        getlev(ofd, hackpid, ltmp, FALSE);
  950. X        (void) close(ofd);
  951. X        bwrite(fd, (genericptr_t) <mp, sizeof ltmp);  /* level number */
  952. X#if defined(DGK) && !defined(TOS)
  953. X        savelev(fd, ltmp, WRITE);            /* actual level */
  954. X#else
  955. X        savelev(fd, ltmp);            /* actual level */
  956. X#endif
  957. X        (void) unlink(lock);
  958. X    }
  959. X#ifdef ZEROCOMP
  960. X    bflush(fd);
  961. X#endif
  962. X    (void) close(fd);
  963. X    glo(dlevel);
  964. X    (void) unlink(lock);    /* get rid of current level --jgm */
  965. X    glo(0);
  966. X    (void) unlink(lock);
  967. X#ifdef COMPRESS
  968. X    Strcpy(cmd, COMPRESS);
  969. X    Strcat(cmd, " ");
  970. X# ifdef COMPRESS_OPTIONS
  971. X    Strcat(cmd, COMPRESS_OPTIONS);
  972. X    Strcat(cmd, " ");
  973. X# endif
  974. X    Strcat(cmd, SAVEF);
  975. X    (void) system(cmd);
  976. X#endif
  977. X    return(1);
  978. X}
  979. X
  980. X#if defined(DGK) && !defined(TOS)
  981. Xboolean
  982. Xsavelev(fd, lev, mode)
  983. Xint fd;
  984. Xxchar lev;
  985. Xint mode;
  986. X{
  987. X    if (mode & COUNT) {
  988. X# ifdef ZEROCOMP /* should be superfluous */
  989. X        if (!count_only)    /* did we just write? */
  990. X            bflush(0);
  991. X        /*dbg();*/
  992. X# endif
  993. X        count_only = TRUE;
  994. X        bytes_counted = 0;
  995. X        savelev0(fd, lev);
  996. X        while (bytes_counted > freediskspace(levels))
  997. X            if (!swapout_oldest())
  998. X                return FALSE;
  999. X    }
  1000. X    if (mode & WRITE) {
  1001. X# ifdef ZEROCOMP
  1002. X        if (mode & COUNT)    /* did we just count? */
  1003. X            bflush(fd);
  1004. X# endif
  1005. X        count_only = FALSE;
  1006. X        bytes_counted = 0;
  1007. X        savelev0(fd, lev);
  1008. X    }
  1009. X    fileinfo[lev].where = ACTIVE;
  1010. X    fileinfo[lev].time = moves;
  1011. X    fileinfo[lev].size = bytes_counted;
  1012. X    return TRUE;
  1013. X}
  1014. X
  1015. Xstatic
  1016. Xvoid
  1017. Xsavelev0(fd,lev)
  1018. X#else
  1019. Xvoid
  1020. Xsavelev(fd,lev)
  1021. X#endif
  1022. Xint fd;
  1023. Xxchar lev;
  1024. X{
  1025. X#ifdef WORM
  1026. X    register struct wseg *wtmp;
  1027. X    register int tmp;
  1028. X#endif
  1029. X#ifdef TOS
  1030. X    short tlev;
  1031. X#endif
  1032. X
  1033. X    if(fd < 0) panic("Save on bad file!");    /* impossible */
  1034. X#if !defined(DGK) || defined(TOS)
  1035. X    if(lev >= 0 && lev <= MAXLEVEL)
  1036. X        level_exists[lev] = TRUE;
  1037. X#endif
  1038. X    bwrite(fd,(genericptr_t) &hackpid,sizeof(hackpid));
  1039. X#ifdef TOS
  1040. X    tlev=lev;
  1041. X    bwrite(fd,(genericptr_t) &tlev,sizeof(tlev));
  1042. X#else
  1043. X    bwrite(fd,(genericptr_t) &lev,sizeof(lev));
  1044. X#endif
  1045. X    bwrite(fd,(genericptr_t) levl,sizeof(levl));
  1046. X#ifdef REINCARNATION
  1047. X    if(dlevel == rogue_level && lev != rogue_level)
  1048. X        /* save the symbols actually used to represent the level, not
  1049. X         * those in use for the current level (the default symbols used
  1050. X         * for rogue), since we will need to know whether to update
  1051. X         * the display of the screen when the game is restored under
  1052. X         * a potentially different value of showsyms from the
  1053. X         * environment */
  1054. X        /* if a game is saved off the rogue level, the usual showsyms
  1055. X         * will be written out for the rogue level too, but they will
  1056. X         * be ignored on restore so it doesn't matter */
  1057. X        bwrite(fd, (genericptr_t) &savesyms, sizeof(struct symbols));
  1058. X    else
  1059. X#endif
  1060. X        bwrite(fd, (genericptr_t) &showsyms, sizeof(struct symbols));
  1061. X    bwrite(fd,(genericptr_t) &moves,sizeof(long));
  1062. X    bwrite(fd,(genericptr_t) &xupstair,sizeof(xupstair));
  1063. X    bwrite(fd,(genericptr_t) &yupstair,sizeof(yupstair));
  1064. X    bwrite(fd,(genericptr_t) &xdnstair,sizeof(xdnstair));
  1065. X    bwrite(fd,(genericptr_t) &ydnstair,sizeof(ydnstair));
  1066. X#ifdef STRONGHOLD
  1067. X    bwrite(fd,(genericptr_t) &xupladder,sizeof(xupladder));
  1068. X    bwrite(fd,(genericptr_t) &yupladder,sizeof(yupladder));
  1069. X    bwrite(fd,(genericptr_t) &xdnladder,sizeof(xdnladder));
  1070. X    bwrite(fd,(genericptr_t) &ydnladder,sizeof(ydnladder));
  1071. X#endif
  1072. X    bwrite(fd,(genericptr_t) &fountsound,sizeof(fountsound));
  1073. X    bwrite(fd,(genericptr_t) &sinksound,sizeof(sinksound));
  1074. X    savemonchn(fd, fmon);
  1075. X    savegoldchn(fd, fgold);
  1076. X    savetrapchn(fd, ftrap);
  1077. X
  1078. X    saveobjchn(fd, fobj);
  1079. X    saveobjchn(fd, billobjs);
  1080. X
  1081. X    save_engravings(fd);
  1082. X    bwrite(fd,(genericptr_t) rooms,sizeof(rooms));
  1083. X    bwrite(fd,(genericptr_t) doors,sizeof(doors));
  1084. X#ifdef WORM
  1085. X    bwrite(fd,(genericptr_t) wsegs,sizeof(wsegs));
  1086. X    for(tmp=1; tmp<32; tmp++){
  1087. X        for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp->nseg){
  1088. X            bwrite(fd,(genericptr_t) wtmp,sizeof(struct wseg));
  1089. X        }
  1090. X#if defined(DGK) && !defined(TOS)
  1091. X        if (!count_only)
  1092. X#endif
  1093. X            wsegs[tmp] = 0;
  1094. X    }
  1095. X    bwrite(fd,(genericptr_t) wgrowtime,sizeof(wgrowtime));
  1096. X#endif /* WORM /**/
  1097. X#if defined(DGK) && !defined(TOS)
  1098. X    if (count_only)    return;
  1099. X#endif
  1100. X    billobjs = 0;
  1101. X    fgold = 0;
  1102. X    ftrap = 0;
  1103. X    fmon = 0;
  1104. X    fobj = 0;
  1105. X}
  1106. X
  1107. X#ifdef ZEROCOMP
  1108. X
  1109. X#define RLESC '\0'    /* Leading character for run of LRESC's */
  1110. X#define flushoutrun(ln) bputc(RLESC); bputc(ln); ln = -1;
  1111. X
  1112. Xstatic unsigned char outbuf[BUFSZ];
  1113. Xstatic unsigned short outbufp = 0;
  1114. Xstatic short outrunlength = -1;
  1115. Xstatic int bwritefd;
  1116. X
  1117. X/*dbg()
  1118. X{
  1119. X   if(!hu) printf("outbufp %d outrunlength %d\n", outbufp,outrunlength);
  1120. X}*/
  1121. X
  1122. Xstatic void bputc(c)
  1123. Xunsigned char c;
  1124. X{
  1125. X# ifdef DGK
  1126. X    bytes_counted++;
  1127. X    if (count_only)
  1128. X      return;
  1129. X# endif
  1130. X    if (outbufp >= BUFSZ) {
  1131. X      (void) write(bwritefd, outbuf, (int) BUFSZ);
  1132. X      outbufp = 0;
  1133. X    }
  1134. X    outbuf[outbufp++] = c;
  1135. X}
  1136. X
  1137. Xvoid
  1138. Xbflush(fd)  /* flush run and buffer */
  1139. Xregister int fd;
  1140. X{
  1141. X      bwritefd = fd;
  1142. X      if (outrunlength >= 0) {    /* flush run */
  1143. X      flushoutrun(outrunlength);
  1144. X      }
  1145. X      if (outbufp) {
  1146. X#ifdef    DGK
  1147. X      if (!count_only)    /* flush buffer */
  1148. X#endif
  1149. X          (void) write(fd, outbuf, outbufp);
  1150. X      outbufp = 0;
  1151. X      }
  1152. X      /*printf("bflush()"); getret();*/
  1153. X}
  1154. X
  1155. Xvoid
  1156. Xbwrite(fd, loc, num)
  1157. Xregister int fd;
  1158. Xregister genericptr_t loc;
  1159. Xregister unsigned num;
  1160. X{
  1161. X      bwritefd = fd;
  1162. X      for (; num; num--, ((char *)loc)++) {
  1163. X          if (*((char *)loc) == RLESC) { /* One more char in run */
  1164. X          if (++outrunlength == 0xFF) {
  1165. X              flushoutrun(outrunlength);
  1166. X          }
  1167. X          } else { /* end of run */
  1168. X          if (outrunlength >= 0) {    /* flush run */
  1169. X              flushoutrun(outrunlength);
  1170. X          }
  1171. X          bputc(*((char *)loc));
  1172. X          }
  1173. X      }
  1174. X}
  1175. X
  1176. X#else /* ZEROCOMP */
  1177. X
  1178. Xvoid
  1179. Xbwrite(fd,loc,num)
  1180. Xregister int fd;
  1181. Xregister genericptr_t loc;
  1182. Xregister unsigned num;
  1183. X{
  1184. X#if defined(DGK) && !defined(TOS)
  1185. X    bytes_counted += num;
  1186. X    if (!count_only)
  1187. X#endif
  1188. X/* lint wants the 3rd arg of write to be an int; lint -p an unsigned */
  1189. X#if defined(BSD) || defined(ULTRIX)
  1190. X        if(write(fd, loc, (int)num) != (int)num) {
  1191. X#else /* e.g. SYSV, __TURBOC__ */
  1192. X        if(write(fd, loc, num) != num) {
  1193. X#endif
  1194. X        if(!hu) panic("cannot write %u bytes to file #%d", num, fd);
  1195. X        else    exit(1);
  1196. X        }
  1197. X}
  1198. X#endif /* ZEROCOMP */
  1199. X
  1200. Xstatic void
  1201. Xsaveobjchn(fd,otmp)
  1202. Xregister int fd;
  1203. Xregister struct obj *otmp;
  1204. X{
  1205. X    register struct obj *otmp2;
  1206. X    unsigned int xl;
  1207. X    int minusone = -1;
  1208. X
  1209. X    while(otmp) {
  1210. X        if(Is_container(otmp))    /* unlink contained objects */
  1211. X        spill_objs(otmp);    /* (this rearranges the list) */
  1212. X
  1213. X        otmp2 = otmp->nobj;
  1214. X        xl = otmp->onamelth;
  1215. X        bwrite(fd, (genericptr_t) &xl, sizeof(int));
  1216. X        bwrite(fd, (genericptr_t) otmp, xl + sizeof(struct obj));
  1217. X#if defined(DGK) && !defined(TOS)
  1218. X        if (!count_only)
  1219. X#endif
  1220. X        free((genericptr_t) otmp);
  1221. X        otmp = otmp2;
  1222. X    }
  1223. X    bwrite(fd, (genericptr_t) &minusone, sizeof(int));
  1224. X}
  1225. X
  1226. Xstatic void
  1227. Xsavemonchn(fd,mtmp)
  1228. Xregister int fd;
  1229. Xregister struct monst *mtmp;
  1230. X{
  1231. X    register struct monst *mtmp2;
  1232. X    unsigned int xl;
  1233. X    int minusone = -1;
  1234. X    struct permonst *monbegin = &mons[0];
  1235. X
  1236. X    bwrite(fd, (genericptr_t) &monbegin, sizeof(monbegin));
  1237. X
  1238. X    while(mtmp) {
  1239. X        mtmp2 = mtmp->nmon;
  1240. X        xl = mtmp->mxlth + mtmp->mnamelth;
  1241. X        bwrite(fd, (genericptr_t) &xl, sizeof(int));
  1242. X        bwrite(fd, (genericptr_t) mtmp, xl + sizeof(struct monst));
  1243. X        if(mtmp->minvent) saveobjchn(fd,mtmp->minvent);
  1244. X#if defined(DGK) && !defined(TOS)
  1245. X        if (!count_only)
  1246. X#endif
  1247. X        free((genericptr_t) mtmp);
  1248. X        mtmp = mtmp2;
  1249. X    }
  1250. X    bwrite(fd, (genericptr_t) &minusone, sizeof(int));
  1251. X}
  1252. X
  1253. Xstatic void
  1254. Xsavegoldchn(fd,gold)
  1255. Xregister int fd;
  1256. Xregister struct gold *gold;
  1257. X{
  1258. X    register struct gold *gold2;
  1259. X    while(gold) {
  1260. X        gold2 = gold->ngold;
  1261. X        bwrite(fd, (genericptr_t) gold, sizeof(struct gold));
  1262. X#if defined(DGK) && !defined(TOS)
  1263. X        if (!count_only)
  1264. X#endif
  1265. X            free((genericptr_t) gold);
  1266. X        gold = gold2;
  1267. X    }
  1268. X    bwrite(fd, (genericptr_t)nul, sizeof(struct gold));
  1269. X}
  1270. X
  1271. Xstatic void
  1272. Xsavetrapchn(fd,trap)
  1273. Xregister int fd;
  1274. Xregister struct trap *trap;
  1275. X{
  1276. X    register struct trap *trap2;
  1277. X    while(trap) {
  1278. X        trap2 = trap->ntrap;
  1279. X        bwrite(fd, (genericptr_t) trap, sizeof(struct trap));
  1280. X#if defined(DGK) && !defined(TOS)
  1281. X        if (!count_only)
  1282. X#endif
  1283. X            free((genericptr_t) trap);
  1284. X        trap = trap2;
  1285. X    }
  1286. X    bwrite(fd, (genericptr_t)nul, sizeof(struct trap));
  1287. X}
  1288. X
  1289. X/* save all the fruit names and ID's; this is used only in saving whole games
  1290. X * (not levels) and in saving bones levels.  When saving a bones level,
  1291. X * we only want to save the fruits which exist on the bones level; the bones
  1292. X * level routine marks nonexistent fruits by making the fid negative.
  1293. X */
  1294. Xvoid
  1295. Xsavefruitchn(fd)
  1296. Xregister int fd;
  1297. X{
  1298. X    register struct fruit *f2;
  1299. X    while(ffruit) {
  1300. X        f2 = ffruit->nextf;
  1301. X        if (ffruit->fid >= 0)
  1302. X            bwrite(fd, (genericptr_t) ffruit, sizeof(struct fruit));
  1303. X        free((genericptr_t) ffruit);
  1304. X        ffruit = f2;
  1305. X    }
  1306. X    bwrite(fd, (genericptr_t)nul, sizeof(struct fruit));
  1307. X}
  1308. X
  1309. Xstatic void
  1310. Xsavegenoinfo(fd)
  1311. Xregister int fd;
  1312. X{
  1313. X    register int i;
  1314. X
  1315. X    for (i = 0; i < NUMMONS; i++)
  1316. X        bwrite(fd, (genericptr_t) &(mons[i].geno), sizeof(unsigned));
  1317. X}
  1318. X
  1319. X#if defined(DGK) && !defined(TOS)
  1320. Xboolean
  1321. Xswapin_file(lev)
  1322. Xint lev;
  1323. X{
  1324. X    char to[PATHLEN], from[PATHLEN];
  1325. X
  1326. X    Sprintf(from, "%s%s", permbones, alllevels);
  1327. X    Sprintf(to, "%s%s", levels, alllevels);
  1328. X    name_file(from, lev);
  1329. X    name_file(to, lev);
  1330. X    while (fileinfo[lev].size > freediskspace(to))
  1331. X        if (!swapout_oldest())
  1332. X            return FALSE;
  1333. X#ifdef WIZARD
  1334. X    if (wizard) {
  1335. X        pline("Swapping in `%s'", from);
  1336. X        (void) fflush(stdout);
  1337. X    }
  1338. X#endif
  1339. X    copyfile(from, to);
  1340. X    (void) unlink(from);
  1341. X    fileinfo[lev].where = ACTIVE;
  1342. X    return TRUE;
  1343. X}
  1344. X
  1345. Xstatic boolean
  1346. Xswapout_oldest() {
  1347. X    char to[PATHLEN], from[PATHLEN];
  1348. X    int i, oldest;
  1349. X    long oldtime;
  1350. X
  1351. X    if (!ramdisk)
  1352. X        return FALSE;
  1353. X    for (i = 1, oldtime = 0, oldest = 0; i <= maxdlevel; i++)
  1354. X        if (fileinfo[i].where == ACTIVE
  1355. X        && (!oldtime || fileinfo[i].time < oldtime)) {
  1356. X            oldest = i;
  1357. X            oldtime = fileinfo[i].time;
  1358. X        }
  1359. X    if (!oldest)
  1360. X        return FALSE;
  1361. X    Sprintf(from, "%s%s", levels, alllevels);
  1362. X    Sprintf(to, "%s%s", permbones, alllevels);
  1363. X    name_file(from, oldest);
  1364. X    name_file(to, oldest);
  1365. X#ifdef WIZARD
  1366. X    if (wizard) {
  1367. X        pline("Swapping out `%s'.", from);
  1368. X        (void) fflush(stdout);
  1369. X    }
  1370. X#endif
  1371. X    copyfile(from, to);
  1372. X    (void) unlink(from);
  1373. X    fileinfo[oldest].where = SWAPPED;
  1374. X    return TRUE;
  1375. X}
  1376. X
  1377. Xstatic
  1378. Xvoid
  1379. Xcopyfile(from, to)
  1380. Xchar *from, *to;
  1381. X{
  1382. X    char buf[BUFSIZ];
  1383. X    int nfrom, nto, fdfrom, fdto;
  1384. X
  1385. X    if ((fdfrom = open(from, O_RDONLY | O_BINARY, FCMASK)) < 0)
  1386. X        panic("Can't copy from %s !?", from);
  1387. X    if ((fdto = open(to, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FCMASK)) < 0)
  1388. X        panic("Can't copy to %s", to);
  1389. X    do {
  1390. X        nfrom = read(fdfrom, buf, BUFSIZ);
  1391. X        nto = write(fdto, buf, nfrom);
  1392. X        if (nto != nfrom)
  1393. X            panic("Copyfile failed!");
  1394. X    } while (nfrom == BUFSIZ);
  1395. X    (void) close(fdfrom);
  1396. X    (void) close(fdto);
  1397. X}
  1398. X#endif
  1399. X
  1400. X/*
  1401. X * "spill" objects out of containers (unlinking from the fcobj list).
  1402. X *
  1403. X * The objects will be rearranged, and properly aged.  When we restore, they
  1404. X * can be put back into their containers.  By the time all of the calls to
  1405. X * saveobjchn() been made, the fcobj list should be empty.  Thus it need not
  1406. X * be saved, and doing so could cause some strange addressing problems.
  1407. X *
  1408. X * NOTE:  The cobj field is set to -1.  It will be used as a flag to indicate
  1409. X *      that this object was previously in a container.
  1410. X */
  1411. X
  1412. Xstatic void
  1413. Xspill_objs(cobj)
  1414. Xregister struct obj *cobj;
  1415. X{
  1416. X    register struct obj *otmp, *otmp2, *probj;
  1417. X
  1418. X#ifdef LINT
  1419. X    probj = (struct obj *)0;    /* suppress "used before set" error */
  1420. X#endif
  1421. X    for(otmp = fcobj; otmp; otmp = otmp2) {
  1422. X
  1423. X        otmp2 = otmp->nobj;
  1424. X        if(otmp->cobj == cobj) {
  1425. X
  1426. X        if(cobj->cursed && rn2(2))    otmp->cursed = 1;
  1427. X    /*
  1428. X     * Place all of the objects in a given container after that container
  1429. X     * in the list.  On restore, they should be able to be picked up and
  1430. X     * put back in.
  1431. X     */
  1432. X        if(otmp == fcobj) fcobj = otmp2;
  1433. X        else          probj->nobj = otmp2;
  1434. X
  1435. X        otmp->nobj = cobj->nobj;
  1436. X        cobj->nobj = otmp;
  1437. X        otmp->cobj = (struct obj *)-1;
  1438. X        } else probj = otmp;
  1439. X    }
  1440. X
  1441. X}
  1442. END_OF_FILE
  1443. if test 17421 -ne `wc -c <'src/save.c'`; then
  1444.     echo shar: \"'src/save.c'\" unpacked with wrong size!
  1445. fi
  1446. # end of 'src/save.c'
  1447. fi
  1448. echo shar: End of archive 8 \(of 38\).
  1449. cp /dev/null ark8isdone
  1450. MISSING=""
  1451. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ; do
  1452.     if test ! -f ark${I}isdone ; then
  1453.     MISSING="${MISSING} ${I}"
  1454.     fi
  1455. done
  1456. if test "${MISSING}" = "" ; then
  1457.     echo You have unpacked all 38 archives.
  1458.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1459. else
  1460.     echo You still need to unpack the following archives:
  1461.     echo "        " ${MISSING}
  1462. fi
  1463. ##  End of shell archive.
  1464. exit 0
  1465.