home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / usenet / volume7 / nethack3 / patch3e < prev    next >
Encoding:
Internet Message Format  |  1989-09-11  |  58.1 KB

  1. Path: uunet!zephyr.ens.tek.com!tekgen!tekred!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v08i020:  NetHack3 -  display oriented dungeons & dragons (Ver. 3.0), Patch3e
  5. Message-ID: <4539@tekred.CNA.TEK.COM>
  6. Date: 7 Sep 89 21:51:14 GMT
  7. Sender: nobody@tekred.CNA.TEK.COM
  8. Lines: 2133
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
  12. Posting-number: Volume 8, Issue 20
  13. Archive-name: NetHack3/Patch3e
  14. Patch-To: NetHack3: Volume 7, Issue 56-93
  15.  
  16. #! /bin/sh
  17. # This is a shell archive.  Remove anything before this line, then unpack
  18. # it by saving it into a file and typing "sh file".  To overwrite existing
  19. # files, type "sh file -c".  You can also feed this as standard input via
  20. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  21. # will see the following message at the end:
  22. #        "End of archive 5 (of 6)."
  23. # Contents:  patch03e
  24. # Wrapped by billr@saab on Thu Sep  7 14:39:17 1989
  25. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  26. if test -f 'patch03e' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'patch03e'\"
  28. else
  29. echo shar: Extracting \"'patch03e'\" \(55646 characters\)
  30. sed "s/^X//" >'patch03e' <<'END_OF_FILE'
  31. X*** src/Old/mkroom.c    Wed Sep  6 16:34:25 1989
  32. X--- src/mkroom.c    Sat Aug 26 18:37:04 1989
  33. X***************
  34. X*** 237,243 ****
  35. X              break;
  36. X              case MORGUE:
  37. X              if(!rn2(5))
  38. X!                 (void) mk_tt_corpse(sx, sy);
  39. X              if(!rn2(10))    /* lots of treasure buried with dead */
  40. X                  (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST, sx, sy);
  41. X              break;
  42. X--- 237,243 ----
  43. X              break;
  44. X              case MORGUE:
  45. X              if(!rn2(5))
  46. X!                 (void) mk_tt_object(CORPSE, sx, sy);
  47. X              if(!rn2(10))    /* lots of treasure buried with dead */
  48. X                  (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST, sx, sy);
  49. X              break;
  50. X***************
  51. X*** 295,301 ****
  52. X          sroom->rtype = SWAMP;
  53. X          for(sx = sroom->lx; sx <= sroom->hx; sx++)
  54. X          for(sy = sroom->ly; sy <= sroom->hy; sy++)
  55. X!         if(levl[sx][sy].omask == 0 && levl[sx][sy].gmask == 0 &&
  56. X             levl[sx][sy].mmask == 0 &&
  57. X             !t_at(sx,sy) && !nexttodoor(sx,sy)) {
  58. X              if((sx+sy)%2) {
  59. X--- 295,301 ----
  60. X          sroom->rtype = SWAMP;
  61. X          for(sx = sroom->lx; sx <= sroom->hx; sx++)
  62. X          for(sy = sroom->ly; sy <= sroom->hy; sy++)
  63. X!         if(!OBJ_AT(sx, sy) && levl[sx][sy].gmask == 0 &&
  64. X             levl[sx][sy].mmask == 0 &&
  65. X             !t_at(sx,sy) && !nexttodoor(sx,sy)) {
  66. X              if((sx+sy)%2) {
  67. X***************
  68. X*** 333,343 ****
  69. X  
  70. X      yy -= dy;
  71. X      if(ACCESSIBLE(levl[xx-1][yy].typ))
  72. X!         (void) mkstatue(&mons[PM_FOREST_CENTAUR], xx-1, yy);
  73. X      if(ACCESSIBLE(levl[xx][yy].typ))
  74. X!         (void) mkstatue(&mons[PM_MOUNTAIN_CENTAUR], xx, yy);
  75. X      if(ACCESSIBLE(levl[xx+1][yy].typ))
  76. X!         (void) mkstatue(&mons[PM_PLAINS_CENTAUR], xx+1, yy);
  77. X  # ifdef FOUNTAINS
  78. X      mkfount(0,sroom);
  79. X  # endif
  80. X--- 333,343 ----
  81. X  
  82. X      yy -= dy;
  83. X      if(ACCESSIBLE(levl[xx-1][yy].typ))
  84. X!         (void) mkcorpstat(STATUE, &mons[PM_FOREST_CENTAUR], xx-1, yy);
  85. X      if(ACCESSIBLE(levl[xx][yy].typ))
  86. X!         (void) mkcorpstat(STATUE, &mons[PM_MOUNTAIN_CENTAUR], xx, yy);
  87. X      if(ACCESSIBLE(levl[xx+1][yy].typ))
  88. X!         (void) mkcorpstat(STATUE, &mons[PM_PLAINS_CENTAUR], xx+1, yy);
  89. X  # ifdef FOUNTAINS
  90. X      mkfount(0,sroom);
  91. X  # endif
  92. X*** src/Old/mon.c    Wed Sep  6 16:34:46 1989
  93. X--- src/mon.c    Fri Sep  1 19:53:54 1989
  94. X***************
  95. X*** 90,96 ****
  96. X          obj->owt = weight(obj);
  97. X          break;
  98. X          case PM_STONE_GOLEM:
  99. X!         obj = mkstatue(mdat, x, y);
  100. X          break;
  101. X          case PM_WOOD_GOLEM:
  102. X          pieces = d(2,4);
  103. X--- 90,96 ----
  104. X          obj->owt = weight(obj);
  105. X          break;
  106. X          case PM_STONE_GOLEM:
  107. X!         obj = mkcorpstat(STATUE, mdat, x, y);
  108. X          break;
  109. X          case PM_WOOD_GOLEM:
  110. X          pieces = d(2,4);
  111. X***************
  112. X*** 106,112 ****
  113. X          default:
  114. X          if (mdat->geno & G_NOCORPSE)
  115. X              return (struct obj *)0;
  116. X!         else obj = mkcorpse_at(mdat, x, y);
  117. X          break;
  118. X      }
  119. X      /* All special cases should precede the G_NOCORPSE check */
  120. X--- 106,112 ----
  121. X          default:
  122. X          if (mdat->geno & G_NOCORPSE)
  123. X              return (struct obj *)0;
  124. X!         else obj = mkcorpstat(CORPSE, mdat, x, y);
  125. X          break;
  126. X      }
  127. X      /* All special cases should precede the G_NOCORPSE check */
  128. X***************
  129. X*** 275,281 ****
  130. X      register struct obj *otmp;
  131. X  
  132. X      /* Eats gold if it is there */
  133. X!     while(gold = g_at(mtmp->mx, mtmp->my)){
  134. X          if (cansee(mtmp->mx, mtmp->my) && flags.verbose)
  135. X              pline("%s eats some gold!", Monnam(mtmp));
  136. X          mtmp->meating = (int)((gold->amount + 500L)/1000L);
  137. X--- 275,281 ----
  138. X      register struct obj *otmp;
  139. X  
  140. X      /* Eats gold if it is there */
  141. X!     if(gold = g_at(mtmp->mx, mtmp->my)){
  142. X          if (cansee(mtmp->mx, mtmp->my) && flags.verbose)
  143. X              pline("%s eats some gold!", Monnam(mtmp));
  144. X          mtmp->meating = (int)((gold->amount + 500L)/1000L);
  145. X***************
  146. X*** 287,293 ****
  147. X      /* Eats topmost metal object if it is there */
  148. X      for (otmp = fobj; otmp; otmp = otmp->nobj)
  149. X          if (otmp->ox == mtmp->mx && otmp->oy == mtmp->my &&
  150. X!         objects[otmp->otyp].oc_material == METAL) {
  151. X              if (cansee(mtmp->mx,mtmp->my) && flags.verbose)
  152. X              pline("%s eats %s!", Monnam(mtmp),
  153. X                  distant_name(otmp,doname));
  154. X--- 287,294 ----
  155. X      /* Eats topmost metal object if it is there */
  156. X      for (otmp = fobj; otmp; otmp = otmp->nobj)
  157. X          if (otmp->ox == mtmp->mx && otmp->oy == mtmp->my &&
  158. X!         objects[otmp->otyp].oc_material > WOOD &&
  159. X!         objects[otmp->otyp].oc_material < MINERAL) {
  160. X              if (cansee(mtmp->mx,mtmp->my) && flags.verbose)
  161. X              pline("%s eats %s!", Monnam(mtmp),
  162. X                  distant_name(otmp,doname));
  163. X***************
  164. X*** 299,313 ****
  165. X              mtmp->mhp += objects[otmp->otyp].oc_weight;
  166. X              if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax;
  167. X              }
  168. X!             if((uball && otmp == uball) ||
  169. X!                (uchain && otmp == uchain)) unpunish();
  170. X!             freeobj(otmp);
  171. X              /* Left behind a pile? */
  172. X              if(rnd(25) < 3) (void) mksobj_at(ROCK, mtmp->mx, mtmp->my);
  173. X              newsym(mtmp->mx, mtmp->my);
  174. X              break;
  175. X          }
  176. X-     set_omask(mtmp->mx, mtmp->my);
  177. X  }
  178. X  
  179. X  void
  180. X--- 300,317 ----
  181. X              mtmp->mhp += objects[otmp->otyp].oc_weight;
  182. X              if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax;
  183. X              }
  184. X!             if(otmp == uball) {
  185. X!             unpunish();
  186. X!             freeobj(otmp);
  187. X!             } else if(otmp == uchain)
  188. X!             unpunish();    /* frees uchain */
  189. X!             else
  190. X!             freeobj(otmp);
  191. X              /* Left behind a pile? */
  192. X              if(rnd(25) < 3) (void) mksobj_at(ROCK, mtmp->mx, mtmp->my);
  193. X              newsym(mtmp->mx, mtmp->my);
  194. X              break;
  195. X          }
  196. X  }
  197. X  
  198. X  void
  199. X***************
  200. X*** 317,323 ****
  201. X      register struct obj *otmp, *otmp2;
  202. X  
  203. X      /* Eats organic, glass, or wood objects if there */
  204. X!     /* Engulfs anything else, metal and rock */
  205. X      for (otmp = fobj; otmp; otmp = otmp2) {
  206. X          otmp2 = otmp->nobj;
  207. X          if (otmp->ox == mtmp->mx && otmp->oy == mtmp->my) {
  208. X--- 321,327 ----
  209. X      register struct obj *otmp, *otmp2;
  210. X  
  211. X      /* Eats organic, glass, or wood objects if there */
  212. X!     /* Engulfs others, except huge rocks and metal attached to player */
  213. X      for (otmp = fobj; otmp; otmp = otmp2) {
  214. X          otmp2 = otmp->nobj;
  215. X          if (otmp->ox == mtmp->mx && otmp->oy == mtmp->my) {
  216. X***************
  217. X*** 333,339 ****
  218. X              if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax;
  219. X              }
  220. X              delobj(otmp);        /* munch */
  221. X!         } else if (otmp->olet != ROCK_SYM && otmp->olet != BALL_SYM) {
  222. X              if (cansee(mtmp->mx, mtmp->my) && flags.verbose)
  223. X              pline("%s engulfs %s.", Monnam(mtmp),
  224. X                  distant_name(otmp,doname));
  225. X--- 337,344 ----
  226. X              if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax;
  227. X              }
  228. X              delobj(otmp);        /* munch */
  229. X!         } else if (otmp->olet != ROCK_SYM &&
  230. X!                     otmp != uball && otmp != uchain) {
  231. X              if (cansee(mtmp->mx, mtmp->my) && flags.verbose)
  232. X              pline("%s engulfs %s.", Monnam(mtmp),
  233. X                  distant_name(otmp,doname));
  234. X***************
  235. X*** 344,350 ****
  236. X          /* Engulf & devour is instant, so don't set meating */
  237. X          newsym(mtmp->mx, mtmp->my);
  238. X      }
  239. X-     set_omask(mtmp->mx, mtmp->my);
  240. X  }
  241. X  
  242. X  void
  243. X--- 349,354 ----
  244. X***************
  245. X*** 353,359 ****
  246. X  {
  247. X      register struct gold *gold;
  248. X  
  249. X!     while(gold = g_at(mtmp->mx, mtmp->my)){
  250. X          mtmp->mgold += gold->amount;
  251. X          if (cansee(mtmp->mx, mtmp->my) && flags.verbose)
  252. X              pline("%s picks up some gold.", Monnam(mtmp));
  253. X--- 357,363 ----
  254. X  {
  255. X      register struct gold *gold;
  256. X  
  257. X!     if(gold = g_at(mtmp->mx, mtmp->my)){
  258. X          mtmp->mgold += gold->amount;
  259. X          if (cansee(mtmp->mx, mtmp->my) && flags.verbose)
  260. X              pline("%s picks up some gold.", Monnam(mtmp));
  261. X***************
  262. X*** 361,367 ****
  263. X          if(levl[mtmp->mx][mtmp->my].scrsym == GOLD_SYM)
  264. X              newsym(mtmp->mx, mtmp->my);
  265. X      }
  266. X-     set_omask(mtmp->mx, mtmp->my);
  267. X  }
  268. X  
  269. X  /* Now includes giants which pick up enormous rocks.  KAA */
  270. X--- 365,370 ----
  271. X***************
  272. X*** 385,391 ****
  273. X          newsym(mtmp->mx, mtmp->my);
  274. X          return;    /* pick only one object */
  275. X            }
  276. X-     set_omask(mtmp->mx, mtmp->my);
  277. X  }
  278. X  
  279. X  int
  280. X--- 388,393 ----
  281. X***************
  282. X*** 474,480 ****
  283. X          mpickobj(mtmp, otmp);
  284. X          if(index(str, (char) levl[mtmp->mx][mtmp->my].scrsym))
  285. X              newsym(mtmp->mx, mtmp->my);
  286. X-         set_omask(mtmp->mx, mtmp->my);
  287. X          return;            /* pick only one object */
  288. X          }
  289. X  }
  290. X--- 476,481 ----
  291. X***************
  292. X*** 771,776 ****
  293. X--- 772,778 ----
  294. X              u.ux = mtmp->mx;
  295. X              u.uy = mtmp->my;
  296. X              u.uswallow = 0;
  297. X+             u.uswldtim = 0;
  298. X              setsee();
  299. X              docrt();
  300. X          }
  301. X***************
  302. X*** 1059,1073 ****
  303. X      mtmp->minvis = !!(mdat->mlet == S_STALKER);
  304. X      mtmp->mhide = !!hides_under(mdat);
  305. X      if (!mtmp->mhide) mtmp->mundetected = 0;
  306. X!     if (u.ustuck == mtmp
  307. X  #ifdef POLYSELF
  308. X!             && !sticks(uasmon)
  309. X  #endif
  310. X!             && !sticks(mdat))
  311. X!         u.ustuck = 0;
  312. X  #ifdef WORM
  313. X      if(mdat == &mons[PM_LONG_WORM] && getwn(mtmp)) initworm(mtmp);
  314. X-             /* perhaps we should clear mtmp->mtame here? */
  315. X  #endif
  316. X      unpmon(mtmp);    /* necessary for 'I' and to force pmon */
  317. X      pmon(mtmp);
  318. X--- 1061,1087 ----
  319. X      mtmp->minvis = !!(mdat->mlet == S_STALKER);
  320. X      mtmp->mhide = !!hides_under(mdat);
  321. X      if (!mtmp->mhide) mtmp->mundetected = 0;
  322. X!     if (u.ustuck == mtmp) {
  323. X!         if(u.uswallow) {
  324. X!             if(!attacktype(mdat,AT_ENGL)) {
  325. X!                 /* cf. digging out of monster with wand */
  326. X!                 You("break out of %s's stomach!",
  327. X!                     mon_nam(mtmp));
  328. X!                 mtmp->mhp = 1;    /* almost dead */
  329. X!                 regurgitates(mtmp);
  330. X!             }
  331. X!         } else {
  332. X!             if(!sticks(mdat)
  333. X  #ifdef POLYSELF
  334. X!                 && !sticks(uasmon)
  335. X  #endif
  336. X!                 )
  337. X!                 unstuck(mtmp);
  338. X!         }
  339. X!     }
  340. X! 
  341. X  #ifdef WORM
  342. X      if(mdat == &mons[PM_LONG_WORM] && getwn(mtmp)) initworm(mtmp);
  343. X  #endif
  344. X      unpmon(mtmp);    /* necessary for 'I' and to force pmon */
  345. X      pmon(mtmp);
  346. X*** src/Old/mondata.c    Wed Sep  6 16:35:40 1989
  347. X--- src/mondata.c    Sun Aug 20 14:26:12 1989
  348. X***************
  349. X*** 96,104 ****
  350. X  canseemon(mtmp)
  351. X      register struct monst *mtmp;
  352. X  {
  353. X!     return((!mtmp->minvis || See_invisible || Telepat)
  354. X          && (!mtmp->mhide ||
  355. X!             (levl[mtmp->mx][mtmp->my].omask == 0 &&
  356. X               levl[mtmp->mx][mtmp->my].gmask == 0))
  357. X          && cansee(mtmp->mx, mtmp->my));
  358. X  }
  359. X--- 96,104 ----
  360. X  canseemon(mtmp)
  361. X      register struct monst *mtmp;
  362. X  {
  363. X!     return((!mtmp->minvis || See_invisible)
  364. X          && (!mtmp->mhide ||
  365. X!             (!OBJ_AT(mtmp->mx, mtmp->my) &&
  366. X               levl[mtmp->mx][mtmp->my].gmask == 0))
  367. X          && cansee(mtmp->mx, mtmp->my));
  368. X  }
  369. X***************
  370. X*** 305,314 ****
  371. X  int little_to_big(montype)
  372. X  int montype;
  373. X  {
  374. X!     register int *i;
  375. X      
  376. X!     for(i=grownups[0]; *i >= 0; i++)
  377. X!         if(montype == *i) return *(i+1);
  378. X      return montype;
  379. X  }
  380. X  
  381. X--- 305,314 ----
  382. X  int little_to_big(montype)
  383. X  int montype;
  384. X  {
  385. X!     register int i;
  386. X      
  387. X!     for(i=0; grownups[i][0] >= 0; i++)
  388. X!         if(montype == grownups[i][0]) return grownups[i][1];
  389. X      return montype;
  390. X  }
  391. X  
  392. X***************
  393. X*** 315,324 ****
  394. X  int big_to_little(montype)
  395. X  int montype;
  396. X  {
  397. X!     register int *i;
  398. X      
  399. X!     for(i=grownups[0]; *i >= 0; i++)
  400. X!         if(montype == *(i+1)) return *i;
  401. X      return montype;
  402. X  }
  403. X  
  404. X--- 315,324 ----
  405. X  int big_to_little(montype)
  406. X  int montype;
  407. X  {
  408. X!     register int i;
  409. X      
  410. X!     for(i=0; grownups[i][0] >= 0; i++)
  411. X!         if(montype == grownups[i][1]) return grownups[i][0];
  412. X      return montype;
  413. X  }
  414. X  
  415. X*** src/Old/monmove.c    Wed Sep  6 16:36:09 1989
  416. X--- src/monmove.c    Sat Aug 26 16:47:10 1989
  417. X***************
  418. X*** 118,131 ****
  419. X              sobj_at(SCR_SCARE_MONSTER, x, y) != (struct obj *)0);
  420. X  }
  421. X  
  422. X  /* returns 1 if monster died moving, 0 otherwise */
  423. X  int
  424. X  dochug(mtmp)
  425. X!     register struct monst *mtmp;
  426. X  {
  427. X      register struct permonst *mdat = mtmp->data;
  428. X!     register int tmp=0, inrange, nearby, scared, seescaryx,
  429. X!         seescaryy;
  430. X  
  431. X  /*    Pre-movement adjustments    */
  432. X  
  433. X--- 118,176 ----
  434. X              sobj_at(SCR_SCARE_MONSTER, x, y) != (struct obj *)0);
  435. X  }
  436. X  
  437. X+ static void
  438. X+ distfleeck(mtmp,inrange,nearby,scared)
  439. X+ register struct monst *mtmp;
  440. X+ int *inrange, *nearby, *scared;
  441. X+ {
  442. X+     int seescaryx, seescaryy;
  443. X+ 
  444. X+     *inrange = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <=
  445. X+                             (BOLT_LIM * BOLT_LIM));
  446. X+     *nearby = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) < 3);
  447. X+ 
  448. X+     /* Note: if your image is displaced, the monster sees the Elbereth
  449. X+      * at your displaced position, thus never attacking your displaced
  450. X+      * position, but possibly attacking you by accident.  If you are
  451. X+      * invisible, it sees the Elbereth at your real position, thus never
  452. X+      * running into you by accident but possibly attacking the spot
  453. X+      * where it guesses you are.
  454. X+      */
  455. X+     if (Invis && !perceives(mtmp->data)) {
  456. X+         seescaryx = mtmp->mux;
  457. X+         seescaryy = mtmp->muy;
  458. X+     } else {
  459. X+         seescaryx = u.ux;
  460. X+         seescaryy = u.uy;
  461. X+     }
  462. X+     *scared = (*nearby && onscary(seescaryx, seescaryy, mtmp));
  463. X+ 
  464. X+     if(*scared && !mtmp->mflee) {
  465. X+ #ifdef POLYSELF
  466. X+         if (!sticks(uasmon))
  467. X+ #endif
  468. X+             unstuck(mtmp);    /* monster lets go when fleeing */
  469. X+         mtmp->mflee = 1;
  470. X+ #ifdef STUPID
  471. X+         if (rn2(7))
  472. X+             mtmp->mfleetim = rnd(10);
  473. X+         else
  474. X+             mtmp->mfleetim = rnd(100);
  475. X+ #else
  476. X+         mtmp->mfleetim = (rn2(7) ? rnd(10) : rnd(100));
  477. X+ #endif
  478. X+     }
  479. X+ 
  480. X+ }
  481. X+ 
  482. X  /* returns 1 if monster died moving, 0 otherwise */
  483. X  int
  484. X  dochug(mtmp)
  485. X! register struct monst *mtmp;
  486. X  {
  487. X      register struct permonst *mdat = mtmp->data;
  488. X!     register int tmp=0;
  489. X!     int inrange, nearby, scared;
  490. X  
  491. X  /*    Pre-movement adjustments    */
  492. X  
  493. X***************
  494. X*** 179,218 ****
  495. X      if(mtmp->iswiz)
  496. X          (void) wiz_get_amulet(mtmp);
  497. X  
  498. X!     inrange = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <=
  499. X!                             (BOLT_LIM * BOLT_LIM));
  500. X!     nearby = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) < 3);
  501. X!     /* Note: if your image is displaced, the monster sees the Elbereth
  502. X!      * at your displaced position, thus never attacking your displaced
  503. X!      * position, but possibly attacking you by accident.  If you are
  504. X!      * invisible, it sees the Elbereth at your real position, thus never
  505. X!      * running into you by accident but possibly attacking the spot
  506. X!      * where it guesses you are.
  507. X!      */
  508. X!     if (Invis && !perceives(mdat)) {
  509. X!         seescaryx = mtmp->mux;
  510. X!         seescaryy = mtmp->muy;
  511. X!     } else {
  512. X!         seescaryx = u.ux;
  513. X!         seescaryy = u.uy;
  514. X!     }
  515. X!     scared = (nearby && onscary(seescaryx, seescaryy, mtmp));
  516. X! 
  517. X!     if(scared && !mtmp->mflee) {
  518. X! #ifdef POLYSELF
  519. X!         if (!sticks(uasmon))
  520. X! #endif
  521. X!             unstuck(mtmp);    /* monster lets go when fleeing */
  522. X!         mtmp->mflee = 1;
  523. X! #ifdef STUPID
  524. X!         if (rn2(7))
  525. X!             mtmp->mfleetim = rnd(10);
  526. X!         else
  527. X!             mtmp->mfleetim = rnd(100);
  528. X! #else
  529. X!         mtmp->mfleetim = (rn2(7) ? rnd(10) : rnd(100));
  530. X! #endif
  531. X!     }
  532. X  
  533. X  #ifdef HARD    /* Demonic Blackmail!!! */
  534. X      if(nearby && is_demon(mdat) && mtmp->mpeaceful && !mtmp->mtame) {
  535. X--- 224,231 ----
  536. X      if(mtmp->iswiz)
  537. X          (void) wiz_get_amulet(mtmp);
  538. X  
  539. X!     /* check distance and scariness of attacks */
  540. X!     distfleeck(mtmp,&inrange,&nearby,&scared);
  541. X  
  542. X  #ifdef HARD    /* Demonic Blackmail!!! */
  543. X      if(nearby && is_demon(mdat) && mtmp->mpeaceful && !mtmp->mtame) {
  544. X***************
  545. X*** 245,252 ****
  546. X         (!mtmp->mcansee && !rn2(4)) || mtmp->mpeaceful) {
  547. X  
  548. X          tmp = m_move(mtmp, 0);
  549. X!         nearby = (dist(mtmp->mx, mtmp->my) < 3);    /* recalc */
  550. X!         scared = (nearby && onscary(seescaryx, seescaryy, mtmp));
  551. X          switch (tmp) {
  552. X  
  553. X              case 0:    /* no movement, but it can still attack you */
  554. X--- 258,265 ----
  555. X         (!mtmp->mcansee && !rn2(4)) || mtmp->mpeaceful) {
  556. X  
  557. X          tmp = m_move(mtmp, 0);
  558. X!         distfleeck(mtmp,&inrange,&nearby,&scared);    /* recalc */
  559. X! 
  560. X          switch (tmp) {
  561. X  
  562. X              case 0:    /* no movement, but it can still attack you */
  563. X***************
  564. X*** 264,283 ****
  565. X               case 2:    /* monster died */
  566. X               return(1);
  567. X           }
  568. X- 
  569. X-         inrange = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <=
  570. X-                             (BOLT_LIM * BOLT_LIM));
  571. X-         if(scared && !mtmp->mflee) {
  572. X-             mtmp->mflee = 1;
  573. X- #ifdef STUPID
  574. X-             if (rn2(7))
  575. X-                 mtmp->mfleetim = rnd(10);
  576. X-             else
  577. X-                 mtmp->mfleetim = rnd(100);
  578. X- #else
  579. X-             mtmp->mfleetim = (rn2(7) ? rnd(10) : rnd(100));
  580. X- #endif
  581. X-         }
  582. X      }
  583. X  
  584. X  /*    Now, attack the player if possible - one attack set per monst    */
  585. X--- 277,282 ----
  586. X***************
  587. X*** 340,346 ****
  588. X          if(i == 1) return(0);    /* still in trap, so didn't move */
  589. X      }
  590. X      if(mtmp->mhide &&
  591. X!        (levl[mtmp->mx][mtmp->my].omask || levl[mtmp->mx][mtmp->my].gmask) &&
  592. X         rn2(10))
  593. X          return(0);        /* do not leave hiding place */
  594. X      if(mtmp->meating) {
  595. X--- 339,345 ----
  596. X          if(i == 1) return(0);    /* still in trap, so didn't move */
  597. X      }
  598. X      if(mtmp->mhide &&
  599. X!        (OBJ_AT(mtmp->mx, mtmp->my) || levl[mtmp->mx][mtmp->my].gmask) &&
  600. X         rn2(10))
  601. X          return(0);        /* do not leave hiding place */
  602. X      if(mtmp->meating) {
  603. X***************
  604. X*** 662,668 ****
  605. X          if(ptr == &mons[PM_ROCK_MOLE]) meatgold(mtmp);
  606. X          if(likegold && (!abstain || !rn2(10))) mpickgold(mtmp);
  607. X          }
  608. X!         if(levl[mtmp->mx][mtmp->my].omask == 1) {
  609. X          /* Maybe a rock mole just ate some metal object */
  610. X          if(ptr == &mons[PM_ROCK_MOLE]) meatgold(mtmp);
  611. X          /* Maybe a cube ate just about anything */
  612. X--- 661,667 ----
  613. X          if(ptr == &mons[PM_ROCK_MOLE]) meatgold(mtmp);
  614. X          if(likegold && (!abstain || !rn2(10))) mpickgold(mtmp);
  615. X          }
  616. X!         if(OBJ_AT(mtmp->mx, mtmp->my)) {
  617. X          /* Maybe a rock mole just ate some metal object */
  618. X          if(ptr == &mons[PM_ROCK_MOLE]) meatgold(mtmp);
  619. X          /* Maybe a cube ate just about anything */
  620. X***************
  621. X*** 675,681 ****
  622. X              if(likerock || likegems) mpickgems(mtmp);
  623. X          }
  624. X          }
  625. X!         if(mtmp->mhide) mtmp->mundetected = (levl[mtmp->mx][mtmp->my].omask
  626. X                      || levl[mtmp->mx][mtmp->my].gmask);
  627. X  
  628. X          /* set also in domove(), hack.c */
  629. X--- 674,680 ----
  630. X              if(likerock || likegems) mpickgems(mtmp);
  631. X          }
  632. X          }
  633. X!         if(mtmp->mhide) mtmp->mundetected = (OBJ_AT(mtmp->mx, mtmp->my)
  634. X                      || levl[mtmp->mx][mtmp->my].gmask);
  635. X  
  636. X          /* set also in domove(), hack.c */
  637. X*** src/Old/monst.c    Wed Sep  6 16:36:54 1989
  638. X--- src/monst.c    Wed Sep  6 16:08:22 1989
  639. X***************
  640. X*** 72,83 ****
  641. X        M2_WANDER | M2_NOLIMBS | M2_AMORPHOUS },
  642. X      { "gelatinous cube", S_BLOB, 6, 6, 8, 0, 0, (G_GENO | 2),
  643. X        { { AT_TUCH, AD_PLYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  644. X!       10, 100, 0, MS_SILENT, M1_BIG | M1_NOEYES | M1_NOHANDS |
  645. X        M1_FIRE_RES | M1_COLD_RES | M1_ELEC_RES | M1_SLEE_RES,
  646. X        M2_WANDER | M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE },
  647. X      { "quivering blob", S_BLOB, 5, 1, 8, 0, 0, (G_GENO | 2),
  648. X        { { AT_TUCH, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  649. X!       10, 100, 0, MS_SILENT, M1_NOEYES | M1_NOHANDS | M1_POIS_RES,
  650. X        M2_WANDER | M2_HOSTILE | M2_NOLIMBS },
  651. X  /*    cockatrice    */
  652. X      { "cockatrice", S_COCKATRICE, 5, 6, 6, 30, 0, (G_GENO | 5),
  653. X--- 72,83 ----
  654. X        M2_WANDER | M2_NOLIMBS | M2_AMORPHOUS },
  655. X      { "gelatinous cube", S_BLOB, 6, 6, 8, 0, 0, (G_GENO | 2),
  656. X        { { AT_TUCH, AD_PLYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  657. X!       30, 300, 0, MS_SILENT, M1_BIG | M1_NOEYES | M1_NOHANDS |
  658. X        M1_FIRE_RES | M1_COLD_RES | M1_ELEC_RES | M1_SLEE_RES,
  659. X        M2_WANDER | M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE },
  660. X      { "quivering blob", S_BLOB, 5, 1, 8, 0, 0, (G_GENO | 2),
  661. X        { { AT_TUCH, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },
  662. X!       20, 200, 0, MS_SILENT, M1_NOEYES | M1_NOHANDS | M1_POIS_RES,
  663. X        M2_WANDER | M2_HOSTILE | M2_NOLIMBS },
  664. X  /*    cockatrice    */
  665. X      { "cockatrice", S_COCKATRICE, 5, 6, 6, 30, 0, (G_GENO | 5),
  666. X***************
  667. X*** 897,903 ****
  668. X        { { AT_WEAP, AD_SLEE, 1, 8 }, { AT_CLAW, AD_DREN, 0, 0 },
  669. X          NO_ATTK, NO_ATTK, NO_ATTK },
  670. X        35, 200, 0, MS_SILENT, M1_HUMANOID | M1_POIS | M1_COLLECT,
  671. X!       M2_HOSTILE | M2_HUMAN },
  672. X  /*    Rust Monster    */
  673. X      { "rust monster", S_RUSTMONST, 5, 18, 2, 0, 0, (G_GENO | 2),
  674. X        { { AT_TUCH, AD_RUST, 0, 0 }, { AT_TUCH, AD_RUST, 0, 0 }, NO_ATTK,
  675. X--- 897,903 ----
  676. X        { { AT_WEAP, AD_SLEE, 1, 8 }, { AT_CLAW, AD_DREN, 0, 0 },
  677. X          NO_ATTK, NO_ATTK, NO_ATTK },
  678. X        35, 200, 0, MS_SILENT, M1_HUMANOID | M1_POIS | M1_COLLECT,
  679. X!       M2_HOSTILE },
  680. X  /*    Rust Monster    */
  681. X      { "rust monster", S_RUSTMONST, 5, 18, 2, 0, 0, (G_GENO | 2),
  682. X        { { AT_TUCH, AD_RUST, 0, 0 }, { AT_TUCH, AD_RUST, 0, 0 }, NO_ATTK,
  683. X*** src/Old/mthrowu.c    Wed Sep  6 16:38:45 1989
  684. X--- src/mthrowu.c    Sun Aug 20 14:26:18 1989
  685. X***************
  686. X*** 75,86 ****
  687. X          create = !rn2(3);
  688. X      else create = 1;
  689. X      if (create && !flooreffects(obj,x,y)) {
  690. X!         obj->ox = x;
  691. X!         obj->oy = y;
  692. X          obj->nobj = fobj;
  693. X          fobj = obj;
  694. X          stackobj(fobj);
  695. X-         levl[x][y].omask = 1;
  696. X      } else free((genericptr_t)obj);
  697. X  }
  698. X  
  699. X--- 75,84 ----
  700. X          create = !rn2(3);
  701. X      else create = 1;
  702. X      if (create && !flooreffects(obj,x,y)) {
  703. X!         place_object(obj, x, y);
  704. X          obj->nobj = fobj;
  705. X          fobj = obj;
  706. X          stackobj(fobj);
  707. X      } else free((genericptr_t)obj);
  708. X  }
  709. X  
  710. X***************
  711. X*** 111,123 ****
  712. X          tmp_at(-3, (int)AT_OBJ);
  713. X      }
  714. X      while(range-- > 0) { /* Actually the loop is always exited by break */
  715. X          bhitpos.x += dx;
  716. X          bhitpos.y += dy;
  717. X          if(levl[bhitpos.x][bhitpos.y].mmask) {
  718. X              mtmp = m_at(bhitpos.x,bhitpos.y);
  719. X  
  720. X              if(mtmp->data->ac + 8 + obj->spe <= rnd(20)) {
  721. X!             miss(distant_name(singleobj,xname), mtmp);
  722. X              if (!range) { /* Last position; object drops */
  723. X                  drop_throw(singleobj, 0, mtmp->mx, mtmp->my);
  724. X                  break;
  725. X--- 109,125 ----
  726. X          tmp_at(-3, (int)AT_OBJ);
  727. X      }
  728. X      while(range-- > 0) { /* Actually the loop is always exited by break */
  729. X+         boolean vis;
  730. X+ 
  731. X          bhitpos.x += dx;
  732. X          bhitpos.y += dy;
  733. X+         vis = cansee(bhitpos.x, bhitpos.y);
  734. X          if(levl[bhitpos.x][bhitpos.y].mmask) {
  735. X              mtmp = m_at(bhitpos.x,bhitpos.y);
  736. X  
  737. X              if(mtmp->data->ac + 8 + obj->spe <= rnd(20)) {
  738. X!             if (!vis) pline("It is missed.");
  739. X!             else miss(distant_name(singleobj,xname), mtmp);
  740. X              if (!range) { /* Last position; object drops */
  741. X                  drop_throw(singleobj, 0, mtmp->mx, mtmp->my);
  742. X                  break;
  743. X***************
  744. X*** 127,141 ****
  745. X              if (damage < 1) damage = 1;
  746. X              if (obj->otyp==ACID_VENOM && resists_acid(mtmp->data))
  747. X                  damage = 0;
  748. X!             hit(distant_name(singleobj,xname), mtmp,exclam(damage));
  749. X              if (obj->opoisoned) {
  750. X!                 if (resists_poison(mtmp->data))
  751. X!                 kludge("The poison doesn't seem to affect %s.",
  752. X                                  mon_nam(mtmp));
  753. X!                 else {
  754. X                  if (rn2(30)) damage += rnd(6);
  755. X                  else {
  756. X!                     pline("The poison was deadly...");
  757. X                      damage = mtmp->mhp;
  758. X                  }
  759. X                  }
  760. X--- 129,147 ----
  761. X              if (damage < 1) damage = 1;
  762. X              if (obj->otyp==ACID_VENOM && resists_acid(mtmp->data))
  763. X                  damage = 0;
  764. X!             if (!vis) pline("It is hit%s", exclam(damage));
  765. X!             else hit(distant_name(singleobj,xname),
  766. X!                             mtmp,exclam(damage));
  767. X              if (obj->opoisoned) {
  768. X!                 if (resists_poison(mtmp->data)) {
  769. X!                 if (vis)
  770. X!                   pline("The poison doesn't seem to affect %s.",
  771. X                                  mon_nam(mtmp));
  772. X!                 } else {
  773. X                  if (rn2(30)) damage += rnd(6);
  774. X                  else {
  775. X!                     if (vis)
  776. X!                     pline("The poison was deadly...");
  777. X                      damage = mtmp->mhp;
  778. X                  }
  779. X                  }
  780. X***************
  781. X*** 142,161 ****
  782. X              }
  783. X              if (obj->otyp==ACID_VENOM && cansee(mtmp->mx,mtmp->my)){
  784. X                  if (resists_acid(mtmp->data)) {
  785. X!                 pline("%s is unaffected.", Monnam(mtmp));
  786. X                  damage = 0;
  787. X!                 } else pline("The acid burns %s!", mon_nam(mtmp));
  788. X              }
  789. X              mtmp->mhp -= damage;
  790. X              if(mtmp->mhp < 1) {
  791. X!                 if (cansee(mtmp->mx, mtmp->my))
  792. X!                 pline("%s is killed!", Monnam(mtmp));
  793. X                  mondied(mtmp);
  794. X              }
  795. X  
  796. X              if((obj->otyp == CREAM_PIE) ||
  797. X                 (obj->otyp == BLINDING_VENOM)) {
  798. X!                 if (cansee(mtmp->mx, mtmp->my))
  799. X                  pline("%s is blinded by the %s.",
  800. X                        Monnam(mtmp), xname(singleobj));
  801. X                  if(mtmp->msleep) mtmp->msleep = 0;
  802. X--- 148,169 ----
  803. X              }
  804. X              if (obj->otyp==ACID_VENOM && cansee(mtmp->mx,mtmp->my)){
  805. X                  if (resists_acid(mtmp->data)) {
  806. X!                 pline("%s is unaffected.", vis ? Monnam(mtmp)
  807. X!                     : "It");
  808. X                  damage = 0;
  809. X!                 } else if (vis)
  810. X!                 pline("The acid burns %s!", mon_nam(mtmp));
  811. X!                 else pline("It is burned!");
  812. X              }
  813. X              mtmp->mhp -= damage;
  814. X              if(mtmp->mhp < 1) {
  815. X!                 pline("%s is killed!", vis ? Monnam(mtmp) : "It");
  816. X                  mondied(mtmp);
  817. X              }
  818. X  
  819. X              if((obj->otyp == CREAM_PIE) ||
  820. X                 (obj->otyp == BLINDING_VENOM)) {
  821. X!                 if (vis)
  822. X                  pline("%s is blinded by the %s.",
  823. X                        Monnam(mtmp), xname(singleobj));
  824. X                  if(mtmp->msleep) mtmp->msleep = 0;
  825. X***************
  826. X*** 277,282 ****
  827. X--- 285,305 ----
  828. X          if(!URETREATING(x,y) ||
  829. X             !rn2(BOLT_LIM-movedist(x,mtmp->mux,y,mtmp->muy)))
  830. X          {
  831. X+             int savequan = otmp->quan;
  832. X+             char *verb = "throws";
  833. X+ 
  834. X+             if (otmp->otyp == ARROW
  835. X+ #ifdef TOLKIEN
  836. X+             || otmp->otyp == ELVEN_ARROW
  837. X+             || otmp->otyp == ORCISH_ARROW
  838. X+ #endif
  839. X+             || otmp->otyp == CROSSBOW_BOLT) verb = "shoots";
  840. X+             otmp->quan = 1;
  841. X+             if (canseemon(mtmp))
  842. X+             pline("%s %s a%s %s!", Monnam(mtmp), verb,
  843. X+                 index(vowels,*(xname(otmp))) ? "n" : "",
  844. X+                 xname(otmp));
  845. X+             otmp->quan = savequan;
  846. X              m_throw(mtmp->mx, mtmp->my, sgn(tbx), sgn(tby), 
  847. X              movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy), otmp);
  848. X              if (!otmp->quan) m_useup(mtmp, otmp);
  849. X***************
  850. X*** 308,314 ****
  851. X           * attack...
  852. X           */
  853. X          if(!rn2(BOLT_LIM-movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy))) {
  854. X! 
  855. X              m_throw(mtmp->mx, mtmp->my, sgn(tbx), sgn(tby), 
  856. X              movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy), otmp);
  857. X              nomul(0);
  858. X--- 331,338 ----
  859. X           * attack...
  860. X           */
  861. X          if(!rn2(BOLT_LIM-movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy))) {
  862. X!             if (canseemon(mtmp))
  863. X!             pline("%s spits venom!", Monnam(mtmp));
  864. X              m_throw(mtmp->mx, mtmp->my, sgn(tbx), sgn(tby), 
  865. X              movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy), otmp);
  866. X              nomul(0);
  867. X*** src/Old/o_init.c    Wed Sep  6 15:52:19 1989
  868. X--- src/o_init.c    Fri Sep  1 13:27:18 1989
  869. X***************
  870. X*** 219,225 ****
  871. X      mread(fd, (genericptr_t) bases, sizeof bases);
  872. X      mread(fd, (genericptr_t) disco, sizeof disco);
  873. X      mread(fd, (genericptr_t) objects, sizeof(struct objclass) * TOTAL_OBJS);
  874. X! #ifndef MSDOS
  875. X      differ = (genericptr_t)&objects[0] - (genericptr_t)then;
  876. X  #else
  877. X      differ = (long)&objects[0] - (long)then;
  878. X--- 219,225 ----
  879. X      mread(fd, (genericptr_t) bases, sizeof bases);
  880. X      mread(fd, (genericptr_t) disco, sizeof disco);
  881. X      mread(fd, (genericptr_t) objects, sizeof(struct objclass) * TOTAL_OBJS);
  882. X! #if !defined(MSDOS) && !defined(M_XENIX)
  883. X      differ = (genericptr_t)&objects[0] - (genericptr_t)then;
  884. X  #else
  885. X      differ = (long)&objects[0] - (long)then;
  886. X***************
  887. X*** 226,232 ****
  888. X  #endif
  889. X      for(i=0; i < TOTAL_OBJS; i++) {
  890. X          if (objects[i].oc_name) {
  891. X! #ifndef MSDOS
  892. X              objects[i].oc_name += differ;
  893. X  #else
  894. X              objects[i].oc_name =
  895. X--- 226,232 ----
  896. X  #endif
  897. X      for(i=0; i < TOTAL_OBJS; i++) {
  898. X          if (objects[i].oc_name) {
  899. X! #if !defined(MSDOS) && !defined(M_XENIX)
  900. X              objects[i].oc_name += differ;
  901. X  #else
  902. X              objects[i].oc_name =
  903. X***************
  904. X*** 234,240 ****
  905. X  #endif
  906. X          }
  907. X          if (objects[i].oc_descr) {
  908. X! #ifndef MSDOS
  909. X              objects[i].oc_descr += differ;
  910. X  #else
  911. X              objects[i].oc_descr =
  912. X--- 234,240 ----
  913. X  #endif
  914. X          }
  915. X          if (objects[i].oc_descr) {
  916. X! #if !defined(MSDOS) && !defined(M_XENIX)
  917. X              objects[i].oc_descr += differ;
  918. X  #else
  919. X              objects[i].oc_descr =
  920. X*** src/Old/objnam.c    Wed Sep  6 15:53:23 1989
  921. X--- src/objnam.c    Tue Sep  5 21:35:34 1989
  922. X***************
  923. X*** 6,11 ****
  924. X--- 6,12 ----
  925. X  #include <ctype.h>    /* for isalpha() */
  926. X  
  927. X  #define    PREFIX    30
  928. X+ #define SCHAR_MAX 127
  929. X  
  930. X  /*    We want the player to be able to learn what key goes in what lock.  */
  931. X  const char *keystr[N_LOX] = { "round", "square", "triangular", "oval",
  932. X***************
  933. X*** 830,839 ****
  934. X  #ifdef TUTTI_FRUTTI
  935. X      struct fruit *f;
  936. X      int ftype = current_fruit;
  937. X- #endif
  938. X-     char let;
  939. X-     char *un, *dn, *an;
  940. X-     char *name=0;
  941. X      char fruitbuf[BUFSZ];
  942. X      /* We want to check for fruits last so that, for example, someone
  943. X       * who names their fruit "katana" and wishes for a katana gets a real
  944. X--- 831,836 ----
  945. X***************
  946. X*** 840,845 ****
  947. X--- 837,846 ----
  948. X       * one.  But, we have to keep around the old buf since in the meantime
  949. X       * we have deleted "empty", "+6", etc...
  950. X       */
  951. X+ #endif
  952. X+     char let;
  953. X+     char *un, *dn, *an;
  954. X+     char *name=0;
  955. X  #ifdef WIZARD
  956. X      int fake=0;
  957. X  #endif
  958. X***************
  959. X*** 886,892 ****
  960. X--- 887,895 ----
  961. X          } else break;
  962. X      }
  963. X      if(!cnt) cnt = 1;        /* %% what with "gems" etc. ? */
  964. X+ #ifdef TUTTI_FRUTTI
  965. X      Strcpy(fruitbuf, bp);
  966. X+ #endif
  967. X      if(!strncmp(bp, "empty ", 6)) {
  968. X          contents = EMPTY;
  969. X          bp += 6;
  970. X***************
  971. X*** 922,927 ****
  972. X--- 925,942 ----
  973. X              }
  974. X          }
  975. X      }
  976. X+ /*
  977. X+    otmp->spe is type schar; so we don't want spe to be any bigger or smaller.
  978. X+    also, spe should always be positive  -- some cheaters may try to confuse
  979. X+    atoi()
  980. X+ */
  981. X+     if (spe < 0) {
  982. X+         spesgn = -1;    /* cheaters get what they deserve */
  983. X+         spe = abs(spe);
  984. X+     }
  985. X+     if (spe > SCHAR_MAX)
  986. X+         spe = SCHAR_MAX;
  987. X+ 
  988. X      /* now we have the actual name, as delivered by xname, say
  989. X          green potions called whisky
  990. X          scrolls labeled "QWERTY"
  991. X***************
  992. X*** 1288,1294 ****
  993. X          if (spe > otmp->spe) spe = otmp->spe;
  994. X      }
  995. X  
  996. X!     if (spesgn == -1) spe = -spe;
  997. X  
  998. X      /* set otmp->spe.  This may, or may not, use spe... */
  999. X      switch (typ) {
  1000. X--- 1303,1309 ----
  1001. X          if (spe > otmp->spe) spe = otmp->spe;
  1002. X      }
  1003. X  
  1004. X!     if (spesgn == -1 && spe > 0) spe = -spe;
  1005. X  
  1006. X      /* set otmp->spe.  This may, or may not, use spe... */
  1007. X      switch (typ) {
  1008. X***************
  1009. X*** 1322,1331 ****
  1010. X              break;
  1011. X          case WAN_WISHING:
  1012. X  #ifdef WIZARD
  1013. X!             if (!wizard)
  1014. X  #endif
  1015. X!                 otmp->spe = (rn2(10) ? -1 : 0); break;
  1016. X              /* fall through, if wizard */
  1017. X          default: otmp->spe = spe;
  1018. X      }
  1019. X  
  1020. X--- 1337,1360 ----
  1021. X              break;
  1022. X          case WAN_WISHING:
  1023. X  #ifdef WIZARD
  1024. X!             if (!wizard) {
  1025. X  #endif
  1026. X!                 otmp->spe = (rn2(10) ? -1 : 0);
  1027. X!                 break;
  1028. X! #ifdef WIZARD
  1029. X!             }
  1030. X!             /* fall through (twice), if wizard */
  1031. X! #endif
  1032. X!         case MAGIC_LAMP:
  1033. X! #ifdef WIZARD
  1034. X!             if (!wizard) {
  1035. X! #endif
  1036. X!                 otmp->spe = 0;
  1037. X!                 break;
  1038. X! #ifdef WIZARD
  1039. X!             }
  1040. X              /* fall through, if wizard */
  1041. X+ #endif
  1042. X          default: otmp->spe = spe;
  1043. X      }
  1044. X  
  1045. X***************
  1046. X*** 1338,1349 ****
  1047. X                  otmp->corpsenm = mntmp;
  1048. X              break;
  1049. X          case FIGURINE:
  1050. X!             if (!is_dlord(&mons[mntmp]) && !is_dprince(&mons[mntmp])
  1051. X!                     && !is_human(&mons[mntmp])
  1052. X! #ifdef WORM
  1053. X!                     && mntmp != PM_LONG_WORM
  1054. X! #endif
  1055. X!                     )
  1056. X                  otmp->corpsenm = mntmp;
  1057. X              break;
  1058. X          case EGG: if (lays_eggs(&mons[mntmp]) || mntmp==PM_KILLER_BEE)
  1059. X--- 1367,1374 ----
  1060. X                  otmp->corpsenm = mntmp;
  1061. X              break;
  1062. X          case FIGURINE:
  1063. X!             if (!(mons[mntmp].geno & G_UNIQ)
  1064. X!                 && !is_human(&mons[mntmp]))
  1065. X                  otmp->corpsenm = mntmp;
  1066. X              break;
  1067. X          case EGG: if (lays_eggs(&mons[mntmp]) || mntmp==PM_KILLER_BEE)
  1068. X*** src/Old/options.c    Wed Sep  6 15:54:14 1989
  1069. X--- src/options.c    Thu Aug 31 20:16:21 1989
  1070. X***************
  1071. X*** 131,144 ****
  1072. X  }
  1073. X  
  1074. X  void
  1075. X  parseoptions(opts, from_env)
  1076. X  register char *opts;
  1077. X  boolean from_env;
  1078. X  {
  1079. X      register char *op;
  1080. X- /*
  1081. X-     register char *op2;
  1082. X- */
  1083. X      unsigned num;
  1084. X      boolean negated;
  1085. X  
  1086. X--- 131,192 ----
  1087. X  }
  1088. X  
  1089. X  void
  1090. X+ assign_graphics(graph_ints,glth)
  1091. X+ register unsigned int *graph_ints;
  1092. X+ register int glth;
  1093. X+ {
  1094. X+ #define SETPCHAR(f, n)    showsyms.f = (glth > n) ? graph_ints[n] : defsyms.f
  1095. X+     SETPCHAR(stone, 0);
  1096. X+     SETPCHAR(vwall, 1);
  1097. X+     SETPCHAR(hwall, 2);
  1098. X+     SETPCHAR(tlcorn, 3);
  1099. X+     SETPCHAR(trcorn, 4);
  1100. X+     SETPCHAR(blcorn, 5);
  1101. X+     SETPCHAR(brcorn, 6);
  1102. X+     SETPCHAR(crwall, 7);
  1103. X+     SETPCHAR(tuwall, 8);
  1104. X+     SETPCHAR(tdwall, 9);
  1105. X+     SETPCHAR(tlwall, 10);
  1106. X+     SETPCHAR(trwall, 11);
  1107. X+     SETPCHAR(vbeam, 12);
  1108. X+     SETPCHAR(hbeam, 13);
  1109. X+     SETPCHAR(lslant, 14);
  1110. X+     SETPCHAR(rslant, 15);
  1111. X+     SETPCHAR(door, 16);
  1112. X+     SETPCHAR(room, 17);
  1113. X+     SETPCHAR(corr, 18);
  1114. X+     SETPCHAR(upstair, 19);
  1115. X+     SETPCHAR(dnstair, 20);
  1116. X+     SETPCHAR(trap, 21);
  1117. X+     SETPCHAR(web, 22);
  1118. X+     SETPCHAR(pool, 23);
  1119. X+ #ifdef FOUNTAINS
  1120. X+     SETPCHAR(fountain, 24);
  1121. X+ #endif
  1122. X+ #ifdef SINKS
  1123. X+     SETPCHAR(sink, 25);
  1124. X+ #endif
  1125. X+ #ifdef THRONES
  1126. X+     SETPCHAR(throne, 26);
  1127. X+ #endif
  1128. X+ #ifdef ALTARS
  1129. X+     SETPCHAR(altar, 27);
  1130. X+ #endif
  1131. X+ #ifdef STRONGHOLD
  1132. X+     SETPCHAR(upladder, 28);
  1133. X+     SETPCHAR(dnladder, 29);
  1134. X+     SETPCHAR(dbvwall, 30);
  1135. X+     SETPCHAR(dbhwall, 31);
  1136. X+ #endif
  1137. X+ #undef SETPCHAR
  1138. X+ }
  1139. X+ 
  1140. X+ void
  1141. X  parseoptions(opts, from_env)
  1142. X  register char *opts;
  1143. X  boolean from_env;
  1144. X  {
  1145. X      register char *op;
  1146. X      unsigned num;
  1147. X      boolean negated;
  1148. X  
  1149. X***************
  1150. X*** 146,158 ****
  1151. X          *op++ = 0;
  1152. X          parseoptions(op, from_env);
  1153. X      }
  1154. X! /*
  1155. X!     if(op = index(opts, ' ')) {
  1156. X!         op2 = op;
  1157. X!         while(*op++)
  1158. X!             if(*op != ' ') *op2++ = *op;
  1159. X!     }
  1160. X! */
  1161. X      if(!*opts) return;
  1162. X      negated = FALSE;
  1163. X      while((*opts == '!') || !strncmp(opts, "no", 2)) {
  1164. X--- 194,200 ----
  1165. X          *op++ = 0;
  1166. X          parseoptions(op, from_env);
  1167. X      }
  1168. X! 
  1169. X      if(!*opts) return;
  1170. X      negated = FALSE;
  1171. X      while((*opts == '!') || !strncmp(opts, "no", 2)) {
  1172. X***************
  1173. X*** 213,219 ****
  1174. X          return;
  1175. X      }
  1176. X  
  1177. X!     if (!strncmp(opts, "numb", 4)) {
  1178. X          flags.num_pad = !negated;
  1179. X          return;
  1180. X      }
  1181. X--- 255,261 ----
  1182. X          return;
  1183. X      }
  1184. X  
  1185. X!     if (!strncmp(opts, "num", 3)) {
  1186. X          flags.num_pad = !negated;
  1187. X          return;
  1188. X      }
  1189. X***************
  1190. X*** 327,332 ****
  1191. X--- 369,377 ----
  1192. X  
  1193. X      /* graphics:string */
  1194. X      if (!strncmp(opts, "gr", 2)) {
  1195. X+         unsigned int translate[MAXPCHARS+1];
  1196. X+         int i, lth;
  1197. X+ 
  1198. X          if(!from_env) {
  1199. X  #ifdef MSDOS
  1200. X            pline("\"graphics\" settable only from %s.", configfile);
  1201. X***************
  1202. X*** 341,390 ****
  1203. X          else
  1204. X              opts = op + 1;
  1205. X          escapes(opts, opts);
  1206. X! #define SETPCHAR(f, n)    showsyms.f = (strlen(opts) > n) ? opts[n] : defsyms.f
  1207. X!         SETPCHAR(stone, 0);
  1208. X!         SETPCHAR(vwall, 1);
  1209. X!         SETPCHAR(hwall, 2);
  1210. X!         SETPCHAR(tlcorn, 3);
  1211. X!         SETPCHAR(trcorn, 4);
  1212. X!         SETPCHAR(blcorn, 5);
  1213. X!         SETPCHAR(brcorn, 6);
  1214. X!         SETPCHAR(crwall, 7);
  1215. X!         SETPCHAR(tuwall, 8);
  1216. X!         SETPCHAR(tdwall, 9);
  1217. X!         SETPCHAR(tlwall, 10);
  1218. X!         SETPCHAR(trwall, 11);
  1219. X!         SETPCHAR(vbeam, 12);
  1220. X!         SETPCHAR(hbeam, 13);
  1221. X!         SETPCHAR(lslant, 14);
  1222. X!         SETPCHAR(rslant, 15);
  1223. X!         SETPCHAR(door, 16);
  1224. X!         SETPCHAR(room, 17);
  1225. X!         SETPCHAR(corr, 18);
  1226. X!         SETPCHAR(upstair, 19);
  1227. X!         SETPCHAR(dnstair, 20);
  1228. X!         SETPCHAR(trap, 21);
  1229. X!         SETPCHAR(web, 22);
  1230. X!         SETPCHAR(pool, 23);
  1231. X! #ifdef FOUNTAINS
  1232. X!         SETPCHAR(fountain, 24);
  1233. X! #endif
  1234. X! #ifdef SINKS
  1235. X!         SETPCHAR(sink, 25);
  1236. X! #endif
  1237. X! #ifdef THRONES
  1238. X!         SETPCHAR(throne, 26);
  1239. X! #endif
  1240. X! #ifdef ALTARS
  1241. X!         SETPCHAR(altar, 27);
  1242. X! #endif
  1243. X! #ifdef STRONGHOLD
  1244. X!         SETPCHAR(upladder, 28);
  1245. X!         SETPCHAR(dnladder, 29);
  1246. X!         SETPCHAR(dbvwall, 30);
  1247. X!         SETPCHAR(dbhwall, 31);
  1248. X! #endif
  1249. X! #undef SETPCHAR
  1250. X          return;
  1251. X      }
  1252. X  
  1253. X--- 386,398 ----
  1254. X          else
  1255. X              opts = op + 1;
  1256. X          escapes(opts, opts);
  1257. X! 
  1258. X!         lth = strlen(opts);
  1259. X!         if(lth > MAXPCHARS) lth = MAXPCHARS;
  1260. X!         /* match the form obtained from PC configuration files */
  1261. X!         for(i = 0; i < lth; i++)
  1262. X!             translate[i] = opts[i];
  1263. X!         assign_graphics(translate,lth);
  1264. X          return;
  1265. X      }
  1266. X  
  1267. X***************
  1268. X*** 398,422 ****
  1269. X              if(digit(*op)) {
  1270. X                  num = atoi(op);
  1271. X                  while(digit(*op)) op++;
  1272. X!             } else
  1273. X!             if(*op == '!') {
  1274. X                  negated = !negated;
  1275. X                  op++;
  1276. X              }
  1277. X              switch(*op) {
  1278. X!             case 't':
  1279. X!                 flags.end_top = num;
  1280. X!                 break;
  1281. X!             case 'a':
  1282. X!                 flags.end_around = num;
  1283. X!                 break;
  1284. X!             case 'o':
  1285. X!                 flags.end_own = !negated;
  1286. X!                 break;
  1287. X!             default:
  1288. X!                 goto bad;
  1289. X              }
  1290. X!             while(letter(*++op)) ;
  1291. X              if(*op == '/') op++;
  1292. X          }
  1293. X          return;
  1294. X--- 406,431 ----
  1295. X              if(digit(*op)) {
  1296. X                  num = atoi(op);
  1297. X                  while(digit(*op)) op++;
  1298. X!             } else if(*op == '!') {
  1299. X                  negated = !negated;
  1300. X                  op++;
  1301. X              }
  1302. X+             while(*op == ' ') op++;
  1303. X+ 
  1304. X              switch(*op) {
  1305. X!                 case 't':
  1306. X!                     flags.end_top = num;
  1307. X!                     break;
  1308. X!                 case 'a':
  1309. X!                     flags.end_around = num;
  1310. X!                     break;
  1311. X!                 case 'o':
  1312. X!                     flags.end_own = !negated;
  1313. X!                     break;
  1314. X!                 default:
  1315. X!                     goto bad;
  1316. X              }
  1317. X!             while(letter(*++op) || *op == ' ') ;
  1318. X              if(*op == '/') op++;
  1319. X          }
  1320. X          return;
  1321. X*** src/Old/pager.c    Wed Sep  6 15:54:41 1989
  1322. X--- src/pager.c    Mon Sep  4 20:39:17 1989
  1323. X***************
  1324. X*** 20,29 ****
  1325. X  static char hc = 0;
  1326. X  
  1327. X  static void page_more();
  1328. X  
  1329. X- const char nonlets[] = { S_EEL, S_CHAMELEON, S_DEMON, S_GHOST, S_HUMAN,
  1330. X-     S_GOLEM, 0 };
  1331. X- 
  1332. X  int
  1333. X  dowhatis()
  1334. X  {
  1335. X--- 20,28 ----
  1336. X  static char hc = 0;
  1337. X  
  1338. X  static void page_more();
  1339. X+ static boolean clear_help P((CHAR_P));
  1340. X+ static boolean valid_help P((CHAR_P));
  1341. X  
  1342. X  int
  1343. X  dowhatis()
  1344. X  {
  1345. X***************
  1346. X*** 155,161 ****
  1347. X                        (type == A_NEUTRAL) ? "(neutral)" :
  1348. X                        "(lawful)");
  1349. X                  } else
  1350. X!                 if (q == CHAIN_SYM && levl[cc.x][cc.y].omask)
  1351. X                      pline("(chain)");
  1352. X                  else
  1353. X  #endif
  1354. X--- 154,160 ----
  1355. X                        (type == A_NEUTRAL) ? "(neutral)" :
  1356. X                        "(lawful)");
  1357. X                  } else
  1358. X!                 if (q == CHAIN_SYM && OBJ_AT(cc.x, cc.y))
  1359. X                      pline("(chain)");
  1360. X                  else
  1361. X  #endif
  1362. X***************
  1363. X*** 176,182 ****
  1364. X                  }
  1365. X  #ifdef SPELLS
  1366. X                  else
  1367. X!                 if (q == SPBOOK_SYM && levl[cc.x][cc.y].omask)
  1368. X                      pline("(spellbook)");
  1369. X  #endif
  1370. X  #ifdef STRONGHOLD
  1371. X--- 175,181 ----
  1372. X                  }
  1373. X  #ifdef SPELLS
  1374. X                  else
  1375. X!                 if (q == SPBOOK_SYM && OBJ_AT(cc.x, cc.y))
  1376. X                      pline("(spellbook)");
  1377. X  #endif
  1378. X  #ifdef STRONGHOLD
  1379. X***************
  1380. X*** 203,218 ****
  1381. X                  u.mtimedone ? mons[u.umonnum].mname :
  1382. X  #endif
  1383. X                  pl_character, plname);
  1384. X!             } else if((q >= 'A' && q <= 'z') || index(nonlets,q)) {
  1385. X!                 for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
  1386. X!                 if(mtmp->mx == cc.x && mtmp->my == cc.y) {
  1387. X!                     pline("(%s%s)",
  1388. X!                     mtmp->mtame ? "tame " :
  1389. X!                       mtmp->mpeaceful ? "peaceful " : "",
  1390. X!                     strncmp(lmonnam(mtmp), "the ", 4)
  1391. X!                       ? lmonnam(mtmp) : lmonnam(mtmp)+4);
  1392. X!                     break;
  1393. X!                 }
  1394. X              }
  1395. X              if(ep[-1] == ';') {
  1396. X                  pline("More info? ");
  1397. X--- 202,215 ----
  1398. X                  u.mtimedone ? mons[u.umonnum].mname :
  1399. X  #endif
  1400. X                  pl_character, plname);
  1401. X!             } else if(levl[cc.x][cc.y].mmask) {
  1402. X!                 mtmp = m_at(cc.x,cc.y);
  1403. X!                 if (q == mtmp->data->mlet)
  1404. X!                 pline("(%s%s)",
  1405. X!                     mtmp->mtame ? "tame " :
  1406. X!                       mtmp->mpeaceful ? "peaceful " : "",
  1407. X!                     strncmp(lmonnam(mtmp), "the ", 4)
  1408. X!                       ? lmonnam(mtmp) : lmonnam(mtmp)+4);
  1409. X              }
  1410. X              if(ep[-1] == ';') {
  1411. X                  pline("More info? ");
  1412. X***************
  1413. X*** 241,247 ****
  1414. X  {
  1415. X      FILE *fp;
  1416. X      char bufr[BUFSZ+6];
  1417. X!     register char *buf = &bufr[6], *ep, q, ctrl;
  1418. X  #ifdef OS2_CODEVIEW
  1419. X      char tmp[PATHLEN];
  1420. X  
  1421. X--- 238,244 ----
  1422. X  {
  1423. X      FILE *fp;
  1424. X      char bufr[BUFSZ+6];
  1425. X!     register char *buf = &bufr[6], *ep, q, ctrl, meta;
  1426. X  #ifdef OS2_CODEVIEW
  1427. X      char tmp[PATHLEN];
  1428. X  
  1429. X***************
  1430. X*** 264,285 ****
  1431. X  #ifdef UNIX
  1432. X      intron();
  1433. X  #endif
  1434. X!     if (q == '\033') ctrl = '[';
  1435. X!     else if (q != unctrl(q)) ctrl = q - 1 + 'A';
  1436. X!     else ctrl = 0;
  1437. X      while(fgets(buf,BUFSZ,fp))
  1438. X!         if ((!ctrl && *buf==q) || (ctrl && *buf=='^' && *(buf+1)==ctrl)) {
  1439. X          ep = index(buf, '\n');
  1440. X          if(ep) *ep = 0;
  1441. X!         if(!ctrl && buf[1] == '\t'){
  1442. X              buf = bufr;
  1443. X              buf[0] = q;
  1444. X              (void) strncpy(buf+1, "       ", 7);
  1445. X-         } else if (ctrl && buf[2] == '\t'){
  1446. X-             buf = bufr + 1;
  1447. X-             buf[0] = '^';
  1448. X-             buf[1] = ctrl;
  1449. X-             (void) strncpy(buf+2, "      ", 6);
  1450. X          }
  1451. X          pline(buf);
  1452. X          (void) fclose(fp);
  1453. X--- 261,286 ----
  1454. X  #ifdef UNIX
  1455. X      intron();
  1456. X  #endif
  1457. X!     ctrl = ((q <= '\033') ? (q - 1 + 'A') : 0);
  1458. X!     meta = ((0x80 & q) ? (0x7f & q) : 0);
  1459. X      while(fgets(buf,BUFSZ,fp))
  1460. X!         if ((ctrl && *buf=='^' && *(buf+1)==ctrl) ||
  1461. X!         (meta && *buf=='M' && *(buf+1)=='-' && *(buf+2)==meta) ||
  1462. X!         *buf==q) {
  1463. X          ep = index(buf, '\n');
  1464. X          if(ep) *ep = 0;
  1465. X!         if (ctrl && buf[2] == '\t'){
  1466. X!             buf = bufr + 1;
  1467. X!             (void) strncpy(buf, "^?      ", 8);
  1468. X!             buf[1] = ctrl;
  1469. X!         } else if (meta && buf[3] == '\t'){
  1470. X!             buf = bufr + 2;
  1471. X!             (void) strncpy(buf, "M-?     ", 8);
  1472. X!             buf[2] = meta;
  1473. X!         } else if(buf[1] == '\t'){
  1474. X              buf = bufr;
  1475. X              buf[0] = q;
  1476. X              (void) strncpy(buf+1, "       ", 7);
  1477. X          }
  1478. X          pline(buf);
  1479. X          (void) fclose(fp);
  1480. X***************
  1481. X*** 539,545 ****
  1482. X              curx = curx + strlen(tl->line_text);
  1483. X              curline++;
  1484. X          }
  1485. X!         if(hmenu) hc = lowc(readchar()); /* help menu display */
  1486. X  #if defined(MSDOS) && !defined(AMIGA)
  1487. X          cmov (lth, curline);
  1488. X  #else
  1489. X--- 540,550 ----
  1490. X              curx = curx + strlen(tl->line_text);
  1491. X              curline++;
  1492. X          }
  1493. X!         if(hmenu) {    /* help menu display */
  1494. X!             do 
  1495. X!                 hc = lowc(readchar());
  1496. X!             while (!valid_help(hc));
  1497. X!         }
  1498. X  #if defined(MSDOS) && !defined(AMIGA)
  1499. X          cmov (lth, curline);
  1500. X  #else
  1501. X***************
  1502. X*** 547,555 ****
  1503. X  #endif
  1504. X          cl_end ();
  1505. X          if (!hmenu) cmore (text);
  1506. X!         home ();
  1507. X!         cl_end ();
  1508. X!         docorner (lth, curline-1);
  1509. X          } else {                    /* feed to pager */
  1510. X          set_pager(0);
  1511. X          for (tl = texthead; tl; tl = tl->next_line) {
  1512. X--- 552,562 ----
  1513. X  #endif
  1514. X          cl_end ();
  1515. X          if (!hmenu) cmore (text);
  1516. X!         if (!hmenu || clear_help(hc)) {
  1517. X!             home ();
  1518. X!             cl_end ();
  1519. X!             docorner (lth, curline-1);
  1520. X!         }
  1521. X          } else {                    /* feed to pager */
  1522. X          set_pager(0);
  1523. X          for (tl = texthead; tl; tl = tl->next_line) {
  1524. X***************
  1525. X*** 622,642 ****
  1526. X      cornline(-1,"");
  1527. X  }
  1528. X  
  1529. X! int
  1530. X! dohelp()
  1531. X  {
  1532. X!     char c;
  1533. X  
  1534. X!     do {
  1535. X!         help_menu();
  1536. X!         c = hc;
  1537. X! #ifdef WIZARD
  1538. X!     } while ((c < 'a' || c > (wizard ? 'j' : 'i')) && !index(quitchars,c));
  1539. X  #else
  1540. X!     } while ((c < 'a' || c > 'i') && !index(quitchars,c));
  1541. X  #endif
  1542. X!     if (!index(quitchars, c)) {
  1543. X!         switch(c) {
  1544. X              case 'a':  (void) page_file(HELP, FALSE);  break;
  1545. X              case 'b':  (void) page_file(SHELP, FALSE);  break;
  1546. X              case 'c':  (void) dohistory();  break;
  1547. X--- 629,668 ----
  1548. X      cornline(-1,"");
  1549. X  }
  1550. X  
  1551. X! static boolean
  1552. X! clear_help(c)
  1553. X! char c;
  1554. X  {
  1555. X!     /* those valid_help characters which do not correspond to help routines
  1556. X!      * that redraw the whole screen on their own.  if we always clear the
  1557. X!      * help menu, we end up restoring the part of the maze underneath the
  1558. X!      * help menu when the last page of a long help file is displayed with
  1559. X!      * an external pager.
  1560. X!      */
  1561. X!     return(index(quitchars,c) || c == 'd' || c == 'e'
  1562. X! #ifdef WIZARD
  1563. X!         || c == 'j'
  1564. X! #endif
  1565. X!         );
  1566. X! }
  1567. X  
  1568. X! static boolean
  1569. X! valid_help(c)
  1570. X! char c;
  1571. X! {
  1572. X! #ifdef WIZARD
  1573. X!     return ((c >= 'a' && c <= (wizard ? 'j' : 'i')) || index(quitchars,c));
  1574. X  #else
  1575. X!     return ((c >= 'a' && c <= 'i') || index(quitchars,c));
  1576. X  #endif
  1577. X! }
  1578. X! 
  1579. X! int
  1580. X! dohelp()
  1581. X! {
  1582. X!     help_menu();
  1583. X!     if (!index(quitchars, hc)) {
  1584. X!         switch(hc) {
  1585. X              case 'a':  (void) page_file(HELP, FALSE);  break;
  1586. X              case 'b':  (void) page_file(SHELP, FALSE);  break;
  1587. X              case 'c':  (void) dohistory();  break;
  1588. X***************
  1589. X*** 768,774 ****
  1590. X  #ifdef WIZARD
  1591. X      if(wizard) (void) signal(SIGQUIT,SIG_DFL);
  1592. X  #endif
  1593. X!     if(wt) getret();
  1594. X      docrt();
  1595. X      return(0);
  1596. X  }
  1597. X--- 794,808 ----
  1598. X  #ifdef WIZARD
  1599. X      if(wizard) (void) signal(SIGQUIT,SIG_DFL);
  1600. X  #endif
  1601. X!     if(wt) {
  1602. X!         boolean so;
  1603. X! 
  1604. X!         cmov(1, LI);    /* get prompt in reasonable place */
  1605. X!         so = flags.standout;
  1606. X!         flags.standout = 1;
  1607. X!         more();
  1608. X!         flags.standout = so;
  1609. X!     }
  1610. X      docrt();
  1611. X      return(0);
  1612. X  }
  1613. X*** src/Old/pickup.c    Wed Sep  6 15:55:37 1989
  1614. X--- src/pickup.c    Tue Sep  5 21:35:42 1989
  1615. X***************
  1616. X*** 270,278 ****
  1617. X                  if(obj->spe) obj->spe = 0;
  1618. X              break;
  1619. X          }
  1620. X          freeobj(obj);
  1621. X          if(Invisible) newsym(u.ux,u.uy);
  1622. X-         addtobill(obj, TRUE);       /* sets obj->unpaid if necessary */
  1623. X          if(wt > -5) You("have a little trouble lifting");
  1624. X          { int pickquan = obj->quan;
  1625. X            int mergquan;
  1626. X--- 270,278 ----
  1627. X                  if(obj->spe) obj->spe = 0;
  1628. X              break;
  1629. X          }
  1630. X+         addtobill(obj, TRUE);       /* sets obj->unpaid if necessary */
  1631. X          freeobj(obj);
  1632. X          if(Invisible) newsym(u.ux,u.uy);
  1633. X          if(wt > -5) You("have a little trouble lifting");
  1634. X          { int pickquan = obj->quan;
  1635. X            int mergquan;
  1636. X***************
  1637. X*** 287,293 ****
  1638. X          }
  1639. X          }
  1640. X      }
  1641. X-     set_omask(u.ux, u.uy);
  1642. X  }
  1643. X  
  1644. X  int
  1645. X--- 287,292 ----
  1646. X***************
  1647. X*** 300,306 ****
  1648. X          pline("You cannot reach the floor.");
  1649. X          return(0);
  1650. X      }
  1651. X!     if(levl[u.ux][u.uy].omask)
  1652. X      for(cobj = fobj; cobj; cobj = cobj->nobj) {
  1653. X  
  1654. X          if(cobj->ox == u.ux && cobj->oy == u.uy)
  1655. X--- 299,305 ----
  1656. X          pline("You cannot reach the floor.");
  1657. X          return(0);
  1658. X      }
  1659. X!     if(OBJ_AT(u.ux, u.uy))
  1660. X      for(cobj = fobj; cobj; cobj = cobj->nobj) {
  1661. X  
  1662. X          if(cobj->ox == u.ux && cobj->oy == u.uy)
  1663. X***************
  1664. X*** 466,476 ****
  1665. X  
  1666. X      for(otmp = invent; otmp; otmp = otmp->nobj) {
  1667. X          cobj = otmp;
  1668. X!         if(Is_container(otmp))
  1669. X          for(ootmp=fcobj,nxobj=(fcobj ? fcobj->nobj : 0); ootmp;
  1670. X                  ootmp=nxobj,nxobj=(ootmp ? ootmp->nobj : 0) )
  1671. X              if(ootmp->cobj == cobj)
  1672. X              (void)out_container(ootmp);
  1673. X      }
  1674. X      return;
  1675. X  }
  1676. X--- 465,477 ----
  1677. X  
  1678. X      for(otmp = invent; otmp; otmp = otmp->nobj) {
  1679. X          cobj = otmp;
  1680. X!         if(Is_container(otmp)) {
  1681. X!         current_container = otmp;
  1682. X          for(ootmp=fcobj,nxobj=(fcobj ? fcobj->nobj : 0); ootmp;
  1683. X                  ootmp=nxobj,nxobj=(ootmp ? ootmp->nobj : 0) )
  1684. X              if(ootmp->cobj == cobj)
  1685. X              (void)out_container(ootmp);
  1686. X+         }
  1687. X      }
  1688. X      return;
  1689. X  }
  1690. X*** src/Old/polyself.c    Wed Sep  6 15:56:02 1989
  1691. X--- src/polyself.c    Tue Sep  5 22:05:00 1989
  1692. X***************
  1693. X*** 5,139 ****
  1694. X  #include "hack.h"
  1695. X  
  1696. X  #ifdef POLYSELF
  1697. X- 
  1698. X  static void break_armor(), drop_weapon();
  1699. X  static void skinback();
  1700. X  static void uunstick();
  1701. X  
  1702. X  void
  1703. X! polyself()
  1704. X  {
  1705. X      char buf[BUFSZ];
  1706. X-     int tmp, tmp2, mntmp = -1;
  1707. X-     int tries=0;
  1708. X-     boolean draconian = (uarm && uarm->otyp==DRAGON_SCALE_MAIL &&
  1709. X-         uarm->corpsenm >= PM_GREY_DRAGON &&
  1710. X-         uarm->corpsenm <= PM_YELLOW_DRAGON);
  1711. X-     /* We have to calculate sticky in multiple places since we might go
  1712. X-      * through any one of them without going through the others.
  1713. X-      */
  1714. X-     boolean sticky = sticks(uasmon) && u.ustuck && !u.uswallow;
  1715. X- 
  1716. X-     if(!Polymorph_control && !draconian) {
  1717. X-         if (rn2(20) > ACURR(A_CON)) {
  1718. X-         You("shudder for a moment.");
  1719. X-         losehp(rn2(30),"system shock");
  1720. X-         return;
  1721. X-         }
  1722. X-     }
  1723. X- 
  1724. X-     if (Polymorph_control) {
  1725. X-         do {
  1726. X-             pline("Become what kind of monster? [type the name] ");
  1727. X-             getlin(buf);
  1728. X-             mntmp = name_to_mon(buf);
  1729. X-             if (mntmp < 0)
  1730. X-                 pline("I've never heard of such monsters.");
  1731. X-             else if (!polyok(&mons[mntmp]))
  1732. X-                 You("cannot polymorph into that.");
  1733. X-             else break;
  1734. X-         } while(++tries < 5);
  1735. X-         if (tries==5) pline(thats_enough_tries);
  1736. X-     } else if (draconian)
  1737. X-         mntmp = uarm->corpsenm;
  1738. X  
  1739. X!     if (mntmp < 0) {
  1740. X!         tries = 0;
  1741. X!         do {
  1742. X!             mntmp = rn2(PM_CHAMELEON);
  1743. X!             /* All valid monsters are from 0 to PM_CHAMELEON-1 */
  1744. X!         } while(!polyok(&mons[mntmp]) && tries++ < 200);
  1745. X      }
  1746. X! 
  1747. X!     if (draconian && mntmp==uarm->corpsenm) {
  1748. X!         if (!(mons[uarm->corpsenm].geno & G_GENOD)) {
  1749. X!             You("merge with your scaly armor.");
  1750. X!             uskin = uarm;
  1751. X!             uarm = (struct obj *)0;
  1752. X!         }
  1753. X      }
  1754. X!     /* The below polyok() should never fail unless just about everything
  1755. X!      * was genocided...
  1756. X!      */
  1757. X!     if (!polyok(&mons[mntmp]) || !rn2(5)) {
  1758. X!         if (!rn2(10)) {
  1759. X!             flags.female = !flags.female;
  1760. X!             max_rank_sz();
  1761. X!             if (pl_character[0]=='P')
  1762. X!                 Strcpy(pl_character+6, flags.female?"ess":"");
  1763. X!             if (pl_character[0]=='C')
  1764. X!                 Strcpy(pl_character+5,
  1765. X!                 flags.female ? "woman" : "man");
  1766. X!         }
  1767. X!         if (u.umonnum != -1) {
  1768. X!             u.acurr = u.macurr;    /* restore old attribs */
  1769. X!             u.amax = u.mamax;
  1770. X!         }
  1771. X!         tmp = u.uhpmax;
  1772. X!         tmp2 = u.ulevel;
  1773. X!         u.usym = S_HUMAN;
  1774. X!         u.umonnum = -1;
  1775. X!         if (u.uundetected) u.uundetected = 0;
  1776. X!         prme();
  1777. X!         u.mtimedone = u.mh = u.mhmax = 0;
  1778. X!         u.ulevel = u.ulevel-2+rn2(5);
  1779. X!         if (u.ulevel > 127 || u.ulevel == 0) u.ulevel = 1;
  1780. X!         if (u.ulevel > MAXULEV) u.ulevel = MAXULEV;
  1781. X  
  1782. X!         for(tmp = u.ulevel; tmp != tmp2; tmp += (tmp2 < u.ulevel) ? -1 : 1)
  1783. X          adjabil((tmp2 > u.ulevel) ? -1 : 1);
  1784. X!         tmp = u.uhpmax;
  1785. X  
  1786. X!         /* random experience points for the new experience level */
  1787. X!         u.uexp = rndexp();
  1788. X  #ifndef LINT
  1789. X!         u.uhpmax = (u.uhpmax-10)*(long)u.ulevel/tmp2 + 19 - rn2(19);
  1790. X  #endif
  1791. X  /* If it was u.uhpmax*u.ulevel/tmp+9-rn2(19), then a 1st level character
  1792. X     with 16 hp who polymorphed into a 3rd level one would have an average
  1793. X     of 48 hp.  */
  1794. X  #ifndef LINT
  1795. X!         u.uhp = u.uhp * (long)u.uhpmax/tmp;
  1796. X  #endif
  1797. X  #ifdef SPELLS
  1798. X!         tmp = u.uenmax;
  1799. X! #ifndef LINT
  1800. X!         u.uenmax = u.uenmax * (long)u.ulevel/tmp2 + 9 - rn2(19);
  1801. X! #endif
  1802. X!         if (u.uenmax < 0) u.uenmax = 0;
  1803. X! #ifndef LINT
  1804. X!         u.uen = (tmp ? u.uen * (long)u.uenmax / tmp : u.uenmax);
  1805. X! #endif
  1806. X! #endif
  1807. X!         (void)redist_attr();
  1808. X!         u.uhunger = rn1(500,500);
  1809. X!         Sick = 0;
  1810. X!         Stoned = 0;
  1811. X!         if (u.uhp <= 0 || u.uhpmax <= 0) {
  1812. X! 
  1813. X          if(Polymorph_control) {
  1814. X              if (u.uhp <= 0) u.uhp = 1;
  1815. X              if (u.uhpmax <= 0) u.uhpmax = 1;
  1816. X          } else {
  1817. X              Your("new form doesn't seem healthy enough to survive.");
  1818. X              killer="unsuccessful polymorph";
  1819. X              done(DIED);
  1820. X          }
  1821. X!         }
  1822. X!         set_uasmon();
  1823. X!         You("feel like a new %sman!", flags.female ? "wo" : "");
  1824. X  #ifdef WIZARD
  1825. X!         if(!wizard) {
  1826. X  #endif
  1827. X  newname:    more();
  1828. X          do {
  1829. X--- 5,96 ----
  1830. X  #include "hack.h"
  1831. X  
  1832. X  #ifdef POLYSELF
  1833. X  static void break_armor(), drop_weapon();
  1834. X  static void skinback();
  1835. X  static void uunstick();
  1836. X+ static boolean sticky;
  1837. X+ #endif
  1838. X  
  1839. X  void
  1840. X! newman()
  1841. X  {
  1842. X+     int tmp, tmp2;
  1843. X      char buf[BUFSZ];
  1844. X  
  1845. X!     if (!rn2(10)) {
  1846. X!         flags.female = !flags.female;
  1847. X!         max_rank_sz();
  1848. X!         if (pl_character[0]=='P')
  1849. X!             Strcpy(pl_character+6, flags.female?"ess":"");
  1850. X!         if (pl_character[0]=='C')
  1851. X!             Strcpy(pl_character+5, flags.female ? "woman" : "man");
  1852. X      }
  1853. X! #ifdef POLYSELF
  1854. X!     if (u.umonnum != -1) {
  1855. X!         u.acurr = u.macurr;    /* restore old attribs */
  1856. X!         u.amax = u.mamax;
  1857. X      }
  1858. X!     u.usym = S_HUMAN;
  1859. X!     u.umonnum = -1;
  1860. X!     if (u.uundetected) u.uundetected = 0;
  1861. X!     prme();
  1862. X!     u.mtimedone = u.mh = u.mhmax = 0;
  1863. X! #endif
  1864. X!     tmp = u.uhpmax;
  1865. X!     tmp2 = u.ulevel;
  1866. X!     u.ulevel = u.ulevel-2+rn2(5);
  1867. X!     if (u.ulevel > 127 || u.ulevel == 0) u.ulevel = 1;
  1868. X!     if (u.ulevel > MAXULEV) u.ulevel = MAXULEV;
  1869. X  
  1870. X!     for(tmp = u.ulevel; tmp != tmp2; tmp += (tmp2 < u.ulevel) ? -1 : 1)
  1871. X          adjabil((tmp2 > u.ulevel) ? -1 : 1);
  1872. X!     tmp = u.uhpmax;
  1873. X  
  1874. X!     /* random experience points for the new experience level */
  1875. X!     u.uexp = rndexp();
  1876. X  #ifndef LINT
  1877. X!     u.uhpmax = (u.uhpmax-10)*(long)u.ulevel/tmp2 + 19 - rn2(19);
  1878. X  #endif
  1879. X  /* If it was u.uhpmax*u.ulevel/tmp+9-rn2(19), then a 1st level character
  1880. X     with 16 hp who polymorphed into a 3rd level one would have an average
  1881. X     of 48 hp.  */
  1882. X  #ifndef LINT
  1883. X!     u.uhp = u.uhp * (long)u.uhpmax/tmp;
  1884. X  #endif
  1885. X  #ifdef SPELLS
  1886. X!     tmp = u.uenmax;
  1887. X! #  ifndef LINT
  1888. X!     u.uenmax = u.uenmax * (long)u.ulevel/tmp2 + 9 - rn2(19);
  1889. X! #  endif
  1890. X!     if (u.uenmax < 0) u.uenmax = 0;
  1891. X! #  ifndef LINT
  1892. X!     u.uen = (tmp ? u.uen * (long)u.uenmax / tmp : u.uenmax);
  1893. X! #  endif
  1894. X! #endif
  1895. X!     redist_attr();
  1896. X!     u.uhunger = rn1(500,500);
  1897. X!     Sick = 0;
  1898. X!     Stoned = 0;
  1899. X!     if (u.uhp <= 0 || u.uhpmax <= 0) {
  1900. X! #ifdef POLYSELF
  1901. X          if(Polymorph_control) {
  1902. X              if (u.uhp <= 0) u.uhp = 1;
  1903. X              if (u.uhpmax <= 0) u.uhpmax = 1;
  1904. X          } else {
  1905. X+ #endif
  1906. X              Your("new form doesn't seem healthy enough to survive.");
  1907. X              killer="unsuccessful polymorph";
  1908. X              done(DIED);
  1909. X+ #ifdef POLYSELF
  1910. X          }
  1911. X! #endif
  1912. X!     }
  1913. X! #ifdef POLYSELF
  1914. X!     set_uasmon();
  1915. X! #endif
  1916. X!     You("feel like a new %sman!", flags.female ? "wo" : "");
  1917. X  #ifdef WIZARD
  1918. X!     if(!wizard) {
  1919. X  #endif
  1920. X  newname:    more();
  1921. X          do {
  1922. X***************
  1923. X*** 148,160 ****
  1924. X          Sprintf(SAVEF, "save/%d%s", getuid(), plname);
  1925. X          regularize(SAVEF+5);        /* avoid . or / in name */
  1926. X  #ifdef WIZARD
  1927. X!         }
  1928. X  #endif
  1929. X!         flags.botl = 1;
  1930. X!         skinback();
  1931. X!         find_ac();
  1932. X!         if (sticky) uunstick();
  1933. X!     } else if(!polymon(mntmp)) return;
  1934. X  
  1935. X      if (!uarmg) selftouch("No longer petrify-resistant, you");
  1936. X      if (Inhell && !Fire_resistance) {
  1937. X--- 105,195 ----
  1938. X          Sprintf(SAVEF, "save/%d%s", getuid(), plname);
  1939. X          regularize(SAVEF+5);        /* avoid . or / in name */
  1940. X  #ifdef WIZARD
  1941. X!     }
  1942. X! #endif
  1943. X!     flags.botl = 1;
  1944. X! #ifdef POLYSELF
  1945. X!     skinback();
  1946. X!     find_ac();
  1947. X!     if (sticky) uunstick();
  1948. X  #endif
  1949. X! }
  1950. X! 
  1951. X! #ifdef POLYSELF
  1952. X! void
  1953. X! polyself()
  1954. X! {
  1955. X!     char buf[BUFSZ];
  1956. X!     int mntmp = -1;
  1957. X!     int tries=0;
  1958. X!     boolean draconian = (uarm && uarm->otyp==DRAGON_SCALE_MAIL &&
  1959. X!         uarm->corpsenm >= PM_GREY_DRAGON &&
  1960. X!         uarm->corpsenm <= PM_YELLOW_DRAGON);
  1961. X!     boolean iswere = (u.ulycn > -1 || is_were(uasmon));
  1962. X!     boolean isvamp = (u.usym == S_VAMPIRE || u.umonnum == PM_VAMPIRE_BAT);
  1963. X!     /* We have to calculate sticky in multiple places since we might go
  1964. X!      * through any one of them without going through the others.
  1965. X!      */
  1966. X!     sticky = sticks(uasmon) && u.ustuck && !u.uswallow;
  1967. X! 
  1968. X!     if(!Polymorph_control && !draconian && !iswere && !isvamp) {
  1969. X!         if (rn2(20) > ACURR(A_CON)) {
  1970. X!         You("shudder for a moment.");
  1971. X!         losehp(rn2(30),"system shock");
  1972. X!         return;
  1973. X!         }
  1974. X!     }
  1975. X! 
  1976. X!     if (Polymorph_control) {
  1977. X!         do {
  1978. X!             pline("Become what kind of monster? [type the name] ");
  1979. X!             getlin(buf);
  1980. X!             mntmp = name_to_mon(buf);
  1981. X!             if (mntmp < 0)
  1982. X!                 pline("I've never heard of such monsters.");
  1983. X!             else if (!polyok(&mons[mntmp]))
  1984. X!                 You("cannot polymorph into that.");
  1985. X!             else break;
  1986. X!         } while(++tries < 5);
  1987. X!         if (tries==5) pline(thats_enough_tries);
  1988. X!     } else if (draconian || iswere || isvamp) {
  1989. X!         /* special changes that don't require polyok() */
  1990. X!         if (draconian) {
  1991. X!             mntmp = uarm->corpsenm;
  1992. X!             if (!(mons[mntmp].geno & G_GENOD)) {
  1993. X!                 You("merge with your scaly armor.");
  1994. X!                 uskin = uarm;
  1995. X!                 uarm = (struct obj *)0;
  1996. X!             }
  1997. X!         } else if (iswere) {
  1998. X!             if (is_were(uasmon))
  1999. X!                 mntmp = PM_HUMAN; /* Illegal; force newman() */
  2000. X!             else
  2001. X!                 mntmp = u.ulycn;
  2002. X!         } else {
  2003. X!             if (u.usym == S_VAMPIRE)
  2004. X!                 mntmp = PM_VAMPIRE_BAT;
  2005. X!             else
  2006. X!                 mntmp = PM_VAMPIRE;
  2007. X!         }
  2008. X!         if (polymon(mntmp))
  2009. X!             return;
  2010. X!     }
  2011. X! 
  2012. X!     if (mntmp < 0) {
  2013. X!         tries = 0;
  2014. X!         do {
  2015. X!             mntmp = rn2(PM_CHAMELEON);
  2016. X!             /* All valid monsters are from 0 to PM_CHAMELEON-1 */
  2017. X!         } while(!polyok(&mons[mntmp]) && tries++ < 200);
  2018. X!     }
  2019. X! 
  2020. X!     /* The below polyok() fails either if everything is genocided, or if
  2021. X!      * we deliberately chose something illegal to force newman().
  2022. X!      */
  2023. X!     if (!polyok(&mons[mntmp]) || !rn2(5))
  2024. X!         newman();
  2025. X!     else if(!polymon(mntmp)) return;
  2026. X  
  2027. X      if (!uarmg) selftouch("No longer petrify-resistant, you");
  2028. X      if (Inhell && !Fire_resistance) {
  2029. X***************
  2030. X*** 169,175 ****
  2031. X      int    mntmp;
  2032. X  {
  2033. X      int    tmp;
  2034. X!     boolean sticky = sticks(uasmon) && u.ustuck && !u.uswallow;
  2035. X  
  2036. X      if (mons[mntmp].geno & G_GENOD) {
  2037. X          You("feel rather %s-ish.",mons[mntmp].mname);
  2038. X--- 204,210 ----
  2039. X      int    mntmp;
  2040. X  {
  2041. X      int    tmp;
  2042. X!     sticky = sticks(uasmon) && u.ustuck && !u.uswallow;
  2043. X  
  2044. X      if (mons[mntmp].geno & G_GENOD) {
  2045. X          You("feel rather %s-ish.",mons[mntmp].mname);
  2046. X***************
  2047. X*** 228,234 ****
  2048. X      break_armor();
  2049. X      drop_weapon(1);
  2050. X      if (u.uundetected && !hides_under(uasmon)) u.uundetected = 0;
  2051. X!     else if (hides_under(uasmon) && (levl[u.ux][u.uy].omask ||
  2052. X              levl[u.ux][u.uy].gmask))
  2053. X          u.uundetected = 1;
  2054. X      prme();
  2055. X--- 263,269 ----
  2056. X      break_armor();
  2057. X      drop_weapon(1);
  2058. X      if (u.uundetected && !hides_under(uasmon)) u.uundetected = 0;
  2059. X!     else if (hides_under(uasmon) && (OBJ_AT(u.ux, u.uy) ||
  2060. X              levl[u.ux][u.uy].gmask))
  2061. X          u.uundetected = 1;
  2062. X      prme();
  2063. X***************
  2064. X*** 347,353 ****
  2065. X  void
  2066. X  rehumanize()
  2067. X  {
  2068. X!     boolean sticky = sticks(uasmon) && u.ustuck && !u.uswallow;
  2069. X  
  2070. X      u.mh = u.mhmax = u.mtimedone = 0;
  2071. X       u.acurr = u.macurr;        /* restore old strength */
  2072. X--- 382,388 ----
  2073. X  void
  2074. X  rehumanize()
  2075. X  {
  2076. X!     sticky = sticks(uasmon) && u.ustuck && !u.uswallow;
  2077. X  
  2078. X      u.mh = u.mhmax = u.mtimedone = 0;
  2079. X       u.acurr = u.macurr;        /* restore old strength */
  2080. X***************
  2081. X*** 423,435 ****
  2082. X      if (u.uswallow) {
  2083. X          You("release web fluid inside %s.", mon_nam(u.ustuck));
  2084. X          pline("%s regurgitates you!", Monnam(u.ustuck));
  2085. X!         u.ux = u.ustuck->mx;
  2086. X!         u.uy = u.ustuck->my;
  2087. X!         mnexto(u.ustuck);
  2088. X!         u.uswallow = 0;
  2089. X!         u.ustuck = 0;
  2090. X!         setsee();
  2091. X!         docrt();
  2092. X          return(1);
  2093. X      }
  2094. X      if (u.utrap) {
  2095. X--- 458,464 ----
  2096. X      if (u.uswallow) {
  2097. X          You("release web fluid inside %s.", mon_nam(u.ustuck));
  2098. X          pline("%s regurgitates you!", Monnam(u.ustuck));
  2099. X!         regurgitates(u.ustuck);
  2100. X          return(1);
  2101. X      }
  2102. X      if (u.utrap) {
  2103. X***************
  2104. X*** 507,513 ****
  2105. X          looked = 1;
  2106. X          if (Invis && !perceives(mtmp->data))
  2107. X              pline("%s seems not to notice your gaze.", Monnam(mtmp));
  2108. X!         else if (mtmp->minvis && !See_invisible && !Telepat)
  2109. X              You("can't see where to gaze at %s.", Monnam(mtmp));
  2110. X          else if (mtmp->mimic)
  2111. X              continue;
  2112. X--- 536,542 ----
  2113. X          looked = 1;
  2114. X          if (Invis && !perceives(mtmp->data))
  2115. X              pline("%s seems not to notice your gaze.", Monnam(mtmp));
  2116. X!         else if (mtmp->minvis && !See_invisible)
  2117. X              You("can't see where to gaze at %s.", Monnam(mtmp));
  2118. X          else if (mtmp->mimic)
  2119. X              continue;
  2120. X
  2121. END_OF_FILE
  2122. if test 55646 -ne `wc -c <'patch03e'`; then
  2123.     echo shar: \"'patch03e'\" unpacked with wrong size!
  2124. fi
  2125. # end of 'patch03e'
  2126. fi
  2127. echo shar: End of archive 5 \(of 6\).
  2128. cp /dev/null ark5isdone
  2129. MISSING=""
  2130. for I in 1 2 3 4 5 6 ; do
  2131.     if test ! -f ark${I}isdone ; then
  2132.     MISSING="${MISSING} ${I}"
  2133.     fi
  2134. done
  2135. if test "${MISSING}" = "" ; then
  2136.     echo You have unpacked all 6 archives.
  2137.     rm -f ark[1-9]isdone
  2138. else
  2139.     echo You still need to unpack the following archives:
  2140.     echo "        " ${MISSING}
  2141. fi
  2142. ##  End of shell archive.
  2143. exit 0
  2144.