home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume16 / nethack31 / patch2k / patches02h
Text File  |  1993-06-16  |  55KB  |  2,033 lines

  1. *** /tmp/da11330    Tue Jun  1 16:15:37 1993
  2. --- src/rip.c    Tue Apr 27 17:00:24 1993
  3. ***************
  4. *** 1,4 ****
  5. ! /*    SCCS Id: @(#)rip.c    3.1    91/08/05
  6.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  7.   /* NetHack may be freely redistributed.  See license for details. */
  8.   
  9. --- 1,4 ----
  10. ! /*    SCCS Id: @(#)rip.c    3.1    93/04/26    */
  11.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  12.   /* NetHack may be freely redistributed.  See license for details. */
  13.   
  14. ***************
  15. *** 8,13 ****
  16. --- 8,15 ----
  17.   
  18.   extern const char *killed_by_prefix[];
  19.   
  20. + #if defined(TTY_GRAPHICS) || defined(X11_GRAPHICS) || defined(mac)
  21.   static const char *rip_txt[] = {
  22.   "                       ----------",
  23.   "                      /          \\",
  24. ***************
  25. *** 49,58 ****
  26.       while(*ip) *op++ = *ip++;
  27.   }
  28.   
  29.   void
  30. ! outrip(how, tmpwin)
  31. ! int how;
  32.   winid tmpwin;
  33.   {
  34.       register char **dp;
  35.       register char *dpx;
  36. --- 51,61 ----
  37.       while(*ip) *op++ = *ip++;
  38.   }
  39.   
  40.   void
  41. ! genl_outrip(tmpwin, how)
  42.   winid tmpwin;
  43. + int how;
  44.   {
  45.       register char **dp;
  46.       register char *dpx;
  47. ***************
  48. *** 126,130 ****
  49. --- 129,135 ----
  50.       putstr(tmpwin, 0, "");
  51.       putstr(tmpwin, 0, "");
  52.   }
  53. + #endif
  54.   
  55.   /*rip.c*/
  56. *** /tmp/da11354    Tue Jun  1 16:15:42 1993
  57. --- src/save.c    Fri May 28 11:32:09 1993
  58. ***************
  59. *** 1,4 ****
  60. ! /*    SCCS Id: @(#)save.c    3.1    93/02/09    */
  61.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  62.   /* NetHack may be freely redistributed.  See license for details. */
  63.   
  64. --- 1,4 ----
  65. ! /*    SCCS Id: @(#)save.c    3.1    93/05/26    */
  66.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  67.   /* NetHack may be freely redistributed.  See license for details. */
  68.   
  69. ***************
  70. *** 31,37 ****
  71.   #endif
  72.   
  73.   #ifdef ZEROCOMP
  74. ! static void FDECL(bputc, (UCHAR_P));
  75.   #endif
  76.   static void FDECL(savelevchn, (int, int));
  77.   static void FDECL(savedamage, (int,struct damage *, int));
  78. --- 31,37 ----
  79.   #endif
  80.   
  81.   #ifdef ZEROCOMP
  82. ! static void FDECL(bputc, (int));
  83.   #endif
  84.   static void FDECL(savelevchn, (int, int));
  85.   static void FDECL(savedamage, (int,struct damage *, int));
  86. ***************
  87. *** 138,149 ****
  88.       if(flags.window_inited)
  89.           clear_nhwindow(WIN_MESSAGE);
  90.   
  91. ! #ifdef MFLOPPY
  92.       if(!hu) {
  93.           dotcnt = 0;
  94.           curs(WIN_MAP, 1, 1);
  95.           putstr(WIN_MAP, 0, "Saving:");
  96.       }
  97.       /* make sure there is enough disk space */
  98.       savelev(fd, ledger_no(&u.uz), COUNT_SAVE);
  99.       savegamestate(fd, COUNT_SAVE);
  100. --- 138,151 ----
  101.       if(flags.window_inited)
  102.           clear_nhwindow(WIN_MESSAGE);
  103.   
  104. ! #ifdef MICRO
  105.       if(!hu) {
  106.           dotcnt = 0;
  107.           curs(WIN_MAP, 1, 1);
  108.           putstr(WIN_MAP, 0, "Saving:");
  109.       }
  110. + #endif
  111. + #ifdef MFLOPPY
  112.       /* make sure there is enough disk space */
  113.       savelev(fd, ledger_no(&u.uz), COUNT_SAVE);
  114.       savegamestate(fd, COUNT_SAVE);
  115. ***************
  116. *** 383,389 ****
  117.           struct rm *prm, *rgrm;
  118.           int x, y;
  119.           uchar match;
  120. !         
  121.           rgrm = &levl[0][0];        /* start matching at first rm */
  122.           match = 0;
  123.   
  124. --- 385,391 ----
  125.           struct rm *prm, *rgrm;
  126.           int x, y;
  127.           uchar match;
  128.           rgrm = &levl[0][0];        /* start matching at first rm */
  129.           match = 0;
  130.   
  131. ***************
  132. *** 412,418 ****
  133.               bwrite(fd, (genericptr_t)rgrm, sizeof(struct rm));
  134.               /* start encoding again. we have at least 1 rm
  135.                * in the next run, viz. this one. */
  136. !             match = 1;    
  137.               rgrm = prm;
  138.               }
  139.           }
  140. --- 414,420 ----
  141.               bwrite(fd, (genericptr_t)rgrm, sizeof(struct rm));
  142.               /* start encoding again. we have at least 1 rm
  143.                * in the next run, viz. this one. */
  144. !             match = 1;
  145.               rgrm = prm;
  146.               }
  147.           }
  148. ***************
  149. *** 439,444 ****
  150. --- 441,447 ----
  151.       save_worm(fd, mode);    /* save worm information */
  152.       savetrapchn(fd, ftrap, mode);
  153.       saveobjchn(fd, fobj, mode);
  154. +     saveobjchn(fd, level.buriedobjlist, mode);
  155.       saveobjchn(fd, billobjs, mode);
  156.   
  157.       save_engravings(fd, mode);
  158. ***************
  159. *** 481,487 ****
  160.   
  161.   static void
  162.   bputc(c)
  163. ! unsigned char c;
  164.   {
  165.   #ifdef MFLOPPY
  166.       bytes_counted++;
  167. --- 484,490 ----
  168.   
  169.   static void
  170.   bputc(c)
  171. ! int c;
  172.   {
  173.   #ifdef MFLOPPY
  174.       bytes_counted++;
  175. ***************
  176. *** 492,498 ****
  177.       (void) write(bwritefd, outbuf, sizeof outbuf);
  178.       outbufp = 0;
  179.       }
  180. !     outbuf[outbufp++] = c;
  181.   }
  182.   
  183.   /*ARGSUSED*/
  184. --- 495,501 ----
  185.       (void) write(bwritefd, outbuf, sizeof outbuf);
  186.       outbufp = 0;
  187.       }
  188. !     outbuf[outbufp++] = (unsigned char)c;
  189.   }
  190.   
  191.   /*ARGSUSED*/
  192. ***************
  193. *** 499,504 ****
  194. --- 502,510 ----
  195.   void
  196.   bufon(fd)
  197.       int fd;
  198. + #if defined(applec)
  199. + # pragma unused(fd)
  200. + #endif
  201.   {
  202.       return;
  203.   }
  204. ***************
  205. *** 523,545 ****
  206.   
  207.   void
  208.   bwrite(fd, loc, num)
  209. ! register int fd;
  210.   genericptr_t loc;
  211.   register unsigned num;
  212.   {
  213. !       bwritefd = fd;
  214. !       for (; num; num--, (*(char **)&loc)++) {
  215. !           if (*((char *)loc) == RLESC) { /* One more char in run */
  216. !           if (++outrunlength == 0xFF) {
  217. !               flushoutrun(outrunlength);
  218. !           }
  219. !           } else { /* end of run */
  220. !           if (outrunlength >= 0) {    /* flush run */
  221. !               flushoutrun(outrunlength);
  222. !           }
  223. !           bputc(*((char *)loc));
  224. !           }
  225. !       }
  226.   }
  227.   
  228.   void
  229. --- 529,553 ----
  230.   
  231.   void
  232.   bwrite(fd, loc, num)
  233. ! int fd;
  234.   genericptr_t loc;
  235.   register unsigned num;
  236.   {
  237. !     register unsigned char *bp = (unsigned char *)loc;
  238. !     bwritefd = fd;
  239. !     for (; num; num--, bp++) {
  240. !         if (*bp == RLESC) {    /* One more char in run */
  241. !         if (++outrunlength == 0xFF) {
  242. !             flushoutrun(outrunlength);
  243. !         }
  244. !         } else {        /* end of run */
  245. !         if (outrunlength >= 0) {    /* flush run */
  246. !             flushoutrun(outrunlength);
  247. !         }
  248. !         bputc(*bp);
  249. !         }
  250. !     }
  251.   }
  252.   
  253.   void
  254. ***************
  255. *** 686,692 ****
  256.           bwrite(fd, (genericptr_t) &xl, sizeof(int));
  257.           bwrite(fd, (genericptr_t) otmp, xl + sizeof(struct obj));
  258.   
  259. !         if (Is_container(otmp) || otmp->otyp == STATUE)
  260.           saveobjchn(fd,otmp->cobj,mode);
  261.           if (mode & FREE_SAVE) {
  262.           if(otmp->oclass == FOOD_CLASS) food_disappears(otmp);
  263. --- 694,700 ----
  264.           bwrite(fd, (genericptr_t) &xl, sizeof(int));
  265.           bwrite(fd, (genericptr_t) otmp, xl + sizeof(struct obj));
  266.   
  267. !         if (Has_contents(otmp))
  268.           saveobjchn(fd,otmp->cobj,mode);
  269.           if (mode & FREE_SAVE) {
  270.           if(otmp->oclass == FOOD_CLASS) food_disappears(otmp);
  271. ***************
  272. *** 711,719 ****
  273.   
  274.       while(mtmp) {
  275.           mtmp2 = mtmp->nmon;
  276. - #ifdef MUSE
  277. -         if (mtmp->mw && mtmp->mw != mtmp->minvent) sort_mwep(mtmp);
  278. - #endif
  279.           xl = mtmp->mxlth + mtmp->mnamelth;
  280.           bwrite(fd, (genericptr_t) &xl, sizeof(int));
  281.           bwrite(fd, (genericptr_t) mtmp, xl + sizeof(struct monst));
  282. --- 719,724 ----
  283. *** /tmp/da11362    Tue Jun  1 16:15:45 1993
  284. --- src/shk.c    Tue Jun  1 10:42:27 1993
  285. ***************
  286. *** 1,4 ****
  287. ! /*    SCCS Id: @(#)shk.c    3.1    93/02/09    */
  288.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  289.   /* NetHack may be freely redistributed.  See license for details. */
  290.   
  291. --- 1,4 ----
  292. ! /*    SCCS Id: @(#)shk.c    3.1    93/05/19    */
  293.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  294.   /* NetHack may be freely redistributed.  See license for details. */
  295.   
  296. ***************
  297. *** 59,64 ****
  298. --- 59,65 ----
  299.                         BOOLEAN_P));
  300.   static void FDECL(bill_box_content, (struct obj *, BOOLEAN_P, BOOLEAN_P,
  301.                        struct monst *));
  302. + static void FDECL(shk_names_obj, (struct obj *));
  303.   
  304.   /*
  305.       invariants: obj->unpaid iff onbill(obj) [unless bp->useup]
  306. ***************
  307. *** 128,134 ****
  308.   replshk(mtmp,mtmp2)
  309.   register struct monst *mtmp, *mtmp2;
  310.   {
  311. !     if(inhishop(mtmp) && *u.ushops == ESHK(mtmp)->shoproom) {
  312.           ESHK(mtmp2)->bill_p = &(ESHK(mtmp2)->bill[0]);
  313.       }
  314.   }
  315. --- 129,136 ----
  316.   replshk(mtmp,mtmp2)
  317.   register struct monst *mtmp, *mtmp2;
  318.   {
  319. !     rooms[ESHK(mtmp2)->shoproom - ROOMOFFSET].resident = mtmp2;
  320. !     if (inhishop(mtmp) && *u.ushops == ESHK(mtmp)->shoproom) {
  321.           ESHK(mtmp2)->bill_p = &(ESHK(mtmp2)->bill[0]);
  322.       }
  323.   }
  324. ***************
  325. *** 155,161 ****
  326.   register struct obj *list;
  327.   {
  328.       while (list) {
  329. !     if (Is_container(list)) clear_unpaid(list->cobj);
  330.       list->unpaid = 0;
  331.       list = list->nobj;
  332.       }
  333. --- 157,163 ----
  334.   register struct obj *list;
  335.   {
  336.       while (list) {
  337. !     if (Has_contents(list)) clear_unpaid(list->cobj);
  338.       list->unpaid = 0;
  339.       list = list->nobj;
  340.       }
  341. ***************
  342. *** 170,175 ****
  343. --- 172,178 ----
  344.   
  345.       clear_unpaid(invent);
  346.       clear_unpaid(fobj);
  347. +     clear_unpaid(level.buriedobjlist);
  348.       for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
  349.           clear_unpaid(mtmp->minvent);
  350.       for(mtmp = migrating_mons; mtmp; mtmp = mtmp->nmon)
  351. ***************
  352. *** 303,314 ****
  353.       if(!eshkp->billct && !eshkp->debit)    /* bill is settled */
  354.           return;
  355.   
  356. !     if(!*leavestring) {
  357.           /*
  358.            * Player just stepped onto shop-boundary (known from above logic).
  359.            * Try to intimidate him into paying his bill
  360.            */
  361.           verbalize(NOTANGRY(shkp) ?
  362.                 "%s!  Please pay before leaving." :
  363.                 "%s!  Don't you leave without paying!",
  364. --- 306,316 ----
  365.       if(!eshkp->billct && !eshkp->debit)    /* bill is settled */
  366.           return;
  367.   
  368. !     if (!*leavestring && shkp->mcanmove && !shkp->msleep) {
  369.           /*
  370.            * Player just stepped onto shop-boundary (known from above logic).
  371.            * Try to intimidate him into paying his bill
  372.            */
  373.           verbalize(NOTANGRY(shkp) ?
  374.                 "%s!  Please pay before leaving." :
  375.                 "%s!  Don't you leave without paying!",
  376. ***************
  377. *** 315,327 ****
  378.                 plname);
  379.           return;
  380.       }
  381. -         /* by this point, we know an actual robbery has taken place */
  382. -     You("escaped the shop without paying!");
  383.       total = (addupbill(shkp) + eshkp->debit);
  384. !     eshkp->robbed += total;
  385. !     eshkp->credit = 0L;
  386. !     eshkp->debit = 0L;
  387.       setpaid(shkp);
  388.       You("stole %ld zorkmid%s worth of merchandise.",
  389.           total, plur(total));
  390.       if (pl_character[0] != 'R') /* stealing is unlawful */
  391. --- 317,336 ----
  392.                 plname);
  393.           return;
  394.       }
  395.       total = (addupbill(shkp) + eshkp->debit);
  396. !     if (eshkp->credit >= total) {
  397. !         Your("credit of %ld zorkmid%s is used to cover your shopping bill.",
  398. !          eshkp->credit, plur(eshkp->credit));
  399. !         total = 0L;        /* credit gets cleared by setpaid() */
  400. !     } else {
  401. !         You("escaped the shop without paying!");
  402. !         total -= eshkp->credit;
  403. !     }
  404.       setpaid(shkp);
  405. +     if (!total) return;
  406. +     /* by this point, we know an actual robbery has taken place */
  407. +     eshkp->robbed += total;
  408.       You("stole %ld zorkmid%s worth of merchandise.",
  409.           total, plur(total));
  410.       if (pl_character[0] != 'R') /* stealing is unlawful */
  411. ***************
  412. *** 381,387 ****
  413.           pacify_shk(shkp);
  414.       }
  415.   
  416. !     if (eshkp->following)
  417.           return;
  418.   
  419.       if (Invis) {
  420. --- 390,396 ----
  421.           pacify_shk(shkp);
  422.       }
  423.   
  424. !     if (shkp->msleep || !shkp->mcanmove || eshkp->following) /* no dialog */
  425.           return;
  426.   
  427.       if (Invis) {
  428. ***************
  429. *** 398,405 ****
  430.                 s_suffix(shkname(shkp)),
  431.                 shtypes[rt - SHOPBASE].name);
  432.       } else if (eshkp->robbed) {
  433. !         verbalize("Beware, %s!  I am upset about missing stock!",
  434. !               plname);
  435.       } else {
  436.           verbalize("Hello, %s!  Welcome%s to %s %s!",
  437.                 plname,
  438. --- 407,413 ----
  439.                 s_suffix(shkname(shkp)),
  440.                 shtypes[rt - SHOPBASE].name);
  441.       } else if (eshkp->robbed) {
  442. !         pline("%s mutters imprecations against shoplifters.", shkname(shkp));
  443.       } else {
  444.           verbalize("Hello, %s!  Welcome%s to %s %s!",
  445.                 plname,
  446. ***************
  447. *** 418,423 ****
  448. --- 426,461 ----
  449.       return;
  450.   }
  451.   
  452. + /*
  453. +    Decide whether two unpaid items are mergable; caller is responsible for
  454. +    making sure they're unpaid and the same type of object; we check the price
  455. +    quoted by the shopkeeper and also that they both belong to the same shk.
  456. +  */
  457. + boolean same_price(obj1, obj2)
  458. + struct obj *obj1, *obj2;
  459. + {
  460. +     register struct monst *shkp1, *shkp2;
  461. +     register struct bill_x *bp1 = 0, *bp2 = 0;
  462. +     register boolean are_mergable = FALSE;
  463. +     /* look up the first object by finding shk whose bill it's on */
  464. +     for (shkp1 = next_shkp(fmon, TRUE); shkp1;
  465. +         shkp1 = next_shkp(shkp1, TRUE))
  466. +         if ((bp1 = onbill(obj1, shkp1, TRUE)) != 0) break;
  467. +     /* second object is probably owned by same shk; if not, look harder */
  468. +     if (shkp1 && (bp2 = onbill(obj2, shkp1, TRUE)) != 0) {
  469. +         shkp2 = shkp1;
  470. +     } else {
  471. +         for (shkp2 = next_shkp(fmon, TRUE); shkp2;
  472. +             shkp2 = next_shkp(shkp2, TRUE))
  473. +         if ((bp2 = onbill(obj2, shkp2, TRUE)) != 0) break;
  474. +     }
  475. +     if (!bp1 || !bp2) impossible("same_price: object wasn't on any bill!");
  476. +     else are_mergable = (shkp1 == shkp2 && bp1->price == bp2->price);
  477. +     return are_mergable;
  478. + }
  479.   #endif /* OVL1 */
  480.   #ifdef OVLB
  481.   
  482. ***************
  483. *** 830,835 ****
  484. --- 868,879 ----
  485.           return(0);
  486.       }
  487.   proceed:
  488. +     if (shkp->msleep || !shkp->mcanmove) {
  489. +         pline("%s %s.", Monnam(shkp),
  490. +               rn2(2) ? "seems to be napping" : "doesn't respond");
  491. +         return 0;
  492. +     }
  493.       eshkp = ESHK(shkp);
  494.   
  495.       ltmp = eshkp->robbed;
  496. ***************
  497. *** 1115,1120 ****
  498. --- 1159,1165 ----
  499.       }
  500.   
  501.       pay(ltmp, shkp);
  502. +     shk_names_obj(obj);    /* identify some non-magic objects */
  503.       You("bought %s for %ld gold piece%s.",
  504.           doname(obj), ltmp, plur(ltmp));
  505.       obj->quan = save_quan;        /* restore original count */
  506. ***************
  507. *** 1194,1200 ****
  508.       if(numsk > 1) {
  509.           if(cansee(shkp->mx, shkp->my) && croaked)
  510.           pline("%s %slooks at your corpse%s%s", Monnam(shkp),
  511. !              (shkp->msleep || shkp->mfrozen) ?
  512.                      "wakes up, " : "",
  513.                !rn2(2) ? (shkp->female ? ", shakes her head," :
  514.                    ", shakes his head,") : "",
  515. --- 1239,1245 ----
  516.       if(numsk > 1) {
  517.           if(cansee(shkp->mx, shkp->my) && croaked)
  518.           pline("%s %slooks at your corpse%s%s", Monnam(shkp),
  519. !              (shkp->msleep || !shkp->mcanmove) ?
  520.                      "wakes up, " : "",
  521.                !rn2(2) ? (shkp->female ? ", shakes her head," :
  522.                    ", shakes his head,") : "",
  523. ***************
  524. *** 1231,1237 ****
  525.           if((loss > u.ugold) || !loss) {
  526.               pline("%s %s%stakes all your possessions.",
  527.                   shkname(shkp),
  528. !                 (shkp->msleep || shkp->mfrozen) ?
  529.                      "wakes up and " : "",
  530.                   (distu(shkp->mx, shkp->my) > 2) ?
  531.                       "comes and " : "");
  532. --- 1276,1282 ----
  533.           if((loss > u.ugold) || !loss) {
  534.               pline("%s %s%stakes all your possessions.",
  535.                   shkname(shkp),
  536. !                 (shkp->msleep || !shkp->mcanmove) ?
  537.                      "wakes up and " : "",
  538.                   (distu(shkp->mx, shkp->my) > 2) ?
  539.                       "comes and " : "");
  540. ***************
  541. *** 1272,1278 ****
  542.               shkp->mgold += loss;
  543.               pline("%s %sand takes %ld zorkmid%s %sowed %s.",
  544.                     Monnam(shkp),
  545. !                   (shkp->msleep || shkp->mfrozen) ?
  546.                       "wakes up " : "comes ",
  547.                     loss, plur(loss),
  548.                     strncmp(eshkp->customer,
  549. --- 1317,1323 ----
  550.               shkp->mgold += loss;
  551.               pline("%s %sand takes %ld zorkmid%s %sowed %s.",
  552.                     Monnam(shkp),
  553. !                   (shkp->msleep || !shkp->mcanmove) ?
  554.                       "wakes up " : "comes ",
  555.                     loss, plur(loss),
  556.                     strncmp(eshkp->customer,
  557. ***************
  558. *** 1302,1307 ****
  559. --- 1347,1353 ----
  560.           obj = o_on(id, billobjs);
  561.       else if(!(obj = o_on(id, invent)) &&
  562.           !(obj = o_on(id, fobj)) &&
  563. +         !(obj = o_on(id, level.buriedobjlist)) &&
  564.           !(obj = o_on(id, migrating_objs))) {
  565.               for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
  566.               if ((obj = o_on(id, mtmp->minvent)) != 0)
  567. ***************
  568. *** 1385,1391 ****
  569.               price += get_cost(otmp, shkp);
  570.           }
  571.   
  572. !         if(Is_container(otmp))
  573.               price += contained_cost(otmp, shkp, price, usell);
  574.       }
  575.   
  576. --- 1431,1437 ----
  577.               price += get_cost(otmp, shkp);
  578.           }
  579.   
  580. !         if (Has_contents(otmp))
  581.               price += contained_cost(otmp, shkp, price, usell);
  582.       }
  583.   
  584. ***************
  585. *** 1403,1409 ****
  586.       for (otmp = obj->cobj; otmp; otmp = otmp->nobj)
  587.           if (otmp->oclass == GOLD_CLASS)
  588.           value += otmp->quan;
  589. !         else if (Is_container(otmp))
  590.           value += contained_gold(otmp);
  591.   
  592.       return(value);
  593. --- 1449,1455 ----
  594.       for (otmp = obj->cobj; otmp; otmp = otmp->nobj)
  595.           if (otmp->oclass == GOLD_CLASS)
  596.           value += otmp->quan;
  597. !         else if (Has_contents(otmp))
  598.           value += contained_gold(otmp);
  599.   
  600.       return(value);
  601. ***************
  602. *** 1429,1435 ****
  603.           if(!otmp->unpaid && !(sale && saleitem))
  604.           otmp->no_charge = 1;
  605.   
  606. !         if(Is_container(otmp))
  607.           dropped_container(otmp, shkp, sale);
  608.       }
  609.   }
  610. --- 1475,1481 ----
  611.           if(!otmp->unpaid && !(sale && saleitem))
  612.           otmp->no_charge = 1;
  613.   
  614. !         if (Has_contents(otmp))
  615.           dropped_container(otmp, shkp, sale);
  616.       }
  617.   }
  618. ***************
  619. *** 1448,1454 ****
  620.           if(otmp->no_charge)
  621.           otmp->no_charge = 0;
  622.   
  623. !         if(Is_container(otmp))
  624.           picked_container(otmp);
  625.       }
  626.   }
  627. --- 1494,1500 ----
  628.           if(otmp->no_charge)
  629.           otmp->no_charge = 0;
  630.   
  631. !         if (Has_contents(otmp))
  632.           picked_container(otmp);
  633.       }
  634.   }
  635. ***************
  636. *** 1563,1574 ****
  637.           /* the "top" box is added in addtobill() */
  638.           if(!otmp->no_charge)
  639.               add_one_tobill(otmp, dummy);
  640. !         if(Is_container(otmp))
  641.               bill_box_content(otmp, ininv, dummy, shkp);
  642.       }
  643.   
  644.   }
  645.   
  646.   void
  647.   addtobill(obj, ininv, dummy, silent)
  648.   register struct obj *obj;
  649. --- 1609,1635 ----
  650.           /* the "top" box is added in addtobill() */
  651.           if(!otmp->no_charge)
  652.               add_one_tobill(otmp, dummy);
  653. !         if (Has_contents(otmp))
  654.               bill_box_content(otmp, ininv, dummy, shkp);
  655.       }
  656.   
  657.   }
  658.   
  659. + static void
  660. + shk_names_obj(obj)
  661. + register struct obj *obj;
  662. + /* shopkeeper tells you what an object is */
  663. + {
  664. +     obj->dknown = TRUE;
  665. +     /* use real name for ordinary weapons/armor, and spell-less
  666. +      * scrolls/books (that is, blank and mail).
  667. +      */
  668. +     if (!objects[obj->otyp].oc_magic &&
  669. +         (obj->oclass == WEAPON_CLASS || obj->oclass == ARMOR_CLASS ||
  670. +          obj->oclass == SCROLL_CLASS || obj->oclass == SPBOOK_CLASS))
  671. +         makeknown(obj->otyp);
  672. + }
  673.   void
  674.   addtobill(obj, ininv, dummy, silent)
  675.   register struct obj *obj;
  676. ***************
  677. *** 1577,1583 ****
  678.       register struct monst *shkp;
  679.       register char roomno = *u.ushops;
  680.       long ltmp = 0L, cltmp = 0L, gltmp = 0L;
  681. !     register boolean container = Is_container(obj);
  682.   
  683.       if(!*u.ushops) return;
  684.   
  685. --- 1638,1644 ----
  686.       register struct monst *shkp;
  687.       register char roomno = *u.ushops;
  688.       long ltmp = 0L, cltmp = 0L, gltmp = 0L;
  689. !     register boolean container = Has_contents(obj);
  690.   
  691.       if(!*u.ushops) return;
  692.   
  693. ***************
  694. *** 1639,1645 ****
  695.       } else /* i.e., !container */
  696.           add_one_tobill(obj, dummy);
  697.   speak:
  698. !     if(!shkp->msleep && !shkp->mfrozen && !silent) {
  699.           char buf[BUFSZ];
  700.   
  701.           if(!ltmp) {
  702. --- 1700,1706 ----
  703.       } else /* i.e., !container */
  704.           add_one_tobill(obj, dummy);
  705.   speak:
  706. !     if (shkp->mcanmove && !shkp->msleep && !silent) {
  707.           char buf[BUFSZ];
  708.   
  709.           if(!ltmp) {
  710. ***************
  711. *** 1650,1667 ****
  712.           Strcpy(buf, "\"For you, ");
  713.           if (ANGRY(shkp)) Strcat(buf, "scum ");
  714.           else {
  715. !         switch(rnd(4) + u.uevent.udemigod) {
  716. !           case 1: Strcat(buf, "good");
  717. !               break;
  718. !           case 2: Strcat(buf, "honored");
  719. !               break;
  720. !           case 3: Strcat(buf, "most gracious");
  721. !               break;
  722. !           case 4: Strcat(buf, "esteemed");
  723. !               break;
  724. !           case 5: Strcat(buf, "most renowned and sacred");
  725. !               break;
  726. !         }
  727.   #ifdef POLYSELF
  728.           if(!is_human(uasmon)) Strcat(buf, " creature");
  729.           else
  730. --- 1711,1721 ----
  731.           Strcpy(buf, "\"For you, ");
  732.           if (ANGRY(shkp)) Strcat(buf, "scum ");
  733.           else {
  734. !         static const char *honored[5] = {
  735. !           "good", "honored", "most gracious", "esteemed",
  736. !           "most renowned and sacred"
  737. !         };
  738. !         Strcat(buf, honored[rn2(4) + u.uevent.udemigod]);
  739.   #ifdef POLYSELF
  740.           if(!is_human(uasmon)) Strcat(buf, " creature");
  741.           else
  742. ***************
  743. *** 1668,1676 ****
  744.   #endif
  745.               Strcat(buf, (flags.female) ? " lady" : " sir");
  746.           }
  747. -         /* after all, the shk is telling you what it is */
  748. -         obj->dknown = 1;
  749. -         exercise(A_WIS, TRUE);
  750.           if(ininv) {
  751.           long quan = obj->quan;
  752.           obj->quan = 1L; /* fool xname() into giving singular */
  753. --- 1722,1727 ----
  754. ***************
  755. *** 1777,1787 ****
  756.   
  757.       sub_one_frombill(obj, shkp);
  758.   
  759. !     if(Is_container(obj))
  760.           for(otmp = obj->cobj; otmp; otmp = otmp->nobj) {
  761.           if(otmp->oclass == GOLD_CLASS) continue;
  762.   
  763. !         if(Is_container(otmp))
  764.               subfrombill(otmp, shkp);
  765.           else
  766.               sub_one_frombill(otmp, shkp);
  767. --- 1828,1838 ----
  768.   
  769.       sub_one_frombill(obj, shkp);
  770.   
  771. !     if (Has_contents(obj))
  772.           for(otmp = obj->cobj; otmp; otmp = otmp->nobj) {
  773.           if(otmp->oclass == GOLD_CLASS) continue;
  774.   
  775. !         if (Has_contents(otmp))
  776.               subfrombill(otmp, shkp);
  777.           else
  778.               sub_one_frombill(otmp, shkp);
  779. ***************
  780. *** 1810,1816 ****
  781.   
  782.           if(otmp->oclass == GOLD_CLASS) continue;
  783.   
  784. !         if(!Is_container(otmp)) {
  785.           if(ininv) {
  786.               if(otmp->unpaid)
  787.               price += get_cost(otmp, shkp);
  788. --- 1861,1867 ----
  789.   
  790.           if(otmp->oclass == GOLD_CLASS) continue;
  791.   
  792. !         if (!Has_contents(otmp)) {
  793.           if(ininv) {
  794.               if(otmp->unpaid)
  795.               price += get_cost(otmp, shkp);
  796. ***************
  797. *** 1852,1858 ****
  798.   
  799.       if(obj->oclass == GOLD_CLASS) {
  800.           gvalue += obj->quan;
  801. !     } else if(Is_container(obj)) {
  802.           register boolean ininv = !!count_unpaid(obj->cobj);
  803.   
  804.           value += stolen_container(obj, shkp, value, ininv);
  805. --- 1903,1909 ----
  806.   
  807.       if(obj->oclass == GOLD_CLASS) {
  808.           gvalue += obj->quan;
  809. !     } else if (Has_contents(obj)) {
  810.           register boolean ininv = !!count_unpaid(obj->cobj);
  811.   
  812.           value += stolen_container(obj, shkp, value, ininv);
  813. ***************
  814. *** 1918,1924 ****
  815.       register struct monst *shkp;
  816.       register struct eshk *eshkp;
  817.       register long ltmp = 0L, cltmp = 0L, gltmp = 0L, offer;
  818. !     boolean saleitem, cgold = FALSE, container = Is_container(obj);
  819.       boolean isgold = (obj->oclass == GOLD_CLASS);
  820.   
  821.       if(!(shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) ||
  822. --- 1969,1975 ----
  823.       register struct monst *shkp;
  824.       register struct eshk *eshkp;
  825.       register long ltmp = 0L, cltmp = 0L, gltmp = 0L, offer;
  826. !     boolean saleitem, cgold = FALSE, container = Has_contents(obj);
  827.       boolean isgold = (obj->oclass == GOLD_CLASS);
  828.   
  829.       if(!(shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) ||
  830. ***************
  831. *** 1934,1951 ****
  832.           return;
  833.       }
  834.       if(container) {
  835. -         if(obj->cobj == (struct obj *)0) {
  836. -         if(obj->unpaid) {
  837. -             sub_one_frombill(obj, shkp);
  838. -             return;
  839. -         }
  840. -         } else {
  841.           /* find the price of content before subfrombill */
  842.           cltmp += contained_cost(obj, shkp, cltmp, TRUE);
  843.           /* find the value of contained gold */
  844.           gltmp += contained_gold(obj);
  845.           cgold = (gltmp > 0L);
  846. -         }
  847.       }
  848.   
  849.       if(!isgold && !obj->unpaid && saleitem)
  850. --- 1985,1995 ----
  851. ***************
  852. *** 1959,1971 ****
  853.                     (container && count_unpaid(obj->cobj)));
  854.   
  855.           if(container) {
  856. -             if(obj->cobj != (struct obj *)0) {
  857.               dropped_container(obj, shkp, FALSE);
  858.               if(!obj->unpaid && !saleitem)
  859.                   obj->no_charge = 1;
  860.               if(obj->unpaid || count_unpaid(obj->cobj))
  861.                   subfrombill(obj, shkp);
  862. -             } else obj->no_charge = 1;
  863.           } else obj->no_charge = 1;
  864.   
  865.           if(!unpaid)
  866. --- 2003,2013 ----
  867. ***************
  868. *** 1974,1986 ****
  869.       }
  870.   
  871.       /* you dropped something of your own - probably want to sell it */
  872. !     if(shkp->msleep || !shkp->mcanmove) {
  873. !         if(container && obj->cobj != (struct obj *)0) {
  874.               dropped_container(obj, shkp, TRUE);
  875. !         }
  876. !         if(!obj->unpaid && !saleitem && !isgold)
  877.               obj->no_charge = 1;
  878. !         if(!shkp->mcanmove) {
  879.               if(ANGRY(shkp) && !rn2(4))
  880.               pline("%s utters a curse.", Monnam(shkp));
  881.               else pline("%s is indisposed.", Monnam(shkp));
  882. --- 2016,2027 ----
  883.       }
  884.   
  885.       /* you dropped something of your own - probably want to sell it */
  886. !     if (shkp->msleep || !shkp->mcanmove) {
  887. !         if (container)
  888.               dropped_container(obj, shkp, TRUE);
  889. !         if (!obj->unpaid)
  890.               obj->no_charge = 1;
  891. !         if (!shkp->mcanmove) {
  892.               if(ANGRY(shkp) && !rn2(4))
  893.               pline("%s utters a curse.", Monnam(shkp));
  894.               else pline("%s is indisposed.", Monnam(shkp));
  895. ***************
  896. *** 2037,2048 ****
  897.           if(offer) goto move_on;
  898.           else {
  899.               if(!isgold) {
  900. !                 if(container && obj->cobj != (struct obj *)0) {
  901.                   dropped_container(obj, shkp, FALSE);
  902. !                 }
  903. !                 if(!obj->unpaid && !saleitem)
  904. !                 obj->no_charge = 1;
  905. !                 subfrombill(obj, shkp);
  906.               }
  907.               return;
  908.           }
  909. --- 2078,2087 ----
  910.           if(offer) goto move_on;
  911.           else {
  912.               if(!isgold) {
  913. !             if (container)
  914.                   dropped_container(obj, shkp, FALSE);
  915. !             if (!obj->unpaid && !saleitem) obj->no_charge = 1;
  916. !             subfrombill(obj, shkp);
  917.               }
  918.               return;
  919.           }
  920. ***************
  921. *** 2056,2087 ****
  922.          || (Is_candle(obj) &&
  923.              obj->age < 20L * (long)objects[obj->otyp].oc_cost)) {
  924.           pline("%s seems not interested%s.", Monnam(shkp),
  925. !                        cgold ? " in the rest" : "");
  926. !         if(container && obj->cobj != (struct obj *)0) {
  927.               dropped_container(obj, shkp, FALSE);
  928. -         }
  929.           obj->no_charge = 1;
  930.           return;
  931.       }
  932.   
  933.       if(!shkp->mgold) {
  934.           long tmpcr = (ltmp + cltmp) * 2L;
  935.   
  936. !         pline("%s cannot pay you at present.", Monnam(shkp));
  937. !         pline("Will you accept %ld zorkmids in credit for %s? ",
  938. !                      tmpcr, doname(obj));
  939. !         /* cannot use a yn function here */
  940. !         if (readchar() == 'y') {
  941.               You("have %ld zorkmids in %scredit.", tmpcr,
  942. !                 ESHK(shkp)->credit > 0L ? "additional " : "");
  943.               ESHK(shkp)->credit += tmpcr;
  944.               subfrombill(obj, shkp);
  945.           } else {
  946. !             if(container && obj->cobj != (struct obj *)0) {
  947. !                 dropped_container(obj, shkp, FALSE);
  948. !             }
  949. !             if(!obj->unpaid)
  950. !             obj->no_charge = 1;
  951.               subfrombill(obj, shkp);
  952.           }
  953.       } else {
  954. --- 2095,2131 ----
  955.          || (Is_candle(obj) &&
  956.              obj->age < 20L * (long)objects[obj->otyp].oc_cost)) {
  957.           pline("%s seems not interested%s.", Monnam(shkp),
  958. !             cgold ? " in the rest" : "");
  959. !         if (container)
  960.               dropped_container(obj, shkp, FALSE);
  961.           obj->no_charge = 1;
  962.           return;
  963.       }
  964.   
  965.       if(!shkp->mgold) {
  966. +         char c, qbuf[BUFSZ];
  967.           long tmpcr = (ltmp + cltmp) * 2L;
  968.   
  969. !         if (sell_response != 'n') {
  970. !             pline("%s cannot pay you at present.", Monnam(shkp));
  971. !             Sprintf(qbuf,
  972. !                 "Will you accept %ld zorkmids in credit for %s? ",
  973. !                 tmpcr, doname(obj));
  974. !             /* won't accept 'a' response here */
  975. !             c = ynq(qbuf);
  976. !         } else        /* previously specified "quit" */
  977. !             c = 'n';
  978. !         if (c == 'y') {
  979.               You("have %ld zorkmids in %scredit.", tmpcr,
  980. !             ESHK(shkp)->credit > 0L ? "additional " : "");
  981.               ESHK(shkp)->credit += tmpcr;
  982.               subfrombill(obj, shkp);
  983.           } else {
  984. !             if (c == 'q') sell_response = 'n';
  985. !             if (container)
  986. !             dropped_container(obj, shkp, FALSE);
  987. !             if (!obj->unpaid) obj->no_charge = 1;
  988.               subfrombill(obj, shkp);
  989.           }
  990.       } else {
  991. ***************
  992. *** 2113,2130 ****
  993.   
  994.           switch (sell_response ? sell_response : ynaq(qbuf)) {
  995.            case 'q':  sell_response = 'n';
  996. !          case 'n':  if(container && obj->cobj != (struct obj *)0) {
  997.                   dropped_container(obj, shkp, FALSE);
  998. !                 }
  999. !                     if(!obj->unpaid) obj->no_charge = 1;
  1000.                   subfrombill(obj, shkp);
  1001.                   break;
  1002.            case 'a':  sell_response = 'y';
  1003. !          case 'y':  if(container && obj->cobj != (struct obj *)0)
  1004. !                         dropped_container(obj, shkp, TRUE);
  1005. !                     if(!obj->unpaid && !saleitem)
  1006. !                     obj->no_charge = 1;
  1007. !                     subfrombill(obj, shkp);
  1008.                   pay(-offer, shkp);
  1009.                   You("sold %s for %ld gold piece%s.", doname(obj),
  1010.                   offer, plur(offer));
  1011. --- 2157,2172 ----
  1012.   
  1013.           switch (sell_response ? sell_response : ynaq(qbuf)) {
  1014.            case 'q':  sell_response = 'n';
  1015. !          case 'n':  if (container)
  1016.                   dropped_container(obj, shkp, FALSE);
  1017. !                 if (!obj->unpaid) obj->no_charge = 1;
  1018.                   subfrombill(obj, shkp);
  1019.                   break;
  1020.            case 'a':  sell_response = 'y';
  1021. !          case 'y':  if (container)
  1022. !                 dropped_container(obj, shkp, TRUE);
  1023. !                 if (!obj->unpaid && !saleitem) obj->no_charge = 1;
  1024. !                 subfrombill(obj, shkp);
  1025.                   pay(-offer, shkp);
  1026.                   You("sold %s for %ld gold piece%s.", doname(obj),
  1027.                   offer, plur(offer));
  1028. ***************
  1029. *** 2179,2194 ****
  1030.           goto quit;
  1031.           }
  1032.           if(bp->useup || bp->bquan > obj->quan) {
  1033. !         register long oquan, uquan;
  1034. !         long thisused;
  1035.   
  1036.           oquan = obj->quan;
  1037.           uquan = (bp->useup ? bp->bquan : bp->bquan - oquan);
  1038.           thisused = bp->price * uquan;
  1039.           totused += thisused;
  1040.           obj->quan = uquan;        /* cheat doname */
  1041.           buf_p = xprname(obj, ' ', FALSE, thisused);
  1042.           obj->quan = oquan;        /* restore value */
  1043.           putstr(datawin, 0, buf_p);
  1044.           }
  1045.       }
  1046. --- 2221,2244 ----
  1047.           goto quit;
  1048.           }
  1049.           if(bp->useup || bp->bquan > obj->quan) {
  1050. !         register long oquan, uquan, thisused;
  1051. !         unsigned save_unpaid;
  1052.   
  1053. +         save_unpaid = obj->unpaid;
  1054.           oquan = obj->quan;
  1055.           uquan = (bp->useup ? bp->bquan : bp->bquan - oquan);
  1056.           thisused = bp->price * uquan;
  1057.           totused += thisused;
  1058.           obj->quan = uquan;        /* cheat doname */
  1059. +         obj->unpaid = 0;        /* ditto */
  1060.           buf_p = xprname(obj, ' ', FALSE, thisused);
  1061.           obj->quan = oquan;        /* restore value */
  1062. + #ifdef __SASC
  1063. +                 /* SAS/C 6.2 can't cope for some reason */
  1064. +         sasc_bug(obj,save_unpaid);
  1065. + #else
  1066. +         obj->unpaid = save_unpaid;
  1067. + #endif
  1068.           putstr(datawin, 0, buf_p);
  1069.           }
  1070.       }
  1071. ***************
  1072. *** 2236,2241 ****
  1073. --- 2286,2292 ----
  1074.       return tmp;
  1075.   }
  1076.   
  1077. + /* shk catches thrown pick-axe */
  1078.   int
  1079.   shkcatch(obj, x, y)
  1080.   register struct obj *obj;
  1081. ***************
  1082. *** 2403,2409 ****
  1083.   
  1084.       if ((monstermoves - tmp_dam->when) < REPAIR_DELAY)
  1085.           return(0);
  1086. !     if (ESHK(shkp)->following)
  1087.           return(0);
  1088.       x = tmp_dam->place.x;
  1089.       y = tmp_dam->place.y;
  1090. --- 2454,2460 ----
  1091.   
  1092.       if ((monstermoves - tmp_dam->when) < REPAIR_DELAY)
  1093.           return(0);
  1094. !     if (shkp->msleep || !shkp->mcanmove || ESHK(shkp)->following)
  1095.           return(0);
  1096.       x = tmp_dam->place.x;
  1097.       y = tmp_dam->place.y;
  1098. ***************
  1099. *** 2448,2455 ****
  1100.                   y+vert(i)) == ESHK(shkp)->shoproom)
  1101.               litter[i] |= INSHOP;
  1102.           }
  1103. !         if (Punished && ((uchain->ox == x && uchain->oy == y) ||
  1104. !                     (uball->ox == x && uball->oy == y))) {
  1105.           /*
  1106.            * Either the ball or chain is in the repair location.
  1107.            *
  1108. --- 2499,2507 ----
  1109.                   y+vert(i)) == ESHK(shkp)->shoproom)
  1110.               litter[i] |= INSHOP;
  1111.           }
  1112. !         if (Punished && !u.uswallow &&
  1113. !                 ((uchain->ox == x && uchain->oy == y) ||
  1114. !                  (uball->ox == x && uball->oy == y))) {
  1115.           /*
  1116.            * Either the ball or chain is in the repair location.
  1117.            *
  1118. ***************
  1119. *** 2872,2878 ****
  1120.           break;
  1121.       /* note: otmp might have ->no_charge set, but that's ok */
  1122.       return (otmp && costly_spot(x, y) && NOTANGRY(shkp)
  1123. !         && !shkp->msleep && !shkp->mfrozen)
  1124.           ? otmp : (struct obj *)0;
  1125.   }
  1126.   
  1127. --- 2924,2930 ----
  1128.           break;
  1129.       /* note: otmp might have ->no_charge set, but that's ok */
  1130.       return (otmp && costly_spot(x, y) && NOTANGRY(shkp)
  1131. !         && shkp->mcanmove && !shkp->msleep)
  1132.           ? otmp : (struct obj *)0;
  1133.   }
  1134.   
  1135. ***************
  1136. *** 2950,2955 ****
  1137. --- 3002,3048 ----
  1138.       return ".";
  1139.   }
  1140.   
  1141. + #ifdef SOUNDS
  1142. + void
  1143. + shk_chat(shkp)
  1144. + register struct monst *shkp;
  1145. + {
  1146. +     register struct eshk *eshk = ESHK(shkp);
  1147. +     if (ANGRY(shkp))
  1148. +         pline("%s mentions how much %s dislikes %s customers.",
  1149. +             shkname(shkp), he[shkp->female],
  1150. +             eshk->robbed ? "non-paying" : "rude");
  1151. +     else if (eshk->following)
  1152. +         if (strncmp(eshk->customer, plname, PL_NSIZ)) {
  1153. +             verbalize("Hello %s!  I was looking for %s.",
  1154. +                 plname, eshk->customer);
  1155. +             eshk->following = 0;
  1156. +         } else {
  1157. +             verbalize("Hello %s!  Didn't you forget to pay?", plname);
  1158. +         }
  1159. +     else if (eshk->billct) {
  1160. +         register long total = addupbill(shkp) + eshk->debit;
  1161. +         pline("%s says that your bill comes to %ld zorkmid%s.",
  1162. +               shkname(shkp), total, plur(total));
  1163. +     } else if (eshk->debit)
  1164. +         pline("%s reminds you that you owe %s %ld zorkmid%s.",
  1165. +               shkname(shkp), him[shkp->female],
  1166. +               eshk->debit, plur(eshk->debit));
  1167. +     else if (eshk->credit)
  1168. +         pline("%s encourages you to use your %ld zorkmid%s of credit.",
  1169. +               shkname(shkp), eshk->credit, plur(eshk->credit));
  1170. +     else if (eshk->robbed)
  1171. +         pline("%s complains about a recent robbery.", shkname(shkp));
  1172. +     else if (shkp->mgold < 50)
  1173. +         pline("%s complains that business is bad.", shkname(shkp));
  1174. +     else if (shkp->mgold > 4000)
  1175. +         pline("%s says that business is good.", shkname(shkp));
  1176. +     else
  1177. +         pline("%s talks about the problem of shoplifters.", shkname(shkp));
  1178. + }
  1179. + #endif  /* SOUNDS */
  1180.   #ifdef KOPS
  1181.   static void
  1182.   kops_gone(silent)
  1183. ***************
  1184. *** 3008,3014 ****
  1185.       } else if (otmp->oclass == SPBOOK_CLASS) {
  1186.               tmp -= tmp / 5L;
  1187.       } else if (otmp->otyp == CAN_OF_GREASE)
  1188. !                 tmp /= 10L;
  1189.       return(tmp);
  1190.   }
  1191.   
  1192. --- 3101,3107 ----
  1193.       } else if (otmp->oclass == SPBOOK_CLASS) {
  1194.               tmp -= tmp / 5L;
  1195.       } else if (otmp->otyp == CAN_OF_GREASE)
  1196. !             tmp /= 10L;
  1197.       return(tmp);
  1198.   }
  1199.   
  1200. ***************
  1201. *** 3140,3144 ****
  1202. --- 3233,3243 ----
  1203.   }
  1204.   
  1205.   #endif /* OVLB */
  1206. + #ifdef __SASC
  1207. + sasc_bug(struct obj *op, unsigned x){
  1208. +     op->unpaid=x;
  1209. + }
  1210. + #endif
  1211.   
  1212.   /*shk.c*/
  1213. *** /tmp/da11370    Tue Jun  1 16:15:50 1993
  1214. --- src/shknam.c    Mon May 17 14:05:04 1993
  1215. ***************
  1216. *** 1,4 ****
  1217. ! /*    SCCS Id: @(#)shknam.c    3.1    93/02/17    */
  1218.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1219.   /* NetHack may be freely redistributed.  See license for details. */
  1220.   
  1221. --- 1,4 ----
  1222. ! /*    SCCS Id: @(#)shknam.c    3.1    93/05/15    */
  1223.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1224.   /* NetHack may be freely redistributed.  See license for details. */
  1225.   
  1226. ***************
  1227. *** 10,16 ****
  1228.   #ifdef OVLB
  1229.   
  1230.   static void FDECL(mkshobj_at, (const struct shclass *,int,int));
  1231. ! static void FDECL(findname, (char *,const char **));
  1232.   static int  FDECL(shkinit, (const struct shclass *,struct mkroom *));
  1233.   
  1234.   static const char *shkliquors[] = {
  1235. --- 10,16 ----
  1236.   #ifdef OVLB
  1237.   
  1238.   static void FDECL(mkshobj_at, (const struct shclass *,int,int));
  1239. ! static void FDECL(nameshk, (struct monst *,const char **));
  1240.   static int  FDECL(shkinit, (const struct shclass *,struct mkroom *));
  1241.   
  1242.   static const char *shkliquors[] = {
  1243. ***************
  1244. *** 123,128 ****
  1245. --- 123,140 ----
  1246.       ""
  1247.   };
  1248.   
  1249. + static const char *shklight[] = {
  1250. +     /* Romania */
  1251. +     "Zarnesti", "Slanic", "Nehoiasu", "Ludus", "Sighisoara", "Nisipitu",
  1252. +     "Razboieni", "Bicaz", "Dorohoi", "Vaslui", "Fetesti", "Tirgu Neamt",
  1253. +     "Babadag", "Zimnicea", "Zlatna", "Jiu", "Eforie", "Mamaia",
  1254. +     /* Bulgaria */
  1255. +     "Silistra", "Tulovo", "Panagyuritshte", "Smolyan", "Kirklareli",
  1256. +     "Pernik", "Lom", "Haskovo", "Dobrinishte", "Varvara", "Oryahovo",
  1257. +     "Troyan", "Lovech", "Sliven",
  1258. +     ""
  1259. + };
  1260.   static const char *shkgeneral[] = {
  1261.       /* Suriname */
  1262.       "Hebiwerie", "Possogroenoe", "Asidonhopo", "Manlobbi",
  1263. ***************
  1264. *** 191,197 ****
  1265.        */
  1266.       {"lighting store", TOOL_CLASS, 0, D_SHOP,
  1267.           {{32, -WAX_CANDLE}, {50, -TALLOW_CANDLE},
  1268. !          {5, -BRASS_LANTERN}, {10, -OIL_LAMP}, {3, -MAGIC_LAMP}},shktools},
  1269.       {NULL, 0, 0, 0, {{0, 0}, {0, 0}, {0, 0}}, 0}
  1270.   };
  1271.   
  1272. --- 203,209 ----
  1273.        */
  1274.       {"lighting store", TOOL_CLASS, 0, D_SHOP,
  1275.           {{32, -WAX_CANDLE}, {50, -TALLOW_CANDLE},
  1276. !          {5, -BRASS_LANTERN}, {10, -OIL_LAMP}, {3, -MAGIC_LAMP}}, shklight},
  1277.       {NULL, 0, 0, 0, {{0, 0}, {0, 0}, {0, 0}}, 0}
  1278.   };
  1279.   
  1280. ***************
  1281. *** 247,273 ****
  1282.       else (void) mkobj_at(atype, sx, sy, TRUE);
  1283.   }
  1284.   
  1285. - static void
  1286. - findname(nampt, nlp)
  1287.   /* extract a shopkeeper name for the given shop type */
  1288. !     char *nampt;
  1289. !     const char *nlp[];
  1290.   {
  1291. !     register int i;
  1292.   
  1293. !     for(i = 0; i < ledger_no(&u.uz); i++) /* Note: _not_ depth */
  1294. !     if (!*nlp[i]) {
  1295. !         /* Not enough names, try random/general name */
  1296. !         if((i = rn2(i)))
  1297. !         break;
  1298. !         else if (nlp != shkgeneral)
  1299. !         findname(nampt, shkgeneral);
  1300. !         else
  1301. !         Strcpy(nampt, "Dirk");
  1302. !         return;
  1303.       }
  1304. !     (void) strncpy(nampt, nlp[i-1], PL_NSIZ);
  1305. !     nampt[PL_NSIZ-1] = 0;
  1306.   }
  1307.   
  1308.   static int
  1309. --- 259,313 ----
  1310.       else (void) mkobj_at(atype, sx, sy, TRUE);
  1311.   }
  1312.   
  1313.   /* extract a shopkeeper name for the given shop type */
  1314. ! static void
  1315. ! nameshk(shk, nlp)
  1316. ! struct monst *shk;
  1317. ! const char *nlp[];
  1318.   {
  1319. !     int i, try, names_avail;
  1320. !     const char *shname = 0;
  1321. !     struct monst *mtmp;
  1322. !     int name_wanted = ledger_no(&u.uz);    /* Note: _not_ depth */
  1323.   
  1324. !     for (names_avail = 0; *nlp[names_avail]; names_avail++)
  1325. !         ;
  1326. !     for (try = 0; try < 50; try++) {
  1327. !         if (nlp == shktools) {
  1328. !             shname = shktools[rn2(names_avail)];
  1329. !             shk->female = (*shname == '_');
  1330. !             if (shk->female) shname++;
  1331. !         } else {
  1332. !             shk->female = name_wanted % 2;
  1333. !             if (name_wanted < names_avail) {
  1334. !             shname = nlp[name_wanted];
  1335. !             } else {
  1336. !             if ((i = rn2(names_avail)) != 0)
  1337. !                 shname = nlp[i-1];
  1338. !             else if (nlp != shkgeneral) {
  1339. !                 nlp = shkgeneral;    /* try general names */
  1340. !                 for (names_avail = 0; *nlp[names_avail];
  1341. !                                 names_avail++)
  1342. !                     ;
  1343. !                 continue;
  1344. !             } else
  1345. !                 shname = "Dirk";
  1346. !             }
  1347. !         }
  1348. !         /* is name already is use on this level? */
  1349. !         for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
  1350. !             if (mtmp == shk) continue;
  1351. !             if (!mtmp->isshk) continue;
  1352. !             if (strcmp(ESHK(mtmp)->shknam, shname)) continue;
  1353. !             break;
  1354. !         }
  1355. !         if (!mtmp) break;    /* new name */
  1356.       }
  1357. !     (void) strncpy(ESHK(shk)->shknam, shname, PL_NSIZ);
  1358. !     ESHK(shk)->shknam[PL_NSIZ-1] = 0;
  1359.   }
  1360.   
  1361.   static int
  1362. ***************
  1363. *** 328,336 ****
  1364.   
  1365.       /* now initialize the shopkeeper monster structure */
  1366.       if(!(shk = makemon(&mons[PM_SHOPKEEPER], sx, sy))) return(-1);
  1367. !     shk->isshk = shk->mpeaceful = 1;
  1368.       set_malign(shk);
  1369. !     shk->msleep = 0;
  1370.       shk->mtrapseen = ~0;    /* we know all the traps already */
  1371.       ESHK(shk)->shoproom = (sroom - rooms) + ROOMOFFSET;
  1372.       sroom->resident = shk;
  1373. --- 368,376 ----
  1374.   
  1375.       /* now initialize the shopkeeper monster structure */
  1376.       if(!(shk = makemon(&mons[PM_SHOPKEEPER], sx, sy))) return(-1);
  1377. !     shk->isshk = shk->mpeaceful = TRUE;
  1378.       set_malign(shk);
  1379. !     shk->msleep = FALSE;
  1380.       shk->mtrapseen = ~0;    /* we know all the traps already */
  1381.       ESHK(shk)->shoproom = (sroom - rooms) + ROOMOFFSET;
  1382.       sroom->resident = shk;
  1383. ***************
  1384. *** 347,362 ****
  1385.       ESHK(shk)->following = 0;
  1386.       ESHK(shk)->billct = 0;
  1387.       shk->mgold = 1000L + 30L*(long)rnd(100);    /* initial capital */
  1388. !     if (shp->shknms == shktools) {
  1389. !         int who = rn2(SIZE(shktools) - 1);
  1390. !         const char *shname = shp->shknms[who];
  1391. !         if (shk->female = (*shname == '_')) shname++;
  1392. !         (void) strncpy(ESHK(shk)->shknam, shname, PL_NSIZ);
  1393. !         ESHK(shk)->shknam[PL_NSIZ-1] = 0;
  1394. !     } else {
  1395. !         shk->female = ledger_no(&u.uz)%2;
  1396. !         findname(ESHK(shk)->shknam, shp->shknms);
  1397. !     }
  1398.   
  1399.       return(sh);
  1400.   }
  1401. --- 387,393 ----
  1402.       ESHK(shk)->following = 0;
  1403.       ESHK(shk)->billct = 0;
  1404.       shk->mgold = 1000L + 30L*(long)rnd(100);    /* initial capital */
  1405. !     nameshk(shk, shp->shknms);
  1406.   
  1407.       return(sh);
  1408.   }
  1409. ***************
  1410. *** 427,433 ****
  1411.        * monsters will sit on top of objects and not the other way around.
  1412.        */
  1413.   
  1414. !     level.flags.has_shop = 1;
  1415.   }
  1416.   
  1417.   #endif /* OVLB */
  1418. --- 458,464 ----
  1419.        * monsters will sit on top of objects and not the other way around.
  1420.        */
  1421.   
  1422. !     level.flags.has_shop = TRUE;
  1423.   }
  1424.   
  1425.   #endif /* OVLB */
  1426. *** /tmp/da11378    Tue Jun  1 16:15:53 1993
  1427. --- src/sit.c    Thu May 20 15:43:51 1993
  1428. ***************
  1429. *** 1,4 ****
  1430. ! /*    SCCS Id: @(#)sit.c    3.1    92/10/24    */
  1431.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1432.   /* NetHack may be freely redistributed.  See license for details. */
  1433.   
  1434. --- 1,4 ----
  1435. ! /*    SCCS Id: @(#)sit.c    3.1    93/05/19    */
  1436.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1437.   /* NetHack may be freely redistributed.  See license for details. */
  1438.   
  1439. ***************
  1440. *** 36,42 ****
  1441.           You("sit on %s.", the(xname(obj)));
  1442.           if(!Is_box(obj)) pline("It's not very comfortable...");
  1443.   
  1444. !     } else if(trap = t_at(u.ux, u.uy)) {
  1445.   
  1446.           if (u.utrap) {
  1447.           exercise(A_WIS, FALSE);    /* you're getting stuck longer */
  1448. --- 36,42 ----
  1449.           You("sit on %s.", the(xname(obj)));
  1450.           if(!Is_box(obj)) pline("It's not very comfortable...");
  1451.   
  1452. !     } else if ((trap = t_at(u.ux, u.uy)) != 0) {
  1453.   
  1454.           if (u.utrap) {
  1455.           exercise(A_WIS, FALSE);    /* you're getting stuck longer */
  1456. ***************
  1457. *** 211,219 ****
  1458.               You("are granted an insight!");
  1459.               if (invent) {
  1460.                   int ret, cval = rn2(5); /* agrees w/seffects() */
  1461.                   do {
  1462.                   ret = ggetobj("identify", identify, cval);
  1463. !                 } while (cval && (cval -= ret));
  1464.               }
  1465.               break;
  1466.               case 13:
  1467. --- 211,221 ----
  1468.               You("are granted an insight!");
  1469.               if (invent) {
  1470.                   int ret, cval = rn2(5); /* agrees w/seffects() */
  1471. +                 /* use up `cval' "charges"; 0 is special case */
  1472.                   do {
  1473.                   ret = ggetobj("identify", identify, cval);
  1474. !                 if (ret < 0) break;    /* quit */
  1475. !                 } while (ret == 0 || (cval -= ret) > 0);
  1476.               }
  1477.               break;
  1478.               case 13:
  1479. ***************
  1480. *** 261,267 ****
  1481.       } else if (u.uswallow)
  1482.           pline("There are no seats in here!");
  1483.       else
  1484. !         pline("Having fun sitting on the floor?");
  1485.       return(1);
  1486.   }
  1487.   
  1488. --- 263,269 ----
  1489.       } else if (u.uswallow)
  1490.           pline("There are no seats in here!");
  1491.       else
  1492. !         pline("Having fun sitting on the %s?", surface(u.ux,u.uy));
  1493.       return(1);
  1494.   }
  1495.   
  1496. ***************
  1497. *** 271,280 ****
  1498.       int    nobj = 0;
  1499.       int    cnt, onum;
  1500.       struct    obj    *otmp;
  1501.   
  1502.       if(Antimagic) {
  1503.           shieldeff(u.ux, u.uy);
  1504. !         You("feel a malignant aura surround you.");
  1505.       }
  1506.   
  1507.       for (otmp = invent; otmp; otmp = otmp->nobj)  nobj++;
  1508. --- 273,288 ----
  1509.       int    nobj = 0;
  1510.       int    cnt, onum;
  1511.       struct    obj    *otmp;
  1512. +     static const char *mal_aura = "feel a malignant aura surround %s.";
  1513.   
  1514. +     if (uwep && (uwep->oartifact == ART_MAGICBANE) && rn2(20)) {
  1515. +         You(mal_aura, "the magic-absorbing blade");
  1516. +         return;
  1517. +     }
  1518.       if(Antimagic) {
  1519.           shieldeff(u.ux, u.uy);
  1520. !         You(mal_aura, "you");
  1521.       }
  1522.   
  1523.       for (otmp = invent; otmp; otmp = otmp->nobj)  nobj++;
  1524. *** /tmp/da11402    Tue Jun  1 16:16:01 1993
  1525. --- src/spell.c    Mon May 17 14:05:10 1993
  1526. ***************
  1527. *** 1,4 ****
  1528. ! /*    SCCS Id: @(#)spell.c    3.1    92/12/10
  1529.   /*    Copyright (c) M. Stephenson 1988              */
  1530.   /* NetHack may be freely redistributed.  See license for details. */
  1531.   
  1532. --- 1,4 ----
  1533. ! /*    SCCS Id: @(#)spell.c    3.1    93/05/15    */
  1534.   /*    Copyright (c) M. Stephenson 1988              */
  1535.   /* NetHack may be freely redistributed.  See license for details. */
  1536.   
  1537. ***************
  1538. *** 105,111 ****
  1539.       }
  1540.   
  1541.       if(!u.uhave.bell || !u.uhave.menorah) {
  1542. !         pline("A chill runs down your spine.");
  1543.           if(!u.uhave.bell) You("hear a faint chime...");
  1544.           if(!u.uhave.menorah) pline("Vlad's doppelganger is amused.");
  1545.           return;
  1546. --- 105,111 ----
  1547.       }
  1548.   
  1549.       if(!u.uhave.bell || !u.uhave.menorah) {
  1550. !         pline("A chill runs down your %s.", body_part(SPINE));
  1551.           if(!u.uhave.bell) You("hear a faint chime...");
  1552.           if(!u.uhave.menorah) pline("Vlad's doppelganger is amused.");
  1553.           return;
  1554. ***************
  1555. *** 149,155 ****
  1556.       mm.y = u.uy;
  1557.       mkundead(&mm);
  1558.       if(!rn2(4))
  1559. !         if(mtmp = makemon(&mons[PM_MASTER_LICH],u.ux,u.uy)) {
  1560.           mtmp->mpeaceful = 0;
  1561.           set_malign(mtmp);
  1562.           }
  1563. --- 149,155 ----
  1564.       mm.y = u.uy;
  1565.       mkundead(&mm);
  1566.       if(!rn2(4))
  1567. !         if ((mtmp = makemon(&mons[PM_MASTER_LICH],u.ux,u.uy)) != 0) {
  1568.           mtmp->mpeaceful = 0;
  1569.           set_malign(mtmp);
  1570.           }
  1571. ***************
  1572. *** 494,499 ****
  1573. --- 494,501 ----
  1574.       case SPE_FINGER_OF_DEATH:
  1575.       case SPE_LIGHT:
  1576.       case SPE_DETECT_UNSEEN:
  1577. +     case SPE_HEALING:
  1578. +     case SPE_EXTRA_HEALING:
  1579.           if (!(objects[pseudo->otyp].oc_dir == NODIR)) {
  1580.               if (atme) u.dx = u.dy = u.dz = 0;
  1581.               else (void) getdir(NULL);
  1582. ***************
  1583. *** 524,533 ****
  1584.       case SPE_INVISIBILITY:
  1585.           (void) peffects(pseudo);
  1586.           break;
  1587. -     case SPE_HEALING:
  1588. -         You("feel a bit better.");
  1589. -         healup(rnd(8), 0, FALSE, FALSE);
  1590. -         break;
  1591.       case SPE_CURE_BLINDNESS:
  1592.           healup(0, 0, FALSE, TRUE);
  1593.           break;
  1594. --- 526,531 ----
  1595. ***************
  1596. *** 534,543 ****
  1597.       case SPE_CURE_SICKNESS:
  1598.           if (Sick) You("are no longer ill.");
  1599.           healup(0, 0, TRUE, FALSE);
  1600. -         break;
  1601. -     case SPE_EXTRA_HEALING:
  1602. -         You("feel a fair bit better.");
  1603. -         healup(d(2,8)+2, 0, FALSE, FALSE);
  1604.           break;
  1605.       case SPE_CREATE_FAMILIAR:
  1606.           make_familiar((struct obj *)0, u.ux, u.uy);
  1607. --- 532,537 ----
  1608. *** /tmp/da11410    Tue Jun  1 16:16:03 1993
  1609. --- src/steal.c    Tue Jun  1 11:58:39 1993
  1610. ***************
  1611. *** 1,4 ****
  1612. ! /*    SCCS Id: @(#)steal.c    3.1    92/10/14    */
  1613.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1614.   /* NetHack may be freely redistributed.  See license for details. */
  1615.   
  1616. --- 1,4 ----
  1617. ! /*    SCCS Id: @(#)steal.c    3.1    93/05/30    */
  1618.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1619.   /* NetHack may be freely redistributed.  See license for details. */
  1620.   
  1621. ***************
  1622. *** 11,20 ****
  1623.   
  1624.   static const char *
  1625.   equipname(otmp)
  1626. !     register struct obj *otmp;
  1627.   {
  1628.       return (
  1629.   #ifdef TOURIST
  1630.           (otmp == uarmu) ? "shirt" :
  1631. --- 11,18 ----
  1632.   
  1633.   static const char *
  1634.   equipname(otmp)
  1635. ! register struct obj *otmp;
  1636.   {
  1637.       return (
  1638.   #ifdef TOURIST
  1639.           (otmp == uarmu) ? "shirt" :
  1640. ***************
  1641. *** 27,33 ****
  1642.   }
  1643.   
  1644.   long        /* actually returns something that fits in an int */
  1645. ! somegold(){
  1646.   #ifdef LINT    /* long conv. ok */
  1647.       return(0L);
  1648.   #else
  1649. --- 25,32 ----
  1650.   }
  1651.   
  1652.   long        /* actually returns something that fits in an int */
  1653. ! somegold()
  1654. ! {
  1655.   #ifdef LINT    /* long conv. ok */
  1656.       return(0L);
  1657.   #else
  1658. ***************
  1659. *** 50,56 ****
  1660.           pline("%s quickly snatches some gold from between your %s!",
  1661.               Monnam(mtmp), makeplural(body_part(FOOT)));
  1662.           if(!u.ugold || !rn2(5)) {
  1663. !         rloc(mtmp);
  1664.           mtmp->mflee = 1;
  1665.           }
  1666.       } else if(u.ugold) {
  1667. --- 49,55 ----
  1668.           pline("%s quickly snatches some gold from between your %s!",
  1669.               Monnam(mtmp), makeplural(body_part(FOOT)));
  1670.           if(!u.ugold || !rn2(5)) {
  1671. !         if (!tele_restrict(mtmp)) rloc(mtmp);
  1672.           mtmp->mflee = 1;
  1673.           }
  1674.       } else if(u.ugold) {
  1675. ***************
  1676. *** 57,63 ****
  1677.           u.ugold -= (tmp = somegold());
  1678.           Your("purse feels lighter.");
  1679.           mtmp->mgold += tmp;
  1680. !         rloc(mtmp);
  1681.           mtmp->mflee = 1;
  1682.           flags.botl = 1;
  1683.       }
  1684. --- 56,62 ----
  1685.           u.ugold -= (tmp = somegold());
  1686.           Your("purse feels lighter.");
  1687.           mtmp->mgold += tmp;
  1688. !         if (!tele_restrict(mtmp)) rloc(mtmp);
  1689.           mtmp->mflee = 1;
  1690.           flags.botl = 1;
  1691.       }
  1692. ***************
  1693. *** 68,74 ****
  1694.   unsigned int stealmid;        /* monster doing the stealing */
  1695.   
  1696.   STATIC_OVL int
  1697. ! stealarm(){
  1698.       register struct monst *mtmp;
  1699.       register struct obj *otmp;
  1700.   
  1701. --- 67,74 ----
  1702.   unsigned int stealmid;        /* monster doing the stealing */
  1703.   
  1704.   STATIC_OVL int
  1705. ! stealarm()
  1706. ! {
  1707.       register struct monst *mtmp;
  1708.       register struct obj *otmp;
  1709.   
  1710. ***************
  1711. *** 82,88 ****
  1712.             pline("%s steals %s!", Monnam(mtmp), doname(otmp));
  1713.             mpickobj(mtmp,otmp);
  1714.             mtmp->mflee = 1;
  1715. !           rloc(mtmp);
  1716.           break;
  1717.             }
  1718.           break;
  1719. --- 82,88 ----
  1720.             pline("%s steals %s!", Monnam(mtmp), doname(otmp));
  1721.             mpickobj(mtmp,otmp);
  1722.             mtmp->mflee = 1;
  1723. !           if (!tele_restrict(mtmp)) rloc(mtmp);
  1724.           break;
  1725.             }
  1726.           break;
  1727. ***************
  1728. *** 263,270 ****
  1729. --- 263,275 ----
  1730.   register struct monst *mtmp;
  1731.   register struct obj *otmp;
  1732.   {
  1733. +     if (otmp->otyp == GOLD_PIECE) {    /* from floor etc. -- not inventory */
  1734. +     mtmp->mgold += otmp->quan;
  1735. +     obfree(otmp, (struct obj *)0);
  1736. +     } else {
  1737.       otmp->nobj = mtmp->minvent;
  1738.       mtmp->minvent = otmp;
  1739. +     }
  1740.   }
  1741.   
  1742.   #endif /* OVL1 */
  1743. ***************
  1744. *** 278,288 ****
  1745.       register int    real, fake;
  1746.   
  1747.       /* select the artifact to steal */
  1748. !         if(u.uhave.amulet) {
  1749.           real = AMULET_OF_YENDOR ;
  1750.           fake = FAKE_AMULET_OF_YENDOR ;
  1751.   #ifdef MULDGN
  1752.       } else if(u.uhave.questart) {
  1753.           for(otmp = invent; otmp; otmp = otmp->nobj)
  1754.               if(is_quest_artifact(otmp)) goto snatch_it;
  1755.   #endif
  1756. --- 283,294 ----
  1757.       register int    real, fake;
  1758.   
  1759.       /* select the artifact to steal */
  1760. !     if(u.uhave.amulet) {
  1761.           real = AMULET_OF_YENDOR ;
  1762.           fake = FAKE_AMULET_OF_YENDOR ;
  1763.   #ifdef MULDGN
  1764.       } else if(u.uhave.questart) {
  1765. +         real = fake = 0;        /* gcc -Wall lint */
  1766.           for(otmp = invent; otmp; otmp = otmp->nobj)
  1767.               if(is_quest_artifact(otmp)) goto snatch_it;
  1768.   #endif
  1769. ***************
  1770. *** 302,312 ****
  1771.           if(otmp->otyp == real || (otmp->otyp == fake && !mtmp->iswiz)) {
  1772.           /* might be an imitation one */
  1773.   snatch_it:
  1774.           setnotworn(otmp);
  1775.           freeinv(otmp);
  1776.           mpickobj(mtmp,otmp);
  1777.           pline("%s stole %s!", Monnam(mtmp), doname(otmp));
  1778. !         if (can_teleport(mtmp->data)) rloc(mtmp);
  1779.           return;
  1780.           }
  1781.       }
  1782. --- 308,322 ----
  1783.           if(otmp->otyp == real || (otmp->otyp == fake && !mtmp->iswiz)) {
  1784.           /* might be an imitation one */
  1785.   snatch_it:
  1786. + #ifdef MULDGN
  1787. +         if (otmp->oclass == ARMOR_CLASS) adj_abon(otmp, -(otmp->spe));
  1788. + #endif
  1789.           setnotworn(otmp);
  1790.           freeinv(otmp);
  1791.           mpickobj(mtmp,otmp);
  1792.           pline("%s stole %s!", Monnam(mtmp), doname(otmp));
  1793. !         if (can_teleport(mtmp->data) && !tele_restrict(mtmp))
  1794. !             rloc(mtmp);
  1795.           return;
  1796.           }
  1797.       }
  1798. ***************
  1799. *** 315,353 ****
  1800.   #endif /* OVLB */
  1801.   #ifdef OVL0
  1802.   
  1803. ! /* release the objects the killed animal was carrying */
  1804.   void
  1805.   relobj(mtmp,show,is_pet)
  1806.   register struct monst *mtmp;
  1807.   register int show;
  1808. ! boolean is_pet;        /* If true, pet should keep wielded weapon */
  1809.   {
  1810.       register struct obj *otmp, *otmp2;
  1811.       register int omx = mtmp->mx, omy = mtmp->my;
  1812.   #ifdef MUSE
  1813. !     otmp2 = otmp = 0;
  1814. !     if (is_pet) {
  1815. !         sort_mwep(mtmp);
  1816. !         if ((otmp2 = MON_WEP(mtmp))) {
  1817. !             otmp = otmp2->nobj;
  1818. !             otmp2->nobj = 0;
  1819. !         }
  1820. !     }
  1821. !     if (!otmp2)
  1822.   #endif
  1823. -     {    otmp = mtmp->minvent;
  1824. -         mtmp->minvent = 0;
  1825. -     }
  1826.   
  1827.       for (; otmp; otmp = otmp2) {
  1828.   #ifdef MUSE
  1829. !         if (otmp->owornmask) {
  1830.               mtmp->misc_worn_check &= ~(otmp->owornmask);
  1831.               otmp->owornmask = 0L;
  1832.           }
  1833.   #endif
  1834. -         otmp2 = otmp->nobj;
  1835.           if (is_pet && cansee(omx, omy) && flags.verbose)
  1836.               pline("%s drops %s.", Monnam(mtmp),
  1837.                       distant_name(otmp, doname));
  1838. --- 325,364 ----
  1839.   #endif /* OVLB */
  1840.   #ifdef OVL0
  1841.   
  1842. ! /* release the objects the creature is carrying */
  1843.   void
  1844.   relobj(mtmp,show,is_pet)
  1845.   register struct monst *mtmp;
  1846.   register int show;
  1847. ! boolean is_pet;        /* If true, pet should keep wielded/worn items */
  1848.   {
  1849.       register struct obj *otmp, *otmp2;
  1850.       register int omx = mtmp->mx, omy = mtmp->my;
  1851.   #ifdef MUSE
  1852. !     struct obj *backobj = 0;
  1853. !     struct obj *wep = MON_WEP(mtmp);
  1854.   #endif
  1855.   
  1856. +     otmp = mtmp->minvent;
  1857. +     mtmp->minvent = 0;
  1858.       for (; otmp; otmp = otmp2) {
  1859. +         otmp2 = otmp->nobj;
  1860.   #ifdef MUSE
  1861. !         if (otmp->owornmask || otmp == wep) {
  1862. !             if (is_pet) { /* skip worn/wielded item */
  1863. !                 if (!backobj) {
  1864. !                     mtmp->minvent = backobj = otmp;
  1865. !                 } else {
  1866. !                     backobj->nobj = otmp;
  1867. !                     backobj = backobj->nobj;
  1868. !                 }
  1869. !                 continue;
  1870. !             }
  1871.               mtmp->misc_worn_check &= ~(otmp->owornmask);
  1872.               otmp->owornmask = 0L;
  1873.           }
  1874. +         if (backobj) backobj->nobj = otmp->nobj;
  1875.   #endif
  1876.           if (is_pet && cansee(omx, omy) && flags.verbose)
  1877.               pline("%s drops %s.", Monnam(mtmp),
  1878.                       distant_name(otmp, doname));
  1879. *** /tmp/da11418    Tue Jun  1 16:16:06 1993
  1880. --- src/timeout.c    Wed Mar 31 14:20:11 1993
  1881. ***************
  1882. *** 1,4 ****
  1883. ! /*    SCCS Id: @(#)timeout.c    3.1    92/11/01    */
  1884.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1885.   /* NetHack may be freely redistributed.  See license for details. */
  1886.   
  1887. --- 1,4 ----
  1888. ! /*    SCCS Id: @(#)timeout.c    3.1    93/03/30    */
  1889.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1890.   /* NetHack may be freely redistributed.  See license for details. */
  1891.   
  1892. ***************
  1893. *** 164,172 ****
  1894.               break;
  1895.           case INVIS:
  1896.               newsym(u.ux,u.uy);
  1897. !             if (!Invis && !See_invisible && !Blind)
  1898.                   You("are no longer invisible.");
  1899. !             stop_occupation();
  1900.               break;
  1901.           case SEE_INVIS:
  1902.               set_mimic_blocking(); /* do special mimic handling */
  1903. --- 164,173 ----
  1904.               break;
  1905.           case INVIS:
  1906.               newsym(u.ux,u.uy);
  1907. !             if (!Invis && !See_invisible && !Blind) {
  1908.                   You("are no longer invisible.");
  1909. !                 stop_occupation();
  1910. !             }
  1911.               break;
  1912.           case SEE_INVIS:
  1913.               set_mimic_blocking(); /* do special mimic handling */
  1914. ***************
  1915. *** 213,219 ****
  1916.                   switch (rn2(4)) {
  1917.                       case 1:
  1918.                       if (ACCESSIBLE(levl[u.ux][u.uy].typ)) { /* not POOL or STONE */
  1919. !                         if (Hallucination) pline("A rock bites your foot.");
  1920.                           else You("trip over a rock.");
  1921.                           break;
  1922.                       }
  1923. --- 214,220 ----
  1924.                   switch (rn2(4)) {
  1925.                       case 1:
  1926.                       if (ACCESSIBLE(levl[u.ux][u.uy].typ)) { /* not POOL or STONE */
  1927. !                         if (Hallucination) pline("A rock bites your %s.", body_part(FOOT));
  1928.                           else You("trip over a rock.");
  1929.                           break;
  1930.                       }
  1931. ***************
  1932. *** 271,277 ****
  1933.               locomotion(mtmp->data, "drop"));
  1934.           else
  1935.               You("see %s %s out of your pack!",
  1936. !             an(mtmp->data->mname),
  1937.               locomotion(mtmp->data, "drop"));
  1938.   
  1939.   #ifdef POLYSELF
  1940. --- 272,278 ----
  1941.               locomotion(mtmp->data, "drop"));
  1942.           else
  1943.               You("see %s %s out of your pack!",
  1944. !             a_monnam(mtmp),
  1945.               locomotion(mtmp->data, "drop"));
  1946.   
  1947.   #ifdef POLYSELF
  1948. ***************
  1949. *** 280,289 ****
  1950.   
  1951.               pline("Its cries sound like \"%s.\"",
  1952.               flags.female ? "mommy" : "daddy");
  1953. !             if (mtmp2 = tamedog(mtmp, (struct obj *)0))
  1954.               mtmp = mtmp2;
  1955.               mtmp->mtame = 20;
  1956. !             while(otmp = (mtmp->minvent)) {
  1957.               mtmp->minvent = otmp->nobj;
  1958.               dealloc_obj(otmp);
  1959.               }
  1960. --- 281,290 ----
  1961.   
  1962.               pline("Its cries sound like \"%s.\"",
  1963.               flags.female ? "mommy" : "daddy");
  1964. !             if ((mtmp2 = tamedog(mtmp, (struct obj *)0)) != 0)
  1965.               mtmp = mtmp2;
  1966.               mtmp->mtame = 20;
  1967. !             while ((otmp = (mtmp->minvent)) != 0) {
  1968.               mtmp->minvent = otmp->nobj;
  1969.               dealloc_obj(otmp);
  1970.               }
  1971. ***************
  1972. *** 294,302 ****
  1973.               struct monst *mtmp2;
  1974.   
  1975.               verbalize("Gleep!");        /* Mything eggs :-) */
  1976. !             if (mtmp2 = tamedog(mtmp, (struct obj *)0))
  1977.               mtmp = mtmp2;
  1978. !             while(otmp = (mtmp->minvent)) {
  1979.               mtmp->minvent = otmp->nobj;
  1980.               dealloc_obj(otmp);
  1981.               }
  1982. --- 295,303 ----
  1983.               struct monst *mtmp2;
  1984.   
  1985.               verbalize("Gleep!");        /* Mything eggs :-) */
  1986. !             if ((mtmp2 = tamedog(mtmp, (struct obj *)0)) != 0)
  1987.               mtmp = mtmp2;
  1988. !             while ((otmp = (mtmp->minvent)) != 0) {
  1989.               mtmp->minvent = otmp->nobj;
  1990.               dealloc_obj(otmp);
  1991.               }
  1992. ***************
  1993. *** 316,322 ****
  1994.       for(otmp = invent; otmp; otmp = otmp2) {
  1995.           otmp2 = otmp->nobj;        /* otmp may hatch */
  1996.           if(otmp->otyp == EGG && otmp->corpsenm >= 0) hatch_it(otmp);
  1997. !         /* else if (Is_container(otmp) && otmp->cobj) ...        */
  1998.           /*                                */
  1999.           /* Check for container here and hatch with the container.    */
  2000.           /* One of these days...                    */
  2001. --- 317,323 ----
  2002.       for(otmp = invent; otmp; otmp = otmp2) {
  2003.           otmp2 = otmp->nobj;        /* otmp may hatch */
  2004.           if(otmp->otyp == EGG && otmp->corpsenm >= 0) hatch_it(otmp);
  2005. !         /* else if (Has_contents(otmp)) ...                */
  2006.           /*                                */
  2007.           /* Check for container here and hatch with the container.    */
  2008.           /* One of these days...                    */
  2009.