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

  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: v16i089:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part81/108
  5. Message-ID: <4452@master.CNA.TEK.COM>
  6. Date: 5 Feb 93 19:21:23 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 1938
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1640
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 89
  14. Archive-name: nethack31/Part81
  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 81 (of 108)."
  27. # Contents:  dat/endgame.des src/cmd.c src/rip.c
  28. # Wrapped by billr@saab on Wed Jan 27 16:09:19 1993
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'dat/endgame.des' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'dat/endgame.des'\"
  32. else
  33. echo shar: Extracting \"'dat/endgame.des'\" \(24177 characters\)
  34. sed "s/^X//" >'dat/endgame.des' <<'END_OF_FILE'
  35. X#    SCCS Id: @(#)endgame.des    3.1    93/01/13
  36. X#    Copyright (c) 1989 by Jean-Christophe Collet
  37. X#    Copyright (c) 1992,1993 by Izchak Miller, David Cohrs,
  38. X#                      and Timo Hakulinen
  39. X# NetHack may be freely redistributed.  See license for details.
  40. X#
  41. X# These are the ENDGAME levels: earth, air, fire, water, and astral.
  42. X# The top-most level, the Astral Level, has 3 temples and shrines.
  43. X# Players are supposed to sacrifice the Amulet of Yendor on the appropriate
  44. X# shrine.
  45. X
  46. XMAZE:"earth",' '
  47. XFLAGS: noteleport,hardfloor,shortsighted
  48. XMESSAGE: "Well done, mortal!"
  49. XMESSAGE: "But now thou must face the final Test..."
  50. XMESSAGE: "Prove thyself worthy or perish!"
  51. X
  52. XGEOMETRY:center,center
  53. X# The player lands, upon arrival, in the
  54. X# lower-right cavern.  The location of the 
  55. X# portal to the next level is randomly chosen.
  56. X# This map has no visible outer boundary, and 
  57. X# is mostly diggable "rock".
  58. XMAP
  59. X                                                                            
  60. X  ...                                                                       
  61. X ....                ..                                                     
  62. X .....             ...                                      ..              
  63. X  ....              ....                                     ...            
  64. X   ....              ...                ....                 ...      .     
  65. X    ..                ..              .......                 .      ..     
  66. X                                      ..  ...                        .      
  67. X              .                      ..    .                         ...    
  68. X             ..  ..                  .     ..                         .     
  69. X            ..   ...                        .                               
  70. X            ...   ...                                                       
  71. X              .. ...                                 ..                     
  72. X               ....                                 ..                      
  73. X                          ..                                       ...      
  74. X                         ..                                       .....     
  75. X  ...                                                              ...      
  76. X ....                                                                       
  77. X   ..                                                                       
  78. X                                                                            
  79. XENDMAP
  80. X#  Since there are no stairs, this forces the hero's initial placement
  81. XTELEPORT_REGION:(69,16,69,16),(0,0,0,0)
  82. XPORTAL:(0,0,75,19),(65,13,75,19),"air"
  83. X#  Some helpful monsters.  Making sure a
  84. X#  pick axe and at least one wand of digging
  85. X#  are available.
  86. XMONSTER:'@',"Elvenking",(67,16)
  87. XMONSTER:'H',"minotaur",(67,14)
  88. X#  An assortment of earth-appropriate nasties
  89. X#  in each cavern.
  90. XMONSTER:'E',"earth elemental",(52,13),hostile
  91. XMONSTER:'E',"earth elemental",(53,13),hostile
  92. XMONSTER:'T',"rock troll",(53,12)
  93. XMONSTER:'H',"stone giant",(54,12)
  94. X#
  95. XMONSTER:'S',"pit viper",(70,05)
  96. XMONSTER:'&',"barbed devil",(69,06)
  97. XMONSTER:'H',"stone giant",(69,08)
  98. XMONSTER:''',"stone golem",(71,08)
  99. XMONSTER:'&',"pit fiend",(70,09)
  100. XMONSTER:'E',"earth elemental",(70,08),hostile
  101. X#
  102. XMONSTER:'E',"earth elemental",(60,03),hostile
  103. XMONSTER:'H',"stone giant",(61,04)
  104. XMONSTER:'E',"earth elemental",(62,04),hostile
  105. XMONSTER:'E',"earth elemental",(61,05),hostile
  106. XMONSTER:'s',"scorpion",(62,05)
  107. XMONSTER:'p',"rock piercer",(63,05)
  108. X#
  109. XMONSTER:'U',"umber hulk",(40,05)
  110. XMONSTER:'v',"dust vortex",(42,05)
  111. XMONSTER:'T',"rock troll",(38,06)
  112. XMONSTER:'E',"earth elemental",(39,06),hostile
  113. XMONSTER:'E',"earth elemental",(41,06),hostile
  114. XMONSTER:'E',"earth elemental",(38,07),hostile
  115. XMONSTER:'H',"stone giant",(39,07)
  116. XMONSTER:'E',"earth elemental",(43,07),hostile
  117. XMONSTER:''',"stone golem",(37,08)
  118. XMONSTER:'S',"pit viper",(43,08)
  119. XMONSTER:'S',"pit viper",(43,09)
  120. XMONSTER:'T',"rock troll",(44,10)
  121. X#
  122. XMONSTER:'E',"earth elemental",(02,01),hostile
  123. XMONSTER:'E',"earth elemental",(03,01),hostile
  124. XMONSTER:''',"stone golem",(01,02)
  125. XMONSTER:'E',"earth elemental",(02,02),hostile
  126. XMONSTER:'T',"rock troll",(04,03)
  127. XMONSTER:'T',"rock troll",(03,03)
  128. XMONSTER:'&',"pit fiend",(03,04)
  129. XMONSTER:'E',"earth elemental",(04,05),hostile
  130. XMONSTER:'S',"pit viper",(05,06)
  131. X#
  132. XMONSTER:'E',"earth elemental",(21,02),hostile
  133. XMONSTER:'E',"earth elemental",(21,03),hostile
  134. XMONSTER:'H',"minotaur",(21,04)
  135. XMONSTER:'E',"earth elemental",(21,05),hostile
  136. XMONSTER:'T',"rock troll",(22,06)
  137. XMONSTER:'E',"earth elemental",(22,06),hostile
  138. XMONSTER:'E',"earth elemental",(23,06),hostile
  139. X#
  140. XMONSTER:'S',"pit viper",(14,08)
  141. XMONSTER:'&',"barbed devil",(14,09)
  142. XMONSTER:'E',"earth elemental",(13,10),hostile
  143. XMONSTER:'T',"rock troll",(12,11)
  144. XMONSTER:'E',"earth elemental",(14,12),hostile
  145. XMONSTER:'E',"earth elemental",(15,13),hostile
  146. XMONSTER:'H',"stone giant",(17,13)
  147. XMONSTER:''',"stone golem",(18,13)
  148. XMONSTER:'&',"pit fiend",(18,12)
  149. XMONSTER:'E',"earth elemental",(18,11),hostile
  150. XMONSTER:'E',"earth elemental",(18,10),hostile
  151. X#
  152. XMONSTER:'&',"barbed devil",(02,16)
  153. XMONSTER:'E',"earth elemental",(03,16),hostile
  154. XMONSTER:'T',"rock troll",(02,17)
  155. XMONSTER:'E',"earth elemental",(04,17),hostile
  156. XMONSTER:'E',"earth elemental",(04,18),hostile
  157. X
  158. X
  159. XMAZE:"air",' '
  160. XFLAGS: noteleport,hardfloor,shortsighted
  161. X# The following messages are somewhat obtuse, to make then
  162. X# equally meaningful if the player can see or not.
  163. XMESSAGE: "What a strange feeling!"
  164. XMESSAGE: "You notice that there is no gravity here."
  165. XGEOMETRY:center,center
  166. X# The player lands, upon arrival, in the
  167. X# lower-left area.  The location of the 
  168. X# portal to the next level is randomly chosen.
  169. X# This map has no visible outer boundary, and 
  170. X# is all "air".
  171. XMAP
  172. XAAAAAAAAAAAAAAAAAAAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  173. XAAAAAAAAAAAAAAAAAAAAAAACCCCCCAAAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  174. XAAAAAAAAAAAAAAAAAAAAACCAACCCCCAAAAAACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  175. XAAAAAAAAAAAAAAAAAAAAACCACCCCCCCAAAAACCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  176. XAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  177. XAAAAAAAAAAAAAAAAAAAAAAAACCCCAAACCAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  178. XAAAAAAAAAAAAAAAAAAAAAAAAACCCCAAAAAACCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  179. XAAAAAAAAAAAAAAAAAAAAAAACCCCCCCAAAACCACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  180. XAAAAAAAAAAAAAAAAAAAAAACCCCAAAAAAACCACAACCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  181. XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCAACCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  182. XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCAAACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  183. XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACACCCCCAAACCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAA
  184. XAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCCCCAAAACCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAA
  185. XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACCCCCCCCAAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAA
  186. XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAA
  187. XAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACCCCCCCCCCACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAA
  188. XAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  189. XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCCCAAACCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  190. XAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAACCAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  191. XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  192. XENDMAP
  193. XTELEPORT_REGION:(09,16,09,16),(0,0,0,0)
  194. XPORTAL:(30,0,75,19),(00,00,09,16),"fire"
  195. XREGION:(00,00,75,19),lit,"ordinary"
  196. XMONSTER:'E',"air elemental",random,hostile
  197. XMONSTER:'E',"air elemental",random,hostile
  198. XMONSTER:'E',"air elemental",random,hostile
  199. XMONSTER:'E',"air elemental",random,hostile
  200. XMONSTER:'E',"air elemental",random,hostile
  201. XMONSTER:'E',"air elemental",random,hostile
  202. XMONSTER:'E',"air elemental",random,hostile
  203. XMONSTER:'E',"air elemental",random,hostile
  204. XMONSTER:'E',"air elemental",random,hostile
  205. XMONSTER:'E',"air elemental",random,hostile
  206. XMONSTER:'E',"air elemental",random,hostile
  207. X
  208. XMONSTER:'e',"floating eye",random,hostile
  209. XMONSTER:'e',"floating eye",random,hostile
  210. XMONSTER:'e',"floating eye",random,hostile
  211. X
  212. XMONSTER:'y',"yellow light",random,hostile
  213. XMONSTER:'y',"yellow light",random,hostile
  214. XMONSTER:'y',"yellow light",random,hostile
  215. X
  216. XMONSTER:'A',"couatl",random
  217. X
  218. XMONSTER:'D',random,random
  219. XMONSTER:'D',random,random
  220. XMONSTER:'D',random,random
  221. XMONSTER:'D',random,random
  222. XMONSTER:'D',random,random
  223. X
  224. XMONSTER:'I',random,random
  225. XMONSTER:'I',random,random
  226. XMONSTER:'I',random,random
  227. XMONSTER:'J',random,random
  228. XMONSTER:'J',random,random
  229. X
  230. XMONSTER:'&',"djinni",random,hostile
  231. XMONSTER:'&',"djinni",random,hostile
  232. XMONSTER:'&',"djinni",random,hostile
  233. X
  234. XMONSTER:'v',"fog cloud",random,hostile
  235. XMONSTER:'v',"fog cloud",random,hostile
  236. XMONSTER:'v',"fog cloud",random,hostile
  237. XMONSTER:'v',"fog cloud",random,hostile
  238. XMONSTER:'v',"fog cloud",random,hostile
  239. XMONSTER:'v',"fog cloud",random,hostile
  240. XMONSTER:'v',"fog cloud",random,hostile
  241. XMONSTER:'v',"fog cloud",random,hostile
  242. XMONSTER:'v',"fog cloud",random,hostile
  243. XMONSTER:'v',"energy vortex",random,hostile
  244. XMONSTER:'v',"energy vortex",random,hostile
  245. XMONSTER:'v',"energy vortex",random,hostile
  246. XMONSTER:'v',"energy vortex",random,hostile
  247. XMONSTER:'v',"energy vortex",random,hostile
  248. XMONSTER:'v',"steam vortex",random,hostile
  249. XMONSTER:'v',"steam vortex",random,hostile
  250. XMONSTER:'v',"steam vortex",random,hostile
  251. XMONSTER:'v',"steam vortex",random,hostile
  252. XMONSTER:'v',"steam vortex",random,hostile
  253. X
  254. X
  255. XMAZE:"fire",' '
  256. XFLAGS: noteleport,hardfloor,shortsighted
  257. XGEOMETRY:center,center
  258. X# The player lands, upon arrival, in the
  259. X# lower-right.  The location of the 
  260. X# portal to the next level is randomly chosen.
  261. X# This map has no visible outer boundary, and 
  262. X# is mostly open area, with lava lakes and bunches of fire traps.
  263. XMAP
  264. X............................................................................
  265. X....LLLLLLLL............L.......................LLL.........................
  266. X...LL...................L......................LLLL................LL.......
  267. X...L.............LLLL...LL....LL...............LLLLL.............LLL........
  268. X.LLLL..............LL....L.....LLL..............LLLL..............LLLL......
  269. X..........LLLL...LLLL...LLL....LLL......L........LLLL....LL........LLL......
  270. X........LLLLLLL...LL.....L......L......LL.........LL......LL........LL...L..
  271. X........LL..LLL..LL......LL......LLLL..L.........LL......LLL............LL..
  272. X....L..LL....LLLLL.................LLLLLLL.......L......LL............LLLLLL
  273. X....L..L.....LL.LLLL.......L............L........LLLLL.LL......LL.........LL
  274. X....LL........L...LL......LL.............LLL.....L...LLL.......LLL.........L
  275. X.....LLLLLL........L.......LLL.............L....LL...L.LLL......LLLLLLL.....
  276. X..........LLLL............LL.L.............L....L...LL.........LLL..LLL.....
  277. X...........................LLLLL...........LL...L...L........LLLL..LLLLLL...
  278. X.....LLLL.............LL....LL.......LLL...LL.......L..LLL....LLLLLLL.......
  279. X.......LLL.........LLLLLLLLLLL......LLLLL...L...........LL...LL...LL........
  280. X.........LL.......LL.........LL.......LLL....L..LLL....LL.........LL........
  281. X..........LLLLLLLLL...........LL....LLL.......LLLLL.....LL........LL........
  282. X.................L.............LLLLLL............LL...LLLL.........LL.......
  283. X.................................LL....................LL...................
  284. XENDMAP
  285. XTELEPORT_REGION:(69,16,69,16),(0,0,0,0)
  286. XPORTAL:(0,0,75,19),(65,13,75,19),"water"
  287. X
  288. XTRAP:"fire",random
  289. XTRAP:"fire",random
  290. XTRAP:"fire",random
  291. XTRAP:"fire",random
  292. XTRAP:"fire",random
  293. XTRAP:"fire",random
  294. XTRAP:"fire",random
  295. XTRAP:"fire",random
  296. XTRAP:"fire",random
  297. XTRAP:"fire",random
  298. XTRAP:"fire",random
  299. XTRAP:"fire",random
  300. XTRAP:"fire",random
  301. XTRAP:"fire",random
  302. XTRAP:"fire",random
  303. XTRAP:"fire",random
  304. XTRAP:"fire",random
  305. XTRAP:"fire",random
  306. XTRAP:"fire",random
  307. XTRAP:"fire",random
  308. XTRAP:"fire",random
  309. XTRAP:"fire",random
  310. XTRAP:"fire",random
  311. XTRAP:"fire",random
  312. XTRAP:"fire",random
  313. XTRAP:"fire",random
  314. XTRAP:"fire",random
  315. XTRAP:"fire",random
  316. XTRAP:"fire",random
  317. XTRAP:"fire",random
  318. XTRAP:"fire",random
  319. XTRAP:"fire",random
  320. XTRAP:"fire",random
  321. XTRAP:"fire",random
  322. XTRAP:"fire",random
  323. XTRAP:"fire",random
  324. XTRAP:"fire",random
  325. XTRAP:"fire",random
  326. XTRAP:"fire",random
  327. XTRAP:"fire",random
  328. X#  An assortment of fire-appropriate nasties
  329. XMONSTER:'D',"red dragon",random
  330. XMONSTER:'&',"balrog",random
  331. XMONSTER:'E',"fire elemental",random,hostile
  332. XMONSTER:'E',"fire elemental",random,hostile
  333. XMONSTER:'v',"fire vortex",random
  334. XMONSTER:'d',"hell hound",random
  335. X#
  336. XMONSTER:'H',"fire giant",random
  337. XMONSTER:'&',"barbed devil",random
  338. XMONSTER:'d',"hell hound",random
  339. XMONSTER:''',"stone golem",random
  340. XMONSTER:'&',"pit fiend",random
  341. XMONSTER:'E',"fire elemental",random,hostile
  342. X#
  343. XMONSTER:'E',"fire elemental",random,hostile
  344. XMONSTER:'d',"hell hound",random
  345. XMONSTER:'E',"fire elemental",random,hostile
  346. XMONSTER:'E',"fire elemental",random,hostile
  347. XMONSTER:'s',"scorpion",random
  348. XMONSTER:'H',"fire giant",random
  349. X#
  350. XMONSTER:'d',"hell hound",random
  351. XMONSTER:'v',"dust vortex",random
  352. XMONSTER:'v',"fire vortex",random
  353. XMONSTER:'E',"fire elemental",random,hostile
  354. XMONSTER:'E',"fire elemental",random,hostile
  355. XMONSTER:'E',"fire elemental",random,hostile
  356. XMONSTER:'d',"hell hound",random
  357. XMONSTER:'E',"fire elemental",random,hostile
  358. XMONSTER:''',"stone golem",random
  359. XMONSTER:'S',"pit viper",random
  360. XMONSTER:'S',"pit viper",random
  361. XMONSTER:'v',"fire vortex",random
  362. X#
  363. XMONSTER:'E',"fire elemental",random,hostile
  364. XMONSTER:'E',"fire elemental",random,hostile
  365. XMONSTER:'H',"fire giant",random
  366. XMONSTER:'E',"fire elemental",random,hostile
  367. XMONSTER:'v',"fire vortex",random
  368. XMONSTER:'v',"fire vortex",random
  369. XMONSTER:'&',"pit fiend",random
  370. XMONSTER:'E',"fire elemental",random,hostile
  371. XMONSTER:'S',"pit viper",random
  372. X#
  373. XMONSTER:'E',"fire elemental",random,hostile
  374. XMONSTER:'E',"fire elemental",random,hostile
  375. XMONSTER:'H',"minotaur",random
  376. XMONSTER:'E',"fire elemental",random,hostile
  377. XMONSTER:'v',"fire vortex",random
  378. XMONSTER:'E',"fire elemental",random,hostile
  379. XMONSTER:'E',"fire elemental",random,hostile
  380. X#
  381. XMONSTER:'H',"fire giant",random
  382. XMONSTER:'&',"barbed devil",random
  383. XMONSTER:'E',"fire elemental",random,hostile
  384. XMONSTER:'v',"fire vortex",random
  385. XMONSTER:'E',"fire elemental",random,hostile
  386. XMONSTER:'E',"fire elemental",random,hostile
  387. XMONSTER:'d',"hell hound",random
  388. XMONSTER:'H',"fire giant",random
  389. XMONSTER:'&',"pit fiend",random
  390. XMONSTER:'E',"fire elemental",random,hostile
  391. XMONSTER:'E',"fire elemental",random,hostile
  392. X#
  393. XMONSTER:'&',"barbed devil",random
  394. XMONSTER:'E',"fire elemental",random,hostile
  395. XMONSTER:'v',"fire vortex",random
  396. XMONSTER:'E',"fire elemental",random,hostile
  397. XMONSTER:'E',"fire elemental",random,hostile
  398. X
  399. X
  400. XMAZE:"water",' '
  401. XFLAGS: noteleport,hardfloor,shortsighted
  402. XMESSAGE: "You find yourself suspended in an air bubble surrounded by water."
  403. XGEOMETRY:center,center
  404. X# The player lands upon arrival to an air bubble
  405. X# within the leftmost third of the level.  The
  406. X# portal to the next level is randomly located in an air
  407. X# bubble within the rightmost third of the level.
  408. X# Bubbles are generated by special code in mkmaze.c for now.
  409. XMAP
  410. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  411. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  412. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  413. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  414. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  415. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  416. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  417. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  418. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  419. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  420. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  421. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  422. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  423. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  424. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  425. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  426. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  427. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  428. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  429. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  430. XENDMAP
  431. XTELEPORT_REGION:(0,0,25,19),(0,0,0,0)
  432. XPORTAL:(51,0,75,19),(0,0,0,0),"astral"
  433. X# A fisherman's dream...
  434. XMONSTER:';',"giant eel",random
  435. XMONSTER:';',"giant eel",random
  436. XMONSTER:';',"giant eel",random
  437. XMONSTER:';',"giant eel",random
  438. XMONSTER:';',"giant eel",random
  439. XMONSTER:';',"giant eel",random
  440. XMONSTER:';',"giant eel",random
  441. XMONSTER:';',"giant eel",random
  442. XMONSTER:';',"electric eel",random
  443. XMONSTER:';',"electric eel",random
  444. XMONSTER:';',"electric eel",random
  445. XMONSTER:';',"electric eel",random
  446. XMONSTER:';',"electric eel",random
  447. XMONSTER:';',"electric eel",random
  448. XMONSTER:';',"electric eel",random
  449. XMONSTER:';',"electric eel",random
  450. XMONSTER:';',"kraken",random
  451. XMONSTER:';',"kraken",random
  452. XMONSTER:';',"kraken",random
  453. XMONSTER:';',"kraken",random
  454. XMONSTER:';',"kraken",random
  455. XMONSTER:';',"kraken",random
  456. XMONSTER:';',"kraken",random
  457. XMONSTER:';',"kraken",random
  458. XMONSTER:';',"kraken",random
  459. XMONSTER:';',random,random
  460. XMONSTER:';',random,random
  461. XMONSTER:';',random,random
  462. XMONSTER:';',random,random
  463. XMONSTER:';',random,random
  464. XMONSTER:';',random,random
  465. XMONSTER:';',random,random
  466. XMONSTER:';',random,random
  467. XMONSTER:';',random,random
  468. X# These guys feel like home here
  469. XMONSTER:'E',"water elemental",random,hostile
  470. XMONSTER:'E',"water elemental",random,hostile
  471. XMONSTER:'E',"water elemental",random,hostile
  472. XMONSTER:'E',"water elemental",random,hostile
  473. XMONSTER:'E',"water elemental",random,hostile
  474. XMONSTER:'E',"water elemental",random,hostile
  475. XMONSTER:'E',"water elemental",random,hostile
  476. XMONSTER:'E',"water elemental",random,hostile
  477. XMONSTER:'E',"water elemental",random,hostile
  478. XMONSTER:'E',"water elemental",random,hostile
  479. XMONSTER:'E',"water elemental",random,hostile
  480. XMONSTER:'E',"water elemental",random,hostile
  481. XMONSTER:'E',"water elemental",random,hostile
  482. XMONSTER:'E',"water elemental",random,hostile
  483. XMONSTER:'E',"water elemental",random,hostile
  484. XMONSTER:'E',"water elemental",random,hostile
  485. XMONSTER:'E',"water elemental",random,hostile
  486. XMONSTER:'E',"water elemental",random,hostile
  487. XMONSTER:'E',"water elemental",random,hostile
  488. X
  489. X
  490. XMAZE:"astral",' '
  491. XFLAGS: noteleport,hardfloor,shortsighted
  492. XMESSAGE: "You arrive on the Astral Plane!"
  493. XMESSAGE: "Here the High Temples of the aligned gods are located."
  494. XMESSAGE: "You sense alarm, hostility, and excitement in the air!"
  495. XGEOMETRY:center,center
  496. XMAP
  497. X                              ---------------                              
  498. X                              |.............|                              
  499. X                              |..---------..|                              
  500. X                              |..|.......|..|                              
  501. X---------------               |..|.......|..|               ---------------
  502. X|.............|               |..|.......|..|               |.............|
  503. X|..---------..-|   |-------|  |..|.......|..|  |-------|   |-..---------..|
  504. X|..|.......|...-| |-.......-| |..|.......|..| |-.......-| |-...|.......|..|
  505. X|..|.......|....-|-.........-||..----+----..||-.........-|-....|.......|..|
  506. X|..|.......+.....+...........||.............||...........+.....+.......|..|
  507. X|..|.......|....-|-.........-|--|.........|--|-.........-|-....|.......|..|
  508. X|..|.......|...-| |-.......-|   -|---+---|-   |-.......-| |-...|.......|..|
  509. X|..---------..-|   |---+---|    |-.......-|    |---+---|   |-..---------..|
  510. X|.............|      |...|-----|-.........-|-----|...|      |.............|
  511. X---------------      |.........|...........|.........|      ---------------
  512. X                     -------...|-.........-|...-------                     
  513. X                           |....|-.......-|....|                           
  514. X                           ---...|---+---|...---                           
  515. X                             |...............|                             
  516. X                             -----------------                             
  517. XENDMAP
  518. X# Where the player will land on arrival
  519. XTELEPORT_REGION:(29,15,45,15),(30,15,44,15)
  520. X# Lit courts
  521. XREGION:(01,05,16,14),lit,"ordinary",filled,true
  522. XREGION:(31,01,44,10),lit,"ordinary",filled,true
  523. XREGION:(61,05,74,14),lit,"ordinary",filled,true
  524. X# A Sanctum for each alignment
  525. X# The shrines' alignments are shuffled for
  526. X# each game
  527. XREGION:(04,07,10,11),lit,"temple"
  528. XREGION:(34,03,40,07),lit,"temple"
  529. XREGION:(64,07,70,11),lit,"temple"
  530. XALTAR:(07,09),align[0],sanctum
  531. XALTAR:(37,05),align[1],sanctum
  532. XALTAR:(67,09),align[2],sanctum
  533. X# Doors
  534. XDOOR:closed,(11,09)
  535. XDOOR:closed,(17,09)
  536. XDOOR:locked,(23,12)
  537. XDOOR:locked,(37,08)
  538. XDOOR:closed,(37,11)
  539. XDOOR:closed,(37,17)
  540. XDOOR:locked,(51,12)
  541. XDOOR:locked,(57,09)
  542. XDOOR:closed,(63,09)
  543. X# Non diggable everywhere
  544. XNON_DIGGABLE:(00,00,74,19)
  545. X# Moloch's horde
  546. X# West round room
  547. XMONSTER:'@',"aligned priest",(18,09),noalign,hostile
  548. XMONSTER:'@',"aligned priest",(19,08),noalign,hostile
  549. XMONSTER:'@',"aligned priest",(19,09),noalign,hostile
  550. XMONSTER:'@',"aligned priest",(19,10),noalign,hostile
  551. XMONSTER:'A',"Angel",(20,09),noalign,hostile
  552. XMONSTER:'A',"Angel",(20,10),noalign,hostile
  553. XMONSTER:'&',"Pestilence",(23,09),hostile
  554. X# South-central round room
  555. XMONSTER:'@',"aligned priest",(36,12),noalign,hostile
  556. XMONSTER:'@',"aligned priest",(37,12),noalign,hostile
  557. XMONSTER:'@',"aligned priest",(38,12),noalign,hostile
  558. XMONSTER:'@',"aligned priest",(36,13),noalign,hostile
  559. XMONSTER:'A',"Angel",(38,13),noalign,hostile
  560. XMONSTER:'A',"Angel",(37,13),noalign,hostile
  561. XMONSTER:'&',"Death",(37,14),hostile
  562. X# East round room
  563. XMONSTER:'@',"aligned priest",(56,09),noalign,hostile
  564. XMONSTER:'@',"aligned priest",(55,08),noalign,hostile
  565. XMONSTER:'@',"aligned priest",(55,09),noalign,hostile
  566. XMONSTER:'@',"aligned priest",(55,10),noalign,hostile
  567. XMONSTER:'A',"Angel",(54,09),noalign,hostile
  568. XMONSTER:'A',"Angel",(54,10),noalign,hostile
  569. XMONSTER:'&',"Famine",(51,09),hostile
  570. X#
  571. X# The aligned horde
  572. X# 
  573. X# We do not know in advance the alignment of the
  574. X# player.  The mpeaceful bit will need resetting
  575. X# when the level is created.  The setting here is
  576. X# but a place holder.
  577. X#
  578. X# West court
  579. XMONSTER:'@',"aligned priest",(12,07),chaos,hostile
  580. XMONSTER:'@',"aligned priest",(13,07),chaos,peaceful
  581. XMONSTER:'@',"aligned priest",(14,07),law,hostile
  582. XMONSTER:'@',"aligned priest",(12,11),law,peaceful
  583. XMONSTER:'@',"aligned priest",(13,11),neutral,hostile
  584. XMONSTER:'@',"aligned priest",(14,11),neutral,peaceful
  585. XMONSTER:'A',"Angel",(11,05),chaos,hostile
  586. XMONSTER:'A',"Angel",(12,05),chaos,peaceful
  587. XMONSTER:'A',"Angel",(13,05),law,hostile
  588. XMONSTER:'A',"Angel",(11,13),law,peaceful
  589. XMONSTER:'A',"Angel",(12,13),neutral,hostile
  590. XMONSTER:'A',"Angel",(13,13),neutral,peaceful
  591. X# Central court
  592. XMONSTER:'@',"aligned priest",(32,09),chaos,hostile
  593. XMONSTER:'@',"aligned priest",(33,09),chaos,peaceful
  594. XMONSTER:'@',"aligned priest",(34,09),law,hostile
  595. XMONSTER:'@',"aligned priest",(40,09),law,peaceful
  596. XMONSTER:'@',"aligned priest",(41,09),neutral,hostile
  597. XMONSTER:'@',"aligned priest",(42,09),neutral,peaceful
  598. XMONSTER:'A',"Angel",(31,08),chaos,hostile
  599. XMONSTER:'A',"Angel",(32,08),chaos,peaceful
  600. XMONSTER:'A',"Angel",(31,09),law,hostile
  601. XMONSTER:'A',"Angel",(42,08),law,peaceful
  602. XMONSTER:'A',"Angel",(43,08),neutral,hostile
  603. XMONSTER:'A',"Angel",(43,09),neutral,peaceful
  604. X# East court
  605. XMONSTER:'@',"aligned priest",(60,07),chaos,hostile
  606. XMONSTER:'@',"aligned priest",(61,07),chaos,peaceful
  607. XMONSTER:'@',"aligned priest",(62,07),law,hostile
  608. XMONSTER:'@',"aligned priest",(60,11),law,peaceful
  609. XMONSTER:'@',"aligned priest",(61,11),neutral,hostile
  610. XMONSTER:'@',"aligned priest",(62,11),neutral,peaceful
  611. XMONSTER:'A',"Angel",(61,05),chaos,hostile
  612. XMONSTER:'A',"Angel",(62,05),chaos,peaceful
  613. XMONSTER:'A',"Angel",(63,05),law,hostile
  614. XMONSTER:'A',"Angel",(61,13),law,peaceful
  615. XMONSTER:'A',"Angel",(62,13),neutral,hostile
  616. XMONSTER:'A',"Angel",(63,13),neutral,peaceful
  617. X#
  618. X# Assorted nasties
  619. XMONSTER:'L',random,random,hostile
  620. XMONSTER:'L',random,random,hostile
  621. XMONSTER:'L',random,random,hostile
  622. XMONSTER:'V',random,random,hostile
  623. XMONSTER:'V',random,random,hostile
  624. XMONSTER:'V',random,random,hostile
  625. XMONSTER:'D',random,random,hostile
  626. XMONSTER:'D',random,random,hostile
  627. XMONSTER:'D',random,random,hostile
  628. END_OF_FILE
  629. if test 24177 -ne `wc -c <'dat/endgame.des'`; then
  630.     echo shar: \"'dat/endgame.des'\" unpacked with wrong size!
  631. fi
  632. # end of 'dat/endgame.des'
  633. fi
  634. if test -f 'src/cmd.c' -a "${1}" != "-c" ; then 
  635.   echo shar: Will not clobber existing file \"'src/cmd.c'\"
  636. else
  637. echo shar: Extracting \"'src/cmd.c'\" \(26575 characters\)
  638. sed "s/^X//" >'src/cmd.c' <<'END_OF_FILE'
  639. X/*    SCCS Id: @(#)cmd.c    3.1    92/11/25    */
  640. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  641. X/* NetHack may be freely redistributed.  See license for details. */
  642. X
  643. X#include "hack.h"
  644. X#include "func_tab.h"
  645. X
  646. X/*
  647. X * Some systems may have getchar() return EOF for various reasons, and
  648. X * we should not quit before seeing at least NR_OF_EOFS consecutive EOFs.
  649. X */
  650. X#if defined(SYSV) || defined(DGUX) || defined(HPUX)
  651. X#define    NR_OF_EOFS    20
  652. X#endif
  653. X
  654. X#ifdef DUMB    /* stuff commented out in extern.h, but needed here */
  655. Xextern int NDECL(doapply); /**/
  656. Xextern int NDECL(dorub); /**/
  657. Xextern int NDECL(dojump); /**/
  658. Xextern int NDECL(doextlist); /**/
  659. Xextern int NDECL(dodrop); /**/
  660. Xextern int NDECL(doddrop); /**/
  661. Xextern int NDECL(dodown); /**/
  662. Xextern int NDECL(doup); /**/
  663. Xextern int NDECL(donull); /**/
  664. Xextern int NDECL(dowipe); /**/
  665. Xextern int NDECL(do_mname); /**/
  666. Xextern int NDECL(ddocall); /**/
  667. Xextern int NDECL(dotakeoff); /**/
  668. Xextern int NDECL(doremring); /**/
  669. Xextern int NDECL(dowear); /**/
  670. Xextern int NDECL(doputon); /**/
  671. Xextern int NDECL(doddoremarm); /**/
  672. Xextern int NDECL(dokick); /**/
  673. Xextern int NDECL(dothrow); /**/
  674. Xextern int NDECL(doeat); /**/
  675. Xextern int NDECL(done2); /**/
  676. Xextern int NDECL(doengrave); /**/
  677. Xextern int NDECL(dopickup); /**/
  678. Xextern int NDECL(ddoinv); /**/
  679. Xextern int NDECL(dotypeinv); /**/
  680. Xextern int NDECL(dolook); /**/
  681. Xextern int NDECL(doprgold); /**/
  682. Xextern int NDECL(doprwep); /**/
  683. Xextern int NDECL(doprarm); /**/
  684. Xextern int NDECL(doprring); /**/
  685. Xextern int NDECL(dopramulet); /**/
  686. Xextern int NDECL(doprtool); /**/
  687. Xextern int NDECL(dosuspend); /**/
  688. Xextern int NDECL(doforce); /**/
  689. Xextern int NDECL(doopen); /**/
  690. Xextern int NDECL(doclose); /**/
  691. Xextern int NDECL(dosh); /**/
  692. Xextern int NDECL(dodiscovered); /**/
  693. Xextern int NDECL(doset); /**/
  694. Xextern int NDECL(dotogglepickup); /**/
  695. Xextern int NDECL(dowhatis); /**/
  696. Xextern int NDECL(doquickwhatis); /**/
  697. Xextern int NDECL(dowhatdoes); /**/
  698. Xextern int NDECL(dohelp); /**/
  699. Xextern int NDECL(dohistory); /**/
  700. Xextern int NDECL(doloot); /**/
  701. Xextern int NDECL(dodrink); /**/
  702. Xextern int NDECL(dodip); /**/
  703. Xextern int NDECL(dosacrifice); /**/
  704. Xextern int NDECL(dopray); /**/
  705. Xextern int NDECL(doturn); /**/
  706. Xextern int NDECL(doredraw); /**/
  707. Xextern int NDECL(doread); /**/
  708. Xextern int NDECL(dosave); /**/
  709. Xextern int NDECL(dosearch); /**/
  710. Xextern int NDECL(doidtrap); /**/
  711. Xextern int NDECL(dopay); /**/
  712. Xextern int NDECL(dosit); /**/
  713. Xextern int NDECL(dotalk); /**/
  714. Xextern int NDECL(docast); /**/
  715. Xextern int NDECL(dovspell); /**/
  716. Xextern int NDECL(dotele); /**/
  717. Xextern int NDECL(dountrap); /**/
  718. Xextern int NDECL(doversion); /**/
  719. Xextern int NDECL(doextversion); /**/
  720. Xextern int NDECL(dowield); /**/
  721. Xextern int NDECL(dozap); /**/
  722. Xextern int NDECL(doorganize); /**/
  723. X#endif /* DUMB */
  724. X
  725. X#ifdef OVL1
  726. Xstatic int NDECL((*timed_occ_fn));
  727. X#endif /* OVL1 */
  728. X
  729. XSTATIC_PTR int NDECL(doprev_message);
  730. XSTATIC_PTR int NDECL(timed_occupation);
  731. XSTATIC_PTR int NDECL(doextcmd);
  732. X# ifdef POLYSELF
  733. XSTATIC_PTR int NDECL(domonability);
  734. X# endif
  735. X# ifdef WIZARD
  736. XSTATIC_PTR int NDECL(wiz_wish);
  737. XSTATIC_PTR int NDECL(wiz_identify);
  738. XSTATIC_PTR int NDECL(wiz_map);
  739. XSTATIC_PTR int NDECL(wiz_genesis);
  740. XSTATIC_PTR int NDECL(wiz_where);
  741. XSTATIC_PTR int NDECL(wiz_detect);
  742. XSTATIC_PTR int NDECL(wiz_level_tele);
  743. X# endif
  744. X# ifdef EXPLORE_MODE
  745. XSTATIC_PTR int NDECL(enter_explore_mode);
  746. X# endif
  747. X# if defined(WIZARD) || defined(EXPLORE_MODE)
  748. XSTATIC_PTR int NDECL(wiz_attributes);
  749. X# endif
  750. X
  751. X#ifdef OVLB
  752. Xstatic void FDECL(enlght_line, (const char *,const char *,const char *));
  753. X#ifdef UNIX
  754. Xstatic void NDECL(end_of_input);
  755. X#endif
  756. X#endif /* OVLB */
  757. X
  758. X#ifdef OVL0
  759. Xstatic int FDECL(click_to_cmd, (int,int,int));
  760. X#endif /* OVL0 */
  761. X
  762. XSTATIC_OVL char *NDECL(parse);
  763. X
  764. X#ifdef UNIX
  765. Xextern boolean hu;
  766. X#endif
  767. X
  768. X#ifdef OVL1
  769. X
  770. XSTATIC_PTR int
  771. Xdoprev_message()
  772. X{
  773. X    return nh_doprev_message();
  774. X}
  775. X
  776. X/* Count down by decrementing multi */
  777. XSTATIC_PTR int
  778. Xtimed_occupation() {
  779. X    (*timed_occ_fn)();
  780. X    if (multi > 0)
  781. X        multi--;
  782. X    return multi > 0;
  783. X}
  784. X
  785. X/* If you have moved since initially setting some occupations, they
  786. X * now shouldn't be able to restart.
  787. X *
  788. X * The basic rule is that if you are carrying it, you can continue
  789. X * since it is with you.  If you are acting on something at a distance,
  790. X * your orientation to it must have changed when you moved.
  791. X *
  792. X * The exception to this is taking off items, since they can be taken
  793. X * off in a number of ways in the intervening time, screwing up ordering.
  794. X *
  795. X *    Currently:    Take off all armor.
  796. X *            Picking Locks / Forcing Chests.
  797. X */
  798. Xvoid
  799. Xreset_occupations() {
  800. X
  801. X    reset_remarm();
  802. X    reset_pick();
  803. X}
  804. X
  805. X/* If a time is given, use it to timeout this function, otherwise the
  806. X * function times out by its own means.
  807. X */
  808. Xvoid
  809. Xset_occupation(fn, txt, xtime)
  810. Xint NDECL((*fn));
  811. Xconst char *txt;
  812. Xint xtime;
  813. X{
  814. X    if (xtime) {
  815. X        occupation = timed_occupation;
  816. X        timed_occ_fn = fn;
  817. X    } else
  818. X        occupation = fn;
  819. X    occtxt = txt;
  820. X    occtime = 0;
  821. X    return;
  822. X}
  823. X
  824. X#ifdef REDO
  825. X
  826. Xstatic char NDECL(popch);
  827. X
  828. X/* Provide a means to redo the last command.  The flag `in_doagain' is set
  829. X * to true while redoing the command.  This flag is tested in commands that
  830. X * require additional input (like `throw' which requires a thing and a
  831. X * direction), and the input prompt is not shown.  Also, while in_doagain is
  832. X * TRUE, no keystrokes can be saved into the saveq.
  833. X */
  834. X#define BSIZE 20
  835. Xstatic char pushq[BSIZE], saveq[BSIZE];
  836. Xstatic int NEARDATA phead, NEARDATA ptail, NEARDATA shead, NEARDATA stail;
  837. X
  838. Xstatic char
  839. Xpopch() {
  840. X    /* If occupied, return '\0', letting tgetch know a character should
  841. X     * be read from the keyboard.  If the character read is not the
  842. X     * ABORT character (as checked in pcmain.c), that character will be
  843. X     * pushed back on the pushq.
  844. X     */
  845. X    if (occupation) return '\0';
  846. X    if (in_doagain) return (shead != stail) ? saveq[stail++] : '\0';
  847. X    else        return (phead != ptail) ? pushq[ptail++] : '\0';
  848. X}
  849. X
  850. Xchar
  851. Xpgetchar() {        /* curtesy of aeb@cwi.nl */
  852. X    register int ch;
  853. X
  854. X    if(!(ch = popch()))
  855. X        ch = nhgetch();
  856. X    return(ch);
  857. X}
  858. X
  859. X/* A ch == 0 resets the pushq */
  860. Xvoid
  861. Xpushch(ch)
  862. Xchar ch;
  863. X{
  864. X    if (!ch)
  865. X        phead = ptail = 0;
  866. X    if (phead < BSIZE)
  867. X        pushq[phead++] = ch;
  868. X    return;
  869. X}
  870. X
  871. X/* A ch == 0 resets the saveq.    Only save keystrokes when not
  872. X * replaying a previous command.
  873. X */
  874. Xvoid
  875. Xsavech(ch)
  876. Xchar ch;
  877. X{
  878. X    if (!in_doagain) {
  879. X        if (!ch)
  880. X            phead = ptail = shead = stail = 0;
  881. X        else if (shead < BSIZE)
  882. X            saveq[shead++] = ch;
  883. X    }
  884. X    return;
  885. X}
  886. X#endif /* REDO */
  887. X
  888. X#endif /* OVL1 */
  889. X#ifdef OVLB
  890. X
  891. XSTATIC_PTR int
  892. Xdoextcmd()    /* here after # - now read a full-word command */
  893. X{
  894. X    char buf[BUFSZ];
  895. X    register const struct ext_func_tab *efp = extcmdlist;
  896. Xagain:
  897. X#ifdef COM_COMPL
  898. X    get_ext_cmd(buf);
  899. X#else
  900. X    getlin("#", buf);
  901. X#endif
  902. X    clear_nhwindow(WIN_MESSAGE);
  903. X    if(buf[0] == '\0' || buf[0] == '\033')
  904. X        return 0;
  905. X    if(buf[0] == '?') {
  906. X        (void) doextlist();
  907. X        goto again;
  908. X    }
  909. X    while(efp->ef_txt) {
  910. X        if(!strncmpi(efp->ef_txt, buf,BUFSIZ))
  911. X            return (*(efp->ef_funct))();
  912. X        efp++;
  913. X    }
  914. X    pline("%s: unknown extended command.", buf);
  915. X    return 0;
  916. X}
  917. X
  918. Xint
  919. Xdoextlist()    /* here after #? - now list all full-word commands */
  920. X{
  921. X    register const struct ext_func_tab *efp;
  922. X    char     buf[BUFSZ];
  923. X    winid datawin;
  924. X
  925. X    datawin = create_nhwindow(NHW_TEXT);
  926. X    putstr(datawin, 0, "");
  927. X    putstr(datawin, 0, "            Extended Commands List");
  928. X    putstr(datawin, 0, "");
  929. X#ifdef COM_COMPL
  930. X    putstr(datawin, 0, "    Press '#', then type (first letter only):");
  931. X#else
  932. X    putstr(datawin, 0, "    Press '#', then type:");
  933. X#endif
  934. X    putstr(datawin, 0, "");
  935. X
  936. X    for(efp = extcmdlist; efp->ef_txt; efp++) {
  937. X        Sprintf(buf, "    %-8s  - %s.", efp->ef_txt, efp->ef_desc);
  938. X        putstr(datawin, 0, buf);
  939. X    }
  940. X    display_nhwindow(datawin, FALSE);
  941. X    destroy_nhwindow(datawin);
  942. X    return 0;
  943. X}
  944. X
  945. X#ifdef POLYSELF
  946. XSTATIC_PTR int
  947. Xdomonability()
  948. X{
  949. X    if (can_breathe(uasmon)) return dobreathe();
  950. X    else if (attacktype(uasmon, AT_SPIT)) return dospit();
  951. X    else if (u.usym == S_NYMPH) return doremove();
  952. X    else if (u.usym == S_UMBER) return doconfuse();
  953. X    else if (is_were(uasmon)) return dosummon();
  954. X    else if (webmaker(uasmon)) return dospinweb();
  955. X    else if (is_hider(uasmon)) return dohide();
  956. X    else if(u.umonnum == PM_GREMLIN) {
  957. X        if(IS_FOUNTAIN(levl[u.ux][u.uy].typ)) {
  958. X        struct monst *mtmp;
  959. X        if ((mtmp = cloneu()) != 0) {
  960. X            mtmp->mhpmax = (u.mhmax /= 2);
  961. X            You("multiply.");
  962. X            dryup(u.ux,u.uy);
  963. X        }
  964. X        } else pline("There is no fountain here.");
  965. X    }
  966. X    else if (u.usym == S_UNICORN) {
  967. X        use_unicorn_horn((struct obj *)0);
  968. X        return 1;
  969. X    } else if (u.umonnum == PM_MIND_FLAYER) return domindblast();
  970. X    else if (uasmon->msound == MS_SHRIEK) {
  971. X        You("shriek.");
  972. X        aggravate();
  973. X    } else if (u.umonnum >= 0)
  974. X        pline("Any special ability you may have is purely reflexive.");
  975. X    else You("don't have a special ability!");
  976. X    return 0;
  977. X}
  978. X#endif
  979. X
  980. X#ifdef EXPLORE_MODE
  981. XSTATIC_PTR int
  982. Xenter_explore_mode()
  983. X{
  984. X    if(!discover && !wizard) {
  985. X        pline("Beware!  From discovery mode there will be no return to normal game.");
  986. X        if (yn("Do you want to enter discovery mode?") == 'y') {
  987. X            clear_nhwindow(WIN_MESSAGE);
  988. X            You("are now in non-scoring discovery mode.");
  989. X            discover = TRUE;
  990. X        }
  991. X        else {
  992. X            clear_nhwindow(WIN_MESSAGE);
  993. X            pline("Resuming normal game.");
  994. X        }
  995. X    }
  996. X    return 0;
  997. X}
  998. X#endif
  999. X
  1000. X#ifdef WIZARD
  1001. XSTATIC_PTR int
  1002. Xwiz_wish()    /* Unlimited wishes for debug mode by Paul Polderman */
  1003. X{
  1004. X    if (wizard) {
  1005. X        makewish();
  1006. X        (void) encumber_msg();
  1007. X    } else
  1008. X        pline("Unavailable command '^W'.");
  1009. X    return 0;
  1010. X}
  1011. X
  1012. XSTATIC_PTR int
  1013. Xwiz_identify()
  1014. X{
  1015. X    struct obj *obj;
  1016. X
  1017. X    if (!wizard)
  1018. X        pline("Unavailable command '^I'.");
  1019. X    else {
  1020. X        for (obj = invent; obj; obj = obj->nobj)
  1021. X            if (!objects[obj->otyp].oc_name_known || !obj->known
  1022. X                        || !obj->dknown || !obj->bknown)
  1023. X                (void) identify(obj);
  1024. X    }
  1025. X    return 0;
  1026. X}
  1027. X
  1028. XSTATIC_PTR int
  1029. Xwiz_map()
  1030. X{
  1031. X    if (wizard)    do_mapping();
  1032. X    else        pline("Unavailable command '^F'.");
  1033. X    return 0;
  1034. X}
  1035. X
  1036. XSTATIC_PTR int
  1037. Xwiz_genesis()
  1038. X{
  1039. X    if (wizard)    (void) create_particular();
  1040. X    else        pline("Unavailable command '^G'.");
  1041. X    return 0;
  1042. X}
  1043. X
  1044. XSTATIC_PTR int
  1045. Xwiz_where()
  1046. X{
  1047. X    if (wizard) print_dungeon();
  1048. X    else        pline("Unavailable command '^O'.");
  1049. X    return 0;
  1050. X}
  1051. X
  1052. XSTATIC_PTR int
  1053. Xwiz_detect()
  1054. X{
  1055. X    if(wizard)  (void) findit();
  1056. X    else        pline("Unavailable command '^E'.");
  1057. X    return 0;
  1058. X}
  1059. X
  1060. XSTATIC_PTR int
  1061. Xwiz_level_tele()
  1062. X{
  1063. X    if (wizard)    level_tele();
  1064. X    else        pline("Unavailable command '^V'.");
  1065. X    return 0;
  1066. X}
  1067. X
  1068. X#endif /* WIZARD */
  1069. X
  1070. X/* -enlightenment- */
  1071. Xstatic winid en_win;
  1072. Xstatic const char
  1073. X    *You_ = "You ",
  1074. X    *are  = "are ",  *were  = "were ",
  1075. X    *have = "have ", *had   = "had ",
  1076. X    *can  = "can ",  *could = "could ";
  1077. X
  1078. X#define enl_msg(prefix,present,past,suffix) \
  1079. X            enlght_line(prefix, final ? past : present, suffix)
  1080. X#define you_are(attr)    enl_msg(You_,are,were,attr)
  1081. X#define you_have(attr)    enl_msg(You_,have,had,attr)
  1082. X#define you_can(attr)    enl_msg(You_,can,could,attr)
  1083. X
  1084. Xstatic void
  1085. Xenlght_line(start, middle, end)
  1086. Xconst char *start, *middle, *end;
  1087. X{
  1088. X    char buf[BUFSZ];
  1089. X
  1090. X    Sprintf(buf, "%s%s%s.", start, middle, end);
  1091. X    putstr(en_win, 0, buf);
  1092. X}
  1093. X
  1094. Xvoid
  1095. Xenlightenment(final)
  1096. Xboolean final;
  1097. X{
  1098. X    int ltmp;
  1099. X    char buf[BUFSZ];
  1100. X
  1101. X    en_win = create_nhwindow(NHW_MENU);
  1102. X    putstr(en_win, 0, final ? "Final Attributes:" : "Current Attributes:");
  1103. X    putstr(en_win, 0, "");
  1104. X
  1105. X    /* note: piousness 20 matches MIN_QUEST_ALIGN (quest.h) */
  1106. X    if (u.ualign.record >= 20)    you_are("piously aligned");
  1107. X    else if (u.ualign.record > 13)    you_are("devoutly aligned");
  1108. X    else if (u.ualign.record > 8)    you_are("fervently aligned");
  1109. X    else if (u.ualign.record > 3)    you_are("stridently aligned");
  1110. X    else if (u.ualign.record == 3)    you_are("aligned");
  1111. X    else if (u.ualign.record > 0)    you_are("haltingly aligned");
  1112. X    else if (u.ualign.record == 0)    you_are("nominally aligned");
  1113. X    else if (u.ualign.record >= -3)    you_have("strayed");
  1114. X    else if (u.ualign.record >= -8)    you_have("sinned");
  1115. X    else you_have("transgressed");
  1116. X#ifdef WIZARD
  1117. X    if (wizard) {
  1118. X        Sprintf(buf, " %d", u.ualign.record);
  1119. X        enl_msg("Your alignment ", "is", "was", buf);
  1120. X    }
  1121. X#endif
  1122. X
  1123. X    if (Telepat) you_are("telepathic");
  1124. X    if (Searching) you_have("automatic searching");
  1125. X    if (Teleportation) you_can("teleport");
  1126. X    if (Teleport_control) you_have("teleport control");
  1127. X    if (See_invisible) enl_msg(You_, "see", "saw", " invisible");
  1128. X    if (Invisible) you_are("invisible");
  1129. X    else if (Invis) you_are("invisible to others");
  1130. X    if (Fast) you_are((Fast & ~INTRINSIC) ? "very fast" : "fast");
  1131. X    if (Stealth) you_are("stealthy");
  1132. X    if (Regeneration) enl_msg("You regenerate", "", "d", "");
  1133. X    if (Hunger) you_have("hunger");
  1134. X    if (Conflict) enl_msg("You cause", "", "d", " conflict");
  1135. X    if (Aggravate_monster) enl_msg("You aggravate", "", "d", " monsters");
  1136. X    if (Poison_resistance) you_are("poison resistant");
  1137. X    if (Fire_resistance) you_are("fire resistant");
  1138. X    if (Cold_resistance) you_are("cold resistant");
  1139. X    if (Shock_resistance) you_are("shock resistant");
  1140. X    if (Sleep_resistance) you_are("sleep resistant");
  1141. X    if (Disint_resistance) you_are("disintegration-resistant");
  1142. X    if (Protection_from_shape_changers)
  1143. X        you_are("protected from shape changers");
  1144. X#ifdef POLYSELF
  1145. X    if (Polymorph) you_are("polymorphing");
  1146. X    if (Polymorph_control) you_have("polymorph control");
  1147. X#endif
  1148. X    if (HHalluc_resistance)
  1149. X        enl_msg("You resist", "", "ed", " hallucinations");
  1150. X    if (final) {
  1151. X        if (Hallucination) you_are("hallucinating");
  1152. X        if (Stunned) you_are("stunned");
  1153. X        if (Confusion) you_are("confused");
  1154. X        if (Sick) you_are("sick");
  1155. X        if (Blinded) you_are("blinded");
  1156. X    }
  1157. X    if (Wounded_legs) {
  1158. X        Sprintf(buf, "wounded %s", makeplural(body_part(LEG)));
  1159. X        you_have(buf);
  1160. X    }
  1161. X    if (Glib) {
  1162. X        Sprintf(buf, "slippery %s", makeplural(body_part(FINGER)));
  1163. X        you_have(buf);
  1164. X    }
  1165. X    if (Strangled) you_are("being strangled");
  1166. X    if (Stoned) you_are("turning to stone");
  1167. X    if (Lifesaved)
  1168. X        enl_msg("Your life ", "will be", "would have been", " saved");
  1169. X    if (Adornment) you_are("adorned");
  1170. X    if (Warning) you_are("warned");
  1171. X    if (Protection) you_are("protected");
  1172. X    if (Reflecting) you_have("reflection");
  1173. X    if (Levitation) you_are("levitating");
  1174. X    if (Fumbling) enl_msg("You fumble", "", "d", "");
  1175. X    if (Jumping) you_can("jump");
  1176. X    if (Wwalking) you_can("walk on water");
  1177. X    if (Magical_breathing) you_can("survive without air");
  1178. X    if (Antimagic) you_are("magic-protected");
  1179. X    if (Displaced) you_are("displaced");
  1180. X    if (Clairvoyant) you_are("clairvoyant");
  1181. X#ifdef POLYSELF
  1182. X    if (u.ulycn != -1) {    
  1183. X        Strcpy(buf, an(mons[u.ulycn].mname));
  1184. X        you_are(buf);
  1185. X    }
  1186. X#endif
  1187. X    if (Luck) {
  1188. X        ltmp = abs((int)Luck);
  1189. X        Sprintf(buf, "%s%slucky",
  1190. X            ltmp >= 10 ? "extremely " : ltmp >= 5 ? "very " : "",
  1191. X            Luck < 0 ? "un" : "");
  1192. X#ifdef WIZARD
  1193. X        if (wizard) Sprintf(eos(buf), " (%d)", Luck);
  1194. X#endif
  1195. X        you_are(buf);
  1196. X    }
  1197. X#ifdef WIZARD
  1198. X     else if (wizard) enl_msg("Your luck ", "is", "was", " zero");
  1199. X#endif
  1200. X    ltmp = stone_luck(TRUE);
  1201. X    if (ltmp > 0) you_have("extra luck");
  1202. X    else if (ltmp < 0) you_have("reduced luck");
  1203. X    if (carrying(LUCKSTONE)) {
  1204. X        ltmp = stone_luck(FALSE);
  1205. X        if (ltmp <= 0)
  1206. X        enl_msg("Bad luck ", "does", "did", " not time out for you");
  1207. X        if (ltmp >= 0)
  1208. X        enl_msg("Good luck ", "does", "did", " not time out for you");
  1209. X    }
  1210. X
  1211. X    display_nhwindow(en_win, TRUE);
  1212. X    destroy_nhwindow(en_win);
  1213. X    return;
  1214. X}
  1215. X
  1216. X#if defined(WIZARD) || defined(EXPLORE_MODE)
  1217. XSTATIC_PTR int
  1218. Xwiz_attributes()
  1219. X{
  1220. X    if (wizard || discover)
  1221. X        enlightenment(FALSE);
  1222. X    else
  1223. X        pline("Unavailable command '^X'.");
  1224. X    return 0;
  1225. X}
  1226. X#endif /* WIZARD || EXPLORE_MODE */
  1227. X
  1228. X#endif /* OVLB */
  1229. X#ifdef OVL1
  1230. X
  1231. X#ifndef M
  1232. X# ifndef NHSTDC
  1233. X#  define M(c)        (0x80 | (c))
  1234. X# else
  1235. X#  define M(c)        ((c) - 128)
  1236. X# endif /* NHSTDC */
  1237. X#endif
  1238. X#ifndef C
  1239. X#define C(c)        (0x1f & (c))
  1240. X#endif
  1241. X
  1242. Xstatic const struct func_tab cmdlist[] = {
  1243. X    {C('d'), dokick},    /* "D" is for door!...? */
  1244. X#ifdef WIZARD
  1245. X    {C('e'), wiz_detect},
  1246. X    {C('f'), wiz_map},
  1247. X    {C('g'), wiz_genesis},
  1248. X    {C('i'), wiz_identify},
  1249. X#endif
  1250. X    {C('l'), doredraw}, /* if number_pad is set */
  1251. X#ifdef WIZARD
  1252. X    {C('o'), wiz_where},
  1253. X#endif
  1254. X    {C('p'), doprev_message},
  1255. X    {C('r'), doredraw},
  1256. X    {C('t'), dotele},
  1257. X#ifdef WIZARD
  1258. X    {C('v'), wiz_level_tele},
  1259. X    {C('w'), wiz_wish},
  1260. X#endif
  1261. X#if defined(WIZARD) || defined(EXPLORE_MODE)
  1262. X    {C('x'), wiz_attributes},
  1263. X#endif
  1264. X#ifdef SUSPEND
  1265. X    {C('z'), dosuspend},
  1266. X#endif
  1267. X    {'a', doapply},
  1268. X    {'A', doddoremarm},
  1269. X    {M('a'), doorganize},
  1270. X/*    'b', 'B' : go sw */
  1271. X    {'c', doclose},
  1272. X    {'C', do_mname},
  1273. X    {M('c'), dotalk},
  1274. X    {'d', dodrop},
  1275. X    {'D', doddrop},
  1276. X    {M('d'), dodip},
  1277. X    {'e', doeat},
  1278. X    {'E', doengrave},
  1279. X/* Soon to be
  1280. X    {'f', dofight, "fighting"},
  1281. X    {'F', doFight, "fighting"},
  1282. X */
  1283. X    {M('f'), doforce},
  1284. X/*    'g', 'G' : multiple go */
  1285. X/*    'h', 'H' : go west */
  1286. X    {'h', dohelp}, /* if number_pad is set */
  1287. X    {'i', ddoinv},
  1288. X    {'I', dotypeinv},        /* Robert Viduya */
  1289. X    {M('i'), doinvoke},
  1290. X/*    'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N' : move commands */
  1291. X    {'j', dojump}, /* if number_pad is on */
  1292. X    {M('j'), dojump},
  1293. X    {'k', dokick}, /* if number_pad is on */
  1294. X    {'l', doloot}, /* if number_pad is on */
  1295. X    {M('l'), doloot},
  1296. X/*    'n' prefixes a count if number_pad is on */
  1297. X#ifdef POLYSELF
  1298. X    {M('m'), domonability},
  1299. X#endif /* POLYSELF */
  1300. X    {'N', ddocall}, /* if number_pad is on */
  1301. X    {M('N'), ddocall},
  1302. X    {'o', doopen},
  1303. X    {'O', doset},
  1304. X    {M('o'), dosacrifice},
  1305. X    {'p', dopay},
  1306. X    {'P', doputon},
  1307. X    {M('p'), dopray},
  1308. X    {'q', dodrink},
  1309. X    {'Q', done2},
  1310. X    {'r', doread},
  1311. X    {'R', doremring},
  1312. X    {M('r'), dorub},
  1313. X    {'s', dosearch, "searching"},
  1314. X    {'S', dosave},
  1315. X    {M('s'), dosit},
  1316. X    {'t', dothrow},
  1317. X    {'T', dotakeoff},
  1318. X    {M('t'), doturn},
  1319. X/*    'u', 'U' : go ne */
  1320. X    {'u', dountrap}, /* if number_pad is on */
  1321. X    {M('u'), dountrap},
  1322. X    {'v', doversion},
  1323. X    {'V', dohistory},
  1324. X    {M('v'), doextversion},
  1325. X    {'w', dowield},
  1326. X    {'W', dowear},
  1327. X    {M('w'), dowipe},
  1328. X    {'x', dovspell},            /* Mike Stephenson */
  1329. X#ifdef EXPLORE_MODE
  1330. X    {'X', enter_explore_mode},
  1331. X#endif
  1332. X/*    'y', 'Y' : go nw */
  1333. X    {'z', dozap},
  1334. X    {'Z', docast},
  1335. X    {'<', doup},
  1336. X    {'>', dodown},
  1337. X    {'/', dowhatis},
  1338. X    {'&', dowhatdoes},
  1339. X    {'?', dohelp},
  1340. X#ifdef SHELL
  1341. X    {'!', dosh},
  1342. X#endif
  1343. X    {'.', donull, "waiting"},
  1344. X    {' ', donull, "waiting"},
  1345. X    {',', dopickup},
  1346. X    {':', dolook},
  1347. X    {';', doquickwhatis},
  1348. X    {'^', doidtrap},
  1349. X    {'\\', dodiscovered},        /* Robert Viduya */
  1350. X    {'@', dotogglepickup},
  1351. X    {WEAPON_SYM,  doprwep},
  1352. X    {ARMOR_SYM,  doprarm},
  1353. X    {RING_SYM,  doprring},
  1354. X    {AMULET_SYM, dopramulet},
  1355. X    {TOOL_SYM, doprtool},
  1356. X    {GOLD_SYM, doprgold},
  1357. X    {SPBOOK_SYM, dovspell},            /* Mike Stephenson */
  1358. X    {'#', doextcmd},
  1359. X    {0,0,0}
  1360. X};
  1361. X#undef M
  1362. X
  1363. Xconst struct ext_func_tab extcmdlist[] = {
  1364. X    {"adjust", "adjust inventory letters", doorganize},
  1365. X    {"chat", "talk to someone", dotalk},    /* converse? */
  1366. X    {"dip", "dip an object into something", dodip},
  1367. X    {"force", "force a lock", doforce},
  1368. X    {"invoke", "invoke an object's powers", doinvoke},
  1369. X    {"jump", "jump to a location", dojump},
  1370. X    {"loot", "loot a box on the floor", doloot},
  1371. X#ifdef POLYSELF
  1372. X    {"monster", "use a monster's special ability", domonability},
  1373. X#endif
  1374. X    {"name", "name an item or type of object", ddocall},
  1375. X    {"offer", "offer a sacrifice to the gods", dosacrifice},
  1376. X    {"pray", "pray to the gods for help", dopray},
  1377. X    {"rub", "rub a lamp", dorub},
  1378. X    {"sit", "sit down", dosit},
  1379. X    {"turn", "turn undead", doturn},
  1380. X    {"untrap", "untrap something", dountrap},
  1381. X    {"version", "list compile time options for this version of NetHack",
  1382. X        doextversion},
  1383. X#ifdef MAC
  1384. X    {"window", "clean up windows", SanePositions},
  1385. X#endif
  1386. X    {"wipe", "wipe off your face", dowipe},
  1387. X    {"?", "get this list of extended commands", doextlist},
  1388. X    {NULL, NULL, donull}
  1389. X};
  1390. X
  1391. X#define unctrl(c)    ((c) <= C('z') ? (0x60 | (c)) : (c))
  1392. X#define unmeta(c)    (0x7f & (c))
  1393. X
  1394. X
  1395. Xvoid
  1396. Xrhack(cmd)
  1397. Xregister char *cmd;
  1398. X{
  1399. X    register const struct func_tab *tlist = cmdlist;
  1400. X    boolean firsttime = FALSE;
  1401. X    register int res;
  1402. X
  1403. X    if(!cmd) {
  1404. X        firsttime = TRUE;
  1405. X        flags.nopick = 0;
  1406. X        cmd = parse();
  1407. X    }
  1408. X    if(*cmd == (char)033) {
  1409. X        flags.move = 0;
  1410. X        return;
  1411. X    }
  1412. X#ifdef REDO
  1413. X    if (*cmd == DOAGAIN && !in_doagain && saveq[0]) {
  1414. X        in_doagain = TRUE;
  1415. X        stail = 0;
  1416. X        rhack(NULL);    /* read and execute command */
  1417. X        in_doagain = FALSE;
  1418. X        return;
  1419. X    }
  1420. X    /* Special case of *cmd == ' ' handled better below */
  1421. X    if(!*cmd || *cmd == (char)0377) {
  1422. X#else
  1423. X    if(!*cmd || *cmd == (char)0377 ||
  1424. X       (!flags.rest_on_space && *cmd == ' ')) {
  1425. X#endif
  1426. X        nhbell();
  1427. X        flags.move = 0;
  1428. X        return;        /* probably we just had an interrupt */
  1429. X    }
  1430. X    if(movecmd(*cmd)) {
  1431. X    walk:
  1432. X        if(multi) flags.mv = 1;
  1433. X        domove();
  1434. X        return;
  1435. X    }
  1436. X    if(movecmd(flags.num_pad ? unmeta(*cmd) : lowc(*cmd))) {
  1437. X        flags.run = 1;
  1438. X    rush:
  1439. X        if(firsttime){
  1440. X            if(!multi) multi = COLNO;
  1441. X            u.last_str_turn = 0;
  1442. X        }
  1443. X        flags.mv = 1;
  1444. X        domove();
  1445. X        return;
  1446. X    }
  1447. X    if(*cmd == 'g' && movecmd(cmd[1])) {
  1448. X        flags.run = 2;
  1449. X        goto rush;
  1450. X    }
  1451. X    if (((*cmd == 'G' || (flags.num_pad && *cmd == '5')) &&
  1452. X        movecmd(lowc(cmd[1]))) || movecmd(unctrl(*cmd))) {
  1453. X        flags.run = 3;
  1454. X        goto rush;
  1455. X    }
  1456. X    if((*cmd == 'm' || (flags.num_pad && *cmd == '-')) &&
  1457. X        movecmd(cmd[1])) {
  1458. X        flags.run = 0;
  1459. X        flags.nopick = 1;
  1460. X        goto walk;
  1461. X    }
  1462. X    if(*cmd == 'M' && movecmd(lowc(cmd[1]))) {
  1463. X        flags.run = 1;
  1464. X        flags.nopick = 1;
  1465. X        goto rush;
  1466. X    }
  1467. X    if (flags.num_pad && *cmd == '0') {
  1468. X        (void)ddoinv();    /* A convenience borrowed from the PC */
  1469. X        flags.move = 0;
  1470. X        multi = 0;
  1471. X        return;
  1472. X    }
  1473. X    while(tlist->f_char) {
  1474. X        if((*cmd & 0xff) == (tlist->f_char & 0xff)){
  1475. X            /* Special case of *cmd == ' ' handled here */
  1476. X            if (*cmd == ' ' && !flags.rest_on_space)
  1477. X                break;
  1478. X
  1479. X            /* Now control-A can stop lengthy commands */
  1480. X            /* in the PC version only -- use ^C-N otherwise */
  1481. X            if (tlist->f_text && !occupation && multi)
  1482. X#ifdef GCC_WARN
  1483. X                set_occupation(tlist->f_funct,
  1484. X                        tlist->f_text, multi);
  1485. X#else
  1486. X                set_occupation(((struct func_tab *)tlist)->f_funct,
  1487. X                    tlist->f_text, multi);
  1488. X#endif
  1489. X            res = (*(tlist->f_funct))();
  1490. X            if(!res) {
  1491. X                flags.move = 0;
  1492. X                multi = 0;
  1493. X            }
  1494. X            return;
  1495. X        }
  1496. X        tlist++;
  1497. X    }
  1498. X    { char expcmd[10];
  1499. X      register char *cp = expcmd;
  1500. X      while(*cmd && cp-expcmd < sizeof(expcmd)-2) {
  1501. X        if(*cmd >= 040 && *cmd < 0177)
  1502. X            *cp++ = *cmd++;
  1503. X        else if (*cmd & 0200) {
  1504. X            *cp++ = 'M';
  1505. X            *cp++ = '-';
  1506. X            *cp++ = *cmd++ &=~ 0200;
  1507. X        }
  1508. X        else {
  1509. X            *cp++ = '^';
  1510. X            *cp++ = *cmd++ ^ 0100;
  1511. X        }
  1512. X      }
  1513. X      *cp = 0;
  1514. X      Norep("Unknown command '%s'.", expcmd);
  1515. X    }
  1516. X    multi = flags.move = 0;
  1517. X    return;
  1518. X}
  1519. X
  1520. Xint
  1521. Xxytod(x, y)    /* convert an x,y pair into a direction code */
  1522. Xschar x, y;
  1523. X{
  1524. X    register int dd;
  1525. X
  1526. X    for(dd = 0; dd < 8; dd++)
  1527. X        if(x == xdir[dd] && y == ydir[dd]) return dd;
  1528. X
  1529. X    return -1;
  1530. X}
  1531. X
  1532. X#ifdef WALKIES
  1533. Xvoid
  1534. Xdtoxy(cc,dd)    /* convert a direction code into an x,y pair */
  1535. Xcoord *cc;
  1536. Xregister int dd;
  1537. X{
  1538. X    cc->x = xdir[dd];
  1539. X    cc->y = ydir[dd];
  1540. X    return;
  1541. X}
  1542. X#endif /* WALKIES */
  1543. X
  1544. Xint
  1545. Xmovecmd(sym)    /* also sets u.dz, but returns false for <> */
  1546. Xchar sym;
  1547. X{
  1548. X    register const char *dp;
  1549. X    register const char *sdp = flags.num_pad ? ndir : sdir;
  1550. X
  1551. X    u.dz = 0;
  1552. X    if(!(dp = index(sdp, sym))) return 0;
  1553. X    u.dx = xdir[dp-sdp];
  1554. X    u.dy = ydir[dp-sdp];
  1555. X    u.dz = zdir[dp-sdp];
  1556. X#ifdef POLYSELF
  1557. X    if (u.dx && u.dy && u.umonnum == PM_GRID_BUG) {
  1558. X        u.dx = u.dy = 0;
  1559. X        return 0;
  1560. X    }
  1561. X#endif
  1562. X    return !u.dz;
  1563. X}
  1564. X
  1565. Xint
  1566. Xgetdir(s)
  1567. Xconst char *s;
  1568. X{
  1569. X    char dirsym;
  1570. X
  1571. X#ifdef REDO    
  1572. X    if(in_doagain)
  1573. X        dirsym = readchar();
  1574. X    else
  1575. X#endif
  1576. X        dirsym = yn_function (s ? s : "In what direction?", NULL, '\0');
  1577. X#ifdef REDO
  1578. X    savech(dirsym);
  1579. X#endif
  1580. X    if(dirsym == '.' || dirsym == 's')
  1581. X        u.dx = u.dy = u.dz = 0;
  1582. X    else if(!movecmd(dirsym) && !u.dz) {
  1583. X        if(!index(quitchars, dirsym))
  1584. X            pline("What a strange direction!");
  1585. X        return 0;
  1586. X    }
  1587. X    if(!u.dz && (Stunned || (Confusion && !rn2(5)))) confdir();
  1588. X    return 1;
  1589. X}
  1590. X
  1591. X#endif /* OVL1 */
  1592. X#ifdef OVLB
  1593. X
  1594. Xvoid
  1595. Xconfdir()
  1596. X{
  1597. X    register int x =
  1598. X#ifdef POLYSELF
  1599. X        (u.umonnum == PM_GRID_BUG) ? 2*rn2(4) :
  1600. X#endif
  1601. X                            rn2(8);
  1602. X    u.dx = xdir[x];
  1603. X    u.dy = ydir[x];
  1604. X    return;
  1605. X}
  1606. X
  1607. X#endif /* OVLB */
  1608. X#ifdef OVL0
  1609. X
  1610. Xint
  1611. Xisok(x,y)
  1612. Xregister int x, y;
  1613. X{
  1614. X    /* x corresponds to curx, so x==1 is the first column. Ach. %% */
  1615. X    return x >= 1 && x <= COLNO-1 && y >= 0 && y <= ROWNO-1;
  1616. X}
  1617. X
  1618. Xstatic int NEARDATA last_multi;
  1619. X
  1620. X/*
  1621. X * convert a MAP window position into a movecmd
  1622. X */
  1623. Xstatic int
  1624. Xclick_to_cmd(x, y, mod)
  1625. X    int x, y, mod;
  1626. X{
  1627. X    x -= u.ux;
  1628. X    y -= u.uy;
  1629. X    /* convert without using floating point, allowing sloppy clicking */
  1630. X    if(x > 2*abs(y))
  1631. X    x = 1, y = 0;
  1632. X    else if(y > 2*abs(x))
  1633. X    x = 0, y = 1;
  1634. X    else if(x < -2*abs(y))
  1635. X    x = -1, y = 0;
  1636. X    else if(y < -2*abs(x))
  1637. X    x = 0, y = -1;
  1638. X    else
  1639. X    x = sgn(x), y = sgn(y);
  1640. X
  1641. X    if(x == 0 && y == 0)    /* map click on player to "rest" command */
  1642. X    return '.';
  1643. X
  1644. X    x = xytod(x, y);
  1645. X    if(mod == CLICK_1) {
  1646. X    return (flags.num_pad ? ndir[x] : sdir[x]);
  1647. X    } else {
  1648. X    return (sdir[x] - 'a' + 'A'); /* run command */
  1649. X    }
  1650. X}
  1651. X
  1652. XSTATIC_OVL char *
  1653. Xparse()
  1654. X{
  1655. X#ifdef LINT    /* static char in_line[COLNO]; */
  1656. X    char in_line[COLNO];
  1657. X#else
  1658. X    static char in_line[COLNO];
  1659. X#endif
  1660. X    register int foo;
  1661. X    boolean prezero = FALSE;
  1662. X
  1663. X    multi = 0;
  1664. X    flags.move = 1;
  1665. X    flush_screen(1); /* Flush screen buffer. Put the cursor on the hero. */
  1666. X
  1667. X    if (!flags.num_pad || (foo = readchar()) == 'n')
  1668. X        for (;;) {
  1669. X        foo = readchar();
  1670. X        if (foo >= '0' && foo <= '9') {
  1671. X            multi = 10 * multi + foo - '0';
  1672. X            if (multi < 0 || multi > LARGEST_INT) multi = LARGEST_INT;
  1673. X            if (multi > 9) {
  1674. X            clear_nhwindow(WIN_MESSAGE);
  1675. X            Sprintf(in_line, "Count: %d", multi);
  1676. X            pline(in_line);
  1677. X            mark_synch();
  1678. X            }
  1679. X            last_multi = multi;
  1680. X            if (!multi && foo == '0') prezero = TRUE;
  1681. X        } else break;    /* not a digit */
  1682. X        }
  1683. X
  1684. X    if (foo == '\033') {   /* esc cancels count (TH) */
  1685. X        clear_nhwindow(WIN_MESSAGE);
  1686. X        multi = last_multi = 0;
  1687. X# ifdef REDO
  1688. X    } else if (foo == DOAGAIN || in_doagain) {
  1689. X        multi = last_multi;
  1690. X    } else {
  1691. X        last_multi = multi;
  1692. X        savech(0);    /* reset input queue */
  1693. X        savech((char)foo);
  1694. X# endif
  1695. X    }
  1696. X
  1697. X    if (multi) {
  1698. X        multi--;
  1699. X        save_cm = in_line;
  1700. X    } else {
  1701. X        save_cm = NULL;
  1702. X    }
  1703. X    in_line[0] = foo;
  1704. X    in_line[1] = '\0';
  1705. X    if (foo == 'g' || foo == 'G' || (flags.num_pad && foo == '5') ||
  1706. X        foo == 'm' || foo == 'M') {
  1707. X        foo = readchar();
  1708. X#ifdef REDO
  1709. X        savech((char)foo);
  1710. X#endif
  1711. X        in_line[1] = foo;
  1712. X        in_line[2] = 0;
  1713. X    }
  1714. X    clear_nhwindow(WIN_MESSAGE);
  1715. X    if (prezero) in_line[0] = '\033';
  1716. X    return(in_line);
  1717. X}
  1718. X
  1719. X#endif /* OVL0 */
  1720. X#ifdef OVLB
  1721. X
  1722. X#ifdef UNIX
  1723. Xstatic
  1724. Xvoid
  1725. Xend_of_input()
  1726. X{
  1727. X    exit_nhwindows("End of input?");
  1728. X#ifndef NOSAVEONHANGUP
  1729. X    if(!hu) {
  1730. X        hu = TRUE;
  1731. X        (void) dosave0();
  1732. X    }
  1733. X#endif
  1734. X    clearlocks();
  1735. X    terminate(0);
  1736. X}
  1737. X#endif
  1738. X
  1739. X#endif /* OVLB */
  1740. X#ifdef OVL0
  1741. X
  1742. Xchar
  1743. Xreadchar()
  1744. X{
  1745. X    register int sym;
  1746. X    int x, y, mod;
  1747. X
  1748. X#ifdef REDO
  1749. X    sym = in_doagain ? Getchar() : nh_poskey(&x, &y, &mod);
  1750. X#else
  1751. X    sym = Getchar();
  1752. X#endif
  1753. X
  1754. X#ifdef UNIX
  1755. X# ifdef NR_OF_EOFS
  1756. X    if (sym == EOF) {
  1757. X        register int cnt = NR_OF_EOFS;
  1758. X      /*
  1759. X       * Some SYSV systems seem to return EOFs for various reasons
  1760. X       * (?like when one hits break or for interrupted systemcalls?),
  1761. X       * and we must see several before we quit.
  1762. X       */
  1763. X        do {
  1764. X        clearerr(stdin);    /* omit if clearerr is undefined */
  1765. X        sym = Getchar();
  1766. X        } while (--cnt && sym == EOF);
  1767. X    }
  1768. X# endif /* NR_OF_EOFS */
  1769. X    if (sym == EOF)
  1770. X        end_of_input();
  1771. X#endif /* UNIX */
  1772. X
  1773. X    if(sym == 0) /* click event */
  1774. X        sym = click_to_cmd(x, y, mod);
  1775. X    return((char) sym);
  1776. X}
  1777. X#endif /* OVL0 */
  1778. X
  1779. X/*cmd.c*/
  1780. END_OF_FILE
  1781. if test 26575 -ne `wc -c <'src/cmd.c'`; then
  1782.     echo shar: \"'src/cmd.c'\" unpacked with wrong size!
  1783. fi
  1784. # end of 'src/cmd.c'
  1785. fi
  1786. if test -f 'src/rip.c' -a "${1}" != "-c" ; then 
  1787.   echo shar: Will not clobber existing file \"'src/rip.c'\"
  1788. else
  1789. echo shar: Extracting \"'src/rip.c'\" \(3321 characters\)
  1790. sed "s/^X//" >'src/rip.c' <<'END_OF_FILE'
  1791. X/*    SCCS Id: @(#)rip.c    3.1    91/08/05
  1792. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1793. X/* NetHack may be freely redistributed.  See license for details. */
  1794. X
  1795. X#include "hack.h"
  1796. X
  1797. Xstatic void FDECL(center, (int, char *));
  1798. X
  1799. Xextern const char *killed_by_prefix[];
  1800. X
  1801. Xstatic const char *rip_txt[] = {
  1802. X"                       ----------",
  1803. X"                      /          \\",
  1804. X"                     /    REST    \\",
  1805. X"                    /      IN      \\",
  1806. X"                   /     PEACE      \\",
  1807. X"                  /                  \\",
  1808. X"                  |                  |", /* Name of player */
  1809. X"                  |                  |", /* Amount of $ */
  1810. X"                  |                  |", /* Type of death */
  1811. X"                  |                  |", /* . */
  1812. X"                  |                  |", /* . */
  1813. X"                  |                  |", /* . */
  1814. X"                  |       1001       |", /* Real year of death */
  1815. X"                 *|     *  *  *      | *",
  1816. X"        _________)/\\\\_//(\\/(/\\)/\\//\\/|_)_______",
  1817. X0
  1818. X};
  1819. X
  1820. X#define STONE_LINE_CENT 28    /* char[] element of center of stone face */
  1821. X#define STONE_LINE_LEN 16    /* # chars that fit on one line
  1822. X                 * (note 1 ' ' border)
  1823. X                 */
  1824. X#define NAME_LINE 6        /* *char[] line # for player name */
  1825. X#define GOLD_LINE 7        /* *char[] line # for amount of gold */
  1826. X#define DEATH_LINE 8        /* *char[] line # for death description */
  1827. X#define YEAR_LINE 12        /* *char[] line # for year */
  1828. X
  1829. Xchar **rip;
  1830. X
  1831. Xstatic void
  1832. Xcenter(line, text)
  1833. Xint line;
  1834. Xchar *text;
  1835. X{
  1836. X    register char *ip,*op;
  1837. X    ip = text;
  1838. X    op = &rip[line][STONE_LINE_CENT - ((strlen(text)+1)>>1)];
  1839. X    while(*ip) *op++ = *ip++;
  1840. X}
  1841. X
  1842. Xvoid
  1843. Xoutrip(how, tmpwin)
  1844. Xint how;
  1845. Xwinid tmpwin;
  1846. X{
  1847. X    register char **dp;
  1848. X    register char *dpx;
  1849. X    char buf[BUFSZ];
  1850. X    register int x;
  1851. X    int line;
  1852. X
  1853. X    rip = dp = (char **) alloc(sizeof(rip_txt));
  1854. X    if (!dp) return;
  1855. X    for (x = 0; rip_txt[x]; x++) {
  1856. X        dp[x] = (char *) alloc((unsigned int)(strlen(rip_txt[x]) + 1));
  1857. X        if (!dp[x]) return;
  1858. X        Strcpy(dp[x], rip_txt[x]);
  1859. X    }
  1860. X    dp[x] = (char *)0;
  1861. X
  1862. X    /* Put name on stone */
  1863. X    Sprintf(buf, "%s", plname);
  1864. X    buf[STONE_LINE_LEN] = 0;
  1865. X    center(NAME_LINE, buf);
  1866. X
  1867. X    /* Put $ on stone */
  1868. X    Sprintf(buf, "%ld Au", u.ugold);
  1869. X    buf[STONE_LINE_LEN] = 0; /* It could be a *lot* of gold :-) */
  1870. X    center(GOLD_LINE, buf);
  1871. X
  1872. X    /* Put together death description */
  1873. X    switch (killer_format) {
  1874. X        default: impossible("bad killer format?");
  1875. X        case KILLED_BY_AN:
  1876. X            Strcpy(buf, killed_by_prefix[how]);
  1877. X            Strcat(buf, an(killer));
  1878. X            break;
  1879. X        case KILLED_BY:
  1880. X            Strcpy(buf, killed_by_prefix[how]);
  1881. X            Strcat(buf, killer);
  1882. X            break;
  1883. X        case NO_KILLER_PREFIX:
  1884. X            Strcpy(buf, killer);
  1885. X            break;
  1886. X    }
  1887. X
  1888. X    /* Put death type on stone */
  1889. X    for (line=DEATH_LINE, dpx = buf; line<YEAR_LINE; line++) {
  1890. X        register int i,i0;
  1891. X        char tmpchar;
  1892. X
  1893. X        if ( (i0=strlen(dpx)) > STONE_LINE_LEN) {
  1894. X                for(i = STONE_LINE_LEN;
  1895. X                    ((i0 > STONE_LINE_LEN) && i); i--)
  1896. X                    if(dpx[i] == ' ') i0 = i;
  1897. X                if(!i) i0 = STONE_LINE_LEN;
  1898. X        }
  1899. X        tmpchar = dpx[i0];
  1900. X        dpx[i0] = 0;
  1901. X        center(line, dpx);
  1902. X        if (tmpchar != ' ') {
  1903. X            dpx[i0] = tmpchar;
  1904. X            dpx= &dpx[i0];
  1905. X        } else  dpx= &dpx[i0+1];
  1906. X    }
  1907. X
  1908. X    /* Put year on stone */
  1909. X    Sprintf(buf, "%4d", getyear());
  1910. X    center(YEAR_LINE, buf);
  1911. X
  1912. X    putstr(tmpwin, 0, "");
  1913. X    for(; *dp; dp++)
  1914. X        putstr(tmpwin, 0, *dp);
  1915. X
  1916. X    putstr(tmpwin, 0, "");
  1917. X    putstr(tmpwin, 0, "");
  1918. X}
  1919. X
  1920. X/*rip.c*/
  1921. END_OF_FILE
  1922. if test 3321 -ne `wc -c <'src/rip.c'`; then
  1923.     echo shar: \"'src/rip.c'\" unpacked with wrong size!
  1924. fi
  1925. # end of 'src/rip.c'
  1926. fi
  1927. echo shar: End of archive 81 \(of 108\).
  1928. cp /dev/null ark81isdone
  1929. MISSING=""
  1930. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  1931. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  1932. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  1933. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  1934. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  1935. 101 102 103 104 105 106 107 108 ; do
  1936.     if test ! -f ark${I}isdone ; then
  1937.     MISSING="${MISSING} ${I}"
  1938.     fi
  1939. done
  1940. if test "${MISSING}" = "" ; then
  1941.     echo You have unpacked all 108 archives.
  1942.     echo "Now execute 'rebuild.sh'"
  1943.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  1944. else
  1945.     echo You still need to unpack the following archives:
  1946.     echo "        " ${MISSING}
  1947. fi
  1948. ##  End of shell archive.
  1949. exit 0
  1950.