home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / volume16 / nethck31 / part86 < prev    next >
Encoding:
Internet Message Format  |  1993-02-05  |  58.0 KB

  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: v16i094:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part86/108
  5. Message-ID: <4457@master.CNA.TEK.COM>
  6. Date: 5 Feb 93 19:21:58 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 2115
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1645
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 94
  14. Archive-name: nethack31/Part86
  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 86 (of 108)."
  27. # Contents:  dat/Tourist.des src/mkroom.c sys/amiga/wbprotos.h
  28. #   util/dgn_comp.y
  29. # Wrapped by billr@saab on Wed Jan 27 16:09:21 1993
  30. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  31. if test -f 'dat/Tourist.des' -a "${1}" != "-c" ; then 
  32.   echo shar: Will not clobber existing file \"'dat/Tourist.des'\"
  33. else
  34. echo shar: Extracting \"'dat/Tourist.des'\" \(17107 characters\)
  35. sed "s/^X//" >'dat/Tourist.des' <<'END_OF_FILE'
  36. X#    SCCS Id: @(#)Tourist.des    3.1    92/09/26
  37. X#    Copyright (c) 1989 by Jean-Christophe Collet
  38. X#    Copyright (c) 1991,92 by M. Stephenson, P. Winner
  39. X# NetHack may be freely redistributed.  See license for details.
  40. X#
  41. X#    The "start" level for the quest.
  42. X#
  43. X#    Here you meet your (besieged) class leader, Twoflower
  44. X#    and receive your quest assignment.
  45. X#
  46. XMAZE: "T-start",' '
  47. XFLAGS: noteleport,hardfloor
  48. XGEOMETRY:center,center
  49. XMAP
  50. X.......}}....---------..-------------------------------------------------...
  51. X........}}...|.......|..|.-------------------------------------------...|...
  52. X.........}}..|.......|..|.|......|......|.............|......|......|...|...
  53. X..........}}.|.......|..|.|......+......+.............+......+..\...|...|...
  54. X...........}}}..........|.|......|......|.............|......|......|...|...
  55. X.............}}.........|.|----S-|--S---|S----------S-|---S--|------|...|...
  56. X..............}}}.......|...............................................|...
  57. X................}}}.....----S------++--S----------S----------S-----------...
  58. X..................}}...........    ..    ...................................
  59. X......-------......}}}}........}}}}..}}}}..}}}}..}}}}.......................
  60. X......|.....|.......}}}}}}..}}}}   ..   }}}}..}}}}..}}}.....................
  61. X......|.....+...........}}}}}}........................}}}..}}}}..}}}..}}}...
  62. X......|.....|...........................................}}}}..}}}..}}}}.}}}}
  63. X......-------...............................................................
  64. X............................................................................
  65. X...-------......-------.....................................................
  66. X...|.....|......|.....|.....................................................
  67. X...|.....+......+.....|.....................................................
  68. X...|.....|......|.....|.....................................................
  69. X...-------......-------.....................................................
  70. XENDMAP
  71. X# Random Monsters
  72. XRANDOM_MONSTERS: 's', 'C'
  73. X# Dungeon Description
  74. XREGION:(00,00,75,19),lit,"ordinary"
  75. XREGION:(14,01,20,03),unlit,"morgue"
  76. XREGION:(07,10,11,12),unlit,"ordinary"
  77. XREGION:(04,16,08,18),unlit,"ordinary"
  78. XREGION:(17,16,21,18),unlit,"ordinary"
  79. XREGION:(27,02,32,04),unlit,"ordinary"
  80. XREGION:(34,02,39,04),unlit,"ordinary"
  81. XREGION:(41,02,53,04),unlit,"ordinary"
  82. XREGION:(55,02,60,04),unlit,"ordinary"
  83. XREGION:(62,02,67,04),lit,"ordinary"
  84. X# Stairs
  85. XSTAIR:(66,03),down
  86. X# Portal arrival point
  87. XBRANCH:(68,14,68,14),(0,0,0,0)
  88. X# Non diggable walls
  89. XNON_DIGGABLE:(00,00,75,19)
  90. X# Doors
  91. XDOOR:locked,(31,05)
  92. XDOOR:locked,(36,05)
  93. XDOOR:locked,(41,05)
  94. XDOOR:locked,(52,05)
  95. XDOOR:locked,(58,05)
  96. XDOOR:locked,(28,07)
  97. XDOOR:locked,(39,07)
  98. XDOOR:locked,(50,07)
  99. XDOOR:locked,(61,07)
  100. XDOOR:closed,(33,03)
  101. XDOOR:closed,(40,03)
  102. XDOOR:closed,(54,03)
  103. XDOOR:closed,(61,03)
  104. XDOOR:open,(12,11)
  105. XDOOR:open,(09,17)
  106. XDOOR:open,(16,17)
  107. XDOOR:locked,(35,07)
  108. XDOOR:locked,(36,07)
  109. X# Monsters on siege duty.
  110. XMONSTER: 's',"giant spider",random
  111. XMONSTER: 's',"giant spider",random
  112. XMONSTER: 's',"giant spider",random
  113. XMONSTER: 's',"giant spider",random
  114. XMONSTER: 's',"giant spider",random
  115. XMONSTER: 's',"giant spider",random
  116. XMONSTER: 's',"giant spider",random
  117. XMONSTER: 's',"giant spider",random
  118. XMONSTER: 's',"giant spider",random
  119. XMONSTER: 's',"giant spider",random
  120. XMONSTER: 's',"giant spider",random
  121. XMONSTER: 's',"giant spider",random
  122. XMONSTER: 's',random,random
  123. XMONSTER: 's',random,random
  124. XMONSTER: 'C',"forest centaur",random
  125. XMONSTER: 'C',"forest centaur",random
  126. XMONSTER: 'C',"forest centaur",random
  127. XMONSTER: 'C',"forest centaur",random
  128. XMONSTER: 'C',"forest centaur",random
  129. XMONSTER: 'C',"forest centaur",random
  130. XMONSTER: 'C',"forest centaur",random
  131. XMONSTER: 'C',"forest centaur",random
  132. XMONSTER: 'C',random,random
  133. X# Twoflower
  134. XMONSTER:'@',"Twoflower",(64,03)
  135. X# The treasure of Twoflower
  136. XOBJECT:'(',"chest",(64,03)
  137. X# guides for the audience chamber
  138. XMONSTER:'@',"guide",(29,03)
  139. XMONSTER:'@',"guide",(32,04)
  140. XMONSTER:'@',"guide",(35,02)
  141. XMONSTER:'@',"guide",(38,03)
  142. XMONSTER:'@',"guide",(45,03)
  143. XMONSTER:'@',"guide",(48,02)
  144. XMONSTER:'@',"guide",(49,04)
  145. XMONSTER:'@',"guide",(51,03)
  146. XMONSTER:'@',"guide",(57,03)
  147. XMONSTER:'@',"guide",(62,04)
  148. XMONSTER:'@',"guide",(66,04)
  149. X# path guards
  150. XMONSTER:'@',"watchman",(35,08)
  151. XMONSTER:'@',"watchman",(36,08)
  152. X# river monsters
  153. XMONSTER:';',"giant eel",(62,12)
  154. XMONSTER:';',"giant eel",(47,10)
  155. XMONSTER:';',"giant eel",(29,11)
  156. XMONSTER:';',"kraken",(34,09)
  157. XMONSTER:';',"kraken",(37,09)
  158. X# Random traps
  159. XTRAP:random,random
  160. XTRAP:random,random
  161. XTRAP:random,random
  162. XTRAP:random,random
  163. XTRAP:random,random
  164. XTRAP:random,random
  165. XTRAP:random,random
  166. XTRAP:random,random
  167. XTRAP:random,random
  168. X
  169. X#
  170. X#    The "locate" level for the quest.
  171. X#
  172. X#    Here you have to find the Thieves' Guild Hall to go
  173. X#    further towards your assigned quest.
  174. X#
  175. X
  176. XMAZE: "T-locate",' '
  177. XFLAGS: hardfloor
  178. XGEOMETRY:center,center
  179. XMAP
  180. X----------------------------------------------------------------------------
  181. X|....|......|..........|......|......|...|....|.....|......|...............|
  182. X|....|......|.|------|.|......|......|.|.|....|..}..|......|.|----------|..|
  183. X|....|--+----.|......|.|-S---+|+-----|.|.S....|.....|---+--|.|..........+..|
  184. X|....|........|......|.|...|.........|.|------|..............|..........|-+|
  185. X|....+...}}...+......|.|...|.|-----|.|..............|--+----------------|..|
  186. X|----|........|------|.|---|.|.....|......|-----+-|.|.......|...........|--|
  187. X|............................|.....|.|--+-|.......|.|.......|...........|..|
  188. X|----|.....|-------------|...|--+--|.|....|.......|.|-----------+-------|..|
  189. X|....+.....+.........S...|...........|....|-------|........................|
  190. X|....|.....|.........|...|.|---------|....|.........|-------|.|----------|.|
  191. X|....|.....|---------|---|.|......|..+....|-------|.|.......|.+......S.\.|.|
  192. X|....|.....+.........S...|.|......|..|....|.......|.|.......|.|......|...|.|
  193. X|-------|..|.........|---|.|+-------------------+-|.|.......+.|----------|.|
  194. X|.......+..|---------|.........|.........|..........|.......|.|..........|.|
  195. X|.......|..............|--+--|.|.........|.|----+-----------|.|..........|.|
  196. X|---------+-|--+-----|-|.....|.|.........|.|........|.|.....+.|..........+.|
  197. X|...........|........|.S.....|.|----+----|.|--------|.|.....|.|----------|.|
  198. X|...........|........|.|.....|........................|.....|..............|
  199. X----------------------------------------------------------------------------
  200. XENDMAP
  201. X# Random Monsters
  202. XRANDOM_MONSTERS: 's'
  203. X# Dungeon Description
  204. XREGION:(00,00,75,19),lit,"ordinary"
  205. XNON_DIGGABLE:(00,00,75,19)
  206. X#
  207. XREGION:(01,01,04,05),unlit,"morgue"
  208. XREGION:(15,03,20,05),lit,"shop"
  209. XREGION:(62,03,71,04),lit,"shop"
  210. XREGION:(01,17,11,18),lit,"barracks"
  211. XREGION:(12,09,20,10),lit,"barracks"
  212. XREGION:(53,11,59,14),lit,"zoo"
  213. XREGION:(63,14,72,16),lit,"barracks"
  214. XREGION:(32,14,40,16),lit,"temple"
  215. X#
  216. XREGION:(06,01,11,02),random,"ordinary"
  217. XREGION:(24,01,29,02),random,"ordinary"
  218. XREGION:(31,01,36,02),random,"ordinary"
  219. XREGION:(42,01,45,03),random,"ordinary"
  220. XREGION:(53,01,58,02),random,"ordinary"
  221. XREGION:(24,04,26,05),random,"ordinary"
  222. XREGION:(30,06,34,07),random,"ordinary"
  223. XREGION:(73,05,74,05),unlit,"ordinary"
  224. XREGION:(01,09,04,12),random,"ordinary"
  225. XREGION:(01,14,07,15),random,"ordinary"
  226. XREGION:(12,12,20,13),random,"ordinary"
  227. XREGION:(13,17,20,18),random,"ordinary"
  228. XREGION:(22,09,24,10),random,"ordinary"
  229. XREGION:(22,12,24,12),random,"ordinary"
  230. XREGION:(24,16,28,18),random,"ordinary"
  231. XREGION:(28,11,33,12),random,"ordinary"
  232. XREGION:(35,11,36,12),lit,"ordinary"
  233. XREGION:(38,08,41,12),random,"ordinary"
  234. XREGION:(43,07,49,08),random,"ordinary"
  235. XREGION:(43,12,49,12),random,"ordinary"
  236. XREGION:(44,16,51,16),random,"ordinary"
  237. XREGION:(53,06,59,07),random,"ordinary"
  238. XREGION:(61,06,71,07),random,"ordinary"
  239. XREGION:(55,16,59,18),random,"ordinary"
  240. XREGION:(63,11,68,12),random,"ordinary"
  241. XREGION:(70,11,72,12),random,"ordinary"
  242. X# Stairs
  243. XSTAIR:(10,04),up
  244. XSTAIR:(73,05),down
  245. X# Non diggable walls
  246. XNON_DIGGABLE:(00,00,75,19)
  247. XDOOR:closed,(05,05)
  248. XDOOR:closed,(05,09)
  249. XDOOR:closed,(08,14)
  250. XDOOR:closed,(08,03)
  251. XDOOR:closed,(11,09)
  252. XDOOR:closed,(11,12)
  253. XDOOR:closed,(10,16)
  254. XDOOR:closed,(14,05)
  255. XDOOR:closed,(15,16)
  256. XDOOR:locked,(21,09)
  257. XDOOR:locked,(21,12)
  258. XDOOR:closed,(23,17)
  259. XDOOR:closed,(25,03)
  260. XDOOR:closed,(26,15)
  261. XDOOR:closed,(29,03)
  262. XDOOR:closed,(28,13)
  263. XDOOR:closed,(31,03)
  264. XDOOR:closed,(32,08)
  265. XDOOR:closed,(37,11)
  266. XDOOR:closed,(36,17)
  267. XDOOR:locked,(41,03)
  268. XDOOR:closed,(40,07)
  269. XDOOR:closed,(48,06)
  270. XDOOR:closed,(48,13)
  271. XDOOR:closed,(48,15)
  272. XDOOR:closed,(56,03)
  273. XDOOR:closed,(55,05)
  274. XDOOR:closed,(72,03)
  275. XDOOR:locked,(74,04)
  276. XDOOR:closed,(64,08)
  277. XDOOR:closed,(62,11)
  278. XDOOR:closed,(69,11)
  279. XDOOR:closed,(60,13)
  280. XDOOR:closed,(60,16)
  281. XDOOR:closed,(73,16)
  282. X
  283. X# Objects
  284. XOBJECT:random,random,random
  285. XOBJECT:random,random,random
  286. XOBJECT:random,random,random
  287. XOBJECT:random,random,random
  288. XOBJECT:random,random,random
  289. XOBJECT:random,random,random
  290. XOBJECT:random,random,random
  291. XOBJECT:random,random,random
  292. XOBJECT:random,random,random
  293. XOBJECT:random,random,random
  294. XOBJECT:random,random,random
  295. XOBJECT:random,random,random
  296. XOBJECT:random,random,random
  297. XOBJECT:random,random,random
  298. X# Toilet paper
  299. XOBJECT:'?',"blank paper",(71,12)
  300. XOBJECT:'?',"blank paper",(71,12)
  301. X# Random traps
  302. XTRAP:random,random
  303. XTRAP:random,random
  304. XTRAP:random,random
  305. XTRAP:random,random
  306. XTRAP:random,random
  307. XTRAP:random,random
  308. XTRAP:random,random
  309. XTRAP:random,random
  310. XTRAP:random,random
  311. X# Random monsters.
  312. XMONSTER:'s',"giant spider",random
  313. XMONSTER:'s',"giant spider",random
  314. XMONSTER:'s',"giant spider",random
  315. XMONSTER:'s',"giant spider",random
  316. XMONSTER:'s',"giant spider",random
  317. XMONSTER:'s',"giant spider",random
  318. XMONSTER:'s',"giant spider",random
  319. XMONSTER:'s',"giant spider",random
  320. XMONSTER:'s',"giant spider",random
  321. XMONSTER:'s',"giant spider",random
  322. XMONSTER:'s',"giant spider",random
  323. XMONSTER:'s',"giant spider",random
  324. XMONSTER:'s',"giant spider",random
  325. XMONSTER:'s',"giant spider",random
  326. XMONSTER:'s',"giant spider",random
  327. XMONSTER:'s',"giant spider",random
  328. XMONSTER:'s',random,random
  329. XMONSTER:'s',random,random
  330. X
  331. X#
  332. X#    The "goal" level for the quest.
  333. X#
  334. X#    Here you meet the Master of Thieves your nemesis monster.  You have to
  335. X#    defeat the Master of Thieves in combat to gain the artifact you have
  336. X#    been assigned to retrieve.
  337. X#
  338. X
  339. XMAZE: "T-goal", ' '
  340. XGEOMETRY:center,center
  341. XMAP
  342. X----------------------------------------------------------------------------
  343. X|.........|.........|..........|..| |.................|........|........|..|
  344. X|.........|.........|..........|..| |....--------.....|........|........|..|
  345. X|------S--|--+-----------+------..| |....|......|.....|........|........|..|
  346. X|.........|.......................| |....|......+.....--+-------------+--..|
  347. X|.........|.......................| |....|......|..........................|
  348. X|-S-----S-|......----------.......| |....|......|..........................|
  349. X|..|..|...|......|........|.......| |....-----------.........----..........|
  350. X|..+..+...|......|........|.......| |....|.........|.........|}}|..........|
  351. X|..|..|...|......+........|.......| |....|.........+.........|}}|..........|
  352. X|..|..|...|......|........|.......S.S....|.........|.........----..........|
  353. X|---..----|......|........|.......| |....|.........|.......................|
  354. X|.........+......|+--+--+-|.......| |....-----------.......................|
  355. X|---..----|......|..|..|..|.......| |......................--------------..|
  356. X|..|..|...|......----------.......| |......................+............|..|
  357. X|..+..+...|.......................| |--.---...-----+-----..|............|..|
  358. X|--|..----|--+-----------+------..| |.....|...|.........|..|------------|..|
  359. X|..+..+...|.........|..........|..| |.....|...|.........|..+............|..|
  360. X|..|..|...|.........|..........|..| |.....|...|.........|..|............|..|
  361. X----------------------------------------------------------------------------
  362. XENDMAP
  363. X# Random Monsters
  364. XRANDOM_MONSTERS: 's'
  365. X# Dungeon Description
  366. XREGION:(00,00,75,19),lit,"ordinary"
  367. X# The Inn
  368. XREGION:(01,01,09,02),lit,"ordinary"
  369. XREGION:(01,04,09,05),lit,"barracks"
  370. XREGION:(01,07,02,10),unlit,"ordinary"
  371. XREGION:(07,07,09,10),unlit,"ordinary"
  372. XREGION:(01,14,02,15),unlit,"ordinary"
  373. XREGION:(07,14,09,15),unlit,"ordinary"
  374. XREGION:(01,17,02,18),unlit,"ordinary"
  375. XREGION:(07,17,09,18),unlit,"ordinary"
  376. X#
  377. XREGION:(11,01,19,02),unlit,"barracks"
  378. XREGION:(21,01,30,02),unlit,"ordinary"
  379. XREGION:(11,17,19,18),unlit,"barracks"
  380. XREGION:(21,17,30,18),unlit,"ordinary"
  381. X# Police Station
  382. XREGION:(18,07,25,11),lit,"ordinary"
  383. XREGION:(18,13,19,13),unlit,"ordinary"
  384. XREGION:(21,13,22,13),unlit,"ordinary"
  385. XREGION:(24,13,25,13),unlit,"ordinary"
  386. X# The town itself
  387. XREGION:(42,03,47,06),unlit,"ordinary"
  388. XREGION:(42,08,50,11),unlit,"ordinary"
  389. XREGION:(37,16,41,18),unlit,"morgue"
  390. XREGION:(47,16,55,18),unlit,"ordinary"
  391. XREGION:(55,01,62,03),unlit,"ordinary"
  392. XREGION:(64,01,71,03),unlit,"ordinary"
  393. XREGION:(60,14,71,15),lit,"shop"
  394. XREGION:(60,17,71,18),lit,"shop"
  395. X# Non diggable walls
  396. XNON_DIGGABLE:(00,00,75,19)
  397. X# Stairs
  398. XSTAIR:(70,08),up
  399. X# Doors
  400. XDOOR:locked,(07,03)
  401. XDOOR:locked,(02,06)
  402. XDOOR:locked,(08,06)
  403. XDOOR:closed,(03,08)
  404. XDOOR:closed,(06,08)
  405. XDOOR:open,(10,12)
  406. XDOOR:closed,(03,15)
  407. XDOOR:closed,(06,15)
  408. XDOOR:closed,(03,17)
  409. XDOOR:closed,(06,17)
  410. XDOOR:closed,(13,03)
  411. XDOOR:random,(25,03)
  412. XDOOR:closed,(13,16)
  413. XDOOR:random,(25,16)
  414. XDOOR:locked,(17,09)
  415. XDOOR:locked,(18,12)
  416. XDOOR:locked,(21,12)
  417. XDOOR:locked,(24,12)
  418. XDOOR:locked,(34,10)
  419. XDOOR:locked,(36,10)
  420. XDOOR:random,(48,04)
  421. XDOOR:random,(56,04)
  422. XDOOR:random,(70,04)
  423. XDOOR:random,(51,09)
  424. XDOOR:random,(51,15)
  425. XDOOR:open,(59,14)
  426. XDOOR:open,(59,17)
  427. X# Objects
  428. XOBJECT:'(',"credit card",(04,01),blessed,0,"The Platinum Yendorian Express Card"
  429. XOBJECT:random,random,random
  430. XOBJECT:random,random,random
  431. XOBJECT:random,random,random
  432. XOBJECT:random,random,random
  433. XOBJECT:random,random,random
  434. XOBJECT:random,random,random
  435. XOBJECT:random,random,random
  436. XOBJECT:random,random,random
  437. XOBJECT:random,random,random
  438. XOBJECT:random,random,random
  439. XOBJECT:random,random,random
  440. XOBJECT:random,random,random
  441. XOBJECT:random,random,random
  442. XOBJECT:random,random,random
  443. X# Random traps
  444. XTRAP:random,random
  445. XTRAP:random,random
  446. XTRAP:random,random
  447. XTRAP:random,random
  448. XTRAP:random,random
  449. XTRAP:random,random
  450. X# Random monsters.
  451. XMONSTER:'@',"Master of Thieves",(04,01),hostile
  452. XMONSTER:'s',"giant spider",random
  453. XMONSTER:'s',"giant spider",random
  454. XMONSTER:'s',"giant spider",random
  455. XMONSTER:'s',"giant spider",random
  456. XMONSTER:'s',"giant spider",random
  457. XMONSTER:'s',"giant spider",random
  458. XMONSTER:'s',"giant spider",random
  459. XMONSTER:'s',"giant spider",random
  460. XMONSTER:'s',"giant spider",random
  461. XMONSTER:'s',"giant spider",random
  462. XMONSTER:'s',"giant spider",random
  463. XMONSTER:'s',"giant spider",random
  464. XMONSTER:'s',"giant spider",random
  465. XMONSTER:'s',"giant spider",random
  466. XMONSTER:'s',"giant spider",random
  467. XMONSTER:'s',"giant spider",random
  468. XMONSTER:'s',random,random
  469. XMONSTER:'s',random,random
  470. X# ladies of the evening
  471. XMONSTER:'&',"succubus",(02,08)
  472. XMONSTER:'&',"succubus",(08,08)
  473. XMONSTER:'&',"incubus",(02,14)
  474. XMONSTER:'&',"incubus",(08,14)
  475. XMONSTER:'&',"incubus",(02,17)
  476. XMONSTER:'&',"incubus",(08,17)
  477. X# Police station (with drunken prisoners)
  478. XMONSTER:'K',"Kop Kaptain",(24,09),hostile
  479. XMONSTER:'K',"Kop Lieutenant",(20,09),hostile
  480. XMONSTER:'K',"Kop Lieutenant",(22,11),hostile
  481. XMONSTER:'K',"Kop Lieutenant",(22,07),hostile
  482. XMONSTER:'K',"Keystone Kop",(19,07),hostile
  483. XMONSTER:'K',"Keystone Kop",(19,08),hostile
  484. XMONSTER:'K',"Keystone Kop",(22,09),hostile
  485. XMONSTER:'K',"Keystone Kop",(24,11),hostile
  486. XMONSTER:'K',"Keystone Kop",(19,11),hostile
  487. XMONSTER:'@',"soldier",(19,13),hostile
  488. XMONSTER:'@',"soldier",(21,13),hostile
  489. XMONSTER:'@',"captain",(24,13),hostile
  490. X#
  491. XMONSTER:'@',"watchman",(33,10),hostile
  492. X
  493. XWALLIFY
  494. X
  495. X#
  496. X#    The "fill" level for the quest.
  497. X#
  498. X#    This level is used to fill out any levels not occupied by specific
  499. X#    levels as defined above.
  500. X#
  501. X
  502. XMAZE: "T-filla" , ' '
  503. XINIT_MAP: '.' , ' ', true, true, random, true
  504. XNOMAP
  505. X# Random Monsters
  506. XRANDOM_MONSTERS: 's', 'C'
  507. X#
  508. XSTAIR: random, up
  509. XSTAIR: random, down
  510. X#
  511. XOBJECT: random, random, random
  512. XOBJECT: random, random, random
  513. XOBJECT: random, random, random
  514. XOBJECT: random, random, random
  515. XOBJECT: random, random, random
  516. XOBJECT: random, random, random
  517. XOBJECT: random, random, random
  518. X#
  519. XTRAP: random, random
  520. XTRAP: random, random
  521. XTRAP: random, random
  522. XTRAP: random, random
  523. X#
  524. XMONSTER: '@', "soldier", random, hostile
  525. XMONSTER: '@', "soldier", random, hostile
  526. XMONSTER: '@', "soldier", random, hostile
  527. XMONSTER: '@', "soldier", random, hostile
  528. XMONSTER: '@', "soldier", random, hostile
  529. XMONSTER: 'H', random, random, hostile
  530. XMONSTER: 'C', random, random, hostile
  531. X
  532. XMAZE: "T-fillb" , ' '
  533. XINIT_MAP: '.' , ' ', true, true, random, true
  534. XNOMAP
  535. X# Random Monsters
  536. XRANDOM_MONSTERS: 's', 'C'
  537. X#
  538. XSTAIR: random, up
  539. XSTAIR: random, down
  540. X#
  541. XOBJECT: random, random, random
  542. XOBJECT: random, random, random
  543. XOBJECT: random, random, random
  544. XOBJECT: random, random, random
  545. XOBJECT: random, random, random
  546. XOBJECT: random, random, random
  547. XOBJECT: random, random, random
  548. XOBJECT: random, random, random
  549. XOBJECT: random, random, random
  550. XOBJECT: random, random, random
  551. XOBJECT: random, random, random
  552. X#
  553. XTRAP: random, random
  554. XTRAP: random, random
  555. XTRAP: random, random
  556. XTRAP: random, random
  557. X#
  558. XMONSTER: '@', "soldier", random, hostile
  559. XMONSTER: '@', "captain", random, hostile
  560. XMONSTER: '@', "captain", random, hostile
  561. XMONSTER: 'H', random, random, hostile
  562. XMONSTER: 'H', random, random, hostile
  563. XMONSTER: 'C', random, random, hostile
  564. XMONSTER: 's', random, random
  565. END_OF_FILE
  566. if test 17107 -ne `wc -c <'dat/Tourist.des'`; then
  567.     echo shar: \"'dat/Tourist.des'\" unpacked with wrong size!
  568. fi
  569. # end of 'dat/Tourist.des'
  570. fi
  571. if test -f 'src/mkroom.c' -a "${1}" != "-c" ; then 
  572.   echo shar: Will not clobber existing file \"'src/mkroom.c'\"
  573. else
  574. echo shar: Extracting \"'src/mkroom.c'\" \(16283 characters\)
  575. sed "s/^X//" >'src/mkroom.c' <<'END_OF_FILE'
  576. X/*    SCCS Id: @(#)mkroom.c    3.1    92/11/14    */
  577. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  578. X/* NetHack may be freely redistributed.  See license for details. */
  579. X
  580. X/*
  581. X * Entry points:
  582. X *    mkroom() -- make and stock a room of a given type
  583. X *    nexttodoor() -- return TRUE if adjacent to a door
  584. X *    has_dnstairs() -- return TRUE if given room has a down staircase
  585. X *    has_upstairs() -- return TRUE if given room has an up staircase
  586. X *    courtmon() -- generate a court monster
  587. X *    save_rooms() -- save rooms into file fd
  588. X *    rest_rooms() -- restore rooms from file fd
  589. X */
  590. X
  591. X#include "hack.h"
  592. X
  593. X#ifdef OVLB
  594. Xstatic boolean FDECL(isbig, (struct mkroom *));
  595. Xstatic struct mkroom * FDECL(pick_room,(BOOLEAN_P));
  596. Xstatic void NDECL(mkshop), FDECL(mkzoo,(int)), NDECL(mkswamp);
  597. Xstatic void NDECL(mktemple);
  598. Xstatic coord * FDECL(shrine_pos, (int));
  599. Xstatic struct permonst * NDECL(morguemon);
  600. X#ifdef ARMY
  601. Xstatic struct permonst * NDECL(squadmon);
  602. X#endif
  603. Xstatic void FDECL(save_room, (int,struct mkroom *));
  604. Xstatic void FDECL(rest_room, (int,struct mkroom *));
  605. X#endif /* OVLB */
  606. X
  607. X#define sq(x) ((x)*(x))
  608. X
  609. Xextern const struct shclass shtypes[];    /* defined in shknam.c */
  610. X
  611. X#ifdef OVLB
  612. X
  613. Xstatic boolean
  614. Xisbig(sroom)
  615. Xregister struct mkroom *sroom;
  616. X{
  617. X    register int area = (sroom->hx - sroom->lx + 1)
  618. X               * (sroom->hy - sroom->ly + 1);
  619. X    return( area > 20 );
  620. X}
  621. X
  622. Xvoid
  623. Xmkroom(roomtype)
  624. X/* make and stock a room of a given type */
  625. Xint    roomtype;
  626. X{
  627. X    if (roomtype >= SHOPBASE)
  628. X    mkshop();    /* someday, we should be able to specify shop type */
  629. X    else switch(roomtype) {
  630. X    case COURT:    mkzoo(COURT); break;
  631. X    case ZOO:    mkzoo(ZOO); break;
  632. X    case BEEHIVE:    mkzoo(BEEHIVE); break;
  633. X    case MORGUE:    mkzoo(MORGUE); break;
  634. X    case BARRACKS:    mkzoo(BARRACKS); break;
  635. X    case SWAMP:    mkswamp(); break;
  636. X    case TEMPLE:    mktemple(); break;
  637. X    default:    impossible("Tried to make a room of type %d.", roomtype);
  638. X    }
  639. X}
  640. X
  641. Xstatic void
  642. Xmkshop()
  643. X{
  644. X    register struct mkroom *sroom;
  645. X    int i = -1;
  646. X#ifdef WIZARD
  647. X# ifdef GCC_WARN
  648. X    register char *ep = (char *)0;
  649. X# else
  650. X    register char *ep;
  651. X# endif
  652. X
  653. X    /* first determine shoptype */
  654. X    if(wizard){
  655. X        ep = getenv("SHOPTYPE");
  656. X        if(ep){
  657. X            if(*ep == 'z' || *ep == 'Z'){
  658. X                mkzoo(ZOO);
  659. X                return;
  660. X            }
  661. X            if(*ep == 'm' || *ep == 'M'){
  662. X                mkzoo(MORGUE);
  663. X                return;
  664. X            }
  665. X            if(*ep == 'b' || *ep == 'B'){
  666. X                mkzoo(BEEHIVE);
  667. X                return;
  668. X            }
  669. X            if(*ep == 't' || *ep == 'T' || *ep == '\\'){
  670. X                mkzoo(COURT);
  671. X                return;
  672. X            }
  673. X#ifdef ARMY
  674. X            if(*ep == 's' || *ep == 'S'){
  675. X                mkzoo(BARRACKS);
  676. X                return;
  677. X            }
  678. X#endif /* ARMY */
  679. X            if(*ep == '_'){
  680. X                mktemple();
  681. X                return;
  682. X            }
  683. X            if(*ep == '}'){
  684. X                mkswamp();
  685. X                return;
  686. X            }
  687. X            for(i=0; shtypes[i].name; i++)
  688. X                if(*ep == def_oc_syms[shtypes[i].symb])
  689. X                    goto gottype;
  690. X            if(*ep == 'g' || *ep == 'G')
  691. X                i = 0;
  692. X            else
  693. X                i = -1;
  694. X        }
  695. X    }
  696. Xgottype:
  697. X#endif
  698. X    for(sroom = &rooms[0]; ; sroom++){
  699. X        if(sroom->hx < 0) return;
  700. X        if(sroom - rooms >= nroom) {
  701. X            pline("rooms not closed by -1?");
  702. X            return;
  703. X        }
  704. X        if(sroom->rtype != OROOM) continue;
  705. X        if(has_dnstairs(sroom) || has_upstairs(sroom))
  706. X            continue;
  707. X        if(
  708. X#ifdef WIZARD
  709. X           (wizard && ep && sroom->doorct != 0) ||
  710. X#endif
  711. X            sroom->doorct == 1) break;
  712. X    }
  713. X    if (!sroom->rlit) {
  714. X        int x, y;
  715. X
  716. X        for(x = sroom->lx - 1; x <= sroom->hx + 1; x++)
  717. X        for(y = sroom->ly - 1; y <= sroom->hy + 1; y++)
  718. X            levl[x][y].lit = 1;
  719. X        sroom->rlit = 1;
  720. X    }
  721. X
  722. X    if(i < 0) {            /* shoptype not yet determined */
  723. X        register int j;
  724. X
  725. X        /* pick a shop type at random */
  726. X        for (j = rnd(100), i = 0; (j -= shtypes[i].prob) > 0; i++)
  727. X        continue;
  728. X
  729. X        /* big rooms cannot be wand or book shops,
  730. X         * - so make them general stores
  731. X         */
  732. X        if(isbig(sroom) && (shtypes[i].symb == WAND_CLASS
  733. X                || shtypes[i].symb == SPBOOK_CLASS)) i = 0;
  734. X    }
  735. X    sroom->rtype = SHOPBASE + i;
  736. X
  737. X    /* set room bits before stocking the shop */
  738. X#ifdef SPECIALIZATION
  739. X    topologize(sroom, FALSE); /* doesn't matter - this is a special room */
  740. X#else
  741. X    topologize(sroom);
  742. X#endif
  743. X
  744. X    /* stock the room with a shopkeeper and artifacts */
  745. X    stock_room(i, sroom);
  746. X}
  747. X
  748. Xstatic struct mkroom *
  749. Xpick_room(strict)
  750. Xregister boolean strict;
  751. X/* pick an unused room, preferably with only one door */
  752. X{
  753. X    register struct mkroom *sroom;
  754. X    register int i = nroom;
  755. X
  756. X    for(sroom = &rooms[rn2(nroom)]; i--; sroom++) {
  757. X        if(sroom == &rooms[nroom])
  758. X            sroom = &rooms[0];
  759. X        if(sroom->hx < 0)
  760. X            return (struct mkroom *)0;
  761. X        if(sroom->rtype != OROOM)    continue;
  762. X        if(!strict) {
  763. X            if(has_upstairs(sroom) || (has_dnstairs(sroom) && rn2(3)))
  764. X            continue;
  765. X        } else if(has_upstairs(sroom) || has_dnstairs(sroom))
  766. X            continue;
  767. X        if(sroom->doorct == 1 || !rn2(5)
  768. X#ifdef WIZARD
  769. X                        || wizard
  770. X#endif
  771. X                            )
  772. X            return sroom;
  773. X    }
  774. X    return (struct mkroom *)0;
  775. X}
  776. X
  777. Xstatic void
  778. Xmkzoo(type)
  779. Xint type;
  780. X{
  781. X    register struct mkroom *sroom;
  782. X
  783. X    if ((sroom = pick_room(FALSE)) != 0) {
  784. X        sroom->rtype = type;
  785. X        fill_zoo(sroom);
  786. X    }
  787. X}
  788. X
  789. Xvoid
  790. Xfill_zoo(sroom)
  791. Xstruct mkroom *sroom;
  792. X{
  793. X    struct monst *mon;
  794. X    register int sx,sy,i;
  795. X    int sh, tx, ty, goldlim, type = sroom->rtype;
  796. X    int rmno = (sroom - rooms) + ROOMOFFSET;
  797. X    coord mm;
  798. X
  799. X#ifdef GCC_WARN
  800. X    tx = ty = goldlim = 0;
  801. X#endif
  802. X
  803. X    sh = sroom->fdoor;
  804. X    switch(type) {
  805. X        case COURT:
  806. X        if(level.flags.is_maze_lev) {
  807. X            for(tx = sroom->lx; tx <= sroom->hx; tx++)
  808. X            for(ty = sroom->ly; ty <= sroom->hy; ty++)
  809. X                if(IS_THRONE(levl[tx][ty].typ))
  810. X                goto throne_placed;
  811. X        }
  812. X        i = 100;
  813. X        do {    /* don't place throne on top of stairs */
  814. X            (void) somexy(sroom, &mm);
  815. X            tx = mm.x; ty = mm.y;
  816. X        } while (occupied((xchar)tx, (xchar)ty) && --i > 0);
  817. X        throne_placed:
  818. X        /* TODO: try to ensure the enthroned monster is an M2_PRINCE */
  819. X        break;
  820. X        case BEEHIVE:
  821. X        tx = sroom->lx + (sroom->hx - sroom->lx + 1)/2;
  822. X        ty = sroom->ly + (sroom->hy - sroom->ly + 1)/2;
  823. X        if(sroom->irregular) {
  824. X            /* center might not be valid, so put queen elsewhere */
  825. X            if(levl[tx][ty].roomno != rmno || levl[tx][ty].edge) {
  826. X            (void) somexy(sroom, &mm);
  827. X            tx = mm.x; ty = mm.y;
  828. X            }
  829. X        }
  830. X        break;
  831. X        case ZOO:
  832. X        goldlim = 500 * level_difficulty();
  833. X        break;
  834. X    }
  835. X    for(sx = sroom->lx; sx <= sroom->hx; sx++)
  836. X        for(sy = sroom->ly; sy <= sroom->hy; sy++) {
  837. X        if(sroom->irregular) {
  838. X            if(levl[sx][sy].roomno != rmno ||
  839. X               levl[sx][sy].edge ||
  840. X              (sroom->doorct &&
  841. X               distmin(sx, sy, doors[sh].x, doors[sh].y) <= 1))
  842. X            continue;
  843. X        } else if(!SPACE_POS(levl[sx][sy].typ) ||
  844. X              (sroom->doorct &&
  845. X               ((sx == sroom->lx && doors[sh].x == sx-1) ||
  846. X                (sx == sroom->hx && doors[sh].x == sx+1) ||
  847. X                (sy == sroom->ly && doors[sh].y == sy-1) ||
  848. X                (sy == sroom->hy && doors[sh].y == sy+1))))
  849. X            continue;
  850. X        /* don't place monster on explicitly placed throne */
  851. X        if(type == COURT && IS_THRONE(levl[sx][sy].typ))
  852. X            continue;
  853. X        mon = makemon(
  854. X            (type == COURT) ? courtmon() :
  855. X#ifdef ARMY
  856. X            (type == BARRACKS) ? squadmon() :
  857. X#endif
  858. X            (type == MORGUE) ? morguemon() :
  859. X            (type == BEEHIVE) ?
  860. X            (sx == tx && sy == ty ? &mons[PM_QUEEN_BEE] : 
  861. X             &mons[PM_KILLER_BEE]) :
  862. X            (struct permonst *) 0,
  863. X           sx, sy);
  864. X        if(mon) {
  865. X            mon->msleep = 1;
  866. X            if (type==COURT && mon->mpeaceful) {
  867. X                mon->mpeaceful = 0;
  868. X                set_malign(mon);
  869. X            }
  870. X        }
  871. X        switch(type) {
  872. X            case ZOO:
  873. X            if(sroom->doorct)
  874. X                i = sq(dist2(sx,sy,doors[sh].x,doors[sh].y));
  875. X            else
  876. X                i = goldlim;
  877. X            if(i >= goldlim) i = 5*level_difficulty();
  878. X            goldlim -= i;
  879. X            mkgold((long) rn1(i, 10), sx, sy);
  880. X            break;
  881. X            case MORGUE:
  882. X            if(!rn2(5))
  883. X                (void) mk_tt_object(CORPSE, sx, sy);
  884. X            if(!rn2(10))    /* lots of treasure buried with dead */
  885. X                (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST,
  886. X                         sx, sy, TRUE);
  887. X            break;
  888. X            case BEEHIVE:
  889. X            if(!rn2(3))
  890. X                (void) mksobj_at(LUMP_OF_ROYAL_JELLY, sx, sy, TRUE);
  891. X            break;
  892. X#ifdef ARMY
  893. X            case BARRACKS:
  894. X            if(!rn2(20))    /* the payroll and some loot */
  895. X                (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST,
  896. X                         sx, sy, TRUE);
  897. X            break;
  898. X#endif
  899. X        }
  900. X        }
  901. X    switch (type) {
  902. X          case COURT:
  903. X          levl[tx][ty].typ = THRONE;
  904. X          (void) somexy(sroom, &mm);
  905. X          mkgold((long) rn1(50 * level_difficulty(),10), mm.x, mm.y);
  906. X          (void) mksobj_at(CHEST, mm.x, mm.y, TRUE); /* the royal coffers */
  907. X          level.flags.has_court = 1;
  908. X          break;
  909. X#ifdef ARMY
  910. X          case BARRACKS:
  911. X          level.flags.has_barracks = 1;
  912. X          break;
  913. X#endif
  914. X          case ZOO:
  915. X          level.flags.has_zoo = 1;
  916. X          break;
  917. X          case MORGUE:
  918. X          level.flags.has_morgue = 1;
  919. X          break;
  920. X          case SWAMP:
  921. X          level.flags.has_swamp = 1;
  922. X          break;
  923. X          case BEEHIVE:
  924. X          level.flags.has_beehive = 1;
  925. X          break;
  926. X    }
  927. X}
  928. X
  929. Xvoid
  930. Xmkundead(mm)   /* make a swarm of undead around mm */
  931. Xcoord *mm;
  932. X{
  933. X    register int cnt = (level_difficulty() + 1)/10 + rnd(5);
  934. X    register struct permonst *mdat;
  935. X
  936. X    while(cnt--) {
  937. X          mdat = morguemon();
  938. X          if(enexto(mm, mm->x, mm->y, mdat))
  939. X           (void) makemon(mdat, mm->x, mm->y);
  940. X    }
  941. X}
  942. X
  943. Xstatic struct permonst *
  944. Xmorguemon()
  945. X{
  946. X    register int i = rn2(100), hd = rn2(level_difficulty());
  947. X
  948. X    if(hd > 10 && i < 10)
  949. X        return((Inhell || In_endgame(&u.uz)) ? 
  950. X                            mkclass(S_DEMON,0) : &mons[ndemon()]);
  951. X    if(hd > 8 && i > 85)
  952. X        return(mkclass(S_VAMPIRE,0));
  953. X
  954. X    return((i < 20) ? &mons[PM_GHOST]
  955. X            : (i < 40) ? &mons[PM_WRAITH] : mkclass(S_ZOMBIE,0));
  956. X}
  957. X
  958. Xstatic void
  959. Xmkswamp()    /* Michiel Huisjes & Fred de Wilde */
  960. X{
  961. X    register struct mkroom *sroom;
  962. X    register int sx,sy,i,eelct = 0;
  963. X
  964. X    for(i=0; i<5; i++) {        /* 5 tries */
  965. X        sroom = &rooms[rn2(nroom)];
  966. X        if(sroom->hx < 0 || sroom->rtype != OROOM ||
  967. X           has_upstairs(sroom) || has_dnstairs(sroom))
  968. X            continue;
  969. X
  970. X        /* satisfied; make a swamp */
  971. X        sroom->rtype = SWAMP;
  972. X        for(sx = sroom->lx; sx <= sroom->hx; sx++)
  973. X        for(sy = sroom->ly; sy <= sroom->hy; sy++)
  974. X        if(!OBJ_AT(sx, sy) &&
  975. X           !MON_AT(sx, sy) && !t_at(sx,sy) && !nexttodoor(sx,sy)) {
  976. X            if((sx+sy)%2) {
  977. X            levl[sx][sy].typ = POOL;
  978. X            if(!eelct || !rn2(4)) {
  979. X                /* mkclass() won't do, as we might get kraken */
  980. X                (void) makemon(rn2(5) ? &mons[PM_GIANT_EEL]
  981. X                          : &mons[PM_ELECTRIC_EEL],
  982. X                        sx, sy);
  983. X                eelct++;
  984. X            }
  985. X            } else 
  986. X            if(!rn2(4))    /* swamps tend to be moldy */
  987. X                (void) makemon(mkclass(S_FUNGUS,0), sx, sy);
  988. X        }
  989. X        level.flags.has_swamp = 1;
  990. X    }
  991. X}
  992. X
  993. Xstatic coord *
  994. Xshrine_pos(roomno)
  995. Xint roomno;
  996. X{
  997. X    static coord buf;
  998. X    struct mkroom *troom = &rooms[roomno - ROOMOFFSET];
  999. X
  1000. X    buf.x = troom->lx + ((troom->hx - troom->lx) / 2);
  1001. X    buf.y = troom->ly + ((troom->hy - troom->ly) / 2);
  1002. X    return(&buf);
  1003. X}
  1004. X
  1005. Xstatic void
  1006. Xmktemple()
  1007. X{
  1008. X    register struct mkroom *sroom;
  1009. X    coord *shrine_spot;
  1010. X    register struct rm *lev;
  1011. X
  1012. X    if(!(sroom = pick_room(TRUE))) return;
  1013. X
  1014. X    /* set up Priest and shrine */
  1015. X    sroom->rtype = TEMPLE;
  1016. X    /*
  1017. X     * In temples, shrines are blessed altars
  1018. X     * located in the center of the room
  1019. X     */
  1020. X    shrine_spot = shrine_pos((sroom - rooms) + ROOMOFFSET);
  1021. X    lev = &levl[shrine_spot->x][shrine_spot->y];
  1022. X    lev->typ = ALTAR;
  1023. X    lev->altarmask = induced_align(80);
  1024. X    priestini(&u.uz, sroom, shrine_spot->x, shrine_spot->y, FALSE);
  1025. X     lev->altarmask |= AM_SHRINE;
  1026. X    level.flags.has_temple = 1;
  1027. X}
  1028. X
  1029. Xboolean
  1030. Xnexttodoor(sx,sy)
  1031. Xregister int sx, sy;
  1032. X{
  1033. X    register int dx, dy;
  1034. X    register struct rm *lev;
  1035. X    for(dx = -1; dx <= 1; dx++) for(dy = -1; dy <= 1; dy++) {
  1036. X        if(!isok(sx+dx, sy+dy)) continue;
  1037. X        if(IS_DOOR((lev = &levl[sx+dx][sy+dy])->typ) ||
  1038. X            lev->typ == SDOOR)
  1039. X            return(TRUE);
  1040. X    }
  1041. X    return(FALSE);
  1042. X}
  1043. X
  1044. Xboolean
  1045. Xhas_dnstairs(sroom)
  1046. Xregister struct mkroom *sroom;
  1047. X{
  1048. X    if (sroom == dnstairs_room)
  1049. X        return TRUE;
  1050. X    if (sstairs.sx && !sstairs.up)
  1051. X        return sroom == sstairs_room;
  1052. X    return FALSE;
  1053. X}
  1054. X
  1055. Xboolean
  1056. Xhas_upstairs(sroom)
  1057. Xregister struct mkroom *sroom;
  1058. X{
  1059. X    if (sroom == upstairs_room)
  1060. X        return TRUE;
  1061. X    if (sstairs.sx && sstairs.up)
  1062. X        return sroom == sstairs_room;
  1063. X    return FALSE;
  1064. X}
  1065. X
  1066. X#endif /* OVLB */
  1067. X#ifdef OVL0
  1068. X
  1069. Xint
  1070. Xsomex(croom)
  1071. Xregister struct mkroom *croom;
  1072. X{
  1073. X    return rn2(croom->hx-croom->lx+1) + croom->lx;
  1074. X}
  1075. X
  1076. Xint
  1077. Xsomey(croom)
  1078. Xregister struct mkroom *croom;
  1079. X{
  1080. X    return rn2(croom->hy-croom->ly+1) + croom->ly;
  1081. X}
  1082. X
  1083. Xboolean
  1084. Xinside_room(croom, x, y)
  1085. Xstruct mkroom *croom;
  1086. Xxchar x, y;
  1087. X{
  1088. X    return (x >= croom->lx-1 && x <= croom->hx+1 &&
  1089. X        y >= croom->ly-1 && y <= croom->hy+1);
  1090. X}
  1091. X
  1092. Xboolean
  1093. Xsomexy(croom, c)
  1094. Xstruct mkroom *croom;
  1095. Xcoord *c;
  1096. X{
  1097. X    int try_cnt = 0;
  1098. X    int i;
  1099. X
  1100. X    if (croom->irregular) {
  1101. X        i = (croom - rooms) + ROOMOFFSET;
  1102. X
  1103. X        while(try_cnt++ < 100) {
  1104. X        c->x = somex(croom);
  1105. X        c->y = somey(croom);
  1106. X        if(!levl[c->x][c->y].edge && levl[c->x][c->y].roomno == i)
  1107. X            return TRUE;
  1108. X        }
  1109. X        /* try harder; exhaustively search until one is found */
  1110. X        for(c->x = croom->lx; c->x <= croom->hx; c->x++)
  1111. X        for(c->y = croom->ly; c->y <= croom->hy; c->y++)
  1112. X            if(!levl[c->x][c->y].edge && levl[c->x][c->y].roomno == i)
  1113. X            return TRUE;
  1114. X        return FALSE;
  1115. X    }
  1116. X
  1117. X    if (!croom->nsubrooms) {
  1118. X        c->x = somex(croom);
  1119. X        c->y = somey(croom);
  1120. X        return TRUE;
  1121. X    }
  1122. X
  1123. X    /* Check that coords doesn't fall into a subroom or into a wall */
  1124. X
  1125. X    while(try_cnt++ < 100) {
  1126. X        c->x = somex(croom);
  1127. X        c->y = somey(croom);
  1128. X        if (IS_WALL(levl[c->x][c->y].typ))
  1129. X            continue;
  1130. X        for(i=0 ; i<croom->nsubrooms;i++)
  1131. X            if(inside_room(croom->sbrooms[i], c->x, c->y))
  1132. X            goto you_lose;
  1133. X        break;
  1134. Xyou_lose:    ;
  1135. X    }
  1136. X    if (try_cnt >= 100)
  1137. X        return FALSE;
  1138. X    return TRUE;
  1139. X}
  1140. X
  1141. X/* 
  1142. X * Search for a special room given its type (zoo, court, etc...)
  1143. X *     Special values :
  1144. X *         - ANY_SHOP
  1145. X *         - ANY_TYPE
  1146. X */
  1147. X
  1148. Xstruct mkroom *
  1149. Xsearch_special(type)
  1150. Xschar type;
  1151. X{
  1152. X    register struct mkroom *croom;
  1153. X
  1154. X    for(croom = &rooms[0]; croom->hx >= 0; croom++)
  1155. X        if((type == ANY_TYPE && croom->rtype != OROOM) ||
  1156. X           (type == ANY_SHOP && croom->rtype >= SHOPBASE) ||
  1157. X           croom->rtype == type)
  1158. X        return croom;
  1159. X    for(croom = &subrooms[0]; croom->hx >= 0; croom++)
  1160. X        if((type == ANY_TYPE && croom->rtype != OROOM) ||
  1161. X           (type == ANY_SHOP && croom->rtype >= SHOPBASE) ||
  1162. X           croom->rtype == type)
  1163. X        return croom;
  1164. X    return (struct mkroom *) 0;
  1165. X}
  1166. X
  1167. X#endif /* OVL0 */
  1168. X#ifdef OVLB
  1169. X
  1170. Xstruct permonst *
  1171. Xcourtmon()
  1172. X{
  1173. X    int     i = rn2(60) + rn2(3*level_difficulty());
  1174. X    if (i > 100)        return(mkclass(S_DRAGON,0));
  1175. X    else if (i > 95)    return(mkclass(S_GIANT,0));
  1176. X    else if (i > 85)    return(mkclass(S_TROLL,0));
  1177. X    else if (i > 75)    return(mkclass(S_CENTAUR,0));
  1178. X    else if (i > 60)    return(mkclass(S_ORC,0));
  1179. X    else if (i > 45)    return(&mons[PM_BUGBEAR]);
  1180. X    else if (i > 30)    return(&mons[PM_HOBGOBLIN]);
  1181. X    else if (i > 15)    return(mkclass(S_GNOME,0));
  1182. X    else            return(mkclass(S_KOBOLD,0));
  1183. X}
  1184. X
  1185. X#ifdef ARMY
  1186. X#define        NSTYPES    (PM_CAPTAIN-PM_SOLDIER+1)
  1187. X
  1188. Xstatic struct {
  1189. X    unsigned    pm;
  1190. X    unsigned    prob;
  1191. X} squadprob[NSTYPES] = {
  1192. X    {PM_SOLDIER, 80}, {PM_SERGEANT, 15}, {PM_LIEUTENANT, 4}, {PM_CAPTAIN, 1}
  1193. X};
  1194. X
  1195. Xstatic struct permonst *
  1196. Xsquadmon() {        /* return soldier types. */
  1197. X
  1198. X    register struct permonst *ptr;
  1199. X    register int    i, cpro, sel_prob = rnd(80+level_difficulty());
  1200. X
  1201. X    for(cpro = i = 0; i < NSTYPES; i++)
  1202. X        if((cpro += squadprob[i].prob) > sel_prob) {
  1203. X
  1204. X        ptr = &mons[squadprob[i].pm];
  1205. X        goto gotone;
  1206. X        }
  1207. X    ptr = &mons[squadprob[rn2(NSTYPES)].pm];
  1208. Xgotone:
  1209. X    if(!(ptr->geno & (G_GENOD | G_EXTINCT)))  return(ptr);
  1210. X    else                return((struct permonst *) 0);
  1211. X}
  1212. X#endif /* ARMY /* */
  1213. X
  1214. X/* 
  1215. X * save_room : A recursive function that saves a room and its subrooms 
  1216. X * (if any).
  1217. X */
  1218. X
  1219. Xstatic void
  1220. Xsave_room(fd, r)
  1221. Xint    fd;
  1222. Xstruct mkroom *r;
  1223. X{
  1224. X    short i;
  1225. X    /* 
  1226. X     * Well, I really should write only useful informations instead
  1227. X     * of writing the whole structure. That is I should not write
  1228. X     * the subrooms pointers, but who cares ?
  1229. X     */
  1230. X    bwrite(fd, (genericptr_t) r, sizeof(struct mkroom));
  1231. X    for(i=0; i<r->nsubrooms; i++)
  1232. X        save_room(fd, r->sbrooms[i]);
  1233. X}
  1234. X
  1235. X/* 
  1236. X * save_rooms : Save all the rooms on disk!
  1237. X */
  1238. X
  1239. Xvoid
  1240. Xsave_rooms(fd)
  1241. Xint fd;
  1242. X{
  1243. X    short i;
  1244. X
  1245. X    /* First, write the number of rooms */
  1246. X    bwrite(fd, (genericptr_t) &nroom, sizeof(nroom));
  1247. X    for(i=0; i<nroom; i++)
  1248. X        save_room(fd, &rooms[i]);
  1249. X}
  1250. X
  1251. Xstatic void
  1252. Xrest_room(fd, r)
  1253. Xint fd;
  1254. Xstruct mkroom *r;
  1255. X{
  1256. X    short i;
  1257. X
  1258. X    mread(fd, (genericptr_t) r, sizeof(struct mkroom));
  1259. X    for(i=0; i<r->nsubrooms; i++) {
  1260. X        r->sbrooms[i] = &subrooms[nsubroom];
  1261. X        rest_room(fd, &subrooms[nsubroom++]);
  1262. X    }
  1263. X}
  1264. X
  1265. X/* 
  1266. X * rest_rooms : That's for restore rooms. Read the rooms structure from
  1267. X * the disk.
  1268. X */
  1269. X
  1270. Xvoid
  1271. Xrest_rooms(fd)
  1272. Xint    fd;
  1273. X{
  1274. X    short i;
  1275. X
  1276. X    mread(fd, (genericptr_t) &nroom, sizeof(nroom));
  1277. X    nsubroom = 0;
  1278. X    for(i = 0; i<nroom; i++) {
  1279. X        rest_room(fd, &rooms[i]);
  1280. X        rooms[i].resident = (struct monst *)0;
  1281. X    }
  1282. X    rooms[nroom].hx = -1;        /* restore ending flags */
  1283. X    subrooms[nsubroom].hx = -1;
  1284. X}
  1285. X#endif /* OVLB */
  1286. X
  1287. X/*mkroom.c*/
  1288. END_OF_FILE
  1289. if test 16283 -ne `wc -c <'src/mkroom.c'`; then
  1290.     echo shar: \"'src/mkroom.c'\" unpacked with wrong size!
  1291. fi
  1292. # end of 'src/mkroom.c'
  1293. fi
  1294. if test -f 'sys/amiga/wbprotos.h' -a "${1}" != "-c" ; then 
  1295.   echo shar: Will not clobber existing file \"'sys/amiga/wbprotos.h'\"
  1296. else
  1297. echo shar: Extracting \"'sys/amiga/wbprotos.h'\" \(4036 characters\)
  1298. sed "s/^X//" >'sys/amiga/wbprotos.h' <<'END_OF_FILE'
  1299. X/*    SCCS Id: @(#)wbprotos.h   3.1    93/01/08
  1300. X/* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1992, 1993.  */
  1301. X/* NetHack may be freely redistributed.  See license for details. */
  1302. X
  1303. X#ifdef __STDC__
  1304. X# define P(s) s
  1305. X#else
  1306. X# define P(s) ()
  1307. X#endif
  1308. X
  1309. X
  1310. X/* wb.c */
  1311. Xint main P(( int argc , struct WBStartup *argv ));
  1312. Xvoid CopyRight P(( void ));
  1313. Xvoid InitWB P(( int argc , struct WBStartup *wbs ));
  1314. Xvoid ReadConfig P(( void ));
  1315. Xvoid CloseDownWB P(( void ));
  1316. Xvoid SetupWB P(( void ));
  1317. Xvoid MapGadgets P(( int reason , int update ));
  1318. Xvoid ClearWindow P(( struct Window *win ));
  1319. Xvoid CalcLocs P(( int update ));
  1320. Xvoid text_requester P(( struct NewWindow *newwin , struct IntuiText *tlist ));
  1321. Xvoid getline P(( FILE *fp , long *offarr , int which , char *buf , int size ));
  1322. Xvoid help_requester P(( char *file ));
  1323. Xvoid do_closewindow P(( void ));
  1324. Xvoid do_menu P(( int mcode ));
  1325. Xvoid menu_discard P(( void ));
  1326. Xvoid menu_copyopt P(( void ));
  1327. Xvoid menu_rename P(( void ));
  1328. Xvoid run_game P(( GPTR gptr ));
  1329. Xvoid CleanUpLists P(( void ));
  1330. Xvoid CloseLibraries P(( void ));
  1331. Xvoid cleanup P(( int code ));
  1332. Xvoid SafeCloseWindow P(( struct Window *window ));
  1333. XGPTR AllocGITEM P(( void ));
  1334. Xvoid FreeGITEM P(( GPTR gptr ));
  1335. Xstruct DiskObject *AllocDObj P(( char *str ));
  1336. Xvoid FreeDObj P(( struct DiskObject *doptr ));
  1337. Xvoid LoadIcons P(( void ));
  1338. Xvoid menu_scores P(( void ));
  1339. Xvoid menu_recover P(( void ));
  1340. Xvoid menu_config P(( void ));
  1341. Xvoid menu_editdef P(( int newgame ));
  1342. Xvoid do_gadgetup P(( struct IntuiMessage *imsg ));
  1343. Xvoid do_buttons P(( struct IntuiMessage *imsg ));
  1344. Xvoid do_gadgetdown P(( struct IntuiMessage *imsg ));
  1345. Xint ask_request P(( char *str ));
  1346. Xvoid menu_setopt P(( void ));
  1347. Xvoid menu_info P(( void ));
  1348. Xint IsEditEntry P(( char *, GPTR ));
  1349. Xvoid menu_comment P(( void ));
  1350. Xvoid text_request P(( char *str , char *file ));
  1351. Xvoid errmsg P(( int flash , char *str, ... ));
  1352. Xvoid error P(( char *str ));
  1353. Xvoid SetGadgetUP P(( struct Gadget *gad ));
  1354. Xvoid SetGadgetDOWN P(( struct Gadget *gad ));
  1355. Xvoid UpdatePropGad P(( struct Window *win , struct Gadget *gad , long vis ,
  1356. X    long total , long top ));
  1357. Xvoid *xmalloc P(( unsigned nbytes ));
  1358. Xint DeleteGame P(( GPTR gptr ));
  1359. XGPTR FindGame P(( char *name ));
  1360. Xvoid setoneopt P(( int idx , char *str ));
  1361. Xchar *dirname P(( char *str ));
  1362. Xint StrRequest P(( char *prompt , char *buff , char *val ));
  1363. Xvoid LoadDefaults P(( char *player ));
  1364. Xvoid SaveDefaults P(( char *player ));
  1365. Xvoid CopyDefs2Gad P(( void ));
  1366. Xvoid CopyGad2Defs P(( void ));
  1367. Xvoid UpdateTypes P(( struct Window *cwin ));
  1368. Xvoid CheckOnly P(( struct Menu *menuptr , int menu , int itemno ));
  1369. Xint Ask P(( char *quest ));
  1370. Xchar *GameName P(( GPTR gptr , char *file ));
  1371. XGPTR GetWBIcon P(( BPTR lock , char *dir , struct FileInfoBlock *finfo ));
  1372. Xvoid SetBorder P(( struct Gadget *gd, int val ));
  1373. XGPTR NeedGame P(( void ));
  1374. Xvoid ChgGameItems P(( struct Menu *menup , int enable ));
  1375. Xvoid ChgNewGameItems P(( struct Menu *menup , int enable ));
  1376. Xint EditOptions P(( OPTR optr ));
  1377. Xstruct Gadget *FindGadget P(( struct Window *window ,
  1378. X    struct NewWindow *newwindow , int id ));
  1379. Xvoid ZapOptions P(( OPTR optr ));
  1380. Xvoid CopyOptions P(( OPTR optr , GPTR gptr ));
  1381. Xvoid CopyOptionStr P(( OPTR optr , char *str ));
  1382. Xvoid SetOptions P(( OPTR optr , GPTR gptr ));
  1383. Xvoid PutOptions P(( OPTR optr ));
  1384. Xchar *ToolsEntry P(( GPTR gptr , char *name ));
  1385. Xvoid ReallocTools P(( GPTR gptr, int ));
  1386. Xvoid FreeTools P(( GPTR gptr ));
  1387. Xvoid SetToolLine P(( GPTR gptr , char *name , char *value ));
  1388. Xvoid WriteDObj P(( GPTR gptr , long lock ));
  1389. Xvoid UpdateGameIcon P(( GPTR gptr ));
  1390. Xchar *Strdup P(( char *str ));
  1391. Xvoid Game2Defs P(( GPTR gptr ));
  1392. Xint CheckAndCopy P(( char *, char * ));
  1393. Xvoid ClearDelGames P(( void ));
  1394. Xint FindChecked P(( register struct Menu *menuptr, register int menu ));
  1395. Xvoid RPText P(( struct RastPort *rp, register char *s ));
  1396. X#ifdef  INTUI_NEW_LOOK
  1397. Xstruct Window *MyOpenWindow P(( struct ExtNewWindow *nw ));
  1398. X#else
  1399. Xstruct Window *MyOpenWindow P(( struct NewWindow *nw ));
  1400. X#endif
  1401. Xvoid SetUpMenus( register struct Menu *mp, register struct Screen *scrn );
  1402. X
  1403. X#undef P
  1404. END_OF_FILE
  1405. if test 4036 -ne `wc -c <'sys/amiga/wbprotos.h'`; then
  1406.     echo shar: \"'sys/amiga/wbprotos.h'\" unpacked with wrong size!
  1407. fi
  1408. # end of 'sys/amiga/wbprotos.h'
  1409. fi
  1410. if test -f 'util/dgn_comp.y' -a "${1}" != "-c" ; then 
  1411.   echo shar: Will not clobber existing file \"'util/dgn_comp.y'\"
  1412. else
  1413. echo shar: Extracting \"'util/dgn_comp.y'\" \(16306 characters\)
  1414. sed "s/^X//" >'util/dgn_comp.y' <<'END_OF_FILE'
  1415. X%{
  1416. X/*    SCCS Id: @(#)dgn_comp.c    3.1    93/01/17    */
  1417. X/*    Copyright (c) 1989 by Jean-Christophe Collet */
  1418. X/*    Copyright (c) 1990 by M. Stephenson                  */
  1419. X/* NetHack may be freely redistributed.  See license for details. */
  1420. X
  1421. X/*
  1422. X * This file contains the Dungeon Compiler code
  1423. X */
  1424. X
  1425. X/* In case we're using bison in AIX.  This definition must be
  1426. X * placed before any other C-language construct in the file
  1427. X * excluding comments and preprocessor directives (thanks IBM
  1428. X * for this wonderful feature...).
  1429. X *
  1430. X * Note: some cpps barf on this 'undefined control' (#pragma).
  1431. X * Addition of the leading space seems to prevent barfage for now,
  1432. X * and AIX will still see the directive in its non-standard locale.
  1433. X */
  1434. X
  1435. X#ifdef _AIX
  1436. X #pragma alloca        /* keep leading space! */
  1437. X#endif
  1438. X
  1439. X#include "config.h"
  1440. X#include "dgn_file.h"
  1441. X
  1442. Xvoid FDECL(yyerror, (char *));
  1443. Xvoid FDECL(yywarning, (char *));
  1444. Xint NDECL(yylex);
  1445. Xint NDECL(yyparse);
  1446. Xint FDECL(getchain, (char *));
  1447. Xint NDECL(check_dungeon);
  1448. Xint NDECL(check_branch);
  1449. Xint NDECL(check_level);
  1450. Xvoid NDECL(init_dungeon);
  1451. Xvoid NDECL(init_branch);
  1452. Xvoid NDECL(init_level);
  1453. Xvoid NDECL(output_dgn);
  1454. X
  1455. X#ifdef AMIGA
  1456. X# undef    printf
  1457. X#ifndef    LATTICE
  1458. X# define    memset(addr,val,len)    setmem(addr,len,val)
  1459. X#endif
  1460. X#endif
  1461. X
  1462. X#ifdef MICRO
  1463. X# undef exit
  1464. Xextern void FDECL(exit, (int));
  1465. X#endif
  1466. X
  1467. X#undef NULL
  1468. X
  1469. X#define ERR        (-1)
  1470. X
  1471. Xstatic struct couple couple;
  1472. Xstatic struct tmpdungeon tmpdungeon[MAXDUNGEON];
  1473. Xstatic struct tmplevel tmplevel[LEV_LIMIT];
  1474. Xstatic struct tmpbranch tmpbranch[BRANCH_LIMIT];
  1475. X
  1476. Xstatic int in_dungeon = 0, n_dgns = -1, n_levs = -1, n_brs = -1;
  1477. X
  1478. Xextern int fatal_error;
  1479. Xextern char* fname;
  1480. X
  1481. X%}
  1482. X
  1483. X%union
  1484. X{
  1485. X    int    i;
  1486. X    char*    str;
  1487. X}
  1488. X
  1489. X%token    <i>    INTEGER
  1490. X%token    <i>    A_DUNGEON BRANCH CHBRANCH LEVEL RNDLEVEL CHLEVEL RNDCHLEVEL
  1491. X%token    <i>    UP_OR_DOWN PROTOFILE DESCRIPTION DESCRIPTOR LEVELDESC
  1492. X%token    <i>    ALIGNMENT LEVALIGN ENTRY STAIR NO_UP NO_DOWN PORTAL
  1493. X%token    <str>    STRING
  1494. X%type   <i>    optional_int direction branch_type
  1495. X%start    file
  1496. X
  1497. X%%
  1498. Xfile        : /* nothing */
  1499. X        | dungeons
  1500. X          {
  1501. X            output_dgn();
  1502. X          }
  1503. X        ;
  1504. X
  1505. Xdungeons    : dungeon
  1506. X        | dungeons dungeon
  1507. X        ;
  1508. X
  1509. Xdungeon        : dungeonline
  1510. X        | dungeondesc
  1511. X        | branches
  1512. X        | levels
  1513. X        ;
  1514. X
  1515. Xdungeonline    : A_DUNGEON ':' STRING STRING rcouple optional_int
  1516. X          {
  1517. X            init_dungeon();
  1518. X            strcpy(tmpdungeon[n_dgns].name, $3);
  1519. X            if (!strcmp($4, "none"))
  1520. X                tmpdungeon[n_levs].boneschar = '\0';
  1521. X            else if ($4[1])
  1522. X                yyerror("Bones marker must be a single char, or \"none\"!");
  1523. X            else
  1524. X                tmpdungeon[n_dgns].boneschar = $4[0];
  1525. X            tmpdungeon[n_dgns].lev.base = couple.base;
  1526. X            tmpdungeon[n_dgns].lev.rand = couple.rand;
  1527. X            tmpdungeon[n_dgns].chance = $6;
  1528. X          }
  1529. X        ;
  1530. X
  1531. Xoptional_int    : /* nothing */
  1532. X          {
  1533. X            $$ = 0;
  1534. X          }
  1535. X        | INTEGER
  1536. X          {
  1537. X            $$ = $1;
  1538. X          }
  1539. X        ;
  1540. X
  1541. Xdungeondesc    : entry
  1542. X        | descriptions
  1543. X        | prototype
  1544. X        ;
  1545. X
  1546. Xentry        : ENTRY ':' INTEGER
  1547. X          {
  1548. X            tmpdungeon[n_dgns].entry_lev = $3;
  1549. X          }
  1550. X        ;
  1551. X
  1552. Xdescriptions    : desc
  1553. X        ;
  1554. X
  1555. Xdesc        : DESCRIPTION ':' DESCRIPTOR
  1556. X          {
  1557. X            if($<i>3 <= TOWN || $<i>3 >= D_ALIGN_CHAOTIC)
  1558. X                yyerror("Illegal description - ignoring!");
  1559. X            else
  1560. X                tmpdungeon[n_dgns].flags |= $<i>3 ;
  1561. X          }
  1562. X        | ALIGNMENT ':' DESCRIPTOR
  1563. X          {
  1564. X            if($<i>3 && $<i>3 < D_ALIGN_CHAOTIC)
  1565. X                yyerror("Illegal alignment - ignoring!");
  1566. X            else
  1567. X                tmpdungeon[n_dgns].flags |= $<i>3 ;
  1568. X          }
  1569. X        ;
  1570. X
  1571. Xprototype    : PROTOFILE ':' STRING
  1572. X          {
  1573. X            strcpy(tmpdungeon[n_dgns].protoname, $3);
  1574. X          }
  1575. X        ;
  1576. X
  1577. Xlevels        : level1
  1578. X        | level2
  1579. X        | levdesc
  1580. X        | chlevel1
  1581. X        | chlevel2
  1582. X        ;
  1583. X
  1584. Xlevel1        : LEVEL ':' STRING STRING '@' acouple
  1585. X          {
  1586. X            init_level();
  1587. X            strcpy(tmplevel[n_levs].name, $3);
  1588. X            if (!strcmp($4, "none"))
  1589. X                tmplevel[n_levs].boneschar = '\0';
  1590. X            else if ($4[1])
  1591. X                yyerror("Bones marker must be a single char, or \"none\"!");
  1592. X            else
  1593. X                tmplevel[n_levs].boneschar = $4[0];
  1594. X            tmplevel[n_levs].lev.base = couple.base;
  1595. X            tmplevel[n_levs].lev.rand = couple.rand;
  1596. X            tmpdungeon[n_dgns].levels++;
  1597. X          }
  1598. X        | RNDLEVEL ':' STRING STRING '@' acouple INTEGER
  1599. X          {
  1600. X            init_level();
  1601. X            strcpy(tmplevel[n_levs].name, $3);
  1602. X            if (!strcmp($4, "none"))
  1603. X                tmplevel[n_levs].boneschar = '\0';
  1604. X            else if ($4[1])
  1605. X                yyerror("Bones marker must be a single char, or \"none\"!");
  1606. X            else
  1607. X                tmplevel[n_levs].boneschar = $4[0];
  1608. X            tmplevel[n_levs].lev.base = couple.base;
  1609. X            tmplevel[n_levs].lev.rand = couple.rand;
  1610. X            tmplevel[n_levs].rndlevs = $7;
  1611. X            tmpdungeon[n_dgns].levels++;
  1612. X          }
  1613. X        ;
  1614. X
  1615. Xlevel2        : LEVEL ':' STRING STRING '@' acouple INTEGER
  1616. X          {
  1617. X            init_level();
  1618. X            strcpy(tmplevel[n_levs].name, $3);
  1619. X            if (!strcmp($4, "none"))
  1620. X                tmplevel[n_levs].boneschar = '\0';
  1621. X            else if ($4[1])
  1622. X                yyerror("Bones marker must be a single char, or \"none\"!");
  1623. X            else
  1624. X                tmplevel[n_levs].boneschar = $4[0];
  1625. X            tmplevel[n_levs].lev.base = couple.base;
  1626. X            tmplevel[n_levs].lev.rand = couple.rand;
  1627. X            tmplevel[n_levs].chance = $7;
  1628. X            tmpdungeon[n_dgns].levels++;
  1629. X          }
  1630. X        | RNDLEVEL ':' STRING STRING '@' acouple INTEGER INTEGER
  1631. X          {
  1632. X            init_level();
  1633. X            strcpy(tmplevel[n_levs].name, $3);
  1634. X            if (!strcmp($4, "none"))
  1635. X                tmplevel[n_levs].boneschar = '\0';
  1636. X            else if ($4[1])
  1637. X                yyerror("Bones marker must be a single char, or \"none\"!");
  1638. X            else
  1639. X                tmplevel[n_levs].boneschar = $4[0];
  1640. X            tmplevel[n_levs].lev.base = couple.base;
  1641. X            tmplevel[n_levs].lev.rand = couple.rand;
  1642. X            tmplevel[n_levs].chance = $7;
  1643. X            tmplevel[n_levs].rndlevs = $8;
  1644. X            tmpdungeon[n_dgns].levels++;
  1645. X          }
  1646. X        ;
  1647. X
  1648. Xlevdesc        : LEVELDESC ':' DESCRIPTOR
  1649. X          {
  1650. X            if($<i>3 >= D_ALIGN_CHAOTIC)
  1651. X                yyerror("Illegal description - ignoring!");
  1652. X            else
  1653. X                tmplevel[n_levs].flags |= $<i>3 ;
  1654. X          }
  1655. X        | LEVALIGN ':' DESCRIPTOR
  1656. X          {
  1657. X            if($<i>3 && $<i>3 < D_ALIGN_CHAOTIC)
  1658. X                yyerror("Illegal alignment - ignoring!");
  1659. X            else
  1660. X                tmplevel[n_levs].flags |= $<i>3 ;
  1661. X          }
  1662. X        ;
  1663. X
  1664. Xchlevel1    : CHLEVEL ':' STRING STRING STRING '+' rcouple
  1665. X          {
  1666. X            init_level();
  1667. X            strcpy(tmplevel[n_levs].name, $3);
  1668. X            if (!strcmp($4, "none"))
  1669. X                tmplevel[n_levs].boneschar = '\0';
  1670. X            else if ($4[1])
  1671. X                yyerror("Bones marker must be a single char, or \"none\"!");
  1672. X            else
  1673. X                tmplevel[n_levs].boneschar = $4[0];
  1674. X            tmplevel[n_levs].chain = getchain($5);
  1675. X            tmplevel[n_levs].lev.base = couple.base;
  1676. X            tmplevel[n_levs].lev.rand = couple.rand;
  1677. X            if(!check_level()) n_levs--;
  1678. X            else tmpdungeon[n_dgns].levels++;
  1679. X          }
  1680. X        | RNDCHLEVEL ':' STRING STRING STRING '+' rcouple INTEGER
  1681. X          {
  1682. X            init_level();
  1683. X            strcpy(tmplevel[n_levs].name, $3);
  1684. X            if (!strcmp($4, "none"))
  1685. X                tmplevel[n_levs].boneschar = '\0';
  1686. X            else if ($4[1])
  1687. X                yyerror("Bones marker must be a single char, or \"none\"!");
  1688. X            else
  1689. X                tmplevel[n_levs].boneschar = $4[0];
  1690. X            tmplevel[n_levs].chain = getchain($5);
  1691. X            tmplevel[n_levs].lev.base = couple.base;
  1692. X            tmplevel[n_levs].lev.rand = couple.rand;
  1693. X            tmplevel[n_levs].rndlevs = $8;
  1694. X            if(!check_level()) n_levs--;
  1695. X            else tmpdungeon[n_dgns].levels++;
  1696. X          }
  1697. X        ;
  1698. X
  1699. Xchlevel2    : CHLEVEL ':' STRING STRING STRING '+' rcouple INTEGER
  1700. X          {
  1701. X            init_level();
  1702. X            strcpy(tmplevel[n_levs].name, $3);
  1703. X            if (!strcmp($4, "none"))
  1704. X                tmplevel[n_levs].boneschar = '\0';
  1705. X            else if ($4[1])
  1706. X                yyerror("Bones marker must be a single char, or \"none\"!");
  1707. X            else
  1708. X                tmplevel[n_levs].boneschar = $4[0];
  1709. X            tmplevel[n_levs].chain = getchain($5);
  1710. X            tmplevel[n_levs].lev.base = couple.base;
  1711. X            tmplevel[n_levs].lev.rand = couple.rand;
  1712. X            tmplevel[n_levs].chance = $8;
  1713. X            if(!check_level()) n_levs--;
  1714. X            else tmpdungeon[n_dgns].levels++;
  1715. X          }
  1716. X        | RNDCHLEVEL ':' STRING STRING STRING '+' rcouple INTEGER INTEGER
  1717. X          {
  1718. X            init_level();
  1719. X            strcpy(tmplevel[n_levs].name, $3);
  1720. X            if (!strcmp($4, "none"))
  1721. X                tmplevel[n_levs].boneschar = '\0';
  1722. X            else if ($4[1])
  1723. X                yyerror("Bones marker must be a single char, or \"none\"!");
  1724. X            else
  1725. X                tmplevel[n_levs].boneschar = $4[0];
  1726. X            tmplevel[n_levs].chain = getchain($5);
  1727. X            tmplevel[n_levs].lev.base = couple.base;
  1728. X            tmplevel[n_levs].lev.rand = couple.rand;
  1729. X            tmplevel[n_levs].chance = $8;
  1730. X            tmplevel[n_levs].rndlevs = $9;
  1731. X            if(!check_level()) n_levs--;
  1732. X            else tmpdungeon[n_dgns].levels++;
  1733. X          }
  1734. X        ;
  1735. X
  1736. Xbranches    : branch
  1737. X        | chbranch
  1738. X        ;
  1739. X
  1740. Xbranch        : BRANCH ':' STRING '@' acouple branch_type direction
  1741. X          {
  1742. X            init_branch();
  1743. X            strcpy(tmpbranch[n_brs].name, $3);
  1744. X            tmpbranch[n_brs].lev.base = couple.base;
  1745. X            tmpbranch[n_brs].lev.rand = couple.rand;
  1746. X            tmpbranch[n_brs].type = $6;
  1747. X            tmpbranch[n_brs].up = $7;
  1748. X            if(!check_branch()) n_brs--;
  1749. X            else tmpdungeon[n_dgns].branches++;
  1750. X          }
  1751. X        ;
  1752. X
  1753. Xchbranch    : CHBRANCH ':' STRING STRING '+' rcouple branch_type direction
  1754. X          {
  1755. X            init_branch();
  1756. X            strcpy(tmpbranch[n_brs].name, $3);
  1757. X            tmpbranch[n_brs].chain = getchain($4);
  1758. X            tmpbranch[n_brs].lev.base = couple.base;
  1759. X            tmpbranch[n_brs].lev.rand = couple.rand;
  1760. X            tmpbranch[n_brs].type = $7;
  1761. X            tmpbranch[n_brs].up = $8;
  1762. X            if(!check_branch()) n_brs--;
  1763. X            else tmpdungeon[n_dgns].branches++;
  1764. X          }
  1765. X        ;
  1766. X
  1767. Xbranch_type    : /* nothing */
  1768. X          {
  1769. X            $$ = TBR_STAIR;    /* two way stair */
  1770. X          }
  1771. X        | STAIR
  1772. X          {
  1773. X            $$ = TBR_STAIR;    /* two way stair */
  1774. X          }
  1775. X        | NO_UP
  1776. X          {
  1777. X            $$ = TBR_NO_UP;    /* no up staircase */
  1778. X          }
  1779. X        | NO_DOWN
  1780. X          {
  1781. X            $$ = TBR_NO_DOWN;    /* no down staircase */
  1782. X          }
  1783. X        | PORTAL
  1784. X          {
  1785. X            $$ = TBR_PORTAL;    /* portal connection */
  1786. X          }
  1787. X        ;
  1788. X
  1789. Xdirection    : /* nothing */
  1790. X          {
  1791. X            $$ = 0;    /* defaults to down */
  1792. X          }
  1793. X        | UP_OR_DOWN
  1794. X          {
  1795. X            $$ = $1;
  1796. X          }
  1797. X        ;
  1798. X
  1799. X/*
  1800. X *    acouple rules:
  1801. X *
  1802. X *    (base, range) where:
  1803. X *
  1804. X *        base is either a positive or negative integer with a value
  1805. X *        less than or equal to MAXLEVEL.
  1806. X *        base > 0 indicates the base level.
  1807. X *        base < 0 indicates reverse index (-1 == lowest level)
  1808. X *
  1809. X *        range is the random component.
  1810. X *        if range is zero, there is no random component.
  1811. X *        if range is -1 the dungeon loader will randomize between
  1812. X *        the base and the end of the dungeon.
  1813. X *        during dungeon load, range is always *added* to the base,
  1814. X *        therefore range + base(converted) must not exceed MAXLEVEL.
  1815. X */
  1816. Xacouple        : '(' INTEGER ',' INTEGER ')'
  1817. X          {
  1818. X            if ($2 < -MAXLEVEL || $2 > MAXLEVEL) {
  1819. X                yyerror("Abs base out of dlevel range - zeroing!");
  1820. X                couple.base = couple.rand = 0;
  1821. X            } else if ($4 < -1 ||
  1822. X                (($2 < 0) ? (MAXLEVEL + $2 + $4 + 1) > MAXLEVEL :
  1823. X                    ($2 + $4) > MAXLEVEL)) {
  1824. X                yyerror("Abs range out of dlevel range - zeroing!");
  1825. X                couple.base = couple.rand = 0;
  1826. X            } else {
  1827. X                couple.base = $2;
  1828. X                couple.rand = $4;
  1829. X            }
  1830. X          }
  1831. X        ;
  1832. X
  1833. X/*
  1834. X *    rcouple rules:
  1835. X *
  1836. X *    (base, range) where:
  1837. X *
  1838. X *        base is either a positive or negative integer with a value
  1839. X *        less than or equal to MAXLEVEL.
  1840. X *        base > 0 indicates a forward index.
  1841. X *        base < 0 indicates a reverse index.
  1842. X *        base == 0 indicates on the parent level.
  1843. X *
  1844. X *        range is the random component.
  1845. X *        if range is zero, there is no random component.
  1846. X *        during dungeon load, range is always *added* to the base,
  1847. X *        range + base(converted) may be very large.  The dungeon
  1848. X *        loader will then correct to "between here and the top/bottom".
  1849. X *
  1850. X *        There is no practical way of specifying "between here and the
  1851. X *        nth / nth last level".
  1852. X */
  1853. Xrcouple        : '(' INTEGER ',' INTEGER ')'
  1854. X          {
  1855. X            if ($2 < -MAXLEVEL || $2 > MAXLEVEL) {
  1856. X                yyerror("Rel base out of dlevel range - zeroing!");
  1857. X                couple.base = couple.rand = 0;
  1858. X            } else {
  1859. X                couple.base = $2;
  1860. X                couple.rand = $4;
  1861. X            }
  1862. X          }
  1863. X        ;
  1864. X%%
  1865. X
  1866. Xvoid
  1867. Xinit_dungeon()
  1868. X{
  1869. X    if(++n_dgns > MAXDUNGEON) {
  1870. X        fprintf(stderr, "FATAL - Too many dungeons (limit: %d).\n",
  1871. X            MAXDUNGEON);
  1872. X        fprintf(stderr, "To increase the limit edit MAXDUNGEON in global.h\n");
  1873. X        exit(1);
  1874. X    }
  1875. X
  1876. X    in_dungeon = 1;
  1877. X    tmpdungeon[n_dgns].lev.base = 0;
  1878. X    tmpdungeon[n_dgns].lev.rand = 0;
  1879. X    tmpdungeon[n_dgns].chance = 100;
  1880. X    strcpy(tmpdungeon[n_dgns].name, "");
  1881. X    strcpy(tmpdungeon[n_dgns].protoname, "");
  1882. X    tmpdungeon[n_dgns].flags = 0;
  1883. X    tmpdungeon[n_dgns].levels = 0;
  1884. X    tmpdungeon[n_dgns].branches = 0;
  1885. X    tmpdungeon[n_dgns].entry_lev = 0;
  1886. X}
  1887. X
  1888. Xvoid
  1889. Xinit_level()
  1890. X{
  1891. X    if(++n_levs > LEV_LIMIT) {
  1892. X
  1893. X        yyerror("FATAL - Too many special levels defined.");
  1894. X        exit(1);
  1895. X    }
  1896. X    tmplevel[n_levs].lev.base = 0;
  1897. X    tmplevel[n_levs].lev.rand = 0;
  1898. X    tmplevel[n_levs].chance = 100;
  1899. X    tmplevel[n_levs].rndlevs = 0;
  1900. X    tmplevel[n_levs].flags = 0;
  1901. X    strcpy(tmplevel[n_levs].name, "");
  1902. X    tmplevel[n_levs].chain = -1;
  1903. X}
  1904. X
  1905. Xvoid
  1906. Xinit_branch()
  1907. X{
  1908. X    if(++n_brs > BRANCH_LIMIT) {
  1909. X
  1910. X        yyerror("FATAL - Too many special levels defined.");
  1911. X        exit(1);
  1912. X    }
  1913. X    tmpbranch[n_brs].lev.base = 0;
  1914. X    tmpbranch[n_brs].lev.rand = 0;
  1915. X    strcpy(tmpbranch[n_brs].name, "");
  1916. X    tmpbranch[n_brs].chain = -1;
  1917. X}
  1918. X
  1919. Xint
  1920. Xgetchain(s)
  1921. X    char    *s;
  1922. X{
  1923. X    int i;
  1924. X
  1925. X    if(strlen(s)) {
  1926. X
  1927. X        for(i = n_levs - tmpdungeon[n_dgns].levels + 1; i <= n_levs; i++)
  1928. X        if(!strcmp(tmplevel[i].name, s)) return i;
  1929. X
  1930. X        yyerror("Can't locate the specified chain level.");
  1931. X        return(-2);
  1932. X    }
  1933. X    return(-1);
  1934. X}
  1935. X
  1936. X/*
  1937. X *    Consistancy checking routines:
  1938. X *
  1939. X *    - A dungeon must have a unique name.
  1940. X *    - A dungeon must have a originating "branch" command
  1941. X *      (except, of course, for the first dungeon).
  1942. X *    - A dungeon must have a proper depth (at least (1, 0)).
  1943. X */
  1944. X
  1945. Xint
  1946. Xcheck_dungeon()
  1947. X{
  1948. X    int i;
  1949. X
  1950. X    for(i = 0; i < n_dgns; i++)
  1951. X        if(!strcmp(tmpdungeon[i].name, tmpdungeon[n_dgns].name)) {
  1952. X        yyerror("Duplicate dungeon name.");
  1953. X        return(0);
  1954. X        }
  1955. X
  1956. X    if(n_dgns)
  1957. X      for(i = 0; i < n_brs - tmpdungeon[n_dgns].branches; i++) {
  1958. X        if(!strcmp(tmpbranch[i].name, tmpdungeon[n_dgns].name)) break;
  1959. X
  1960. X        if(i >= n_brs - tmpdungeon[n_dgns].branches) {
  1961. X        yyerror("Dungeon cannot be reached.");
  1962. X        return(0);
  1963. X        }
  1964. X      }
  1965. X
  1966. X    if(tmpdungeon[n_dgns].lev.base <= 0 ||
  1967. X       tmpdungeon[n_dgns].lev.rand < 0) {
  1968. X        yyerror("Invalid dungeon depth specified.");
  1969. X        return(0);
  1970. X    }
  1971. X    return(1);    /* OK */
  1972. X}
  1973. X
  1974. X/*
  1975. X *    - A level must have a unique level name.
  1976. X *    - If chained, the level used as reference for the chain
  1977. X *      must be in this dungeon, must be previously defined, and
  1978. X *      the level chained from must be "non-probabalistic" (ie.
  1979. X *      have a 100% chance of existing).
  1980. X */
  1981. X
  1982. Xint
  1983. Xcheck_level()
  1984. X{
  1985. X    int i;
  1986. X
  1987. X    if(!in_dungeon) {
  1988. X        yyerror("Level defined outside of dungeon.");
  1989. X        return(0);
  1990. X    }
  1991. X
  1992. X    for(i = 0; i < n_levs; i++)
  1993. X        if(!strcmp(tmplevel[i].name, tmplevel[n_levs].name)) {
  1994. X        yyerror("Duplicate level name.");
  1995. X        return(0);
  1996. X        }
  1997. X
  1998. X    if(tmplevel[i].chain == -2) {
  1999. X        yyerror("Invaild level chain reference.");
  2000. X        return(0);
  2001. X    } else if(tmplevel[i].chain != -1) {    /* there is a chain */
  2002. X        if(tmplevel[tmpbranch[i].chain].chance != 100) {
  2003. X        yyerror("Level cannot chain from a probabalistic level.");
  2004. X        return(0);
  2005. X        } else if(tmplevel[i].chain == n_levs) {
  2006. X        yyerror("A level cannot chain to itself!");
  2007. X        return(0);
  2008. X        }
  2009. X    }
  2010. X    return(1);    /* OK */
  2011. X}
  2012. X
  2013. X/*
  2014. X *    - A branch may not branch backwards - to avoid branch loops.
  2015. X *    - A branch name must be unique.
  2016. X *      (ie. You can only have one entry point to each dungeon).
  2017. X *    - If chained, the level used as reference for the chain
  2018. X *      must be in this dungeon, must be previously defined, and
  2019. X *      the level chained from must be "non-probabalistic" (ie.
  2020. X *      have a 100% chance of existing).
  2021. X */
  2022. X
  2023. Xint
  2024. Xcheck_branch()
  2025. X{
  2026. X    int i;
  2027. X
  2028. X    if(!in_dungeon) {
  2029. X        yyerror("Branch defined outside of dungeon.");
  2030. X        return(0);
  2031. X    }
  2032. X
  2033. X    for(i = 0; i < n_dgns; i++)
  2034. X        if(!strcmp(tmpdungeon[i].name, tmpbranch[n_brs].name)) {
  2035. X
  2036. X        yyerror("Reverse branching not allowed.");
  2037. X        return(0);
  2038. X        }
  2039. X
  2040. X    if(tmpbranch[i].chain == -2) {
  2041. X
  2042. X        yyerror("Invaild branch chain reference.");
  2043. X        return(0);
  2044. X    } else if(tmpbranch[i].chain != -1) {    /* it is chained */
  2045. X
  2046. X        if(tmplevel[tmpbranch[i].chain].chance != 100) {
  2047. X        yyerror("Branch cannot chain from a probabalistic level.");
  2048. X        return(0);
  2049. X        }
  2050. X    }
  2051. X    return(1);    /* OK */
  2052. X}
  2053. X
  2054. X/*
  2055. X *    Output the dungon definition into a file.
  2056. X *
  2057. X *    The file will have the following format:
  2058. X *
  2059. X *    [ number of dungeons ]
  2060. X *    [ first dungeon struct ]
  2061. X *    [ levels for the first dungeon ]
  2062. X *      ...
  2063. X *    [ branches for the first dungeon ]
  2064. X *      ...
  2065. X *    [ second dungeon struct ]
  2066. X *      ...
  2067. X */
  2068. X
  2069. Xvoid
  2070. Xoutput_dgn()
  2071. X{
  2072. X    int    nd, cl = 0, nl = 0,
  2073. X            cb = 0, nb = 0;
  2074. X
  2075. X    if(++n_dgns <= 0) {
  2076. X
  2077. X        yyerror("FATAL - no dungeons were defined.");
  2078. X        exit(1);
  2079. X    }
  2080. X
  2081. X    fwrite((char *)(&n_dgns), sizeof(int), 1, stdout);
  2082. X    for(nd = 0; nd < n_dgns; nd++) {
  2083. X
  2084. X        fwrite((char *)&tmpdungeon[nd], sizeof(struct tmpdungeon), 1,
  2085. X                                stdout);
  2086. X
  2087. X        nl += tmpdungeon[nd].levels;
  2088. X        for(; cl < nl; cl++)
  2089. X        fwrite((char *)&tmplevel[cl], sizeof(struct tmplevel), 1,
  2090. X                                stdout);
  2091. X
  2092. X        nb += tmpdungeon[nd].branches;
  2093. X        for(; cb < nb; cb++)
  2094. X        fwrite((char *)&tmpbranch[cb], sizeof(struct tmpbranch), 1,
  2095. X                                stdout);
  2096. X    }
  2097. X}
  2098. END_OF_FILE
  2099. if test 16306 -ne `wc -c <'util/dgn_comp.y'`; then
  2100.     echo shar: \"'util/dgn_comp.y'\" unpacked with wrong size!
  2101. fi
  2102. # end of 'util/dgn_comp.y'
  2103. fi
  2104. echo shar: End of archive 86 \(of 108\).
  2105. cp /dev/null ark86isdone
  2106. MISSING=""
  2107. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  2108. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  2109. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  2110. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  2111. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  2112. 101 102 103 104 105 106 107 108 ; do
  2113.     if test ! -f ark${I}isdone ; then
  2114.     MISSING="${MISSING} ${I}"
  2115.     fi
  2116. done
  2117. if test "${MISSING}" = "" ; then
  2118.     echo You have unpacked all 108 archives.
  2119.     echo "Now execute 'rebuild.sh'"
  2120.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  2121. else
  2122.     echo You still need to unpack the following archives:
  2123.     echo "        " ${MISSING}
  2124. fi
  2125. ##  End of shell archive.
  2126. exit 0
  2127.