home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / usenet / volume7 / nethack3 / patch7f < prev    next >
Encoding:
Internet Message Format  |  1990-02-26  |  60.5 KB

  1. Path: uunet!tut.cis.ohio-state.edu!zaphod.mps.ohio-state.edu!uakari!caesar.cs.montana.edu!milton!uw-beaver!zephyr.ens.tek.com!tekred!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v09i006:  NetHack3 -  display oriented dungeons & dragons (Ver. 3.0), Patch7f
  5. Message-ID: <5220@tekred.CNA.TEK.COM>
  6. Date: 24 Feb 90 00:32:13 GMT
  7. Sender: news@tekred.CNA.TEK.COM
  8. Lines: 2270
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
  12. Posting-number: Volume 9, Issue 6
  13. Archive-name: NetHack3/Patch7f
  14. Patch-To: NetHack3: Volume 7, Issue 56-93
  15.  
  16.  
  17.  
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 6 (of 30)."
  25. # Contents:  do_patch7.sh patch7.05
  26. # Wrapped by billr@saab on Wed Feb 21 10:04:27 1990
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'do_patch7.sh' -a "${1}" != "-c" ; then 
  29.   echo shar: Renaming existing file \"'do_patch7.sh'\" to \"'do_patch7.sh.orig'\"
  30.   mv -f 'do_patch7.sh' 'do_patch7.sh.orig'
  31. fi
  32. echo shar: Extracting \"'do_patch7.sh'\" \(763 characters\)
  33. sed "s/^X//" >'do_patch7.sh' <<'END_OF_FILE'
  34. X#! /bin/sh
  35. X# script to call patch to apply diff files
  36. X# make sure all of the patch files (and this file) are in your top level
  37. X# NetHack directory
  38. X#
  39. Xecho "removing unused files"
  40. Xrm -f amiga/Install.ami
  41. Xrm -f amiga/fcntl.h
  42. Xrm -f amiga/signal.h
  43. Xrm -f amiga/stdio.h
  44. Xrm -f include/trapname.h
  45. Xrm -f mac/Install.mac
  46. Xrm -f mac/Makedefs.rma
  47. Xrm -f mac/Nethack.rma
  48. Xrm -f mac/hackfont.hqx
  49. Xrm -f mac/makedefs.r
  50. Xrm -f mac/nethack.r
  51. Xrm -f others/Make.ini
  52. Xrm -f others/Maketcc.ini
  53. Xrm -f others/oldtos.c
  54. Xrm -f vms/Install.vms
  55. Xecho "creating monst.c from monst.c1 and monst.c2"
  56. Xmv -f src/monst.c src/monst.c.orig
  57. Xcat src/monst.c1 src/monst.c2 > src/monst.c
  58. Xrm src/monst.c1 src/monst.c2
  59. Xecho "applying patch7"
  60. Xcat patch7.?? | patch -p
  61. Xecho "all patches applied, check for rejects"
  62. END_OF_FILE
  63. if test 763 -ne `wc -c <'do_patch7.sh'`; then
  64.     echo shar: \"'do_patch7.sh'\" unpacked with wrong size!
  65. fi
  66. chmod +x 'do_patch7.sh'
  67. # end of 'do_patch7.sh'
  68. if test -f 'patch7.05' -a "${1}" != "-c" ; then 
  69.   echo shar: Renaming existing file \"'patch7.05'\" to \"'patch7.05.orig'\"
  70.   mv -f 'patch7.05' 'patch7.05.orig'
  71. fi
  72. echo shar: Extracting \"'patch7.05'\" \(56505 characters\)
  73. sed "s/^X//" >'patch7.05' <<'END_OF_FILE'
  74. X*** src/Old/pager.c    Mon Feb 19 18:49:43 1990
  75. X--- src/pager.c    Fri Feb 16 19:15:27 1990
  76. X***************
  77. X*** 1,4 ****
  78. X! /*    SCCS Id: @(#)pager.c    3.0    89/11/15
  79. X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  80. X  /* NetHack may be freely redistributed.  See license for details. */
  81. X  
  82. X--- 1,4 ----
  83. X! /*    SCCS Id: @(#)pager.c    3.0    89/11/19
  84. X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  85. X  /* NetHack may be freely redistributed.  See license for details. */
  86. X  
  87. X***************
  88. X*** 6,15 ****
  89. X  /* Also readmail() and doshell(), and generally the things that
  90. X     contact the outside world. */
  91. X  
  92. X  /* block some unused #defines to avoid overloading some cpp's */
  93. X- #define MONATTK_H
  94. X  #include    "hack.h"
  95. X  
  96. X  #ifndef NO_SIGNAL
  97. X  #include <signal.h>
  98. X  #endif
  99. X--- 6,16 ----
  100. X  /* Also readmail() and doshell(), and generally the things that
  101. X     contact the outside world. */
  102. X  
  103. X+ #define MONATTK_H    /* comment line for pre-compiled headers */
  104. X  /* block some unused #defines to avoid overloading some cpp's */
  105. X  #include    "hack.h"
  106. X  
  107. X+ #include <ctype.h>
  108. X  #ifndef NO_SIGNAL
  109. X  #include <signal.h>
  110. X  #endif
  111. X***************
  112. X*** 21,32 ****
  113. X  extern short macflags;
  114. X  #endif
  115. X  
  116. X! static char hc = 0;
  117. X  
  118. X  static void FDECL(page_more, (FILE *,int));
  119. X! static boolean FDECL(clear_help, (CHAR_P));
  120. X! static boolean FDECL(valid_help, (CHAR_P));
  121. X  
  122. X  /*
  123. X   * print out another possibility for dowhatis. "new" is the possible new
  124. X   * string; "out_flag" indicates whether we really want output, and if
  125. X--- 22,78 ----
  126. X  extern short macflags;
  127. X  #endif
  128. X  
  129. X! #ifndef SEEK_SET
  130. X! #define SEEK_SET 0
  131. X! #endif
  132. X! 
  133. X! #ifndef OVLB
  134. X! OSTATIC char hc;
  135. X! #else /* OVLB */
  136. X! XSTATIC char hc = 0;
  137. X! #endif /* OVLB */
  138. X  
  139. X  static void FDECL(page_more, (FILE *,int));
  140. X! OSTATIC boolean FDECL(clear_help, (CHAR_P));
  141. X! OSTATIC boolean FDECL(valid_help, (CHAR_P));
  142. X! static boolean FDECL(pmatch,(const char *,const char *));
  143. X! static boolean FDECL(outspec,(const char *,int));
  144. X! static const char *FDECL(lookat,(int,int,UCHAR_P));
  145. X! #ifdef WIZARD
  146. X! static void NDECL(wiz_help);
  147. X! #endif
  148. X! static void NDECL(help_menu);
  149. X! 
  150. X! #ifdef OVLB
  151. X! 
  152. X! /*
  153. X!  * simple pattern matcher: '*' matches 0 or more characters
  154. X!  * returns TRUE if strng matches patrn
  155. X!  */
  156. X! 
  157. X! static boolean
  158. X! pmatch(patrn, strng)
  159. X!     const char *patrn, *strng;
  160. X! {
  161. X!     char s, p;
  162. X  
  163. X+     s = *strng;
  164. X+     p = *patrn;
  165. X+ 
  166. X+     if (!p) {
  167. X+         return (s == 0);
  168. X+     }
  169. X+ 
  170. X+     if (p == '*') {
  171. X+         if (!patrn[1] || pmatch(patrn+1, strng)) {
  172. X+             return TRUE;
  173. X+         }
  174. X+         return (s ? pmatch(patrn, strng+1) : FALSE);
  175. X+     }
  176. X+ 
  177. X+     return (p == s) ? pmatch(patrn+1, strng+1) : FALSE;
  178. X+ }
  179. X+ 
  180. X  /*
  181. X   * print out another possibility for dowhatis. "new" is the possible new
  182. X   * string; "out_flag" indicates whether we really want output, and if
  183. X***************
  184. X*** 36,42 ****
  185. X  
  186. X  static boolean
  187. X  outspec(new, out_flag)
  188. X! char *new;
  189. X  int out_flag;
  190. X  {
  191. X      static char old[50];
  192. X--- 82,88 ----
  193. X  
  194. X  static boolean
  195. X  outspec(new, out_flag)
  196. X! const char *new;
  197. X  int out_flag;
  198. X  {
  199. X      static char old[50];
  200. X***************
  201. X*** 45,69 ****
  202. X          return FALSE;        /* don't print the same thing twice */
  203. X  
  204. X      if (out_flag)
  205. X!         pline("(or %s)", new);
  206. X  
  207. X      Strcpy(old, new);
  208. X      return 1;
  209. X  }
  210. X  
  211. X  int
  212. X  dowhatis()
  213. X  {
  214. X      FILE *fp;
  215. X!     char bufr[BUFSZ+6];
  216. X!     register char *buf = &bufr[6], *ep;
  217. X!     uchar q, typ;
  218. X      register int i;
  219. X      coord    cc;
  220. X      boolean oldverb = flags.verbose;
  221. X!     boolean found_in_file = FALSE;
  222. X      int    found = 0;
  223. X-     register struct monst *mtmp;
  224. X  
  225. X  #ifdef OS2_CODEVIEW
  226. X      char tmp[PATHLEN];
  227. X--- 91,268 ----
  228. X          return FALSE;        /* don't print the same thing twice */
  229. X  
  230. X      if (out_flag)
  231. X!         pline("(or %s)", an(new));
  232. X  
  233. X      Strcpy(old, new);
  234. X      return 1;
  235. X  }
  236. X  
  237. X+ /*
  238. X+  * return the name of the character ch found at (x,y)
  239. X+  */
  240. X+ 
  241. X+ static
  242. X+ const char *
  243. X+ lookat(x, y, ch)
  244. X+ int x,y;
  245. X+ uchar ch;
  246. X+ {
  247. X+     register struct monst *mtmp;
  248. X+     register struct obj *otmp;
  249. X+     struct trap *trap;
  250. X+     static char answer[50];
  251. X+     register char *s, *t;
  252. X+     uchar typ;
  253. X+ 
  254. X+     answer[0] = 0;
  255. X+ 
  256. X+     if(MON_AT(x,y)) {
  257. X+         mtmp = m_at(x,y);
  258. X+         if (!showmon(mtmp) || Hallucination)
  259. X+             mtmp = (struct monst *)0;
  260. X+     } else
  261. X+         mtmp = (struct monst *) 0;
  262. X+     typ = levl[x][y].typ;
  263. X+     if (!Invisible 
  264. X+ #ifdef POLYSELF
  265. X+             && !u.uundetected
  266. X+ #endif
  267. X+             && u.ux==x && u.uy==y) {
  268. X+         Sprintf(answer, "%s named %s",
  269. X+ #ifdef POLYSELF
  270. X+             u.mtimedone ? mons[u.umonnum].mname :
  271. X+ #endif
  272. X+             pl_character, plname);
  273. X+     } else if (mtmp && !mtmp->mimic)
  274. X+         Sprintf(answer, "%s%s",
  275. X+            mtmp->mtame ? "tame " :
  276. X+            mtmp->mpeaceful ? "peaceful " : "",
  277. X+            strncmp(lmonnam(mtmp), "the ", 4)
  278. X+               ? lmonnam(mtmp) : lmonnam(mtmp)+4);
  279. X+     else if (!levl[x][y].seen)
  280. X+         Strcpy(answer,"dark part of a room");
  281. X+     else if (mtmp && mtmp->mimic) {
  282. X+         if (mtmp->m_ap_type == M_AP_FURNITURE) {
  283. X+             if (mtmp->mappearance == S_altar)
  284. X+                 Strcpy(answer, "neutral altar");
  285. X+             else
  286. X+                 Strcpy(answer, explainsyms[mtmp->mappearance]);
  287. X+         }
  288. X+         else if (mtmp->m_ap_type == M_AP_OBJECT) {
  289. X+             if (mtmp->mappearance == STRANGE_OBJECT)
  290. X+                 Strcpy(answer, "strange object");
  291. X+             else {
  292. X+                 otmp = mksobj((int) mtmp->mappearance,FALSE );
  293. X+                 Strcpy(answer, distant_name(otmp, xname));
  294. X+                 free((genericptr_t) otmp);
  295. X+             }
  296. X+         }
  297. X+         else if (mtmp->m_ap_type == M_AP_GOLD)
  298. X+             Strcpy(answer, "pile of gold");
  299. X+     }
  300. X+     else if (OBJ_AT(x, y)) {
  301. X+         otmp = level.objects[x][y];
  302. X+         Strcpy(answer, distant_name(otmp, xname));
  303. X+     }
  304. X+     else if (ch == GOLD_SYM) {
  305. X+         Strcpy(answer, "pile of gold");
  306. X+     }
  307. X+ #ifdef ALTARS
  308. X+     else if (ch == ALTAR_SYM && IS_ALTAR(typ)) {
  309. X+         int kind = levl[x][y].altarmask & ~A_SHRINE;
  310. X+         Sprintf( answer, "%s altar",
  311. X+             (kind == A_CHAOS) ? "chaotic" :
  312. X+             (kind == A_NEUTRAL) ? "neutral" :
  313. X+              "lawful" );
  314. X+     }
  315. X+ #endif
  316. X+ #ifdef STRONGHOLD
  317. X+     else if ((ch == DB_VWALL_SYM || ch == DB_HWALL_SYM) && is_db_wall(x,y))
  318. X+         Strcpy(answer,"raised drawbridge");
  319. X+ #endif
  320. X+ #ifdef THRONES
  321. X+     else if ((ch == THRONE_SYM) && IS_THRONE(typ))
  322. X+         Strcpy(answer, "throne");
  323. X+ #endif
  324. X+     else if ( (ch==H_OPEN_DOOR_SYM ||
  325. X+            ch==V_OPEN_DOOR_SYM ||
  326. X+            ch==CLOSED_DOOR_SYM ||
  327. X+            ch==NO_DOOR_SYM) &&
  328. X+           IS_DOOR(typ) ) {
  329. X+         switch(levl[x][y].doormask & ~D_TRAPPED) {
  330. X+             case D_NODOOR: Strcpy(answer,"doorway"); break;
  331. X+             case D_BROKEN: Strcpy(answer,"broken door"); break;
  332. X+             case D_ISOPEN: Strcpy(answer,"open door"); break;
  333. X+             default:       Strcpy(answer,"closed door"); break;
  334. X+                        /* locked or not */
  335. X+         }
  336. X+     }
  337. X+ #ifdef SINKS
  338. X+     else if (ch == SINK_SYM && IS_SINK(levl[x][y].typ))
  339. X+         Strcpy(answer,"sink");
  340. X+ #endif
  341. X+     else if ((ch == TRAP_SYM || ch == WEB_SYM) && (trap = t_at(x, y))) {
  342. X+         if (trap->ttyp == WEB && ch == WEB_SYM)
  343. X+             Strcpy(answer, "web");
  344. X+         else if (trap->ttyp != MONST_TRAP && ch == TRAP_SYM) {
  345. X+             Strcpy(answer, traps[ Hallucination ?
  346. X+                 rn2(TRAPNUM-3)+3 : trap->ttyp]);
  347. X+         /* strip leading garbage */
  348. X+             for (s = answer; *s && *s != ' '; s++) ;
  349. X+             if (*s) ++s;
  350. X+             for (t = answer; *t++ = *s++; ) ;
  351. X+         }
  352. X+     }
  353. X+     else if (ch == UP_SYM && x == xupstair && y == yupstair)
  354. X+         Strcpy(answer, "staircase up");
  355. X+     else if (ch == DN_SYM && x == xdnstair && y == ydnstair)
  356. X+         Strcpy(answer, "staircase down");
  357. X+ #ifdef STRONGHOLD
  358. X+     else if (ch == UPLADDER_SYM && x && x == xupladder && y == ydnladder)
  359. X+         Strcpy(answer, "ladder up");
  360. X+     else if (ch == DNLADDER_SYM && x && x == xdnladder && y == ydnladder)
  361. X+         Strcpy(answer, "ladder down");
  362. X+ #endif
  363. X+     else if (IS_ROOM(typ)) {
  364. X+         if (ch == ROOM_SYM) {
  365. X+             if (levl[x][y].icedpool)
  366. X+                 Strcpy(answer,"iced pool");
  367. X+             else
  368. X+                 Strcpy(answer,"floor of a room");
  369. X+         }
  370. X+         else if (ch == STONE_SYM || ch == ' ')
  371. X+             Strcpy(answer,"dark part of a room");
  372. X+     }
  373. X+     else if (ch == CORR_SYM && SPACE_POS(typ))
  374. X+         Strcpy(answer,"corridor");
  375. X+     else if (!ACCESSIBLE(typ)) {
  376. X+         if (ch == STONE_SYM || ch == ' ')
  377. X+             Strcpy(answer,"dark part of a room");
  378. X+         else
  379. X+             Strcpy(answer,"wall");
  380. X+     }
  381. X+     return answer;
  382. X+ }
  383. X+ 
  384. X+     
  385. X  int
  386. X  dowhatis()
  387. X  {
  388. X      FILE *fp;
  389. X!     char buf[BUFSZ], inpbuf[BUFSZ];
  390. X!     register char *ep, *inp = inpbuf;
  391. X!     char *alt = 0;        /* alternate description */
  392. X! #ifdef __GNULINT__
  393. X!     const char *firstmatch = 0;
  394. X! #else
  395. X!     const char *firstmatch;
  396. X! #endif
  397. X!     uchar q;
  398. X      register int i;
  399. X      coord    cc;
  400. X      boolean oldverb = flags.verbose;
  401. X!     boolean found_in_file = FALSE, need_to_print = FALSE;
  402. X      int    found = 0;
  403. X  
  404. X  #ifdef OS2_CODEVIEW
  405. X      char tmp[PATHLEN];
  406. X***************
  407. X*** 92,105 ****
  408. X          return 0;
  409. X      } else if (q == 'n') {
  410. X          cc.x = cc.y = -1;
  411. X!         pline("Specify what? ");
  412. X!         q = readchar();
  413. X      } else {
  414. X          cc.x = u.ux;
  415. X          cc.y = u.uy;
  416. X  selobj:
  417. X!         found_in_file = FALSE;
  418. X          found = 0;
  419. X          (void) outspec("", 0);        /* reset output */
  420. X          if(flags.verbose)
  421. X              pline("Please move the cursor to an unknown object.");
  422. X--- 291,314 ----
  423. X          return 0;
  424. X      } else if (q == 'n') {
  425. X          cc.x = cc.y = -1;
  426. X!         pline("Specify what? (type the word) ");
  427. X!         getlin(inp);
  428. X!         if (inp[0] == '\033' || !inp[0]) {
  429. X!             (void)fclose(fp);
  430. X!             return 0;
  431. X!         }
  432. X!         if (!inp[1])
  433. X!             q = inp[0];
  434. X!         else
  435. X!             q = 0;
  436. X      } else {
  437. X          cc.x = u.ux;
  438. X          cc.y = u.uy;
  439. X  selobj:
  440. X!         need_to_print = found_in_file = FALSE;
  441. X          found = 0;
  442. X+         inp = inpbuf;
  443. X+         alt = 0;
  444. X          (void) outspec("", 0);        /* reset output */
  445. X          if(flags.verbose)
  446. X              pline("Please move the cursor to an unknown object.");
  447. X***************
  448. X*** 117,258 ****
  449. X              q = ' ';
  450. X      }
  451. X  
  452. X!     if (index(quitchars, (char)q)) {
  453. X          (void) fclose(fp); /* sweet@scubed */
  454. X          flags.verbose = oldverb;
  455. X          return 0;
  456. X      }
  457. X  
  458. X! /* now check for symbols defined in the data file */
  459. X!     if(q != '\t')
  460. X!     while(fgets(buf,BUFSZ,fp)) {
  461. X!         if(*buf == q) {
  462. X!             ep = index(buf, '\n');
  463. X!             if(ep) *ep = 0;
  464. X!             /* else: bad data file */
  465. X!             /* Expand tab 'by hand' */
  466. X!             if (buf[1] == '\t') {
  467. X!                 buf = bufr;
  468. X!                 buf[0] = q;
  469. X!                 (void) strncpy(buf+1, "       ", 7);
  470. X!             }
  471. X!             pline("%s", buf);    /* watch out for % in output */
  472. X!             (void) outspec("", 0);
  473. X              found++;
  474. X-             found_in_file = TRUE;
  475. X              break;
  476. X          }
  477. X      }
  478. X  
  479. X  /* Now check for graphics symbols */
  480. X      for (i = 0; i < MAXPCHARS; i++) {
  481. X          if ( q == showsyms[i] && (*explainsyms[i])) {
  482. X              if (!found) {
  483. X!                 pline("%c       %s",q,explainsyms[i]);
  484. X!                 (void) outspec(explainsyms[i], 0);
  485. X                  found++;
  486. X              }
  487. X              else if (outspec(explainsyms[i], 1))
  488. X                  found++;
  489. X          }
  490. X      }
  491. X  
  492. X      if (!found)
  493. X          pline("I've never heard of such things.");
  494. X! 
  495. X! /* now check for specific things at a given location */
  496. X!     if(cc.x != -1 && found) {
  497. X!         if(MON_AT(cc.x,cc.y)) {
  498. X!             mtmp = m_at(cc.x,cc.y);
  499. X!             if (!showmon(mtmp) || Hallucination)
  500. X!                 mtmp = (struct monst *)0;
  501. X!         } else
  502. X!             mtmp = (struct monst *) 0;
  503. X!         typ = levl[cc.x][cc.y].typ;
  504. X!         if (!Invisible 
  505. X! #ifdef POLYSELF
  506. X!                 && !u.uundetected
  507. X! #endif
  508. X!                 && u.ux==cc.x && u.uy==cc.y) {
  509. X!             pline("(%s named %s)",
  510. X! #ifdef POLYSELF
  511. X!                 u.mtimedone ? mons[u.umonnum].mname :
  512. X! #endif
  513. X!                 pl_character, plname);
  514. X!         } else if (mtmp && !mtmp->mimic)
  515. X!             pline("(%s%s)",
  516. X!                mtmp->mtame ? "tame " :
  517. X!                mtmp->mpeaceful ? "peaceful " : "",
  518. X!                strncmp(lmonnam(mtmp), "the ", 4)
  519. X!                   ? lmonnam(mtmp) : lmonnam(mtmp)+4);
  520. X! /* Only worry about the rest of the cases if the symbol could represent
  521. X!    more than one thing */
  522. X!         else if (found <= 1)
  523. X!             /* do nothing */ ;
  524. X!         else if (!levl[cc.x][cc.y].seen)
  525. X!             pline("(a dark part of a room)");
  526. X! #ifdef ALTARS
  527. X!         else if (q == showsyms[S_altar] && 
  528. X!              (IS_ALTAR(typ) || (mtmp && mtmp->mimic))) {
  529. X!             int kind = levl[cc.x][cc.y].altarmask & ~A_SHRINE;
  530. X!             pline( "(%s altar)",
  531. X!                 (kind == A_CHAOS) ? "chaotic" :
  532. X!                 (kind == A_NEUTRAL) ? "neutral" :
  533. X!                  "lawful" );
  534. X!         }
  535. X! #endif
  536. X!         else if ((q==showsyms[S_ndoor] ||
  537. X!               q==showsyms[S_vodoor] ||
  538. X!               q==showsyms[S_hodoor] ||
  539. X!               q==showsyms[S_cdoor]) &&
  540. X!             (IS_DOOR(typ) ||
  541. X!                 (IS_WALL(typ) && mtmp && mtmp->mimic))) {
  542. X!             /* Note: this will say mimics in walls are
  543. X!              *     closed doors, which we want.
  544. X!              */
  545. X!             switch(levl[cc.x][cc.y].doormask & ~D_TRAPPED) {
  546. X!                 case D_NODOOR: pline("(doorway)"); break;
  547. X!                 case D_BROKEN: pline("(broken door)"); break;
  548. X!                 case D_ISOPEN: pline("(open door)"); break;
  549. X!                 default:       pline("(closed door)"); break;
  550. X!                            /* locked or not */
  551. X!             }
  552. X          }
  553. X! #ifdef STRONGHOLD
  554. X!         else if ((q == showsyms[S_dbvwall] ||
  555. X!               q == showsyms[S_dbhwall]) &&
  556. X!               is_db_wall(cc.x,cc.y))
  557. X!                 pline("(raised drawbridge)");
  558. X! #endif
  559. X! #ifdef SINKS
  560. X!         else if (q == showsyms[S_sink] && IS_SINK(levl[cc.x][cc.y].typ))
  561. X!             pline("(sink)");
  562. X! #endif
  563. X!         else if (IS_ROOM(typ) && q == showsyms[S_room])
  564. X!             pline("(floor of a room)");
  565. X!         else if (q == showsyms[S_corr] && SPACE_POS(typ))
  566. X!             pline("(corridor)");
  567. X!         else if (!ACCESSIBLE(typ)) {
  568. X!             if (q == showsyms[S_stone] || q == ' ')
  569. X!                 pline("(dark part of a room)");
  570. X              else
  571. X!                 pline("(wall)");
  572. X          }
  573. X      }
  574. X  
  575. X! /* now check for "more info" */
  576. X!     if(found_in_file && ep[-1] == ';') {
  577. X!         pline("More info? ");
  578. X!         if(yn() == 'y') {
  579. X!             page_more(fp,1); /* does fclose() */
  580. X              flags.verbose = oldverb;
  581. X              return 0;
  582. X          }
  583. X      }
  584. X  
  585. X  /* if specified by cursor, keep going */
  586. X      if(cc.x != -1) {
  587. X-         buf = &bufr[6];
  588. X          more();
  589. X          rewind(fp);
  590. X          goto selobj;
  591. X--- 326,486 ----
  592. X              q = ' ';
  593. X      }
  594. X  
  595. X!     if (!q)
  596. X!         goto checkfile; /* user typed in a complete string */
  597. X! 
  598. X!     if (q != ' ' && index(quitchars, (char)q)) {
  599. X          (void) fclose(fp); /* sweet@scubed */
  600. X          flags.verbose = oldverb;
  601. X          return 0;
  602. X      }
  603. X+ /*
  604. X+  * if the user just typed one letter, or we're identifying from the
  605. X+  * screen, then we have to check all the possibilities and print them
  606. X+  * out for him/her
  607. X+  */
  608. X  
  609. X! /* Check for monsters */
  610. X!     for (i = 0; monsyms[i]; i++) {
  611. X!         if (q == monsyms[i]) {
  612. X!             need_to_print = TRUE;
  613. X!             pline("%c       %s",q,an(monexplain[i]));
  614. X!             (void) outspec(firstmatch = monexplain[i], 0);
  615. X              found++;
  616. X              break;
  617. X          }
  618. X      }
  619. X  
  620. X+ /* Now check for objects */
  621. X+     for (i = 0; objsyms[i]; i++) {
  622. X+         if (q == objsyms[i]) {
  623. X+             need_to_print = TRUE;
  624. X+             if (!found) {
  625. X+                 pline("%c       %s",q,an(objexplain[i]));
  626. X+                 (void)outspec(firstmatch = objexplain[i], 0);
  627. X+                 found++;
  628. X+             }
  629. X+             else if (outspec(objexplain[i], 1))
  630. X+                 found++;
  631. X+         }
  632. X+     }
  633. X+ 
  634. X  /* Now check for graphics symbols */
  635. X      for (i = 0; i < MAXPCHARS; i++) {
  636. X          if ( q == showsyms[i] && (*explainsyms[i])) {
  637. X              if (!found) {
  638. X!                 pline("%c       %s",q,an(explainsyms[i]));
  639. X!                 (void)outspec(firstmatch = explainsyms[i], 0);
  640. X                  found++;
  641. X              }
  642. X              else if (outspec(explainsyms[i], 1))
  643. X                  found++;
  644. X+             if (i == S_altar || i == S_trap || i == S_web)
  645. X+                 need_to_print = TRUE;
  646. X          }
  647. X      }
  648. X  
  649. X      if (!found)
  650. X          pline("I've never heard of such things.");
  651. X!     else if (cc.x != -1) {    /* a specific object on screen */
  652. X!         if (found > 1 || need_to_print) {
  653. X!             Strcpy(inp, lookat(cc.x, cc.y, q));
  654. X!             if (*inp)
  655. X!                 pline("(%s)", inp);
  656. X          }
  657. X!         else {
  658. X!             Strcpy(inp, firstmatch);
  659. X!         }
  660. X!     }
  661. X!     else if (found == 1) {
  662. X!         Strcpy(inp, firstmatch);
  663. X!     }
  664. X!     else
  665. X!         found = FALSE;    /* abort the 'More info?' stuff */
  666. X! 
  667. X! /* check the data file for information about this thing */
  668. X! 
  669. X! checkfile:
  670. X! 
  671. X!     if (!strncmp(inp, "a ", 2))
  672. X!         inp += 2;
  673. X!     else if (!strncmp(inp, "an ", 3))
  674. X!         inp += 3;
  675. X!     else if (!strncmp(inp, "the ", 4))
  676. X!         inp += 4;
  677. X!     if (!strncmp(inp, "tame ", 5))
  678. X!         inp += 5;
  679. X!     else if (!strncmp(inp, "peaceful ", 9))
  680. X!         inp += 9;
  681. X!     if (!strncmp(inp, "invisible ", 10))
  682. X!         inp += 10;
  683. X! 
  684. X!     if ((!q || found) && *inp) {
  685. X! /* adjust the input to remove "named " and convert to lower case */
  686. X!          for (ep = inp; *ep; ) {
  687. X!             if ((!strncmp(ep, " named ", 7) && (alt = ep + 7)) ||
  688. X!                 !strncmp(ep, " called ", 8))
  689. X!                 *ep = 0;
  690. X              else
  691. X!                 (*ep = tolower(*ep)), ep++;
  692. X!         }
  693. X! 
  694. X! /*
  695. X!  * If the object is named, then the name is the alternate search string;
  696. X!  * otherwise, the result of makesingular() applied to the name is. This
  697. X!  * isn't strictly optimal, but named objects of interest to the user should
  698. X!  * will usually be found under their name, rather than under their
  699. X!  * object type, so looking for a singular form is pointless.
  700. X!  */
  701. X! 
  702. X!         if (!alt)
  703. X!             alt = makesingular(inp);
  704. X!         else
  705. X!             for (ep = alt; *ep; ep++) *ep = tolower(*ep);
  706. X! 
  707. X!         while(fgets(buf,BUFSZ,fp)) {
  708. X!             if(*buf != '\t') {
  709. X!                 ep = index(buf, '\n');
  710. X!                 if(ep) *ep = 0;
  711. X!                 else impossible("bad data file");
  712. X!                 if (pmatch(buf, inp)||(alt && pmatch(buf, alt))) {
  713. X!                 found_in_file = TRUE;
  714. X!                 break;
  715. X!                 }
  716. X!             }
  717. X          }
  718. X      }
  719. X  
  720. X!     if(found_in_file) {
  721. X! /* skip over other possible matches for the info */
  722. X!         for(;;) {
  723. X!             if ( (i = getc(fp)) == '\t' ) {
  724. X!                 (void) ungetc(i, fp);
  725. X!                 break;
  726. X!             }
  727. X!             if (!fgets(buf, BUFSZ, fp)) {
  728. X!                 break;
  729. X!             }
  730. X!         }
  731. X!         if (q) {
  732. X!             pline("More info? ");
  733. X!             if(yn() == 'y') {
  734. X!                 page_more(fp,1); /* does fclose() */
  735. X!                 flags.verbose = oldverb;
  736. X!                 return 0;
  737. X!             }
  738. X!         }
  739. X!         else {
  740. X!             page_more(fp, 1);
  741. X              flags.verbose = oldverb;
  742. X              return 0;
  743. X          }
  744. X      }
  745. X+     else if (!q)
  746. X+         pline("I don't have any information on those things.");
  747. X  
  748. X  /* if specified by cursor, keep going */
  749. X      if(cc.x != -1) {
  750. X          more();
  751. X          rewind(fp);
  752. X          goto selobj;
  753. X***************
  754. X*** 351,356 ****
  755. X--- 579,595 ----
  756. X  #if !defined(MSDOS) && !defined(TOS) && !defined(MACOS)
  757. X      int (*prevsig)() = (int (*)())signal(SIGINT, (SIG_RET_TYPE) intruph);
  758. X  #endif
  759. X+ #ifdef MACOS
  760. X+     short tmpflags;
  761. X+     
  762. X+     tmpflags = macflags;
  763. X+     macflags &= ~fDoUpdate;
  764. X+     if(!mac_more(fp, strip)) {
  765. X+         macflags |= (tmpflags & fDoUpdate);
  766. X+         return;
  767. X+     }
  768. X+     macflags |= (tmpflags & fDoUpdate);
  769. X+ #else
  770. X  #if defined(MSDOS) || defined(MINIMAL_TERM)
  771. X      /* There seems to be a bug in ANSI.SYS  The first tab character
  772. X       * after a clear screen sequence is not expanded correctly.  Thus
  773. X***************
  774. X*** 396,406 ****
  775. X      (void) signal(SIGINT, (SIG_RET_TYPE) prevsig);
  776. X      got_intrup = 0;
  777. X  #endif
  778. X  }
  779. X  
  780. X! static boolean whole_screen = TRUE;
  781. X  #define    PAGMIN    12    /* minimum # of lines for page below level map */
  782. X  
  783. X  void
  784. X  set_whole_screen() {    /* called in termcap as soon as LI is known */
  785. X      whole_screen = (LI-ROWNO-2 <= PAGMIN || !CD);
  786. X--- 635,655 ----
  787. X      (void) signal(SIGINT, (SIG_RET_TYPE) prevsig);
  788. X      got_intrup = 0;
  789. X  #endif
  790. X+ #endif
  791. X  }
  792. X  
  793. X! #endif /* OVLB */
  794. X! 
  795. X  #define    PAGMIN    12    /* minimum # of lines for page below level map */
  796. X  
  797. X+ #ifndef OVLB
  798. X+ 
  799. X+ OSTATIC boolean whole_screen;
  800. X+ 
  801. X+ #else /* OVLB */
  802. X+ 
  803. X+ XSTATIC boolean whole_screen = TRUE;
  804. X+ 
  805. X  void
  806. X  set_whole_screen() {    /* called in termcap as soon as LI is known */
  807. X      whole_screen = (LI-ROWNO-2 <= PAGMIN || !CD);
  808. X***************
  809. X*** 439,445 ****
  810. X--- 688,700 ----
  811. X          so = flags.standout;
  812. X          flags.standout = 1;
  813. X      } else {
  814. X+ #ifdef MACOS
  815. X+         macflags |= fFullScrKluge;
  816. X+ #endif
  817. X          if(mode == 1) {
  818. X+ #ifdef MACOS
  819. X+             macflags |= fCornScrKluge;
  820. X+ #endif
  821. X              curs(1, LI);
  822. X              more();
  823. X          }
  824. X***************
  825. X*** 450,461 ****
  826. X              curs(1, ROWNO+4);
  827. X              cl_eos();
  828. X          }
  829. X      }
  830. X  }
  831. X  
  832. X  int
  833. X  page_line(s)        /* returns 1 if we should quit */
  834. X! register char *s;
  835. X  {
  836. X      if(cury == LI-1) {
  837. X          if(!*s)
  838. X--- 705,722 ----
  839. X              curs(1, ROWNO+4);
  840. X              cl_eos();
  841. X          }
  842. X+ #ifdef MACOS
  843. X+         macflags &= ~fScreenKluges;
  844. X+ #endif
  845. X      }
  846. X  }
  847. X  
  848. X+ #endif /* OVLB */
  849. X+ #ifdef OVL0
  850. X+ 
  851. X  int
  852. X  page_line(s)        /* returns 1 if we should quit */
  853. X! register const char *s;
  854. X  {
  855. X      if(cury == LI-1) {
  856. X          if(!*s)
  857. X***************
  858. X*** 501,507 ****
  859. X  void
  860. X  cornline(mode, text)
  861. X  int mode;
  862. X! char *text;
  863. X  {
  864. X      static struct line {
  865. X          struct line *next_line;
  866. X--- 762,768 ----
  867. X  void
  868. X  cornline(mode, text)
  869. X  int mode;
  870. X! const char *text;
  871. X  {
  872. X      static struct line {
  873. X          struct line *next_line;
  874. X***************
  875. X*** 556,561 ****
  876. X--- 817,833 ----
  877. X      else
  878. X      if(mode == 2) {
  879. X          register int curline, lth;
  880. X+ #ifdef MACOS
  881. X+         short tmpflags;
  882. X+         extern struct line *mactexthead;
  883. X+         extern int macmaxlen, maclinect;
  884. X+         
  885. X+         tmpflags = macflags;
  886. X+         macflags |= fDoUpdate | fDisplayKluge;
  887. X+         mactexthead = texthead;
  888. X+         macmaxlen = maxlen;
  889. X+         maclinect = linect;
  890. X+ #endif
  891. X  
  892. X          if(flags.toplin == 1) more();    /* ab@unido */
  893. X          remember_topl();
  894. X***************
  895. X*** 589,600 ****
  896. X          curs (lth, curline);
  897. X  #endif
  898. X          cl_end ();
  899. X!         if (!hmenu) cmore (text);
  900. X          if (!hmenu || clear_help(hc)) {
  901. X              home ();
  902. X              cl_end ();
  903. X              docorner (lth, curline-1);
  904. X          }
  905. X          } else {                    /* feed to pager */
  906. X          set_pager(0);
  907. X          for (tl = texthead; tl; tl = tl->next_line) {
  908. X--- 861,881 ----
  909. X          curs (lth, curline);
  910. X  #endif
  911. X          cl_end ();
  912. X!         if (!hmenu) {
  913. X! #ifdef MACOS
  914. X!             macflags |= fCornScrKluge;
  915. X! #endif
  916. X!             cmore (text);
  917. X!         }
  918. X          if (!hmenu || clear_help(hc)) {
  919. X              home ();
  920. X              cl_end ();
  921. X              docorner (lth, curline-1);
  922. X          }
  923. X+ #ifdef MACOS
  924. X+             mactexthead = NULL;
  925. X+             macflags |= (tmpflags & (fDoUpdate | fDisplayKluge));
  926. X+ #endif
  927. X          } else {                    /* feed to pager */
  928. X          set_pager(0);
  929. X          for (tl = texthead; tl; tl = tl->next_line) {
  930. X***************
  931. X*** 621,626 ****
  932. X--- 902,910 ----
  933. X      }
  934. X  }
  935. X  
  936. X+ #endif /* OVL0 */
  937. X+ #ifdef OVLB
  938. X+ 
  939. X  #ifdef WIZARD
  940. X  static
  941. X  void
  942. X***************
  943. X*** 653,673 ****
  944. X      cornline(1, "g.  Longer explanation of game options.");
  945. X      cornline(1, "h.  List of extended commands.");
  946. X      cornline(1, "i.  The NetHack license.");
  947. X  #ifdef WIZARD
  948. X      if (wizard)
  949. X          cornline(1, "j.  List of wizard-mode commands.");
  950. X  #endif
  951. X      cornline(1, "");
  952. X  #ifdef WIZARD
  953. X      if (wizard)
  954. X          cornline(1, "Select one of a,b,c,d,e,f,g,h,i,j or ESC: ");
  955. X      else
  956. X  #endif
  957. X          cornline(1, "Select one of a,b,c,d,e,f,g,h,i or ESC: ");
  958. X      cornline(-1,"");
  959. X  }
  960. X  
  961. X! static boolean
  962. X  clear_help(c)
  963. X  char c;
  964. X  {
  965. X--- 937,972 ----
  966. X      cornline(1, "g.  Longer explanation of game options.");
  967. X      cornline(1, "h.  List of extended commands.");
  968. X      cornline(1, "i.  The NetHack license.");
  969. X+ #ifdef MACOS
  970. X+     cornline(1, "j.  Macintosh primer.");
  971. X+ #endif
  972. X  #ifdef WIZARD
  973. X      if (wizard)
  974. X+ # ifdef MACOS
  975. X+         cornline(1, "k.  List of wizard-mode commands.");
  976. X+ # else
  977. X          cornline(1, "j.  List of wizard-mode commands.");
  978. X+ # endif
  979. X  #endif
  980. X      cornline(1, "");
  981. X  #ifdef WIZARD
  982. X      if (wizard)
  983. X+ # ifdef MACOS
  984. X+         cornline(1, "Select one of a,b,c,d,e,f,g,h,i,j,k or ESC: ");
  985. X+ # else
  986. X          cornline(1, "Select one of a,b,c,d,e,f,g,h,i,j or ESC: ");
  987. X+ # endif
  988. X      else
  989. X  #endif
  990. X+ #ifdef MACOS
  991. X+         cornline(1, "Select one of a,b,c,d,e,f,g,h,i,j or ESC: ");
  992. X+ #else
  993. X          cornline(1, "Select one of a,b,c,d,e,f,g,h,i or ESC: ");
  994. X+ #endif
  995. X      cornline(-1,"");
  996. X  }
  997. X  
  998. X! XSTATIC boolean
  999. X  clear_help(c)
  1000. X  char c;
  1001. X  {
  1002. X***************
  1003. X*** 696,714 ****
  1004. X              || !whole_screen
  1005. X  #endif
  1006. X  #ifdef WIZARD
  1007. X          || c == 'j'
  1008. X  #endif
  1009. X          );
  1010. X  }
  1011. X  
  1012. X! static boolean
  1013. X  valid_help(c)
  1014. X  char c;
  1015. X  {
  1016. X  #ifdef WIZARD
  1017. X      return ((c >= 'a' && c <= (wizard ? 'j' : 'i')) || index(quitchars,c));
  1018. X  #else
  1019. X      return ((c >= 'a' && c <= 'i') || index(quitchars,c));
  1020. X  #endif
  1021. X  }
  1022. X  
  1023. X--- 995,1025 ----
  1024. X              || !whole_screen
  1025. X  #endif
  1026. X  #ifdef WIZARD
  1027. X+ # ifdef MACOS
  1028. X+         || c == 'k'
  1029. X+ # else
  1030. X          || c == 'j'
  1031. X+ # endif
  1032. X  #endif
  1033. X          );
  1034. X  }
  1035. X  
  1036. X! XSTATIC boolean
  1037. X  valid_help(c)
  1038. X  char c;
  1039. X  {
  1040. X  #ifdef WIZARD
  1041. X+ # ifdef MACOS
  1042. X+     return ((c >= 'a' && c <= (wizard ? 'k' : 'j')) || index(quitchars,c));
  1043. X+ # else
  1044. X      return ((c >= 'a' && c <= (wizard ? 'j' : 'i')) || index(quitchars,c));
  1045. X+ # endif
  1046. X  #else
  1047. X+ # ifdef MACOS
  1048. X+     return ((c >= 'a' && c <= 'j') || index(quitchars,c));
  1049. X+ # else
  1050. X      return ((c >= 'a' && c <= 'i') || index(quitchars,c));
  1051. X+ # endif
  1052. X  #endif
  1053. X  }
  1054. X  
  1055. X***************
  1056. X*** 717,724 ****
  1057. X  {
  1058. X  #ifdef MACOS
  1059. X      term_info    *t;
  1060. X!     
  1061. X!     macflags &= ~(fDoUpdate | fDoNonKeyEvt);
  1062. X      t = (term_info *)GetWRefCon(HackWindow);
  1063. X      SetVol((StringPtr)NULL,
  1064. X          (t->auxFileVRefNum) ? t->auxFileVRefNum : t->recordVRefNum);
  1065. X--- 1028,1035 ----
  1066. X  {
  1067. X  #ifdef MACOS
  1068. X      term_info    *t;
  1069. X! 
  1070. X!     macflags &= ~fDoNonKeyEvt;
  1071. X      t = (term_info *)GetWRefCon(HackWindow);
  1072. X      SetVol((StringPtr)NULL,
  1073. X          (t->auxFileVRefNum) ? t->auxFileVRefNum : t->recordVRefNum);
  1074. X***************
  1075. X*** 736,748 ****
  1076. X              case 'h':  (void) doextlist();  break;
  1077. X              case 'i':  (void) page_file(LICENSE, FALSE);  break;
  1078. X  #ifdef WIZARD
  1079. X              case 'j':  wiz_help();  break;
  1080. X  #endif
  1081. X          }
  1082. X      }
  1083. X  #ifdef MACOS
  1084. X-     macflags |= (fDoUpdate | fDoNonKeyEvt);
  1085. X      SetVol((StringPtr)NULL, t->recordVRefNum);
  1086. X  #endif
  1087. X      return 0;
  1088. X  }
  1089. X--- 1047,1064 ----
  1090. X              case 'h':  (void) doextlist();  break;
  1091. X              case 'i':  (void) page_file(LICENSE, FALSE);  break;
  1092. X  #ifdef WIZARD
  1093. X+ # ifdef MACOS
  1094. X+             case 'j':  (void) page_file(MACHELP, FALSE);  break;
  1095. X+             case 'k':  wiz_help();  break;
  1096. X+ # else
  1097. X              case 'j':  wiz_help();  break;
  1098. X+ # endif
  1099. X  #endif
  1100. X          }
  1101. X      }
  1102. X  #ifdef MACOS
  1103. X      SetVol((StringPtr)NULL, t->recordVRefNum);
  1104. X+     macflags |= fDoNonKeyEvt;
  1105. X  #endif
  1106. X      return 0;
  1107. X  }
  1108. X***************
  1109. X*** 756,762 ****
  1110. X  
  1111. X  int
  1112. X  page_file(fnam, silent)    /* return: 0 - cannot open fnam; 1 - otherwise */
  1113. X! register char *fnam;
  1114. X  boolean silent;
  1115. X  {
  1116. X  #ifdef DEF_PAGER            /* this implies that UNIX is defined */
  1117. X--- 1072,1078 ----
  1118. X  
  1119. X  int
  1120. X  page_file(fnam, silent)    /* return: 0 - cannot open fnam; 1 - otherwise */
  1121. X! register const char *fnam;
  1122. X  boolean silent;
  1123. X  {
  1124. X  #ifdef DEF_PAGER            /* this implies that UNIX is defined */
  1125. X***************
  1126. X*** 798,809 ****
  1127. X  # ifdef MACOS
  1128. X      if ((f = fopen (fnam, "r")) == (FILE *) 0)
  1129. X          f = openFile(fnam, "r");
  1130. X-     /* refresh screen kluge */
  1131. X      if (!f) {
  1132. X-         cls();
  1133. X-         docrt();
  1134. X-         clrlin();
  1135. X-         ValidRect(&(**(*HackWindow).visRgn).rgnBBox);
  1136. X  # else
  1137. X      if ((f = fopen (fnam, "r")) == (FILE *) 0) {
  1138. X  # endif
  1139. X--- 1114,1120 ----
  1140. X***************
  1141. X*** 887,889 ****
  1142. X--- 1198,1202 ----
  1143. X  }
  1144. X  #endif
  1145. X  #endif /* UNIX /**/
  1146. X+ 
  1147. X+ #endif /* OVLB */
  1148. X*** src/Old/panic.c    Mon Feb 19 18:50:31 1990
  1149. X--- src/panic.c    Wed Jan 17 23:02:40 1990
  1150. X***************
  1151. X*** 6,12 ****
  1152. X   */
  1153. X  /* NetHack may be freely redistributed.  See license for details. */
  1154. X  
  1155. X- /* #define MAKEDEFS_C    1   /* define for Macs */
  1156. X  #define NEED_VARARGS
  1157. X  #include    "config.h"
  1158. X  
  1159. X--- 6,11 ----
  1160. X*** src/Old/pickup.c    Mon Feb 19 18:50:45 1990
  1161. X--- src/pickup.c    Mon Feb 19 10:17:32 1990
  1162. X***************
  1163. X*** 7,14 ****
  1164. X   */
  1165. X  
  1166. X  #include    "hack.h"
  1167. X  
  1168. X! void explode_bag();
  1169. X  
  1170. X  void
  1171. X  pickup(all)
  1172. X--- 7,28 ----
  1173. X   */
  1174. X  
  1175. X  #include    "hack.h"
  1176. X+ #ifndef OVERLAY
  1177. X+ static int FDECL(in_container,(struct obj *));
  1178. X+ static int FDECL(ck_container,(struct obj *));
  1179. X+ static int FDECL(ck_bag,(struct obj *));
  1180. X+ static int FDECL(out_container,(struct obj *));
  1181. X+ #else
  1182. X+ int FDECL(in_container,(struct obj *));
  1183. X+ int FDECL(ck_container,(struct obj *));
  1184. X+ int FDECL(ck_bag,(struct obj *));
  1185. X+ int FDECL(out_container,(struct obj *));
  1186. X+ #endif
  1187. X+ void FDECL(explode_bag,(struct obj *));
  1188. X+ 
  1189. X+ #ifdef OVLB
  1190. X  
  1191. X! static const char nearloadmsg[] = "have a little trouble lifting";
  1192. X  
  1193. X  void
  1194. X  pickup(all)
  1195. X***************
  1196. X*** 33,42 ****
  1197. X      dummygold.cobj = 0;
  1198. X  
  1199. X      if(Levitation) {
  1200. X!         if (multi || (all && !flags.pickup)) read_engr_at(u.ux,u.uy);
  1201. X          return;
  1202. X      }
  1203. X!     if (multi || (all && !flags.pickup)) {
  1204. X          int ct = 0;
  1205. X  
  1206. X          for (obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere)
  1207. X--- 47,61 ----
  1208. X      dummygold.cobj = 0;
  1209. X  
  1210. X      if(Levitation) {
  1211. X!         if ((multi && !flags.run) || (all && !flags.pickup))
  1212. X!             read_engr_at(u.ux,u.uy);
  1213. X          return;
  1214. X      }
  1215. X!     /* multi && !flags.run means they are in the middle of some other
  1216. X!      * action, or possibly paralyzed, sleeping, etc.... and they just
  1217. X!      * teleported onto the object.  They shouldn't pick it up.
  1218. X!      */
  1219. X!     if ((multi && !flags.run) || (all && !flags.pickup)) {
  1220. X          int ct = 0;
  1221. X  
  1222. X          for (obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere)
  1223. X***************
  1224. X*** 172,185 ****
  1225. X              continue;
  1226. X              }
  1227. X              if (gold_capacity >= gold->amount) {
  1228. X              pline("%ld gold piece%s.",
  1229. X                  gold->amount, plur(gold->amount));
  1230. X-             u.ugold += gold->amount;
  1231. X              freegold(gold);
  1232. X              if(Invisible) newsym(u.ux,u.uy);
  1233. X              } else {
  1234. X!     pline("You can only carry %s of the %ld gold pieces lying here.",
  1235. X                  gold_capacity == 1L ? "one" : "some", gold->amount);
  1236. X              pline("%ld gold piece%s.",
  1237. X                   gold_capacity, plur(gold_capacity));
  1238. X              u.ugold += gold_capacity;
  1239. X--- 191,207 ----
  1240. X              continue;
  1241. X              }
  1242. X              if (gold_capacity >= gold->amount) {
  1243. X+             u.ugold += gold->amount;
  1244. X+             if (inv_weight() > -5)
  1245. X+                 You(nearloadmsg);
  1246. X              pline("%ld gold piece%s.",
  1247. X                  gold->amount, plur(gold->amount));
  1248. X              freegold(gold);
  1249. X              if(Invisible) newsym(u.ux,u.uy);
  1250. X              } else {
  1251. X!         You("can only carry %s of the %ld gold pieces lying here.",
  1252. X                  gold_capacity == 1L ? "one" : "some", gold->amount);
  1253. X+             You(nearloadmsg);
  1254. X              pline("%ld gold piece%s.",
  1255. X                   gold_capacity, plur(gold_capacity));
  1256. X              u.ugold += gold_capacity;
  1257. X***************
  1258. X*** 199,204 ****
  1259. X--- 221,227 ----
  1260. X              pline("Touching the dead cockatrice is a fatal mistake.");
  1261. X              You("turn to stone.");
  1262. X              You("die...");
  1263. X+             killer_format = KILLED_BY_AN;
  1264. X              killer = "cockatrice corpse";
  1265. X              done(STONING);
  1266. X          }
  1267. X***************
  1268. X*** 213,219 ****
  1269. X              if(!(objects[SCR_SCARE_MONSTER].oc_name_known) &&
  1270. X                 !(objects[SCR_SCARE_MONSTER].oc_uname))
  1271. X                  docall(obj);
  1272. X!             delobj(obj);
  1273. X              continue;
  1274. X            }
  1275. X          }
  1276. X--- 236,242 ----
  1277. X              if(!(objects[SCR_SCARE_MONSTER].oc_name_known) &&
  1278. X                 !(objects[SCR_SCARE_MONSTER].oc_uname))
  1279. X                  docall(obj);
  1280. X!             useupf(obj);
  1281. X              continue;
  1282. X            }
  1283. X          }
  1284. X***************
  1285. X*** 222,228 ****
  1286. X          if(obj == uchain)
  1287. X              continue;
  1288. X  
  1289. X!         wt = inv_weight() + obj->owt;
  1290. X          if (obj->otyp == LOADSTONE)
  1291. X              goto lift_some; /* pick it up even if too heavy */
  1292. X  #ifdef POLYSELF
  1293. X--- 245,251 ----
  1294. X          if(obj == uchain)
  1295. X              continue;
  1296. X  
  1297. X!         wt = inv_weight() + (int)obj->owt;
  1298. X          if (obj->otyp == LOADSTONE)
  1299. X              goto lift_some; /* pick it up even if too heavy */
  1300. X  #ifdef POLYSELF
  1301. X***************
  1302. X*** 277,283 ****
  1303. X            int mergquan;
  1304. X  
  1305. X            obj = pick_obj(obj);
  1306. X!           if(wt > -5) You("have a little trouble lifting");
  1307. X            if(!Blind) obj->dknown = 1;
  1308. X            mergquan = obj->quan;
  1309. X            obj->quan = pickquan; /* to fool prinv() */
  1310. X--- 300,306 ----
  1311. X            int mergquan;
  1312. X  
  1313. X            obj = pick_obj(obj);
  1314. X!           if(wt > -5) You(nearloadmsg);
  1315. X            if(!Blind) obj->dknown = 1;
  1316. X            mergquan = obj->quan;
  1317. X            obj->quan = pickquan; /* to fool prinv() */
  1318. X***************
  1319. X*** 294,300 ****
  1320. X  pick_obj(otmp)
  1321. X  register struct obj *otmp;
  1322. X  {
  1323. X!     addtobill(otmp, TRUE);       /* sets obj->unpaid if necessary */
  1324. X      freeobj(otmp);
  1325. X      if(Invisible) newsym(u.ux,u.uy);
  1326. X      return(addinv(otmp));    /* might merge it with other objects */
  1327. X--- 317,324 ----
  1328. X  pick_obj(otmp)
  1329. X  register struct obj *otmp;
  1330. X  {
  1331. X!     if (otmp != uball)         /* don't charge for this - kd, 1/17/90 */
  1332. X!         addtobill(otmp, TRUE);       /* sets obj->unpaid if necessary */
  1333. X      freeobj(otmp);
  1334. X      if(Invisible) newsym(u.ux,u.uy);
  1335. X      return(addinv(otmp));    /* might merge it with other objects */
  1336. X***************
  1337. X*** 307,313 ****
  1338. X      register int c;
  1339. X  
  1340. X      if (Levitation) {
  1341. X!         pline("You cannot reach the floor.");
  1342. X          return(0);
  1343. X      }
  1344. X      for(cobj = level.objects[u.ux][u.uy]; cobj; cobj = cobj->nexthere) {
  1345. X--- 331,337 ----
  1346. X      register int c;
  1347. X  
  1348. X      if (Levitation) {
  1349. X!         You("cannot reach the floor.");
  1350. X          return(0);
  1351. X      }
  1352. X      for(cobj = level.objects[u.ux][u.uy]; cobj; cobj = cobj->nexthere) {
  1353. X***************
  1354. X*** 327,333 ****
  1355. X  
  1356. X              You("carefully open the bag...");
  1357. X              pline("It develops a huge set of teeth and bites you!");
  1358. X!             losehp(rnd(10), "carnivorous bag");
  1359. X              makeknown(BAG_OF_TRICKS);
  1360. X              continue;
  1361. X              }
  1362. X--- 351,357 ----
  1363. X  
  1364. X              You("carefully open the bag...");
  1365. X              pline("It develops a huge set of teeth and bites you!");
  1366. X!             losehp(rnd(10), "carnivorous bag", KILLED_BY_AN);
  1367. X              makeknown(BAG_OF_TRICKS);
  1368. X              continue;
  1369. X              }
  1370. X***************
  1371. X*** 334,339 ****
  1372. X--- 358,364 ----
  1373. X  
  1374. X              You("carefully open the %s...", xname(cobj));
  1375. X              if(cobj->otrapped) chest_trap(cobj, FINGER);
  1376. X+             if(multi < 0) return 0; /* a paralysis trap */
  1377. X  
  1378. X              use_container(cobj, 0);
  1379. X          }
  1380. X***************
  1381. X*** 347,361 ****
  1382. X  #define Icebox (current_container->otyp == ICE_BOX)
  1383. X  int baggone;    /* used in askchain so bag isn't used after explosion */
  1384. X  
  1385. X  void
  1386. X  inc_cwt(cobj, obj)
  1387. X  register struct obj *cobj, *obj;
  1388. X  {
  1389. X      if (cobj->otyp == BAG_OF_HOLDING)
  1390. X!         cobj->owt += (obj->cursed?(obj->owt*2):(obj->owt/(obj->blessed?4:2)) + 1);
  1391. X      else    cobj->owt += obj->owt;
  1392. X  }
  1393. X  
  1394. X  #ifndef OVERLAY
  1395. X  static 
  1396. X  #endif
  1397. X--- 372,392 ----
  1398. X  #define Icebox (current_container->otyp == ICE_BOX)
  1399. X  int baggone;    /* used in askchain so bag isn't used after explosion */
  1400. X  
  1401. X+ #endif /* OVLB */
  1402. X+ #ifdef OVL0
  1403. X+ 
  1404. X  void
  1405. X  inc_cwt(cobj, obj)
  1406. X  register struct obj *cobj, *obj;
  1407. X  {
  1408. X      if (cobj->otyp == BAG_OF_HOLDING)
  1409. X!         cobj->owt += (cobj->cursed?(obj->owt*2):(obj->owt/(cobj->blessed?4:2)) + 1);
  1410. X      else    cobj->owt += obj->owt;
  1411. X  }
  1412. X  
  1413. X+ #endif /* OVL0 */
  1414. X+ #ifdef OVLB
  1415. X+ 
  1416. X  #ifndef OVERLAY
  1417. X  static 
  1418. X  #endif
  1419. X***************
  1420. X*** 363,368 ****
  1421. X--- 394,401 ----
  1422. X  in_container(obj)
  1423. X  register struct obj *obj;
  1424. X  {
  1425. X+     char buf[BUFSZ];
  1426. X+ 
  1427. X      if(obj == uball || obj == uchain) {
  1428. X          You("must be kidding.");
  1429. X          return(0);
  1430. X***************
  1431. X*** 394,400 ****
  1432. X      /* magic bag -> magic bag will self destruct later on. */
  1433. X      if(Is_container(obj) && Is_container(current_container) &&
  1434. X          (!Is_mbag(obj) || !Is_mbag(current_container))) {
  1435. X!         pline("It won't go in.");
  1436. X          return(1);    /* be careful! */
  1437. X      }
  1438. X      if(obj == uwep) {
  1439. X--- 427,433 ----
  1440. X      /* magic bag -> magic bag will self destruct later on. */
  1441. X      if(Is_container(obj) && Is_container(current_container) &&
  1442. X          (!Is_mbag(obj) || !Is_mbag(current_container))) {
  1443. X!         pline("The %s won't go in.", xname(obj));
  1444. X          return(1);    /* be careful! */
  1445. X      }
  1446. X      if(obj == uwep) {
  1447. X***************
  1448. X*** 407,413 ****
  1449. X      }
  1450. X  #ifdef WALKIES
  1451. X      if(obj->otyp == LEASH && obj->leashmon != 0) {
  1452. X!         pline("It is attached to your pet.");
  1453. X          return(0);
  1454. X      }
  1455. X  #endif
  1456. X--- 440,446 ----
  1457. X      }
  1458. X  #ifdef WALKIES
  1459. X      if(obj->otyp == LEASH && obj->leashmon != 0) {
  1460. X!         pline("The %s is attached to your pet.", xname(obj));
  1461. X          return(0);
  1462. X      }
  1463. X  #endif
  1464. X***************
  1465. X*** 417,422 ****
  1466. X--- 450,457 ----
  1467. X      obj->cobj = current_container;
  1468. X      obj->nobj = fcobj;
  1469. X      fcobj = obj;
  1470. X+     Strcpy(buf, xname(obj->cobj));
  1471. X+     You("put %s into the %s.", doname(obj), buf);
  1472. X  
  1473. X      if(Icebox) obj->age = monstermoves - obj->age; /* actual age */
  1474. X  
  1475. X***************
  1476. X*** 425,431 ****
  1477. X           (obj->otyp == WAN_CANCELLATION && (obj->spe > 0)) )) {
  1478. X          explode_bag(obj);
  1479. X          You("are blasted by a magical explosion!");
  1480. X!         losehp(d(6,6),"magical explosion");
  1481. X          baggone = 1;
  1482. X      }
  1483. X      return(1);
  1484. X--- 460,466 ----
  1485. X           (obj->otyp == WAN_CANCELLATION && (obj->spe > 0)) )) {
  1486. X          explode_bag(obj);
  1487. X          You("are blasted by a magical explosion!");
  1488. X!         losehp(d(6,6),"magical explosion", KILLED_BY_AN);
  1489. X          baggone = 1;
  1490. X      }
  1491. X      return(1);
  1492. X***************
  1493. X*** 441,451 ****
  1494. X      return(obj->cobj == current_container);
  1495. X  }
  1496. X  
  1497. X  #ifndef OVERLAY
  1498. X  static 
  1499. X  #endif
  1500. X  int
  1501. X! ck_bag()
  1502. X  {
  1503. X      return(!baggone);
  1504. X  }
  1505. X--- 476,490 ----
  1506. X      return(obj->cobj == current_container);
  1507. X  }
  1508. X  
  1509. X+ /* ck_bag() needs a formal argument to make the overlay/prototype mechanism
  1510. X+  * work right */
  1511. X+ /*ARGSUSED*/
  1512. X  #ifndef OVERLAY
  1513. X  static 
  1514. X  #endif
  1515. X  int
  1516. X! ck_bag(obj)
  1517. X! struct obj *obj;
  1518. X  {
  1519. X      return(!baggone);
  1520. X  }
  1521. X***************
  1522. X*** 458,468 ****
  1523. X--- 497,521 ----
  1524. X  register struct obj *obj;
  1525. X  {
  1526. X      register struct obj *otmp;
  1527. X+     register boolean near_capacity = (inv_weight() > -5);
  1528. X  
  1529. X      if(inv_cnt() >= 52) {
  1530. X          pline("You have no room to hold anything else.");
  1531. X          return(0);
  1532. X      }
  1533. X+     if(obj->otyp != LOADSTONE && inv_weight() + (int)obj->owt > 0) {
  1534. X+         char buf[BUFSZ];
  1535. X+ 
  1536. X+         Strcpy(buf, doname(obj));
  1537. X+         pline("There %s %s in the %s, but %s.",
  1538. X+             obj->quan==1 ? "is" : "are",
  1539. X+             buf, xname(current_container),
  1540. X+             invent ? "you cannot carry any more"
  1541. X+             : "it is too heavy for you to carry");
  1542. X+         /* "too heavy for you to lift" is not right if you're carrying
  1543. X+            the container... */
  1544. X+         return(0);
  1545. X+     }
  1546. X      if(obj == fcobj) fcobj = fcobj->nobj;
  1547. X      else {
  1548. X          for(otmp = fcobj; otmp->nobj != obj; otmp = otmp->nobj)
  1549. X***************
  1550. X*** 476,481 ****
  1551. X--- 529,536 ----
  1552. X      /* simulated point of time */
  1553. X  
  1554. X      (void) addinv(obj);
  1555. X+     if (near_capacity) You("have a little trouble removing");
  1556. X+     prinv(obj);
  1557. X      return 0;
  1558. X  }
  1559. X  
  1560. X***************
  1561. X*** 608,616 ****
  1562. X  register struct obj *cobj, *obj;
  1563. X  {
  1564. X      if (Is_mbag(cobj))
  1565. X!         cobj->owt -= (obj->owt/2 + 1);
  1566. X      else    cobj->owt -= obj->owt;
  1567. X  
  1568. X      if(cobj->owt < objects[cobj->otyp].oc_weight)
  1569. X          cobj->owt = objects[cobj->otyp].oc_weight;
  1570. X  }
  1571. X--- 663,673 ----
  1572. X  register struct obj *cobj, *obj;
  1573. X  {
  1574. X      if (Is_mbag(cobj))
  1575. X!         cobj->owt -= (cobj->cursed?(obj->owt*2):(obj->owt/(cobj->blessed?4:2)) + 1);
  1576. X      else    cobj->owt -= obj->owt;
  1577. X  
  1578. X      if(cobj->owt < objects[cobj->otyp].oc_weight)
  1579. X          cobj->owt = objects[cobj->otyp].oc_weight;
  1580. X  }
  1581. X+ 
  1582. X+ #endif /* OVLB */
  1583. X*** src/Old/polyself.c    Mon Feb 19 18:51:14 1990
  1584. X--- src/polyself.c    Wed Feb 14 17:54:16 1990
  1585. X***************
  1586. X*** 1,4 ****
  1587. X! /*    SCCS Id: @(#)polyself.c 3.0    89/11/19
  1588. X  /* Polymorph self routine.  Copyright (C) 1987, 1988, 1989 by Ken Arromdee */
  1589. X  /* NetHack may be freely redistributed.  See license for details. */
  1590. X  
  1591. X--- 1,4 ----
  1592. X! /*    SCCS Id: @(#)polyself.c 3.0    89/11/21
  1593. X  /* Polymorph self routine.  Copyright (C) 1987, 1988, 1989 by Ken Arromdee */
  1594. X  /* NetHack may be freely redistributed.  See license for details. */
  1595. X  
  1596. X***************
  1597. X*** 5,16 ****
  1598. X  #include "hack.h"
  1599. X  
  1600. X  #ifdef POLYSELF
  1601. X! static void break_armor(), drop_weapon();
  1602. X! static void skinback();
  1603. X! static void uunstick();
  1604. X  static boolean sticky;
  1605. X  #endif
  1606. X  
  1607. X  void
  1608. X  newman()
  1609. X  {
  1610. X--- 5,21 ----
  1611. X  #include "hack.h"
  1612. X  
  1613. X  #ifdef POLYSELF
  1614. X! static void NDECL(break_armor);
  1615. X! static void FDECL(drop_weapon,(int));
  1616. X! static void NDECL(skinback);
  1617. X! static void NDECL(uunstick);
  1618. X! #ifdef OVLB
  1619. X  static boolean sticky;
  1620. X+ #endif /* OVLB */
  1621. X  #endif
  1622. X  
  1623. X+ #ifdef OVLB
  1624. X+ 
  1625. X  void
  1626. X  newman()
  1627. X  {
  1628. X***************
  1629. X*** 20,28 ****
  1630. X      if (!rn2(10)) {
  1631. X          flags.female = !flags.female;
  1632. X          max_rank_sz();
  1633. X!         if (pl_character[0]=='P')
  1634. X!             Strcpy(pl_character+6, flags.female?"ess":"");
  1635. X!         if (pl_character[0]=='C')
  1636. X              Strcpy(pl_character+5, flags.female ? "woman" : "man");
  1637. X      }
  1638. X  #ifdef POLYSELF
  1639. X--- 25,33 ----
  1640. X      if (!rn2(10)) {
  1641. X          flags.female = !flags.female;
  1642. X          max_rank_sz();
  1643. X!         if (pl_character[0] == 'P')
  1644. X!             Strcpy(pl_character+6, flags.female ? "ess" : "");
  1645. X!         if (pl_character[0] == 'C')
  1646. X              Strcpy(pl_character+5, flags.female ? "woman" : "man");
  1647. X      }
  1648. X  #ifdef POLYSELF
  1649. X***************
  1650. X*** 42,49 ****
  1651. X      if (u.ulevel > 127 || u.ulevel == 0) u.ulevel = 1;
  1652. X      if (u.ulevel > MAXULEV) u.ulevel = MAXULEV;
  1653. X  
  1654. X!     for(tmp = u.ulevel; tmp != tmp2; tmp += (tmp2 < u.ulevel) ? -1 : 1)
  1655. X!         adjabil((tmp2 > u.ulevel) ? -1 : 1);
  1656. X      tmp = u.uhpmax;
  1657. X  
  1658. X      /* random experience points for the new experience level */
  1659. X--- 47,53 ----
  1660. X      if (u.ulevel > 127 || u.ulevel == 0) u.ulevel = 1;
  1661. X      if (u.ulevel > MAXULEV) u.ulevel = MAXULEV;
  1662. X  
  1663. X!     adjabil(tmp2, (int)u.ulevel);
  1664. X      tmp = u.uhpmax;
  1665. X  
  1666. X      /* random experience points for the new experience level */
  1667. X***************
  1668. X*** 54,60 ****
  1669. X  /* If it was u.uhpmax*u.ulevel/tmp+9-rn2(19), then a 1st level character
  1670. X     with 16 hp who polymorphed into a 3rd level one would have an average
  1671. X     of 48 hp.  */
  1672. X! #ifndef LINT
  1673. X      u.uhp = u.uhp * (long)u.uhpmax/tmp;
  1674. X  #endif
  1675. X  #ifdef SPELLS
  1676. X--- 58,66 ----
  1677. X  /* If it was u.uhpmax*u.ulevel/tmp+9-rn2(19), then a 1st level character
  1678. X     with 16 hp who polymorphed into a 3rd level one would have an average
  1679. X     of 48 hp.  */
  1680. X! #ifdef LINT
  1681. X!     u.uhp = u.uhp + tmp;
  1682. X! #else
  1683. X      u.uhp = u.uhp * (long)u.uhpmax/tmp;
  1684. X  #endif
  1685. X  #ifdef SPELLS
  1686. X***************
  1687. X*** 79,84 ****
  1688. X--- 85,91 ----
  1689. X          } else {
  1690. X  #endif
  1691. X              Your("new form doesn't seem healthy enough to survive.");
  1692. X+             killer_format = KILLED_BY_AN;
  1693. X              killer="unsuccessful polymorph";
  1694. X              done(DIED);
  1695. X  #ifdef POLYSELF
  1696. X***************
  1697. X*** 107,114 ****
  1698. X--- 114,131 ----
  1699. X          regularize(SAVEF+7);
  1700. X          Strcat(SAVEF, ";1");
  1701. X  #else
  1702. X+ # ifdef MSDOS
  1703. X+         (void)strcpy(SAVEF, SAVEP);
  1704. X+         {
  1705. X+             int i = strlen(SAVEF);
  1706. X+             (void)strncat(SAVEF, plname, 8);
  1707. X+             regularize(SAVEF+i);
  1708. X+         }
  1709. X+         (void)strcat(SAVEF, ".sav");
  1710. X+ # else
  1711. X          Sprintf(SAVEF, "save/%d%s", getuid(), plname);
  1712. X          regularize(SAVEF+5);        /* avoid . or / in name */
  1713. X+ # endif
  1714. X  #endif
  1715. X  #ifdef WIZARD
  1716. X      }
  1717. X***************
  1718. X*** 141,147 ****
  1719. X      if(!Polymorph_control && !draconian && !iswere && !isvamp) {
  1720. X          if (rn2(20) > ACURR(A_CON)) {
  1721. X          You("shudder for a moment.");
  1722. X!         losehp(rn2(30),"system shock");
  1723. X          return;
  1724. X          }
  1725. X      }
  1726. X--- 158,164 ----
  1727. X      if(!Polymorph_control && !draconian && !iswere && !isvamp) {
  1728. X          if (rn2(20) > ACURR(A_CON)) {
  1729. X          You("shudder for a moment.");
  1730. X!         losehp(rn2(30),"system shock", KILLED_BY_AN);
  1731. X          return;
  1732. X          }
  1733. X      }
  1734. X***************
  1735. X*** 200,207 ****
  1736. X      if (!uarmg) selftouch("No longer petrify-resistant, you");
  1737. X      if (Inhell && !Fire_resistance) {
  1738. X          You("burn to a crisp.");
  1739. X!         killer = "unwise polymorph";
  1740. X!         done(BURNING);
  1741. X      }
  1742. X  }
  1743. X  
  1744. X--- 217,228 ----
  1745. X      if (!uarmg) selftouch("No longer petrify-resistant, you");
  1746. X      if (Inhell && !Fire_resistance) {
  1747. X          You("burn to a crisp.");
  1748. X!         killer_format = KILLED_BY;
  1749. X!         killer = "losing fire resistance after polymorphing";
  1750. X!         while(1) {
  1751. X!         done(BURNING);
  1752. X!         You("continue burning.");
  1753. X!         }
  1754. X      }
  1755. X  }
  1756. X  
  1757. X***************
  1758. X*** 284,307 ****
  1759. X      /* Low level characters can't become high level monsters for long */
  1760. X          u.mtimedone = u.mtimedone * u.ulevel / mons[mntmp].mlevel;
  1761. X      flags.botl = 1;
  1762. X!     if (can_breathe(uasmon))
  1763. X!         pline("Use the command #monster for breath weapon.");
  1764. X!     if (attacktype(uasmon, AT_SPIT))
  1765. X          pline("Use the command #monster to spit venom.");
  1766. X!     if (u.usym == S_NYMPH)
  1767. X!         pline("Use the command #monster if you have to remove an iron ball.");
  1768. X!     if (u.usym == S_UMBER)
  1769. X          pline("Use the command #monster to confuse monsters.");
  1770. X!     if (is_hider(uasmon))
  1771. X          pline("Use the command #monster to hide.");
  1772. X!     if (is_were(uasmon))
  1773. X          pline("Use the command #monster to summon help.");
  1774. X!     if (webmaker(uasmon))
  1775. X          pline("Use the command #monster to spin a web.");
  1776. X!     if (u.usym == S_UNICORN)
  1777. X          pline("Use the command #monster to use your horn.");
  1778. X!     if (lays_eggs(uasmon) || u.umonnum == PM_QUEEN_BEE)
  1779. X          pline("Use the command #sit to lay an egg.");
  1780. X      find_ac();
  1781. X      return(1);
  1782. X  }
  1783. X--- 305,330 ----
  1784. X      /* Low level characters can't become high level monsters for long */
  1785. X          u.mtimedone = u.mtimedone * u.ulevel / mons[mntmp].mlevel;
  1786. X      flags.botl = 1;
  1787. X!     if (flags.verbose) {
  1788. X!         if (can_breathe(uasmon))
  1789. X!         pline("Use the command #monster to use your breath weapon.");
  1790. X!         if (attacktype(uasmon, AT_SPIT))
  1791. X          pline("Use the command #monster to spit venom.");
  1792. X!         if (u.usym == S_NYMPH)
  1793. X!         pline("Use the command #monster to remove an iron ball.");
  1794. X!         if (u.usym == S_UMBER)
  1795. X          pline("Use the command #monster to confuse monsters.");
  1796. X!         if (is_hider(uasmon))
  1797. X          pline("Use the command #monster to hide.");
  1798. X!         if (is_were(uasmon))
  1799. X          pline("Use the command #monster to summon help.");
  1800. X!         if (webmaker(uasmon))
  1801. X          pline("Use the command #monster to spin a web.");
  1802. X!         if (u.usym == S_UNICORN)
  1803. X          pline("Use the command #monster to use your horn.");
  1804. X!         if (lays_eggs(uasmon) || u.umonnum == PM_QUEEN_BEE)
  1805. X          pline("Use the command #sit to lay an egg.");
  1806. X+     }
  1807. X      find_ac();
  1808. X      return(1);
  1809. X  }
  1810. X***************
  1811. X*** 312,317 ****
  1812. X--- 335,341 ----
  1813. X  
  1814. X       if (breakarm(uasmon)) {
  1815. X      if (otmp = uarm) {
  1816. X+         if (donning(otmp)) cancel_don();
  1817. X          You("break out of your armor!");
  1818. X          (void) Armor_gone();
  1819. X          useup(otmp);
  1820. X***************
  1821. X*** 329,334 ****
  1822. X--- 353,359 ----
  1823. X  #endif
  1824. X       } else if (sliparm(uasmon)) {
  1825. X      if (otmp = uarm) {
  1826. X+         if (donning(otmp)) cancel_don();
  1827. X          Your("armor falls around you!");
  1828. X          (void) Armor_gone();
  1829. X          dropx(otmp);
  1830. X***************
  1831. X*** 348,358 ****
  1832. X       }
  1833. X       if (nohands(uasmon) || verysmall(uasmon)) {
  1834. X        if (otmp = uarmg) {
  1835. X             /* Drop weapon along with gloves */
  1836. X             You("drop your gloves%s!", uwep ? " and weapon" : "");
  1837. X             (void) Gloves_off();
  1838. X             dropx(otmp);
  1839. X-            drop_weapon(0);
  1840. X        }
  1841. X        if (otmp = uarms) {
  1842. X             You("can no longer hold your shield!");
  1843. X--- 373,384 ----
  1844. X       }
  1845. X       if (nohands(uasmon) || verysmall(uasmon)) {
  1846. X        if (otmp = uarmg) {
  1847. X+            if (donning(otmp)) cancel_don();
  1848. X             /* Drop weapon along with gloves */
  1849. X             You("drop your gloves%s!", uwep ? " and weapon" : "");
  1850. X+            drop_weapon(0);
  1851. X             (void) Gloves_off();
  1852. X             dropx(otmp);
  1853. X        }
  1854. X        if (otmp = uarms) {
  1855. X             You("can no longer hold your shield!");
  1856. X***************
  1857. X*** 360,370 ****
  1858. X--- 386,398 ----
  1859. X             dropx(otmp);
  1860. X        }
  1861. X        if (otmp = uarmh) {
  1862. X+            if (donning(otmp)) cancel_don();
  1863. X             Your("helmet falls to the floor!");
  1864. X             (void) Helmet_off();
  1865. X             dropx(otmp);
  1866. X        }
  1867. X        if (otmp = uarmf) {
  1868. X+            if (donning(otmp)) cancel_don();
  1869. X             Your("boots %s off your feet!",
  1870. X              verysmall(uasmon) ? "slide" : "are pushed");
  1871. X             (void) Boots_off();
  1872. X***************
  1873. X*** 403,415 ****
  1874. X      u.umonnum = -1;
  1875. X      skinback();
  1876. X      set_uasmon();
  1877. X!     You("return to %sn form!",(pl_character[0]=='E')?"elve":"huma");
  1878. X  
  1879. X      if (u.uhp < 1)    done(DIED);
  1880. X      if (!Fire_resistance && Inhell) {
  1881. X          You("burn to a crisp.");
  1882. X!         killer = "dissipating polymorph spell";
  1883. X!         done(BURNING);
  1884. X      }
  1885. X      if (!uarmg) selftouch("No longer petrify-resistant, you");
  1886. X      if (sticky) uunstick();
  1887. X--- 431,447 ----
  1888. X      u.umonnum = -1;
  1889. X      skinback();
  1890. X      set_uasmon();
  1891. X!     You("return to %sn form!", (pl_character[0] == 'E')? "elve" : "huma");
  1892. X  
  1893. X      if (u.uhp < 1)    done(DIED);
  1894. X      if (!Fire_resistance && Inhell) {
  1895. X          You("burn to a crisp.");
  1896. X!         killer_format = KILLED_BY;
  1897. X!         killer = "losing fire resistance after rehumanization";
  1898. X!         while(1) {
  1899. X!         done(BURNING);
  1900. X!         You("continue burning.");
  1901. X!         }
  1902. X      }
  1903. X      if (!uarmg) selftouch("No longer petrify-resistant, you");
  1904. X      if (sticky) uunstick();
  1905. X***************
  1906. X*** 470,478 ****
  1907. X      }
  1908. X      if (u.uswallow) {
  1909. X          You("release web fluid inside %s.", mon_nam(u.ustuck));
  1910. X!         pline("%s regurgitates you!", Monnam(u.ustuck));
  1911. X!         regurgitates(u.ustuck);
  1912. X!         return(1);
  1913. X      }
  1914. X      if (u.utrap) {
  1915. X          You("cannot spin webs while stuck in a trap.");
  1916. X--- 502,541 ----
  1917. X      }
  1918. X      if (u.uswallow) {
  1919. X          You("release web fluid inside %s.", mon_nam(u.ustuck));
  1920. X!         if (is_animal(u.ustuck->data)) {
  1921. X!             expels(u.ustuck, u.ustuck->data, TRUE);
  1922. X!             return(0);
  1923. X!         }
  1924. X!         if (is_whirly(u.ustuck->data)) {
  1925. X!             int i;
  1926. X! 
  1927. X!             for (i = 0; i < NATTK; i++)
  1928. X!                 if (u.ustuck->data->mattk[i].aatyp == AT_ENGL)
  1929. X!                     break;
  1930. X!             if (i == NATTK)
  1931. X!                    impossible("Swallower has no engulfing attack?");
  1932. X!             else {
  1933. X!                 char sweep[30];
  1934. X! 
  1935. X!                 sweep[0] = '\0';
  1936. X!                 switch(u.ustuck->data->mattk[i].adtyp) {
  1937. X!                     case AD_FIRE:
  1938. X!                         Strcpy(sweep, "ignites and ");
  1939. X!                         break;
  1940. X!                     case AD_ELEC:
  1941. X!                         Strcpy(sweep, "fries and ");
  1942. X!                         break;
  1943. X!                     case AD_COLD:
  1944. X!                         Strcpy(sweep,
  1945. X!                               "freezes, shatters and ");
  1946. X!                         break;
  1947. X!                 }
  1948. X!                 pline("The web %sis swept away!", sweep);
  1949. X!             }
  1950. X!             return(0);
  1951. X!         }             /* default: a nasty jelly-like creature */ 
  1952. X!         pline("The web dissolves into %s.", mon_nam(u.ustuck));
  1953. X!         return(0);
  1954. X      }
  1955. X      if (u.utrap) {
  1956. X          You("cannot spin webs while stuck in a trap.");
  1957. X***************
  1958. X*** 495,501 ****
  1959. X              Your("webbing vanishes!");
  1960. X              return(0);
  1961. X          case TRAPDOOR: if (!is_maze_lev) {
  1962. X!                 You("web over the trapdoor.");
  1963. X                  deltrap(ttmp);
  1964. X                  if (Invisible) newsym(u.ux, u.uy);
  1965. X                  return 1;
  1966. X--- 558,564 ----
  1967. X              Your("webbing vanishes!");
  1968. X              return(0);
  1969. X          case TRAPDOOR: if (!is_maze_lev) {
  1970. X!                 You("web over the trap door.");
  1971. X                  deltrap(ttmp);
  1972. X                  if (Invisible) newsym(u.ux, u.uy);
  1973. X                  return 1;
  1974. X***************
  1975. X*** 516,522 ****
  1976. X              dotrap(ttmp);
  1977. X              return(1);
  1978. X          default:
  1979. X!             impossible("Webbing over trap type %d?",ttmp->ttyp);
  1980. X              return(0);
  1981. X      }
  1982. X      ttmp = maketrap(u.ux, u.uy, WEB);
  1983. X--- 579,585 ----
  1984. X              dotrap(ttmp);
  1985. X              return(1);
  1986. X          default:
  1987. X!             impossible("Webbing over trap type %d?", ttmp->ttyp);
  1988. X              return(0);
  1989. X      }
  1990. X      ttmp = maketrap(u.ux, u.uy, WEB);
  1991. X***************
  1992. X*** 554,560 ****
  1993. X          else if (mtmp->mimic)
  1994. X              continue;
  1995. X          else if (flags.safe_dog && !Confusion && !Hallucination
  1996. X-           && (mtmp->data->mlet == S_DOG || mtmp->data->mlet == S_FELINE)
  1997. X            && mtmp->mtame) {
  1998. X              if (mtmp->mnamelth)
  1999. X              You("avoid gazing at %s.", NAME(mtmp));
  2000. X--- 617,622 ----
  2001. X***************
  2002. X*** 564,576 ****
  2003. X          } else {
  2004. X              if (flags.confirm && mtmp->mpeaceful && !Confusion
  2005. X                              && !Hallucination) {
  2006. X              pline("Really confuse %s? ", mon_nam(mtmp));
  2007. X              (void) fflush(stdout);
  2008. X              if (yn() != 'y') continue;
  2009. X              setmangry(mtmp);
  2010. X              }
  2011. X!             if (mtmp->mfroz || mtmp->mstun || mtmp->msleep ||
  2012. X!                             mtmp->mblinded)
  2013. X              continue;
  2014. X              if (!mtmp->mconf)
  2015. X              Your("gaze confuses %s!", mon_nam(mtmp));
  2016. X--- 626,645 ----
  2017. X          } else {
  2018. X              if (flags.confirm && mtmp->mpeaceful && !Confusion
  2019. X                              && !Hallucination) {
  2020. X+ #ifdef MACOS
  2021. X+             char mac_tbuf[80];
  2022. X+             if(!flags.silent) SysBeep(1);
  2023. X+             sprintf(mac_tbuf, "Really confuse %s?", mon_nam(mtmp));
  2024. X+             if(UseMacAlertText(128, mac_tbuf) != 1) continue;
  2025. X+ #else
  2026. X              pline("Really confuse %s? ", mon_nam(mtmp));
  2027. X              (void) fflush(stdout);
  2028. X              if (yn() != 'y') continue;
  2029. X+ #endif
  2030. X              setmangry(mtmp);
  2031. X              }
  2032. X!             if (!mtmp->mcanmove || mtmp->mstun || mtmp->msleep ||
  2033. X!                             !mtmp->mcansee)
  2034. X              continue;
  2035. X              if (!mtmp->mconf)
  2036. X              Your("gaze confuses %s!", mon_nam(mtmp));
  2037. X***************
  2038. X*** 588,594 ****
  2039. X              }
  2040. X  #ifdef MEDUSA
  2041. X              if ((mtmp->data==&mons[PM_MEDUSA]) && !mtmp->mcan) {
  2042. X!             pline("Gazing at an awake medusa is not a very good idea...");
  2043. X              /* as if gazing at a sleeping anything is fruitful... */
  2044. X              You("turn to stone...");
  2045. X              done(STONING);
  2046. X--- 657,663 ----
  2047. X              }
  2048. X  #ifdef MEDUSA
  2049. X              if ((mtmp->data==&mons[PM_MEDUSA]) && !mtmp->mcan) {
  2050. X!             pline("Gazing at the awake Medusa is not a very good idea.");
  2051. X              /* as if gazing at a sleeping anything is fruitful... */
  2052. X              You("turn to stone...");
  2053. X              done(STONING);
  2054. X***************
  2055. X*** 605,611 ****
  2056. X  dohide()
  2057. X  {
  2058. X      if (u.uundetected || u.usym == S_MIMIC_DEF) {
  2059. X!         pline("You are already hiding.");
  2060. X          return(0);
  2061. X      }
  2062. X      if (u.usym == S_MIMIC) {
  2063. X--- 674,680 ----
  2064. X  dohide()
  2065. X  {
  2066. X      if (u.uundetected || u.usym == S_MIMIC_DEF) {
  2067. X!         You("are already hiding.");
  2068. X          return(0);
  2069. X      }
  2070. X      if (u.usym == S_MIMIC) {
  2071. X***************
  2072. X*** 621,627 ****
  2073. X  static void
  2074. X  uunstick()
  2075. X  {
  2076. X!     kludge("%s is no longer in your clutches...", Monnam(u.ustuck));
  2077. X      u.ustuck = 0;
  2078. X  }
  2079. X  
  2080. X--- 690,696 ----
  2081. X  static void
  2082. X  uunstick()
  2083. X  {
  2084. X!     kludge("%s is no longer in your clutches.", Monnam(u.ustuck));
  2085. X      u.ustuck = 0;
  2086. X  }
  2087. X  
  2088. X***************
  2089. X*** 636,642 ****
  2090. X  }
  2091. X  #endif
  2092. X  
  2093. X! char *
  2094. X  body_part(part)
  2095. X  int part;
  2096. X  {
  2097. X--- 705,711 ----
  2098. X  }
  2099. X  #endif
  2100. X  
  2101. X! const char *
  2102. X  body_part(part)
  2103. X  int part;
  2104. X  {
  2105. X***************
  2106. X*** 646,678 ****
  2107. X       */
  2108. X      static const char *humanoid_parts[] = { "arm", "eye", "face", "finger",
  2109. X          "fingertip", "foot", "hand", "handed", "head", "leg",
  2110. X!         "light headed", "neck", "toe" };
  2111. X  #ifdef POLYSELF
  2112. X      static const char *jelly_parts[] = { "pseudopod", "dark spot", "front",
  2113. X          "pseudopod extension", "pseudopod extremity",
  2114. X          "pseudopod root", "grasp", "grasped", "cerebral area",
  2115. X!         "lower pseudopod", "viscous", "middle",
  2116. X          "pseudopod extremity" },
  2117. X      *animal_parts[] = { "forelimb", "eye", "face", "foreclaw", "claw tip",
  2118. X          "rear claw", "foreclaw", "clawed", "head", "rear limb",
  2119. X!         "light headed", "neck", "rear claw tip" },
  2120. X      *horse_parts[] = { "forelimb", "eye", "face", "forehoof", "hoof tip",
  2121. X          "rear hoof", "foreclaw", "hooved", "head", "rear limb",
  2122. X!         "light headed", "neck", "rear hoof tip" },
  2123. X      *sphere_parts[] = { "appendage", "optic nerve", "body", "tentacle",
  2124. X          "tentacle tip", "lower appendage", "tentacle", "tentacled",
  2125. X!         "body", "lower tentacle", "rotational", "equator",
  2126. X          "lower tentacle tip" },
  2127. X      *fungus_parts[] = { "mycelium", "visual area", "front", "hypha",
  2128. X          "hypha", "root", "strand", "stranded", "cap area",
  2129. X!         "rhizome", "sporulated", "stalk", "rhizome tip" },
  2130. X      *vortex_parts[] = { "region", "eye", "front", "minor current",
  2131. X          "minor current", "lower current", "swirl", "swirled",
  2132. X          "central core", "lower current", "addled", "center",
  2133. X!         "edge" },
  2134. X      *snake_parts[] = { "vestigial limb", "eye", "face", "large scale",
  2135. X          "large scale tip", "rear region", "scale gap", "scale gapped",
  2136. X!         "head", "rear region", "light headed", "neck", "rear scale" };
  2137. X      
  2138. X      if (humanoid(uasmon) || (u.usym==S_CENTAUR && 
  2139. X          (part==ARM || part==FINGER || part==FINGERTIP
  2140. X--- 715,748 ----
  2141. X       */
  2142. X      static const char *humanoid_parts[] = { "arm", "eye", "face", "finger",
  2143. X          "fingertip", "foot", "hand", "handed", "head", "leg",
  2144. X!                 "light headed", "neck", "spine", "toe" };
  2145. X  #ifdef POLYSELF
  2146. X      static const char *jelly_parts[] = { "pseudopod", "dark spot", "front",
  2147. X          "pseudopod extension", "pseudopod extremity",
  2148. X          "pseudopod root", "grasp", "grasped", "cerebral area",
  2149. X!         "lower pseudopod", "viscous", "middle", "surface",
  2150. X          "pseudopod extremity" },
  2151. X      *animal_parts[] = { "forelimb", "eye", "face", "foreclaw", "claw tip",
  2152. X          "rear claw", "foreclaw", "clawed", "head", "rear limb",
  2153. X!         "light headed", "neck", "spine", "rear claw tip" },
  2154. X      *horse_parts[] = { "forelimb", "eye", "face", "forehoof", "hoof tip",
  2155. X          "rear hoof", "foreclaw", "hooved", "head", "rear limb",
  2156. X!         "light headed", "neck", "backbone", "rear hoof tip" },
  2157. X      *sphere_parts[] = { "appendage", "optic nerve", "body", "tentacle",
  2158. X          "tentacle tip", "lower appendage", "tentacle", "tentacled",
  2159. X!         "body", "lower tentacle", "rotational", "equator", "body",
  2160. X          "lower tentacle tip" },
  2161. X      *fungus_parts[] = { "mycelium", "visual area", "front", "hypha",
  2162. X          "hypha", "root", "strand", "stranded", "cap area",
  2163. X!         "rhizome", "sporulated", "stalk", "root", "rhizome tip" },
  2164. X      *vortex_parts[] = { "region", "eye", "front", "minor current",
  2165. X          "minor current", "lower current", "swirl", "swirled",
  2166. X          "central core", "lower current", "addled", "center",
  2167. X!         "currents", "edge" },
  2168. X      *snake_parts[] = { "vestigial limb", "eye", "face", "large scale",
  2169. X          "large scale tip", "rear region", "scale gap", "scale gapped",
  2170. X!         "head", "rear region", "light headed", "neck", "length",
  2171. X!         "rear scale" };
  2172. X      
  2173. X      if (humanoid(uasmon) || (u.usym==S_CENTAUR && 
  2174. X          (part==ARM || part==FINGER || part==FINGERTIP
  2175. X***************
  2176. X*** 681,687 ****
  2177. X      if (u.usym==S_SNAKE || u.usym==S_NAGA || u.usym==S_WORM)
  2178. X          return snake_parts[part];
  2179. X      if (u.usym==S_EYE) return sphere_parts[part];
  2180. X!     if (u.usym==S_JELLY || u.usym==S_PUDDING) return jelly_parts[part];
  2181. X      if (u.usym==S_VORTEX || u.usym==S_ELEMENTAL) return vortex_parts[part];
  2182. X      if (u.usym==S_FUNGUS) return fungus_parts[part];
  2183. X      return animal_parts[part];
  2184. X--- 751,758 ----
  2185. X      if (u.usym==S_SNAKE || u.usym==S_NAGA || u.usym==S_WORM)
  2186. X          return snake_parts[part];
  2187. X      if (u.usym==S_EYE) return sphere_parts[part];
  2188. X!     if (u.usym==S_JELLY || u.usym==S_PUDDING || u.usym==S_BLOB)
  2189. X!         return jelly_parts[part];
  2190. X      if (u.usym==S_VORTEX || u.usym==S_ELEMENTAL) return vortex_parts[part];
  2191. X      if (u.usym==S_FUNGUS) return fungus_parts[part];
  2192. X      return animal_parts[part];
  2193. X***************
  2194. X*** 690,695 ****
  2195. X--- 761,769 ----
  2196. X  #endif
  2197. X  }
  2198. X  
  2199. X+ #endif /* OVLB */
  2200. X+ #ifdef OVL0
  2201. X+ 
  2202. X  int
  2203. X  poly_gender()
  2204. X  {
  2205. X***************
  2206. X*** 709,725 ****
  2207. X   *      or "lady" when polymorphed)
  2208. X   */
  2209. X  #ifdef POLYSELF
  2210. X!     if (uasmon->mflags1 & M1_FEM) return 1;
  2211. X! #ifdef INFERNO
  2212. X!     if (u.umonnum==PM_INCUBUS) return 0;
  2213. X! #endif
  2214. X      if (!humanoid(uasmon)) return 2;
  2215. X  #endif
  2216. X      return flags.female;
  2217. X  }
  2218. X  
  2219. X! #ifdef POLYSELF
  2220. X! #ifdef GOLEMS
  2221. X  void
  2222. X  ugolemeffects(damtype, dam)
  2223. X  int damtype, dam;
  2224. X--- 783,801 ----
  2225. X   *      or "lady" when polymorphed)
  2226. X   */
  2227. X  #ifdef POLYSELF
  2228. X!     if (uasmon->mflags2 & M2_FEM) return 1;
  2229. X! # ifdef INFERNO
  2230. X!     if (u.umonnum == PM_INCUBUS) return 0;
  2231. X! # endif
  2232. X      if (!humanoid(uasmon)) return 2;
  2233. X  #endif
  2234. X      return flags.female;
  2235. X  }
  2236. X  
  2237. X! #endif /* OVL0 */
  2238. X! #ifdef OVLB
  2239. X! 
  2240. X! #if defined(POLYSELF) && defined(GOLEMS)
  2241. X  void
  2242. X  ugolemeffects(damtype, dam)
  2243. X  int damtype, dam;
  2244. X***************
  2245. X*** 746,750 ****
  2246. X          pline("Strangely, you feel better than before.");
  2247. X      }
  2248. X  }
  2249. X! #endif /* GOLEMS */
  2250. X! #endif
  2251. X--- 822,827 ----
  2252. X          pline("Strangely, you feel better than before.");
  2253. X      }
  2254. X  }
  2255. X! #endif /* POLYSELF && GOLEMS */
  2256. X! 
  2257. X! #endif /* OVLB */
  2258. X
  2259. END_OF_FILE
  2260. if test 56505 -ne `wc -c <'patch7.05'`; then
  2261.     echo shar: \"'patch7.05'\" unpacked with wrong size!
  2262. fi
  2263. # end of 'patch7.05'
  2264. echo shar: End of archive 6 \(of 30\).
  2265. cp /dev/null ark6isdone
  2266. MISSING=""
  2267. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ; do
  2268.     if test ! -f ark${I}isdone ; then
  2269.     MISSING="${MISSING} ${I}"
  2270.     fi
  2271. done
  2272. if test "${MISSING}" = "" ; then
  2273.     echo You have unpacked all 30 archives.
  2274.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2275. else
  2276.     echo You still need to unpack the following archives:
  2277.     echo "        " ${MISSING}
  2278. fi
  2279. ##  End of shell archive.
  2280. exit 0
  2281.