home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / volume16 / nethck31 / part91 < prev    next >
Encoding:
Internet Message Format  |  1993-02-05  |  57.9 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: v16i099:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part91/108
  5. Message-ID: <4464@master.CNA.TEK.COM>
  6. Date: 5 Feb 93 22:02:38 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 2148
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1650
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 99
  14. Archive-name: nethack31/Part91
  15. Supersedes: nethack3p9: Volume 10, Issue 46-108
  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 91 (of 108)."
  27. # Contents:  dat/Priest.des src/mkmap.c sys/mac/macfile.c
  28. #   sys/msdos/msdos.c sys/vms/nethack.com win/X11/dialogs.c
  29. # Wrapped by billr@saab on Wed Jan 27 16:09:24 1993
  30. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  31. if test -f 'dat/Priest.des' -a "${1}" != "-c" ; then 
  32.   echo shar: Will not clobber existing file \"'dat/Priest.des'\"
  33. else
  34. echo shar: Extracting \"'dat/Priest.des'\" \(10270 characters\)
  35. sed "s/^X//" >'dat/Priest.des' <<'END_OF_FILE'
  36. X#    SCCS Id: @(#)Priest.des    3.1    92/09/22
  37. X#    Copyright (c) 1989 by Jean-Christophe Collet
  38. X#    Copyright (c) 1991-2 by M. Stephenson
  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, High Priest
  44. X#    and receive your quest assignment.
  45. X#
  46. XMAZE: "P-start",' '
  47. XFLAGS: noteleport,hardfloor
  48. XGEOMETRY:center,center
  49. XMAP
  50. X............................................................................
  51. X............................................................................
  52. X............................................................................
  53. X....................------------------------------------....................
  54. X....................|................|.....|.....|.....|....................
  55. X....................|..------------..|--+-----+-----+--|....................
  56. X....................|..|..........|..|.................|....................
  57. X....................|..|..........|..|+---+---+-----+--|....................
  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: 'Z', 'W'
  73. X# Dungeon Description
  74. XREGION:(00,00,75,19),lit,"ordinary"
  75. XREGION:(24,06,33,13),lit,"temple"
  76. X# Portal arrival point
  77. XBRANCH:(05,04,05,04),(0,0,0,0)
  78. X# Stairs
  79. XSTAIR:(52,09),down
  80. X# Doors
  81. XDOOR:locked,(18,09)
  82. XDOOR:locked,(18,10)
  83. XDOOR:closed,(34,09)
  84. XDOOR:closed,(34,10)
  85. XDOOR:closed,(40,05)
  86. XDOOR:closed,(46,05)
  87. XDOOR:closed,(52,05)
  88. XDOOR:locked,(38,07)
  89. XDOOR:closed,(42,07)
  90. XDOOR:closed,(46,07)
  91. XDOOR:closed,(52,07)
  92. XDOOR:locked,(38,12)
  93. XDOOR:closed,(44,12)
  94. XDOOR:closed,(48,12)
  95. XDOOR:closed,(52,12)
  96. XDOOR:closed,(40,14)
  97. XDOOR:closed,(46,14)
  98. XDOOR:closed,(52,14)
  99. X# Unattended Altar - unaligned due to conflict - player must align it.
  100. XALTAR:(28,09),noalign,altar
  101. X# High Priest
  102. XMONSTER:'@',"Arch Priest",(28,10)
  103. X# The treasure of High Priest
  104. XOBJECT:'(',"chest",(27,10)
  105. X# knight guards for the audience chamber
  106. XMONSTER:'@',"acolyte",(32,07)
  107. XMONSTER:'@',"acolyte",(32,08)
  108. XMONSTER:'@',"acolyte",(32,11)
  109. XMONSTER:'@',"acolyte",(32,12)
  110. XMONSTER:'@',"acolyte",(33,07)
  111. XMONSTER:'@',"acolyte",(33,08)
  112. XMONSTER:'@',"acolyte",(33,11)
  113. XMONSTER:'@',"acolyte",(33,12)
  114. X# Non diggable walls
  115. XNON_DIGGABLE:(00,00,75,19)
  116. X# Random traps
  117. XTRAP:"dart",(20,09)
  118. XTRAP:"dart",(20,10)
  119. XTRAP:random,random
  120. XTRAP:random,random
  121. XTRAP:random,random
  122. XTRAP:random,random
  123. X# Monsters on siege duty.
  124. XMONSTER: 'Z',"human zombie",(37,01)
  125. XMONSTER: 'Z',"human zombie",(37,18)
  126. XMONSTER: 'Z',"human zombie",(03,03)
  127. XMONSTER: 'Z',"human zombie",(65,04)
  128. XMONSTER: 'Z',"human zombie",(12,11)
  129. XMONSTER: 'Z',"human zombie",(60,12)
  130. XMONSTER: 'Z',"human zombie",(14,08)
  131. XMONSTER: 'Z',"human zombie",(55,00)
  132. XMONSTER: 'Z',"human zombie",(18,18)
  133. XMONSTER: 'Z',"human zombie",(59,10)
  134. XMONSTER: 'Z',"human zombie",(13,09)
  135. XMONSTER: 'Z',"human zombie",(01,17)
  136. X#
  137. X#    The "locate" level for the quest.
  138. X#
  139. X#    Here you have to locate the Temple of Nalzok to go
  140. X#    further towards your assigned quest.
  141. X#
  142. X
  143. XMAZE: "P-locate",' '
  144. XFLAGS: hardfloor
  145. X# This is a kludge to init the level as a lit field.
  146. XINIT_MAP: '.' , '.' , false , false , lit , false
  147. XGEOMETRY:center,center
  148. XMAP
  149. X........................................
  150. X........................................
  151. X..........----------+----------.........
  152. X..........|........|.|........|.........
  153. X..........|........|.|........|.........
  154. X..........|----.----.----.----|.........
  155. X..........+...................+.........
  156. X..........+...................+.........
  157. X..........|----.----.----.----|.........
  158. X..........|........|.|........|.........
  159. X..........|........|.|........|.........
  160. X..........----------+----------.........
  161. X........................................
  162. X........................................
  163. XENDMAP
  164. X# Random Monsters
  165. XRANDOM_MONSTERS: 'Z', 'W'
  166. X# Dungeon Description
  167. XREGION:(00,00,09,13),unlit,"morgue"
  168. XREGION:(09,00,30,01),unlit,"morgue"
  169. XREGION:(09,12,30,13),unlit,"morgue"
  170. XREGION:(31,00,39,13),unlit,"morgue"
  171. XREGION:(11,03,29,10),lit,"temple",filled,true
  172. X# The altar inside the temple
  173. XALTAR:(20,07),noalign,shrine
  174. XMONSTER:'@',"aligned priest",(20,07),noalign,hostile
  175. X# Doors
  176. XDOOR:locked,(10,06)
  177. XDOOR:locked,(10,07)
  178. XDOOR:locked,(20,02)
  179. XDOOR:locked,(20,11)
  180. XDOOR:locked,(30,06)
  181. XDOOR:locked,(30,07)
  182. X# Stairs
  183. X# Note:  The up stairs are *intentionally* off of the map.
  184. XSTAIR:(43,05),up
  185. XSTAIR:(20,06),down
  186. X# Non diggable walls
  187. XNON_DIGGABLE:(10,02,30,13)
  188. X# Objects (inside the antechambers).
  189. XOBJECT:random,random,(14,03)
  190. XOBJECT:random,random,(15,03)
  191. XOBJECT:random,random,(16,03)
  192. XOBJECT:random,random,(14,10)
  193. XOBJECT:random,random,(15,10)
  194. XOBJECT:random,random,(16,10)
  195. XOBJECT:random,random,(17,10)
  196. XOBJECT:random,random,(24,03)
  197. XOBJECT:random,random,(25,03)
  198. XOBJECT:random,random,(26,03)
  199. XOBJECT:random,random,(27,03)
  200. XOBJECT:random,random,(24,10)
  201. XOBJECT:random,random,(25,10)
  202. XOBJECT:random,random,(26,10)
  203. XOBJECT:random,random,(27,10)
  204. X# Random traps
  205. XTRAP:random,(15,04)
  206. XTRAP:random,(25,04)
  207. XTRAP:random,(15,09)
  208. XTRAP:random,(25,09)
  209. XTRAP:random,random
  210. XTRAP:random,random
  211. X# No random monsters - the morgue generation will put them in.
  212. X
  213. X#
  214. X#    The "goal" level for the quest.
  215. X#
  216. X#    Here you meet Nalzok your nemesis monster.  You have to
  217. X#    defeat Nalzok in combat to gain the artifact you have
  218. X#    been assigned to retrieve.
  219. X#
  220. X
  221. XMAZE: "P-goal", ' '
  222. XINIT_MAP: 'L' , '.' , false , false , unlit , false
  223. XGEOMETRY:center,center
  224. XMAP
  225. X.L......L.LLL.......LL....
  226. X.LLL.......L......LL......
  227. XLL.LL.............L.LL....
  228. X..........................
  229. X......................LL..
  230. X......................LLL.
  231. XLL........................
  232. X.LL.......................
  233. X.LL................LL.L...
  234. X..LL.....L.LL.......LLL...
  235. X.........LLL.........L....
  236. XENDMAP
  237. X# Random Monsters
  238. XRANDOM_MONSTERS: 'Z', 'W'
  239. X# Dungeon Description
  240. XREGION:(00,00,25,10),unlit,"ordinary"
  241. X# Stairs
  242. XSTAIR:(20,05),up
  243. X# Objects
  244. XOBJECT:'[',"helm of brilliance",(13,05),blessed,0,"The Mitre of Holiness"
  245. XOBJECT:random,random,random
  246. XOBJECT:random,random,random
  247. XOBJECT:random,random,random
  248. XOBJECT:random,random,random
  249. XOBJECT:random,random,random
  250. XOBJECT:random,random,random
  251. XOBJECT:random,random,random
  252. XOBJECT:random,random,random
  253. XOBJECT:random,random,random
  254. XOBJECT:random,random,random
  255. XOBJECT:random,random,random
  256. XOBJECT:random,random,random
  257. XOBJECT:random,random,random
  258. XOBJECT:random,random,random
  259. X# Random traps
  260. XTRAP:"fire",random
  261. XTRAP:"fire",random
  262. XTRAP:"fire",random
  263. XTRAP:"fire",random
  264. XTRAP:random,random
  265. XTRAP:random,random
  266. X# Random monsters.
  267. XMONSTER:'&',"Nalzok",(13,05)
  268. XMONSTER:'Z',"human zombie",random
  269. XMONSTER:'Z',"human zombie",random
  270. XMONSTER:'Z',"human zombie",random
  271. XMONSTER:'Z',"human zombie",random
  272. XMONSTER:'Z',"human zombie",random
  273. XMONSTER:'Z',"human zombie",random
  274. XMONSTER:'Z',"human zombie",random
  275. XMONSTER:'Z',"human zombie",random
  276. XMONSTER:'Z',"human zombie",random
  277. XMONSTER:'Z',"human zombie",random
  278. XMONSTER:'Z',"human zombie",random
  279. XMONSTER:'Z',"human zombie",random
  280. XMONSTER:'Z',"human zombie",random
  281. XMONSTER:'Z',"human zombie",random
  282. XMONSTER:'Z',"human zombie",random
  283. XMONSTER:'Z',"human zombie",random
  284. XMONSTER:'Z',random,random
  285. XMONSTER:'Z',random,random
  286. XMONSTER:'W',"wraith",random
  287. XMONSTER:'W',"wraith",random
  288. XMONSTER:'W',"wraith",random
  289. XMONSTER:'W',"wraith",random
  290. XMONSTER:'W',"wraith",random
  291. XMONSTER:'W',"wraith",random
  292. XMONSTER:'W',"wraith",random
  293. XMONSTER:'W',"wraith",random
  294. XMONSTER:'W',random,random
  295. X
  296. X#
  297. X#    The "fill" levels for the quest.
  298. X#
  299. X#    These levels are used to fill out any levels not occupied by specific
  300. X#    levels as defined above. "filla" is the upper filler, between the
  301. X#    start and locate levels, and "fillb" the lower between the locate
  302. X#    and goal levels.
  303. X#
  304. X
  305. XLEVEL: "P-filla"
  306. X# Random Monsters
  307. XRANDOM_MONSTERS: 'Z', 'W'
  308. X#
  309. XROOM: "ordinary" , random, random, random, random
  310. XSTAIR: random, up
  311. XOBJECT: random,random,random
  312. XMONSTER: 'Z', "human zombie", random
  313. X
  314. XROOM: "ordinary" , random, random, random, random
  315. XOBJECT: random, random, random
  316. XOBJECT: random,random,random
  317. X
  318. XROOM: "ordinary" , random, random, random, random
  319. XOBJECT: random, random, random
  320. XTRAP: random, random
  321. XOBJECT: random,random,random
  322. XMONSTER: 'Z', "human zombie", random
  323. X
  324. XROOM: "morgue" , random, random, random, random
  325. XSTAIR: random, down
  326. XOBJECT: random, random, random
  327. XTRAP: random, random
  328. X
  329. XROOM: "ordinary" , random, random, random, random
  330. XOBJECT: random, random, random
  331. XOBJECT: random, random, random
  332. XTRAP: random, random
  333. XMONSTER: 'W', "wraith", random
  334. X
  335. XROOM: "morgue" , random, random, random, random
  336. XOBJECT: random, random, random
  337. XTRAP: random, random
  338. X
  339. XRANDOM_CORRIDORS
  340. X
  341. XLEVEL: "P-fillb"
  342. X# Random Monsters
  343. XRANDOM_MONSTERS: 'Z', 'W'
  344. X#
  345. XROOM: "ordinary" , random, random, random, random
  346. XSTAIR: random, up
  347. XOBJECT: random,random,random
  348. XMONSTER: 'Z', "human zombie", random
  349. XMONSTER: 'W', "wraith", random
  350. X
  351. XROOM: "morgue" , random, random, random, random
  352. XOBJECT: random, random, random
  353. XOBJECT: random, random, random
  354. XOBJECT: random,random,random
  355. X
  356. XROOM: "ordinary" , random, random, random, random
  357. XOBJECT: random, random, random
  358. XTRAP: random, random
  359. XOBJECT: random,random,random
  360. XMONSTER: 'Z', "human zombie", random
  361. XMONSTER: 'W', "wraith", random
  362. X
  363. XROOM: "morgue" , random, random, random, random
  364. XSTAIR: random, down
  365. XOBJECT: random, random, random
  366. XOBJECT: random, random, random
  367. XTRAP: random, random
  368. X
  369. XROOM: "ordinary" , random, random, random, random
  370. XOBJECT: random, random, random
  371. XOBJECT: random, random, random
  372. XTRAP: random, random
  373. XMONSTER: 'Z', "human zombie", random
  374. XMONSTER: 'W', "wraith", random
  375. X
  376. XROOM: "morgue" , random, random, random, random
  377. XOBJECT: random, random, random
  378. XTRAP: random, random
  379. X
  380. XRANDOM_CORRIDORS
  381. END_OF_FILE
  382. if test 10270 -ne `wc -c <'dat/Priest.des'`; then
  383.     echo shar: \"'dat/Priest.des'\" unpacked with wrong size!
  384. fi
  385. # end of 'dat/Priest.des'
  386. fi
  387. if test -f 'src/mkmap.c' -a "${1}" != "-c" ; then 
  388.   echo shar: Will not clobber existing file \"'src/mkmap.c'\"
  389. else
  390. echo shar: Extracting \"'src/mkmap.c'\" \(9999 characters\)
  391. sed "s/^X//" >'src/mkmap.c' <<'END_OF_FILE'
  392. X/*    SCCS Id: @(#)mkmap.c    3.1    92/07/15    */
  393. X/* Copyright (c) J. C. Collet, M. Stephenson and D. Cohrs, 1992   */
  394. X/* NetHack may be freely redistributed.  See license for details. */
  395. X
  396. X#include "hack.h"
  397. X#include "sp_lev.h"
  398. X
  399. X#define    HEIGHT    (ROWNO - 1)
  400. X#define WIDTH    (COLNO - 2)
  401. X
  402. Xstatic void FDECL(init_map,(SCHAR_P));
  403. Xstatic void FDECL(init_fill,(SCHAR_P,SCHAR_P));
  404. Xstatic schar FDECL(get_map,(int,int,SCHAR_P));
  405. Xstatic void FDECL(pass_one,(SCHAR_P,SCHAR_P));
  406. Xstatic void FDECL(pass_two,(SCHAR_P,SCHAR_P));
  407. Xstatic void FDECL(pass_three,(SCHAR_P,SCHAR_P));
  408. Xstatic void NDECL(wallify_map);
  409. Xstatic void FDECL(join_map,(SCHAR_P,SCHAR_P));
  410. Xstatic void FDECL(finish_map,(SCHAR_P,SCHAR_P,XCHAR_P,XCHAR_P));
  411. Xvoid FDECL(mkmap, (lev_init *));
  412. X
  413. Xchar *new_locations;
  414. Xint min_rx, max_rx, min_ry, max_ry; /* rectangle bounds for regions */
  415. Xstatic int n_loc_filled;
  416. X
  417. Xstatic void
  418. Xinit_map(bg_typ)
  419. X    schar    bg_typ;
  420. X{
  421. X    register int i,j;
  422. X
  423. X    for(i=1; i<COLNO; i++)
  424. X        for(j=0; j<ROWNO; j++)
  425. X        levl[i][j].typ = bg_typ;
  426. X}
  427. X
  428. Xstatic void
  429. Xinit_fill(bg_typ, fg_typ)
  430. X    schar    bg_typ, fg_typ;
  431. X{
  432. X    register int i,j;
  433. X    long limit, count;
  434. X
  435. X    limit = (WIDTH * HEIGHT * 2) / 5;
  436. X    count = 0;
  437. X    while(count < limit) {
  438. X        i = rn1(WIDTH-1, 2);
  439. X        j = rnd(HEIGHT-1);
  440. X        if (levl[i][j].typ == bg_typ) {
  441. X        levl[i][j].typ = fg_typ;
  442. X        count++;
  443. X        }
  444. X    }
  445. X}
  446. X
  447. Xstatic schar
  448. Xget_map(col,row, bg_typ)
  449. X    int col,row;
  450. X    schar    bg_typ;
  451. X{
  452. X    if (col <= 0 || row < 0 || col > WIDTH || row >= HEIGHT)
  453. X        return bg_typ;
  454. X    return levl[col][row].typ;
  455. X}
  456. X
  457. Xstatic int dirs[16] = {
  458. X    -1, -1 /**/, -1, 0 /**/, -1, 1 /**/,
  459. X     0, -1 /**/,              0, 1 /**/,
  460. X     1, -1 /**/,  1, 0 /**/,  1, 1};
  461. X
  462. Xstatic void
  463. Xpass_one(bg_typ, fg_typ)
  464. X    schar    bg_typ, fg_typ;
  465. X{
  466. X    register int i,j;
  467. X    short count, dr;
  468. X
  469. X    for(i=2; i<=WIDTH; i++)
  470. X        for(j=1; j<HEIGHT; j++) {
  471. X        for(count=0, dr=0; dr < 8; dr++)
  472. X            if(get_map(i+dirs[dr*2], j+dirs[(dr*2)+1], bg_typ)
  473. X                                == fg_typ)
  474. X            count++;
  475. X
  476. X        switch(count) {
  477. X          case 0 : /* death */
  478. X          case 1 :
  479. X          case 2:
  480. X              levl[i][j].typ = bg_typ;
  481. X              break;
  482. X          case 5:
  483. X          case 6:
  484. X          case 7:
  485. X          case 8:
  486. X              levl[i][j].typ = fg_typ;
  487. X              break;
  488. X          default:
  489. X              break;
  490. X          }
  491. X        }
  492. X}
  493. X
  494. X#define new_loc(i,j)    *(new_locations+ ((j)*(WIDTH+1)) + (i))
  495. X
  496. Xstatic void
  497. Xpass_two(bg_typ, fg_typ)
  498. X    schar    bg_typ, fg_typ;
  499. X{
  500. X    register int i,j;
  501. X    short count, dr;
  502. X
  503. X    for(i=2; i<=WIDTH; i++)
  504. X        for(j=1; j<HEIGHT; j++) {
  505. X        for(count=0, dr=0; dr < 8; dr++)
  506. X            if(get_map(i+dirs[dr*2], j+dirs[(dr*2)+1], bg_typ)
  507. X                                == fg_typ)
  508. X            count++;
  509. X            if (count == 5)
  510. X            new_loc(i,j) = bg_typ;
  511. X            else
  512. X            new_loc(i,j) = get_map(i,j, bg_typ);
  513. X        }
  514. X
  515. X    for(i=2; i<=WIDTH; i++)
  516. X        for(j=1; j<HEIGHT; j++)
  517. X        levl[i][j].typ = new_loc(i,j);
  518. X}
  519. X
  520. Xstatic void
  521. Xpass_three(bg_typ, fg_typ)
  522. X    schar    bg_typ, fg_typ;
  523. X{
  524. X    register int i,j;
  525. X    short count, dr;
  526. X
  527. X    for(i=2; i<=WIDTH; i++)
  528. X        for(j=1; j<HEIGHT; j++) {
  529. X        for(count=0, dr=0; dr < 8; dr++)
  530. X            if(get_map(i+dirs[dr*2], j+dirs[(dr*2)+1], bg_typ)
  531. X                                == fg_typ)
  532. X            count++;
  533. X        if (count < 3)
  534. X            new_loc(i,j) = bg_typ;
  535. X        else
  536. X            new_loc(i,j) = get_map(i,j, bg_typ);
  537. X        }
  538. X
  539. X    for(i=2; i<=WIDTH; i++)
  540. X        for(j=1; j<HEIGHT; j++)
  541. X        levl[i][j].typ = new_loc(i,j);
  542. X}
  543. X
  544. X/*
  545. X * use a flooding algorithm to find all locations that should
  546. X * have the same rm number as the current location.
  547. X * if anyroom is TRUE, use IS_ROOM to check room membership instead of
  548. X * exactly matching levl[sx][sy].typ and walls are included as well.
  549. X */
  550. Xvoid
  551. Xflood_fill_rm(sx, sy, rmno, lit, anyroom)
  552. X    int sx;
  553. X    register int sy;
  554. X    register int rmno;
  555. X    boolean lit;
  556. X    boolean anyroom;
  557. X{
  558. X    register int i;
  559. X    int nx;
  560. X    schar fg_typ = levl[sx][sy].typ;
  561. X
  562. X    /* back up to find leftmost uninitialized location */
  563. X    while(sx > 0
  564. X      && (anyroom ? IS_ROOM(levl[sx][sy].typ) : levl[sx][sy].typ == fg_typ)
  565. X      && levl[sx][sy].roomno != rmno)
  566. X    sx--;
  567. X    sx++; /* compensate for extra decrement */
  568. X
  569. X    /* assume sx,sy is valid */
  570. X    if(sx < min_rx) min_rx = sx;
  571. X    if(sy < min_ry) min_ry = sy;
  572. X
  573. X    for(i=sx; i<=WIDTH && levl[i][sy].typ == fg_typ; i++) {
  574. X    levl[i][sy].roomno = rmno;
  575. X    levl[i][sy].lit = lit;
  576. X    if(anyroom) {
  577. X        /* add walls to room as well */
  578. X        register int ii,jj;
  579. X        for(ii= (i == sx ? i-1 : i); ii <= i+1; ii++)
  580. X        for(jj = sy-1; jj <= sy+1; jj++)
  581. X            if(isok(ii,jj) &&
  582. X               (IS_WALL(levl[ii][jj].typ) ||
  583. X            IS_DOOR(levl[ii][jj].typ))) {
  584. X            levl[ii][jj].edge = 1;
  585. X            if(lit) levl[ii][jj].lit = lit;
  586. X            if (levl[ii][jj].roomno != rmno)
  587. X                levl[ii][jj].roomno = SHARED;
  588. X            else
  589. X                levl[ii][jj].roomno = rmno;
  590. X            }
  591. X    }
  592. X    n_loc_filled++;
  593. X    }
  594. X    nx = i;
  595. X
  596. X    if(isok(sx,sy-1))
  597. X    for(i=sx; i<nx; i++)
  598. X        if(levl[i][sy-1].typ == fg_typ) {
  599. X        if(levl[i][sy-1].roomno != rmno)
  600. X            flood_fill_rm(i,sy-1,rmno,lit,anyroom);
  601. X        } else {
  602. X        if((i>sx || isok(i-1,sy-1)) &&
  603. X              levl[i-1][sy-1].typ == fg_typ) {
  604. X            if(levl[i-1][sy-1].roomno != rmno)
  605. X            flood_fill_rm(i-1,sy-1,rmno,lit,anyroom);
  606. X        }
  607. X        if((i<nx-1 || isok(i+1,sy-1)) &&
  608. X              levl[i+1][sy-1].typ == fg_typ) {
  609. X            if(levl[i+1][sy-1].roomno != rmno)
  610. X            flood_fill_rm(i+1,sy-1,rmno,lit,anyroom);
  611. X        }
  612. X        }
  613. X    if(isok(sx,sy+1))
  614. X    for(i=sx; i<nx; i++)
  615. X        if(levl[i][sy+1].typ == fg_typ) {
  616. X        if(levl[i][sy+1].roomno != rmno)
  617. X            flood_fill_rm(i,sy+1,rmno,lit,anyroom);
  618. X        } else {
  619. X        if((i>sx || isok(i-1,sy+1)) &&
  620. X              levl[i-1][sy+1].typ == fg_typ) {
  621. X            if(levl[i-1][sy+1].roomno != rmno)
  622. X            flood_fill_rm(i-1,sy+1,rmno,lit,anyroom);
  623. X        }
  624. X        if((i<nx-1 || isok(i+1,sy+1)) &&
  625. X              levl[i+1][sy+1].typ == fg_typ) {
  626. X            if(levl[i+1][sy+1].roomno != rmno)
  627. X            flood_fill_rm(i+1,sy+1,rmno,lit,anyroom);
  628. X        }
  629. X        }
  630. X
  631. X    if(nx > max_rx) max_rx = nx - 1; /* nx is just past valid region */
  632. X    if(sy > max_ry) max_ry = sy;
  633. X}
  634. X
  635. X/*
  636. X *    If we have drawn a map without walls, this allows us to
  637. X *    auto-magically wallify it.  Taken from lev_main.c.
  638. X */
  639. Xstatic void
  640. Xwallify_map()
  641. X{
  642. X
  643. X    int x, y, xx, yy;
  644. X
  645. X    for(x = 1; x < COLNO; x++)
  646. X    for(y = 0; y < ROWNO; y++)
  647. X        if(levl[x][y].typ == STONE) {
  648. X        for(yy = y - 1; yy <= y+1; yy++)
  649. X            for(xx = x - 1; xx <= x+1; xx++)
  650. X            if(isok(xx,yy) && levl[xx][yy].typ == ROOM) {
  651. X                if(yy != y)    levl[x][y].typ = HWALL;
  652. X                else    levl[x][y].typ = VWALL;
  653. X            }
  654. X        }
  655. X}
  656. X
  657. Xstatic void
  658. Xjoin_map(bg_typ, fg_typ)
  659. X    schar    bg_typ, fg_typ;
  660. X{
  661. X    register struct mkroom *croom, *croom2;
  662. X
  663. X    register int i, j;
  664. X    int sx, sy;
  665. X    coord sm, em;
  666. X
  667. X    /* first, use flood filling to find all of the regions that need joining */
  668. X    for(i=2; i<=WIDTH; i++)
  669. X    for(j=1; j<HEIGHT; j++) {
  670. X        if(levl[i][j].typ == fg_typ && levl[i][j].roomno == NO_ROOM) {
  671. X        min_rx = max_rx = i;
  672. X        min_ry = max_ry = j;
  673. X        n_loc_filled = 0;
  674. X        flood_fill_rm(i,j,nroom+ROOMOFFSET,FALSE,FALSE);
  675. X        if(n_loc_filled > 3) {
  676. X            add_room(min_rx, min_ry, max_rx, max_ry,
  677. X                 FALSE, OROOM, TRUE);
  678. X            rooms[nroom-1].irregular = TRUE;
  679. X            if(nroom >= (MAXNROFROOMS*2))
  680. X            goto joinm;
  681. X        } else {
  682. X            /*
  683. X             * it's a tiny hole; erase it from the map to avoid
  684. X             * having the player end up here with no way out.
  685. X             */
  686. X            for(sx = min_rx; sx<=max_rx; sx++)
  687. X            for(sy = min_ry; sy<=max_ry; sy++)
  688. X                if(levl[sx][sy].roomno == nroom+ROOMOFFSET) {
  689. X                levl[sx][sy].typ = bg_typ;
  690. X                levl[sx][sy].roomno = NO_ROOM;
  691. X                }
  692. X        }
  693. X        }
  694. X    }
  695. X
  696. Xjoinm:
  697. X    /*
  698. X     * Ok, now we can actually join the regions with fg_typ's.
  699. X     * The rooms are already sorted due to the previous loop,
  700. X     * so don't call sort_rooms(), which can screw up the roomno's
  701. X     * validity in the levl structure.
  702. X     */
  703. X    for(croom = &rooms[0], croom2 = croom + 1; croom2 < &rooms[nroom]; ) {
  704. X    /* pick random starting and end locations for "corridor" */
  705. X    if(!somexy(croom, &sm) || !somexy(croom2, &em)) {
  706. X        /* ack! -- the level is going to be busted */
  707. X        /* arbitrarily pick centers of both rooms and hope for the best */
  708. X        impossible("No start/end room loc in join_map.");
  709. X        sm.x = croom->lx + ((croom->hx - croom->lx) / 2);
  710. X        sm.y = croom->ly + ((croom->hy - croom->ly) / 2);
  711. X        em.x = croom2->lx + ((croom2->hx - croom2->lx) / 2);
  712. X        em.y = croom2->ly + ((croom2->hy - croom2->ly) / 2);
  713. X    }
  714. X
  715. X    (void) dig_corridor(sm, em, FALSE, fg_typ, bg_typ);
  716. X
  717. X    /* choose next region to join */
  718. X    /* only increment croom if croom and croom2 are non-overlapping */
  719. X    if(croom2->lx > croom->hx ||
  720. X       ((croom2->ly > croom->hy || croom2->hy < croom->ly) && rn2(3))) {
  721. X        croom = croom2;
  722. X    }
  723. X    croom2++; /* always increment the next room */
  724. X    }
  725. X}
  726. X
  727. Xstatic void
  728. Xfinish_map(fg_typ, bg_typ, lit, walled)
  729. X        schar    fg_typ, bg_typ;
  730. X        boolean    lit, walled;
  731. X{
  732. X    int    i, j;
  733. X
  734. X    if(walled) wallify_map();
  735. X
  736. X    if(lit) {
  737. X        for(i=1; i<COLNO; i++)
  738. X        for(j=0; j<ROWNO; j++)
  739. X            if((!IS_ROCK(fg_typ) && levl[i][j].typ == fg_typ) ||
  740. X               (!IS_ROCK(bg_typ) && levl[i][j].typ == bg_typ) ||
  741. X            (walled && IS_WALL(levl[i][j].typ)))
  742. X            levl[i][j].lit = TRUE;
  743. X        for(i = 0; i < nroom; i++)
  744. X        rooms[i].rlit = 1;
  745. X    }
  746. X}
  747. X
  748. X#define    N_P1_ITER    1    /* tune map generation via this value */
  749. X#define    N_P2_ITER    1    /* tune map generation via this value */
  750. X#define    N_P3_ITER    2    /* tune map smoothing via this value */
  751. X
  752. Xvoid
  753. Xmkmap(init_lev)
  754. X
  755. X    lev_init    *init_lev;
  756. X{
  757. X    schar    bg_typ = init_lev->bg,
  758. X        fg_typ = init_lev->fg;
  759. X    boolean smooth = init_lev->smoothed,
  760. X                join = init_lev->joined;
  761. X        xchar   lit = init_lev->lit,
  762. X                walled = init_lev->walled;
  763. X    int i;
  764. X
  765. X    if(lit < 0)
  766. X        lit = (rnd(1+abs(depth(&u.uz))) < 11 && rn2(77)) ? 1 : 0;
  767. X
  768. X    new_locations = (char *)alloc((WIDTH+1) * HEIGHT);
  769. X
  770. X    init_map(bg_typ);
  771. X    init_fill(bg_typ, fg_typ);
  772. X
  773. X    for(i = 0; i < N_P1_ITER; i++)
  774. X        pass_one(bg_typ, fg_typ);
  775. X
  776. X    for(i = 0; i < N_P2_ITER; i++)
  777. X    pass_two(bg_typ, fg_typ);
  778. X
  779. X    if(smooth)
  780. X        for(i = 0; i < N_P3_ITER; i++)
  781. X        pass_three(bg_typ, fg_typ);
  782. X
  783. X    if(join)
  784. X        join_map(bg_typ, fg_typ);
  785. X
  786. X    finish_map(fg_typ, bg_typ, (boolean)lit, (boolean)walled);
  787. X    /* a walled, joined level is cavernous, not mazelike -dlc */
  788. X    if (walled && join) {
  789. X        level.flags.is_maze_lev = FALSE;
  790. X        level.flags.is_cavernous_lev = TRUE;
  791. X    }
  792. X    free(new_locations);
  793. X}
  794. END_OF_FILE
  795. if test 9999 -ne `wc -c <'src/mkmap.c'`; then
  796.     echo shar: \"'src/mkmap.c'\" unpacked with wrong size!
  797. fi
  798. # end of 'src/mkmap.c'
  799. fi
  800. if test -f 'sys/mac/macfile.c' -a "${1}" != "-c" ; then 
  801.   echo shar: Will not clobber existing file \"'sys/mac/macfile.c'\"
  802. else
  803. echo shar: Extracting \"'sys/mac/macfile.c'\" \(10224 characters\)
  804. sed "s/^X//" >'sys/mac/macfile.c' <<'END_OF_FILE'
  805. X/*    SCCS Id: @(#)macfile.c    3.1    93/01/24          */
  806. X/* Copyright (c) Jon W{tte, Hao-Yang Wang, Jonathan Handler 1992. */
  807. X/* NetHack may be freely redistributed.  See license for details. */
  808. X/*
  809. X * macfile.c
  810. X * MAC file I/O routines
  811. X */
  812. X
  813. X#include "hack.h"
  814. X
  815. X#include <files.h>
  816. X#include <errors.h>
  817. X#include <resources.h>
  818. X#include <memory.h>
  819. X#include <ToolUtils.h>
  820. X
  821. X/*
  822. X * We should get the default dirID and volRefNum (from name) from prefs and
  823. X * the situation at startup... For now, this will have to do.
  824. X */
  825. X
  826. X
  827. X/* The HandleFiles are resources built into the application which are treated
  828. X   as read-only files: if we fail to open a file we look for a resource */
  829. X   
  830. X#define FIRST_HF 32000   /* file ID of first HandleFile */
  831. X#define MAX_HF 6         /* Max # of open HandleFiles */
  832. X
  833. X#define APP_NAME_RES_ID        (-16396)
  834. X#define PLAYER_NAME_RES_ID    1001
  835. X
  836. Xint FDECL(maccreat,(const char *, long));
  837. Xint FDECL(macopen,(const char *, int, long));
  838. Xint FDECL(macclose,(int));
  839. Xint FDECL(macread,(int, void *, unsigned));
  840. Xint FDECL(macwrite,(int, void *, unsigned));
  841. Xlong FDECL(macseek,(int, long, short));
  842. X
  843. Xstatic short FDECL(IsHandleFile,(int));
  844. Xstatic int FDECL(OpenHandleFile,(const unsigned char *, long));
  845. Xstatic int FDECL(CloseHandleFile,(int));
  846. Xstatic int FDECL(ReadHandleFile,(int, void *, unsigned));
  847. Xstatic long FDECL(SetHandleFilePos,(int, short, long));
  848. Xstatic void FDECL(C2P,(const char *, unsigned char *));
  849. X
  850. Xtypedef struct handlefile {
  851. X    long        type ;  /* Resource type */
  852. X    short        id ;    /* Resource id */
  853. X    long        mark ;  /* Current position */
  854. X    long        size ;  /* total size */
  855. X    Handle        data ;  /* The resource, purgeable */
  856. X} HandleFile ;
  857. X
  858. XHandleFile theHandleFiles [ MAX_HF ] ;
  859. X
  860. Xstatic short
  861. XIsHandleFile ( int fd )
  862. X{
  863. X    return (fd >= FIRST_HF) && 
  864. X           (fd < FIRST_HF + MAX_HF) && 
  865. X           (theHandleFiles[ fd - FIRST_HF ].data) ;
  866. X}
  867. X
  868. X
  869. Xstatic int
  870. XOpenHandleFile ( const unsigned char * name , long fileType )
  871. X{
  872. X    int i ;
  873. X    OSErr err;
  874. X    Handle h ;
  875. X    Str255 s ;
  876. X
  877. X    for ( i = 0 ; i < MAX_HF ; i ++ ) {
  878. X        if ( theHandleFiles[i].data == 0L ) break ;
  879. X    }
  880. X    
  881. X    if ( i >= MAX_HF ) {
  882. X        error("Ran out of HandleFiles");
  883. X        return -1 ;
  884. X    }
  885. X
  886. X    h = GetNamedResource ( fileType , name ) ;
  887. X    err = ResError();
  888. X    if (err == resNotFound) return -1;  /* Don't complain, this might be normal */
  889. X    if ( ! itworked(err) ) return -1;
  890. X    
  891. X    theHandleFiles[i].data = h;
  892. X    theHandleFiles[i].size = GetHandleSize ( h ) ;
  893. X    GetResInfo ( h, & theHandleFiles[i].id, ( void* ) & theHandleFiles[i].type, s ) ;
  894. X    theHandleFiles[i].mark = 0L ;
  895. X
  896. X    HPurge( h ) ;
  897. X    return(i + FIRST_HF);
  898. X}
  899. X
  900. X
  901. Xstatic int
  902. XCloseHandleFile ( int fd )
  903. X{
  904. X    if ( ! IsHandleFile ( fd ) ) {
  905. X       error("CloseHandleFile: isn't a handle");
  906. X       return -1 ;
  907. X    }
  908. X    fd -= FIRST_HF ;
  909. X    ReleaseResource ( theHandleFiles[fd].data ) ;
  910. X    theHandleFiles[fd].data = 0L ;
  911. X    return(0);
  912. X}
  913. X
  914. X
  915. Xstatic int
  916. XReadHandleFile ( int fd , void * ptr , unsigned len )
  917. X{
  918. X    unsigned maxBytes ;
  919. X    Handle h ;
  920. X
  921. X    if ( ! IsHandleFile ( fd ) ) return -1;
  922. X    
  923. X    fd -= FIRST_HF ;
  924. X    maxBytes = theHandleFiles[fd].size - theHandleFiles[fd].mark ;
  925. X    if ( len > maxBytes ) len = maxBytes ;
  926. X    
  927. X    h = theHandleFiles[fd].data ;
  928. X    LoadResource ( h ) ;
  929. X    if ( ! itworked(ResError()) ) return (-1);
  930. X    
  931. X    HLock(h);
  932. X    BlockMove ( *h , ptr , len );
  933. X    HUnlock(h);
  934. X    theHandleFiles[fd].mark += len ;
  935. X
  936. X/*    comment("ReadHandleFile ",len); */
  937. X    
  938. X    return(len);
  939. X}
  940. X
  941. X
  942. Xstatic long
  943. XSetHandleFilePos ( int fd , short whence , long pos )
  944. X{
  945. X    long curpos;
  946. X    
  947. X    if ( ! IsHandleFile ( fd ) ) return -1;
  948. X    
  949. X    fd -= FIRST_HF ;
  950. X    
  951. X    curpos = theHandleFiles [ fd ].mark;
  952. X    switch ( whence ) {
  953. X    case SEEK_CUR : 
  954. X        curpos += pos ;
  955. X        break ;
  956. X    case SEEK_END : 
  957. X        curpos = theHandleFiles[fd].size  - pos ;
  958. X        break ;
  959. X    default : /* set */
  960. X        curpos = pos ;
  961. X        break ;
  962. X    }
  963. X
  964. X    if ( curpos < 0 ) curpos = 0 ;
  965. X    
  966. X    if ( curpos > theHandleFiles [ fd ].size ) curpos = theHandleFiles [ fd ].size ;
  967. X    
  968. X    theHandleFiles [ fd ].mark = curpos;
  969. X    
  970. X    return curpos ;
  971. X}
  972. X
  973. X
  974. Xstatic void
  975. XC2P ( const char * c , unsigned char * p )
  976. X{
  977. X    long len = strlen ( c ) ;
  978. X
  979. X    if ( len > 255 ) len = 255 ;
  980. X
  981. X    p[0] = len & 0xff ;
  982. X    while (*c) *++p = *c++;
  983. X}
  984. X
  985. Xstatic void
  986. XP2C ( const unsigned char * p , char * c )
  987. X{
  988. X    int idx = p[0];
  989. X    c[idx] = '\0';
  990. X    while (idx > 0) {
  991. X        c[idx-1] = p[idx];
  992. X        --idx;
  993. X    }
  994. X}
  995. X
  996. X
  997. Xstatic void
  998. Xreplace_resource(Handle new_res, ResType its_type, short its_id,
  999. X                 Str255 its_name) {
  1000. X    Handle old_res;
  1001. X    SetResLoad(false);
  1002. X    old_res = Get1Resource(its_type, its_id);
  1003. X    SetResLoad(true);
  1004. X    if (old_res) {
  1005. X        RmveResource(old_res);
  1006. X        DisposHandle(old_res);
  1007. X    }
  1008. X
  1009. X    AddResource(new_res, its_type, its_id, its_name);
  1010. X}
  1011. X
  1012. X
  1013. Xint
  1014. Xmaccreat ( const char * name , long fileType )
  1015. X{
  1016. X    return macopen ( name , O_RDWR | O_CREAT | O_TRUNC , fileType ) ;
  1017. X}
  1018. X
  1019. X
  1020. Xint
  1021. Xmacopen ( const char * name , int flags , long fileType )
  1022. X{
  1023. X    short refNum ;
  1024. X    short perm ;
  1025. X    Str255 s ;
  1026. X
  1027. X    C2P ( name , s ) ;
  1028. X    if ( flags & O_CREAT ) {
  1029. X        if ( HCreate ( theDirs.dataRefNum , theDirs.dataDirID , s ,
  1030. X            MAC_CREATOR , fileType ) && ( flags & O_EXCL ) ) {
  1031. X            return -1 ;
  1032. X        }
  1033. X
  1034. X        if (fileType == SAVE_TYPE) {
  1035. X            short resRef;
  1036. X            HCreateResFile(theDirs.dataRefNum, theDirs.dataDirID, s);
  1037. X            resRef = HOpenResFile(theDirs.dataRefNum, theDirs.dataDirID, s,
  1038. X                                  fsRdWrPerm);
  1039. X            if (resRef != -1) {
  1040. X                Handle name;
  1041. X                Str255 plnamep;
  1042. X
  1043. X                C2P(plname, plnamep);
  1044. X                name = (Handle)NewString(plnamep);
  1045. X                if (name)
  1046. X                    replace_resource(name, 'STR ', PLAYER_NAME_RES_ID,
  1047. X                                    "\pPlayer Name");
  1048. X
  1049. X                /* The application name resource.  See IM VI, page 9-21. */
  1050. X                name = (Handle)GetString(APP_NAME_RES_ID);
  1051. X                if (name) {
  1052. X                    DetachResource(name);
  1053. X                    replace_resource(name, 'STR ', APP_NAME_RES_ID,
  1054. X                                     "\pApplication Name");
  1055. X                }
  1056. X
  1057. X                CloseResFile(resRef);
  1058. X            }
  1059. X        }
  1060. X
  1061. X    }
  1062. X    /*
  1063. X     * Here, we should check for file type, maybe a SFdialog if
  1064. X     * we fail with default, etc. etc. Besides, we should use HOpen
  1065. X     * and permissions.
  1066. X     */
  1067. X    if ( ( flags & O_RDONLY ) == O_RDONLY ) {
  1068. X        perm = fsRdPerm ;
  1069. X    }
  1070. X    if ( ( flags & O_WRONLY ) == O_WRONLY ) {
  1071. X        perm = fsWrPerm ;
  1072. X    }
  1073. X    if ( ( flags & O_RDWR ) == O_RDWR ) {
  1074. X        perm = fsRdWrPerm ;
  1075. X    }
  1076. X    if ( HOpen ( theDirs.dataRefNum , theDirs.dataDirID , s ,
  1077. X        perm , & refNum ) ) {
  1078. X        return OpenHandleFile ( s , fileType ) ;
  1079. X    }
  1080. X    if ( flags & O_TRUNC ) {
  1081. X        if ( SetEOF ( refNum , 0L ) ) {
  1082. X            FSClose ( refNum ) ;
  1083. X            return -1 ;
  1084. X        }
  1085. X    }
  1086. X    return refNum ;
  1087. X}
  1088. X
  1089. X
  1090. Xint
  1091. Xmacclose ( int fd )
  1092. X{
  1093. X    if ( IsHandleFile ( fd ) ) {
  1094. X        CloseHandleFile ( fd ) ;
  1095. X    } else {
  1096. X        if ( FSClose ( fd ) ) {
  1097. X            return -1 ;
  1098. X        }
  1099. X        FlushVol ( NULL , theDirs . dataRefNum ) ;
  1100. X    }
  1101. X    return 0 ;
  1102. X}
  1103. X
  1104. X
  1105. Xint
  1106. Xmacread ( int fd , void * ptr , unsigned len )
  1107. X{
  1108. X    long amt = len;
  1109. X    
  1110. X    if ( IsHandleFile ( fd ) ) {
  1111. X
  1112. X        return ReadHandleFile ( fd , ptr , amt ) ;
  1113. X    } else {
  1114. X
  1115. X        short err = FSRead ( fd , & amt , ptr ) ;
  1116. X        if ( err == eofErr && len ) {
  1117. X
  1118. X            return amt ;
  1119. X        }
  1120. X        if  ( itworked ( err ) ) {
  1121. X
  1122. X            return ( amt ) ;
  1123. X
  1124. X        } else {
  1125. X
  1126. X            return -1 ;
  1127. X        }
  1128. X    }
  1129. X}
  1130. X
  1131. X
  1132. Xint
  1133. Xmacwrite ( int fd , void * ptr , unsigned len )
  1134. X{
  1135. X    long amt = len ;
  1136. X
  1137. X    if ( IsHandleFile ( fd ) ) return -1 ;
  1138. X    
  1139. X    if ( itworked( FSWrite ( fd , & amt , ptr ) ) ) return(amt) ;
  1140. X        else return(-1) ;
  1141. X}
  1142. X
  1143. X
  1144. Xlong
  1145. Xmacseek ( int fd , long where , short whence )
  1146. X{
  1147. X    short posMode ;
  1148. X    long curPos ;
  1149. X
  1150. X    if ( IsHandleFile ( fd ) ) {
  1151. X        return SetHandleFilePos ( fd , whence , where ) ;
  1152. X    }
  1153. X
  1154. X    switch ( whence ) {
  1155. X    default :
  1156. X        posMode = fsFromStart ;
  1157. X        break ;
  1158. X    case SEEK_CUR :
  1159. X        posMode = fsFromMark ;
  1160. X        break ;
  1161. X    case SEEK_END :
  1162. X        posMode = fsFromLEOF ;
  1163. X        break ;
  1164. X    }
  1165. X
  1166. X    if ( itworked( SetFPos ( fd , posMode, where ) )  &&
  1167. X         itworked( GetFPos ( fd , &curPos )) )
  1168. X            return(curPos);
  1169. X       
  1170. X    return(-1);
  1171. X}
  1172. X
  1173. X
  1174. Xstatic OSErr
  1175. Xcopy_file(short src_vol, long src_dir, short dst_vol, long dst_dir,
  1176. X          Str255 fName,
  1177. X          pascal OSErr (*opener)(short vRefNum, long dirID,
  1178. X                                 ConstStr255Param fileName,
  1179. X                                 char permission, short *refNum)) {
  1180. X    short src_ref, dst_ref;
  1181. X    OSErr err = (*opener)(src_vol, src_dir, fName, fsRdPerm, &src_ref);
  1182. X    if (err == noErr) {
  1183. X        err = (*opener)(dst_vol, dst_dir, fName, fsWrPerm, &dst_ref);
  1184. X        if (err == noErr) {
  1185. X
  1186. X            long file_len;
  1187. X            err = GetEOF(src_ref, &file_len);
  1188. X            if (err == noErr) {
  1189. X                Handle buf;
  1190. X                long count = MaxBlock();
  1191. X                if (count > file_len)
  1192. X                    count = file_len;
  1193. X
  1194. X                buf = NewHandle(count);
  1195. X                err = MemError();
  1196. X                if (err == noErr) {
  1197. X
  1198. X                    while (count > 0) {
  1199. X                        OSErr rd_err = FSRead(src_ref, &count, *buf);
  1200. X                        err = FSWrite(dst_ref, &count, *buf);
  1201. X                        if (err == noErr)
  1202. X                            err = rd_err;
  1203. X                        file_len -= count;
  1204. X                    }
  1205. X                    if (file_len == 0)
  1206. X                        err = noErr;
  1207. X
  1208. X                    DisposHandle(buf);
  1209. X
  1210. X                }
  1211. X            }
  1212. X            FSClose(dst_ref);
  1213. X        }
  1214. X        FSClose(src_ref);
  1215. X    }
  1216. X
  1217. X    return err;
  1218. X}
  1219. X
  1220. Xstatic void
  1221. Xforce_hdelete(short vol, long dir, Str255 fName) {
  1222. X    HRstFLock(vol, dir, fName);
  1223. X    HDelete  (vol, dir, fName);
  1224. X}
  1225. X
  1226. Xvoid
  1227. Xfinder_file_request(void) {
  1228. X    short finder_msg, file_count;
  1229. X    CountAppFiles(&finder_msg, &file_count);
  1230. X    if (finder_msg == appOpen && file_count == 1) {
  1231. X        OSErr    err;
  1232. X        AppFile src;
  1233. X        short    src_vol;
  1234. X        long    src_dir, nul = 0;
  1235. X        GetAppFiles(1, &src);
  1236. X        err = GetWDInfo(src.vRefNum, &src_vol, &src_dir, &nul);
  1237. X        if (err == noErr && src.fType == SAVE_TYPE) {
  1238. X
  1239. X            if ( src_vol != theDirs.dataRefNum ||
  1240. X                 src_dir != theDirs.dataDirID &&
  1241. X                 CatMove(src_vol, src_dir, src.fName,
  1242. X                         theDirs.dataDirID, "\p:") != noErr) {
  1243. X
  1244. X                HCreate(theDirs.dataRefNum, theDirs.dataDirID, src.fName,
  1245. X                        MAC_CREATOR, SAVE_TYPE);
  1246. X                err = copy_file(src_vol, src_dir, theDirs.dataRefNum,
  1247. X                                theDirs.dataDirID, src.fName, &HOpen); /* HOpenDF is only there under 7.0 */
  1248. X                if (err == noErr)
  1249. X                    err = copy_file(src_vol, src_dir, theDirs.dataRefNum,
  1250. X                                    theDirs.dataDirID, src.fName, &HOpenRF);
  1251. X                if (err == noErr)
  1252. X                    force_hdelete(src_vol, src_dir, src.fName);
  1253. X                else
  1254. X                    HDelete(theDirs.dataRefNum, theDirs.dataDirID, src.fName);
  1255. X            }
  1256. X
  1257. X            if (err == noErr) {
  1258. X                short ref = HOpenResFile(theDirs.dataRefNum, theDirs.dataDirID,
  1259. X                                         src.fName, fsRdPerm);
  1260. X                if (ref != -1) {
  1261. X                    Handle name = Get1Resource('STR ', PLAYER_NAME_RES_ID);
  1262. X                    if (name) {
  1263. X
  1264. X                        Str255 save_f_p;
  1265. X                        P2C(*(StringHandle)name, plname);
  1266. X                        set_savefile_name();
  1267. X                        C2P(SAVEF, save_f_p);
  1268. X                        force_hdelete(theDirs.dataRefNum, theDirs.dataDirID,
  1269. X                                      save_f_p);
  1270. X                        if (HRename(theDirs.dataRefNum, theDirs.dataDirID,
  1271. X                                    src.fName, save_f_p) == noErr)
  1272. X                            ClrAppFiles(1);
  1273. X
  1274. X                    }
  1275. X                    CloseResFile(ref);
  1276. X                }
  1277. X            }
  1278. X        }
  1279. X    }
  1280. X}
  1281. END_OF_FILE
  1282. if test 10224 -ne `wc -c <'sys/mac/macfile.c'`; then
  1283.     echo shar: \"'sys/mac/macfile.c'\" unpacked with wrong size!
  1284. fi
  1285. # end of 'sys/mac/macfile.c'
  1286. fi
  1287. if test -f 'sys/msdos/msdos.c' -a "${1}" != "-c" ; then 
  1288.   echo shar: Will not clobber existing file \"'sys/msdos/msdos.c'\"
  1289. else
  1290. echo shar: Extracting \"'sys/msdos/msdos.c'\" \(9955 characters\)
  1291. sed "s/^X//" >'sys/msdos/msdos.c' <<'END_OF_FILE'
  1292. X/*    SCCS Id: @(#)msdos.c     3.1     93/01/05          */
  1293. X/* Copyright (c) NetHack PC Development Team 1990, 1991, 1992      */
  1294. X/* NetHack may be freely redistributed.  See license for details. */
  1295. X
  1296. X/*
  1297. X *  MSDOS system functions.
  1298. X *  Many thanks to Don Kneller who originated the DOS port and
  1299. X *  contributed much to the cause.
  1300. X */
  1301. X
  1302. X#define NEED_VARARGS
  1303. X#include "hack.h"
  1304. X#ifdef MICRO
  1305. X#include "termcap.h"
  1306. X#endif
  1307. X
  1308. X#ifdef MSDOS
  1309. X
  1310. X#include <dos.h>
  1311. X#include <ctype.h>
  1312. X
  1313. X/*
  1314. X * MS-DOS functions
  1315. X */
  1316. X#define DIRECT_INPUT    0x07    /* Unfiltered Character Input Without Echo */
  1317. X#define FATINFO     0x1B    /* Get Default Drive Data */
  1318. X/* MS-DOS 2.0+: */
  1319. X#define GETDTA      0x2F    /* Get DTA Address */
  1320. X#define FREESPACE   0x36    /* Get Drive Allocation Info */
  1321. X#define GETSWITCHAR 0x3700  /* Get Switch Character */
  1322. X#define FINDFIRST   0x4E    /* Find First File */
  1323. X#define FINDNEXT    0x4F    /* Find Next File */
  1324. X#define SETFILETIME 0x5701  /* Set File Date & Time */
  1325. X/*
  1326. X * BIOS interrupts
  1327. X */
  1328. X#define KEYBRD_BIOS 0x16
  1329. X#define VIDEO_BIOS  0x10
  1330. X/*
  1331. X * Keyboard BIOS functions
  1332. X */
  1333. X#define READCHAR    0x00    /* Read Character from Keyboard */
  1334. X#define GETKEYFLAGS 0x02    /* Get Keyboard Flags */
  1335. X/*
  1336. X * Video BIOS functions
  1337. X */
  1338. X#define SETCURPOS   0x02    /* Set Cursor Position */
  1339. X#define GETMODE     0x0f    /* Get Video Mode */
  1340. X#define FONTINFO    0x1130  /* Get Font Info */
  1341. X
  1342. X
  1343. X#ifdef OVL0
  1344. X
  1345. X/* direct bios calls are used only when flags.BIOS is set */
  1346. X
  1347. Xstatic char NDECL(DOSgetch);
  1348. Xstatic char NDECL(BIOSgetch);
  1349. Xstatic char * NDECL(getdta);
  1350. Xstatic unsigned int FDECL(dos_ioctl, (int,int,unsigned));
  1351. X
  1352. Xint
  1353. Xtgetch()
  1354. X{
  1355. X    char ch;
  1356. X
  1357. X    /* BIOSgetch can use the numeric key pad on IBM compatibles. */
  1358. X    if (flags.BIOS)
  1359. X        ch = BIOSgetch();
  1360. X    else
  1361. X        ch = DOSgetch();
  1362. X    return ((ch == '\r') ? '\n' : ch);
  1363. X}
  1364. X
  1365. X
  1366. X
  1367. X/*
  1368. X *  Keyboard translation tables.
  1369. X */
  1370. X#define KEYPADLO    0x47
  1371. X#define KEYPADHI    0x53
  1372. X
  1373. X#define PADKEYS     (KEYPADHI - KEYPADLO + 1)
  1374. X#define iskeypad(x)    (KEYPADLO <= (x) && (x) <= KEYPADHI)
  1375. X
  1376. X/*
  1377. X * Keypad keys are translated to the normal values below.
  1378. X * When flags.BIOS is active, shifted keypad keys are translated to the
  1379. X *    shift values below.
  1380. X */
  1381. Xstatic const struct pad {
  1382. X    char normal, shift, cntrl;
  1383. X} keypad[PADKEYS] = {
  1384. X            {'y', 'Y', C('y')},        /* 7 */
  1385. X            {'k', 'K', C('k')},        /* 8 */
  1386. X            {'u', 'U', C('u')},        /* 9 */
  1387. X            {'m', C('p'), C('p')},        /* - */
  1388. X            {'h', 'H', C('h')},        /* 4 */
  1389. X            {'g', 'g', 'g'},        /* 5 */
  1390. X            {'l', 'L', C('l')},        /* 6 */
  1391. X            {'p', 'P', C('p')},        /* + */
  1392. X            {'b', 'B', C('b')},        /* 1 */
  1393. X            {'j', 'J', C('j')},        /* 2 */
  1394. X            {'n', 'N', C('n')},        /* 3 */
  1395. X            {'i', 'I', C('i')},        /* Ins */
  1396. X            {'.', ':', ':'}            /* Del */
  1397. X}, numpad[PADKEYS] = {
  1398. X            {'7', M('7'), '7'},        /* 7 */
  1399. X            {'8', M('8'), '8'},        /* 8 */
  1400. X            {'9', M('9'), '9'},        /* 9 */
  1401. X            {'m', C('p'), C('p')},        /* - */
  1402. X            {'4', M('4'), '4'},        /* 4 */
  1403. X            {'g', 'G', 'g'},        /* 5 */
  1404. X            {'6', M('6'), '6'},        /* 6 */
  1405. X            {'p', 'P', C('p')},        /* + */
  1406. X            {'1', M('1'), '1'},        /* 1 */
  1407. X            {'2', M('2'), '2'},        /* 2 */
  1408. X            {'3', M('3'), '3'},        /* 3 */
  1409. X            {'i', 'I', C('i')},        /* Ins */
  1410. X            {'.', ':', ':'}            /* Del */
  1411. X};
  1412. X
  1413. X/*
  1414. X * Unlike Ctrl-letter, the Alt-letter keystrokes have no specific ASCII
  1415. X * meaning unless assigned one by a keyboard conversion table, so the
  1416. X * keyboard BIOS normally does not return a character code when Alt-letter
  1417. X * is pressed.    So, to interpret unassigned Alt-letters, we must use a
  1418. X * scan code table to translate the scan code into a letter, then set the
  1419. X * "meta" bit for it.  -3.
  1420. X */
  1421. X#define SCANLO        0x10
  1422. X#define SCANHI        0x32
  1423. X#define SCANKEYS    (SCANHI - SCANLO + 1)
  1424. X#define inmap(x)    (SCANLO <= (x) && (x) <= SCANHI)
  1425. X
  1426. Xstatic const char scanmap[SCANKEYS] = {     /* ... */
  1427. X    'q','w','e','r','t','y','u','i','o','p','[',']', '\n',
  1428. X    0, 'a','s','d','f','g','h','j','k','l',';','\'', '`',
  1429. X    0, '\\', 'z','x','c','v','b','N','m'     /* ... */
  1430. X};
  1431. X
  1432. X/*
  1433. X * BIOSgetch gets keys directly with a BIOS call.
  1434. X */
  1435. X#define SHIFT        (0x1 | 0x2)
  1436. X#define CTRL        0x4
  1437. X#define ALT        0x8
  1438. X
  1439. Xstatic char
  1440. XBIOSgetch()
  1441. X{
  1442. X    unsigned char scan, shift, ch;
  1443. X    const struct pad *kpad;
  1444. X
  1445. X    union REGS regs;
  1446. X
  1447. X    /* Get scan code.
  1448. X     */
  1449. X    regs.h.ah = READCHAR;
  1450. X    int86(KEYBRD_BIOS, ®s, ®s);
  1451. X    ch = regs.h.al;
  1452. X    scan = regs.h.ah;
  1453. X    /* Get shift status.
  1454. X     */
  1455. X    regs.h.ah = GETKEYFLAGS;
  1456. X    int86(KEYBRD_BIOS, ®s, ®s);
  1457. X    shift = regs.h.al;
  1458. X
  1459. X    /* Translate keypad keys */
  1460. X    if (iskeypad(scan)) {
  1461. X        kpad = flags.num_pad ? numpad : keypad;
  1462. X        if (shift & SHIFT)
  1463. X            ch = kpad[scan - KEYPADLO].shift;
  1464. X        else if (shift & CTRL)
  1465. X            ch = kpad[scan - KEYPADLO].cntrl;
  1466. X        else
  1467. X            ch = kpad[scan - KEYPADLO].normal;
  1468. X    }
  1469. X    /* Translate unassigned Alt-letters */
  1470. X    if ((shift & ALT) && !ch) {
  1471. X        if (inmap(scan))
  1472. X            ch = scanmap[scan - SCANLO];
  1473. X        return (isprint(ch) ? M(ch) : ch);
  1474. X    }
  1475. X    return ch;
  1476. X}
  1477. X
  1478. Xstatic char
  1479. XDOSgetch()
  1480. X{
  1481. X    union REGS regs;
  1482. X    char ch;
  1483. X    struct pad (*kpad)[PADKEYS];
  1484. X
  1485. X    regs.h.ah = DIRECT_INPUT;
  1486. X    intdos(®s, ®s);
  1487. X    ch = regs.h.al;
  1488. X
  1489. X    /*
  1490. X     * The extended codes for Alt-shifted letters, and unshifted keypad
  1491. X     * and function keys, correspond to the scan codes.  So we can still
  1492. X     * translate the unshifted cursor keys and Alt-letters.  -3.
  1493. X     */
  1494. X    if (ch == 0) {        /* an extended key */
  1495. X        regs.h.ah = DIRECT_INPUT;
  1496. X        intdos(®s, ®s);    /* get the extended key code */
  1497. X        ch = regs.h.al;
  1498. X
  1499. X        if (iskeypad(ch)) {    /* unshifted keypad keys */
  1500. X            kpad = (void *)(flags.num_pad ? numpad : keypad);
  1501. X            ch = (*kpad)[ch - KEYPADLO].normal;
  1502. X        } else if (inmap(ch)) { /* Alt-letters */
  1503. X            ch = scanmap[ch - SCANLO];
  1504. X            if (isprint(ch)) ch = M(ch);
  1505. X        } else ch = 0;        /* munch it */
  1506. X    }
  1507. X    return (ch);
  1508. X}
  1509. X
  1510. Xchar
  1511. Xswitchar()
  1512. X{
  1513. X    union REGS regs;
  1514. X
  1515. X    regs.x.ax = GETSWITCHAR;
  1516. X    intdos(®s, ®s);
  1517. X    return regs.h.dl;
  1518. X}
  1519. X
  1520. Xlong
  1521. Xfreediskspace(path)
  1522. Xchar *path;
  1523. X{
  1524. X    union REGS regs;
  1525. X
  1526. X    regs.h.ah = FREESPACE;
  1527. X    if (path[0] && path[1] == ':')
  1528. X        regs.h.dl = (toupper(path[0]) - 'A') + 1;
  1529. X    else
  1530. X        regs.h.dl = 0;
  1531. X    intdos(®s, ®s);
  1532. X    if (regs.x.ax == 0xFFFF)
  1533. X        return -1L;        /* bad drive number */
  1534. X    else
  1535. X        return ((long) regs.x.bx * regs.x.cx * regs.x.ax);
  1536. X}
  1537. X
  1538. X#ifndef __GO32__
  1539. X/*
  1540. X * Functions to get filenames using wildcards
  1541. X */
  1542. Xint
  1543. Xfindfirst(path)
  1544. Xchar *path;
  1545. X{
  1546. X    union REGS regs;
  1547. X    struct SREGS sregs;
  1548. X
  1549. X    regs.h.ah = FINDFIRST;
  1550. X    regs.x.cx = 0;        /* attribute: normal files */
  1551. X    regs.x.dx = FP_OFF(path);
  1552. X    sregs.ds = FP_SEG(path);
  1553. X    intdosx(®s, ®s, &sregs);
  1554. X    return !regs.x.cflag;
  1555. X}
  1556. X
  1557. Xint
  1558. Xfindnext() {
  1559. X    union REGS regs;
  1560. X
  1561. X    regs.h.ah = FINDNEXT;
  1562. X    intdos(®s, ®s);
  1563. X    return !regs.x.cflag;
  1564. X}
  1565. X
  1566. Xchar *
  1567. Xfoundfile_buffer()
  1568. X{
  1569. X    return (getdta() + 30);
  1570. X}
  1571. X
  1572. X
  1573. X/* Get disk transfer area */
  1574. Xstatic char *
  1575. Xgetdta()
  1576. X{
  1577. X    union REGS regs;
  1578. X    struct SREGS sregs;
  1579. X    char *ret;
  1580. X
  1581. X    regs.h.ah = GETDTA;
  1582. X    intdosx(®s, ®s, &sregs);
  1583. X#   ifdef MK_FP
  1584. X    ret = MK_FP(sregs.es, regs.x.bx);
  1585. X#   else
  1586. X    FP_OFF(ret) = regs.x.bx;
  1587. X    FP_SEG(ret) = sregs.es;
  1588. X#   endif
  1589. X    return ret;
  1590. X}
  1591. X
  1592. Xlong
  1593. Xfilesize(file)
  1594. Xchar *file;
  1595. X{
  1596. X    char *dta;
  1597. X
  1598. X    if (findfirst(file)) {
  1599. X        dta = getdta();
  1600. X        return  (* (long *) (dta + 26));
  1601. X    } else
  1602. X        return -1L;
  1603. X}
  1604. X
  1605. X#endif /* __GO32__ */
  1606. X
  1607. X/*
  1608. X * Chdrive() changes the default drive.
  1609. X */
  1610. Xvoid
  1611. Xchdrive(str)
  1612. Xchar *str;
  1613. X{
  1614. X#  define SELECTDISK    0x0E
  1615. X    char *ptr;
  1616. X    union REGS inregs;
  1617. X    char drive;
  1618. X
  1619. X    if ((ptr = index(str, ':')) != NULL) {
  1620. X        drive = toupper(*(ptr - 1));
  1621. X        inregs.h.ah = SELECTDISK;
  1622. X        inregs.h.dl = drive - 'A';
  1623. X        intdos(&inregs, &inregs);
  1624. X    }
  1625. X    return;
  1626. X}
  1627. X
  1628. X
  1629. X/* Use the IOCTL DOS function call to change stdin and stdout to raw
  1630. X * mode.  For stdin, this prevents MSDOS from trapping ^P, thus
  1631. X * freeing us of ^P toggling 'echo to printer'.
  1632. X * Thanks to Mark Zbikowski (markz@microsoft.UUCP).
  1633. X */
  1634. X
  1635. X#define DEVICE        0x80
  1636. X#define RAW        0x20
  1637. X#define IOCTL        0x44
  1638. X#define STDIN        fileno(stdin)
  1639. X#define STDOUT        fileno(stdout)
  1640. X#define GETBITS        0
  1641. X#define SETBITS        1
  1642. X
  1643. Xstatic unsigned    int old_stdin, old_stdout;
  1644. X
  1645. Xvoid
  1646. Xdisable_ctrlP()
  1647. X{
  1648. X
  1649. X    if (!flags.rawio) return;
  1650. X
  1651. X    old_stdin = dos_ioctl(STDIN, GETBITS, 0);
  1652. X    old_stdout = dos_ioctl(STDOUT, GETBITS, 0);
  1653. X    if (old_stdin & DEVICE)
  1654. X        dos_ioctl(STDIN, SETBITS, old_stdin | RAW);
  1655. X    if (old_stdout & DEVICE)
  1656. X        dos_ioctl(STDOUT, SETBITS, old_stdout | RAW);
  1657. X    return;
  1658. X}
  1659. X
  1660. Xvoid
  1661. Xenable_ctrlP()
  1662. X{
  1663. X    if (!flags.rawio) return;
  1664. X    if (old_stdin)
  1665. X        (void) dos_ioctl(STDIN, SETBITS, old_stdin);
  1666. X    if (old_stdout)
  1667. X        (void) dos_ioctl(STDOUT, SETBITS, old_stdout);
  1668. X    return;
  1669. X}
  1670. X
  1671. Xstatic unsigned int
  1672. Xdos_ioctl(handle, mode, setvalue)
  1673. Xint handle, mode;
  1674. Xunsigned setvalue;
  1675. X{
  1676. X    union REGS regs;
  1677. X
  1678. X    regs.h.ah = IOCTL;
  1679. X    regs.h.al = mode;
  1680. X    regs.x.bx = handle;
  1681. X    regs.h.dl = setvalue;
  1682. X    regs.h.dh = 0;            /* Zero out dh */
  1683. X    intdos(®s, ®s);
  1684. X    return (regs.x.dx);
  1685. X}
  1686. X
  1687. X#endif /* OVL0 */
  1688. X#ifdef OVLB
  1689. X
  1690. Xvoid
  1691. Xget_scr_size()
  1692. X{
  1693. X    union REGS regs;
  1694. X
  1695. X    if (!flags.BIOS) {        /* assume standard screen size */
  1696. X        CO = 80;
  1697. X        LI = 24;
  1698. X        return;
  1699. X    }
  1700. X
  1701. X    regs.x.ax = FONTINFO;
  1702. X    regs.x.bx = 0;            /* current ROM BIOS font */
  1703. X    regs.h.dl = 24;            /* default row count */
  1704. X                    /* in case no EGA/MCGA/VGA */
  1705. X    int86(VIDEO_BIOS, ®s, ®s); /* Get Font Information */
  1706. X
  1707. X    /* MDA/CGA/PCjr ignore INT 10h, Function 11h, but since we
  1708. X     * cleverly loaded up DL with the default, everything's fine.
  1709. X     *
  1710. X     * Otherwise, DL now contains rows - 1.  Also, CX contains the
  1711. X     * points (bytes per character) and ES:BP points to the font
  1712. X     * table.  -3.
  1713. X     */
  1714. X
  1715. X    regs.h.ah = GETMODE;
  1716. X    int86(VIDEO_BIOS, ®s, ®s); /* Get Video Mode */
  1717. X
  1718. X    /* This goes back all the way to the original PC.  Completely
  1719. X     * safe.  AH contains # of columns, AL contains display mode,
  1720. X     * and BH contains the active display page.
  1721. X     */
  1722. X
  1723. X    LI = regs.h.dl + 1;
  1724. X    CO = regs.h.ah;
  1725. X}
  1726. X
  1727. X#endif /* OVLB */
  1728. X#ifdef OVL0
  1729. X
  1730. Xvoid
  1731. Xgotoxy(x,y)
  1732. Xint x,y;
  1733. X{
  1734. X    union REGS regs;
  1735. X
  1736. X    x--; y--;            /* (0,0) is upper right corner */
  1737. X
  1738. X    regs.h.ah = SETCURPOS;
  1739. X    regs.h.bh = 0;            /* display page */
  1740. X    regs.h.dh = y;            /* row */
  1741. X    regs.h.dl = x;            /* column */
  1742. X    int86(VIDEO_BIOS, ®s, ®s); /* Set Cursor Position */
  1743. X
  1744. X    /* This, too, goes back all the way to the original PC.  If
  1745. X     * we ever get so fancy as to swap display pages (i doubt it),
  1746. X     * then we'll need to set BH appropriately.  This function
  1747. X     * returns nothing.  -3.
  1748. X     */
  1749. X}
  1750. X
  1751. X#endif /* OVL0 */
  1752. X
  1753. X#endif /* MSDOS */
  1754. END_OF_FILE
  1755. if test 9955 -ne `wc -c <'sys/msdos/msdos.c'`; then
  1756.     echo shar: \"'sys/msdos/msdos.c'\" unpacked with wrong size!
  1757. fi
  1758. # end of 'sys/msdos/msdos.c'
  1759. fi
  1760. if test -f 'sys/vms/nethack.com' -a "${1}" != "-c" ; then 
  1761.   echo shar: Will not clobber existing file \"'sys/vms/nethack.com'\"
  1762. else
  1763. echo shar: Extracting \"'sys/vms/nethack.com'\" \(2378 characters\)
  1764. sed "s/^X//" >'sys/vms/nethack.com' <<'END_OF_FILE'
  1765. X$! NetHack.Com -- sample command procedure for invoking NetHack  9-JAN-1993
  1766. X$ v = 'f$verify(0)'
  1767. X$!
  1768. X$!    Possible command line arguments include
  1769. X$!    "-uConan-B"    !play a barbarian named Conan
  1770. X$!    "-u" "Merlin-W" !play a wizard named Merlin (slight variant of above)
  1771. X$!    "-e" or "-E"    !play an elf with default name (from environment
  1772. X$!            ! [ie, NETHACKOPTIONS logical name] or VMS username)
  1773. X$!    "-a" or "-A", "-b" or "-B", "-c" or "-C", ... !specify character type
  1774. X$!            !note: "-s" is ambiguous between "play as a samurai"
  1775. X$!            !   vs "show scoreboard", so use "-S" for the former
  1776. X$!    "-x" or "-X"    !play in 'explore' mode (practice for beginners)
  1777. X$!    "-D"        !play in 'wizard' mode (for debugging, available only
  1778. X$!            ! to the username compiled into nethack.exe as WIZARD)
  1779. X$!    "-dec"        !turn on DECgraphics mode (VT100 line drawing, done
  1780. X$!            ! automatically below if appropriate term attribs set)
  1781. X$!    "-d" dir-path    !specify an alternate playground directory (not
  1782. X$!            ! recommended; define HACKDIR instead)
  1783. X$!
  1784. X$
  1785. X$!
  1786. X$! assume this command procedure has been placed in the playground directory;
  1787. X$!     get its device:[directory]
  1788. X$    hackdir = f$parse("_._;0",f$environ("PROCEDURE")) - "_._;0"
  1789. X$!
  1790. X$! hackdir should point to the 'playground' directory
  1791. X$ if f$trnlnm("HACKDIR").eqs."" then  define hackdir 'hackdir'
  1792. X$!
  1793. X$! termcap is a text file defining terminal capabilities and escape sequences
  1794. X$ if f$trnlnm("TERMCAP").eqs."" then  define termcap hackdir:termcap
  1795. X$!
  1796. X! [ obsolete:  now handled within nethack itself ]
  1797. X! $! prior to VMS v6, the C Run-Time Library doesn't understand vt420 :-(
  1798. X! $      TT$_VT400_Series = 113
  1799. X! $ if f$getdvi("TT:","DEVTYPE").eq.TT$_VT400_Series -
  1800. X!  .and. f$trnlnm("NETHACK_TERM").eqs."" then  define nethack_term "vt400"
  1801. X$!
  1802. X$! use the VT100 line drawing character set if possible
  1803. X$ graphics = ""
  1804. X$    usropt = f$trnlnm("NETHACKOPTIONS")
  1805. X$    if usropt.eqs."" then  usropt = f$trnlnm("HACKOPTIONS")
  1806. X$ if f$locate("DECG",f$edit(usropt,"UPCASE")) .ge. f$length(usropt) then -
  1807. X    if f$getdvi("TT:","TT_DECCRT") .and. f$getdvi("TT:","TT_ANSICRT") then -
  1808. X$    graphics = " -dec"    !select DECgraphics mode by default
  1809. X$!
  1810. X$! get input from the terminal, not from this .com file
  1811. X$ deassign sys$input
  1812. X$!
  1813. X$    nethack := $hackdir:nethack
  1814. X$    if p1.nes."-s" .and. p1.nes."-s all" then -
  1815. X        nethack = nethack + graphics
  1816. X$ nethack "''p1'" "''p2'" "''p3'" "''p4'" "''p5'" "''p6'" "''p7'" "''p8'"
  1817. X$!
  1818. END_OF_FILE
  1819. if test 2378 -ne `wc -c <'sys/vms/nethack.com'`; then
  1820.     echo shar: \"'sys/vms/nethack.com'\" unpacked with wrong size!
  1821. fi
  1822. # end of 'sys/vms/nethack.com'
  1823. fi
  1824. if test -f 'win/X11/dialogs.c' -a "${1}" != "-c" ; then 
  1825.   echo shar: Will not clobber existing file \"'win/X11/dialogs.c'\"
  1826. else
  1827. echo shar: Extracting \"'win/X11/dialogs.c'\" \(9983 characters\)
  1828. sed "s/^X//" >'win/X11/dialogs.c' <<'END_OF_FILE'
  1829. X/*
  1830. X * Copyright 1991 University of Wisconsin-Madison
  1831. X *
  1832. X * Permission to use, copy, modify, distribute, and sell this software and its
  1833. X * documentation for any purpose is hereby granted without fee, provided that
  1834. X * the above copyright notice appear in all copies and that both that
  1835. X * copyright notice and this permission notice appear in supporting
  1836. X * documentation, and that the name of the University of Wisconsin-Madison not
  1837. X * be used in advertising or publicity pertaining to distribution of the
  1838. X * software without specific, written prior permission.  The University of
  1839. X * Wisconsin-Madison makes no representations about the suitability of this
  1840. X * software for any purpose.  It is provided "as is" without express or
  1841. X * implied warranty.
  1842. X *
  1843. X * THE UNIVERSITY OF WISCONSIN-MADISON DISCLAIMS ALL WARRANTIES WITH REGARD TO
  1844. X * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1845. X * FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF WISCONSIN-MADISON BE LIABLE FOR
  1846. X * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
  1847. X * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
  1848. X * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  1849. X * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  1850. X *
  1851. X * Author:  Tim Theisen             Department of Computer Sciences
  1852. X *          tim@cs.wisc.edu         University of Wisconsin-Madison
  1853. X *          uwvax!tim               1210 West Dayton Street
  1854. X *          (608)262-0438           Madison, WI   53706
  1855. X *
  1856. X *
  1857. X * Modified 12/91 by Dean Luick.  Tim graciously donated this piece of code
  1858. X * from his program ghostview, an X11 front end for ghostscript.
  1859. X *
  1860. X *    + Make the cancel button optional.
  1861. X *    + Put an #ifdef SPECIAL_CMAP around code to fix a colormap bug.
  1862. X *    We don't need it here.
  1863. X *    + Add the function positionpopup() from another part of ghostview
  1864. X *    to this code.
  1865. X */
  1866. X
  1867. X#include <X11/Intrinsic.h>
  1868. X#include <X11/StringDefs.h>
  1869. X#include <X11/Xos.h>
  1870. X#include <X11/Xaw/Cardinals.h>
  1871. X#include <X11/Xaw/Form.h>
  1872. X#include <X11/Xaw/Label.h>
  1873. X#include <X11/Xaw/AsciiText.h>
  1874. X#include <X11/Xaw/Command.h>
  1875. X
  1876. X#include "config.h"    /* #define for const for non __STDC__ compilers */
  1877. X
  1878. X/* ":" added to both translations below to allow limited redefining of
  1879. X * keysyms before testing for keysym values -- dlc */
  1880. Xstatic const char okay_accelerators[] =
  1881. X    "#override\n\
  1882. X     :<Key>Return: set() notify() unset()\n";
  1883. X
  1884. Xstatic const char cancel_accelerators[] =
  1885. X    "#override\n\
  1886. X     :<Key>Escape: set() notify() unset()\n\
  1887. X     :<Ctrl>[: set() notify() unset()\n";    /* for keyboards w/o an ESC */
  1888. X
  1889. X
  1890. X/* Create a dialog widget.  It is just a form widget with
  1891. X *    a label prompt
  1892. X *    a text response
  1893. X *    an okay button
  1894. X *    an optional cancel button
  1895. X */
  1896. XWidget
  1897. XCreateDialog(parent, name, okay_callback, cancel_callback)
  1898. X    Widget parent;
  1899. X    String name;
  1900. X    XtCallbackProc okay_callback;
  1901. X    XtCallbackProc cancel_callback;
  1902. X{
  1903. X    Widget form, prompt, response, okay, cancel;
  1904. X    Arg args[20];
  1905. X    Cardinal num_args;
  1906. X
  1907. X                            num_args = 0;
  1908. X#ifdef SPECIAL_CMAP
  1909. X    if (special_cmap) {
  1910. X    XtSetArg(args[num_args], XtNbackground, white);    num_args++;
  1911. X    }
  1912. X#endif
  1913. X    form = XtCreateManagedWidget(name, formWidgetClass, parent, args, num_args);
  1914. X
  1915. X                            num_args = 0;
  1916. X#ifdef SPECIAL_CMAP
  1917. X    if (special_cmap) {
  1918. X    XtSetArg(args[num_args], XtNforeground, black);    num_args++;
  1919. X    XtSetArg(args[num_args], XtNbackground, white);    num_args++;
  1920. X    }
  1921. X#endif
  1922. X    XtSetArg(args[num_args], XtNtop, XtChainTop);    num_args++;
  1923. X    XtSetArg(args[num_args], XtNbottom, XtChainTop);    num_args++;
  1924. X    XtSetArg(args[num_args], XtNleft, XtChainLeft);    num_args++;
  1925. X    XtSetArg(args[num_args], XtNright, XtChainLeft);    num_args++;
  1926. X    XtSetArg(args[num_args], XtNresizable, True);    num_args++;
  1927. X    XtSetArg(args[num_args], XtNborderWidth, 0);    num_args++;
  1928. X    prompt = XtCreateManagedWidget("prompt", labelWidgetClass,
  1929. X                   form, args, num_args);
  1930. X
  1931. X                            num_args = 0;
  1932. X#ifdef SPECIAL_CMAP
  1933. X    if (special_cmap) {
  1934. X    XtSetArg(args[num_args], XtNforeground, black);    num_args++;
  1935. X    XtSetArg(args[num_args], XtNbackground, white);    num_args++;
  1936. X    }
  1937. X#endif
  1938. X    XtSetArg(args[num_args], XtNfromVert, prompt);    num_args++;
  1939. X    XtSetArg(args[num_args], XtNtop, XtChainTop);    num_args++;
  1940. X    XtSetArg(args[num_args], XtNbottom, XtChainTop);    num_args++;
  1941. X    XtSetArg(args[num_args], XtNleft, XtChainLeft);    num_args++;
  1942. X    XtSetArg(args[num_args], XtNright, XtChainLeft);    num_args++;
  1943. X    XtSetArg(args[num_args], XtNresizable, True);    num_args++;
  1944. X    XtSetArg(args[num_args], XtNeditType, XawtextEdit);    num_args++;
  1945. X    XtSetArg(args[num_args], XtNresize, XawtextResizeWidth);    num_args++;
  1946. X    XtSetArg(args[num_args], XtNstring, "");        num_args++;
  1947. X    response = XtCreateManagedWidget("response", asciiTextWidgetClass,
  1948. X                     form, args, num_args);
  1949. X
  1950. X                            num_args = 0;
  1951. X#ifdef SPECIAL_CMAP
  1952. X    if (special_cmap) {
  1953. X    XtSetArg(args[num_args], XtNforeground, black);    num_args++;
  1954. X    XtSetArg(args[num_args], XtNbackground, white);    num_args++;
  1955. X    }
  1956. X#endif
  1957. X    XtSetArg(args[num_args], XtNfromVert, response);    num_args++;
  1958. X    XtSetArg(args[num_args], XtNtop, XtChainTop);    num_args++;
  1959. X    XtSetArg(args[num_args], XtNbottom, XtChainTop);    num_args++;
  1960. X    XtSetArg(args[num_args], XtNleft, XtChainLeft);    num_args++;
  1961. X    XtSetArg(args[num_args], XtNright, XtChainLeft);    num_args++;
  1962. X    XtSetArg(args[num_args], XtNresizable, True);    num_args++;
  1963. X    XtSetArg(args[num_args], XtNaccelerators,
  1964. X         XtParseAcceleratorTable(okay_accelerators));    num_args++;
  1965. X    okay = XtCreateManagedWidget("okay", commandWidgetClass,
  1966. X                 form, args, num_args);
  1967. X    XtAddCallback(okay, XtNcallback, okay_callback, form);
  1968. X
  1969. X    /* Only create cancel button if there is a callback for it. */
  1970. X    if (cancel_callback) {
  1971. X                                num_args = 0;
  1972. X#ifdef SPECIAL_CMAP
  1973. X    if (special_cmap) {
  1974. X        XtSetArg(args[num_args], XtNforeground, black);    num_args++;
  1975. X        XtSetArg(args[num_args], XtNbackground, white);    num_args++;
  1976. X    }
  1977. X#endif
  1978. X    XtSetArg(args[num_args], XtNfromVert, response);    num_args++;
  1979. X    XtSetArg(args[num_args], XtNfromHoriz, okay);        num_args++;
  1980. X    XtSetArg(args[num_args], XtNtop, XtChainTop);        num_args++;
  1981. X    XtSetArg(args[num_args], XtNbottom, XtChainTop);    num_args++;
  1982. X    XtSetArg(args[num_args], XtNleft, XtChainLeft);        num_args++;
  1983. X    XtSetArg(args[num_args], XtNright, XtChainLeft);    num_args++;
  1984. X    XtSetArg(args[num_args], XtNresizable, True);        num_args++;
  1985. X    XtSetArg(args[num_args], XtNaccelerators,
  1986. X         XtParseAcceleratorTable(cancel_accelerators));    num_args++;
  1987. X    cancel = XtCreateManagedWidget("cancel", commandWidgetClass,
  1988. X                       form, args, num_args);
  1989. X    XtAddCallback(cancel, XtNcallback, cancel_callback, form);
  1990. X    XtInstallAccelerators(response, cancel);
  1991. X    }
  1992. X
  1993. X    XtInstallAccelerators(response, okay);
  1994. X    XtSetKeyboardFocus(form, response);
  1995. X
  1996. X    return form;
  1997. X}
  1998. X
  1999. X#if 0
  2000. X/* get the prompt from the dialog box.  Used a startup time to
  2001. X * save away the initial prompt */
  2002. XString
  2003. XGetDialogPrompt(w)
  2004. X    Widget w;
  2005. X{
  2006. X    Arg args[1];
  2007. X    Widget label;
  2008. X    String s;
  2009. X
  2010. X    label = XtNameToWidget(w, "prompt");
  2011. X    XtSetArg(args[0], XtNlabel, &s);
  2012. X    XtGetValues(label, args, ONE);
  2013. X    return XtNewString(s);
  2014. X}
  2015. X#endif
  2016. X
  2017. X/* set the prompt.  This is used to put error information in the prompt */
  2018. Xvoid
  2019. XSetDialogPrompt(w, newprompt)
  2020. X    Widget w;
  2021. X    String newprompt;
  2022. X{
  2023. X    Arg args[1];
  2024. X    Widget label;
  2025. X
  2026. X    label = XtNameToWidget(w, "prompt");
  2027. X    XtSetArg(args[0], XtNlabel, newprompt);
  2028. X    XtSetValues(label, args, ONE);
  2029. X}
  2030. X
  2031. X/* get what the user typed */
  2032. XString
  2033. XGetDialogResponse(w)
  2034. X    Widget w;
  2035. X{
  2036. X    Arg args[1];
  2037. X    Widget response;
  2038. X    String s;
  2039. X
  2040. X    response = XtNameToWidget(w, "response");
  2041. X    XtSetArg(args[0], XtNstring, &s);
  2042. X    XtGetValues(response, args, ONE);
  2043. X    return XtNewString(s);
  2044. X}
  2045. X
  2046. X/* set the default reponse */
  2047. Xvoid
  2048. XSetDialogResponse(w, s)
  2049. X    Widget w;
  2050. X    String s;
  2051. X{
  2052. X    Arg args[3];
  2053. X    Widget response;
  2054. X    XFontStruct *font;
  2055. X    Dimension width, leftMargin, rightMargin;
  2056. X
  2057. X    response = XtNameToWidget(w, "response");
  2058. X    XtSetArg(args[0], XtNfont, &font);
  2059. X    XtSetArg(args[1], XtNleftMargin, &leftMargin);
  2060. X    XtSetArg(args[2], XtNrightMargin, &rightMargin);
  2061. X    XtGetValues(response, args, THREE);
  2062. X    width = font->max_bounds.width * strlen(s) + leftMargin + rightMargin;
  2063. X
  2064. X    XtSetArg(args[0], XtNstring, s);
  2065. X    XtSetArg(args[1], XtNwidth, width);
  2066. X    XtSetValues(response, args, TWO);
  2067. X    XawTextSetInsertionPoint(response, strlen(s));
  2068. X}
  2069. X
  2070. X#if 0
  2071. X/* clear the response */
  2072. Xvoid
  2073. XClearDialogResponse(w)
  2074. X    Widget w;
  2075. X{
  2076. X    Arg args[2];
  2077. X    Widget response;
  2078. X
  2079. X    response = XtNameToWidget(w, "response");
  2080. X    XtSetArg(args[0], XtNstring, "");
  2081. X    XtSetArg(args[1], XtNwidth, 100);
  2082. X    XtSetValues(response, args, TWO);
  2083. X}
  2084. X#endif
  2085. X
  2086. X
  2087. X/* Not a part of the original dialogs.c from ghostview --------------------- */
  2088. X
  2089. X/* position popup window under the cursor */
  2090. Xvoid
  2091. Xpositionpopup(w)
  2092. X    Widget w;
  2093. X{
  2094. X    Arg args[3];
  2095. X    Cardinal num_args;
  2096. X    Dimension width, height, b_width;
  2097. X    int x, y, max_x, max_y;
  2098. X    Window root, child;
  2099. X    int dummyx, dummyy;
  2100. X    unsigned int dummymask;
  2101. X    extern Widget toplevel;
  2102. X
  2103. X    /* following line deals with a race condition w/brain-damaged WM's -dlc */
  2104. X    XtUnrealizeWidget(w);
  2105. X
  2106. X    XQueryPointer(XtDisplay(toplevel), XtWindow(toplevel), &root, &child,
  2107. X          &x, &y, &dummyx, &dummyy, &dummymask);
  2108. X    num_args = 0;
  2109. X    XtSetArg(args[num_args], XtNwidth, &width); num_args++;
  2110. X    XtSetArg(args[num_args], XtNheight, &height); num_args++;
  2111. X    XtSetArg(args[num_args], XtNborderWidth, &b_width); num_args++;
  2112. X    XtGetValues(w, args, num_args);
  2113. X
  2114. X    width += 2 * b_width;
  2115. X    height += 2 * b_width;
  2116. X
  2117. X    x -= ( (Position) width/2 );
  2118. X    if (x < 0) x = 0;
  2119. X    if ( x > (max_x = (Position) (XtScreen(w)->width - width)) ) x = max_x;
  2120. X
  2121. X    y -= ( (Position) height/2 );
  2122. X    if (y < 0) y = 0;
  2123. X    if ( y > (max_y = (Position) (XtScreen(w)->height - height)) ) y = max_y;
  2124. X
  2125. X    num_args = 0;
  2126. X    XtSetArg(args[num_args], XtNx, x); num_args++;
  2127. X    XtSetArg(args[num_args], XtNy, y); num_args++;
  2128. X    XtSetValues(w, args, num_args);
  2129. X}
  2130. END_OF_FILE
  2131. if test 9983 -ne `wc -c <'win/X11/dialogs.c'`; then
  2132.     echo shar: \"'win/X11/dialogs.c'\" unpacked with wrong size!
  2133. fi
  2134. # end of 'win/X11/dialogs.c'
  2135. fi
  2136. echo shar: End of archive 91 \(of 108\).
  2137. cp /dev/null ark91isdone
  2138. MISSING=""
  2139. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  2140. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  2141. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  2142. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  2143. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  2144. 101 102 103 104 105 106 107 108 ; do
  2145.     if test ! -f ark${I}isdone ; then
  2146.     MISSING="${MISSING} ${I}"
  2147.     fi
  2148. done
  2149. if test "${MISSING}" = "" ; then
  2150.     echo You have unpacked all 108 archives.
  2151.     echo "Now execute 'rebuild.sh'"
  2152.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  2153. else
  2154.     echo You still need to unpack the following archives:
  2155.     echo "        " ${MISSING}
  2156. fi
  2157. ##  End of shell archive.
  2158. exit 0
  2159.