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

  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: v16i102:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Part94/108
  5. Message-ID: <4467@master.CNA.TEK.COM>
  6. Date: 5 Feb 93 22:02:54 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 1844
  9. Approved: billr@saab.CNA.TEK.COM
  10. Xref: uunet comp.sources.games:1653
  11.  
  12. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  13. Posting-number: Volume 16, Issue 102
  14. Archive-name: nethack31/Part94
  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 94 (of 108)."
  27. # Contents:  include/vmsconf.h src/o_init.c src/rumors.c
  28. #   sys/msdos/ovlmgr.uu sys/unix/unixmain.c sys/vms/Makefile.utl
  29. # Wrapped by billr@saab on Wed Jan 27 16:09:26 1993
  30. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  31. if test -f 'include/vmsconf.h' -a "${1}" != "-c" ; then 
  32.   echo shar: Will not clobber existing file \"'include/vmsconf.h'\"
  33. else
  34. echo shar: Extracting \"'include/vmsconf.h'\" \(6950 characters\)
  35. sed "s/^X//" >'include/vmsconf.h' <<'END_OF_FILE'
  36. X/*    SCCS Id: @(#)vmsconf.h    3.1    92/12/11    */
  37. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  38. X/* NetHack may be freely redistributed.  See license for details. */
  39. X
  40. X#ifdef VMS
  41. X#ifndef VMSCONF_H
  42. X#define VMSCONF_H
  43. X
  44. X/*
  45. X * Edit these to choose values appropriate for your site.
  46. X * WIZARD is the username allowed to use the debug option of nethack; no harm
  47. X *   is done by leaving it as a username that doesn't exist at your site.
  48. X * HACKDIR can be overridden at run-time with the logical name HACKDIR, as in
  49. X *   $ define hackdir disk$users:[games.nethack]
  50. X * Trailing NULs are present in the default values in order to make some
  51. X *   extra room for patching longer values into an existing executable.
  52. X */
  53. X#define Local_WIZARD    "NHWIZARD\0\0\0\0"
  54. X#define Local_HACKDIR    "DISK$USERS:[GAMES.NETHACK.3-1-0.PLAY]\0\0\0\0\0\0"
  55. X
  56. X/*
  57. X * This section cleans up the stuff done in config.h so that it
  58. X * shouldn't need to be modified.  It's conservative so that if
  59. X * config.h is actually edited, the changes won't impact us.
  60. X */
  61. X#ifdef UNIX
  62. X# undef UNIX
  63. X#endif
  64. X#ifdef HACKDIR
  65. X# undef HACKDIR
  66. X#endif
  67. X#ifdef WIZARD
  68. X# undef WIZARD
  69. X#endif
  70. X#ifdef WIZARD_NAME
  71. X# undef WIZARD_NAME
  72. X#endif
  73. X#define HACKDIR Local_HACKDIR
  74. X#ifndef KR1ED
  75. X# define WIZARD Local_WIZARD
  76. X# define WIZARD_NAME WIZARD
  77. X#else
  78. X# define WIZARD 1
  79. X# define WIZARD_NAME Local_WIZARD
  80. X#endif
  81. X
  82. X/* filenames require punctuation to avoid redirection via logical names */
  83. X#undef RECORD
  84. X#define RECORD    "record;1"    /* scoreboard file (retains high scores) */
  85. X#undef LOGFILE
  86. X#define LOGFILE    "logfile;0"    /* optional file (records all games) */
  87. X
  88. X#define HLOCK    "perm;1"    /* an empty file used for locking purposes */
  89. X
  90. X/* want compression--for level & save files--performed within NetHack itself */
  91. X#ifdef COMPRESS
  92. X# undef COMPRESS
  93. X#endif
  94. X#ifndef ZEROCOMP
  95. X# define ZEROCOMP
  96. X#endif
  97. X
  98. X/* vision algorithm */
  99. X#ifdef VISION_TABLES
  100. X# if defined(VAXC) && defined(BRACES)
  101. X#  undef BRACES
  102. X# endif
  103. X# if defined(__GNUC__) && !defined(BRACES)
  104. X#  define BRACES        /* put braces around rows of 2d arrays */
  105. X# endif
  106. X#else    /* not VISION_TABLES */
  107. X# define MACRO_CPATH    /* use clear_path macro instead of function */
  108. X#endif
  109. X
  110. X/*
  111. X * If nethack.exe will be installed with privilege so that the playground
  112. X * won't need to be left unprotected, define SECURE to suppress a couple
  113. X * of file protection fixups (protection of bones files and ownership of
  114. X * save files).
  115. X */
  116. X/* #define SECURE /**/
  117. X
  118. X/*
  119. X * You may define TEXTCOLOR if your system has any terminals that recognize
  120. X * ANSI color sequences of the form ``<ESCAPE>[#;#m'', where the first # is
  121. X * a number between 40 and 47 represented background color, and the second
  122. X * # is a number between 30 and 37 representing the foreground color.
  123. X * GIGI terminals and DECterm windows on color VAXstations support these
  124. X * color escape sequences, as do some 3rd party terminals and many micro
  125. X * computers.
  126. X */
  127. X/* #define TEXTCOLOR /**/
  128. X
  129. X/*
  130. X * If you define USE_QIO_INPUT, then you'll get raw characters from the
  131. X * keyboard, not unlike those of the unix version of Nethack.  This will
  132. X * allow you to use the Escape key in normal gameplay, and the appropriate
  133. X * control characters in Wizard mode.  It will work most like the unix version.
  134. X * It will also avoid "<interrupt>" being displayed when ^Y is pressed.
  135. X *
  136. X * Otherwise, the VMS SMG calls will be used.  These calls block use of
  137. X * the escape key, as well as certain control keys, so gameplay is not
  138. X * the same, although the differences are fairly negligible.  You must
  139. X * then use a VTxxx function key or two <escape>s to give an ESC response.
  140. X */
  141. X#define USE_QIO_INPUT    /* use SYS$QIOW instead of SMG$READ_KEYSTROKE */
  142. X
  143. X/*
  144. X * If you define MAIL, then NetHack will capture incoming broadcast
  145. X * messages such as "New mail from so-and-so" and "Print job completed,"
  146. X * and then deliver them to the player.  For mail and phone broadcasts
  147. X * a scroll of mail will be created, which when read will cause NetHack
  148. X * to prompt the player for a command to spawn in order to respond.  The
  149. X * latter capability will not be available if SHELL is disabled below.
  150. X * If you undefine MAIL, broadcasts will go straight to the terminal,
  151. X * resulting in disruption of the screen display; use <ctrl/R> to redraw.
  152. X */
  153. X#define MAIL        /* enable broadcast trapping */
  154. X
  155. X/*
  156. X * SHELL enables the player to 'escape' into a spawned subprocess via
  157. X * the '!' command.  Logout or attach back to the parent to resume play.
  158. X * If the player attaches back to NetHack, then a subsequent escape will
  159. X * re-attach to the existing subprocess.  Any such subprocess left over
  160. X * at game exit will be deleted by an exit handler.
  161. X * SUSPEND enables someone running NetHack in a subprocess to reconnect
  162. X * to the parent process with the <ctrl/Z> command; this is not very
  163. X * close to Unix job control, but it's better than nothing.
  164. X */
  165. X#define SHELL        /* do not delete the '!' command */
  166. X#define SUSPEND        /* don't delete the ^Z command, such as it is */
  167. X
  168. X#define RANDOM        /* use sys/share/random.c instead of vaxcrtl rand */
  169. X
  170. X#define FCMASK    0660    /* file creation mask */
  171. X
  172. X/*
  173. X * The remainder of the file should not need to be changed.
  174. X */
  175. X
  176. X#if defined(VAXC) && !defined(ANCIENT_VAXC)
  177. X# ifdef volatile
  178. X#  undef volatile
  179. X# endif
  180. X# ifdef const
  181. X#  undef const
  182. X# endif
  183. X#endif
  184. X
  185. X#ifdef __DECC
  186. X# define STRICT_REF_DEF    /* used in lev_main.c */
  187. X#endif
  188. X#ifdef STRICT_REF_DEF
  189. X# define DEFINE_OSPEED
  190. X#endif
  191. X
  192. X#ifndef alloca
  193. X    /* bison generated foo_yacc.c might try to use alloca() */
  194. X# ifdef __GNUC__
  195. X#  define alloca __builtin_alloca
  196. X# else
  197. X#  define ALLOCA_HACK    /* used in util/panic.c */
  198. X# endif
  199. X#endif
  200. X
  201. X#include <time.h>
  202. X#if 0    /* <file.h> is missing for old gcc versions; skip it to save time */
  203. X#include <file.h>
  204. X#else    /* values needed from missing include file */
  205. X# define O_RDONLY 0
  206. X# define O_WRONLY 1
  207. X# define O_RDWR   2
  208. X# define O_CREAT 0x200
  209. X#endif
  210. X
  211. X#ifndef REDO
  212. X# define Getchar nhgetch
  213. X#endif
  214. X#define tgetch vms_getchar
  215. X
  216. X#include "system.h"
  217. X
  218. X#define index    strchr
  219. X#define rindex    strrchr
  220. X
  221. X/* Use the high quality random number routines. */
  222. X#if defined(RANDOM)
  223. X#define Rand()    random()
  224. X#else
  225. X#define Rand()    rand()
  226. X#endif
  227. X
  228. X#ifndef __GNUC__
  229. X#define bcopy(s,d,n)    memcpy((d),(s),(n))    /* vaxcrtl */
  230. X#endif
  231. X#define abort()        vms_abort()        /* vmsmisc.c */
  232. X#define creat(f,m)    vms_creat(f,m)        /* vmsfiles.c */
  233. X#define exit(sts)    vms_exit(sts)        /* vmsmisc.c */
  234. X#define getuid()    vms_getuid()        /* vmsunix.c */
  235. X#define link(f1,f2)    vms_link(f1,f2)        /* vmsfiles.c */
  236. X#define open(f,k,m)    vms_open(f,k,m)        /* vmsfiles.c */
  237. X/* #define unlink(f0)    vms_unlink(f0)        /* vmsfiles.c */
  238. X#ifdef VERYOLD_VMS
  239. X#define unlink(f0)    delete(f0)        /* vaxcrtl */
  240. X#else
  241. X#define unlink(f0)    remove(f0)        /* vaxcrtl, decc$shr */
  242. X#endif
  243. X#define C$$TRANSLATE(n)    c__translate(n)    /* vmsfiles.c */
  244. X
  245. X/* VMS global names are case insensitive... */
  246. X#define An vms_an
  247. X#define The vms_the
  248. X
  249. X/* used in several files which don't #include "extern.h" */
  250. Xextern void FDECL(vms_exit, (int));
  251. X
  252. X#endif    /* VMSCONF_H */
  253. X#endif    /* VMS */
  254. END_OF_FILE
  255. if test 6950 -ne `wc -c <'include/vmsconf.h'`; then
  256.     echo shar: \"'include/vmsconf.h'\" unpacked with wrong size!
  257. fi
  258. # end of 'include/vmsconf.h'
  259. fi
  260. if test -f 'src/o_init.c' -a "${1}" != "-c" ; then 
  261.   echo shar: Will not clobber existing file \"'src/o_init.c'\"
  262. else
  263. echo shar: Extracting \"'src/o_init.c'\" \(9274 characters\)
  264. sed "s/^X//" >'src/o_init.c' <<'END_OF_FILE'
  265. X/*    SCCS Id: @(#)o_init.c    3.1    92/12/11    */
  266. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  267. X/* NetHack may be freely redistributed.  See license for details. */
  268. X
  269. X#include    "hack.h"        /* for typedefs */
  270. X
  271. Xstatic void NDECL(setgemprobs);
  272. Xstatic void FDECL(shuffle,(int,int,BOOLEAN_P));
  273. Xstatic boolean FDECL(interesting_to_discover,(int));
  274. X
  275. X/* note that NROFOBJECTS is the number of legal objects, which does not count
  276. X * the strange object and null object that take up positions 0 and NROFOBJECTS+1
  277. X * in the objects array
  278. X */
  279. X#define TOTAL_OBJS    (NROFOBJECTS+2)
  280. X
  281. Xconst char obj_symbols[] = {
  282. X    ILLOBJ_CLASS, AMULET_CLASS, GOLD_CLASS, FOOD_CLASS, WEAPON_CLASS,
  283. X    TOOL_CLASS, BALL_CLASS, CHAIN_CLASS, ROCK_CLASS, ARMOR_CLASS,
  284. X    POTION_CLASS, SCROLL_CLASS, WAND_CLASS,
  285. X    SPBOOK_CLASS, RING_CLASS, GEM_CLASS, 0 };
  286. X
  287. Xstatic short NEARDATA disco[TOTAL_OBJS] = DUMMY;
  288. X
  289. Xint
  290. Xletindex(acls) register char acls; {
  291. Xregister int i = 0;
  292. Xregister char ch;
  293. X    while ((ch = obj_symbols[i++]) != 0)
  294. X        if (ch == acls) return(i);
  295. X    return(0);
  296. X}
  297. X
  298. Xstatic void
  299. Xsetgemprobs()
  300. X{
  301. X    register int j, first;
  302. X    int lev = (ledger_no(&u.uz) > maxledgerno())
  303. X                ? maxledgerno() : ledger_no(&u.uz);
  304. X
  305. X    first = bases[letindex(GEM_CLASS)];
  306. X
  307. X    for(j = 0; j < 9-lev/3; j++)
  308. X        objects[first+j].oc_prob = 0;
  309. X    first += j;
  310. X    if (first > LAST_GEM || objects[first].oc_class != GEM_CLASS ||
  311. X        OBJ_NAME(objects[first]) == NULL) {
  312. X        raw_printf("Not enough gems? - first=%d j=%d LAST_GEM=%d",
  313. X            first, j, LAST_GEM);
  314. X        wait_synch();
  315. X        }
  316. X    for (j = first; j <= LAST_GEM; j++)
  317. X        objects[j].oc_prob = (184+j-first)/(LAST_GEM+1-first);
  318. X}
  319. X
  320. X/* shuffle descriptions on objects o_low to o_high */
  321. Xstatic void
  322. Xshuffle(o_low, o_high, domaterial)
  323. X    register int o_low, o_high;
  324. X    register boolean domaterial;
  325. X{
  326. X    register int i, j;
  327. X#ifdef TEXTCOLOR
  328. X    int color;
  329. X#endif /* TEXTCOLOR */
  330. X    register short sw;
  331. X
  332. X    for (j=o_low; j <= o_high; j++) {
  333. X        i = o_low + rn2(j+1-o_low);
  334. X        sw = objects[j].oc_descr_idx;
  335. X        objects[j].oc_descr_idx = objects[i].oc_descr_idx;
  336. X        objects[i].oc_descr_idx = sw;
  337. X#ifdef TEXTCOLOR
  338. X        color = objects[j].oc_color;
  339. X        objects[j].oc_color = objects[i].oc_color;
  340. X        objects[i].oc_color = color;
  341. X#endif /* TEXTCOLOR */
  342. X        /* shuffle material */
  343. X        if (domaterial) {
  344. X            sw = objects[j].oc_material;
  345. X            objects[j].oc_material = objects[i].oc_material;
  346. X            objects[i].oc_material = sw;
  347. X        }
  348. X    }
  349. X}
  350. X
  351. Xvoid
  352. Xinit_objects(){
  353. Xregister int i, j, first, last, sum, end;
  354. Xregister char acls;
  355. X#ifdef TEXTCOLOR
  356. X# define COPY_OBJ_DESCR(o_dst,o_src) \
  357. X            o_dst.oc_descr_idx = o_src.oc_descr_idx,\
  358. X            o_dst.oc_color = o_src.oc_color
  359. X#else
  360. X# define COPY_OBJ_DESCR(o_dst,o_src) o_dst.oc_descr_idx = o_src.oc_descr_idx
  361. X#endif
  362. X
  363. X    /* bug fix to prevent "initialization error" abort on Intel Xenix.
  364. X     * reported by mikew@semike
  365. X     */
  366. X    for (i = 0; i < sizeof(obj_symbols); i++)
  367. X        bases[i] = 0;
  368. X    /* initialize object descriptions */
  369. X    for (i = 0; i < TOTAL_OBJS; i++)
  370. X        objects[i].oc_name_idx = objects[i].oc_descr_idx = i;
  371. X    init_artifacts();
  372. X    /* init base; if probs given check that they add up to 1000,
  373. X       otherwise compute probs; shuffle descriptions */
  374. X    end = TOTAL_OBJS;
  375. X    first = 0;
  376. X    while( first < end ) {
  377. X        acls = objects[first].oc_class;
  378. X        last = first+1;
  379. X        while (last < end && objects[last].oc_class == acls) last++;
  380. X        i = letindex(acls);
  381. X        if ((!i && acls != ILLOBJ_CLASS && acls != VENOM_CLASS) ||
  382. X                                bases[i] != 0)
  383. X            error("initialization error for object class %d", acls);
  384. X        bases[i] = first;
  385. X
  386. X        if (acls == GEM_CLASS) setgemprobs();
  387. X    check:
  388. X        sum = 0;
  389. X        for(j = first; j < last; j++) sum += objects[j].oc_prob;
  390. X        if(sum == 0) {
  391. X            for(j = first; j < last; j++)
  392. X                objects[j].oc_prob = (1000+j-first)/(last-first);
  393. X            goto check;
  394. X        }
  395. X        if(sum != 1000)
  396. X            error("init-prob error for %d (%d%%)", acls, sum);
  397. X
  398. X        if (OBJ_DESCR(objects[first]) != NULL &&
  399. X           acls != TOOL_CLASS && acls != WEAPON_CLASS && acls != ARMOR_CLASS) {
  400. X
  401. X            /* shuffle, also some additional descriptions */
  402. X            while (last < end && objects[last].oc_class == acls)
  403. X            last++;
  404. X            j = last;
  405. X            if (acls == GEM_CLASS) {
  406. X            if (rn2(2)) { /* change turquoise from green to blue? */
  407. X                COPY_OBJ_DESCR(objects[TURQUOISE],objects[SAPPHIRE]);
  408. X            }
  409. X            if (rn2(2)) { /* change aquamarine from green to blue? */
  410. X                COPY_OBJ_DESCR(objects[AQUAMARINE],objects[SAPPHIRE]);
  411. X            }
  412. X            switch (rn2(4)) { /* change fluorite from violet? */
  413. X                case 0:  break;
  414. X                case 1:    /* blue */
  415. X                COPY_OBJ_DESCR(objects[FLUORITE],objects[SAPPHIRE]);
  416. X                break;
  417. X                case 2:    /* white */
  418. X                COPY_OBJ_DESCR(objects[FLUORITE],objects[DIAMOND]);
  419. X                break;
  420. X                case 3:    /* green */
  421. X                COPY_OBJ_DESCR(objects[FLUORITE],objects[EMERALD]);
  422. X                break;
  423. X            }
  424. X            } else {
  425. X            if (acls == POTION_CLASS)
  426. X                j--;  /* only water has a fixed description */
  427. X            else if (acls == AMULET_CLASS ||
  428. X                 acls == SCROLL_CLASS ||
  429. X                 acls == SPBOOK_CLASS)
  430. X                do { j--; }
  431. X                while (!objects[j].oc_magic || objects[j].oc_unique);
  432. X            /* non-magical amulets, scrolls, and spellbooks
  433. X             * (ex. imitation Amulets, blank, scrolls of mail)
  434. X             * and one-of-a-kind magical artifacts at the end of
  435. X             * their class in objects[] have fixed descriptions.
  436. X             */
  437. X            shuffle(first, --j, TRUE);
  438. X            }
  439. X        }
  440. X        first = last;
  441. X    }
  442. X
  443. X    /* shuffle the helmets */
  444. X    shuffle(HELMET, HELM_OF_TELEPATHY, FALSE);
  445. X
  446. X    /* shuffle the gloves */
  447. X    shuffle(LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY, FALSE);
  448. X
  449. X    /* shuffle the cloaks */
  450. X    shuffle(CLOAK_OF_PROTECTION, CLOAK_OF_DISPLACEMENT, FALSE);
  451. X
  452. X    /* shuffle the boots [if they change, update find_skates() below] */
  453. X    shuffle(SPEED_BOOTS, LEVITATION_BOOTS, FALSE);
  454. X}
  455. X
  456. X/* find the object index for snow boots; used [once] by slippery ice code */
  457. Xint
  458. Xfind_skates()
  459. X{
  460. X    register int i;
  461. X    register const char *s;
  462. X
  463. X    for (i = SPEED_BOOTS; i <= LEVITATION_BOOTS; i++)
  464. X    if ((s = OBJ_DESCR(objects[i])) != 0 && !strcmp(s, "snow boots"))
  465. X        return i;
  466. X
  467. X    impossible("snow boots not found?");
  468. X    return -1;    /* not 0, or caller would try again each move */
  469. X}
  470. X
  471. Xvoid
  472. Xoinit()            /* level dependent initialization */
  473. X{
  474. X    setgemprobs();
  475. X}
  476. X
  477. Xvoid
  478. Xsavenames(fd)
  479. Xregister int fd;
  480. X{
  481. X    register int i;
  482. X    unsigned int len;
  483. X
  484. X    bwrite(fd, (genericptr_t)bases, MAXOCLASSES * sizeof *bases);
  485. X    bwrite(fd, (genericptr_t)disco, sizeof disco);
  486. X    bwrite(fd, (genericptr_t)objects, sizeof(struct objclass) * TOTAL_OBJS);
  487. X    /* as long as we use only one version of Hack we
  488. X       need not save oc_name and oc_descr, but we must save
  489. X       oc_uname for all objects */
  490. X    for(i=0; i < TOTAL_OBJS; i++) {
  491. X        if(objects[i].oc_uname) {
  492. X            len = strlen(objects[i].oc_uname)+1;
  493. X            bwrite(fd, (genericptr_t)&len, sizeof len);
  494. X            bwrite(fd, (genericptr_t)objects[i].oc_uname, len);
  495. X        }
  496. X    }
  497. X}
  498. X
  499. Xvoid
  500. Xrestnames(fd)
  501. Xregister int fd;
  502. X{
  503. X    register int i;
  504. X    unsigned int len;
  505. X
  506. X    mread(fd, (genericptr_t) bases, MAXOCLASSES * sizeof *bases);
  507. X    mread(fd, (genericptr_t) disco, sizeof disco);
  508. X    mread(fd, (genericptr_t) objects, sizeof(struct objclass) * TOTAL_OBJS);
  509. X    for(i=0; i < TOTAL_OBJS; i++) {
  510. X        if (objects[i].oc_uname) {
  511. X            mread(fd, (genericptr_t) &len, sizeof len);
  512. X            objects[i].oc_uname = (char *) alloc(len);
  513. X            mread(fd, (genericptr_t)objects[i].oc_uname, len);
  514. X        }
  515. X    }
  516. X}
  517. X
  518. Xvoid
  519. Xdiscover_object(oindx, mark_as_known)
  520. Xregister int oindx;
  521. Xboolean mark_as_known;
  522. X{
  523. X    if (!objects[oindx].oc_name_known) {
  524. X    register int dindx, acls = objects[oindx].oc_class;
  525. X
  526. X    /* Loop thru disco[] 'til we find the target (which may have been
  527. X       uname'd) or the next open slot; one or the other will be found
  528. X       before we reach the next class...
  529. X     */
  530. X    for (dindx = bases[letindex(acls)]; disco[dindx] != 0; dindx++)
  531. X        if (disco[dindx] == oindx) break;
  532. X    disco[dindx] = oindx;
  533. X
  534. X    if (mark_as_known) {
  535. X        objects[oindx].oc_name_known = 1;
  536. X        exercise(A_WIS, TRUE);
  537. X    }
  538. X    }
  539. X}
  540. X
  541. X/* if a class name has been cleared, we may need to purge it from disco[] */
  542. Xvoid
  543. Xundiscover_object(oindx)
  544. Xregister int oindx;
  545. X{
  546. X    if (!objects[oindx].oc_name_known) {
  547. X    register int dindx, acls = objects[oindx].oc_class;
  548. X    register boolean found = FALSE;
  549. X
  550. X    /* find the object; shift those behind it forward one slot */
  551. X    for (dindx = bases[letindex(acls)];
  552. X          dindx <= NROFOBJECTS && disco[dindx] != 0
  553. X        && objects[dindx].oc_class == acls; dindx++)
  554. X        if (found)
  555. X        disco[dindx-1] = disco[dindx];
  556. X        else if (disco[dindx] == oindx)
  557. X        found = TRUE;
  558. X
  559. X    /* clear last slot */
  560. X    if (found) disco[dindx-1] = 0;
  561. X    else impossible("named object not in disco");
  562. X    }
  563. X}
  564. X
  565. Xstatic boolean
  566. Xinteresting_to_discover(i)
  567. Xregister int i;
  568. X{
  569. X    return objects[i].oc_uname != NULL ||
  570. X        (objects[i].oc_name_known && OBJ_DESCR(objects[i]) != NULL);
  571. X}
  572. X
  573. Xint
  574. Xdodiscovered()                /* free after Robert Viduya */
  575. X{
  576. X    register int i, dis;
  577. X    int    ct = 0;
  578. X    char class = -1;
  579. X    winid tmpwin;
  580. X
  581. X    tmpwin = create_nhwindow(NHW_MENU);
  582. X    putstr(tmpwin, 0, "Discoveries");
  583. X    putstr(tmpwin, 0, "");
  584. X
  585. X    for (i = 0; i <= NROFOBJECTS; i++) {
  586. X    if ((dis = disco[i]) && interesting_to_discover(dis)) {
  587. X        ct++;
  588. X        if (objects[dis].oc_class != class) {
  589. X        class = objects[dis].oc_class;
  590. X        putstr(tmpwin, ATR_INVERSE, let_to_name(class, FALSE));
  591. X        }
  592. X        putstr(tmpwin, 0, typename(dis));
  593. X    }
  594. X    }
  595. X    if (ct == 0) {
  596. X    You("haven't discovered anything yet...");
  597. X    } else
  598. X    display_nhwindow(tmpwin, TRUE);
  599. X    destroy_nhwindow(tmpwin);
  600. X
  601. X    return 0;
  602. X}
  603. X
  604. X/*o_init.c*/
  605. END_OF_FILE
  606. if test 9274 -ne `wc -c <'src/o_init.c'`; then
  607.     echo shar: \"'src/o_init.c'\" unpacked with wrong size!
  608. fi
  609. # end of 'src/o_init.c'
  610. fi
  611. if test -f 'src/rumors.c' -a "${1}" != "-c" ; then 
  612.   echo shar: Will not clobber existing file \"'src/rumors.c'\"
  613. else
  614. echo shar: Extracting \"'src/rumors.c'\" \(9099 characters\)
  615. sed "s/^X//" >'src/rumors.c' <<'END_OF_FILE'
  616. X/*    SCCS Id: @(#)rumors.c    3.1    92/12/05    */
  617. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  618. X/* NetHack may be freely redistributed.  See license for details. */
  619. X
  620. X#include "hack.h"
  621. X
  622. X/*    [note: this comment is fairly old, but still accurate for 3.1]
  623. X * Rumors have been entirely rewritten to speed up the access.  This is
  624. X * essential when working from floppies.  Using fseek() the way that's done
  625. X * here means rumors following longer rumors are output more often than those
  626. X * following shorter rumors.  Also, you may see the same rumor more than once
  627. X * in a particular game (although the odds are highly against it), but
  628. X * this also happens with real fortune cookies.  -dgk
  629. X */
  630. X
  631. X/*    3.1
  632. X * The rumors file consists of a "do not edit" line, a hexadecimal number
  633. X * giving the number of bytes of useful/true rumors, followed by those
  634. X * true rumors (one per line), followed by the useless/false/misleading/cute
  635. X * rumors (also one per line).  Number of bytes of untrue rumors is derived
  636. X * via fseek(EOF)+ftell().
  637. X *
  638. X * The oracles file consists of a "do not edit" comment, a decimal count N
  639. X * and set of N+1 hexadecimal fseek offsets, followed by N multiple-line
  640. X * records, separated by "---" lines.  The first oracle is a special case,
  641. X * and placed there by 'makedefs'.
  642. X */
  643. X
  644. X#ifndef SEEK_SET
  645. X# define SEEK_SET 0
  646. X#endif
  647. X#ifndef SEEK_CUR
  648. X# define SEEK_CUR 1
  649. X#endif
  650. X#ifndef SEEK_END    /* aka SEEK_EOF */
  651. X# define SEEK_END 2
  652. X#endif
  653. X
  654. Xstatic void FDECL(init_rumors, (FILE *));
  655. Xstatic void FDECL(init_oracles, (FILE *));
  656. Xstatic void FDECL(outoracle, (BOOLEAN_P));
  657. X
  658. Xstatic long true_rumor_start,  true_rumor_size,  true_rumor_end,
  659. X        false_rumor_start, false_rumor_size, false_rumor_end;
  660. Xstatic int oracle_flg = 0;  /* -1=>don't use, 0=>need init, 1=>init done */
  661. Xstatic unsigned oracle_cnt = 0;
  662. Xstatic long *oracle_loc = 0;
  663. X
  664. Xstatic void
  665. Xinit_rumors(fp)
  666. XFILE *fp;
  667. X{
  668. X    char line[BUFSZ];
  669. X
  670. X    (void) fgets(line, sizeof line, fp);    /* skip "don't edit" comment */
  671. X    if (fscanf(fp, "%6lx\n", &true_rumor_size) == 1 &&
  672. X        true_rumor_size > 0L) {
  673. X        (void) fseek(fp, 0L, SEEK_CUR);
  674. X        true_rumor_start  = ftell(fp);
  675. X        true_rumor_end    = true_rumor_start + true_rumor_size;
  676. X        (void) fseek(fp, 0L, SEEK_END);
  677. X        false_rumor_end   = ftell(fp);
  678. X        false_rumor_start = true_rumor_end;    /* ok, so it's redundant... */
  679. X        false_rumor_size  = false_rumor_end - false_rumor_start;
  680. X    } else
  681. X        true_rumor_size = -1L;    /* init failed */
  682. X}
  683. X
  684. Xchar *
  685. Xgetrumor(truth)
  686. Xint truth; /* 1=true, -1=false, 0=either */
  687. X{
  688. X    static char rumor_buf[COLNO + 28];
  689. X    FILE    *rumors;
  690. X    long tidbit, beginning;
  691. X    char    *endp, line[sizeof rumor_buf];
  692. X
  693. X    rumor_buf[0] = '\0';
  694. X    if (true_rumor_size < 0L)    /* we couldn't open RUMORFILE */
  695. X        return rumor_buf;
  696. X
  697. X    rumors = fopen_datafile(RUMORFILE, "r");
  698. X
  699. X    if (rumors) {
  700. X        if (true_rumor_size == 0L) {    /* if this is 1st outrumor() */
  701. X            init_rumors(rumors);
  702. X            if (true_rumor_size < 0L) {    /* init failed */
  703. X            Sprintf(rumor_buf, "Error reading \"%.80s\".",
  704. X                RUMORFILE);
  705. X            return rumor_buf;
  706. X            }
  707. X        }
  708. X        /*
  709. X         *    input:      1    0   -1
  710. X         *     rn2 \ +1  2=T  1=T  0=F
  711. X         *     adj./ +0  1=T  0=F -1=F
  712. X         */
  713. X        switch (truth += rn2(2)) {
  714. X          case  2:    /*(might let a bogus input arg sneak thru)*/
  715. X          case  1:  beginning = true_rumor_start;
  716. X                tidbit = Rand() % true_rumor_size;
  717. X            break;
  718. X          case  0:    /* once here, 0 => false rather than "either"*/
  719. X          case -1:  beginning = false_rumor_start;
  720. X                tidbit = Rand() % false_rumor_size;
  721. X            break;
  722. X          default:
  723. X                impossible("strange truth value for rumor");
  724. X            return strcpy(rumor_buf, "Oops...");
  725. X        }
  726. X        (void) fseek(rumors, beginning + tidbit, SEEK_SET);
  727. X        (void) fgets(line, sizeof line, rumors);
  728. X        if (!fgets(line, sizeof line, rumors) ||
  729. X            (truth > 0 && ftell(rumors) > true_rumor_end)) {
  730. X            /* reached end of rumors -- go back to beginning */
  731. X            (void) fseek(rumors, beginning, SEEK_SET);
  732. X            (void) fgets(line, sizeof line, rumors);
  733. X        }
  734. X        if ((endp = index(line, '\n')) != 0) *endp = 0;
  735. X        Strcat(rumor_buf, xcrypt(line));
  736. X        (void) fclose(rumors);
  737. X        exercise(A_WIS, (truth > 0));
  738. X    } else {
  739. X        pline("Can't open rumors file!");
  740. X        true_rumor_size = -1;    /* don't try to open it again */
  741. X    }
  742. X    return rumor_buf;
  743. X}
  744. X
  745. Xvoid
  746. Xoutrumor(truth, cookie)
  747. Xint truth; /* 1=true, -1=false, 0=either */
  748. Xboolean cookie;
  749. X{
  750. X    static const char fortune_msg[] =
  751. X        "This cookie has a scrap of paper inside.";
  752. X    const char *line;
  753. X
  754. X    if (cookie && Blind) {
  755. X        pline(fortune_msg);
  756. X        pline("What a pity that you cannot read it!");
  757. X        return;
  758. X    }
  759. X    line = getrumor(truth);
  760. X    if (!*line)
  761. X        line = "NetHack rumors file closed for renovation.";
  762. X    if (cookie) {
  763. X        pline(fortune_msg);
  764. X        pline("It reads:");
  765. X        pline("%s", line);
  766. X    } else {    /* if the Oracle is the only alternative */
  767. X        pline("True to her word, the Oracle %ssays: ",
  768. X        (!rn2(4) ? "offhandedly " : (!rn2(3) ? "casually " :
  769. X        (rn2(2) ? "nonchalantly " : ""))));
  770. X        verbalize("%s", line);
  771. X        exercise(A_WIS, TRUE);
  772. X    }
  773. X}
  774. X
  775. Xstatic void
  776. Xinit_oracles(fp)
  777. XFILE *fp;
  778. X{
  779. X    register int i;
  780. X    char line[BUFSZ];
  781. X    int cnt = 0;
  782. X
  783. X    /* this assumes we're only called once */
  784. X    (void) fgets(line, sizeof line, fp);    /* skip "don't edit" comment */
  785. X    if (fscanf(fp, "%5d", &cnt) == 1 && cnt > 0) {
  786. X        oracle_cnt = (unsigned) cnt;
  787. X        oracle_loc = (long *) alloc(cnt * sizeof (long));
  788. X        for (i = 0; i < cnt; i++)
  789. X        (void) fscanf(fp, "%5lx", &oracle_loc[i]);
  790. X    }
  791. X    return;
  792. X}
  793. X
  794. Xvoid
  795. Xsave_oracles(fd)
  796. Xint fd;
  797. X{
  798. X    bwrite(fd, (genericptr_t) &oracle_cnt, sizeof oracle_cnt);
  799. X    if (oracle_cnt)
  800. X        bwrite(fd, (genericptr_t) oracle_loc, oracle_cnt * sizeof (long));
  801. X}
  802. X
  803. Xvoid
  804. Xrestore_oracles(fd)
  805. Xint fd;
  806. X{
  807. X    mread(fd, (genericptr_t) &oracle_cnt, sizeof oracle_cnt);
  808. X    if (oracle_cnt) {
  809. X        oracle_loc = (long *) alloc(oracle_cnt * sizeof (long));
  810. X        mread(fd, (genericptr_t) oracle_loc, oracle_cnt * sizeof (long));
  811. X        oracle_flg = 1;    /* no need to call init_oracles() */
  812. X    }
  813. X}
  814. X
  815. Xstatic void
  816. Xoutoracle(special)
  817. Xboolean special;
  818. X{
  819. X    char    line[COLNO];
  820. X    char    *endp;
  821. X    FILE    *oracles;
  822. X    int oracle_idx;
  823. X
  824. X    if(oracle_flg < 0 ||            /* couldn't open ORACLEFILE */
  825. X       (oracle_flg > 0 && oracle_cnt == 0))    /* oracles already exhausted */
  826. X        return;
  827. X
  828. X    oracles = fopen_datafile(ORACLEFILE, "r");
  829. X
  830. X    if (oracles) {
  831. X        winid tmpwin;
  832. X        if (oracle_flg == 0) {    /* if this is the first outoracle() */
  833. X            init_oracles(oracles);
  834. X            oracle_flg = 1;
  835. X            if (oracle_cnt == 0) return;
  836. X        }
  837. X        /* oracle_loc[0] is the special oracle;        */
  838. X        /* oracle_loc[1..oracle_cnt-1] are normal ones    */
  839. X        if (oracle_cnt <= 1 && !special) return;  /*(shouldn't happen)*/
  840. X        oracle_idx = special ? 0 : rnd((int) oracle_cnt - 1);
  841. X        (void) fseek(oracles, oracle_loc[oracle_idx], SEEK_SET);
  842. X        if (!special) oracle_loc[oracle_idx] = oracle_loc[--oracle_cnt];
  843. X
  844. X        tmpwin = create_nhwindow(NHW_TEXT);
  845. X        putstr(tmpwin, 0, special ?
  846. X              "The Oracle scornfully takes all your money and says:" :
  847. X              "The Oracle meditates for a moment and then intones:");
  848. X        putstr(tmpwin, 0, "");
  849. X
  850. X        while (fgets(line, COLNO, oracles) && strcmp(line,"---\n")) {
  851. X            if ((endp = index(line, '\n')) != 0) *endp = 0;
  852. X            putstr(tmpwin, 0, xcrypt(line));
  853. X        }
  854. X        display_nhwindow(tmpwin, TRUE);
  855. X        destroy_nhwindow(tmpwin);
  856. X        (void) fclose(oracles);
  857. X    } else {
  858. X        pline("Can't open oracles file!");
  859. X        oracle_flg = -1;    /* don't try to open it again */
  860. X    }
  861. X}
  862. X
  863. Xint
  864. Xdoconsult(oracl)
  865. Xregister struct monst *oracl;
  866. X{
  867. X    int u_pay, minor_cost = 50, major_cost = 500 + 50 * u.ulevel;
  868. X    int add_xpts;
  869. X    char qbuf[QBUFSZ];
  870. X
  871. X    multi = 0;
  872. X
  873. X    if (!oracl) {
  874. X        pline("There is no one here to consult.");
  875. X        return 0;
  876. X    } else if (!oracl->mpeaceful) {
  877. X        pline("The Oracle is in no mood for consultations.");
  878. X        return 0;
  879. X    } else if (!u.ugold) {
  880. X        You("have no money.");
  881. X        return 0;
  882. X    }
  883. X
  884. X    Sprintf(qbuf,
  885. X        "\"Wilt thou settle for a minor consultation?\" (%d zorkmids)",
  886. X        minor_cost);
  887. X    switch (ynq(qbuf)) {
  888. X        default:
  889. X        case 'q':
  890. X        return 0;
  891. X        case 'y':
  892. X        if (u.ugold < (long)minor_cost) {
  893. X            You("don't even have enough money for that!");
  894. X            return 0;
  895. X        }
  896. X        u_pay = minor_cost;
  897. X        break;
  898. X        case 'n':
  899. X        if (u.ugold <= (long)minor_cost ||    /* don't even ask */
  900. X            (oracle_cnt == 1 || oracle_flg < 0)) return 0;
  901. X        Sprintf(qbuf,
  902. X            "\"Then dost thou desire a major one?\" (%d zorkmids)",
  903. X            major_cost);
  904. X        if (yn(qbuf) != 'y') return 0;
  905. X        u_pay = (u.ugold < (long)major_cost ? (int)u.ugold
  906. X                            : major_cost);
  907. X        break;
  908. X    }
  909. X    u.ugold -= (long)u_pay;
  910. X    oracl->mgold += (long)u_pay;
  911. X    flags.botl = 1;
  912. X    add_xpts = 0;    /* first oracle of each type gives experience points */
  913. X    if (u_pay == minor_cost) {
  914. X        outrumor(1, FALSE);
  915. X        if (!u.uevent.minor_oracle)
  916. X            add_xpts = u_pay / (u.uevent.major_oracle ? 25 : 10);
  917. X            /* 5 pts if very 1st, or 2 pts if major already done */
  918. X        u.uevent.minor_oracle = TRUE;
  919. X    } else {
  920. X        boolean cheapskate = u_pay < major_cost;
  921. X        outoracle(cheapskate);
  922. X        if (!cheapskate && !u.uevent.major_oracle)
  923. X            add_xpts = u_pay / (u.uevent.minor_oracle ? 25 : 10);
  924. X            /* ~100 pts if very 1st, ~40 pts if minor already done */
  925. X        u.uevent.major_oracle = TRUE;
  926. X        exercise(A_WIS, !cheapskate);
  927. X    }
  928. X    if (add_xpts) {
  929. X        more_experienced(add_xpts, u_pay/50);
  930. X        newexplevel();
  931. X    }
  932. X    return 1;
  933. X}
  934. X
  935. X/*rumors.c*/
  936. END_OF_FILE
  937. if test 9099 -ne `wc -c <'src/rumors.c'`; then
  938.     echo shar: \"'src/rumors.c'\" unpacked with wrong size!
  939. fi
  940. # end of 'src/rumors.c'
  941. fi
  942. if test -f 'sys/msdos/ovlmgr.uu' -a "${1}" != "-c" ; then 
  943.   echo shar: Will not clobber existing file \"'sys/msdos/ovlmgr.uu'\"
  944. else
  945. echo shar: Extracting \"'sys/msdos/ovlmgr.uu'\" \(9351 characters\)
  946. sed "s/^X//" >'sys/msdos/ovlmgr.uu' <<'END_OF_FILE'
  947. Xbegin 644 ovlmgr.obj
  948. XM@`P`"F]V;&UG<BYA<VUDEA4```904U!314<&3U9,5$),!$-/1$6%F`H`````,
  949. XM`"P``@$!+I@*```````0``,!`4F8!P!HO1P$`0$:C$8`!R0D24Y43D\`"20DT
  950. XM3U9,0D%310`*)"1-4$=33D]63``+)"1-4$=33D)!4T4`!B0D34%)3@`&)"1#O
  951. XM1U-.``8D)$-/5DP`T9`0```#"20D3U9,24Y)5/D/`-^(!```H@'1H!0``@``0
  952. XM`````````````````````$J@'``#`````````````/__________````````=
  953. XM``!)H@\``Q@`#P`!``$````"__\CH`8``S8`__\CH@\``S@`$``!``$````"`
  954. XM__\"H`8``U@```#_H@\``UH`$``!``$````"___@H!(``WH`__\`````````F
  955. XM``````#3H`8``X@$``#+G`@`Q````P.*!`2B#P`#B@H0``$``0````+__Z:@V
  956. XM!@`#J@H``*.B9@`#K`H!`````DU:`0````(```$````"```!`````@```0``B
  957. XM``(```$````"```!`````@```0````(```$````"```!`````@```0````(`&
  958. XM``$````"```!`````@```0````(``&ZB#@`#K`Q0``$``0````$`0J`(``/\8
  959. XM#`````!-HDD``P`-%0`!``$````!``$````!``$````"```!`````@```0``5
  960. XM``0`````"0`!``$````!``,``0`!`````0!6``$``0````$`=:``!`.`#0``=
  961. XM``#__P```````````````````````````````````````$5-35A86%@P```$G
  962. XM```S.#8@<W!E8VEF:6,@8V]D92!E;F%B;&5D+@T*)$-O;G9E;G1I;VYA;"!M0
  963. XM96UO<GD@879A:6QA8FQE.B`D2"!P87)A9W)A<&AS+@T*)$5-4R!M96UO<GD@A
  964. XM879A:6QA8FQE.B`D2"`Q-DLM<&%G97,N#0HD26YC;W)R96-T($1/4R!V97)S/
  965. XM:6]N+B!-=7-T(&)E(#,N,#`@;W(@;&%T97(N)$EN86-C97-S:6)L92!%6$4@'
  966. XM9FEL92X@0V%N)W0@;&]A9"!O=F5R;&%Y<RXD3F]T(&5N;W5G:"!F<F5E(&UE)
  967. XM;6]R>2!L969T('1O(')U;B!T:&ES('!R;V=R86TN)$9I;&4@22]/(&5R<F]R+
  968. XM+B1);G1E<FYA;"!M96UO<GD@86QL;V-A=&EO;B!F86EL=7)E+B1%35,@;65M0
  969. XM;W)Y(&UA;F%G97(@97)R;W(N)$5X96-U=&%B;&4@;W(@;W9E<FQA>2!H96%DI
  970. XM97(@;6ES<VEN9R!O<B!D86UA9V5D+B15;F%B;&4@=&\@<F5S;VQV92!O=F5RF
  971. XM;&%Y(&9I;&4@;F%M97,N)$EN86-C97-S:6)L92!/5DP@9FEL92X@0V%N)W0@T
  972. XM;&]A9"!O=F5R;&%Y<RXD26YC;VUP;&5T92!E>&5C=71A8FQE+B`@3U9,(&9IR
  973. XM;&5S(&UI<W-I;F<_)%5N:VYO=VX@97)R;W(A)!M;,&T;6TL-"AM;2QM;,6U/F
  974. XM5DQ-1U(Z&ULP;2`D&UM+#0H;6TL@("`@("`@("@D&UM+#0H;6TL')#\N3U9,1
  975. XM`%!345)65U4>!OR,V`40`"ZC``"T,,TA/`-S!;`!Z0``CAX``+[__T:#/`!US
  976. XM^H/&!.@``+0UL&?-(8S(CMB_"@"^``"Y"`#SIK``=0*P_RZB``!U$K1!S6<N+
  977. XMB1X``+1"S6<NB1X``+@``"ZC``"X``".V(L>```NB1X``(L>```NB1X``+1(+
  978. XMS2%S`^D``"ZC```NBPX``([`)L8&````)L8&````)L<&`````";'!@`````FA
  979. XMQP8`````)L<&``#__R;'!@`````FQP8`````)L<&`````$#BOHS(CM@S[3/_V
  980. XM,_;H```NH0``+@,&``".P(O.T>$FB`X``"ZA``#1X-'@T>#1X-'@+HL6```+[
  981. XMTG0.T>K1ZM'JT>I"+2```\(N*P8``":C```N@SX```!T!CO'<@*+^"ZA``#1$
  982. XMX-'@T>#1X":C```FB2X``"X#+@``B]6*SHKR,NTRTM'BT=&P`+1"S2$NBPX`*
  983. XM`"ZA``!)`\&.P":*'@``@^,>@_L`=0LF@SX``&R<D`'$!@`#`R0.Q`@``P-2H
  984. XM#L0*``,#?@[$#``#`Z\.Q`X``P._#L00``,#OP[$$@`#`^,.Q!0``P/]#L064
  985. XM``,#+@_$&``#`U0/Q!H``P.`#\0<``,#JP_$'@`#`ZL/Q"```P.K#\0B``,#$
  986. XMJP_&B@`#`X0`AI<``P-'&\:;``$!+`"&J@`#`S\:QKH``P.D#<;)``,#L`W&<
  987. XMU``#`X8`QMT``P.L#<K@)@("QN0``P.``,KG)@<'QNTF!@;&\@`#`WX`QO8F?
  988. XM!P?&^P`#`WP`AP0``P,)$L<(``,#-@#'#0`#`WP`QQ0$`@+'&@`"`@$`QR``"
  989. XM`@("`,<G``("!`#'+@`"`@8`QS4``@((`,<\``(""@#'0P`"`@P`QTH``@(.*
  990. XM`(=<``,#[QG'8``#`S8`QV4``P/&"L=P!`("QW0``P.P"L>#``,#K@K'F@`#@
  991. XM`[0*QYX``@(,`,>C``,#Q@K'L``#`[0*Q[P``@(.`,?!``(""@#'Q@`#`[`*;
  992. XMQ]\``P-\`,?C``,#-@#'[00"`L?Z``(""@"RH``$`WP1`'4#Z0``2.+C+J$`,
  993. XM`"ZC``".P";&!@```";'!@(````FQP8$````)L<&!@```":)/@@``\<NHP``=
  994. XM5RZ.!@``Z```)L<&``#__R:`)@``OU+H``!87PO`=05'.]=R+R['!@`````N.
  995. XMQP8`````OP``+L<%__^#QP8NH0``+HD%+HD^``".P";&!@``H.L%L`/I``"X(
  996. XM``".V*```#+DT>#1X"ZC``#H```NBPX``+@``([`C,B.V+L``+X``+\``":*,
  997. XM!#+D`P8``(D%)HL'*P8``(E%`H/'!(/#`D;BX@<?75]>6EE;6.H`````+HDV\
  998. XM```NC!X``%X?4%/\K#+DB]BM+J,``(O&+HLV``"#Q@8NC%S\+HE$_M'CT>.!N
  999. XMPP``+HX?+HM'`BZ,'"Z)-@``+HLV``!&+HDV``")-@``+HLV``!T?XDV``#V'
  1000. XM!@``('1]_@8```,&```NHP``+HLV```NCAX``%M8G2[_'@``G"Z,'@``+HDV3
  1001. XM```NBS8``"Z.'/X.``"#[@8NCAPN_W0"+O]T!"Z)-@``+HLV``!&+HDV``")C
  1002. XM-@``+HLV``!T-XDV``#V!@``('0T+HLV```NCAX``,]&+HDV``#I``#V!@``D
  1003. XM0'0+4*$``.@``%CI``#H``#I``!&+HDV``#KP?8&``!`=`I0H0``Z```6.N[O
  1004. XMZ```Z[9045)35597'@:,V([`)H`^````=0HFH0``Z```ZP20Z```!0$`)J,`S
  1005. XM`([8)HL6``"*SHKR,NTRTM'BT=$FH0``45(#T(/1`+1"L``FBAX``(/C'BZ+2
  1006. XMGP``S2%R4#/2)HL.``#1X='AT>'1X;0_S2%R.UI9M$*P`":*'@``@^,>+HN?4
  1007. XM``#-(7(DN0`"N@``'HS(CMBT/\TA'W(2Z```!Q^`#@``(%]>75M:65C#L`3I2
  1008. XM``"^``"+[H'%``(NBTP&XUN,WRXK/@``+@-T&#OU<@/H```NBAQ&._5R`^@`&
  1009. XM`"Z*/$8[]7(#Z```+HH$1COU<@/H```NBB1&+@,&```#QX[8BP<N`P8``"X[-
  1010. XM!@``<@DN.P8``',"`\>)!^*PPU-15U4>!KD``KH``(S(CM@FBAX``(/C'BZ+4
  1011. XMGP``M#_-(7,#Z0``O@``!Q]=7UE;PU-14E9751XNCAX``#/`B]"+Z(O8+HL.:
  1012. XM``#VAP``@'4P]H<``$!U!_:'```@="(NBS8``"Z+/@``*[<``!N_```[UW(&M
  1013. XM=0H[QG,&B\:+UXOK@\,0XL0+[74%L`7I``#1[='MT>W1[8S8`\4?75]>6EE;;
  1014. XMPX#\2W0/@/Q,=`4N_RX``+``Z0``"L!U\E!14E-55E<&'BZ.!@``+HL.``"[B
  1015. XM$`!))O:'``!`=1<F]H<``"!T99P,`X0$``,#VQ#$"P`#`X``Q`\``P-8`,0W)
  1016. XM``,#@@#$/0`#`S8`A$```P.H&,1%``(""`#$3`0"`H11``,#$!C$800#`\1HC
  1017. XM``,#`@#$;0`#`XH$Q'D``P,V`,2!``,#B`3$B`0"`H20``,#1QO(DR8!`<28X
  1018. XM)@$!Q*(``P.J"H2E``,#31S$J@`#`WX`R*TF!`3$MB8$!,2Y)@,#Q+P``P.([
  1019. XM`,3%``,#-@#$S@`#`X``S.8F!07$[0`#`Q``Q/(``P,2`,4!``,#!`#%"``#S
  1020. XM`X@$Q1L``P.(`,4J``,#B`3%+P0#`\4U!`,#Q3D``@($`,4^``,#`@#%1``""
  1021. XM`@8`Q4@$`@+%3P`"`@$`Q5,``@("`,57``,#!@#%7``#`Q``Q6$``P,2`,5I4
  1022. XM``,#!`#%;P`#`Q(`Q70``P,0`,5Y``,#B`3%@``"`@$`Q9,``P.(!,68!`,#3
  1023. XMQ9X$`P/%H@`"`@0`Q:<``P,"`,6M``("!@#%L00"`L6Y``,#$`#%O@`#`Q(`:
  1024. XMQ<4``P,"`(7(``,#OA+%S`0"`L73``(""`"%U@`#`ST9A=H``P/)$H7=``,#8
  1025. XM?!.%X``#`\D2Q>8``P,"`,7L!`("Q?,``@((`(7V``,#/1F%_``#`WP3QA``H
  1026. XM`@(!`,87``("#`"&&@`#`Z06AB```P,6%L8G``("`@#&+@`"`@H`QCX``@(.Q
  1027. XM`,9.!`("QE8``P,8`,9A``("#`#&>@0"`L:"``,#&`#&C``#`ZP*AIL``P,M+
  1028. XM%,:A!`("AJ\``P-'&\:R``,#K`K&Q0`#`X``AM```P.8%(;;``,#F!2&Y@`#H
  1029. XM`Y@4AO$``P.8%,;Z``,#A`#'!0`#`X0`QPH``P.``,<1``,#@@#')@`#`ZP*,
  1030. XMQR\$`@+'-P`#`Q@`AT```P,H%,=#``,#K`K'5@`#`S8`QV,``P-\`,=G!`("&
  1031. XMQVX$`@+'=00"`L=]!`,#QX(``P,"`,>&``("!`#'B@`"`@8`AZ@``P-'&\?+%
  1032. XM``,##`"'T``#`T<;Q^(``P,V`,?G``,#?`#'\`0"`L?X!`(";J``!`-X%14FG
  1033. XMBX<``"T!`"X[!@``<@8F@*<``-^#PQ#BUB['!@``__\NH0``/?__=`Z.P":.<
  1034. XM!@0`)L<&`@```+D0`+X``"Z+!#W__W0+CL"T2<TA+L<$__^#Q@+BZ.@``(OLC
  1035. XM_W86G1\'7UY=6UI96"Z,%@``+HDF``#-(2Z.%@``+HLF``!045)35597!AZ+!
  1036. XM[)R/1A;H``#H```?!U]>75M:65C/)HL>``"#ZP&+TR8#%@``@\(!)J$``#W_;
  1037. XM_W00Z```)H`.``!`+J$``.M9D"ZA``#K4I".V#O8<PD[PG--Z```Z_$#!@@`P
  1038. XM.]AS-_8&```!=`?H```#!@@`.\)R)8S8B\LKR'02!N@``":`#@```>@``(S`Z
  1039. XMCM@')HL.``"#P0'K.I"A`@`+P'0"ZZFP!ND``";'!@``__\F@"8``+^+R(/!!
  1040. XM`>@``#O1<P_H```[T7,(Z```Z```Z^KK`9`&@`X```'H``!R"1Z,P([8Z```'
  1041. XM'P>,!@8`C-C#C-@#P8[`H0@`*\%V,(D."``FHP@`H0(`)J,"`(P&`@`FC!X$J
  1042. XM`";&!@```":A`@`+P'0*'H[8C`8$`!_XP_G#+J$``#/2ZQB0CMCV!@```74+)
  1043. XM.0X(`'(%BQ8(`,.A`@`+P'7EP_8&```!=!(&C@8&`":`)@``WR:`)@``OP?KS
  1044. XM)9".V(`F``#?]@8``$!T"X`F``"_H0``Z```H0``+0$`CMCK`9!2!H`F``#^J
  1045. XMH00`"\!T,H[`)O8&```!=2@F`P8(`(S:.]!U':$(`"8!!@@`H0(`)J,"``O`5
  1046. XM=`:.V(P&!`",P([8H0(`"\!T,([`)O8&```!=2:,V`,&"`",PCO"=1HFH0@`Q
  1047. XM`08(`":A`@"C`@`+P'0'CL`FC!X$`(`F``#^!UJ,V,-14U97'@8STBZA``".G
  1048. XMV*$"``O`=?>^``"_``"Y$`"T2+O__\TA@_L0<DFT2,TA<D,N.P8``'(T.]-SD
  1049. XM`HO3+HD$CL`FQ@8````FQP8"````)L<&!@```":,'@0`)HD>"`",!@(`@\8"]
  1050. XMCMCK!BZ)!8/'`N*KO@``N1``+HL$/?__=`N.P+1)S2$NQP3__X/&`N+H!Q]?&
  1051. XM7EM9PS/2+H`^``#_=`'#+L<&``#__[\``(O9N1``+HL%/?__=!'H```[PW-8D
  1052. XM@\<"XNR+RS/2PXO+NP0`M$-15P;-9P=?60KD=`,STL,NB14FB18``":`#@``6
  1053. XM0(O"Z```+J$``([8Q@8```#'!@(```#'!@0```#'!@8```"Z`!")%@@`PXO+@
  1054. XMCMZ+T"Z+!2:C```F@`X``$##+CL&``!U`<-34AX&Z```+J$``#/2,_:.V/8&:
  1055. XM```!=`V.!@8`)H`.``!@ZPR0H0@`.]!S!(O0C(N<G0'$!``"`@(`Q`P``P,X]
  1056. XM`,03!`("Q!X``P-Z`,0D``,#.`#$/0`#`S@`A%@``P.(',1L``,#%`#$<0`#:
  1057. XM`Q8`Q'@``P,4`,1]``,#%@"$CP`#`Q`8A)(``P--',2A``("`@#$JP`"`@P`#
  1058. XMQ+(``@((`(2Z``,#/1G$OP0"`L3$``,#A@#$RP`#`U@`A-L``P-/%X3O``,#;
  1059. XM3Q>%`P`#`^L6A0P``P./%\46``("#`"%*@`#`T<;Q2\``@((`,4V!`("A3\`?
  1060. XM`P,J%X5&``,#J!B%30`#`\@4A5```P-K%X5>``,#ZQ:%:``#`X\7Q;0``P-8U
  1061. XM`,7F!`("Q>P$`@+%]P0"`L7\!`("Q@,$`@+&!P`"`@@`A@H``P,]&<8-``("(
  1062. XM`@#&H@`#`U@`QJX``P,X`,:Q``,#B@K&RP`#`S8`QPP``P.*"L<U``,#L`W'J
  1063. XM/@`#`WH`QT,``P-:`(=3``,#/1G'?P`"`@@`QX0$`@*'B@`#`X,9QXX``P.&T
  1064. XM`,>\``(""`#'P00"`L?(``,#>@"'T@`#`X,9Q]8``P.&`,?L!`("0:!-`P-T`
  1065. XM&=ZA`@`+P'78B\(''UI;PP9345(NHP``B]"T1#+`,]M2S6=:"N1U3[1$L`&[!
  1066. XM`0!2S6=:"N1U0+1$L`*[`@!2S6=:"N1U,;1$L`.[`P#-9PKD=20NC@8``"Z+[
  1067. XM#@``,]LF]H<``$!T!B:`IP``WX/#$.+M6EE;!\.P!^D``+H``(O>T>,NBY\`=
  1068. XM`+D<`+0_S2%R,3O!=",]``!T`^LKD$:#_@]T'XO>T>,N@[\``/]T[BZ+GP``?
  1069. XM,^WKT"Z!/@``35IU!L.P"^D``+`(Z0``!K0OS2$NC`8``"Z)'@``'KH``(S(D
  1070. XMCMBT<A'[DH`(S+CL._``#SI;\``+``N5``_/*N@^E0]]F+V8/Y4'0'2T^#T
  1071. XM^P=^';!<_?*N_(O3*]%*N0``+HD>```NB18``(/Z#'X%L`GI``",R([8N@``F
  1072. XML`"T/<TA<P6P`ND``"ZC```N@SX```M_"B[_!@``+O\&``"_```N`SX``(/OE
  1073. XM!;X``+D&`/.DN0``N@``M$[-(7)'N0X`+HL6```N*18``%$NBQX``+\```/[=
  1074. XMO@``+HL.``#SI%FZ``"P`+0]S2%S".@``+`*ZR*0B]G1XRZ)AP``M$_-(7("-
  1075. XMXL8NBQ8``"Z.'@``M!K-(0?#,N10#A^+V-'C@<,``(L7@_K_=&12N@``M`G-L
  1076. XM(5JT"<TAM`FZ``#-(5A0Z```M`*R.LTAN*`PZ```M`*R.LTAN`"@+BL&``#H_
  1077. XM``"T`K(ZS2&^``"Y$``SP"Z#//]T"BX#!@``@\8"XO#H``"T`K(IS2&Z``"TQ
  1078. XM"<TAZ```+J$``#W__W0&CL"T2<TAN1``O@``+HL$/?__=`:.P+1)S2&#Q@+BV
  1079. XM[;D0`+X``"Z+%(/Z_W0$M$7-9X/&`N+ON0\`B]E+T>,NBY\``(/[_W0$M#[-7
  1080. XM(>+K6+1,S2%0AN#H``!8ZP&04-#HT.C0Z-#HZ```6.L!D%`D#P0P/#IR`@0'I
  1081. XM4HK0M`+-(5I8PQXSP([8+HLV``#ZBP0NHP``BT0"+J,``+@``(D$C$P"OH0`O
  1082. XMBP0NHP``BT0"+J,``+@``(D$C$P"^Q_#'C/`CMB^A`#Z+J$``#W__W0)B00NN
  1083. XMH0``B40"+HLV```NH0``/?__=`J)!"ZA``")1`+['\,PG/4!Q!4``P-Z`,15P
  1084. XM``,#-@#$6@`#`WP`Q&$$`@+$:00"`H1Y``,#1QO$?``#`ZP*Q(4``P,8`,2I!
  1085. XM``,#&`#$L0`#`Q@`Q+H``P.L"H3$``,#1QN$R0`#`T<;Q-,``P.`#<38``,#/
  1086. XM@@W$W``#`P`-Q.\``P.L#,3T``,#K`S%(@`#`_P,Q2<``P/^#(4Q``,#1QO%V
  1087. XM.``#`ZP,A44``P-'&\5)``,#&`#%3@`#`_X,Q58``P/\#,5;``,#_@S%7@`#"
  1088. XM`ZP,Q6,``P/\#,5I``,#\P_%=``#`ZP,Q8(``P/^#,6'``,#_`S%C0`#`_P,7
  1089. XMQ9```P.L#,65``,#'@W%F@`#`_X,Q:```P.L#(6K``,#'AS%N0`#`Q@`Q<8`3
  1090. XM`P."#<7+``,#@`W%W@`#`X0-Q>D``P.Z#\7W``,#UP^%_@`#`QX<A@H``P,>T
  1091. XM',88``,#-@"&&P`#`QX<QB0``P-:`,8T``,#K@V&/``#`QX<QD4``P/I#X9,U
  1092. XM``,#B!S&4``#`S8`QF$``P,X`,9Z``,#6@#&F``#`Q@`AJX``P,H'(:^``,#@
  1093. XM.!S&X0`#`ZH*QN@``P,(`,;O``,#"@#&\@`#`V82QP```P,,`,<'``,##@#'E
  1094. XM"@`#`SH5QQ\``P,,`,<J``,##@#',@`#`ZH*QS8``P,(`,=!``,#"@"8B@(`C
  1095. X"`'0`7
  1096. X``
  1097. Xend
  1098. Xsum -r/size 34565/9296 section (from "begin" to "end")
  1099. END_OF_FILE
  1100. if test 9351 -ne `wc -c <'sys/msdos/ovlmgr.uu'`; then
  1101.     echo shar: \"'sys/msdos/ovlmgr.uu'\" unpacked with wrong size!
  1102. fi
  1103. # end of 'sys/msdos/ovlmgr.uu'
  1104. fi
  1105. if test -f 'sys/unix/unixmain.c' -a "${1}" != "-c" ; then 
  1106.   echo shar: Will not clobber existing file \"'sys/unix/unixmain.c'\"
  1107. else
  1108. echo shar: Extracting \"'sys/unix/unixmain.c'\" \(9335 characters\)
  1109. sed "s/^X//" >'sys/unix/unixmain.c' <<'END_OF_FILE'
  1110. X/*    SCCS Id: @(#)unixmain.c    3.1    92/12/04    */
  1111. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1112. X/* NetHack may be freely redistributed.  See license for details. */
  1113. X
  1114. X/* main.c - Unix NetHack */
  1115. X
  1116. X#include "hack.h"
  1117. X
  1118. X#include <signal.h>
  1119. X#include <pwd.h>
  1120. X#ifndef O_RDONLY
  1121. X#include <fcntl.h>
  1122. X#endif
  1123. X
  1124. X#if !defined(_BULL_SOURCE) && !defined(sgi)
  1125. X# if defined(POSIX_TYPES) || defined(SVR4)
  1126. Xextern struct passwd *FDECL(getpwuid,(uid_t));
  1127. X# else
  1128. Xextern struct passwd *FDECL(getpwuid,(int));
  1129. X# endif
  1130. X#endif
  1131. Xextern struct passwd *FDECL(getpwnam,(const char *));
  1132. X#ifdef CHDIR
  1133. Xstatic void chdirx();
  1134. X#endif /* CHDIR */
  1135. Xstatic boolean whoami();
  1136. Xstatic void FDECL(process_options, (int, char **));
  1137. X
  1138. Xint
  1139. Xmain(argc,argv)
  1140. Xint argc;
  1141. Xchar *argv[];
  1142. X{
  1143. X    register int fd;
  1144. X#ifdef CHDIR
  1145. X    register char *dir;
  1146. X#endif
  1147. X    boolean exact_username;
  1148. X
  1149. X    hname = argv[0];
  1150. X    hackpid = getpid();
  1151. X    (void) umask(0);
  1152. X
  1153. X    choose_windows(DEFAULT_WINDOW_SYS);
  1154. X
  1155. X#ifdef CHDIR            /* otherwise no chdir() */
  1156. X    /*
  1157. X     * See if we must change directory to the playground.
  1158. X     * (Perhaps hack runs suid and playground is inaccessible
  1159. X     *  for the player.)
  1160. X     * The environment variable HACKDIR is overridden by a
  1161. X     *  -d command line option (must be the first option given)
  1162. X     */
  1163. X    dir = getenv("NETHACKDIR");
  1164. X    if (!dir) dir = getenv("HACKDIR");
  1165. X#endif
  1166. X    if(argc > 1) {
  1167. X#ifdef CHDIR
  1168. X        if (!strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') {
  1169. X        /* avoid matching "-dec" for DECgraphics; since the man page
  1170. X         * says -d directory, hope nobody's using -desomething_else
  1171. X         */
  1172. X        argc--;
  1173. X        argv++;
  1174. X        dir = argv[0]+2;
  1175. X        if(*dir == '=' || *dir == ':') dir++;
  1176. X        if(!*dir && argc > 1) {
  1177. X            argc--;
  1178. X            argv++;
  1179. X            dir = argv[0];
  1180. X        }
  1181. X        if(!*dir)
  1182. X            error("Flag -d must be followed by a directory name.");
  1183. X        } else
  1184. X#endif /* CHDIR /**/
  1185. X
  1186. X    /*
  1187. X     * Now we know the directory containing 'record' and
  1188. X     * may do a prscore().
  1189. X     */
  1190. X        if (!strncmp(argv[1], "-s", 2)) {
  1191. X#ifdef CHDIR
  1192. X        chdirx(dir,0);
  1193. X#endif
  1194. X        prscore(argc, argv);
  1195. X        exit(0);
  1196. X        }
  1197. X    }
  1198. X
  1199. X    initoptions();
  1200. X    init_nhwindows();
  1201. X    exact_username = whoami();
  1202. X
  1203. X    /*
  1204. X     * It seems you really want to play.
  1205. X     */
  1206. X    setrandom();
  1207. X    u.uhp = 1;    /* prevent RIP on early quits */
  1208. X    (void) signal(SIGHUP, (SIG_RET_TYPE) hangup);
  1209. X#ifdef SIGXCPU
  1210. X    (void) signal(SIGXCPU, (SIG_RET_TYPE) hangup);
  1211. X#endif
  1212. X
  1213. X    /*
  1214. X     * Find the creation date of this game,
  1215. X     * so as to avoid restoring outdated savefiles.
  1216. X     */
  1217. X    gethdate(hname);
  1218. X
  1219. X    /*
  1220. X     * We cannot do chdir earlier, otherwise gethdate will fail.
  1221. X     */
  1222. X#ifdef CHDIR
  1223. X    chdirx(dir,1);
  1224. X#endif
  1225. X
  1226. X    process_options(argc, argv);    /* command line options */
  1227. X
  1228. X#ifdef DEF_PAGER
  1229. X    if(!(catmore = getenv("HACKPAGER")) && !(catmore = getenv("PAGER")))
  1230. X        catmore = DEF_PAGER;
  1231. X#endif
  1232. X#ifdef MAIL
  1233. X    getmailstatus();
  1234. X#endif
  1235. X#ifdef WIZARD
  1236. X    if (wizard)
  1237. X        Strcpy(plname, "wizard");
  1238. X    else
  1239. X#endif
  1240. X    if(!*plname || !strncmp(plname, "player", 4)
  1241. X            || !strncmp(plname, "games", 4)) {
  1242. X        exact_username = FALSE;
  1243. X        askname();
  1244. X    }
  1245. X    if (!exact_username) /* what if their LOGNAME looks suffixed-like? */
  1246. X        plnamesuffix();    /* strip suffix from name; calls askname() */
  1247. X                /* again if suffix was whole name */
  1248. X                /* accepts any suffix */
  1249. X#ifdef WIZARD
  1250. X    if(!wizard) {
  1251. X#endif
  1252. X        /*
  1253. X         * check for multiple games under the same name
  1254. X         * (if !locknum) or check max nr of players (otherwise)
  1255. X         */
  1256. X        (void) signal(SIGQUIT,SIG_IGN);
  1257. X        (void) signal(SIGINT,SIG_IGN);
  1258. X        if(!locknum)
  1259. X            Sprintf(lock, "%d%s", (int)getuid(), plname);
  1260. X        getlock();
  1261. X#ifdef WIZARD
  1262. X    } else {
  1263. X        Sprintf(lock, "%d%s", (int)getuid(), plname);
  1264. X        getlock();
  1265. X    }
  1266. X#endif /* WIZARD /**/
  1267. X
  1268. X    /*
  1269. X     * Initialisation of the boundaries of the mazes
  1270. X     * Both boundaries have to be even.
  1271. X     */
  1272. X
  1273. X    x_maze_max = COLNO-1;
  1274. X    if (x_maze_max % 2)
  1275. X        x_maze_max--;
  1276. X    y_maze_max = ROWNO-1;
  1277. X    if (y_maze_max % 2)
  1278. X        y_maze_max--;
  1279. X
  1280. X    /*
  1281. X     *  Initialize the vision system.  This must be before mklev() on a
  1282. X     *  new game or before a level restore on a saved game.
  1283. X     */
  1284. X    vision_init();
  1285. X
  1286. X    display_gamewindows();
  1287. X
  1288. X    set_savefile_name();
  1289. X    uncompress(SAVEF);
  1290. X
  1291. X    if((fd = open_savefile()) >= 0 &&
  1292. X       /* if not up-to-date, quietly delete file via false condition */
  1293. X       (uptodate(fd) || delete_savefile())) {
  1294. X#ifdef WIZARD
  1295. X        /* Since wizard is actually flags.debug, restoring might
  1296. X         * overwrite it.
  1297. X         */
  1298. X        boolean remember_wiz_mode = wizard;
  1299. X#endif
  1300. X        (void) chmod(SAVEF,0);    /* disallow parallel restores */
  1301. X        (void) signal(SIGINT, (SIG_RET_TYPE) done1);
  1302. X#ifdef NEWS
  1303. X        if(flags.news) display_file(NEWS, FALSE);
  1304. X#endif
  1305. X        pline("Restoring save file...");
  1306. X        mark_synch();    /* flush output */
  1307. X        if(!dorecover(fd))
  1308. X            goto not_recovered;
  1309. X#ifdef WIZARD
  1310. X        if(!wizard && remember_wiz_mode) wizard = TRUE;
  1311. X#endif
  1312. X        pline("Hello %s, welcome back to NetHack!", plname);
  1313. X        check_special_room(FALSE);
  1314. X#ifdef EXPLORE_MODE
  1315. X        if (discover)
  1316. X            You("are in non-scoring discovery mode.");
  1317. X#endif
  1318. X#if defined(EXPLORE_MODE) || defined(WIZARD)
  1319. X        if (discover || wizard) {
  1320. X            if(yn("Do you want to keep the save file?") == 'n')
  1321. X                (void) delete_savefile();
  1322. X            else {
  1323. X                (void) chmod(SAVEF,FCMASK); /* back to readable */
  1324. X                compress(SAVEF);
  1325. X            }
  1326. X        }
  1327. X#endif
  1328. X        flags.move = 0;
  1329. X    } else {
  1330. Xnot_recovered:
  1331. X        player_selection();
  1332. X        newgame();
  1333. X        /* give welcome message before pickup messages */
  1334. X        pline("Hello %s, welcome to NetHack!", plname);
  1335. X#ifdef EXPLORE_MODE
  1336. X        if (discover)
  1337. X            You("are in non-scoring discovery mode.");
  1338. X#endif
  1339. X        flags.move = 0;
  1340. X        set_wear();
  1341. X        pickup(1);
  1342. X    }
  1343. X
  1344. X    flags.moonphase = phase_of_the_moon();
  1345. X    if(flags.moonphase == FULL_MOON) {
  1346. X        You("are lucky!  Full moon tonight.");
  1347. X        change_luck(1);
  1348. X    } else if(flags.moonphase == NEW_MOON) {
  1349. X        pline("Be careful!  New moon tonight.");
  1350. X    }
  1351. X    if(flags.friday13 = friday_13th()) {
  1352. X        pline("Watch out!  Bad things can happen on Friday the 13th.");
  1353. X        change_luck(-1);
  1354. X    }
  1355. X
  1356. X    initrack();
  1357. X
  1358. X    moveloop();
  1359. X    return(0);
  1360. X}
  1361. X
  1362. Xstatic void
  1363. Xprocess_options(argc, argv)
  1364. Xint argc;
  1365. Xchar *argv[];
  1366. X{
  1367. X    /*
  1368. X     * Process options.
  1369. X     */
  1370. X    while(argc > 1 && argv[1][0] == '-'){
  1371. X        argv++;
  1372. X        argc--;
  1373. X        switch(argv[0][1]){
  1374. X#if defined(WIZARD) || defined(EXPLORE_MODE)
  1375. X# ifndef EXPLORE_MODE
  1376. X        case 'X':
  1377. X# endif
  1378. X        case 'D':
  1379. X# ifdef WIZARD
  1380. X            {
  1381. X              char *user;
  1382. X              int uid;
  1383. X              struct passwd *pw = (struct passwd *)0;
  1384. X
  1385. X              uid = getuid();
  1386. X              user = getlogin();
  1387. X              if (user) {
  1388. X                  pw = getpwnam(user);
  1389. X                  if (pw && (pw->pw_uid != uid)) pw = 0;
  1390. X              }
  1391. X              if (pw == 0) {
  1392. X                  user = getenv("USER");
  1393. X                  if (user) {
  1394. X                  pw = getpwnam(user);
  1395. X                  if (pw && (pw->pw_uid != uid)) pw = 0;
  1396. X                  }
  1397. X                  if (pw == 0) {
  1398. X                  pw = getpwuid(uid);
  1399. X                  }
  1400. X              }
  1401. X              if (pw && !strcmp(pw->pw_name,WIZARD)) {
  1402. X                  wizard = TRUE;
  1403. X                  break;
  1404. X              }
  1405. X            }
  1406. X            /* otherwise fall thru to discover */
  1407. X# endif
  1408. X# ifdef EXPLORE_MODE
  1409. X        case 'X':
  1410. X            discover = TRUE;
  1411. X# endif
  1412. X            break;
  1413. X#endif
  1414. X#ifdef NEWS
  1415. X        case 'n':
  1416. X            flags.news = FALSE;
  1417. X            break;
  1418. X#endif
  1419. X        case 'u':
  1420. X            if(argv[0][2])
  1421. X              (void) strncpy(plname, argv[0]+2, sizeof(plname)-1);
  1422. X            else if(argc > 1) {
  1423. X              argc--;
  1424. X              argv++;
  1425. X              (void) strncpy(plname, argv[0], sizeof(plname)-1);
  1426. X            } else
  1427. X                raw_print("Player name expected after -u");
  1428. X            plnamesuffix();
  1429. X            break;
  1430. X        case 'I':
  1431. X        case 'i':
  1432. X            if (!strncmpi(argv[0]+1, "IBM", 3))
  1433. X                switch_graphics(IBM_GRAPHICS);
  1434. X            break;
  1435. X        /*  case 'D': */
  1436. X        case 'd':
  1437. X            if (!strncmpi(argv[0]+1, "DEC", 3))
  1438. X                switch_graphics(DEC_GRAPHICS);
  1439. X            break;
  1440. X        default:
  1441. X            /* allow -T for Tourist, etc. */
  1442. X            (void) strncpy(pl_character, argv[0]+1,
  1443. X                sizeof(pl_character)-1);
  1444. X
  1445. X            /* raw_printf("Unknown option: %s", *argv); */
  1446. X        }
  1447. X    }
  1448. X
  1449. X    if(argc > 1)
  1450. X        locknum = atoi(argv[1]);
  1451. X#ifdef MAX_NR_OF_PLAYERS
  1452. X    if(!locknum || locknum > MAX_NR_OF_PLAYERS)
  1453. X        locknum = MAX_NR_OF_PLAYERS;
  1454. X#endif
  1455. X}
  1456. X
  1457. X#ifdef CHDIR
  1458. Xstatic void
  1459. Xchdirx(dir, wr)
  1460. Xconst char *dir;
  1461. Xboolean wr;
  1462. X{
  1463. X
  1464. X# ifdef SECURE
  1465. X    if(dir                    /* User specified directory? */
  1466. X#  ifdef HACKDIR
  1467. X           && strcmp(dir, HACKDIR)        /* and not the default? */
  1468. X#  endif
  1469. X        ) {
  1470. X        (void) setgid(getgid());
  1471. X        (void) setuid(getuid());        /* Ron Wessels */
  1472. X    }
  1473. X# endif
  1474. X
  1475. X# ifdef HACKDIR
  1476. X    if(dir == NULL)
  1477. X        dir = HACKDIR;
  1478. X# endif
  1479. X
  1480. X    if(dir && chdir(dir) < 0) {
  1481. X        perror(dir);
  1482. X        error("Cannot chdir to %s.", dir);
  1483. X    }
  1484. X
  1485. X    /* warn the player if we can't write the record file */
  1486. X    /* perhaps we should also test whether . is writable */
  1487. X    /* unfortunately the access system-call is worthless */
  1488. X    if (wr) check_recordfile(dir);
  1489. X}
  1490. X#endif /* CHDIR /**/
  1491. X
  1492. Xstatic boolean
  1493. Xwhoami() {
  1494. X    /*
  1495. X     * Who am i? Algorithm: 1. Use name as specified in NETHACKOPTIONS
  1496. X     *            2. Use $USER or $LOGNAME    (if 1. fails)
  1497. X     *            3. Use getlogin()        (if 2. fails)
  1498. X     * The resulting name is overridden by command line options.
  1499. X     * If everything fails, or if the resulting name is some generic
  1500. X     * account like "games", "play", "player", "hack" then eventually
  1501. X     * we'll ask him.
  1502. X     * Note that we trust the user here; it is possible to play under
  1503. X     * somebody else's name.
  1504. X     */
  1505. X    register char *s;
  1506. X
  1507. X    if (*plname) return FALSE;
  1508. X    if(/* !*plname && */ (s = getenv("USER")))
  1509. X        (void) strncpy(plname, s, sizeof(plname)-1);
  1510. X    if(!*plname && (s = getenv("LOGNAME")))
  1511. X        (void) strncpy(plname, s, sizeof(plname)-1);
  1512. X    if(!*plname && (s = getlogin()))
  1513. X        (void) strncpy(plname, s, sizeof(plname)-1);
  1514. X    return TRUE;
  1515. X}
  1516. X
  1517. X#ifdef PORT_HELP
  1518. Xvoid
  1519. Xport_help()
  1520. X{
  1521. X    /*
  1522. X     * Display unix-specific help.   Just show contents of the helpfile
  1523. X     * named by PORT_HELP.
  1524. X     */
  1525. X    display_file(PORT_HELP, TRUE);
  1526. X}
  1527. X#endif
  1528. X
  1529. X/*unixmain.c*/
  1530. END_OF_FILE
  1531. if test 9335 -ne `wc -c <'sys/unix/unixmain.c'`; then
  1532.     echo shar: \"'sys/unix/unixmain.c'\" unpacked with wrong size!
  1533. fi
  1534. # end of 'sys/unix/unixmain.c'
  1535. fi
  1536. if test -f 'sys/vms/Makefile.utl' -a "${1}" != "-c" ; then 
  1537.   echo shar: Will not clobber existing file \"'sys/vms/Makefile.utl'\"
  1538. else
  1539. echo shar: Extracting \"'sys/vms/Makefile.utl'\" \(9299 characters\)
  1540. sed "s/^X//" >'sys/vms/Makefile.utl' <<'END_OF_FILE'
  1541. X#    NetHack Makefile (VMS) - for utility programs.
  1542. X#    SCCS Id: @(#)Makefile.utl    3.1    93/01/25
  1543. X
  1544. X#  Copy this file to [.util]Makefile. and then edit it as needed.
  1545. X#  Settings for CC and CFLAGS ought to match the ones used in [.src]Makefile.
  1546. X
  1547. XMAKE    = mms
  1548. XCD    = set default
  1549. XECHO    = write sys$output
  1550. XMOVE    = rename/New        # within save device only
  1551. XMUNG    = search/Exact/Match=NOR    # to strip bogus #module directives
  1552. XRUN    = mcr            # simplest way to pass command line args
  1553. XTOUCH    = append/New _NLA0:    # only one file per $(TOUCH)
  1554. X# source tree, relative to 'src' and 'util'
  1555. XDAT = [-.dat]
  1556. XINC = [-.include]
  1557. XSHR = [-.sys.share]
  1558. XSRC = [-.src]
  1559. XUTL = [-.util]
  1560. XVMS = [-.sys.vms]
  1561. X# targets, with enough punctuation to keep MCR and DELETE happy
  1562. XMAKEDEFS= $(UTL)makedefs.exe;
  1563. XLEVCOMP = $(UTL)lev_comp.exe;
  1564. XDGNCOMP = $(UTL)dgn_comp.exe;
  1565. XRECOVER = $(UTL)recover.exe;
  1566. X
  1567. X# if you are using gcc as your compiler,
  1568. X#    uncomment the CC definition below if it's not in your environment
  1569. X# CC = gcc
  1570. X
  1571. XCFLAGS    = /Include=$(INC)/noList
  1572. X#CFLAGS = /Stand=VAXC/Incl=$(INC)/noList    # DECC in VAXC mode
  1573. XLFLAGS    = /noMap
  1574. XLIBS    = $(SRC)crtl/Options            # run-time library(s) needed
  1575. XLINK    = link
  1576. X
  1577. X# If you don't have yacc, byacc, or bison or just don't want to run any of
  1578. X#    them, then make target "no_yacc" before trying to build lev_comp
  1579. X#    or dgn_comp.  You won't be able to modify *_comp.y though.
  1580. X# If you don't have lex or flex, then make target "no_lex" and leave
  1581. X#    *_comp.l alone.  $(VMS)lev_lex.h will be used to work-around some
  1582. X#    suspect code included in the distributed copies of *_lex.c.
  1583. X# If you do either of the above, the corresponding value of YACC and/or LEX
  1584. X#    below won't matter.
  1585. X#
  1586. X# Note:  VMS POSIX V1.1 lex and yacc generate code which contains an
  1587. X#    invalid #module directive; it order to prevent warnings for CC or
  1588. X#    choking by GCC, the SEARCH command is used in an attempt to strip
  1589. X#    then out.  Otherwise MMS would quit when making the affected targets.
  1590. X#    Each "munged" copy should be identical to its original if no #module
  1591. X#    directives are present.
  1592. X#
  1593. X# yacc/lex programs to use to generate *_comp.c, *_comp.h, and *_lex.c.
  1594. X# choose xxxOUT that matches xxx tool's output
  1595. XYACC    = bison /Define
  1596. XLEX    = flex
  1597. X#YACC    = yacc -d
  1598. X#LEX    = lex
  1599. X#YACC    = posix/Run posix$bin:yacc. "-d
  1600. X#LEX    = posix/Run posix$bin:lex. "
  1601. X# blank means foo.y -> foo_tab.c & foo_tab.h
  1602. XYACCOUT =        # bison
  1603. X#YACCOUT = ytab        # VMS POSIX
  1604. X#YACCOUT = y_tab    # DEC/Shell
  1605. XLEXOUT    = lexyy        # flex
  1606. X#LEXOUT  = lex_yy    # VMS POSIX
  1607. X
  1608. X# Nothing below this line should have to be changed.
  1609. X
  1610. X# linker options file
  1611. XLIBOPT    = $(SRC)crtl.opt;
  1612. X
  1613. X# utility .c files
  1614. XMAKESRC    = makedefs.c
  1615. XSPLEVSRC   = lev_yacc.c lev_lex.c lev_main.c
  1616. XDGNCOMPSRC = dgn_yacc.c dgn_lex.c dgn_main.c
  1617. XUTILSRCS   = $(MAKESRC) $(SPLEVSRC) $(DGNCOMPSRC) panic.c recover.c
  1618. X
  1619. X# object files for makedefs
  1620. XMAKEOBJS = makedefs.obj,$(SRC)monst.obj,$(SRC)objects.obj
  1621. XVMSMAKEOBJS = $(SRC)vmsmisc.obj
  1622. X
  1623. X# object files for special levels compiler
  1624. XSPLEVOBJS = lev_main.obj,lev_yacc.obj,lev_lex.obj,panic.obj,\
  1625. X        $(SRC)alloc.obj,$(SRC)monst.obj,$(SRC)objects.obj,\
  1626. X        $(SRC)decl.obj,$(SRC)drawing.obj
  1627. XVMSSPLEVOBJS = $(SRC)vmsmisc.obj,$(SRC)vmsfiles.obj
  1628. X
  1629. X# object files for dungeon compiler
  1630. XDGNCOMPOBJS = dgn_main.obj,dgn_yacc.obj,dgn_lex.obj,panic.obj,$(SRC)alloc.obj
  1631. XVMSDGNCOBJS = $(SRC)vmsmisc.obj
  1632. X
  1633. X# object files for recovery utility
  1634. XRECOVOBJS = recover.obj
  1635. XVMSRECOBJS = $(SRC)vmsmisc.obj,$(SRC)vmsfiles.obj
  1636. X
  1637. X
  1638. X#    fake target
  1639. Xdefault :
  1640. X      @ $(ECHO) "Oops!  No target(s) specified...."
  1641. X
  1642. Xall    : $(MAKEDEFS) $(LEVCOMP) $(DGNCOMP) $(RECOVER)
  1643. X      @ $(ECHO) "util is up to date."
  1644. X
  1645. X#    special targets for folks without yacc/bison and or lex/flex
  1646. Xno_yacc :
  1647. X    copy $(SHR)%%%_yacc.c $(UTL)
  1648. X    copy $(SHR)%%%_comp.h $(INC)
  1649. X      @ $(ECHO) "distributed yacc output (*_yacc.c) copied into place"
  1650. Xno_lex :
  1651. X    copy $(SHR)%%%_lex.c $(UTL)
  1652. X    copy $(VMS)lev_lex.h $(UTL)
  1653. X      @ $(ECHO) "distributed lex output (*_lex.c) copied into place"
  1654. X
  1655. X#    alternate target names for possible interactive use
  1656. Xmakedefs : $(MAKEDEFS)
  1657. X      @ $(ECHO) "makedefs is up to date."
  1658. Xlev_comp : $(LEVCOMP)
  1659. X      @ $(ECHO) "lev_comp is up to date."
  1660. Xdgn_comp : $(DGNCOMP)
  1661. X      @ $(ECHO) "dgn_comp is up to date."
  1662. Xrecover  : $(RECOVER)
  1663. X      @ $(ECHO) "recover is up to date."
  1664. X
  1665. X$(LIBOPT) : $(SRC)Makefile.;        # linker options file
  1666. X    $(CD) $(SRC)
  1667. X    $(MAKE)$(MAKEFLAGS) $(LIBOPT)
  1668. X      @ $(CD) $(UTL)
  1669. X
  1670. X#    dependencies for makedefs
  1671. X#
  1672. X$(MAKEDEFS) :    $(MAKEOBJS) $(VMSMAKEOBJS) $(LIBOPT)
  1673. X    $(LINK) $(LFLAGS) $(MAKEOBJS),$(VMSMAKEOBJS),$(LIBS)
  1674. X
  1675. Xmakedefs.obj :    $(INC)config.h $(INC)permonst.h $(INC)objclass.h \
  1676. X        $(INC)monsym.h $(INC)artilist.h $(INC)qtext.h \
  1677. X        $(INC)patchlevel.h
  1678. X    $(CC) $(CFLAGS) makedefs.c
  1679. X
  1680. X$(INC)onames.h    : $(MAKEDEFS)
  1681. X    $(RUN) $(MAKEDEFS) -o
  1682. X$(INC)pm.h    : $(MAKEDEFS)
  1683. X    $(RUN) $(MAKEDEFS) -p
  1684. X$(SRC)monstr.c    : $(MAKEDEFS)
  1685. X    $(RUN) $(MAKEDEFS) -m
  1686. X# both vis_tab.h and vis_tab.c are made at the same time by makedefs -z
  1687. X$(INC)vis_tab.h : $(SRC)vis_tab.c
  1688. X    $(TOUCH) $(INC)vis_tab.h
  1689. X$(SRC)vis_tab.c : $(MAKEDEFS)
  1690. X    $(RUN) $(MAKEDEFS) -z
  1691. X
  1692. X# the src Makefile is responsible for knowing when to call this, since
  1693. X# it knows all about the main src and include files
  1694. X$(INC)date.h :    $(MAKEDEFS)
  1695. X    $(RUN) $(MAKEDEFS) -v
  1696. X
  1697. X
  1698. X#    dependencies for lev_comp
  1699. X#
  1700. X$(LEVCOMP) : $(SPLEVOBJS) $(VMSSPLEVOBJS)    # $(LIBOPT)
  1701. X    $(LINK)/Exe=$(LEVCOMP) $(LFLAGS) $(SPLEVOBJS),$(VMSSPLEVOBJS),$(LIBS)
  1702. X
  1703. Xlev_yacc.obj : $(INC)hack.h $(INC)sp_lev.h lev_yacc.c
  1704. X    $(CC) $(CFLAGS) lev_yacc.c
  1705. Xlev_lex.obj  : $(INC)hack.h $(INC)lev_comp.h $(INC)sp_lev.h lev_lex.c
  1706. X    @ if f$search("lev_lex.h").nes."" then    $(MOVE) lev_lex.h stdio.h
  1707. X    $(CC) $(CFLAGS) lev_lex.c
  1708. X    @ if f$search("stdio.h").nes."" then  $(MOVE) stdio.h lev_lex.h
  1709. Xlev_main.obj : $(INC)hack.h $(INC)sp_lev.h $(INC)termcap.h lev_main.c
  1710. X    $(CC) $(CFLAGS) lev_main.c
  1711. Xpanic.obj    : $(INC)config.h
  1712. X    $(CC) $(CFLAGS) panic.c
  1713. X
  1714. X$(INC)lev_comp.h : lev_yacc.c
  1715. X    $(TOUCH) $(INC)lev_comp.h
  1716. X
  1717. Xlev_yacc.c : lev_comp.y
  1718. X    $(YACC) lev_comp.y
  1719. X    $(MUNG) 'f$parse("$(YACCOUT)","lev_comp_tab.c")' "#module" /Outp=lev_yacc.c
  1720. X    @ if f$search("''f$parse("$(YACCOUT)","lev_comp_tab.c")'").nes."" then \
  1721. X        delete 'f$parse("$(YACCOUT)","lev_comp_tab.c")'
  1722. X    $(MOVE) 'f$parse("$(YACCOUT)","lev_comp_tab.h")' $(INC)lev_comp.h
  1723. X
  1724. Xlev_lex.c : lev_comp.l
  1725. X    $(LEX) lev_comp.l
  1726. X    $(MUNG) 'f$parse("$(LEXOUT)","lev_comp_lex.c")' "#module" /Outp=lev_lex.c
  1727. X    @ if f$search("''f$parse("$(LEXOUT)","lev_comp_lex.c")'").nes."" then \
  1728. X        delete 'f$parse("$(LEXOUT)","lev_comp_lex.c")'
  1729. X
  1730. X
  1731. X#    dependencies for dgn_comp
  1732. X#
  1733. X$(DGNCOMP) : $(DGNCOMPOBJS) $(VMSDGNCOBJS)    # $(LIBOPT)
  1734. X    $(LINK)/Exe=$(DGNCOMP) $(LFLAGS) $(DGNCOMPOBJS),$(VMSDGNCOBJS),$(LIBS)
  1735. X
  1736. Xdgn_yacc.obj : $(INC)config.h $(INC)dgn_file.h dgn_yacc.c
  1737. X    $(CC) $(CFLAGS) dgn_yacc.c
  1738. Xdgn_lex.obj  : $(INC)config.h $(INC)dgn_comp.h $(INC)dgn_file.h dgn_lex.c
  1739. X    @ if f$search("lev_lex.h").nes."" then    $(MOVE) lev_lex.h stdio.h
  1740. X    $(CC) $(CFLAGS) dgn_lex.c
  1741. X    @ if f$search("stdio.h").nes."" then  $(MOVE) stdio.h lev_lex.h
  1742. Xdgn_main.obj : $(INC)config.h dgn_main.c
  1743. X    $(CC) $(CFLAGS) dgn_main.c
  1744. X
  1745. X$(INC)dgn_comp.h : dgn_yacc.c
  1746. X    $(TOUCH) $(INC)dgn_comp.h
  1747. X
  1748. Xdgn_yacc.c : dgn_comp.y
  1749. X    $(YACC) dgn_comp.y
  1750. X    $(MUNG) 'f$parse("$(YACCOUT)","dgn_comp_tab.c")' "#module" /Outp=dgn_yacc.c
  1751. X    @ if f$search("''f$parse("$(YACCOUT)","dgn_comp_tab.c")'").nes."" then \
  1752. X        delete 'f$parse("$(YACCOUT)","dgn_comp_tab.c")'
  1753. X    $(MOVE) 'f$parse("$(YACCOUT)","dgn_comp_tab.h")' $(INC)dgn_comp.h
  1754. X
  1755. Xdgn_lex.c : dgn_comp.l
  1756. X    $(LEX) dgn_comp.l
  1757. X    $(MUNG) 'f$parse("$(LEXOUT)","dgn_comp_lex.c")' "#module" /Outp=dgn_lex.c
  1758. X    @ if f$search("''f$parse("$(LEXOUT)","dgn_comp_lex.c")'").nes."" then \
  1759. X        delete 'f$parse("$(LEXOUT)","dgn_comp_lex.c")'
  1760. X
  1761. X
  1762. X#    dependencies for recover
  1763. X#
  1764. X$(RECOVER) : $(RECOVOBJS) $(VMSRECOBJS)        # $(LIBOPT)
  1765. X    $(LINK) $(LFLAGS) $(RECOVOBJS),$(VMSRECOBJS),$(LIBS)
  1766. X
  1767. Xrecover.obj : $(INC)config.h
  1768. X
  1769. X
  1770. X# make sure object files from src are available when needed
  1771. X#
  1772. X$(SRC)alloc.obj : $(SRC)alloc.c $(INC)config.h
  1773. X    $(CD) $(SRC)
  1774. X    $(MAKE)$(MAKEFLAGS) alloc.obj
  1775. X      @ $(CD) $(UTL)
  1776. X
  1777. X$(SRC)monst.obj : $(SRC)monst.c $(INC)config.h
  1778. X    $(CD) $(SRC)
  1779. X    $(MAKE)$(MAKEFLAGS) monst.obj
  1780. X      @ $(CD) $(UTL)
  1781. X
  1782. X$(SRC)objects.obj : $(SRC)objects.c $(INC)config.h
  1783. X    $(CD) $(SRC)
  1784. X    $(MAKE)$(MAKEFLAGS) objects.obj
  1785. X      @ $(CD) $(UTL)
  1786. X
  1787. X$(SRC)decl.obj : $(SRC)decl.c $(INC)hack.h
  1788. X    $(CD) $(SRC)
  1789. X    $(MAKE)$(MAKEFLAGS) decl.obj
  1790. X      @ $(CD) $(UTL)
  1791. X
  1792. X$(SRC)drawing.obj : $(SRC)drawing.c $(INC)hack.h
  1793. X    $(CD) $(SRC)
  1794. X    $(MAKE)$(MAKEFLAGS) drawing.obj
  1795. X      @ $(CD) $(UTL)
  1796. X
  1797. X# make sure hack.h dependencies get transitive information
  1798. X$(INC)hack.h : $(INC)config.h
  1799. X    $(CD) $(SRC)
  1800. X    $(MAKE)$(MAKEFLAGS) $(INC)hack.h
  1801. X      @ $(CD) $(UTL)
  1802. X
  1803. X# VMS specific dependencies
  1804. X$(SRC)vmsmisc.obj :    $(VMS)vmsmisc.c
  1805. X    $(CD) $(SRC)
  1806. X    $(MAKE)$(MAKEFLAGS) vmsmisc.obj
  1807. X      @ $(CD) $(UTL)
  1808. X
  1809. X$(SRC)vmsfiles.obj :    $(VMS)vmsfiles.c $(INC)config.h
  1810. X    $(CD) $(SRC)
  1811. X    $(MAKE)$(MAKEFLAGS) vmsfiles.obj
  1812. X      @ $(CD) $(UTL)
  1813. X
  1814. X
  1815. Xclean :
  1816. X      - if f$search("*.*;-1").nes."" then  purge
  1817. X      - if f$search("*.obj") .nes."" then  delete *.obj;
  1818. X
  1819. Xspotless :    clean
  1820. X      - if f$search("%%%_lex.c") .nes."" then  delete %%%_lex.c;
  1821. X      - if f$search("%%%_yacc.c").nes."" then  delete %%%_yacc.c;
  1822. X      - if f$search("$(INC)%%%_comp.h").nes."" then  delete $(INC)%%%_comp.h;
  1823. X      - if f$search("lev_lex.h") .nes."" then  delete lev_lex.h;
  1824. X      - if f$search("*tab.c")     .nes."" then  delete *tab.c;
  1825. X      - if f$search("*.exe").nes."" then \
  1826. X delete $(MAKEDEFS),$(LEVCOMP),$(DGNCOMP),$(RECOVER)
  1827. END_OF_FILE
  1828. if test 9299 -ne `wc -c <'sys/vms/Makefile.utl'`; then
  1829.     echo shar: \"'sys/vms/Makefile.utl'\" unpacked with wrong size!
  1830. fi
  1831. # end of 'sys/vms/Makefile.utl'
  1832. fi
  1833. echo shar: End of archive 94 \(of 108\).
  1834. cp /dev/null ark94isdone
  1835. MISSING=""
  1836. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
  1837. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
  1838. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
  1839. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
  1840. 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
  1841. 101 102 103 104 105 106 107 108 ; do
  1842.     if test ! -f ark${I}isdone ; then
  1843.     MISSING="${MISSING} ${I}"
  1844.     fi
  1845. done
  1846. if test "${MISSING}" = "" ; then
  1847.     echo You have unpacked all 108 archives.
  1848.     echo "Now execute 'rebuild.sh'"
  1849.     rm -f ark10[0-8]isdone ark[1-9]isdone ark[1-9][0-9]isdone
  1850. else
  1851.     echo You still need to unpack the following archives:
  1852.     echo "        " ${MISSING}
  1853. fi
  1854. ##  End of shell archive.
  1855. exit 0
  1856.