home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / volume16 / nethck31 / patch1e < prev    next >
Encoding:
Text File  |  1993-03-04  |  57.7 KB  |  1,710 lines

  1. Subject:  v17i046:  nethack31 - display oriented dungeons & dragons (Ver. 3.1), Patch1e/31
  2. Newsgroups: comp.sources.games
  3. Approved: billr@saab.CNA.TEK.COM
  4.  
  5. Submitted-by: izchak@linc.cis.upenn.edu (Izchak Miller)
  6. Posting-number: Volume 17, Issue 46
  7. Archive-name: nethack31/Patch1e
  8. Patch-To: nethack31: Volume 16, Issue 
  9. Environment: Amiga, Atari, Mac, MS-DOS, Windows-NT, OS2, Unix, VMS, X11
  10.  
  11.  
  12.  
  13. #! /bin/sh
  14. # This is a shell archive.  Remove anything before this line, then unpack
  15. # it by saving it into a file and typing "sh file".  To overwrite existing
  16. # files, type "sh file -c".  You can also feed this as standard input via
  17. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  18. # will see the following message at the end:
  19. #        "End of archive 5 (of 31)."
  20. # Contents:  patches01j
  21. # Wrapped by billr@saab on Fri Mar  5 10:50:42 1993
  22. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  23. if test -f 'patches01j' -a "${1}" != "-c" ; then 
  24.   echo shar: Renaming existing file \"'patches01j'\" to \"'patches01j.orig'\"
  25.   mv -f 'patches01j' 'patches01j.orig'
  26. fi
  27. echo shar: Extracting \"'patches01j'\" \(55621 characters\)
  28. sed "s/^X//" >'patches01j' <<'END_OF_FILE'
  29. X*** /tmp/da08710    Thu Feb 25 10:25:56 1993
  30. X--- src/weapon.c    Sun Feb 21 16:29:12 1993
  31. X***************
  32. X*** 1,4 ****
  33. X! /*    SCCS Id: @(#)weapon.c    3.1    93/01/15    */
  34. X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  35. X  /* NetHack may be freely redistributed.  See license for details. */
  36. X  
  37. X--- 1,4 ----
  38. X! /*    SCCS Id: @(#)weapon.c    3.1    93/02/09    */
  39. X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  40. X  /* NetHack may be freely redistributed.  See license for details. */
  41. X  
  42. X***************
  43. X*** 11,17 ****
  44. X  
  45. X  #ifdef OVLB
  46. X  
  47. X! static const char NEARDATA kebabable[] = { S_XORN, S_DRAGON, S_NAGA, S_GIANT, 0 };
  48. X  
  49. X  /*
  50. X   *    hitval returns an integer representing the "to hit" bonuses
  51. X--- 11,17 ----
  52. X  
  53. X  #ifdef OVLB
  54. X  
  55. X! static NEARDATA const char kebabable[] = { S_XORN, S_DRAGON, S_NAGA, S_GIANT, 0 };
  56. X  
  57. X  /*
  58. X   *    hitval returns an integer representing the "to hit" bonuses
  59. X***************
  60. X*** 168,180 ****
  61. X      struct obj *otmp;
  62. X  
  63. X      for(otmp=mtmp->minvent; otmp; otmp = otmp->nobj) {
  64. X!         if (otmp->otyp == x && touch_artifact(otmp,mtmp))
  65. X              return otmp;
  66. X      }
  67. X      return (struct obj *)0;
  68. X  }
  69. X  
  70. X! static const int NEARDATA rwep[] =
  71. X      { DWARVISH_SPEAR, ELVEN_SPEAR, SPEAR, ORCISH_SPEAR, JAVELIN,
  72. X        SHURIKEN, SILVER_ARROW, ELVEN_ARROW, ARROW, ORCISH_ARROW,
  73. X        CROSSBOW_BOLT, ELVEN_DAGGER, DAGGER, ORCISH_DAGGER, KNIFE, ROCK,
  74. X--- 168,184 ----
  75. X      struct obj *otmp;
  76. X  
  77. X      for(otmp=mtmp->minvent; otmp; otmp = otmp->nobj) {
  78. X!         if (otmp->otyp == x && touch_artifact(otmp,mtmp)
  79. X! #ifdef MUSE
  80. X!              && !(x == CORPSE && otmp->corpsenm != PM_COCKATRICE)
  81. X! #endif
  82. X!                                     )
  83. X              return otmp;
  84. X      }
  85. X      return (struct obj *)0;
  86. X  }
  87. X  
  88. X! static NEARDATA const int rwep[] =
  89. X      { DWARVISH_SPEAR, ELVEN_SPEAR, SPEAR, ORCISH_SPEAR, JAVELIN,
  90. X        SHURIKEN, SILVER_ARROW, ELVEN_ARROW, ARROW, ORCISH_ARROW,
  91. X        CROSSBOW_BOLT, ELVEN_DAGGER, DAGGER, ORCISH_DAGGER, KNIFE, ROCK,
  92. X***************
  93. X*** 269,275 ****
  94. X  }
  95. X  
  96. X  /* 0 = used by any monster; 1 = only used by strong monsters */
  97. X! static const struct hwep { short otyp, big; } NEARDATA hwep[] = {
  98. X        {TSURUGI,1}, {RUNESWORD,0},
  99. X        {DWARVISH_MATTOCK,1}, {TWO_HANDED_SWORD,1}, {BATTLE_AXE,1},
  100. X        {KATANA,0}, {UNICORN_HORN,1}, {CRYSKNIFE,0},
  101. X--- 273,282 ----
  102. X  }
  103. X  
  104. X  /* 0 = used by any monster; 1 = only used by strong monsters */
  105. X! static NEARDATA const struct hwep { short otyp, big; } hwep[] = {
  106. X! #ifdef MUSE
  107. X!       {CORPSE,0},  /* cockatrice corpse */
  108. X! #endif
  109. X        {TSURUGI,1}, {RUNESWORD,0},
  110. X        {DWARVISH_MATTOCK,1}, {TWO_HANDED_SWORD,1}, {BATTLE_AXE,1},
  111. X        {KATANA,0}, {UNICORN_HORN,1}, {CRYSKNIFE,0},
  112. X***************
  113. X*** 306,312 ****
  114. X      for (i = 0, hw = hwep; i < SIZE(hwep); i++, hw++)
  115. X          if ((strong || !hw->big) &&
  116. X  #ifdef MUSE
  117. X!           (!objects[hw->otyp].oc_bimanual || !which_armor(mtmp, W_ARMS)) &&
  118. X  #endif
  119. X      (objects[hw->otyp].oc_material != SILVER || !hates_silver(mtmp->data)))
  120. X          Oselect(hw->otyp);
  121. X--- 313,320 ----
  122. X      for (i = 0, hw = hwep; i < SIZE(hwep); i++, hw++)
  123. X          if ((strong || !hw->big) &&
  124. X  #ifdef MUSE
  125. X!           (!objects[hw->otyp].oc_bimanual ||
  126. X!                     (mtmp->misc_worn_check & W_ARMS)) &&
  127. X  #endif
  128. X      (objects[hw->otyp].oc_material != SILVER || !hates_silver(mtmp->data)))
  129. X          Oselect(hw->otyp);
  130. X***************
  131. X*** 366,371 ****
  132. X--- 374,381 ----
  133. X       * be handled by waiting until mon_wield_item is actually called.
  134. X       * Though the monster still wields the wrong weapon until then,
  135. X       * this is OK since the player can't see it.
  136. X+      * Note that if there is no change, setting the check to NEED_WEAPON
  137. X+      * is harmless.
  138. X       * Possible problem: big monster with big cursed weapon gets
  139. X       * polymorphed into little monster.  But it's not quite clear how to
  140. X       * handle this anyway....
  141. X***************
  142. X*** 412,442 ****
  143. X           * can know it's cursed and needn't even bother trying.
  144. X           * Still....
  145. X           */
  146. X!         if (mw_tmp && mw_tmp->cursed) {
  147. X!             if (obj->otyp == PICK_AXE) {
  148. X!             if (canseemon(mon)) {
  149. X                  pline("Since %s weapon %s welded to %s hand,",
  150. X!                 s_suffix(mon_nam(mon)),
  151. X!                 (mw_tmp->quan == 1L) ? "is" : "are",
  152. X!                 humanoid(mon->data)
  153. X!                     ? (mon->female ? "her" : "his")
  154. X!                     : "its");
  155. X                  pline("%s cannot wield that %s.",
  156. X                  mon_nam(mon), xname(obj));
  157. X!                 mw_tmp->bknown = 1;
  158. X!             }
  159. X!             } else {
  160. X!             if (canseemon(mon)) {
  161. X                  pline("%s tries to wield %s.", Monnam(mon),
  162. X                  doname(obj));
  163. X                  pline("%s %s %s welded to %s hand!",
  164. X!                 s_suffix(Monnam(mon)), xname(mw_tmp),
  165. X!                 (mw_tmp->quan == 1L) ? "is" : "are",
  166. X!                 humanoid(mon->data)
  167. X!                     ? (mon->female ? "her" : "his")
  168. X!                     : "its");
  169. X!                 mw_tmp->bknown = 1;
  170. X              }
  171. X              }
  172. X              mon->weapon_check = NO_WEAPON_WANTED;
  173. X              return 1;
  174. X--- 422,445 ----
  175. X           * can know it's cursed and needn't even bother trying.
  176. X           * Still....
  177. X           */
  178. X!         if (mw_tmp && mw_tmp->cursed && mw_tmp->otyp != CORPSE) {
  179. X!             if (canseemon(mon)) {
  180. X!             if (obj->otyp == PICK_AXE) {
  181. X                  pline("Since %s weapon %s welded to %s hand,",
  182. X!                   s_suffix(mon_nam(mon)),
  183. X!                   (mw_tmp->quan == 1L) ? "is" : "are",
  184. X!                   his[pronoun_gender(mon)]);
  185. X                  pline("%s cannot wield that %s.",
  186. X                  mon_nam(mon), xname(obj));
  187. X!             } else {
  188. X                  pline("%s tries to wield %s.", Monnam(mon),
  189. X                  doname(obj));
  190. X                  pline("%s %s %s welded to %s hand!",
  191. X!                   s_suffix(Monnam(mon)), xname(mw_tmp),
  192. X!                   (mw_tmp->quan == 1L) ? "is" : "are",
  193. X!                   his[pronoun_gender(mon)]);
  194. X              }
  195. X+             mw_tmp->bknown = 1;
  196. X              }
  197. X              mon->weapon_check = NO_WEAPON_WANTED;
  198. X              return 1;
  199. X***************
  200. X*** 445,451 ****
  201. X          mon->weapon_check = NEED_WEAPON;
  202. X          if (canseemon(mon)) {
  203. X              pline("%s wields %s!", Monnam(mon), doname(obj));
  204. X!             if (obj->cursed) {
  205. X                  pline("%s %s to %s hand!",
  206. X                      The(xname(obj)),
  207. X                      (obj->quan == 1L) ? "welds itself"
  208. X--- 448,454 ----
  209. X          mon->weapon_check = NEED_WEAPON;
  210. X          if (canseemon(mon)) {
  211. X              pline("%s wields %s!", Monnam(mon), doname(obj));
  212. X!             if (obj->cursed && obj->otyp != CORPSE) {
  213. X                  pline("%s %s to %s hand!",
  214. X                      The(xname(obj)),
  215. X                      (obj->quan == 1L) ? "welds itself"
  216. X*** /tmp/da08726    Thu Feb 25 10:26:00 1993
  217. X--- src/wield.c    Fri Feb 12 10:27:03 1993
  218. X***************
  219. X*** 41,47 ****
  220. X      }
  221. X  }
  222. X  
  223. X! static const char NEARDATA wield_objs[] =
  224. X      { ALL_CLASSES, ALLOW_NONE, WEAPON_CLASS, TOOL_CLASS, 0 };
  225. X  
  226. X  int
  227. X--- 41,47 ----
  228. X      }
  229. X  }
  230. X  
  231. X! static NEARDATA const char wield_objs[] =
  232. X      { ALL_CLASSES, ALLOW_NONE, WEAPON_CLASS, TOOL_CLASS, 0 };
  233. X  
  234. X  int
  235. X*** /tmp/da08734    Thu Feb 25 10:26:03 1993
  236. X--- src/windows.c    Fri Feb 12 10:25:21 1993
  237. X***************
  238. X*** 19,25 ****
  239. X  extern struct window_procs amii_procs ;
  240. X  #endif
  241. X  
  242. X! struct window_procs NEARDATA windowprocs;
  243. X  
  244. X  static
  245. X  struct win_choices {
  246. X--- 19,25 ----
  247. X  extern struct window_procs amii_procs ;
  248. X  #endif
  249. X  
  250. X! NEARDATA struct window_procs windowprocs;
  251. X  
  252. X  static
  253. X  struct win_choices {
  254. X***************
  255. X*** 41,47 ****
  256. X--- 41,55 ----
  257. X      { 0, 0 }        /* must be last */
  258. X  };
  259. X  
  260. X+ static
  261. X  void
  262. X+ def_raw_print(s)
  263. X+ const char *s;
  264. X+ {
  265. X+     puts(s);
  266. X+ }
  267. X+ 
  268. X+ void
  269. X  choose_windows(s)
  270. X  const char *s;
  271. X  {
  272. X***************
  273. X*** 54,62 ****
  274. X--- 62,76 ----
  275. X          return;
  276. X      }
  277. X  
  278. X+     if (!windowprocs.win_raw_print)
  279. X+     windowprocs.win_raw_print = def_raw_print;
  280. X+ 
  281. X      raw_printf("Window type %s not recognized.  Choices are:", s);
  282. X      for(i=0; winchoices[i].procs; i++)
  283. X      raw_printf("        %s", winchoices[i].procs->name);
  284. X+ 
  285. X+     if (windowprocs.win_raw_print == def_raw_print)
  286. X+     terminate(0);
  287. X  }
  288. X  
  289. X  /*windows.c*/
  290. X*** /tmp/da08742    Thu Feb 25 10:26:05 1993
  291. X--- src/wizard.c    Mon Feb 22 12:24:19 1993
  292. X***************
  293. X*** 23,29 ****
  294. X  static long FDECL(strategy, (struct monst *));
  295. X  
  296. X  /*    TODO:    Expand this list.    */
  297. X! static const int NEARDATA nasties[] = {
  298. X      PM_COCKATRICE, PM_ETTIN, PM_STALKER, PM_MINOTAUR, PM_RED_DRAGON,
  299. X      PM_GREEN_DRAGON, PM_OWLBEAR, PM_PURPLE_WORM, PM_ROCK_TROLL, PM_XAN,
  300. X      PM_GREMLIN, PM_UMBER_HULK, PM_VAMPIRE_LORD, PM_XORN, PM_ZRUTY,
  301. X--- 23,29 ----
  302. X  static long FDECL(strategy, (struct monst *));
  303. X  
  304. X  /*    TODO:    Expand this list.    */
  305. X! static NEARDATA const int nasties[] = {
  306. X      PM_COCKATRICE, PM_ETTIN, PM_STALKER, PM_MINOTAUR, PM_RED_DRAGON,
  307. X      PM_GREEN_DRAGON, PM_OWLBEAR, PM_PURPLE_WORM, PM_ROCK_TROLL, PM_XAN,
  308. X      PM_GREMLIN, PM_UMBER_HULK, PM_VAMPIRE_LORD, PM_XORN, PM_ZRUTY,
  309. X***************
  310. X*** 34,40 ****
  311. X  #endif
  312. X      };
  313. X  
  314. X! static const unsigned NEARDATA wizapp[] = {
  315. X      PM_HUMAN, PM_WATER_DEMON, PM_VAMPIRE,
  316. X      PM_RED_DRAGON, PM_TROLL, PM_UMBER_HULK,
  317. X      PM_XORN, PM_XAN, PM_COCKATRICE,
  318. X--- 34,40 ----
  319. X  #endif
  320. X      };
  321. X  
  322. X! static NEARDATA const unsigned wizapp[] = {
  323. X      PM_HUMAN, PM_WATER_DEMON, PM_VAMPIRE,
  324. X      PM_RED_DRAGON, PM_TROLL, PM_UMBER_HULK,
  325. X      PM_XORN, PM_XAN, PM_COCKATRICE,
  326. X***************
  327. X*** 421,428 ****
  328. X              set_malign(mtmp);
  329. X          } else /* GENOD? */
  330. X              mtmp = makemon((struct permonst *)0, u.ux, u.uy);
  331. X!         if(mtmp->data->maligntyp == 0 ||
  332. X!            sgn(mtmp->data->maligntyp) == sgn(castalign))
  333. X              break;
  334. X          }
  335. X      }
  336. X--- 421,428 ----
  337. X              set_malign(mtmp);
  338. X          } else /* GENOD? */
  339. X              mtmp = makemon((struct permonst *)0, u.ux, u.uy);
  340. X!         if(mtmp && (mtmp->data->maligntyp == 0 ||
  341. X!                     sgn(mtmp->data->maligntyp) == sgn(castalign)) )
  342. X              break;
  343. X          }
  344. X      }
  345. X*** /tmp/da08750    Thu Feb 25 10:26:07 1993
  346. X--- src/worm.c    Thu Feb 18 17:38:13 1993
  347. X***************
  348. X*** 322,328 ****
  349. X      int wnum = worm->wormno;
  350. X      int cut_chance, new_wnum;
  351. X  
  352. X! /*  if (!wnum) return; /* bullet proofing */
  353. X  
  354. X      if (x == worm->mx && y == worm->my) return;        /* hit on head */
  355. X  
  356. X--- 322,328 ----
  357. X      int wnum = worm->wormno;
  358. X      int cut_chance, new_wnum;
  359. X  
  360. X!     if (!wnum) return; /* bullet proofing */
  361. X  
  362. X      if (x == worm->mx && y == worm->my) return;        /* hit on head */
  363. X  
  364. X***************
  365. X*** 370,376 ****
  366. X      if (rn2(3) || !(new_wnum = get_wormno())) {
  367. X      You("cut part of the tail off of %s.", mon_nam(worm));
  368. X      toss_wsegs(new_tail, TRUE);
  369. X!     worm->mhp /= 2;
  370. X      return;
  371. X      }
  372. X  
  373. X--- 370,376 ----
  374. X      if (rn2(3) || !(new_wnum = get_wormno())) {
  375. X      You("cut part of the tail off of %s.", mon_nam(worm));
  376. X      toss_wsegs(new_tail, TRUE);
  377. X!     if (worm->mhp > 1) worm->mhp /= 2;
  378. X      return;
  379. X      }
  380. X  
  381. X*** /tmp/da08758    Thu Feb 25 10:26:09 1993
  382. X--- src/worn.c    Thu Feb 11 14:53:52 1993
  383. X***************
  384. X*** 1,4 ****
  385. X! /*    SCCS Id: @(#)worn.c    3.1    92/12/13
  386. X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  387. X  /* NetHack may be freely redistributed.  See license for details. */
  388. X  
  389. X--- 1,4 ----
  390. X! /*    SCCS Id: @(#)worn.c    3.1    93/02/09
  391. X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  392. X  /* NetHack may be freely redistributed.  See license for details. */
  393. X  
  394. X***************
  395. X*** 104,111 ****
  396. X  
  397. X  /* Wear first object of that type it finds, and never switch unless it
  398. X   * has none at all.  This means that monsters with leather armor never
  399. X!  * switch to plate mail, but it also avoids the overhead of having seven
  400. X!  * struct obj *s for every monster in the game, more if we ever extend this.
  401. X   */
  402. X  void
  403. X  m_dowear(mon, creation)
  404. X--- 104,112 ----
  405. X  
  406. X  /* Wear first object of that type it finds, and never switch unless it
  407. X   * has none at all.  This means that monsters with leather armor never
  408. X!  * switch to plate mail, but it also avoids the overhead of either having 8
  409. X!  * struct obj *s for every monster in the game, or of doing multiple inventory
  410. X!  * searches each round using which_armor().
  411. X   */
  412. X  void
  413. X  m_dowear(mon, creation)
  414. X***************
  415. X*** 124,134 ****
  416. X      for(obj = mon->minvent; obj; obj = obj->nobj) {
  417. X          long flag;
  418. X  
  419. X  # ifdef TOURIST
  420. X!         if (obj->otyp == HAWAIIAN_SHIRT) flag = W_ARMU;
  421. X!         else
  422. X  # endif
  423. X!         if (is_cloak(obj)) flag = W_ARMC;
  424. X          else if (is_helmet(obj)) flag = W_ARMH;
  425. X          else if (is_shield(obj)) {
  426. X              if (MON_WEP(mon) && bimanual(MON_WEP(mon)))
  427. X--- 125,137 ----
  428. X      for(obj = mon->minvent; obj; obj = obj->nobj) {
  429. X          long flag;
  430. X  
  431. X+         if (obj->otyp == AMULET_OF_LIFE_SAVING ||
  432. X+                 obj->otyp == AMULET_OF_REFLECTION)
  433. X+             flag = W_AMUL;
  434. X  # ifdef TOURIST
  435. X!         else if (obj->otyp == HAWAIIAN_SHIRT) flag = W_ARMU;
  436. X  # endif
  437. X!         else if (is_cloak(obj)) flag = W_ARMC;
  438. X          else if (is_helmet(obj)) flag = W_ARMH;
  439. X          else if (is_shield(obj)) {
  440. X              if (MON_WEP(mon) && bimanual(MON_WEP(mon)))
  441. X***************
  442. X*** 201,213 ****
  443. X      register struct obj *otmp;
  444. X      struct permonst *mdat = mon->data;
  445. X      boolean vis = cansee(mon->mx, mon->my);
  446. X!     const char *pronoun, *ppronoun;
  447. X  
  448. X-     switch(gender(mon)) {
  449. X-         case 0: pronoun = "him"; ppronoun = "his"; break;
  450. X-         case 1: pronoun = ppronoun = "her"; break;
  451. X-         default: pronoun = "it"; ppronoun = "its"; break;
  452. X-     }
  453. X      if (breakarm(mdat)) {
  454. X          if (otmp = which_armor(mon, W_ARM)) {
  455. X          if (vis)
  456. X--- 204,212 ----
  457. X      register struct obj *otmp;
  458. X      struct permonst *mdat = mon->data;
  459. X      boolean vis = cansee(mon->mx, mon->my);
  460. X!     const char *pronoun = him[pronoun_gender(mon)],
  461. X!             *ppronoun = his[pronoun_gender(mon)];
  462. X  
  463. X      if (breakarm(mdat)) {
  464. X          if (otmp = which_armor(mon, W_ARM)) {
  465. X          if (vis)
  466. X*** /tmp/da08766    Thu Feb 25 10:26:11 1993
  467. X--- src/write.c    Thu Feb 18 10:58:45 1993
  468. X***************
  469. X*** 62,68 ****
  470. X      return(1000);
  471. X  }
  472. X  
  473. X! static const char NEARDATA write_on[] = { SCROLL_CLASS, SPBOOK_CLASS, 0 };
  474. X  
  475. X  int
  476. X  dowrite(pen)
  477. X--- 62,68 ----
  478. X      return(1000);
  479. X  }
  480. X  
  481. X! static NEARDATA const char write_on[] = { SCROLL_CLASS, SPBOOK_CLASS, 0 };
  482. X  
  483. X  int
  484. X  dowrite(pen)
  485. X***************
  486. X*** 89,95 ****
  487. X      if(!paper)
  488. X          return(0);
  489. X      if(Blind && !paper->dknown) {
  490. X!         You("can't tell if that %s's blank or not!",
  491. X                paper->oclass == SPBOOK_CLASS ? "spellbook" :
  492. X                "scroll");
  493. X          return(1);
  494. X--- 89,95 ----
  495. X      if(!paper)
  496. X          return(0);
  497. X      if(Blind && !paper->dknown) {
  498. X!         You("don't know if that %s is blank or not!",
  499. X                paper->oclass == SPBOOK_CLASS ? "spellbook" :
  500. X                "scroll");
  501. X          return(1);
  502. X***************
  503. X*** 96,104 ****
  504. X      }
  505. X      paper->dknown = 1;
  506. X      if(paper->otyp != SCR_BLANK_PAPER && paper->otyp != SPE_BLANK_PAPER) {
  507. X!         You("fool, that %s's not blank!",
  508. X              paper->oclass == SPBOOK_CLASS ? "spellbook" :
  509. X              "scroll");
  510. X          return(1);
  511. X      }
  512. X  
  513. X--- 96,105 ----
  514. X      }
  515. X      paper->dknown = 1;
  516. X      if(paper->otyp != SCR_BLANK_PAPER && paper->otyp != SPE_BLANK_PAPER) {
  517. X!         pline("That %s is not blank!",
  518. X              paper->oclass == SPBOOK_CLASS ? "spellbook" :
  519. X              "scroll");
  520. X+         exercise(A_WIS, FALSE);
  521. X          return(1);
  522. X      }
  523. X  
  524. X***************
  525. X*** 183,196 ****
  526. X      makeknown(new_obj->otyp);
  527. X  
  528. X      /* success */
  529. X-     new_obj = addinv(new_obj);
  530. X      new_obj->blessed = (curseval > 0);
  531. X      new_obj->cursed = (curseval < 0);
  532. X-     prinv(NULL, new_obj, 1L);
  533. X  #ifdef MAIL
  534. X      if (new_obj->otyp == SCR_MAIL) new_obj->spe = 1;
  535. X  #endif
  536. X!     new_obj->known = 1;
  537. X      return(1);
  538. X  }
  539. X  
  540. X--- 184,198 ----
  541. X      makeknown(new_obj->otyp);
  542. X  
  543. X      /* success */
  544. X      new_obj->blessed = (curseval > 0);
  545. X      new_obj->cursed = (curseval < 0);
  546. X  #ifdef MAIL
  547. X      if (new_obj->otyp == SCR_MAIL) new_obj->spe = 1;
  548. X  #endif
  549. X!     new_obj = hold_another_object(new_obj, "Oops!  %s out of your grasp!",
  550. X!                            The(aobjnam(new_obj, "slip")),
  551. X!                            (const char *)0);
  552. X!     if (new_obj) new_obj->known = 1;
  553. X      return(1);
  554. X  }
  555. X  
  556. X*** /tmp/da08774    Thu Feb 25 10:26:13 1993
  557. X--- src/zap.c    Sun Feb 21 16:06:54 1993
  558. X***************
  559. X*** 11,18 ****
  560. X   */
  561. X  #define MAGIC_COOKIE 1000
  562. X  
  563. X! static boolean NEARDATA obj_zapped;
  564. X! static int NEARDATA poly_zapped;
  565. X  
  566. X  #ifdef MUSE
  567. X  /* kludge to use mondied instead of killed */
  568. X--- 11,18 ----
  569. X   */
  570. X  #define MAGIC_COOKIE 1000
  571. X  
  572. X! static NEARDATA boolean obj_zapped;
  573. X! static NEARDATA int poly_zapped;
  574. X  
  575. X  #ifdef MUSE
  576. X  /* kludge to use mondied instead of killed */
  577. X***************
  578. X*** 21,38 ****
  579. X  
  580. X  static boolean FDECL(obj_resists, (struct obj *));
  581. X  static boolean FDECL(obj_shudders, (struct obj *));
  582. X! static void FDECL(polyuse,(struct obj*, int, int));
  583. X  static void FDECL(do_osshock, (struct obj *));
  584. X  static void FDECL(create_polymon, (struct obj *));
  585. X  static int FDECL(burn_floor_paper,(int,int));
  586. X! static void FDECL(cancel_item,(struct obj *));
  587. X  static int FDECL(bhitm, (struct monst *,struct obj *));
  588. X  #ifndef MUSE
  589. X! STATIC_PTR int FDECL(bhito,(struct obj *,struct obj *));
  590. X  #endif
  591. X! STATIC_PTR int FDECL(bhitpile,(struct obj *,int (*)(OBJ_P,OBJ_P),int,int));
  592. X! static void FDECL(backfire,(struct obj *));
  593. X! static int FDECL(zhit,(struct monst *,int,int));
  594. X  
  595. X  #define ZT_MAGIC_MISSILE    (AD_MAGM-1)
  596. X  #define ZT_FIRE            (AD_FIRE-1)
  597. X--- 21,39 ----
  598. X  
  599. X  static boolean FDECL(obj_resists, (struct obj *));
  600. X  static boolean FDECL(obj_shudders, (struct obj *));
  601. X! static void FDECL(polyuse, (struct obj*, int, int));
  602. X  static void FDECL(do_osshock, (struct obj *));
  603. X  static void FDECL(create_polymon, (struct obj *));
  604. X  static int FDECL(burn_floor_paper,(int,int));
  605. X! static void FDECL(costly_cancel, (struct obj *));
  606. X! static void FDECL(cancel_item, (struct obj *));
  607. X  static int FDECL(bhitm, (struct monst *,struct obj *));
  608. X  #ifndef MUSE
  609. X! STATIC_PTR int FDECL(bhito, (struct obj *,struct obj *));
  610. X  #endif
  611. X! STATIC_PTR int FDECL(bhitpile, (struct obj *,int (*)(OBJ_P,OBJ_P),int,int));
  612. X! static void FDECL(backfire, (struct obj *));
  613. X! static int FDECL(zhit, (struct monst *,int,int));
  614. X  
  615. X  #define ZT_MAGIC_MISSILE    (AD_MAGM-1)
  616. X  #define ZT_FIRE            (AD_FIRE-1)
  617. X***************
  618. X*** 267,274 ****
  619. X      return mtmp;
  620. X  }
  621. X  
  622. X! static const char NEARDATA charged_objs[] = { WAND_CLASS, WEAPON_CLASS, ARMOR_CLASS, 0 };
  623. X  
  624. X  /* cancel obj, possibly carried by you or a monster */
  625. X  static void
  626. X  cancel_item(obj)
  627. X--- 268,302 ----
  628. X      return mtmp;
  629. X  }
  630. X  
  631. X! static NEARDATA const char charged_objs[] = { WAND_CLASS, WEAPON_CLASS, ARMOR_CLASS, 0 };
  632. X  
  633. X+ static void
  634. X+ costly_cancel(obj)
  635. X+ register struct obj *obj;
  636. X+ {
  637. X+     register struct monst *shkp = (struct monst *)0;
  638. X+ 
  639. X+     if (carried(obj)) {
  640. X+         if (obj->unpaid) {
  641. X+                 shkp = shop_keeper(*in_rooms(u.ux, u.uy, SHOPBASE));
  642. X+             if (!shkp) return;
  643. X+             Norep("You cancel an unpaid object, you pay for it!");
  644. X+             bill_dummy_object(obj);
  645. X+         }
  646. X+     } else {
  647. X+             shkp = shop_keeper(*in_rooms(obj->ox, obj->oy, SHOPBASE));
  648. X+         if (!shkp || !inhishop(shkp)) return;
  649. X+         if (!costly_spot(obj->ox, obj->oy)) return;
  650. X+         if (costly_spot(u.ux, u.uy) && 
  651. X+                 *in_rooms(u.ux, u.uy, 0) ==
  652. X+                     *in_rooms(shkp->mx, shkp->my, 0)) {
  653. X+             Norep("You cancel it, you pay for it!");
  654. X+             bill_dummy_object(obj);
  655. X+         } else
  656. X+             (void) stolen_value(obj, obj->ox, obj->oy, FALSE, FALSE);
  657. X+     }
  658. X+ }
  659. X+ 
  660. X  /* cancel obj, possibly carried by you or a monster */
  661. X  static void
  662. X  cancel_item(obj)
  663. X***************
  664. X*** 275,280 ****
  665. X--- 303,310 ----
  666. X  register struct obj *obj;
  667. X  {
  668. X      boolean    u_ring = (obj == uleft) || (obj == uright);
  669. X+     register boolean unpaid = (carried(obj) && obj->unpaid);
  670. X+     register boolean holy = (obj->otyp == POT_WATER && obj->blessed);
  671. X  
  672. X      switch(obj->otyp) {
  673. X          case RIN_GAIN_STRENGTH:
  674. X***************
  675. X*** 320,360 ****
  676. X          obj->otyp == SLIME_MOLD ||
  677. X  #endif
  678. X          obj->otyp == SKELETON_KEY ||
  679. X!         obj->otyp == LARGE_BOX || obj->otyp == CHEST))
  680. X          obj->spe = (obj->oclass == WAND_CLASS) ? -1 : 0;
  681. X! 
  682. X!     if (obj->otyp == OIL_LAMP || obj->otyp == BRASS_LANTERN
  683. X!         || Is_candle(obj) || obj->otyp == CANDELABRUM_OF_INVOCATION) {
  684. X! 
  685. X!         /* reducing a candle's age to 0 is */
  686. X!         /* the same as destroying it.      */
  687. X!         if (!Is_candle(obj)) obj->age = 0;
  688. X! 
  689. X!         /* reducing a candelabrum age to 0 */
  690. X!         /* is the same as de-candling it.  */
  691. X!         if(obj->otyp == CANDELABRUM_OF_INVOCATION) obj->spe = 0;
  692. X! 
  693. X!         obj->lamplit = 0;
  694. X!         check_lamps();
  695. X!     }
  696. X! 
  697. X      if (obj->oclass == SCROLL_CLASS
  698. X  #ifdef MAIL
  699. X          && obj->otyp != SCR_MAIL
  700. X  #endif
  701. X!        )
  702. X          obj->otyp = SCR_BLANK_PAPER;
  703. X! 
  704. X!     if (obj->oclass == SPBOOK_CLASS && obj->otyp != SPE_BOOK_OF_THE_DEAD)
  705. X          obj->otyp = SPE_BLANK_PAPER;
  706. X! 
  707. X!     if (obj->oclass == POTION_CLASS && obj->otyp != POT_BOOZE)
  708. X!         obj->otyp = (obj->otyp==POT_SICKNESS || obj->otyp==POT_SEE_INVISIBLE || obj->otyp==POT_FRUIT_JUICE) ? POT_FRUIT_JUICE : POT_WATER;
  709. X          /* sickness is "biologically contaminated" fruit juice; cancel it
  710. X           * and it just becomes fruit juice... whereas see invisible
  711. X           * tastes like "enchanted" fruit juice, it similarly cancels.
  712. X           */
  713. X      unbless(obj);
  714. X      uncurse(obj);
  715. X  }
  716. X  
  717. X--- 350,401 ----
  718. X          obj->otyp == SLIME_MOLD ||
  719. X  #endif
  720. X          obj->otyp == SKELETON_KEY ||
  721. X!         obj->otyp == LARGE_BOX || obj->otyp == CHEST ||
  722. X!         obj->otyp == OIL_LAMP || obj->otyp == BRASS_LANTERN ||
  723. X!         Is_candle(obj) || obj->otyp == CANDELABRUM_OF_INVOCATION)) {
  724. X!             costly_cancel(obj);
  725. X          obj->spe = (obj->oclass == WAND_CLASS) ? -1 : 0;
  726. X!         if (unpaid) addtobill(obj, TRUE, FALSE, TRUE);
  727. X!         }
  728. X      if (obj->oclass == SCROLL_CLASS
  729. X+         && obj->otyp != SCR_BLANK_PAPER
  730. X  #ifdef MAIL
  731. X          && obj->otyp != SCR_MAIL
  732. X  #endif
  733. X!        ) {
  734. X!         costly_cancel(obj);
  735. X          obj->otyp = SCR_BLANK_PAPER;
  736. X!         if (unpaid) addtobill(obj, TRUE, FALSE, TRUE);
  737. X!         }
  738. X!     if (obj->oclass == SPBOOK_CLASS &&
  739. X!                        obj->otyp != SPE_BOOK_OF_THE_DEAD &&
  740. X!                        obj->otyp != SPE_BLANK_PAPER) {
  741. X!         costly_cancel(obj);
  742. X          obj->otyp = SPE_BLANK_PAPER;
  743. X!         if (unpaid) addtobill(obj, TRUE, FALSE, TRUE);
  744. X!     }
  745. X!     if (obj->oclass == POTION_CLASS && obj->otyp != POT_BOOZE) {
  746. X!         if (obj->otyp==POT_SICKNESS ||
  747. X!                      obj->otyp==POT_SEE_INVISIBLE) {
  748. X!                 costly_cancel(obj);
  749. X!                 obj->otyp = POT_FRUIT_JUICE;
  750. X!             if (unpaid) addtobill(obj, TRUE, FALSE, TRUE);
  751. X!         } else {
  752. X!                 if (obj->otyp != POT_FRUIT_JUICE &&
  753. X!                                  obj->otyp != POT_WATER) {
  754. X!                 costly_cancel(obj);
  755. X!                     obj->otyp = POT_WATER;
  756. X!             if (unpaid) addtobill(obj, TRUE, FALSE, TRUE);
  757. X!             }
  758. X!         }
  759. X          /* sickness is "biologically contaminated" fruit juice; cancel it
  760. X           * and it just becomes fruit juice... whereas see invisible
  761. X           * tastes like "enchanted" fruit juice, it similarly cancels.
  762. X           */
  763. X+     }
  764. X+     if (holy) costly_cancel(obj);
  765. X      unbless(obj);
  766. X+     if (unpaid && holy) addtobill(obj, TRUE, FALSE, TRUE);
  767. X      uncurse(obj);
  768. X  }
  769. X  
  770. X***************
  771. X*** 434,439 ****
  772. X--- 475,481 ----
  773. X  {
  774. X      struct permonst *mdat = (struct permonst *)0;
  775. X      struct monst *mtmp;
  776. X+     char *material;
  777. X      int pm_index;
  778. X  
  779. X      /* no golems if you zap only one object -- not enough stuff */
  780. X***************
  781. X*** 445,450 ****
  782. X--- 487,493 ----
  783. X      case METAL:
  784. X      case MITHRIL:
  785. X          pm_index = PM_IRON_GOLEM;
  786. X+         material = "metal ";
  787. X          break;
  788. X      case COPPER:
  789. X      case SILVER:
  790. X***************
  791. X*** 454,476 ****
  792. X--- 497,525 ----
  793. X      case GLASS:
  794. X      case MINERAL:
  795. X          pm_index = rn2(2) ? PM_STONE_GOLEM : PM_CLAY_GOLEM;
  796. X+         material = "lithic ";
  797. X          break;
  798. X      case 0:
  799. X          /* there is no flesh type, but all food is type 0, so we use it */
  800. X          pm_index = PM_FLESH_GOLEM;
  801. X+         material = "organic ";
  802. X          break;
  803. X      case WOOD:
  804. X          pm_index = PM_WOOD_GOLEM;
  805. X+         material = "wood ";
  806. X          break;
  807. X      case LEATHER:
  808. X          pm_index = PM_LEATHER_GOLEM;
  809. X+         material = "leather ";
  810. X          break;
  811. X      case CLOTH:
  812. X          pm_index = PM_ROPE_GOLEM;
  813. X+         material = "cloth ";
  814. X          break;
  815. X      default:
  816. X          /* if all else fails... */
  817. X          pm_index = PM_STRAW_GOLEM;
  818. X+         material = "";
  819. X          break;
  820. X      }
  821. X  
  822. X***************
  823. X*** 481,488 ****
  824. X      polyuse(obj, poly_zapped, (int)mons[pm_index].cwt);
  825. X  
  826. X      if(!Blind && mtmp) {
  827. X!         pline("Some objects in the pile merge.");
  828. X!         pline("%s rises from the pile!", Amonnam(mtmp));
  829. X      }
  830. X  }
  831. X  
  832. X--- 530,537 ----
  833. X      polyuse(obj, poly_zapped, (int)mons[pm_index].cwt);
  834. X  
  835. X      if(!Blind && mtmp) {
  836. X!         pline("Some %sobjects meld, and %s arises from the pile!",
  837. X!           material, a_monnam(mtmp));
  838. X      }
  839. X  }
  840. X  
  841. X***************
  842. X*** 580,585 ****
  843. X--- 629,638 ----
  844. X          otmp2->oeroded = obj->oeroded;
  845. X          otmp2->oerodeproof = obj->oerodeproof;
  846. X  
  847. X+         /* reduce spellbook abuse */
  848. X+         if (obj->oclass == SPBOOK_CLASS)
  849. X+             otmp2->spestudied = obj->spestudied + 1;
  850. X+ 
  851. X          /* Keep chest/box traps and poisoned ammo if we may */
  852. X          if (obj->otrapped && Is_box(otmp2))
  853. X              otmp2->otrapped = TRUE;
  854. X***************
  855. X*** 744,750 ****
  856. X      if(wand->spe < 0 || (wand->spe == 0 && rn2(121)))
  857. X          return 0;
  858. X      if(wand->spe == 0)
  859. X!         You("wrest one more spell from the worn-out wand.");
  860. X      wand->spe--;
  861. X      return 1;
  862. X  }
  863. X--- 797,803 ----
  864. X      if(wand->spe < 0 || (wand->spe == 0 && rn2(121)))
  865. X          return 0;
  866. X      if(wand->spe == 0)
  867. X!         You("wrest one last charge from the worn-out wand.");
  868. X      wand->spe--;
  869. X      return 1;
  870. X  }
  871. X***************
  872. X*** 798,804 ****
  873. X      useup(otmp);
  874. X  }
  875. X  
  876. X! static const char NEARDATA zap_syms[] = { WAND_CLASS, 0 };
  877. X  
  878. X  int
  879. X  dozap()
  880. X--- 851,857 ----
  881. X      useup(otmp);
  882. X  }
  883. X  
  884. X! static NEARDATA const char zap_syms[] = { WAND_CLASS, 0 };
  885. X  
  886. X  int
  887. X  dozap()
  888. X***************
  889. X*** 830,837 ****
  890. X          weffects(obj);
  891. X      }
  892. X      if (obj->spe < 0) {
  893. X!         pline ("%s %sturns to dust.",
  894. X!            The(xname(obj)), Blind ? "" : "glows violently, then ");
  895. X          useup(obj);
  896. X      }
  897. X      return(1);
  898. X--- 883,889 ----
  899. X          weffects(obj);
  900. X      }
  901. X      if (obj->spe < 0) {
  902. X!         pline("%s turns to dust.", The(xname(obj)));
  903. X          useup(obj);
  904. X      }
  905. X      return(1);
  906. X***************
  907. X*** 850,856 ****
  908. X              shieldeff(u.ux, u.uy);
  909. X              pline("Boing!");
  910. X              } else {
  911. X!             You("magically bash yourself!");
  912. X              damage=d(8,6);
  913. X              exercise(A_STR, FALSE);
  914. X              }
  915. X--- 902,908 ----
  916. X              shieldeff(u.ux, u.uy);
  917. X              pline("Boing!");
  918. X              } else {
  919. X!             You("bash yourself!");
  920. X              damage=d(8,6);
  921. X              exercise(A_STR, FALSE);
  922. X              }
  923. X***************
  924. X*** 859,865 ****
  925. X          case WAN_LIGHTNING:
  926. X              makeknown(WAN_LIGHTNING);
  927. X              if (!Shock_resistance) {
  928. X!             pline("Idiot!  You've shocked yourself!");
  929. X              damage = d(12,6);
  930. X              exercise(A_CON, FALSE);
  931. X              } else {
  932. X--- 911,917 ----
  933. X          case WAN_LIGHTNING:
  934. X              makeknown(WAN_LIGHTNING);
  935. X              if (!Shock_resistance) {
  936. X!             You("shock yourself!");
  937. X              damage = d(12,6);
  938. X              exercise(A_CON, FALSE);
  939. X              } else {
  940. X***************
  941. X*** 883,892 ****
  942. X          case WAN_FIRE:
  943. X              makeknown(WAN_FIRE);
  944. X          case FIRE_HORN:
  945. X!             pline("You've set light to yourself!");
  946. X              if (Fire_resistance) {
  947. X              shieldeff(u.ux, u.uy);
  948. X!             You("feel mildly hot.");
  949. X  #ifdef POLYSELF
  950. X              ugolemeffects(AD_FIRE, d(12,6));
  951. X  #endif
  952. X--- 935,944 ----
  953. X          case WAN_FIRE:
  954. X              makeknown(WAN_FIRE);
  955. X          case FIRE_HORN:
  956. X!             pline("You've set yourself afire!");
  957. X              if (Fire_resistance) {
  958. X              shieldeff(u.ux, u.uy);
  959. X!             You("feel rather warm.");
  960. X  #ifdef POLYSELF
  961. X              ugolemeffects(AD_FIRE, d(12,6));
  962. X  #endif
  963. X***************
  964. X*** 902,908 ****
  965. X          case FROST_HORN:
  966. X              if (Cold_resistance) {
  967. X              shieldeff(u.ux, u.uy);
  968. X!             You("feel mildly chilly.");
  969. X  #ifdef POLYSELF
  970. X              ugolemeffects(AD_COLD, d(12,6));
  971. X  #endif
  972. X--- 954,960 ----
  973. X          case FROST_HORN:
  974. X              if (Cold_resistance) {
  975. X              shieldeff(u.ux, u.uy);
  976. X!             You("feel a little chill.");
  977. X  #ifdef POLYSELF
  978. X              ugolemeffects(AD_COLD, d(12,6));
  979. X  #endif
  980. X***************
  981. X*** 1389,1394 ****
  982. X--- 1441,1455 ----
  983. X                  break;
  984. X              }
  985. X  
  986. X+         if (weapon == THROWN_WEAPON || weapon == KICKED_WEAPON) {
  987. X+             /* can't hit monsters/objects in rock w/solid weapons */
  988. X+             /* but beams/zaps _can_, so we need an extra pre-check */
  989. X+             if(!ZAP_POS(typ) || closed_door(bhitpos.x, bhitpos.y)) {
  990. X+             bhitpos.x -= ddx;
  991. X+             bhitpos.y -= ddy;
  992. X+             break;
  993. X+             }
  994. X+         }
  995. X          if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != 0) {
  996. X              if(weapon != ZAPPED_WAND) {
  997. X                  if(weapon != INVIS_BEAM) tmp_at(DISP_END, 0);
  998. X***************
  999. X*** 1495,1501 ****
  1000. X                  break;
  1001. X              } else {    /* we catch it */
  1002. X                  tmp_at(DISP_END, 0);
  1003. X!                 pline("Skillfully, you catch the boomerang.");
  1004. X                  return(&youmonst);
  1005. X              }
  1006. X          }
  1007. X--- 1556,1562 ----
  1008. X                  break;
  1009. X              } else {    /* we catch it */
  1010. X                  tmp_at(DISP_END, 0);
  1011. X!                 pline("You skillfully catch the boomerang.");
  1012. X                  return(&youmonst);
  1013. X              }
  1014. X          }
  1015. X***************
  1016. X*** 1634,1640 ****
  1017. X          /* Bug fix - KAA */
  1018. X          if(obj->oclass == SCROLL_CLASS
  1019. X              || obj->oclass == SPBOOK_CLASS) {
  1020. X!         if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL)
  1021. X              continue;
  1022. X          scrquan = obj->quan;
  1023. X          for(i = 1; i <= scrquan ; i++)
  1024. X--- 1695,1703 ----
  1025. X          /* Bug fix - KAA */
  1026. X          if(obj->oclass == SCROLL_CLASS
  1027. X              || obj->oclass == SPBOOK_CLASS) {
  1028. X!         if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL
  1029. X!             || obj->otyp == SPE_BOOK_OF_THE_DEAD
  1030. X!                 || obj->oartifact)
  1031. X              continue;
  1032. X          scrquan = obj->quan;
  1033. X          for(i = 1; i <= scrquan ; i++)
  1034. X***************
  1035. X*** 1711,1719 ****
  1036. X          if (type >= 0) mon->data->mflags3 &= ~M3_WAITMASK;
  1037. X          if (rnd(20) < 18 + find_mac(mon)) {
  1038. X  #ifdef MUSE
  1039. X!         struct obj *oshld = which_armor(mon, W_ARMS);
  1040. X  
  1041. X!         if (oshld && oshld->otyp == SHIELD_OF_REFLECTION) {
  1042. X              if(cansee(mon->mx,mon->my)) {
  1043. X              hit(fltxt, mon, exclam(0));
  1044. X              pline("But it reflects from %s shield!",
  1045. X--- 1774,1782 ----
  1046. X          if (type >= 0) mon->data->mflags3 &= ~M3_WAITMASK;
  1047. X          if (rnd(20) < 18 + find_mac(mon)) {
  1048. X  #ifdef MUSE
  1049. X!         struct obj *orefl = which_armor(mon, W_ARMS);
  1050. X  
  1051. X!         if (orefl && orefl->otyp == SHIELD_OF_REFLECTION) {
  1052. X              if(cansee(mon->mx,mon->my)) {
  1053. X              hit(fltxt, mon, exclam(0));
  1054. X              pline("But it reflects from %s shield!",
  1055. X***************
  1056. X*** 1724,1729 ****
  1057. X--- 1787,1804 ----
  1058. X  
  1059. X              dx = -dx;
  1060. X              dy = -dy;
  1061. X+         } else if ((orefl = which_armor(mon, W_AMUL)) &&
  1062. X+                     orefl->otyp == AMULET_OF_REFLECTION) {
  1063. X+             if(cansee(mon->mx,mon->my)) {
  1064. X+             hit(fltxt, mon, exclam(0));
  1065. X+             pline("But it reflects from %s amulet!",
  1066. X+                   s_suffix(mon_nam(mon)));
  1067. X+             makeknown(AMULET_OF_REFLECTION);
  1068. X+             shieldeff(sx, sy);
  1069. X+             }
  1070. X+ 
  1071. X+             dx = -dx;
  1072. X+             dy = -dy;
  1073. X          } else
  1074. X  #endif
  1075. X          {
  1076. X***************
  1077. X*** 1734,1743 ****
  1078. X                  hit(fltxt, mon, exclam(tmp));
  1079. X                  pline("%s disintegrates.", Monnam(mon));
  1080. X                  if(Blind)
  1081. X!                You("sense the fragments of %s body reassembling!",
  1082. X                       s_suffix(mon_nam(mon)));
  1083. X                  else
  1084. X!                pline("%s body fragments reassemble before your %s!",
  1085. X                       s_suffix(Monnam(mon)),
  1086. X                       makeplural(body_part(EYE)));
  1087. X                      pline("%s resurrects!", Monnam(mon));
  1088. X--- 1809,1818 ----
  1089. X                  hit(fltxt, mon, exclam(tmp));
  1090. X                  pline("%s disintegrates.", Monnam(mon));
  1091. X                  if(Blind)
  1092. X!                You("hear the fragments of %s body reassembling!",
  1093. X                       s_suffix(mon_nam(mon)));
  1094. X                  else
  1095. X!                pline("%s body reintegrates before your %s!",
  1096. X                       s_suffix(Monnam(mon)),
  1097. X                       makeplural(body_part(EYE)));
  1098. X                      pline("%s resurrects!", Monnam(mon));
  1099. X***************
  1100. X*** 1969,1975 ****
  1101. X          }
  1102. X          bounce = 0;
  1103. X          range--;
  1104. X!         if(range && cansee(lsx,lsy))
  1105. X          pline("%s bounces!", The(fltxt));
  1106. X          if(!dx || !dy || !rn2(20)) {
  1107. X          dx = -dx;
  1108. X--- 2044,2050 ----
  1109. X          }
  1110. X          bounce = 0;
  1111. X          range--;
  1112. X!         if(range && isok(lsx, lsy) && cansee(lsx,lsy))
  1113. X          pline("%s bounces!", The(fltxt));
  1114. X          if(!dx || !dy || !rn2(20)) {
  1115. X          dx = -dx;
  1116. X***************
  1117. X*** 2037,2043 ****
  1118. X          if (x == u.ux && y == u.uy)
  1119. X              spoteffects();    /* possibly drown */
  1120. X          } else if(is_pool(x,y)) {
  1121. X!         const char *msgtxt = "You hear a hissing sound.";
  1122. X          if(lev->typ != POOL) {    /* MOAT or DRAWBRIDGE_UP */
  1123. X              if (cansee(x,y)) msgtxt = "Some water evaporates.";
  1124. X          } else {
  1125. X--- 2112,2118 ----
  1126. X          if (x == u.ux && y == u.uy)
  1127. X              spoteffects();    /* possibly drown */
  1128. X          } else if(is_pool(x,y)) {
  1129. X!         const char *msgtxt = "You hear hissing gas.";
  1130. X          if(lev->typ != POOL) {    /* MOAT or DRAWBRIDGE_UP */
  1131. X              if (cansee(x,y)) msgtxt = "Some water evaporates.";
  1132. X          } else {
  1133. X***************
  1134. X*** 2065,2071 ****
  1135. X              if (cansee(x,y))
  1136. X              pline("The water freezes for a moment.");
  1137. X              else
  1138. X!             You("hear a soft crackling sound");
  1139. X              rangemod -= 1000;    /* stop */
  1140. X          } else {
  1141. X              rangemod -= 3;
  1142. X--- 2140,2146 ----
  1143. X              if (cansee(x,y))
  1144. X              pline("The water freezes for a moment.");
  1145. X              else
  1146. X!             You("hear a soft crackling.");
  1147. X              rangemod -= 1000;    /* stop */
  1148. X          } else {
  1149. X              rangemod -= 3;
  1150. X***************
  1151. X*** 2155,2161 ****
  1152. X              newsym(x,y);
  1153. X              }
  1154. X              else if(flags.soundok)
  1155. X!             You("hear a crashing sound.");
  1156. X              break;
  1157. X          case ZT_LIGHTNING:
  1158. X              if(type >= 0 && *in_rooms(x, y, SHOPBASE)) {
  1159. X--- 2230,2236 ----
  1160. X              newsym(x,y);
  1161. X              }
  1162. X              else if(flags.soundok)
  1163. X!             You("hear crashing wood.");
  1164. X              break;
  1165. X          case ZT_LIGHTNING:
  1166. X              if(type >= 0 && *in_rooms(x, y, SHOPBASE)) {
  1167. X***************
  1168. X*** 2169,2175 ****
  1169. X              newsym(x,y);
  1170. X              }
  1171. X              else if(flags.soundok)
  1172. X!             You("hear a crackling sound.");
  1173. X              break;
  1174. X          default:
  1175. X          def_case:
  1176. X--- 2244,2250 ----
  1177. X              newsym(x,y);
  1178. X              }
  1179. X              else if(flags.soundok)
  1180. X!             You("hear crackling.");
  1181. X              break;
  1182. X          default:
  1183. X          def_case:
  1184. X***************
  1185. X*** 2188,2193 ****
  1186. X--- 2263,2270 ----
  1187. X              newsym(x,y);
  1188. X              if(!Blind)
  1189. X              You("see a puff of smoke.");
  1190. X+             else
  1191. X+             You("smell a whiff of smoke.");
  1192. X          }
  1193. X      if ((mon = m_at(x,y)) != 0) {
  1194. X          /* Cannot use wakeup() which also angers the monster */
  1195. X***************
  1196. X*** 2575,2585 ****
  1197. X          /* The(aobjnam()) is safe since otmp is unidentified -dlc */
  1198. X          (void) hold_another_object(otmp, u.uswallow ?
  1199. X                         "Oops!  %s out of your reach!" :
  1200. X!                        Is_airlevel(&u.uz) ?
  1201. X!                        "Oops!  %s out of your grasp!" :
  1202. X                         "Oops!  %s to the floor!",
  1203. X!                        The(aobjnam(otmp, Is_airlevel(&u.uz) ?
  1204. X!                            "slip" : "drop")),
  1205. X                         (const char *)0);
  1206. X          u.ublesscnt += rn1(100,50);  /* the gods take notice */
  1207. X      }
  1208. X--- 2652,2663 ----
  1209. X          /* The(aobjnam()) is safe since otmp is unidentified -dlc */
  1210. X          (void) hold_another_object(otmp, u.uswallow ?
  1211. X                         "Oops!  %s out of your reach!" :
  1212. X!                        Is_airlevel(&u.uz) || u.uinwater ?
  1213. X!                        "Oops!  %s away from you!" :
  1214. X                         "Oops!  %s to the floor!",
  1215. X!                        The(aobjnam(otmp,
  1216. X!                          Is_airlevel(&u.uz) || u.uinwater ?
  1217. X!                            "slip" : "drop")),
  1218. X                         (const char *)0);
  1219. X          u.ublesscnt += rn1(100,50);  /* the gods take notice */
  1220. X      }
  1221. X*** /tmp/da07061    Thu Feb 25 10:18:06 1993
  1222. X--- ./Files    Wed Feb 24 16:13:40 1993
  1223. X***************
  1224. X*** 4,9 ****
  1225. X--- 4,10 ----
  1226. X  from or not transferred to your system if you wish.
  1227. X  
  1228. X  
  1229. X+ .:
  1230. X  (files in top directory)
  1231. X  Files           Porting         README
  1232. X  
  1233. X***************
  1234. X*** 30,42 ****
  1235. X  engrave.h       epri.h          eshk.h          extern.h        flag.h
  1236. X  func_tab.h      global.h        hack.h          lev.h           macconf.h
  1237. X  mail.h          mfndpos.h       micro.h         mkroom.h        monattk.h
  1238. X! mondata.h       monflag.h       monst.h         monsym.h        obj.h
  1239. X! objclass.h      os2conf.h       patchlevel.h    pcconf.h        permonst.h
  1240. X! prop.h          qtext.h         quest.h         rect.h          rm.h
  1241. X! sp_lev.h        spell.h         system.h        termcap.h       tosconf.h
  1242. X! tradstdc.h      trampoli.h      trap.h          unixconf.h      vault.h
  1243. X! vision.h        vmsconf.h       winami.h        winprocs.h      wintype.h
  1244. X! you.h           youprop.h
  1245. X  (file for tty versions)
  1246. X  wintty.h
  1247. X  (files for X versions)
  1248. X--- 31,43 ----
  1249. X  engrave.h       epri.h          eshk.h          extern.h        flag.h
  1250. X  func_tab.h      global.h        hack.h          lev.h           macconf.h
  1251. X  mail.h          mfndpos.h       micro.h         mkroom.h        monattk.h
  1252. X! mondata.h       monflag.h       monst.h         monsym.h        ntconf.h
  1253. X! obj.h           objclass.h      os2conf.h       patchlevel.h    pcconf.h
  1254. X! permonst.h      prop.h          qtext.h         quest.h         rect.h
  1255. X! rm.h            sp_lev.h        spell.h         system.h        termcap.h
  1256. X! tosconf.h       tradstdc.h      trampoli.h      trap.h          unixconf.h
  1257. X! vault.h         vision.h        vmsconf.h       winami.h        winprocs.h
  1258. X! wintype.h       you.h           youprop.h
  1259. X  (file for tty versions)
  1260. X  wintty.h
  1261. X  (files for X versions)
  1262. X***************
  1263. X*** 69,80 ****
  1264. X  (files for Amiga version)
  1265. X  HackWB.uu       Install.ami     Makefile.ami    NHinfo.uu       NetHack.cnf
  1266. X  NewGame.uu      amidos.c        amidos.p        amifont.uu      amifont8.uu
  1267. X! amigst.c        amii.hlp        amimenu.c       amirip.c        amiwbench.c
  1268. X! amiwind.c       amiwind.p       ask.uu          char.c          charwin.uu
  1269. X! colors.uu       colorwin.c      dflticon.uu     hackwb.hlp      ifchange
  1270. X! randwin.c       randwin.uu      scroll.uu       string.uu       wb.c
  1271. X! wbcli.c         wbdata.c        wbdefs.h        wbprotos.h      wbstruct.h
  1272. X! wbwin.c         wbwin.uu        winami.c        winami.p
  1273. X  
  1274. X  sys/amiga/splitter:
  1275. X  (more files for Amiga version)
  1276. X--- 70,82 ----
  1277. X  (files for Amiga version)
  1278. X  HackWB.uu       Install.ami     Makefile.ami    NHinfo.uu       NetHack.cnf
  1279. X  NewGame.uu      amidos.c        amidos.p        amifont.uu      amifont8.uu
  1280. X! amigst.c        amii.hlp        amimenu.c       amirip.c        amisnd.c
  1281. X! amiwbench.c     amiwind.c       amiwind.p       ask.uu          char.c
  1282. X! charwin.uu      colors.uu       colorwin.c      cvtsnd.c        dflticon.uu
  1283. X! hackwb.hlp      ifchange        randwin.c       randwin.uu      scroll.uu
  1284. X! string.uu       wb.c            wbcli.c         wbdata.c        wbdefs.h
  1285. X! wbprotos.h      wbstruct.h      wbwin.c         wbwin.uu        winami.c
  1286. X! winami.p
  1287. X  
  1288. X  sys/amiga/splitter:
  1289. X  (more files for Amiga version)
  1290. X***************
  1291. X*** 94,100 ****
  1292. X  macwin.c        mgetline.c      mhdump.c        mmodal.c        mstring.c
  1293. X  
  1294. X  sys/msdos:
  1295. X! (files for MSDOS versions)
  1296. X  Install.dos     MakeGCC.src     MakeGCC.utl     MakeMSC.src     MakeMSC.utl
  1297. X  Makefile.dat    exesmurf.c      exesmurf.doc    maintovl.doc    msdos.c
  1298. X  ovlmgr.asm      ovlmgr.doc      ovlmgr.uu       setup.bat       trampoli.c
  1299. X--- 96,102 ----
  1300. X  macwin.c        mgetline.c      mhdump.c        mmodal.c        mstring.c
  1301. X  
  1302. X  sys/msdos:
  1303. X! (files for MSDOS version)
  1304. X  Install.dos     MakeGCC.src     MakeGCC.utl     MakeMSC.src     MakeMSC.utl
  1305. X  Makefile.dat    exesmurf.c      exesmurf.doc    maintovl.doc    msdos.c
  1306. X  ovlmgr.asm      ovlmgr.doc      ovlmgr.uu       setup.bat       trampoli.c
  1307. X***************
  1308. X*** 108,125 ****
  1309. X  sys/share:
  1310. X  (files for MSDOS and OS/2 versions)
  1311. X  Makefile.lib    NetHack.cnf     termcap.uu
  1312. X! (file for MSDOS, OS/2, Amiga, and Atari versions)
  1313. X  pcmain.c
  1314. X! (files for MSDOS, OS/2 and Atari versions)
  1315. X! pcsys.c         pctty.c         pcunix.c
  1316. X  (Berkeley random number file, which may be included in any version)
  1317. X  random.c
  1318. X! (file for MSDOS, OS/2 and VMS versions)
  1319. X  termcap
  1320. X  (lex/yacc output for special level and dungeon compilers)
  1321. X  dgn_comp.h      dgn_lex.c       dgn_yacc.c      lev_comp.h      lev_lex.c
  1322. X  lev_yacc.c
  1323. X  
  1324. X  sys/unix:
  1325. X  (files for UNIX versions)
  1326. X  Install.unx     Makefile.dat    Makefile.doc    Makefile.src    Makefile.top
  1327. X--- 110,135 ----
  1328. X  sys/share:
  1329. X  (files for MSDOS and OS/2 versions)
  1330. X  Makefile.lib    NetHack.cnf     termcap.uu
  1331. X! (file for MSDOS, OS/2, NT, Amiga, and Atari versions)
  1332. X  pcmain.c
  1333. X! (files for MSDOS, OS/2, NT, and Atari versions)
  1334. X! pcsys.c         pcunix.c
  1335. X! (file for MSDOS, OS/2, and Atari versions)
  1336. X! pctty.c
  1337. X  (Berkeley random number file, which may be included in any version)
  1338. X  random.c
  1339. X! (file for MSDOS, OS/2, and VMS versions)
  1340. X  termcap
  1341. X  (lex/yacc output for special level and dungeon compilers)
  1342. X  dgn_comp.h      dgn_lex.c       dgn_yacc.c      lev_comp.h      lev_lex.c
  1343. X  lev_yacc.c
  1344. X  
  1345. X+ sys/share/sounds:
  1346. X+ (files for Amiga and Macintosh versions)
  1347. X+ README          bell.uu         bugle.uu        erthdrum.uu     firehorn.uu
  1348. X+ frsthorn.uu     lethdrum.uu     mgcflute.uu     mgcharp.uu      toolhorn.uu
  1349. X+ wdnflute.uu     wdnharp.uu
  1350. X+ 
  1351. X  sys/unix:
  1352. X  (files for UNIX versions)
  1353. X  Install.unx     Makefile.dat    Makefile.doc    Makefile.src    Makefile.top
  1354. X***************
  1355. X*** 138,143 ****
  1356. X--- 148,158 ----
  1357. X  vmsmisc.c       vmstty.c        vmsunix.c
  1358. X  (GNU termcap files that support VMS version)
  1359. X  gnutermcap.c    gnutparam.c
  1360. X+ 
  1361. X+ sys/winnt:
  1362. X+ (files for Windows NT version)
  1363. X+ Install.nt      Makefile.dat    Makefile.src    Makefile.utl    nhico.uu
  1364. X+ nhincl.mak      nttty.c         setup.bat       winnt.c
  1365. X  
  1366. X  util:
  1367. X  (files for all versions)
  1368. X
  1369. X*** /tmp/da07077    Thu Feb 25 10:18:10 1993
  1370. X--- ./README    Wed Feb 24 09:37:43 1993
  1371. X***************
  1372. X*** 70,88 ****
  1373. X      f.  A 'sys' directory, which contains subdirectories for files that
  1374. X          are operating-system specific.
  1375. X      g.  A 'sys/share' subdirectory, which contains files shared by some OSs.
  1376. X!     h.  A 'sys/amiga' subdirectory, which contains files specific to AmigaDOS.
  1377. X!     i.  A 'sys/amiga/splitter' subsubdirectory, which contains files
  1378. X          for the Amiga splitter program.
  1379. X!     j.  A 'sys/atari' subdirectory, which contains files specific to TOS.
  1380. X!     k.  A 'sys/mac' subdirectory, which contains files specific to MacOS.
  1381. X!     l.  A 'sys/msdos' subdirectory, which contains files specific to MS-DOS.
  1382. X!     m.  A 'sys/os2' subdirectory, which contains files specific to OS/2.
  1383. X!     n.  A 'sys/unix' subdirectory, which contains files specific to UNIX.
  1384. X!     o.  A 'sys/vms' subdirectory, which contains files specific to VMS.
  1385. X!     p.  A 'win' directory, which contains subdirectories for files that
  1386. X          are windowing-system specific (but not operating-system specific).
  1387. X!     q.  A 'win/tty' subdirectory, which contains files specific to ttys.
  1388. X!     r.  A 'win/X11' subdirectory, which contains files specific to X11.
  1389. X  
  1390. X      The names of these directories should not be changed, unless you are
  1391. X      ready to go through the makefiles and the makedefs program and change
  1392. X--- 70,91 ----
  1393. X      f.  A 'sys' directory, which contains subdirectories for files that
  1394. X          are operating-system specific.
  1395. X      g.  A 'sys/share' subdirectory, which contains files shared by some OSs.
  1396. X!     h.  A 'sys/share/sounds' subsubdirectory, which contains sound files
  1397. X!         shared by some OSs.
  1398. X!     i.  A 'sys/amiga' subdirectory, which contains files specific to AmigaDOS.
  1399. X!     j.  A 'sys/amiga/splitter' subsubdirectory, which contains files
  1400. X          for the Amiga splitter program.
  1401. X!     k.  A 'sys/atari' subdirectory, which contains files specific to TOS.
  1402. X!     l.  A 'sys/mac' subdirectory, which contains files specific to MacOS.
  1403. X!     m.  A 'sys/msdos' subdirectory, which contains files specific to MS-DOS.
  1404. X!     n.  A 'sys/os2' subdirectory, which contains files specific to OS/2.
  1405. X!     o.  A 'sys/unix' subdirectory, which contains files specific to UNIX.
  1406. X!     p.  A 'sys/vms' subdirectory, which contains files specific to VMS.
  1407. X!     q.  A 'sys/winnt' subdirectory, which contains files specific to Windows NT.
  1408. X!     r.  A 'win' directory, which contains subdirectories for files that
  1409. X          are windowing-system specific (but not operating-system specific).
  1410. X!     s.  A 'win/tty' subdirectory, which contains files specific to ttys.
  1411. X!     t.  A 'win/X11' subdirectory, which contains files specific to X11.
  1412. X  
  1413. X      The names of these directories should not be changed, unless you are
  1414. X      ready to go through the makefiles and the makedefs program and change
  1415. X*** /tmp/da09982    Thu Feb 25 21:12:44 1993
  1416. X--- sys/vms/Install.vms    Thu Feb 25 20:47:33 1993
  1417. X***************
  1418. X*** 1,4 ****
  1419. X!                Instructions for Installing NetHack 3.1.0
  1420. X                             on a VMS system
  1421. X                 =========================================
  1422. X  
  1423. X--- 1,4 ----
  1424. X!                Instructions for Installing NetHack 3.1.1
  1425. X                             on a VMS system
  1426. X                 =========================================
  1427. X  
  1428. X***************
  1429. X*** 143,148 ****
  1430. X--- 143,150 ----
  1431. X      NetHack 3.1.0.  Don't bother trying to keep them.  Ditto for RECORD,
  1432. X      the scoreboard file.  One minor change of note is that the default
  1433. X      name for a player's character is now a lowercase copy of the username.
  1434. X+     Scoreboard files from 3.1.0 are compatible with 3.1.1, but save files
  1435. X+     and bones files are not.
  1436. X  
  1437. X  2.  To specify user-preference options in your environment, define the
  1438. X      logical name NETHACKOPTIONS to have value of a quoted string
  1439. X***************
  1440. X*** 166,174 ****
  1441. X      file.  Otherwise, the following are tried:  file specified by logical
  1442. X      name NETHACKINI, file SYS$LOGIN:NETHACK.INI, and file HOME:NETHACK.CNF
  1443. X      (note that the C run-time library sets up the value of HOME to match
  1444. X!     sys$login).  Syntax for the configuration file is essentially the same
  1445. X!     as for NETHACKOPTIONS, but multiple lines can be used and comments can
  1446. X!     be included by placing '#' in the first column.
  1447. X  
  1448. X  3.  Instead of using vmsbuild.com to compile and link everything, you can
  1449. X      use the set of Makefiles found in the vms subdirectory, provided you
  1450. X--- 168,181 ----
  1451. X      file.  Otherwise, the following are tried:  file specified by logical
  1452. X      name NETHACKINI, file SYS$LOGIN:NETHACK.INI, and file HOME:NETHACK.CNF
  1453. X      (note that the C run-time library sets up the value of HOME to match
  1454. X!     sys$login).  Syntax for the configuration file is similar to
  1455. X!     NETHACKOPTIONS, but multiple lines can be used, each must start with
  1456. X!     OPTIONS=, and comments can be included by placing '#' in the first
  1457. X!     column.  Several options which take more complex values (graphics
  1458. X!     representation) can also be present; see the "Guidebook" for details.
  1459. X!     (Guidebook.txt can be found in the [.dat] subdirectory; a copy gets
  1460. X!     placed in the playground directory by install.com.  Also, an example
  1461. X!     configuration file can be found in [.win.X11]nethack.rc.)
  1462. X  
  1463. X  3.  Instead of using vmsbuild.com to compile and link everything, you can
  1464. X      use the set of Makefiles found in the vms subdirectory, provided you
  1465. X***************
  1466. X*** 306,312 ****
  1467. X      its potential security ramifications should even consider it.
  1468. X  
  1469. X      The default setup by install.com assumes no privileges and uses
  1470. X!     world-writeable files to allow arbitrary users to play.  This is
  1471. X      NOT secure and not advisable in any environment where there are
  1472. X      untrustworthy users, but works fine for many sites.  If you allow
  1473. X      users to run NetHack from captive accounts (VMS 5.1-* or earlier)
  1474. X--- 313,319 ----
  1475. X      its potential security ramifications should even consider it.
  1476. X  
  1477. X      The default setup by install.com assumes no privileges and uses
  1478. X!     world-writable files to allow arbitrary users to play.  This is
  1479. X      NOT secure and not advisable in any environment where there are
  1480. X      untrustworthy users, but works fine for many sites.  If you allow
  1481. X      users to run NetHack from captive accounts (VMS 5.1-* or earlier)
  1482. X***************
  1483. X*** 447,453 ****
  1484. X      the C run-time library's program startup code from converting it into
  1485. X      lowercase.  Any character name will be ignored in favor of "wizard".
  1486. X  
  1487. X! 14. Unless you have both Motif and the Athena Widget set from MIT, you
  1488. X      will not be able to use the X11 interface on VMS.  Even if you do
  1489. X      have both those things, such a configuration has not been tested and
  1490. X      there are no provisions for it in vmsbuild.com.  Makefile.src does
  1491. X--- 454,501 ----
  1492. X      the C run-time library's program startup code from converting it into
  1493. X      lowercase.  Any character name will be ignored in favor of "wizard".
  1494. X  
  1495. X! 14. At program startup time, NetHack uses the empty file PERM to prevent
  1496. X!     two different processes from using the same character name (under the
  1497. X!     same UIC ownership) at the same time.  It does this by temporarily
  1498. X!     giving that file a second directory entry named PERM.LOCK, then
  1499. X!     removing the alternate entry once started.  If the PERM file is
  1500. X!     missing or inaccessible, NetHack will give a message and then quit.
  1501. X!     Several possible messages and their usual causes are:
  1502. X!        Can't find file perm;1 to lock!
  1503. X!     PERM.;1 is missing from the playground directory.  Fix:  reinstall
  1504. X!     the playground directory using install.com, or use CREATE or an editor
  1505. X!     to make an empty file named PERM.  Version number must be 1.
  1506. X!        Can't lock perm;1 due to directory protection.
  1507. X!     The playground directory is not allowing write access.  Fix:  players
  1508. X!     need to be able to write files for dungeon levels and "bones" into
  1509. X!     the playground directory.  Set the protection or ACL on the xxx.DIR;1
  1510. X!     file in the playground's parent directory to allow write access.
  1511. X!        Can't unlink perm.lock;1.
  1512. X!     The empty file PERM.;1 is protected against delete access; only matters
  1513. X!     under some versions of VMS.  Fix:  set the protection or ACL on PERM.;1
  1514. X!     to allow delete access to players.  Under VMS V5.5-2, delete access is
  1515. X!     not necessary.  PERM does not have to remain writable.
  1516. X!        Waiting for access to perm;1.  (# retries left).
  1517. X!     If some other process is also starting up NetHack at about the same
  1518. X!     time, you may have to wait a short period.  NetHack will retry once
  1519. X!     per second, counting down to 0.  If 0 is reached, the message
  1520. X!        Perhaps there is an old perm.lock;1 around?
  1521. X!     will be displayed and then NetHack will give up.  Fix:  to forcibly
  1522. X!     remove a stale PERM.LOCK entry, issue the following command
  1523. X!        $ SET FILE/REMOVE PERM.LOCK;1
  1524. X!     from the playground directory.  The file PERM should remain intact.
  1525. X!     Do not use that command for real files, only alternate directory
  1526. X!     entries.  If output from a DIRECTORY command on the playground reports
  1527. X!        PERM.LOCK;1          no such file
  1528. X!     then someone has deleted PERM.;1 while the synonym entry was still
  1529. X!     in place, and PERM.LOCK was left as a dangling name which no longer
  1530. X!     points at any file.  The SET FILE/REMOVE command above will fix it.
  1531. X! 
  1532. X!     In similar fashion, synchronized access to the scoreboard file RECORD
  1533. X!     is accomplished using temporary entry RECORD.LOCK and LOGFILE using
  1534. X!     entry LOGFILE.LOCK.
  1535. X! 
  1536. X! 15. Unless you have both Motif and the Athena Widget set from MIT, you
  1537. X      will not be able to use the X11 interface on VMS.  Even if you do
  1538. X      have both those things, such a configuration has not been tested and
  1539. X      there are no provisions for it in vmsbuild.com.  Makefile.src does
  1540. X***************
  1541. X*** 473,483 ****
  1542. X      window manager in order for any changes to take effect; it's easiest
  1543. X      to just make the session manager quit and then log in again.
  1544. X  
  1545. X! 15. There is no support for VMS POSIX in this release of NetHack.
  1546. X  
  1547. X! 16. If necessary, send problem reports via e-mail to
  1548. X         "nethack-bugs@linc.cis.upenn.edu"  (numeric address 130.91.6.8).
  1549. X      Always include version information for NetHack, the operating system,
  1550. X      and the C compiler used.
  1551. X  
  1552. X! 23-JAN-1993
  1553. X--- 521,531 ----
  1554. X      window manager in order for any changes to take effect; it's easiest
  1555. X      to just make the session manager quit and then log in again.
  1556. X  
  1557. X! 16. There is no support for VMS POSIX in this release of NetHack.
  1558. X  
  1559. X! 17. If necessary, send problem reports via e-mail to
  1560. X         "nethack-bugs@linc.cis.upenn.edu"  (numeric address 130.91.6.8).
  1561. X      Always include version information for NetHack, the operating system,
  1562. X      and the C compiler used.
  1563. X  
  1564. X! 24-FEB-1993
  1565. X*** /tmp/da10006    Thu Feb 25 21:12:44 1993
  1566. X--- sys/vms/Makefile.src    Thu Feb 25 20:46:18 1993
  1567. X***************
  1568. X*** 90,96 ****
  1569. X  
  1570. X  # note: no trailing whitespace (or comment) after version or patchlevel numbers
  1571. X  VERSION  =3.1
  1572. X! PATCHLVL =0
  1573. X  
  1574. X  MAKEDEFS = $(UTL)makedefs.exe;
  1575. X  
  1576. X--- 90,96 ----
  1577. X  
  1578. X  # note: no trailing whitespace (or comment) after version or patchlevel numbers
  1579. X  VERSION  =3.1
  1580. X! PATCHLVL =1
  1581. X  
  1582. X  MAKEDEFS = $(UTL)makedefs.exe;
  1583. X  
  1584. X***************
  1585. X*** 213,219 ****
  1586. X      $(CC) $(CFLAGS) objects.c
  1587. X       @- if f$search("$(MAKEDEFS)").nes."" then delete $(MAKEDEFS)
  1588. X  
  1589. X! $(MAKEDEFS) :    $(FIRSTOBJ) $(UTL)makedefs.c $(INC)patchlevel.h \
  1590. X          $(INC)config.h $(INC)artilist.h $(INC)qtext.h  $(LIBOPT)
  1591. X      $(CD) $(UTL)
  1592. X      $(MAKE)$(MAKEFLAGS) $(MAKEDEFS)
  1593. X--- 213,219 ----
  1594. X      $(CC) $(CFLAGS) objects.c
  1595. X       @- if f$search("$(MAKEDEFS)").nes."" then delete $(MAKEDEFS)
  1596. X  
  1597. X! $(MAKEDEFS) :    $(FIRSTOBJ) $(UTL)makedefs.c \
  1598. X          $(INC)config.h $(INC)artilist.h $(INC)qtext.h  $(LIBOPT)
  1599. X      $(CD) $(UTL)
  1600. X      $(MAKE)$(MAKEFLAGS) $(MAKEDEFS)
  1601. X***************
  1602. X*** 273,279 ****
  1603. X  termcap.obj :    $(TTY)termcap.c $(INC)hack.h $(INC)wintty.h $(INC)termcap.h
  1604. X  topl.obj :    $(TTY)topl.c $(INC)hack.h $(INC)termcap.h $(INC)wintty.h
  1605. X  wintty.obj :    $(TTY)wintty.c $(INC)hack.h $(INC)termcap.h $(INC)wintty.h
  1606. X! Window.obj :    $(X11)Window.c $(INC)WindowP.h
  1607. X  dialogs.obj :    $(X11)dialogs.c $(INC)config.h
  1608. X  winX.obj :    $(X11)winX.c $(INC)hack.h $(INC)winX.h \
  1609. X          $(X11)nh72icon $(X11)nh56icon $(X11)nh32icon
  1610. X--- 273,279 ----
  1611. X  termcap.obj :    $(TTY)termcap.c $(INC)hack.h $(INC)wintty.h $(INC)termcap.h
  1612. X  topl.obj :    $(TTY)topl.c $(INC)hack.h $(INC)termcap.h $(INC)wintty.h
  1613. X  wintty.obj :    $(TTY)wintty.c $(INC)hack.h $(INC)termcap.h $(INC)wintty.h
  1614. X! Window.obj :    $(X11)Window.c $(INC)WindowP.h $(INC)config.h
  1615. X  dialogs.obj :    $(X11)dialogs.c $(INC)config.h
  1616. X  winX.obj :    $(X11)winX.c $(INC)hack.h $(INC)winX.h \
  1617. X          $(X11)nh72icon $(X11)nh56icon $(X11)nh32icon
  1618. X***************
  1619. X*** 421,428 ****
  1620. X  $(INC)eshk.h :    $(INC)dungeon.h
  1621. X              $(TOUCH) $(INC)eshk.h
  1622. X  # ignore the non-VMS configuration headers
  1623. X! #$(INC)global.h :  $(INC)coord.h $(INC)vmsconf.h $(INC)unixconf.h $(INC)os2conf.h \
  1624. X! #           $(INC)pcconf.h $(INC)tosconf.h $(INC)amiconf.h $(INC)macconf.h
  1625. X  $(INC)global.h :  $(INC)coord.h $(INC)vmsconf.h
  1626. X              $(TOUCH) $(INC)global.h
  1627. X  $(INC)hack.h :    $(INC)config.h $(INC)dungeon.h $(INC)monsym.h $(INC)mkroom.h \
  1628. X--- 421,429 ----
  1629. X  $(INC)eshk.h :    $(INC)dungeon.h
  1630. X              $(TOUCH) $(INC)eshk.h
  1631. X  # ignore the non-VMS configuration headers
  1632. X! #$(INC)global.h :  $(INC)coord.h $(INC)vmsconf.h $(INC)unixconf.h \
  1633. X! #           $(INC)os2conf.h $(INC)pcconf.h $(INC)tosconf.h \
  1634. X! #           $(INC)amiconf.h $(INC)macconf.h $(INC)ntconf.h
  1635. X  $(INC)global.h :  $(INC)coord.h $(INC)vmsconf.h
  1636. X              $(TOUCH) $(INC)global.h
  1637. X  $(INC)hack.h :    $(INC)config.h $(INC)dungeon.h $(INC)monsym.h $(INC)mkroom.h \
  1638. X*** /tmp/da10022    Thu Feb 25 10:31:59 1993
  1639. X--- sys/vms/Makefile.utl    Wed Feb 24 09:37:38 1993
  1640. X***************
  1641. X*** 133,141 ****
  1642. X      $(LINK) $(LFLAGS) $(MAKEOBJS),$(VMSMAKEOBJS),$(LIBS)
  1643. X  
  1644. X  makedefs.obj :    $(INC)config.h $(INC)permonst.h $(INC)objclass.h \
  1645. X!         $(INC)monsym.h $(INC)artilist.h $(INC)qtext.h \
  1646. X!         $(INC)patchlevel.h
  1647. X!     $(CC) $(CFLAGS) makedefs.c
  1648. X  
  1649. X  $(INC)onames.h    : $(MAKEDEFS)
  1650. X      $(RUN) $(MAKEDEFS) -o
  1651. X--- 133,139 ----
  1652. X      $(LINK) $(LFLAGS) $(MAKEOBJS),$(VMSMAKEOBJS),$(LIBS)
  1653. X  
  1654. X  makedefs.obj :    $(INC)config.h $(INC)permonst.h $(INC)objclass.h \
  1655. X!         $(INC)monsym.h $(INC)artilist.h $(INC)qtext.h
  1656. X  
  1657. X  $(INC)onames.h    : $(MAKEDEFS)
  1658. X      $(RUN) $(MAKEDEFS) -o
  1659. X*** /tmp/da10054    Thu Feb 25 10:32:06 1993
  1660. X--- sys/vms/lev_lex.h    Sun Feb 21 16:29:50 1993
  1661. X***************
  1662. X*** 1,4 ****
  1663. X! /*       SCCS Id: @(#)lev_lex.h 3.1     92/01/10        */
  1664. X  /* "vms/lev_lex.h" copied into "util/stdio.h" for use by lev_lex.c only!
  1665. X   * This is an awful kludge to allow util/lev_lex.c to be compiled as is.
  1666. X   * It works because the actual setup of yyin & yyout is performed in
  1667. X--- 1,4 ----
  1668. X! /*    SCCS Id: @(#)lev_lex.h    3.1    93/02/07    */
  1669. X  /* "vms/lev_lex.h" copied into "util/stdio.h" for use by lev_lex.c only!
  1670. X   * This is an awful kludge to allow util/lev_lex.c to be compiled as is.
  1671. X   * It works because the actual setup of yyin & yyout is performed in
  1672. X***************
  1673. X*** 5,16 ****
  1674. X   * src/lev_main.c, where stdin & stdout are still correctly defined.
  1675. X   */
  1676. X  /* note for 3.1: also used with util/dgn_lex.c */
  1677. X- 
  1678. X- #ifdef __GNUC__
  1679. X- # ifndef CONST_OK
  1680. X- #  define const
  1681. X- # endif
  1682. X- #endif
  1683. X  
  1684. X  #include <stdio.h>
  1685. X  #ifdef stdin
  1686. X--- 5,10 ----
  1687. END_OF_FILE
  1688. if test 55621 -ne `wc -c <'patches01j'`; then
  1689.     echo shar: \"'patches01j'\" unpacked with wrong size!
  1690. fi
  1691. # end of 'patches01j'
  1692. echo shar: End of archive 5 \(of 31\).
  1693. cp /dev/null ark5isdone
  1694. MISSING=""
  1695. 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 31 ; do
  1696.     if test ! -f ark${I}isdone ; then
  1697.     MISSING="${MISSING} ${I}"
  1698.     fi
  1699. done
  1700. if test "${MISSING}" = "" ; then
  1701.     echo You have unpacked all 31 archives.
  1702.     echo "Now execute 'patchit.sh'"
  1703.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1704. else
  1705.     echo You still need to unpack the following archives:
  1706.     echo "        " ${MISSING}
  1707. fi
  1708. ##  End of shell archive.
  1709. exit 0
  1710.