1 /* NetHack 3.6 shk.c $NHDT-Date: 1555201699 2019/04/14 00:28:19 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.159 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /*-Copyright (c) Robert Patrick Rankin, 2012. */
4 /* NetHack may be freely redistributed. See license for details. */
6 /* JNetHack Copyright */
7 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
8 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2019 */
9 /* JNetHack may be freely redistributed. See license for details. */
15 #define PAY_CANT 0 /* too poor */
17 #define PAY_BROKE (-2)
19 STATIC_DCL void FDECL(makekops, (coord *));
20 STATIC_DCL void FDECL(call_kops, (struct monst *, BOOLEAN_P));
21 STATIC_DCL void FDECL(kops_gone, (BOOLEAN_P));
23 #define NOTANGRY(mon) ((mon)->mpeaceful)
24 #define ANGRY(mon) (!NOTANGRY(mon))
25 #define IS_SHOP(x) (rooms[x].rtype >= SHOPBASE)
27 #define muteshk(shkp) \
28 ((shkp)->msleeping || !(shkp)->mcanmove \
29 || (shkp)->data->msound <= MS_ANIMAL)
31 extern const struct shclass shtypes[]; /* defined in shknam.c */
33 STATIC_VAR NEARDATA long int followmsg; /* last time of follow message */
35 STATIC_VAR const char and_its_contents[] = " and its contents";
37 STATIC_VAR const char and_its_contents[] = "
\92\86\90g
\82ð
\8d\87\82í
\82¹
\82Ä";
39 STATIC_VAR const char the_contents_of[] = "the contents of ";
42 STATIC_DCL void FDECL(append_honorific, (char *));
43 STATIC_DCL long FDECL(addupbill, (struct monst *));
44 STATIC_DCL void FDECL(pacify_shk, (struct monst *));
45 STATIC_DCL struct bill_x *FDECL(onbill, (struct obj *, struct monst *,
47 STATIC_DCL struct monst *FDECL(next_shkp, (struct monst *, BOOLEAN_P));
48 STATIC_DCL long FDECL(shop_debt, (struct eshk *));
49 STATIC_DCL char *FDECL(shk_owns, (char *, struct obj *));
50 STATIC_DCL char *FDECL(mon_owns, (char *, struct obj *));
51 STATIC_DCL void FDECL(clear_unpaid_obj, (struct monst *, struct obj *));
52 STATIC_DCL void FDECL(clear_unpaid, (struct monst *, struct obj *));
53 STATIC_DCL long FDECL(check_credit, (long, struct monst *));
54 STATIC_DCL void FDECL(pay, (long, struct monst *));
55 STATIC_DCL long FDECL(get_cost, (struct obj *, struct monst *));
56 STATIC_DCL long FDECL(set_cost, (struct obj *, struct monst *));
57 STATIC_DCL const char *FDECL(shk_embellish, (struct obj *, long));
58 STATIC_DCL long FDECL(cost_per_charge, (struct monst *, struct obj *,
60 STATIC_DCL long FDECL(cheapest_item, (struct monst *));
61 STATIC_DCL int FDECL(dopayobj, (struct monst *, struct bill_x *,
62 struct obj **, int, BOOLEAN_P));
63 STATIC_DCL long FDECL(stolen_container, (struct obj *, struct monst *,
65 STATIC_DCL long FDECL(getprice, (struct obj *, BOOLEAN_P));
66 STATIC_DCL void FDECL(shk_names_obj, (struct monst *, struct obj *,
67 const char *, long, const char *));
68 STATIC_DCL struct obj *FDECL(bp_to_obj, (struct bill_x *));
69 STATIC_DCL boolean FDECL(inherits, (struct monst *, int, int, BOOLEAN_P));
70 STATIC_DCL void FDECL(set_repo_loc, (struct monst *));
71 STATIC_DCL boolean NDECL(angry_shk_exists);
72 STATIC_DCL void FDECL(rile_shk, (struct monst *));
73 STATIC_DCL void FDECL(rouse_shk, (struct monst *, BOOLEAN_P));
74 STATIC_DCL void FDECL(remove_damage, (struct monst *, BOOLEAN_P));
75 STATIC_DCL void FDECL(sub_one_frombill, (struct obj *, struct monst *));
76 STATIC_DCL void FDECL(add_one_tobill, (struct obj *, BOOLEAN_P,
78 STATIC_DCL void FDECL(dropped_container, (struct obj *, struct monst *,
80 STATIC_DCL void FDECL(add_to_billobjs, (struct obj *));
81 STATIC_DCL void FDECL(bill_box_content, (struct obj *, BOOLEAN_P, BOOLEAN_P,
83 STATIC_DCL boolean FDECL(rob_shop, (struct monst *));
84 STATIC_DCL void FDECL(deserted_shop, (char *));
85 STATIC_DCL boolean FDECL(special_stock, (struct obj *, struct monst *,
87 #if 0 /*JP*//*
\8eg
\82í
\82È
\82¢*/
88 STATIC_DCL const char *FDECL(cad, (BOOLEAN_P));
92 invariants: obj->unpaid iff onbill(obj) [unless bp->useup]
93 obj->quan <= bp->bquan
97 static const char *angrytexts[] = { "quite upset", "ticked off", "furious" };
99 static const char *angrytexts[] = { "
\82©
\82È
\82è
\93{
\82Á
\82½", "
\95 \82ð
\97§
\82Ä
\82½", "
\8c\83\93{
\82µ
\82½" };
102 * Transfer money from inventory to monster when paying
103 * shopkeepers, priests, oracle, succubus, and other demons.
104 * Simple with only gold coins.
105 * This routine will handle money changing when multiple
106 * coin types is implemented, only appropriate
107 * monsters will pay change. (Peaceful shopkeepers, priests
108 * and the oracle try to maintain goodwill while selling
109 * their wares or services. Angry monsters and all demons
110 * will keep anything they get their hands on.
111 * Returns the amount actually paid, so we can know
112 * if the monster kept the change.
115 money2mon(mon, amount)
119 struct obj *ygold = findgold(invent);
122 impossible("%s payment in money2mon!", amount ? "negative" : "zero");
125 if (!ygold || ygold->quan < amount) {
126 impossible("Paying without %s money?", ygold ? "enough" : "");
130 if (ygold->quan > amount)
131 ygold = splitobj(ygold, amount);
132 else if (ygold->owornmask)
133 remove_worn_item(ygold, FALSE); /* quiver */
135 add_to_minv(mon, ygold);
141 * Transfer money from monster to inventory.
142 * Used when the shopkeeper pay for items, and when
143 * the priest gives you money for an ale.
150 struct obj *mongold = findgold(mon->minvent);
153 impossible("%s payment in money2u!", amount ? "negative" : "zero");
156 if (!mongold || mongold->quan < amount) {
157 impossible("%s paying without %s money?", a_monnam(mon),
158 mongold ? "enough" : "");
162 if (mongold->quan > amount)
163 mongold = splitobj(mongold, amount);
164 obj_extract_self(mongold);
166 if (!merge_choice(invent, mongold) && inv_cnt(FALSE) >= 52) {
168 You("have no room for the money!");
170 You("
\82¨
\8bà
\82ð
\8e\9d\82Â
\97]
\97T
\82ª
\82È
\82¢
\81I");
178 STATIC_OVL struct monst *
179 next_shkp(shkp, withbill)
180 register struct monst *shkp;
181 register boolean withbill;
183 for (; shkp; shkp = shkp->nmon) {
184 if (DEADMONSTER(shkp))
186 if (shkp->isshk && (ESHK(shkp)->billct || !withbill))
191 if (NOTANGRY(shkp)) {
192 if (ESHK(shkp)->surcharge)
195 if (!ESHK(shkp)->surcharge)
202 /* called in mon.c */
207 struct eshk *eshk = ESHK(mtmp);
208 struct mkroom *sroom = &rooms[eshk->shoproom - ROOMOFFSET];
213 /* [BUG: some of this should be done on the shop level */
214 /* even when the shk dies on a different level.] */
215 if (on_level(&eshk->shoplevel, &u.uz)) {
216 remove_damage(mtmp, TRUE);
217 sroom->resident = (struct monst *) 0;
218 if (!search_special(ANY_SHOP))
219 level.flags.has_shop = 0;
221 /* items on shop floor revert to ordinary objects */
222 for (sx = sroom->lx; sx <= sroom->hx; sx++)
223 for (sy = sroom->ly; sy <= sroom->hy; sy++)
224 for (otmp = level.objects[sx][sy]; otmp;
225 otmp = otmp->nexthere)
228 /* Make sure bill is set only when the
229 dead shk is the resident shk. */
230 if ((p = index(u.ushops, eshk->shoproom)) != 0) {
232 eshk->bill_p = (struct bill_x *) 0;
233 /* remove eshk->shoproom from u.ushops */
242 set_residency(shkp, zero_out)
243 register struct monst *shkp;
244 register boolean zero_out;
246 if (on_level(&(ESHK(shkp)->shoplevel), &u.uz))
247 rooms[ESHK(shkp)->shoproom - ROOMOFFSET].resident =
248 (zero_out) ? (struct monst *) 0 : shkp;
253 register struct monst *mtmp, *mtmp2;
255 rooms[ESHK(mtmp2)->shoproom - ROOMOFFSET].resident = mtmp2;
256 if (inhishop(mtmp) && *u.ushops == ESHK(mtmp)->shoproom) {
257 ESHK(mtmp2)->bill_p = &(ESHK(mtmp2)->bill[0]);
261 /* do shopkeeper specific structure munging -dlc */
263 restshk(shkp, ghostly)
268 struct eshk *eshkp = ESHK(shkp);
270 if (eshkp->bill_p != (struct bill_x *) -1000)
271 eshkp->bill_p = &eshkp->bill[0];
272 /* shoplevel can change as dungeons move around */
273 /* savebones guarantees that non-homed shk's will be gone */
275 assign_level(&eshkp->shoplevel, &u.uz);
276 if (ANGRY(shkp) && strncmpi(eshkp->customer, plname, PL_NSIZ))
282 /* Clear the unpaid bit on a single object and its contents. */
284 clear_unpaid_obj(shkp, otmp)
288 if (Has_contents(otmp))
289 clear_unpaid(shkp, otmp->cobj);
290 if (onbill(otmp, shkp, TRUE))
294 /* Clear the unpaid bit on all of the objects in the list. */
296 clear_unpaid(shkp, list)
301 clear_unpaid_obj(shkp, list);
306 /* either you paid or left the shop or the shopkeeper died */
309 register struct monst *shkp;
311 register struct obj *obj;
312 register struct monst *mtmp;
314 clear_unpaid(shkp, invent);
315 clear_unpaid(shkp, fobj);
316 clear_unpaid(shkp, level.buriedobjlist);
318 clear_unpaid_obj(shkp, thrownobj);
320 clear_unpaid_obj(shkp, kickedobj);
321 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
322 clear_unpaid(shkp, mtmp->minvent);
323 for (mtmp = migrating_mons; mtmp; mtmp = mtmp->nmon)
324 clear_unpaid(shkp, mtmp->minvent);
326 while ((obj = billobjs) != 0) {
327 obj_extract_self(obj);
331 ESHK(shkp)->billct = 0;
332 ESHK(shkp)->credit = 0L;
333 ESHK(shkp)->debit = 0L;
334 ESHK(shkp)->loan = 0L;
340 register struct monst *shkp;
342 register int ct = ESHK(shkp)->billct;
343 register struct bill_x *bp = ESHK(shkp)->bill_p;
344 register long total = 0L;
347 total += bp->price * bp->bquan;
354 call_kops(shkp, nearshop)
355 register struct monst *shkp;
356 register boolean nearshop;
358 /* Keystone Kops srt@ucla */
359 register boolean nokops;
366 pline("An alarm sounds!");
368 pline("
\8cx
\95ñ
\82ª
\96Â
\82è
\82Ð
\82Ñ
\82¢
\82½
\81I");
370 nokops = ((mvitals[PM_KEYSTONE_KOP].mvflags & G_GONE)
371 && (mvitals[PM_KOP_SERGEANT].mvflags & G_GONE)
372 && (mvitals[PM_KOP_LIEUTENANT].mvflags & G_GONE)
373 && (mvitals[PM_KOP_KAPTAIN].mvflags & G_GONE));
375 if (!angry_guards(!!Deaf) && nokops) {
376 if (flags.verbose && !Deaf)
378 pline("But no one seems to respond to it.");
380 pline("
\82µ
\82©
\82µ
\92N
\82à
\89\9e\93\9a\82µ
\82È
\82©
\82Á
\82½
\81D");
391 /* Create swarm around you, if you merely "stepped out" */
394 pline_The("Keystone Kops appear!");
396 pline("
\8cx
\94õ
\88õ
\82ª
\8c»
\82í
\82ê
\82½
\81I");
404 pline_The("Keystone Kops are after you!");
406 pline("
\8cx
\94õ
\88õ
\82ª
\82¢
\82é
\81I");
407 /* Create swarm near down staircase (hinders return to level) */
411 /* Create swarm near shopkeeper (hinders return to shop) */
418 /* x,y is strictly inside shop */
425 rno = levl[x][y].roomno;
426 if ((rno < ROOMOFFSET) || levl[x][y].edge || !IS_SHOP(rno - ROOMOFFSET))
432 u_left_shop(leavestring, newlev)
441 * ((didn't leave outright) AND
442 * ((he is now strictly-inside the shop) OR
443 * (he wasn't strictly-inside last turn anyway)))
444 * THEN (there's nothing to do, so just return)
446 if (!*leavestring && (!levl[u.ux][u.uy].edge || levl[u.ux0][u.uy0].edge))
449 shkp = shop_keeper(*u.ushops0);
450 if (!shkp || !inhishop(shkp))
451 return; /* shk died, teleported, changed levels... */
454 if (!eshkp->billct && !eshkp->debit) /* bill is settled */
457 if (!*leavestring && !muteshk(shkp)) {
459 * Player just stepped onto shop-boundary (known from above logic).
460 * Try to intimidate him into paying his bill
462 if (!Deaf && !muteshk(shkp))
464 verbalize(NOTANGRY(shkp) ? "%s! Please pay before leaving."
465 : "%s! Don't you leave without paying!",
468 verbalize(NOTANGRY(shkp) ? "%s
\82³
\82ñ
\81I
\8bA
\82é
\91O
\82É
\81C
\82¨
\8bà
\82ð
\95¥
\82Á
\82Ä
\82¢
\82½
\82¾
\82¯
\82Ü
\82¹
\82ñ
\82©
\81D"
469 : "%s
\81I
\8bA
\82é
\91O
\82É
\81C
\8bà
\82ð
\95¥
\82¦
\81I",
474 pline("%s %s that you need to pay before leaving%s",
476 NOTANGRY(shkp) ? "points out" : "makes it clear",
477 NOTANGRY(shkp) ? "." : "!");
479 pline("%s
\82Í
\81C
\8bA
\82é
\91O
\82É
\8ex
\95¥
\82¢
\82ð
\82·
\82é
\95K
\97v
\82ª
\82 \82é
\82±
\82Æ
\82ð%s",
481 NOTANGRY(shkp) ? "
\8ew
\93E
\82µ
\82½
\81D" : "
\82Í
\82Á
\82«
\82è
\82³
\82¹
\82½
\81I");
486 if (rob_shop(shkp)) {
487 call_kops(shkp, (!newlev && levl[u.ux0][u.uy0].edge));
491 /* robbery from outside the shop via telekinesis or grappling hook */
493 remote_burglary(x, y)
499 shkp = shop_keeper(*in_rooms(x, y, SHOPBASE));
500 if (!shkp || !inhishop(shkp))
501 return; /* shk died, teleported, changed levels... */
504 if (!eshkp->billct && !eshkp->debit) /* bill is settled */
507 if (rob_shop(shkp)) {
508 /*[might want to set 2nd arg based on distance from shop doorway]*/
509 call_kops(shkp, FALSE);
513 /* shop merchandise has been taken; pay for it with any credit available;
514 return false if the debt is fully covered by credit, true otherwise */
523 rouse_shk(shkp, TRUE);
524 total = (addupbill(shkp) + eshkp->debit);
525 if (eshkp->credit >= total) {
527 Your("credit of %ld %s is used to cover your shopping bill.",
529 Your("
\97a
\82¯
\8bà
\82©
\82ç%ld%s
\82ª
\8a¨
\92è
\82Ì
\8ex
\95¥
\82¢
\82É
\8eg
\82í
\82ê
\82½
\81D",
531 eshkp->credit, currency(eshkp->credit));
532 total = 0L; /* credit gets cleared by setpaid() */
535 You("escaped the shop without paying!");
537 You("
\8bà
\82ð
\95¥
\82í
\82¸
\82É
\93X
\82©
\82ç
\93¦
\82°
\82½
\81I");
538 total -= eshkp->credit;
544 /* by this point, we know an actual robbery has taken place */
545 eshkp->robbed += total;
547 You("stole %ld %s worth of merchandise.", total, currency(total));
549 You("
\8eG
\89Ý
\82ð%ld%s
\95ª
\93\90\82ñ
\82¾
\81D", total, currency(total));
550 if (!Role_if(PM_ROGUE)) /* stealing is unlawful */
551 adjalign(-sgn(u.ualign.type));
557 /* give a message when entering an untended shop (caller has verified that) */
559 deserted_shop(enterstring)
560 /*const*/ char *enterstring;
563 struct mkroom *r = &rooms[(int) *enterstring - ROOMOFFSET];
564 int x, y, m = 0, n = 0;
566 for (x = r->lx; x <= r->hx; ++x)
567 for (y = r->ly; y <= r->hy; ++y) {
568 if (x == u.ux && y == u.uy)
570 if ((mtmp = m_at(x, y)) != 0) {
572 if (sensemon(mtmp) || ((M_AP_TYPE(mtmp) == M_AP_NOTHING
573 || M_AP_TYPE(mtmp) == M_AP_MONSTER)
579 if (Blind && !(Blind_telepat || Detect_monsters))
580 ++n; /* force feedback to be less specific */
583 pline("This shop %s %s.", (m < n) ? "seems to be" : "is",
584 !n ? "deserted" : "untended");
586 pline("
\93X
\82Í%s%s
\81D",
587 !n ? "
\94p
\9aÐ
\82Æ
\89»
\82µ
\82Ä
\82¢
\82é" : "
\95ú
\8aü
\82³
\82ê
\82Ä
\82¢
\82é",
588 (m < n) ? "
\82æ
\82¤
\82¾" : "");
593 u_entered_shop(enterstring)
597 register struct monst *shkp;
598 register struct eshk *eshkp;
599 static char empty_shops[5];
604 if (!(shkp = shop_keeper(*enterstring))) {
605 if (!index(empty_shops, *enterstring)
606 && in_rooms(u.ux, u.uy, SHOPBASE)
607 != in_rooms(u.ux0, u.uy0, SHOPBASE))
608 deserted_shop(enterstring);
609 Strcpy(empty_shops, u.ushops);
616 if (!inhishop(shkp)) {
617 /* dump core when referenced */
618 eshkp->bill_p = (struct bill_x *) -1000;
619 if (!index(empty_shops, *enterstring))
620 deserted_shop(enterstring);
621 Strcpy(empty_shops, u.ushops);
626 eshkp->bill_p = &(eshkp->bill[0]);
628 if ((!eshkp->visitct || *eshkp->customer)
629 && strncmpi(eshkp->customer, plname, PL_NSIZ)) {
630 /* You seem to be new here */
632 eshkp->following = 0;
633 (void) strncpy(eshkp->customer, plname, PL_NSIZ);
637 if (muteshk(shkp) || eshkp->following)
638 return; /* no dialog */
642 pline("%s senses your presence.", Shknam(shkp));
644 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\91¶
\8dÝ
\82É
\8bC
\82ª
\82Â
\82¢
\82½
\81D", Shknam(shkp));
645 if (!Deaf && !muteshk(shkp))
647 verbalize("Invisible customers are not welcome!");
649 verbalize("
\93§
\96¾
\82È
\82¨
\8bq
\82³
\82ñ
\82Æ
\82Í
\8a´
\90S
\82µ
\82È
\82¢
\82È
\81I");
652 pline("%s stands firm as if %s knows you are there.",
653 Shknam(shkp), noit_mhe(shkp));
655 pline("%s
\82Í
\81C
\82Ü
\82é
\82Å
\82 \82È
\82½
\82ª
\82»
\82±
\82É
\82¢
\82é
\82±
\82Æ
\82ð
\92m
\82Á
\82Ä
\82¢
\82é
\82©
\82Ì
\82æ
\82¤
\82É
\97§
\82¿
\82Í
\82¾
\82©
\82Á
\82½
\81D",
661 rt = rooms[*enterstring - ROOMOFFSET].rtype;
664 if (!Deaf && !muteshk(shkp))
666 verbalize("So, %s, you dare return to %s %s?!", plname,
667 s_suffix(shkname(shkp)), shtypes[rt - SHOPBASE].name);
669 verbalize("%s
\81I
\82í
\82´
\82í
\82´%s
\82Ì%s
\82É
\96ß
\82Á
\82Ä
\82«
\82½
\82Ì
\82©
\81H
\81I", plname,
670 shkname(shkp), shtypes[rt - SHOPBASE].name);
674 pline("%s seems %s over your return to %s %s!",
675 Shknam(shkp), angrytexts[rn2(SIZE(angrytexts))],
676 noit_mhis(shkp), shtypes[rt - SHOPBASE].name);
678 pline("
\82 \82È
\82½
\82ª%s
\82É
\96ß
\82Á
\82Ä
\82«
\82½
\82Ì
\82Å%s
\82Í%s
\82æ
\82¤
\82¾
\81I",
679 shtypes[rt - SHOPBASE].name,
681 angrytexts[rn2(SIZE(angrytexts))]);
683 } else if (eshkp->robbed) {
686 pline("%s mutters imprecations against shoplifters.",
689 pline("%s
\82Í
\93D
\96_
\82ð
\82Ì
\82Ì
\82µ
\82Á
\82½
\81D",
693 pline("%s is combing through %s inventory list.",
694 Shknam(shkp), noit_mhis(shkp));
696 if (!Deaf && !muteshk(shkp))
698 verbalize("%s, %s! Welcome%s to %s %s!", Hello(shkp), plname,
699 eshkp->visitct++ ? " again" : "",
700 s_suffix(shkname(shkp)), shtypes[rt - SHOPBASE].name);
702 verbalize("%s
\81I%s
\82Ì%s
\82É%s
\81I", Hello(shkp),
703 shkname(shkp), shtypes[rt - SHOPBASE].name,
704 eshkp->visitct++ ? "
\82Ü
\82½
\97\88\82Ü
\82µ
\82½
\82Ë" : "
\82æ
\82¤
\82±
\82»");
708 You("enter %s %s%s!",
709 s_suffix(shkname(shkp)),
710 shtypes[rt - SHOPBASE].name,
711 eshkp->visitct++ ? " again" : "");
713 You("%s%s
\82Ì%s
\82ð
\96K
\82ê
\82½
\81I",
714 eshkp->visitct++ ? "
\8dÄ
\82Ñ" : "",
716 shtypes[rt - SHOPBASE].name);
719 /* can't do anything about blocking if teleported in */
720 if (!inside_shop(u.ux, u.uy)) {
721 boolean should_block;
724 struct obj *pick = carrying(PICK_AXE),
725 *mattock = carrying(DWARVISH_MATTOCK);
727 if (pick || mattock) {
728 cnt = 1; /* so far */
729 if (pick && mattock) { /* carrying both types */
731 tool = "digging tool";
733 tool = "
\8c@
\82é
\93¹
\8bï";
734 cnt = 2; /* `more than 1' is all that matters */
739 tool = "
\82Â
\82é
\82Í
\82µ";
740 /* hack: `pick' already points somewhere into inventory */
741 while ((pick = pick->nobj) != 0)
742 if (pick->otyp == PICK_AXE)
744 } else { /* assert(mattock != 0) */
748 tool = "
\82Â
\82é
\82Í
\82µ";
749 while ((mattock = mattock->nobj) != 0)
750 if (mattock->otyp == DWARVISH_MATTOCK)
752 /* [ALI] Shopkeeper identifies mattock(s) */
754 makeknown(DWARVISH_MATTOCK);
756 if (!Deaf && !muteshk(shkp))
758 verbalize(NOTANGRY(shkp)
759 ? "Will you please leave your %s%s outside?"
760 : "Leave the %s%s outside.",
763 verbalize(NOTANGRY(shkp)
764 ? "%s
\82ð
\8aO
\82É
\92u
\82¢
\82Ä
\82«
\82Ä
\82¢
\82½
\82¾
\82¯
\82Ü
\82¹
\82ñ
\82©
\81H"
765 : "%s
\82ð
\8aO
\82Ö
\92u
\82¢
\82Ä
\82±
\82¢
\81I",
770 pline("%s %s to let you in with your %s%s.",
772 NOTANGRY(shkp) ? "is hesitant" : "refuses",
775 pline("%s
\82Í
\82 \82È
\82½
\82ª%s
\82ð
\8e\9d\82Á
\82Ä
\93ü
\82é
\82Ì%s
\81D",
778 NOTANGRY(shkp) ? "
\82Í
\8bC
\82ª
\82·
\82·
\82Ü
\82È
\82¢
\82æ
\82¤
\82¾" : "
\82ð
\8b\91\94Û
\82µ
\82½");
781 } else if (u.usteed) {
782 if (!Deaf && !muteshk(shkp))
784 verbalize(NOTANGRY(shkp) ? "Will you please leave %s outside?"
785 : "Leave %s outside.",
788 verbalize(NOTANGRY(shkp) ? "%s
\82ð
\8aO
\82É
\92u
\82¢
\82Ä
\82«
\82Ä
\82¢
\82½
\82¾
\82¯
\82Ü
\82¹
\82ñ
\82©
\81H"
789 : "%s
\82ð
\8aO
\82Ö
\92u
\82¢
\82Ä
\82±
\82¢
\81I",
794 pline("%s %s to let you in while you're riding %s.",
796 NOTANGRY(shkp) ? "doesn't want" : "refuses",
799 pline("%s
\82Í
\82 \82È
\82½
\82ª%s
\82É
\8fæ
\82Á
\82½
\82Ü
\82Ü
\82È
\82Ì%s.",
802 NOTANGRY(shkp) ? "
\82Í
\96]
\82Ü
\82È
\82¢
\82æ
\82¤
\82¾" : "
\82ð
\8b\91\94Û
\82µ
\82½");
807 (Fast && (sobj_at(PICK_AXE, u.ux, u.uy)
808 || sobj_at(DWARVISH_MATTOCK, u.ux, u.uy)));
811 (void) dochug(shkp); /* shk gets extra move */
816 /* called when removing a pick-axe or mattock from a container */
823 if (obj->unpaid || !is_pick(obj))
825 shkp = shop_keeper(*u.ushops);
826 if (shkp && inhishop(shkp)) {
827 static NEARDATA long pickmovetime = 0L;
829 /* if you bring a sack of N picks into a shop to sell,
830 don't repeat this N times when they're taken out */
831 if (moves != pickmovetime) {
832 if (!Deaf && !muteshk(shkp))
834 verbalize("You sneaky %s! Get out of here with that pick!",
837 verbalize("
\82Ð
\82«
\82å
\82¤
\8eÒ
\82ß
\81I
\82Â
\82é
\82Í
\82µ
\82ð
\8e\9d\82Á
\82Ä
\8aO
\82É
\8fo
\82ë
\81I");
841 pline("%s %s your pick!",
843 haseyes(shkp->data) ? "glares at"
844 : "is dismayed because of");
846 pline("%s
\82Í
\82Â
\82é
\82Í
\82µ%s
\81I",
848 haseyes(shkp->data) ? "
\82ð
\82É
\82ç
\82Ý
\82Â
\82¯
\82½"
849 : "
\82É
\93®
\97h
\82µ
\82Ä
\82¢
\82é");
852 pickmovetime = moves;
857 Decide whether two unpaid items are mergable; caller is responsible for
858 making sure they're unpaid and the same type of object; we check the price
859 quoted by the shopkeeper and also that they both belong to the same shk.
862 same_price(obj1, obj2)
863 struct obj *obj1, *obj2;
865 register struct monst *shkp1, *shkp2;
866 struct bill_x *bp1 = 0, *bp2 = 0;
867 boolean are_mergable = FALSE;
869 /* look up the first object by finding shk whose bill it's on */
870 for (shkp1 = next_shkp(fmon, TRUE); shkp1;
871 shkp1 = next_shkp(shkp1->nmon, TRUE))
872 if ((bp1 = onbill(obj1, shkp1, TRUE)) != 0)
874 /* second object is probably owned by same shk; if not, look harder */
875 if (shkp1 && (bp2 = onbill(obj2, shkp1, TRUE)) != 0) {
878 for (shkp2 = next_shkp(fmon, TRUE); shkp2;
879 shkp2 = next_shkp(shkp2->nmon, TRUE))
880 if ((bp2 = onbill(obj2, shkp2, TRUE)) != 0)
885 impossible("same_price: object wasn't on any bill!");
887 are_mergable = (shkp1 == shkp2 && bp1->price == bp2->price);
892 * Figure out how much is owed to a given shopkeeper.
893 * At present, we ignore any amount robbed from the shop, to avoid
894 * turning the `$' command into a way to discover that the current
895 * level is bones data which has a shk on the warpath.
903 long debt = eshkp->debit;
905 for (bp = eshkp->bill_p, ct = eshkp->billct; ct > 0; bp++, ct--)
906 debt += bp->price * bp->bquan;
910 /* called in response to the `$' command */
912 shopper_financial_report()
914 struct monst *shkp, *this_shkp = shop_keeper(inside_shop(u.ux, u.uy));
919 eshkp = this_shkp ? ESHK(this_shkp) : 0;
920 if (eshkp && !(eshkp->credit || shop_debt(eshkp))) {
922 You("have no credit or debt in here.");
924 You("
\97a
\82¯
\8bà
\82à
\8eØ
\8bà
\82à
\82È
\82¢
\81D");
925 this_shkp = 0; /* skip first pass */
928 /* pass 0: report for the shop we're currently in, if any;
929 pass 1: report for all other shops on this level. */
930 for (pass = this_shkp ? 0 : 1; pass <= 1; pass++)
931 for (shkp = next_shkp(fmon, FALSE); shkp;
932 shkp = next_shkp(shkp->nmon, FALSE)) {
933 if ((shkp != this_shkp) ^ pass)
936 if ((amt = eshkp->credit) != 0)
938 You("have %ld %s credit at %s %s.", amt, currency(amt),
939 s_suffix(shkname(shkp)),
940 shtypes[eshkp->shoptype - SHOPBASE].name);
942 You("%ld%s
\82Ì
\97a
\82¯
\8bà
\82ª%s
\82Ì%s
\82É
\82 \82é
\81D", amt, currency(amt),
944 shtypes[eshkp->shoptype - SHOPBASE].name);
946 else if (shkp == this_shkp)
948 You("have no credit in here.");
950 You("
\97a
\82¯
\8bà
\82Í
\82È
\82¢
\81D");
951 if ((amt = shop_debt(eshkp)) != 0)
953 You("owe %s %ld %s.", shkname(shkp), amt, currency(amt));
955 You("%s
\82É%ld%s
\82Ì
\8eØ
\82è
\82ª
\82 \82é
\81D", shkname(shkp), amt, currency(amt));
956 else if (shkp == this_shkp)
958 You("don't owe any money here.");
960 pline("
\82±
\82Ì
\93X
\82É
\8eØ
\82è
\82Í
\82È
\82¢
\81D");
966 register struct monst *mtmp;
968 struct eshk *eshkp = ESHK(mtmp);
970 return (index(in_rooms(mtmp->mx, mtmp->my, SHOPBASE), eshkp->shoproom)
971 && on_level(&eshkp->shoplevel, &u.uz));
980 shkp = (rmno >= ROOMOFFSET) ? rooms[rmno - ROOMOFFSET].resident : 0;
982 if (has_eshk(shkp)) {
983 if (NOTANGRY(shkp)) {
984 if (ESHK(shkp)->surcharge)
987 if (!ESHK(shkp)->surcharge)
991 /* would have segfaulted on ESHK dereference previously */
992 impossible("%s? (rmno=%d, rtype=%d, mnum=%d, \"%s\")",
993 shkp->isshk ? "shopkeeper career change"
994 : "shop resident not shopkeeper",
996 (int) rooms[rmno - ROOMOFFSET].rtype,
998 /* [real shopkeeper name is kept in ESHK, not MNAME] */
999 has_mname(shkp) ? MNAME(shkp) : "anonymous");
1000 /* not sure if this is appropriate, because it does nothing to
1001 correct the underlying rooms[].resident issue but... */
1002 return (struct monst *) 0;
1010 struct mkroom *sroom;
1012 struct monst *mtmp = sroom->resident;
1014 return !mtmp ? FALSE : (boolean) inhishop(mtmp);
1017 STATIC_OVL struct bill_x *
1018 onbill(obj, shkp, silent)
1024 register struct bill_x *bp = ESHK(shkp)->bill_p;
1025 register int ct = ESHK(shkp)->billct;
1028 if (bp->bo_id == obj->o_id) {
1031 pline("onbill: paid obj on bill?");
1033 pline("
\8a¨
\92è
\81F
\95¥
\82¤
\81H");
1038 if (obj->unpaid && !silent)
1040 pline("onbill: unpaid obj not on bill?");
1042 pline("
\8a¨
\92è
\81F
\95¥
\82í
\82È
\82¢
\81H");
1043 return (struct bill_x *) 0;
1046 /* check whether an object or any of its contents belongs to a shop */
1051 return (boolean) (obj->unpaid
1052 || (Has_contents(obj) && count_unpaid(obj->cobj)));
1055 /* Delete the contents of the given object. */
1057 delete_contents(obj)
1058 register struct obj *obj;
1060 register struct obj *curr;
1062 while ((curr = obj->cobj) != 0) {
1063 obj_extract_self(curr);
1064 obfree(curr, (struct obj *) 0);
1068 /* called with two args on merge */
1071 register struct obj *obj, *merge;
1073 register struct bill_x *bp;
1074 register struct bill_x *bpm;
1075 register struct monst *shkp;
1077 if (obj->otyp == LEASH && obj->leashmon)
1079 if (obj->oclass == FOOD_CLASS)
1080 food_disappears(obj);
1081 if (obj->oclass == SPBOOK_CLASS)
1082 book_disappears(obj);
1083 if (Has_contents(obj))
1084 delete_contents(obj);
1085 if (Is_container(obj))
1086 maybe_reset_pick(obj);
1090 /* look for a shopkeeper who owns this object */
1091 for (shkp = next_shkp(fmon, TRUE); shkp;
1092 shkp = next_shkp(shkp->nmon, TRUE))
1093 if (onbill(obj, shkp, TRUE))
1096 /* sanity check, in case obj is on bill but not marked 'unpaid' */
1098 shkp = shop_keeper(*u.ushops);
1100 * Note: `shkp = shop_keeper(*u.ushops)' used to be
1101 * unconditional. But obfree() is used all over
1102 * the place, so making its behavior be dependent
1103 * upon player location doesn't make much sense.
1106 if ((bp = onbill(obj, shkp, FALSE)) != 0) {
1109 obj->unpaid = 0; /* only for doinvbill */
1110 add_to_billobjs(obj);
1113 bpm = onbill(merge, shkp, FALSE);
1115 /* this used to be a rename */
1116 impossible("obfree: not on bill??");
1119 /* this was a merger */
1120 bpm->bquan += bp->bquan;
1121 ESHK(shkp)->billct--;
1124 /* DRS/NS 2.2.6 messes up -- Peter Kendell */
1125 int indx = ESHK(shkp)->billct;
1127 *bp = ESHK(shkp)->bill_p[indx];
1130 *bp = ESHK(shkp)->bill_p[ESHK(shkp)->billct];
1134 /* not on bill; if the item is being merged away rather than
1135 just deleted and has a higher price adjustment than the stack
1136 being merged into, give the latter the former's obj->o_id so
1137 that the merged stack takes on higher price; matters if hero
1138 eventually buys them from a shop, but doesn't matter if hero
1139 owns them and intends to sell (unless he subsequently buys
1140 them back) or if no shopping activity ever involves them */
1141 if (merge && (oid_price_adjustment(obj, obj->o_id)
1142 > oid_price_adjustment(merge, merge->o_id)))
1143 merge->o_id = obj->o_id;
1145 if (obj->owornmask) {
1146 impossible("obfree: deleting worn obj (%d: %ld)", obj->otyp,
1148 /* unfortunately at this point we don't know whether worn mask
1149 applied to hero or a monster or perhaps something bogus, so
1150 can't call remove_worn_item() to get <X>_off() side-effects */
1157 check_credit(tmp, shkp)
1159 register struct monst *shkp;
1161 long credit = ESHK(shkp)->credit;
1164 ; /* nothing to do; just 'return tmp;' */
1165 } else if (credit >= tmp) {
1167 pline_The("price is deducted from your credit.");
1169 pline("
\91ã
\8bà
\82Í
\97a
\82¯
\8bà
\82©
\82ç
\8d·
\82µ
\88ø
\82©
\82ê
\82½
\81D");
1170 ESHK(shkp)->credit -= tmp;
1174 pline_The("price is partially covered by your credit.");
1176 pline("
\91ã
\8bà
\82Ì
\88ê
\95\94\82Í
\82 \82È
\82½
\82Ì
\97a
\82¯
\8bà
\82Å
\95â
\82í
\82ê
\82½
\81D");
1177 ESHK(shkp)->credit = 0L;
1186 register struct monst *shkp;
1188 long robbed = ESHK(shkp)->robbed;
1189 long balance = ((tmp <= 0L) ? tmp : check_credit(tmp, shkp));
1192 money2mon(shkp, balance);
1193 else if (balance < 0)
1194 money2u(shkp, -balance);
1200 ESHK(shkp)->robbed = robbed;
1204 /* return shkp to home position */
1206 home_shk(shkp, killkops)
1207 register struct monst *shkp;
1208 register boolean killkops;
1210 register xchar x = ESHK(shkp)->shk.x, y = ESHK(shkp)->shk.y;
1212 (void) mnearto(shkp, x, y, TRUE);
1213 level.flags.has_shop = 1;
1218 after_shk_move(shkp);
1224 register struct monst *shkp;
1226 for (shkp = next_shkp(fmon, FALSE); shkp;
1227 shkp = next_shkp(shkp->nmon, FALSE))
1233 /* remove previously applied surcharge from all billed items */
1236 register struct monst *shkp;
1238 NOTANGRY(shkp) = TRUE; /* make peaceful */
1239 if (ESHK(shkp)->surcharge) {
1240 register struct bill_x *bp = ESHK(shkp)->bill_p;
1241 register int ct = ESHK(shkp)->billct;
1243 ESHK(shkp)->surcharge = FALSE;
1245 register long reduction = (bp->price + 3L) / 4L;
1246 bp->price -= reduction; /* undo 33% increase */
1252 /* add aggravation surcharge to all billed items */
1255 register struct monst *shkp;
1257 NOTANGRY(shkp) = FALSE; /* make angry */
1258 if (!ESHK(shkp)->surcharge) {
1259 register struct bill_x *bp = ESHK(shkp)->bill_p;
1260 register int ct = ESHK(shkp)->billct;
1262 ESHK(shkp)->surcharge = TRUE;
1264 register long surcharge = (bp->price + 2L) / 3L;
1265 bp->price += surcharge;
1271 /* wakeup and/or unparalyze shopkeeper */
1273 rouse_shk(shkp, verbosely)
1277 if (!shkp->mcanmove || shkp->msleeping) {
1278 /* greed induced recovery... */
1279 if (verbosely && canspotmon(shkp))
1281 pline("%s %s.", Shknam(shkp),
1282 shkp->msleeping ? "wakes up" : "can move again");
1284 pline("%s
\82Í%s
\81D", Monnam(shkp),
1285 shkp->msleeping ? "
\96Ú
\82ª
\8ao
\82ß
\82½" : "
\82Ó
\82½
\82½
\82Ñ
\93®
\82¯
\82é
\82æ
\82¤
\82É
\82È
\82Á
\82½");
1287 shkp->msleeping = 0;
1294 make_happy_shk(shkp, silentkops)
1295 register struct monst *shkp;
1296 register boolean silentkops;
1298 boolean wasmad = ANGRY(shkp);
1299 struct eshk *eshkp = ESHK(shkp);
1302 eshkp->following = 0;
1304 if (!Role_if(PM_ROGUE))
1305 adjalign(sgn(u.ualign.type));
1306 if (!inhishop(shkp)) {
1307 char shk_nam[BUFSZ];
1308 boolean vanished = canseemon(shkp);
1310 Strcpy(shk_nam, shkname(shkp));
1311 if (on_level(&eshkp->shoplevel, &u.uz)) {
1312 home_shk(shkp, FALSE);
1313 /* didn't disappear if shk can still be seen */
1314 if (canseemon(shkp))
1317 /* if sensed, does disappear regardless whether seen */
1320 /* can't act as porter for the Amulet, even if shk
1321 happens to be going farther down rather than up */
1322 mdrop_special_objs(shkp);
1323 /* arrive near shop's door */
1324 migrate_to_level(shkp, ledger_no(&eshkp->shoplevel),
1325 MIGR_APPROX_XY, &eshkp->shd);
1326 /* dismiss kops on that level when shk arrives */
1327 eshkp->dismiss_kops = TRUE;
1331 pline("Satisfied, %s suddenly disappears!", shk_nam);
1333 pline("%s
\82Í
\96\9e\91«
\82·
\82é
\82Æ
\81C
\93Ë
\91R
\8fÁ
\82¦
\82½
\81I", shk_nam);
1336 pline("%s calms down.", Shknam(shkp));
1338 pline("%s
\82Í
\97\8e\92\85\82¢
\82½
\81D", Shknam(shkp));
1340 make_happy_shoppers(silentkops);
1343 /* called by make_happy_shk() and also by losedogs() for migrating shk */
1345 make_happy_shoppers(silentkops)
1348 if (!angry_shk_exists()) {
1349 kops_gone(silentkops);
1356 register struct monst *shkp;
1362 (void) strncpy(ESHK(shkp)->customer, plname, PL_NSIZ);
1363 ESHK(shkp)->following = 1;
1366 /* Used when the shkp is teleported or falls (ox == 0) out of his shop, or
1367 when the player is not on a costly_spot and he damages something inside
1368 the shop. These conditions must be checked by the calling function. */
1371 make_angry_shk(shkp, ox, oy)
1373 xchar ox UNUSED; /* <ox,oy> predate 'noit_Monnam()', let alone Shknam() */
1376 struct eshk *eshkp = ESHK(shkp);
1378 /* all pending shop transactions are now "past due" */
1379 if (eshkp->billct || eshkp->debit || eshkp->loan || eshkp->credit) {
1380 eshkp->robbed += (addupbill(shkp) + eshkp->debit + eshkp->loan);
1381 eshkp->robbed -= eshkp->credit;
1382 if (eshkp->robbed < 0L)
1384 /* billct, debit, loan, and credit will be cleared by setpaid */
1389 pline("%s %s!", Shknam(shkp), !ANGRY(shkp) ? "gets angry" : "is furious");
1391 pline("%s
\82Í%s
\81I", Shknam(shkp), !ANGRY(shkp) ? "
\93{
\82Á
\82½" : "
\93{
\82è
\8b¶
\82Á
\82½");
1395 STATIC_VAR const char
1397 no_money[] = "Moreover, you%s have no money.",
1399 no_money[] = "
\82µ
\82©
\82à
\81C
\82 \82È
\82½
\82Í
\82¨
\8bà
\82ª
\82È
\82¢%s
\81D",
1401 not_enough_money[] = "Besides, you don't have enough to interest %s.";
1403 not_enough_money[] = "
\82µ
\82©
\82à
\81C
\82 \82È
\82½
\82Í%s
\82ª
\8b»
\96¡
\82ð
\8e\9d\82Â
\82Ù
\82Ç
\82¨
\8bà
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\81I";
1405 /* delivers the cheapest item on the list */
1408 register struct monst *shkp;
1410 register int ct = ESHK(shkp)->billct;
1411 register struct bill_x *bp = ESHK(shkp)->bill_p;
1412 register long gmin = (bp->price * bp->bquan);
1415 if (bp->price * bp->bquan < gmin)
1416 gmin = bp->price * bp->bquan;
1425 register struct eshk *eshkp;
1426 register struct monst *shkp;
1427 struct monst *nxtm, *resident;
1430 int pass, tmp, sk = 0, seensk = 0;
1431 boolean paid = FALSE, stashed_gold = (hidden_gold() > 0L);
1435 /* Find how many shk's there are, how many are in
1436 * sight, and are you in a shop room with one.
1438 nxtm = resident = 0;
1439 for (shkp = next_shkp(fmon, FALSE); shkp;
1440 shkp = next_shkp(shkp->nmon, FALSE)) {
1442 if (ANGRY(shkp) && distu(shkp->mx, shkp->my) <= 2)
1444 if (canspotmon(shkp))
1446 if (inhishop(shkp) && (*u.ushops == ESHK(shkp)->shoproom))
1450 if (nxtm) { /* Player should always appease an */
1451 shkp = nxtm; /* irate shk standing next to them. */
1455 if ((!sk && (!Blind || Blind_telepat)) || (!Blind && !seensk)) {
1457 There("appears to be no shopkeeper here to receive your payment.");
1459 pline("
\8ex
\95¥
\82¢
\82ð
\8eó
\82¯
\82Æ
\82é
\93X
\8eå
\82Í
\82±
\82±
\82É
\82Í
\82¢
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
1467 You("
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D
\81D
\81D");
1471 /* The usual case. Allow paying at a distance when
1472 * inside a tended shop. Should we change that?
1474 if (sk == 1 && resident) {
1480 for (shkp = next_shkp(fmon, FALSE); shkp;
1481 shkp = next_shkp(shkp->nmon, FALSE))
1482 if (canspotmon(shkp))
1484 if (shkp != resident && distu(shkp->mx, shkp->my) > 2) {
1486 pline("%s is not near enough to receive your payment.",
1488 pline("%s
\82Í
\89\93\82
\82É
\82¢
\82é
\82Ì
\82Å
\8ex
\95¥
\82¦
\82È
\82¢
\81D",
1500 pline("
\92N
\82É
\95¥
\82¤
\81H");
1504 if (getpos(&cc, TRUE, "the creature you want to pay") < 0)
1506 if (getpos(&cc, TRUE, "
\8ex
\95¥
\82¢
\82½
\82¢
\91\8a\8eè") < 0)
1507 return 0; /* player pressed ESC */
1512 pline("Try again...");
1514 pline("
\82à
\82¤
\88ê
\93x
\81D
\81D
\81D");
1517 if (u.ux == cx && u.uy == cy) {
1519 You("are generous to yourself.");
1521 pline("
\8e©
\95ª
\8e©
\90g
\82É
\82È
\82ñ
\82Ä
\8bC
\91O
\82Ì
\82¢
\82¢
\82±
\82Æ
\81I");
1524 mtmp = m_at(cx, cy);
1525 if (!cansee(cx, cy) && (!mtmp || !canspotmon(mtmp))) {
1527 You("can't %s anyone there.", !Blind ? "see" : "sense");
1529 You("
\82±
\82±
\82É
\82Í
\92N
\82à%s
\82È
\82¢
\81D", !Blind ? "
\8c©
\82¦" : "
\8a´
\82¶
\82ç
\82ê");
1534 There("is no one there to receive your payment.");
1536 pline("
\8ex
\95¥
\82¢
\82ð
\8eó
\82¯
\82Æ
\82ê
\82é
\91\8a\8eè
\82Í
\82¢
\82È
\82¢
\81D");
1541 pline("%s is not interested in your payment.", Monnam(mtmp));
1543 pline("%s
\82Í
\8ex
\95¥
\82¢
\82É
\8b»
\96¡
\82ð
\8e¦
\82³
\82È
\82¢
\81D", Monnam(mtmp));
1546 if (mtmp != resident && distu(mtmp->mx, mtmp->my) > 2) {
1548 pline("%s is too far to receive your payment.", Shknam(mtmp));
1550 pline("%s
\82Í
\8ex
\95¥
\82¢
\82É
\8b»
\96¡
\82ð
\8e¦
\82³
\82È
\82¢
\81D", Shknam(mtmp));
1557 debugpline0("dopay: null shkp.");
1562 ltmp = eshkp->robbed;
1564 /* wake sleeping shk when someone who owes money offers payment */
1565 if (ltmp || eshkp->billct || eshkp->debit)
1566 rouse_shk(shkp, TRUE);
1568 if (!shkp->mcanmove || shkp->msleeping) { /* still asleep/paralyzed */
1570 pline("%s %s.", Shknam(shkp),
1571 rn2(2) ? "seems to be napping" : "doesn't respond");
1573 pline("%s
\82Í%s
\81D", Shknam(shkp),
1574 rn2(2) ? "
\8b\8f\96°
\82è
\82ð
\82µ
\82Ä
\82¢
\82é
\82æ
\82¤
\82¾" : "
\94½
\89\9e\82ª
\82È
\82¢");
1579 if (shkp != resident && NOTANGRY(shkp)) {
1580 umoney = money_cnt(invent);
1583 You("do not owe %s anything.", shkname(shkp));
1585 You("%s
\82É
\8eØ
\82è
\82Í
\82È
\82¢
\81D", shkname(shkp));
1588 You("%shave no money.", stashed_gold ? "seem to " : "");
1590 You("
\82¨
\8bà
\82ª
\82È
\82¢%s
\81D", stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1593 pline("But you have some gold stashed away.");
1595 pline("
\82µ
\82©
\82µ
\81C
\82 \82È
\82½
\82É
\82Í
\82¿
\82å
\82Á
\82Á
\82Æ
\82µ
\82½
\83w
\83\
\83N
\83\8a\82ª
\82 \82é
\81D");
1597 if (umoney > ltmp) {
1599 You("give %s the %ld gold piece%s %s asked for.",
1600 shkname(shkp), ltmp, plur(ltmp), noit_mhe(shkp));
1602 You("%s
\82É
\96]
\82Ý
\92Ê
\82è%ld
\96\87\82Ì
\8bà
\89Ý
\82ð
\97^
\82¦
\82½
\81D",
1603 shkname(shkp), ltmp);
1608 You("give %s all your%s gold.", shkname(shkp),
1609 stashed_gold ? " openly kept" : "");
1611 You("%s
\82É%s
\82¨
\8bà
\91S
\95\94\82ð
\97^
\82¦
\82½
\81D", shkname(shkp),
1612 stashed_gold ? "
\8eè
\8e\9d\82¿
\82Ì" : "");
1617 pline("But you have hidden gold!");
1619 pline("
\82µ
\82©
\82µ
\81C
\82 \82È
\82½
\82Í
\83w
\83\
\83N
\83\8a\82ª
\82 \82é
\81I");
1621 if ((umoney < ltmp / 2L) || (umoney < ltmp && stashed_gold))
1623 pline("Unfortunately, %s doesn't look satisfied.",
1625 pline("
\8ec
\94O
\82È
\82ª
\82ç
\81C%s
\82Í
\96\9e\91«
\82µ
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D",
1628 make_happy_shk(shkp, FALSE);
1633 /* ltmp is still eshkp->robbed here */
1634 if (!eshkp->billct && !eshkp->debit) {
1635 umoney = money_cnt(invent);
1636 if (!ltmp && NOTANGRY(shkp)) {
1638 You("do not owe %s anything.", shkname(shkp));
1640 You("%s
\82É
\8eØ
\82è
\82Í
\82È
\82¢
\81D", shkname(shkp));
1643 pline(no_money, stashed_gold ? " seem to" : "");
1645 pline(no_money, stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1648 pline("%s is after blood, not money!", shkname(shkp));
1650 pline("%s
\82Í
\8c\8c\82Ü
\82Ý
\82ê
\82¾
\81D
\82¨
\8bà
\82Ç
\82±
\82ë
\82¶
\82á
\82È
\82¢
\81I", Monnam(shkp));
1651 if (umoney < ltmp / 2L || (umoney < ltmp && stashed_gold)) {
1654 pline(no_money, stashed_gold ? " seem to" : "");
1656 pline(no_money, stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1658 pline(not_enough_money, noit_mhim(shkp));
1662 pline("But since %s shop has been robbed recently,",
1664 pline("
\82µ
\82©
\82µ
\81C%s
\93X
\82Í
\8dÅ
\8bß
\93\90\82Ý
\82É
\82 \82Á
\82½
\82Ì
\82Å
\81C",
1667 pline("you %scompensate %s for %s losses.",
1668 (umoney < ltmp) ? "partially " : "", shkname(shkp),
1671 pline("%s
\82Ì
\91¹
\8e¸%s
\82ð
\95â
\93U
\82µ
\82½
\81D", mhis(shkp),
1672 (umoney < ltmp) ? "
\82Ì
\88ê
\95\94" : "");
1674 pay(umoney < ltmp ? umoney : ltmp, shkp);
1675 make_happy_shk(shkp, FALSE);
1677 /* shopkeeper is angry, but has not been robbed --
1678 * door broken, attacked, etc. */
1680 pline("%s is after your hide, not your money!", Shknam(shkp));
1682 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\96½
\82ð
\91_
\82Á
\82Ä
\82¢
\82é
\81C
\82¨
\8bà
\82Ç
\82±
\82ë
\82¶
\82á
\82È
\82¢
\81I", Shknam(shkp));
1683 if (umoney < 1000L) {
1686 pline(no_money, stashed_gold ? " seem to" : "");
1688 pline(no_money, stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1690 pline(not_enough_money, noit_mhim(shkp));
1694 You("try to appease %s by giving %s 1000 gold pieces.",
1696 ? x_monnam(shkp, ARTICLE_THE, "angry", 0, FALSE)
1700 You("
\8bà
\89Ý1000
\96\87\82ð%s
\82É
\8eè
\93n
\82µ
\82Ä
\82È
\82¾
\82ß
\82æ
\82¤
\82Æ
\82µ
\82½
\81D",
1702 ? x_monnam(shkp, ARTICLE_THE, "
\93{
\82Á
\82½", 0, FALSE)
1706 if (strncmp(eshkp->customer, plname, PL_NSIZ) || rn2(3))
1707 make_happy_shk(shkp, FALSE);
1710 pline("But %s is as angry as ever.", shkname(shkp));
1712 pline("
\82µ
\82©
\82µ%s
\82Í
\82Ü
\82¾
\93{
\82Á
\82Ä
\82¢
\82é
\81D", shkname(shkp));
1716 if (shkp != resident) {
1717 impossible("dopay: not to shopkeeper?");
1722 /* pay debt, if any, first */
1724 long dtmp = eshkp->debit;
1725 long loan = eshkp->loan;
1728 umoney = money_cnt(invent);
1729 #if 0 /*JP*//*
\96\96\94ö
\82É
\89ñ
\82·*/
1730 Sprintf(sbuf, "You owe %s %ld %s ", shkname(shkp), dtmp,
1736 Strcat(sbuf, "you picked up in the store.");
1738 Strcpy(sbuf, "
\93X
\82Ì
\92\86\82Å
\8fE
\82Á
\82½
\82à
\82Ì
\82É
\91Î
\82µ
\82Ä
\81C");
1742 "for gold picked up and the use of merchandise.");
1744 Strcpy(sbuf,"
\8fE
\82Á
\82½
\82¨
\8bà
\82â
\8eg
\82Á
\82½
\8eG
\89Ý
\82É
\91Î
\82µ
\82Ä
\81C");
1748 Strcat(sbuf, "for the use of merchandise.");
1750 Strcpy(sbuf, "
\8eg
\82Á
\82½
\8eG
\89Ý
\82É
\91Î
\82µ
\82Ä
\81C");
1751 #if 1 /*JP*//*
\8fã
\82©
\82ç
\88Ú
\93®*/
1752 Sprintf(eos(sbuf), "%s
\82É%ld%s
\82Ì
\8eØ
\82è
\82ª
\82 \82é
\81D",
1753 shkname(shkp), dtmp, currency(dtmp));
1756 if (umoney + eshkp->credit < dtmp) {
1758 pline("But you don't%s have enough gold%s.",
1759 stashed_gold ? " seem to" : "",
1760 eshkp->credit ? " or credit" : "");
1762 pline("
\82µ
\82©
\82µ
\81C
\82¨
\8bà%s
\91«
\82è
\82È
\82¢%s
\81D",
1763 eshkp->credit ? "
\82à
\97a
\82¯
\8bà
\82à" : "
\82ª",
1764 stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1768 if (eshkp->credit >= dtmp) {
1769 eshkp->credit -= dtmp;
1773 Your("debt is covered by your credit.");
1775 Your("
\8eØ
\8bà
\82Í
\97a
\82¯
\8bà
\82Å
\95â
\82í
\82ê
\82½
\81D");
1776 } else if (!eshkp->credit) {
1777 money2mon(shkp, dtmp);
1781 You("pay that debt.");
1783 You("
\8eØ
\8bà
\82ð
\95¥
\82Á
\82½
\81D");
1786 dtmp -= eshkp->credit;
1788 money2mon(shkp, dtmp);
1792 pline("That debt is partially offset by your credit.");
1794 pline("
\82»
\82Ì
\8eØ
\8bà
\82Í
\88ê
\95\94\97a
\82¯
\8bà
\82Å
\91\8a\8eE
\82³
\82ê
\82½
\81D");
1796 You("pay the remainder.");
1798 You("
\8ec
\82è
\82ð
\95¥
\82Á
\82½
\81D");
1804 /* now check items on bill */
1805 if (eshkp->billct) {
1806 register boolean itemize;
1809 umoney = money_cnt(invent);
1810 if (!umoney && !eshkp->credit) {
1812 You("%shave no money or credit%s.",
1813 stashed_gold ? "seem to " : "", paid ? " left" : "");
1815 You("%s
\82¨
\8bà
\82à
\97a
\82¯
\8bà
\82à
\8e\9d\82Á
\82Ä
\82È
\82¢%s
\81D",
1816 paid ? "
\82à
\82¤" : "", stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1820 if ((umoney + eshkp->credit) < cheapest_item(shkp)) {
1822 You("don't have enough money to buy%s the item%s you picked.",
1823 eshkp->billct > 1 ? " any of" : "", plur(eshkp->billct));
1825 pline("
\8fE
\82Á
\82½
\95i
\95¨
\82ð
\94\83\82¤
\82É
\82Í
\82¨
\8bà
\82ª
\91«
\82è
\82È
\82¢
\81D");
1829 pline("Maybe you have some gold stashed away?");
1831 You("
\82Ç
\82±
\82©
\82É
\82¨
\8bà
\82ð
\89B
\82µ
\82Ä
\82¢
\82é
\82Ì
\82©
\82à
\81H");
1835 /* this isn't quite right; it itemizes without asking if the
1836 * single item on the bill is partly used up and partly unpaid */
1838 iprompt = (eshkp->billct > 1 ? ynq("Itemized billing?") : 'y');
1840 iprompt = (eshkp->billct > 1 ? ynq("
\8cÂ
\95Ê
\82É
\8a¨
\92è
\82µ
\82Ü
\82·
\82©
\81H") : 'y');
1841 itemize = (iprompt == 'y');
1845 for (pass = 0; pass <= 1; pass++) {
1847 while (tmp < eshkp->billct) {
1849 register struct bill_x *bp = &(eshkp->bill_p[tmp]);
1851 /* find the object on one of the lists */
1852 if ((otmp = bp_to_obj(bp)) != 0) {
1853 /* if completely used up, object quantity is stale;
1854 restoring it to its original value here avoids
1855 making the partly-used-up code more complicated */
1857 otmp->quan = bp->bquan;
1859 impossible("Shopkeeper administration out of order.");
1860 setpaid(shkp); /* be nice to the player */
1863 if (pass == bp->useup && otmp->quan == bp->bquan) {
1864 /* pay for used-up items on first pass and others
1865 * on second, so player will be stuck in the store
1866 * less often; things which are partly used up
1867 * are processed on both passes */
1870 switch (dopayobj(shkp, bp, &otmp, pass, itemize)) {
1875 goto thanks; /*break*/
1890 *bp = eshkp->bill_p[--eshkp->billct];
1896 update_inventory(); /* Done in dopayobj() if itemize. */
1898 if (!ANGRY(shkp) && paid) {
1899 if (!Deaf && !muteshk(shkp))
1901 verbalize("Thank you for shopping in %s %s!",
1902 s_suffix(shkname(shkp)),
1903 shtypes[eshkp->shoptype - SHOPBASE].name);
1905 verbalize("%s
\82Ì%s
\82Ö
\82Ü
\82½
\82Ç
\82¤
\82¼
\81I",
1907 shtypes[eshkp->shoptype - SHOPBASE].name);
1911 pline("%s nods appreciatively at you for shopping in %s %s!",
1912 Shknam(shkp), noit_mhis(shkp),
1913 shtypes[eshkp->shoptype - SHOPBASE].name);
1915 pline("%s
\82Í%s
\82Å
\82Ì
\94\83\82¢
\95¨
\82É
\8a´
\8eÓ
\82µ
\82Ä
\82¤
\82È
\82Ã
\82¢
\82½
\81I",
1917 shtypes[eshkp->shoptype - SHOPBASE].name);
1923 /* return 2 if used-up portion paid
1924 * 1 if paid successfully
1925 * 0 if not enough money
1926 * -1 if skip this object
1927 * -2 if no money/credit left
1930 dopayobj(shkp, bp, obj_p, which, itemize)
1931 register struct monst *shkp;
1932 register struct bill_x *bp;
1934 int which; /* 0 => used-up item, 1 => other (unpaid or lost) */
1937 register struct obj *obj = *obj_p;
1938 long ltmp, quan, save_quan;
1939 long umoney = money_cnt(invent);
1941 boolean stashed_gold = (hidden_gold() > 0L), consumed = (which == 0);
1943 if (!obj->unpaid && !bp->useup) {
1944 impossible("Paid object on bill??");
1947 if (itemize && umoney + ESHK(shkp)->credit == 0L) {
1949 You("%shave no money or credit left.",
1950 stashed_gold ? "seem to " : "");
1952 You("
\82à
\82¤
\82¨
\8bà
\82à
\97a
\82¯
\8bà
\82à
\82È
\82¢%s
\81D",
1953 stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1957 /* we may need to temporarily adjust the object, if part of the
1958 original quantity has been used up but part remains unpaid */
1959 save_quan = obj->quan;
1961 /* either completely used up (simple), or split needed */
1963 if (quan > obj->quan) /* difference is amount used up */
1966 /* dealing with ordinary unpaid item */
1969 obj->quan = quan; /* to be used by doname() */
1970 obj->unpaid = 0; /* ditto */
1971 iflags.suppress_price++; /* affects containers */
1972 ltmp = bp->price * quan;
1973 buy = PAY_BUY; /* flag; if changed then return early */
1976 char qbuf[BUFSZ], qsfx[BUFSZ];
1979 Sprintf(qsfx, " for %ld %s. Pay?", ltmp, currency(ltmp));
1981 Sprintf(qsfx, "
\82Í%ld%s
\82Å
\82·.
\94\83\82¢
\82Ü
\82·
\82©
\81H", ltmp, currency(ltmp));
1983 (void) safe_qbuf(qbuf, (char *) 0, qsfx, obj,
1984 (quan == 1L) ? Doname2 : doname, ansimpleoname,
1985 (quan == 1L) ? "that" : "those");
1987 (void) safe_qbuf(qbuf, (char *) 0, qsfx, obj,
1988 (quan == 1L) ? Doname2 : doname, ansimpleoname,
1991 if (yn(qbuf) == 'n') {
1992 buy = PAY_SKIP; /* don't want to buy */
1993 } else if (quan < bp->bquan && !consumed) { /* partly used goods */
1994 obj->quan = bp->bquan - save_quan; /* used up amount */
1995 if (!Deaf && !muteshk(shkp)) {
1997 verbalize("%s for the other %s before buying %s.",
1998 ANGRY(shkp) ? "Pay" : "Please pay",
1999 simpleonames(obj), /* short name suffices */
2000 save_quan > 1L ? "these" : "this one");
2002 verbalize("
\82»
\82ê
\82ð
\94\83\82¤
\82Ü
\82¦
\82É
\91¼
\82Ì%s
\82ð%s",
2004 ANGRY(shkp) ? "
\95¥
\82¦
\81I" : "
\95¥
\82Á
\82Ä
\82
\82¾
\82³
\82¢
\81D");
2008 pline("%s %s%s your bill for the other %s first.",
2010 ANGRY(shkp) ? "angrily " : "",
2011 nolimbs(shkp->data) ? "motions to" : "points out",
2014 pline("%s
\82Í%s
\91¼
\82Ì%s
\82Ì
\82½
\82ß
\82Ì
\8ex
\95¥
\82¢
\82ð
\90æ
\82É
\82·
\82é
\82æ
\82¤
\82É
\91£
\82µ
\82½
\81D",
2016 ANGRY(shkp) ? "
\93{
\82Á
\82Ä" : "",
2020 buy = PAY_SKIP; /* shk won't sell */
2023 if (buy == PAY_BUY && umoney + ESHK(shkp)->credit < ltmp) {
2025 You("don't%s have gold%s enough to pay for %s.",
2026 stashed_gold ? " seem to" : "",
2027 (ESHK(shkp)->credit > 0L) ? " or credit" : "",
2028 thesimpleoname(obj));
2030 You("%s
\82Ì
\91ã
\8bà
\82ð
\8ex
\95¥
\82¤
\82¾
\82¯
\82Ì
\82¨
\8bà%s
\8e\9d\82Á
\82Ä
\82È
\82¢%s
\81D",
2031 thesimpleoname(obj),
2032 (ESHK(shkp)->credit > 0L) ? "
\82à
\97a
\82¯
\8bà
\82à" : "
\82ð",
2033 stashed_gold ? "
\82æ
\82¤
\82¾" : "");
2035 buy = itemize ? PAY_SKIP : PAY_CANT;
2038 if (buy != PAY_BUY) {
2039 /* restore unpaid object to original state */
2040 obj->quan = save_quan;
2042 iflags.suppress_price--;
2048 shk_names_obj(shkp, obj,
2049 consumed ? "paid for %s at a cost of %ld gold piece%s.%s"
2050 : "bought %s for %ld gold piece%s.%s",
2053 shk_names_obj(shkp, obj,
2054 consumed ? "%s
\82É
\8bà
\89Ý%ld
\96\87%s
\82ð
\8ex
\95¥
\82Á
\82½
\81D%s"
2055 : "%s
\82ð
\8bà
\89Ý%ld
\96\87%s
\82Å
\94\83\82Á
\82½
\81D%s",
2058 obj->quan = save_quan; /* restore original count */
2059 /* quan => amount just bought, save_quan => remaining unpaid count */
2061 if (quan != bp->bquan) {
2062 /* eliminate used-up portion; remainder is still unpaid */
2063 bp->bquan = obj->quan;
2067 } else { /* completely used-up, so get rid of it */
2068 obj_extract_self(obj);
2069 /* assert( obj == *obj_p ); */
2071 *obj_p = 0; /* destroy pointer to freed object */
2074 update_inventory(); /* Done just once in dopay() if !itemize. */
2075 iflags.suppress_price--;
2079 static struct repo { /* repossession context */
2080 struct monst *shopkeeper;
2084 /* routine called after dying (or quitting) */
2086 paybill(croaked, silently)
2087 int croaked; /* -1: escaped dungeon; 0: quit; 1: died */
2088 boolean silently; /* maybe avoid messages */
2090 struct monst *mtmp, *mtmp2, *firstshk, *resident, *creditor, *hostile,
2093 boolean taken = FALSE, local;
2096 /* if we escaped from the dungeon, shopkeepers can't reach us;
2097 shops don't occur on level 1, but this could happen if hero
2098 level teleports out of the dungeon and manages not to die */
2101 /* [should probably also return false when dead hero has been
2102 petrified since shk shouldn't be able to grab inventory
2103 which has been shut inside a statue] */
2105 /* this is where inventory will end up if any shk takes it */
2106 repo.location.x = repo.location.y = 0;
2107 repo.shopkeeper = 0;
2110 * Scan all shopkeepers on the level, to prioritize them:
2111 * 1) keeper of shop hero is inside and who is owed money,
2112 * 2) keeper of shop hero is inside who isn't owed any money,
2113 * 3) other shk who is owed money, 4) other shk who is angry,
2114 * 5) any shk local to this level, and if none is found,
2115 * 6) first shk on monster list (last resort; unlikely, since
2116 * any nonlocal shk will probably be in the owed category
2117 * and almost certainly be in the angry category).
2119 resident = creditor = hostile = localshk = (struct monst *) 0;
2120 for (mtmp = next_shkp(fmon, FALSE); mtmp;
2121 mtmp = next_shkp(mtmp2, FALSE)) {
2124 local = on_level(&eshkp->shoplevel, &u.uz);
2125 if (local && index(u.ushops, eshkp->shoproom)) {
2126 /* inside this shk's shop [there might be more than one
2127 resident shk if hero is standing in a breech of a shared
2128 wall, so give priority to one who's also owed money] */
2129 if (!resident || eshkp->billct || eshkp->debit || eshkp->robbed)
2131 } else if (eshkp->billct || eshkp->debit || eshkp->robbed) {
2132 /* owe this shopkeeper money (might also owe others) */
2135 } else if (eshkp->following || ANGRY(mtmp)) {
2136 /* this shopkeeper is antagonistic (others might be too) */
2140 /* this shopkeeper's shop is on current level */
2146 /* give highest priority shopkeeper first crack */
2147 firstshk = resident ? resident
2148 : creditor ? creditor
2153 taken = inherits(firstshk, numsk, croaked, silently);
2156 /* now handle the rest */
2157 for (mtmp = next_shkp(fmon, FALSE); mtmp;
2158 mtmp = next_shkp(mtmp2, FALSE)) {
2161 local = on_level(&eshkp->shoplevel, &u.uz);
2162 if (mtmp != firstshk) {
2164 taken |= inherits(mtmp, numsk, croaked, silently);
2166 /* for bones: we don't want a shopless shk around */
2174 inherits(shkp, numsk, croaked, silently)
2182 struct eshk *eshkp = ESHK(shkp);
2183 boolean take = FALSE, taken = FALSE;
2184 unsigned save_minvis = shkp->minvis;
2185 int roomno = *u.ushops;
2188 /* not strictly consistent; affects messages and prevents next player
2189 (if bones are saved) from blundering into or being ambused by an
2190 invisible shopkeeper */
2192 /* The simplifying principle is that first-come
2193 already took everything you had. */
2195 if (cansee(shkp->mx, shkp->my) && croaked && !silently) {
2197 if (has_head(shkp->data) && !rn2(2))
2199 Sprintf(takes, ", shakes %s %s,", noit_mhis(shkp),
2200 mbodypart(shkp, HEAD));
2202 Strcpy(takes, "
\8eñ
\82ð
\90U
\82è
\81C");
2205 pline("%s %slooks at your corpse%s and %s.", Shknam(shkp),
2206 (!shkp->mcanmove || shkp->msleeping) ? "wakes up, " : "",
2207 takes, !inhishop(shkp) ? "disappears" : "sighs");
2209 pline("%s
\82Í%s
\82 \82È
\82½
\82Ì
\8e\80\91Ì
\82ð
\8c©
\82Ä%s%s
\81D", Shknam(shkp),
2210 (!shkp->mcanmove || shkp->msleeping) ? "
\96Ú
\82ð
\82³
\82Ü
\82·
\82Æ" : "",
2211 takes, !inhishop(shkp) ? "
\8ep
\82ð
\8fÁ
\82µ
\82½" : "
\97
\91§
\82ð
\82Â
\82¢
\82½");
2214 rouse_shk(shkp, FALSE); /* wake shk for bones */
2215 taken = (roomno == eshkp->shoproom);
2219 /* get one case out of the way: you die in the shop, the */
2220 /* shopkeeper is peaceful, nothing stolen, nothing owed. */
2221 if (roomno == eshkp->shoproom && inhishop(shkp) && !eshkp->billct
2222 && !eshkp->robbed && !eshkp->debit && NOTANGRY(shkp)
2223 && !eshkp->following && u.ugrave_arise < LOW_PM) {
2224 taken = (invent != 0);
2225 if (taken && !silently)
2227 pline("%s gratefully inherits all your possessions.",
2229 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\8e\9d\82¿
\95¨
\82ð
\82 \82è
\82ª
\82½
\82
\8eó
\82¯
\82Æ
\82Á
\82½
\81D",
2235 if (eshkp->billct || eshkp->debit || eshkp->robbed) {
2236 if (roomno == eshkp->shoproom && inhishop(shkp))
2237 loss = addupbill(shkp) + eshkp->debit;
2238 if (loss < eshkp->robbed)
2239 loss = eshkp->robbed;
2243 if (eshkp->following || ANGRY(shkp) || take) {
2246 umoney = money_cnt(invent);
2248 if (!shkp->mcanmove || shkp->msleeping)
2250 Strcat(takes, "wakes up and ");
2252 Strcat(takes, "
\96Ú
\82ª
\82³
\82ß
\82é
\82Æ
\81C");
2253 if (distu(shkp->mx, shkp->my) > 2)
2255 Strcat(takes, "comes and ");
2257 Strcat(takes, "
\8bß
\82Ã
\82«
\81C");
2259 Strcat(takes, "takes");
2262 if (loss > umoney || !loss || roomno == eshkp->shoproom) {
2263 eshkp->robbed -= umoney;
2264 if (eshkp->robbed < 0L)
2267 money2mon(shkp, umoney);
2272 pline("%s %s all your possessions.", Shknam(shkp), takes);
2274 pline("%s
\82Í%s
\82 \82È
\82½
\82Ì
\8e\9d\82¿
\95¨
\82·
\82×
\82Ä
\82ð
\82à
\82ç
\82Á
\82½
\81D", Shknam(shkp), takes);
2276 /* where to put player's invent (after disclosure) */
2279 money2mon(shkp, loss);
2283 pline("%s %s the %ld %s %sowed %s.", Shknam(shkp),
2284 takes, loss, currency(loss),
2285 strncmp(eshkp->customer, plname, PL_NSIZ) ? "" : "you ",
2288 pline("%s
\82Í%s%s
\8eØ
\82è
\82Ä
\82¢
\82é%ld%s
\82ð
\8eó
\82¯
\82Æ
\82Á
\82½
\81D", Shknam(shkp),
2290 strncmp(eshkp->customer, plname, PL_NSIZ) ? "" : "
\82 \82È
\82½
\82ª",
2291 loss, currency(loss));
2293 /* shopkeeper has now been paid in full */
2295 eshkp->following = 0;
2299 /* in case we create bones */
2300 rouse_shk(shkp, FALSE); /* wake up */
2301 if (!inhishop(shkp))
2302 home_shk(shkp, FALSE);
2305 shkp->minvis = save_minvis;
2314 register xchar ox, oy;
2315 struct eshk *eshkp = ESHK(shkp);
2317 /* if you're not in this shk's shop room, or if you're in its doorway
2318 or entry spot, then your gear gets dumped all the way inside */
2319 if (*u.ushops != eshkp->shoproom || IS_DOOR(levl[u.ux][u.uy].typ)
2320 || (u.ux == eshkp->shk.x && u.uy == eshkp->shk.y)) {
2321 /* shk.x,shk.y is the position immediately in
2322 * front of the door -- move in one more space
2326 ox += sgn(ox - eshkp->shd.x);
2327 oy += sgn(oy - eshkp->shd.y);
2328 } else { /* already inside this shk's shop */
2332 /* finish_paybill will deposit invent here */
2333 repo.location.x = ox;
2334 repo.location.y = oy;
2335 repo.shopkeeper = shkp;
2338 /* called at game exit, after inventory disclosure but before making bones;
2339 shouldn't issue any messages */
2343 struct monst *shkp = repo.shopkeeper;
2344 int ox = repo.location.x, oy = repo.location.y;
2346 #if 0 /* don't bother */
2347 if (ox == 0 && oy == 0)
2348 impossible("finish_paybill: no location");
2350 /* normally done by savebones(), but that's too late in this case */
2352 /* if hero has any gold left, take it into shopkeeper's possession */
2354 long umoney = money_cnt(invent);
2357 money2mon(shkp, umoney);
2359 /* transfer rest of the character's inventory to the shop floor */
2360 drop_upon_death((struct monst *) 0, (struct obj *) 0, ox, oy);
2363 /* find obj on one of the lists */
2364 STATIC_OVL struct obj *
2366 register struct bill_x *bp;
2368 register struct obj *obj;
2369 register unsigned int id = bp->bo_id;
2372 obj = o_on(id, billobjs);
2379 * Look for o_id on all lists but billobj. Return obj or NULL if not found.
2380 * Its OK for restore_timers() to call this function, there should not
2381 * be any timeouts on the billobjs chain.
2388 struct monst *mon, *mmtmp[3];
2391 /* first check various obj lists directly */
2392 if ((obj = o_on(id, invent)) != 0)
2394 if ((obj = o_on(id, fobj)) != 0)
2396 if ((obj = o_on(id, level.buriedobjlist)) != 0)
2398 if ((obj = o_on(id, migrating_objs)) != 0)
2401 /* not found yet; check inventory for members of various monst lists */
2403 mmtmp[1] = migrating_mons;
2404 mmtmp[2] = mydogs; /* for use during level changes */
2405 for (i = 0; i < 3; i++)
2406 for (mon = mmtmp[i]; mon; mon = mon->nmon)
2407 if ((obj = o_on(id, mon->minvent)) != 0)
2410 /* not found at all */
2411 return (struct obj *) 0;
2414 /* Returns the price of an arbitrary item in the shop,
2415 0 if the item doesn't belong to a shopkeeper or hero is not in the shop. */
2417 get_cost_of_shop_item(obj, nochrg)
2418 register struct obj *obj;
2419 int *nochrg; /* alternate return value: 1: no charge, 0: shop owned, */
2420 { /* -1: not in a shop (so should't be formatted as "no charge") */
2427 *nochrg = -1; /* assume 'not applicable' */
2428 if (*u.ushops && obj->oclass != COIN_CLASS
2429 && obj != uball && obj != uchain
2430 && get_obj_location(obj, &x, &y, CONTAINED_TOO)
2431 && *in_rooms(x, y, SHOPBASE) == *u.ushops
2432 && (shkp = shop_keeper(inside_shop(x, y))) != 0 && inhishop(shkp)) {
2433 for (top = obj; top->where == OBJ_CONTAINED; top = top->ocontainer)
2435 freespot = (top->where == OBJ_FLOOR
2436 && x == ESHK(shkp)->shk.x && y == ESHK(shkp)->shk.y);
2437 /* no_charge is only set for floor items inside shop proper;
2438 items on freespot are implicitly 'no charge' */
2439 *nochrg = (top->where == OBJ_FLOOR && (obj->no_charge || freespot));
2441 if (carried(top) ? (int) obj->unpaid : !*nochrg)
2442 cost = obj->quan * get_cost(obj, shkp);
2443 if (Has_contents(obj) && !freespot)
2444 cost += contained_cost(obj, shkp, 0L, FALSE, TRUE);
2449 /* decide whether to apply a surcharge (or hypothetically, a discount) to obj
2450 if it had ID number 'oid'; returns 1: increase, 0: normal, -1: decrease */
2452 oid_price_adjustment(obj, oid)
2456 int res = 0, otyp = obj->otyp;
2458 if (!(obj->dknown && objects[otyp].oc_name_known)
2459 && (obj->oclass != GEM_CLASS || objects[otyp].oc_material != GLASS)) {
2460 res = ((oid % 4) == 0); /* id%4 ==0 -> +1, ==1..3 -> 0 */
2465 /* calculate the value that the shk will charge for [one of] an object */
2468 register struct obj *obj;
2469 register struct monst *shkp; /* if angry, impose a surcharge */
2471 long tmp = getprice(obj, FALSE),
2472 /* used to perform a single calculation even when multiple
2473 adjustments (unID'd, dunce/tourist, charisma) are made */
2474 multiplier = 1L, divisor = 1L;
2478 /* shopkeeper may notice if the player isn't very knowledgeable -
2479 especially when gem prices are concerned */
2480 if (!obj->dknown || !objects[obj->otyp].oc_name_known) {
2481 if (obj->oclass == GEM_CLASS
2482 && objects[obj->otyp].oc_material == GLASS) {
2484 /* get a value that's 'random' from game to game, but the
2485 same within the same game */
2486 boolean pseudorand =
2487 (((int) ubirthday % obj->otyp) >= obj->otyp / 2);
2489 /* all gems are priced high - real or not */
2490 switch (obj->otyp - LAST_GEM) {
2492 i = pseudorand ? DIAMOND : OPAL;
2495 i = pseudorand ? SAPPHIRE : AQUAMARINE;
2498 i = pseudorand ? RUBY : JASPER;
2500 case 4: /* yellowish brown */
2501 i = pseudorand ? AMBER : TOPAZ;
2503 case 5: /* orange */
2504 i = pseudorand ? JACINTH : AGATE;
2506 case 6: /* yellow */
2507 i = pseudorand ? CITRINE : CHRYSOBERYL;
2510 i = pseudorand ? BLACK_OPAL : JET;
2513 i = pseudorand ? EMERALD : JADE;
2515 case 9: /* violet */
2516 i = pseudorand ? AMETHYST : FLUORITE;
2519 impossible("bad glass gem %d?", obj->otyp);
2523 tmp = (long) objects[i].oc_cost;
2524 } else if (oid_price_adjustment(obj, obj->o_id) > 0) {
2525 /* unid'd, arbitrarily impose surcharge: tmp *= 4/3 */
2530 if (uarmh && uarmh->otyp == DUNCE_CAP)
2531 multiplier *= 4L, divisor *= 3L;
2532 else if ((Role_if(PM_TOURIST) && u.ulevel < (MAXULEV / 2))
2533 || (uarmu && !uarm && !uarmc)) /* touristy shirt visible */
2534 multiplier *= 4L, divisor *= 3L;
2536 if (ACURR(A_CHA) > 18)
2538 else if (ACURR(A_CHA) == 18)
2539 multiplier *= 2L, divisor *= 3L;
2540 else if (ACURR(A_CHA) >= 16)
2541 multiplier *= 3L, divisor *= 4L;
2542 else if (ACURR(A_CHA) <= 5)
2544 else if (ACURR(A_CHA) <= 7)
2545 multiplier *= 3L, divisor *= 2L;
2546 else if (ACURR(A_CHA) <= 10)
2547 multiplier *= 4L, divisor *= 3L;
2549 /* tmp = (tmp * multiplier) / divisor [with roundoff tweak] */
2552 /* tmp = (((tmp * 10) / divisor) + 5) / 10 */
2561 /* the artifact prices in artilist[] are also used as a score bonus;
2562 inflate their shop price here without affecting score calculation */
2566 /* anger surcharge should match rile_shk's, so we do it separately
2567 from the multiplier/divisor calculation */
2568 if (shkp && ESHK(shkp)->surcharge)
2569 tmp += (tmp + 2L) / 3L;
2573 /* returns the price of a container's content. the price
2574 * of the "top" container is added in the calling functions.
2575 * a different price quoted for selling as vs. buying.
2578 contained_cost(obj, shkp, price, usell, unpaid_only)
2583 boolean unpaid_only;
2585 register struct obj *otmp, *top;
2587 boolean on_floor, freespot;
2589 for (top = obj; top->where == OBJ_CONTAINED; top = top->ocontainer)
2591 /* pick_obj() removes item from floor, adds it to shop bill, then
2592 puts it in inventory; behave as if it is still on the floor
2593 during the add-to-bill portion of that situation */
2594 on_floor = (top->where == OBJ_FLOOR || top->where == OBJ_FREE);
2595 if (top->where == OBJ_FREE || !get_obj_location(top, &x, &y, 0))
2597 freespot = (on_floor && x == ESHK(shkp)->shk.x && y == ESHK(shkp)->shk.y);
2599 /* price of contained objects; "top" container handled by caller */
2600 for (otmp = obj->cobj; otmp; otmp = otmp->nobj) {
2601 if (otmp->oclass == COIN_CLASS)
2605 if (saleable(shkp, otmp) && !otmp->unpaid
2606 && otmp->oclass != BALL_CLASS
2607 && !(otmp->oclass == FOOD_CLASS && otmp->oeaten)
2608 && !(Is_candle(otmp)
2609 && otmp->age < 20L * (long) objects[otmp->otyp].oc_cost))
2610 price += set_cost(otmp, shkp);
2612 /* no_charge is only set for floor items (including
2613 contents of floor containers) inside shop proper;
2614 items on freespot are implicitly 'no charge' */
2615 if (on_floor ? (!otmp->no_charge && !freespot)
2616 : (otmp->unpaid || !unpaid_only))
2617 price += get_cost(otmp, shkp) * otmp->quan;
2620 if (Has_contents(otmp))
2621 price = contained_cost(otmp, shkp, price, usell, unpaid_only);
2627 /* count amount of gold inside container 'obj' and any nested containers */
2632 register struct obj *otmp;
2633 register long value = 0L;
2635 /* accumulate contained gold */
2636 for (otmp = obj->cobj; otmp; otmp = otmp->nobj)
2637 if (otmp->oclass == COIN_CLASS)
2638 value += otmp->quan;
2639 else if (Has_contents(otmp))
2640 value += contained_gold(otmp);
2646 dropped_container(obj, shkp, sale)
2647 register struct obj *obj;
2648 register struct monst *shkp;
2649 register boolean sale;
2651 register struct obj *otmp;
2653 /* the "top" container is treated in the calling fn */
2654 for (otmp = obj->cobj; otmp; otmp = otmp->nobj) {
2655 if (otmp->oclass == COIN_CLASS)
2658 if (!otmp->unpaid && !(sale && saleable(shkp, otmp)))
2659 otmp->no_charge = 1;
2661 if (Has_contents(otmp))
2662 dropped_container(otmp, shkp, sale);
2667 picked_container(obj)
2668 register struct obj *obj;
2670 register struct obj *otmp;
2672 /* the "top" container is treated in the calling fn */
2673 for (otmp = obj->cobj; otmp; otmp = otmp->nobj) {
2674 if (otmp->oclass == COIN_CLASS)
2677 if (otmp->no_charge)
2678 otmp->no_charge = 0;
2680 if (Has_contents(otmp))
2681 picked_container(otmp);
2686 special_stock(obj, shkp, quietly)
2691 /* for unique situations */
2692 if (ESHK(shkp)->shoptype == CANDLESHOP
2693 && obj->otyp == CANDELABRUM_OF_INVOCATION) {
2695 if (is_izchak(shkp, TRUE) && !u.uevent.invoked) {
2696 if (Deaf || muteshk(shkp)) {
2698 pline("%s seems %s that you want to sell that.",
2700 (obj->spe < 7) ? "horrified" : "concerned");
2702 pline("%s
\82Í
\82 \82È
\82½
\82ª
\82»
\82ê
\82ð
\94\84\82ë
\82¤
\82Æ
\82µ
\82Ä
\82¢
\82é
\82±
\82Æ
\82ð%s
\82Ä
\82¢
\82é
\82æ
\82¤
\82¾
\81D",
2704 (obj->spe < 7) ? "
\8b°
\82ê" : "
\90S
\94z
\82µ");
2708 verbalize("No thanks, I'd hang onto that if I were you.");
2710 verbalize("
\82¢
\82â
\81C
\82¢
\82ç
\82È
\82¢
\81D
\8e\84\82È
\82ç
\82»
\82ê
\82ð
\8eè
\95ú
\82³
\82È
\82¢
\82Ë
\81D");
2714 "You'll need %d%s candle%s to go along with it.",
2715 (7 - obj->spe), (obj->spe > 0) ? " more" : "",
2716 plur(7 - obj->spe));
2719 "
\82»
\82ê
\82ð
\8eg
\82¤
\82É
\82Í%s%d
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82ª
\95K
\97v
\82¾
\81D",
2720 (obj->spe > 0) ? "
\82 \82Æ" : "", (7 - obj->spe));
2722 /* [what if hero is already carrying enough candles?
2723 should Izchak explain how to attach them instead?] */
2726 if (!Deaf && !muteshk(shkp))
2728 verbalize("I won't stock that. Take it out of here!");
2730 verbalize("
\82»
\82ê
\82Í
\8ed
\93ü
\82ê
\82È
\82¢
\82æ
\81D
\8e\9d\82Á
\82Ä
\82¢
\82«
\82È
\82³
\82¢
\81I");
2733 pline("%s shakes %s %s in refusal.",
2734 Shknam(shkp), noit_mhis(shkp),
2735 mbodypart(shkp, HEAD));
2737 pline("%s
\82Í%s
\82ð
\90U
\82Á
\82Ä
\8b\91\94Û
\82µ
\82½
\81D",
2739 mbodypart(shkp, HEAD));
2748 /* calculate how much the shk will pay when buying [all of] an object */
2751 register struct obj *obj;
2752 register struct monst *shkp;
2754 long tmp = getprice(obj, TRUE) * obj->quan, multiplier = 1L, divisor = 1L;
2756 if (uarmh && uarmh->otyp == DUNCE_CAP)
2758 else if ((Role_if(PM_TOURIST) && u.ulevel < (MAXULEV / 2))
2759 || (uarmu && !uarm && !uarmc)) /* touristy shirt visible */
2764 /* shopkeeper may notice if the player isn't very knowledgeable -
2765 especially when gem prices are concerned */
2766 if (!obj->dknown || !objects[obj->otyp].oc_name_known) {
2767 if (obj->oclass == GEM_CLASS) {
2768 /* different shop keepers give different prices */
2769 if (objects[obj->otyp].oc_material == GEMSTONE
2770 || objects[obj->otyp].oc_material == GLASS) {
2771 tmp = (obj->otyp % (6 - shkp->m_id % 3));
2772 tmp = (tmp + 3) * obj->quan;
2774 } else if (tmp > 1L && !(shkp->m_id % 4))
2775 multiplier *= 3L, divisor *= 4L;
2779 /* [see get_cost()] */
2787 /* avoid adjusting nonzero to zero */
2792 /* (no adjustment for angry shk here) */
2796 /* unlike alter_cost() which operates on a specific item, identifying or
2797 forgetting a gem causes all unpaid gems of its type to change value */
2808 * Unfortunately, shop bill doesn't have object type included,
2809 * just obj->oid for each unpaid stack, so we have to go through
2810 * every bill and every item on that bill and match up against
2811 * every unpaid stack on the level....
2813 * Fortunately, there's no need to catch up when changing dungeon
2814 * levels even if we ID'd or forget some gems while gone from a
2815 * level. There won't be any shop bills when arriving; they were
2816 * either paid before leaving or got treated as robbery and it's
2817 * too late to adjust pricing.
2819 for (shkp = next_shkp(fmon, TRUE); shkp;
2820 shkp = next_shkp(shkp->nmon, TRUE)) {
2821 ct = ESHK(shkp)->billct;
2822 bp = ESHK(shkp)->bill;
2824 obj = find_oid(bp->bo_id);
2825 if (!obj) /* shouldn't happen */
2827 if ((oindx != STRANGE_OBJECT) ? (obj->otyp == oindx)
2828 : (obj->oclass == GEM_CLASS))
2829 bp->price = get_cost(obj, shkp);
2835 /* called when an item's value has been enhanced; if it happens to be
2836 on any shop bill, update that bill to reflect the new higher price
2837 [if the new price drops for some reason, keep the old one in place] */
2839 alter_cost(obj, amt)
2841 long amt; /* if 0, use regular shop pricing, otherwise force amount;
2842 if negative, use abs(amt) even if it's less than old cost */
2844 struct bill_x *bp = 0;
2848 for (shkp = next_shkp(fmon, TRUE); shkp; shkp = next_shkp(shkp, TRUE))
2849 if ((bp = onbill(obj, shkp, TRUE)) != 0) {
2850 new_price = !amt ? get_cost(obj, shkp) : (amt < 0L) ? -amt : amt;
2851 if (new_price > bp->price || amt < 0L) {
2852 bp->price = new_price;
2860 /* called from doinv(invent.c) for inventory of unpaid objects */
2862 unpaid_cost(unp_obj, include_contents)
2863 struct obj *unp_obj; /* known to be unpaid or contain unpaid */
2864 boolean include_contents;
2866 struct bill_x *bp = (struct bill_x *) 0;
2871 if (!get_obj_location(unp_obj, &ox, &oy, BURIED_TOO | CONTAINED_TOO))
2872 ox = u.ux, oy = u.uy; /* (shouldn't happen) */
2873 if ((shkp = shop_keeper(*in_rooms(ox, oy, SHOPBASE))) != 0) {
2874 bp = onbill(unp_obj, shkp, TRUE);
2876 /* didn't find shk? try searching bills */
2877 for (shkp = next_shkp(fmon, TRUE); shkp;
2878 shkp = next_shkp(shkp->nmon, TRUE))
2879 if ((bp = onbill(unp_obj, shkp, TRUE)) != 0)
2883 /* onbill() gave no message if unexpected problem occurred */
2884 if (!shkp || (unp_obj->unpaid && !bp)) {
2885 impossible("unpaid_cost: object wasn't on any bill.");
2888 amt = unp_obj->quan * bp->price;
2889 if (include_contents && Has_contents(unp_obj))
2890 amt = contained_cost(unp_obj, shkp, amt, FALSE, TRUE);
2896 add_one_tobill(obj, dummy, shkp)
2905 if (!billable(&shkp, obj, *u.ushops, TRUE))
2909 if (eshkp->billct == BILLSZ) {
2911 You("got that for free!");
2913 You("
\82»
\82ê
\82ð
\82½
\82¾
\82Å
\8eè
\82É
\93ü
\82ê
\82½
\81I");
2917 /* normally bill_p gets set up whenever you enter the shop, but obj
2918 might be going onto the bill because hero just snagged it with
2919 a grappling hook from outside without ever having been inside */
2921 eshkp->bill_p = &(eshkp->bill[0]);
2923 bct = eshkp->billct;
2924 bp = &(eshkp->bill_p[bct]);
2925 bp->bo_id = obj->o_id;
2926 bp->bquan = obj->quan;
2927 if (dummy) { /* a dummy object must be inserted into */
2928 bp->useup = 1; /* the billobjs chain here. crucial for */
2929 add_to_billobjs(obj); /* eating floorfood in shop. see eat.c */
2932 bp->price = get_cost(obj, shkp);
2938 add_to_billobjs(obj)
2941 if (obj->where != OBJ_FREE)
2942 panic("add_to_billobjs: obj not free");
2944 obj_stop_timers(obj);
2946 obj->nobj = billobjs;
2948 obj->where = OBJ_ONBILL;
2951 /* recursive billing of objects within containers. */
2953 bill_box_content(obj, ininv, dummy, shkp)
2954 register struct obj *obj;
2955 register boolean ininv, dummy;
2956 register struct monst *shkp;
2958 register struct obj *otmp;
2960 if (SchroedingersBox(obj))
2962 for (otmp = obj->cobj; otmp; otmp = otmp->nobj) {
2963 if (otmp->oclass == COIN_CLASS)
2966 /* the "top" box is added in addtobill() */
2967 if (!otmp->no_charge)
2968 add_one_tobill(otmp, dummy, shkp);
2969 if (Has_contents(otmp))
2970 bill_box_content(otmp, ininv, dummy, shkp);
2974 /* shopkeeper tells you what you bought or sold, sometimes partly IDing it */
2976 shk_names_obj(shkp, obj, fmt, amt, arg)
2979 const char *fmt; /* "%s %ld %s %s", doname(obj), amt, plur(amt), arg */
2984 char *obj_name, fmtbuf[BUFSZ];
2988 boolean was_unknown = !obj->dknown;
2991 /* Use real name for ordinary weapons/armor, and spell-less
2992 * scrolls/books (that is, blank and mail), but only if the
2993 * object is within the shk's area of interest/expertise.
2995 if (!objects[obj->otyp].oc_magic && saleable(shkp, obj)
2996 && (obj->oclass == WEAPON_CLASS || obj->oclass == ARMOR_CLASS
2997 || obj->oclass == SCROLL_CLASS || obj->oclass == SPBOOK_CLASS
2998 || obj->otyp == MIRROR)) {
2999 was_unknown |= !objects[obj->otyp].oc_name_known;
3000 makeknown(obj->otyp);
3002 obj_name = doname(obj);
3003 /* Use an alternate message when extra information is being provided */
3004 #if 0 /*JP*//*
\93ú
\96{
\8cê
\82Å
\82Í
\93¯
\82¶
\88µ
\82¢*/
3006 Sprintf(fmtbuf, "%%s; you %s", fmt);
3007 obj_name[0] = highc(obj_name[0]);
3008 pline(fmtbuf, obj_name, (obj->quan > 1L) ? "them" : "it", amt,
3011 You(fmt, obj_name, amt, plur(amt), arg);
3014 You(fmt, obj_name, amt, "", arg);
3018 /* decide whether a shopkeeper thinks an item belongs to her */
3020 billable(shkpp, obj, roomno, reset_nocharge)
3021 struct monst **shkpp; /* in: non-null if shk has been validated; out: shk */
3024 boolean reset_nocharge;
3026 struct monst *shkp = *shkpp;
3028 /* if caller hasn't supplied a shopkeeper, look one up now */
3032 shkp = shop_keeper(roomno);
3033 if (!shkp || !inhishop(shkp))
3037 /* perhaps we threw it away earlier */
3038 if (onbill(obj, shkp, FALSE)
3039 || (obj->oclass == FOOD_CLASS && obj->oeaten))
3041 /* outer container might be marked no_charge but still have contents
3042 which should be charged for; clear no_charge when picking things up */
3043 if (obj->no_charge) {
3044 if (!Has_contents(obj) || (contained_gold(obj) == 0L
3045 && contained_cost(obj, shkp, 0L, FALSE,
3046 !reset_nocharge) == 0L))
3047 shkp = 0; /* not billable */
3048 if (reset_nocharge && !shkp && obj->oclass != COIN_CLASS) {
3050 if (Has_contents(obj))
3051 picked_container(obj); /* clear no_charge */
3054 return shkp ? TRUE : FALSE;
3058 addtobill(obj, ininv, dummy, silent)
3060 boolean ininv, dummy, silent;
3062 struct monst *shkp = 0;
3063 long ltmp, cltmp, gltmp;
3067 if (!billable(&shkp, obj, *u.ushops, TRUE))
3070 if (obj->oclass == COIN_CLASS) {
3071 costly_gold(obj->ox, obj->oy, obj->quan);
3073 } else if (ESHK(shkp)->billct == BILLSZ) {
3076 You("got that for free!");
3078 You("
\82»
\82ê
\82ð
\82½
\82¾
\82Å
\8eè
\82É
\93ü
\82ê
\82½
\81I");
3082 ltmp = cltmp = gltmp = 0L;
3083 container = Has_contents(obj);
3085 if (!obj->no_charge)
3086 ltmp = get_cost(obj, shkp);
3088 if (obj->no_charge && !container) {
3094 cltmp = contained_cost(obj, shkp, cltmp, FALSE, FALSE);
3095 gltmp = contained_gold(obj);
3098 add_one_tobill(obj, dummy, shkp);
3100 bill_box_content(obj, ininv, dummy, shkp);
3101 picked_container(obj); /* reset contained obj->no_charge */
3106 costly_gold(obj->ox, obj->oy, gltmp);
3113 contentscount = count_unpaid(obj->cobj);
3114 } else { /* !container */
3115 add_one_tobill(obj, dummy, shkp);
3119 if (!Deaf && !muteshk(shkp) && !silent) {
3124 pline("%s has no interest in %s.", Shknam(shkp), the(xname(obj)));
3126 pline("%s
\82Í%s
\82É
\8b»
\96¡
\82ð
\8e¦
\82³
\82È
\82¢
\81D", Shknam(shkp), the(xname(obj)));
3131 pline("%s will cost you %ld %s%s.", The(xname(obj)), ltmp,
3132 currency(ltmp), (obj->quan > 1L) ? " each" : "");
3134 pline("%s
\82Í%s
\82½
\82Á
\82½
\82Ì%ld%s
\82¾
\81D", xname(obj),
3135 (obj->quan > 1L) ? "
\88ê
\82Â" : "", ltmp, currency(ltmp));
3138 long save_quan = obj->quan;
3141 Strcpy(buf, "\"For you, ");
3143 Strcat(buf, "scum;");
3145 append_honorific(buf);
3146 Strcat(buf, "; only");
3149 Strcpy(buf, "
\81u");
3151 Strcat(buf, "
\82±
\82Ì
\83N
\83\
\82Á
\82½
\82ê
\81C");
3153 append_honorific(buf);
3154 Strcat(buf, "
\81C");
3157 obj->quan = 1L; /* fool xname() into giving singular */
3159 pline("%s %ld %s %s %s%s.\"", buf, ltmp, currency(ltmp),
3160 (save_quan > 1L) ? "per"
3161 : (contentscount && !obj->unpaid)
3162 ? "for the contents of this"
3165 (contentscount && obj->unpaid) ? and_its_contents : "");
3167 pline("%s%s%s
\82½
\82Á
\82½
\82Ì%ld%s
\82¾
\81D
\81v", buf, xname(obj),
3168 (save_quan > 1L) ? "
\82Í
\88ê
\82Â" : (contentscount && !obj->unpaid)
3169 ? "
\82Ì
\92\86\90g
\82Í"
3171 ltmp, currency(ltmp));
3173 obj->quan = save_quan;
3175 } else if (!silent) {
3178 pline_The("list price of %s%s%s is %ld %s%s.",
3179 (contentscount && !obj->unpaid) ? the_contents_of : "",
3181 (contentscount && obj->unpaid) ? and_its_contents : "",
3182 ltmp, currency(ltmp), (obj->quan > 1L) ? " each" : "");
3184 pline_The("%s%s%s%s
\82½
\82Á
\82½
\82Ì%ld%s
\82¾.",
3186 (contentscount && !obj->unpaid) ? "
\82Ì
\92\86\90g
\82Í" : "",
3187 (contentscount && obj->unpaid) ? and_its_contents : "",
3188 (obj->quan > 1L) ? "
\82»
\82ê
\82¼
\82ê" : "", ltmp, currency(ltmp));
3192 pline("%s does not notice.", Shknam(shkp));
3194 pline("%s
\82Í
\8bC
\82ª
\82Â
\82¢
\82Ä
\82¢
\82È
\82¢
\81D", Shknam(shkp));
3199 append_honorific(buf)
3202 /* (chooses among [0]..[3] normally; [1]..[4] after the
3203 Wizard has been killed or invocation ritual performed) */
3205 static const char *const honored[] = { "good", "honored", "most gracious",
3207 "most renowned and sacred" };
3209 static const char *const honored[] = {
3210 "
\82â
\82\9f", "
\82â
\82\9f\81C
\96¼
\97_
\82 \82é", "
\82â
\82\9f\81C
\8fã
\95i
\82È",
3211 "
\82â
\82\9f\81C
\91¸
\8ch
\82·
\82é",
3212 "
\82â
\82\9f\81C
\8d\82\96¼
\82Å
\90_
\90¹
\82È"
3216 Strcat(buf, honored[rn2(SIZE(honored) - 1) + u.uevent.udemigod]);
3217 #if 0 /*JP*//*
\93ú
\96{
\8cê
\82Å
\82Í
\82»
\82±
\82Ü
\82Å
\82µ
\82È
\82¢*/
3218 if (is_vampire(youmonst.data))
3219 Strcat(buf, (flags.female) ? " dark lady" : " dark lord");
3220 else if (is_elf(youmonst.data))
3221 Strcat(buf, (flags.female) ? " hiril" : " hir");
3225 Strcat(buf, !is_human(youmonst.data) ? " creature"
3226 : (flags.female) ? " lady"
3229 Strcat(buf, !is_human(youmonst.data) ? "
\90¶
\95¨
\82³
\82ñ"
3230 : (flags.female) ? "
\82¨
\8fì
\82³
\82ñ"
3231 : "
\92U
\93ß
\82³
\82ñ");
3236 splitbill(obj, otmp)
3237 register struct obj *obj, *otmp;
3239 /* otmp has been split off from obj */
3240 register struct bill_x *bp;
3242 register struct monst *shkp = shop_keeper(*u.ushops);
3244 if (!shkp || !inhishop(shkp)) {
3245 impossible("splitbill: no resident shopkeeper??");
3248 bp = onbill(obj, shkp, FALSE);
3250 impossible("splitbill: not on bill?");
3253 if (bp->bquan < otmp->quan) {
3254 impossible("Negative quantity on bill??");
3256 if (bp->bquan == otmp->quan) {
3257 impossible("Zero quantity on bill??");
3259 bp->bquan -= otmp->quan;
3261 if (ESHK(shkp)->billct == BILLSZ)
3265 bp = &(ESHK(shkp)->bill_p[ESHK(shkp)->billct]);
3266 bp->bo_id = otmp->o_id;
3267 bp->bquan = otmp->quan;
3270 ESHK(shkp)->billct++;
3275 sub_one_frombill(obj, shkp)
3276 register struct obj *obj;
3277 register struct monst *shkp;
3279 register struct bill_x *bp;
3281 if ((bp = onbill(obj, shkp, FALSE)) != 0) {
3282 register struct obj *otmp;
3285 if (bp->bquan > obj->quan) {
3288 otmp->oextra = (struct oextra *) 0;
3289 bp->bo_id = otmp->o_id = context.ident++;
3290 otmp->where = OBJ_FREE;
3291 otmp->quan = (bp->bquan -= obj->quan);
3292 otmp->owt = 0; /* superfluous */
3294 add_to_billobjs(otmp);
3297 ESHK(shkp)->billct--;
3300 /* DRS/NS 2.2.6 messes up -- Peter Kendell */
3301 int indx = ESHK(shkp)->billct;
3303 *bp = ESHK(shkp)->bill_p[indx];
3306 *bp = ESHK(shkp)->bill_p[ESHK(shkp)->billct];
3309 } else if (obj->unpaid) {
3310 impossible("sub_one_frombill: unpaid object not on bill");
3315 /* recursive check of unpaid objects within nested containers. */
3317 subfrombill(obj, shkp)
3318 register struct obj *obj;
3319 register struct monst *shkp;
3321 register struct obj *otmp;
3323 sub_one_frombill(obj, shkp);
3325 if (Has_contents(obj))
3326 for (otmp = obj->cobj; otmp; otmp = otmp->nobj) {
3327 if (otmp->oclass == COIN_CLASS)
3330 if (Has_contents(otmp))
3331 subfrombill(otmp, shkp);
3333 sub_one_frombill(otmp, shkp);
3338 stolen_container(obj, shkp, price, ininv)
3348 /* the price of contained objects; caller handles top container */
3349 for (otmp = obj->cobj; otmp; otmp = otmp->nobj) {
3350 if (otmp->oclass == COIN_CLASS)
3353 if (!billable(&shkp, otmp, ESHK(shkp)->shoproom, TRUE)) {
3354 /* billable() returns false for objects already on bill */
3355 if ((bp = onbill(otmp, shkp, FALSE)) == 0)
3357 /* this assumes that we're being called by stolen_value()
3358 (or by a recursive call to self on behalf of it) where
3359 the cost of this object is about to be added to shop
3360 debt in place of having it remain on the current bill */
3361 billamt = bp->bquan * bp->price;
3362 sub_one_frombill(otmp, shkp); /* avoid double billing */
3367 else if (ininv ? otmp->unpaid : !otmp->no_charge)
3368 price += otmp->quan * get_cost(otmp, shkp);
3370 if (Has_contents(otmp))
3371 price = stolen_container(otmp, shkp, price, ininv);
3378 stolen_value(obj, x, y, peaceful, silent)
3381 boolean peaceful, silent;
3383 long value = 0L, gvalue = 0L, billamt = 0L;
3384 char roomno = *in_rooms(x, y, SHOPBASE);
3386 struct monst *shkp = 0;
3388 long c_count = 0L, u_count = 0L;
3390 /* gather information for message(s) prior to manipulating bill */
3391 was_unpaid = obj->unpaid ? TRUE : FALSE;
3392 if (Has_contents(obj)) {
3393 c_count = count_contents(obj, TRUE, FALSE, TRUE);
3394 u_count = count_contents(obj, TRUE, FALSE, FALSE);
3397 if (!billable(&shkp, obj, roomno, FALSE)) {
3398 /* things already on the bill yield a not-billable result, so
3399 we need to check bill before deciding that shk doesn't care */
3400 if ((bp = onbill(obj, shkp, FALSE)) != 0) {
3401 /* shk does care; take obj off bill to avoid double billing */
3402 billamt = bp->bquan * bp->price;
3403 sub_one_frombill(obj, shkp);
3405 if (!bp && !u_count)
3409 if (obj->oclass == COIN_CLASS) {
3410 gvalue += obj->quan;
3414 else if (!obj->no_charge)
3415 value += obj->quan * get_cost(obj, shkp);
3417 if (Has_contents(obj)) {
3419 (obj->where == OBJ_INVENT || obj->where == OBJ_FREE);
3421 value += stolen_container(obj, shkp, 0L, ininv);
3423 gvalue += contained_gold(obj);
3427 if (gvalue + value == 0L)
3433 boolean credit_use = !!ESHK(shkp)->credit;
3435 value = check_credit(value, shkp);
3436 /* 'peaceful' affects general treatment, but doesn't affect
3437 * the fact that other code expects that all charges after the
3438 * shopkeeper is angry are included in robbed, not debit */
3440 ESHK(shkp)->robbed += value;
3442 ESHK(shkp)->debit += value;
3446 const char *still = "";
3449 if (ESHK(shkp)->credit) {
3451 You("have %ld %s credit remaining.", ESHK(shkp)->credit,
3452 currency(ESHK(shkp)->credit));
3454 You("%ld%s
\82Ì
\97a
\82¯
\8bà
\82ª
\8ec
\82Á
\82Ä
\82¢
\82é
\81D", ESHK(shkp)->credit,
3455 currency(ESHK(shkp)->credit));
3458 } else if (!value) {
3460 You("have no credit remaining.");
3462 pline("
\97a
\82¯
\8bà
\82Í
\82È
\82
\82È
\82Á
\82½
\81D");
3468 still = "
\82³
\82ç
\82É";
3471 Sprintf(buf, "%sowe %s %ld %s", still, shkname(shkp),
3472 value, currency(value));
3473 if (u_count) /* u_count > 0 implies Has_contents(obj) */
3474 Sprintf(eos(buf), " for %s%sits contents",
3475 was_unpaid ? "it and " : "",
3476 (c_count > u_count) ? "some of " : "");
3477 else if (obj->oclass != COIN_CLASS)
3478 Sprintf(eos(buf), " for %s",
3479 (obj->quan > 1L) ? "them" : "it");
3481 Sprintf(buf, "%s%s
\82É%ld%s
\82Ì
\8eØ
\82è
\82ð
\82Â
\82
\82Á
\82½", still, shkname(shkp),
3482 value, currency(value));
3486 You("%s!", buf); /* "You owe <shk> N zorkmids for it!" */
3488 You("%s
\81I", buf); /* "You owe <shk> N zorkmids for it!" */
3492 ESHK(shkp)->robbed += value;
3495 if (canseemon(shkp)) {
3497 Norep("%s booms: \"%s, you are a thief!\"",
3498 Shknam(shkp), plname);
3500 Norep("%s
\82Í
\8b©
\82ñ
\82¾
\81F
\81u%s
\81C
\91Ò
\82Ä
\81I
\82±
\82Ì
\82Ç
\82ë
\82Ú
\82¤
\82ß
\81I
\81v",
3501 Shknam(shkp), plname);
3505 Norep("You hear a scream, \"Thief!\"");
3507 Norep("
\8bà
\90Ø
\82è
\90º
\82ð
\95·
\82¢
\82½
\81C
\81u
\91Ò
\82Ä
\81I
\82±
\82Ì
\82Ç
\82ë
\82Ú
\82¤
\82ß
\81I
\81v");
3510 (void) angry_guards(FALSE);
3515 /* auto-response flag for/from "sell foo?" 'a' => 'y', 'q' => 'n' */
3516 static char sell_response = 'a';
3517 static int sell_how = SELL_NORMAL;
3518 /* can't just use sell_response='y' for auto_credit because the 'a' response
3519 shouldn't carry over from ordinary selling to credit selling */
3520 static boolean auto_credit = FALSE;
3523 sellobj_state(deliberate)
3526 /* If we're deliberately dropping something, there's no automatic
3527 response to the shopkeeper's "want to sell" query; however, if we
3528 accidentally drop anything, the shk will buy it/them without asking.
3529 This retains the old pre-query risk that slippery fingers while in
3530 shops entailed: you drop it, you've lost it.
3532 sell_response = (deliberate != SELL_NORMAL) ? '\0' : 'a';
3533 sell_how = deliberate;
3534 auto_credit = FALSE;
3539 register struct obj *obj;
3542 register struct monst *shkp;
3543 register struct eshk *eshkp;
3544 long ltmp = 0L, cltmp = 0L, gltmp = 0L, offer, shkmoney;
3545 boolean saleitem, cgold = FALSE, container = Has_contents(obj);
3546 boolean isgold = (obj->oclass == COIN_CLASS);
3547 boolean only_partially_your_contents = FALSE;
3549 if (!*u.ushops) /* do cheapest exclusion test first */
3551 if (!(shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) || !inhishop(shkp))
3553 if (!costly_spot(x, y))
3556 if (obj->unpaid && !container && !isgold) {
3557 sub_one_frombill(obj, shkp);
3561 /* find the price of content before subfrombill */
3562 cltmp = contained_cost(obj, shkp, cltmp, TRUE, FALSE);
3563 /* find the value of contained gold */
3564 gltmp += contained_gold(obj);
3565 cgold = (gltmp > 0L);
3568 saleitem = saleable(shkp, obj);
3569 if (!isgold && !obj->unpaid && saleitem)
3570 ltmp = set_cost(obj, shkp);
3572 offer = ltmp + cltmp;
3574 /* get one case out of the way: nothing to sell, and no gold */
3575 if (!(isgold || cgold)
3576 && ((offer + gltmp) == 0L || sell_how == SELL_DONTSELL)) {
3577 boolean unpaid = is_unpaid(obj);
3580 dropped_container(obj, shkp, FALSE);
3584 subfrombill(obj, shkp);
3588 if (!unpaid && (sell_how != SELL_DONTSELL)
3589 && !special_stock(obj, shkp, FALSE))
3591 pline("%s seems uninterested.", Shknam(shkp));
3593 pline("%s
\82Í
\8b»
\96¡
\82ª
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Shknam(shkp));
3597 /* you dropped something of your own - probably want to sell it */
3598 rouse_shk(shkp, TRUE); /* wake up sleeping or paralyzed shk */
3601 if (ANGRY(shkp)) { /* they become shop-objects, no pay */
3602 if (!Deaf && !muteshk(shkp))
3604 verbalize("Thank you, scum!");
3606 verbalize("
\82 \82è
\82ª
\82Æ
\82æ
\81C
\82±
\82Ì
\83N
\83\
\82Á
\82½
\82ê
\81I");
3609 pline("%s smirks with satisfaction.", Shknam(shkp));
3611 pline("%s
\82Í
\96\9e\91«
\82µ
\82Ä
\8dì
\82è
\8fÎ
\82¢
\82ð
\95\82\82©
\82×
\82½
\81D", Shknam(shkp));
3612 subfrombill(obj, shkp);
3616 if (eshkp->robbed) { /* shkp is not angry? */
3621 if ((eshkp->robbed -= offer < 0L))
3623 if (offer && !Deaf && !muteshk(shkp))
3626 "Thank you for your contribution to restock this recently plundered shop.");
3628 "
\8añ
\91¡
\82ð
\82Ç
\82¤
\82à
\82 \82è
\82ª
\82Æ
\82¤
\81D
\8dÅ
\8bß
\93\90\82Ý
\82É
\82 \82Á
\82Ä
\8eQ
\82Á
\82Ä
\82½
\82ñ
\82¾
\81D");
3629 subfrombill(obj, shkp);
3633 if (isgold || cgold) {
3637 if (eshkp->debit >= gltmp) {
3638 if (eshkp->loan) { /* you carry shop's gold */
3639 if (eshkp->loan >= gltmp)
3640 eshkp->loan -= gltmp;
3644 eshkp->debit -= gltmp;
3646 Your("debt is %spaid off.", eshkp->debit ? "partially " : "");
3648 Your("
\8eØ
\8bà
\82Í%s
\8ex
\95¥
\82í
\82ê
\82½
\81D", eshkp->debit ? "
\88ê
\95\94" : "");
3650 long delta = gltmp - eshkp->debit;
3652 eshkp->credit += delta;
3657 Your("debt is paid off.");
3659 Your("
\8eØ
\8bà
\82Í
\8ex
\95¥
\82í
\82ê
\82½
\81D");
3661 if (eshkp->credit == delta)
3663 You("have established %ld %s credit.", delta,
3666 pline("%ld%s
\82ð
\97a
\82¯
\82½
\81D", delta,
3671 pline("%ld %s added to your credit; total is now %ld %s.",
3672 delta, currency(delta), eshkp->credit,
3673 currency(eshkp->credit));
3675 pline("
\97a
\82¯
\8bà
\82É%ld%s
\92Ç
\89Á
\82³
\82ê
\82½;
\8d\87\8cv
\82Í%ld%s
\82É
\82È
\82Á
\82½
\81D.",
3676 delta, currency(delta), eshkp->credit,
3677 currency(eshkp->credit));
3681 if (!offer || sell_how == SELL_DONTSELL) {
3684 dropped_container(obj, shkp, FALSE);
3687 subfrombill(obj, shkp);
3693 if ((!saleitem && !(container && cltmp > 0L)) || eshkp->billct == BILLSZ
3694 || obj->oclass == BALL_CLASS || obj->oclass == CHAIN_CLASS
3695 || offer == 0L || (obj->oclass == FOOD_CLASS && obj->oeaten)
3697 && obj->age < 20L * (long) objects[obj->otyp].oc_cost)) {
3699 pline("%s seems uninterested%s.", Shknam(shkp),
3700 cgold ? " in the rest" : "");
3702 pline("%s
\82Í%s
\8b»
\96¡
\82ª
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Shknam(shkp),
3703 cgold ? "
\8ec
\82è
\95¨
\82É
\82Í" : "");
3706 dropped_container(obj, shkp, FALSE);
3711 shkmoney = money_cnt(shkp->minvent);
3713 char c, qbuf[BUFSZ];
3717 long tmpcr = ((offer * 9L) / 10L) + (offer <= 1L);
3719 if (sell_how == SELL_NORMAL || auto_credit) {
3720 c = sell_response = 'y';
3721 } else if (sell_response != 'n') {
3723 pline("%s cannot pay you at present.", Shknam(shkp));
3725 pline("%s
\82Í
\8d¡
\82Ì
\82Æ
\82±
\82ë
\82Í
\8ex
\95¥
\82¦
\82È
\82¢
\81D", Shknam(shkp));
3727 Sprintf(qbuf, "Will you accept %ld %s in credit for ", tmpcr,
3729 c = ynaq(safe_qbuf(qbuf, qbuf, "?", obj, doname, thesimpleoname,
3730 (obj->quan == 1L) ? "that" : "those"));
3732 Sprintf(qsfx, "
\82É
\82Â
\82¢
\82Ä%ld%s
\82Ì
\97a
\82¯
\8bà
\82ð
\8eó
\82¯
\82¢
\82ê
\82Ü
\82·
\82©
\81H", tmpcr,
3734 c = ynaq(safe_qbuf(qbuf, "", qsfx, obj, doname, thesimpleoname,
3741 } else /* previously specified "quit" */
3748 (sell_how != SELL_NORMAL)
3749 ? "traded %s for %ld zorkmid%s in %scredit."
3750 : "relinquish %s and acquire %ld zorkmid%s in %scredit.",
3751 tmpcr, (eshkp->credit > 0L) ? "additional " : "");
3755 (sell_how != SELL_NORMAL)
3756 ? "%s
\82ð
\8bà
\89Ý%ld
\96\87\95ª
\82Ì
\97a
\82¯
\8bà
\82Å
\8eó
\82¯
\82Æ
\82Á
\82½%s
\81D"
3757 : "%s
\82ð
\93n
\82µ
\81C
\8bà
\89Ý%ld
\96\87\95ª
\82Ì
\97a
\82¯
\8bà
\82ð
\93¾
\82½%s
\81D",
3760 eshkp->credit += tmpcr;
3761 subfrombill(obj, shkp);
3764 sell_response = 'n';
3766 dropped_container(obj, shkp, FALSE);
3769 subfrombill(obj, shkp);
3772 char qbuf[BUFSZ], qsfx[BUFSZ];
3774 boolean short_funds = (offer > shkmoney), one;
3776 boolean short_funds = (offer > shkmoney);
3781 if (!sell_response) {
3782 long yourc = 0L, shksc;
3785 /* number of items owned by shk */
3786 shksc = count_contents(obj, TRUE, TRUE, FALSE);
3787 /* number of items owned by you (total - shksc) */
3788 yourc = count_contents(obj, TRUE, TRUE, TRUE) - shksc;
3789 only_partially_your_contents = shksc && yourc;
3792 "<shk> offers * for ..." query formatting.
3794 "... your <object>. Sell it?"
3795 "... your <objects>. Sell them?"
3796 A container is either owned by the hero, or already
3797 owned by the shk (!ltmp), or the shk isn't interested
3798 in buying it (also !ltmp). It's either empty (!cltmp)
3799 or it has contents owned by the hero or it has some
3800 contents owned by the hero and others by the shk.
3801 (The case where it has contents already entirely owned
3802 by the shk is treated the same was if it were empty
3803 since the hero isn't selling any of those contents.)
3805 "... your <empty bag>. Sell it?"
3806 "... your <bag> and its contents. Sell them?"
3807 "... your <bag> and item inside. Sell them?"
3808 "... your <bag> and items inside. Sell them?"
3810 "... your item in the <bag>. Sell it?"
3811 "... your items in the <bag>. Sell them?"
3814 Sprintf(qbuf, "%s offers%s %ld gold piece%s for %s%s ",
3815 Shknam(shkp), short_funds ? " only" : "", offer,
3818 ? ((yourc == 1L) ? "your item in " : "your items in ")
3820 obj->unpaid ? "the" : "your");
3821 one = obj->unpaid ? (yourc == 1L) : (obj->quan == 1L && !cltmp);
3822 Sprintf(qsfx, "%s. Sell %s?",
3824 ? (only_partially_your_contents
3825 ? ((yourc == 1L) ? " and item inside"
3826 : " and items inside")
3829 one ? "it" : "them");
3830 (void) safe_qbuf(qbuf, qbuf, qsfx, obj, xname, simpleonames,
3831 one ? "that" : "those");
3834 "%s
\82Í
\82 \82È
\82½
\82Ì", Monnam(shkp));
3836 "%s
\82É%ld
\82Ì
\92l%s
\81D
\94\84\82è
\82Ü
\82·
\82©
\81H",
3837 (!ltmp && cltmp) ? "
\82Ì
\92\86\90g" : "",
3839 short_funds ? "
\82µ
\82©
\82Â
\82¯
\82È
\82©
\82Á
\82½" : "
\82ð
\82Â
\82¯
\82½");
3840 (void) safe_qbuf(qbuf, qbuf, qsfx, obj, xname, simpleonames,
3844 qbuf[0] = '\0'; /* just to pacify lint */
3846 switch (sell_response ? sell_response : ynaq(qbuf)) {
3848 sell_response = 'n';
3852 dropped_container(obj, shkp, FALSE);
3855 subfrombill(obj, shkp);
3858 sell_response = 'y';
3862 dropped_container(obj, shkp, TRUE);
3863 if (!obj->unpaid && !saleitem)
3865 subfrombill(obj, shkp);
3868 shk_names_obj(shkp, obj,
3869 (sell_how != SELL_NORMAL)
3870 ? ((!ltmp && cltmp && only_partially_your_contents)
3871 ? "sold some items inside %s for %ld gold piece%s.%s"
3872 : "sold %s for %ld gold piece%s.%s")
3873 : "relinquish %s and receive %ld gold piece%s in compensation.%s",
3876 shk_names_obj(shkp, obj,
3877 (sell_how != SELL_NORMAL)
3878 ? ((!ltmp && cltmp && only_partially_your_contents)
3879 ? "%s
\82Ì
\92\86\90g
\82ð
\8bà
\89Ý%ld
\96\87\82Å
\94\84\82Á
\82½%s
\81D%s"
3880 : "%s
\82ð
\8bà
\89Ý%ld
\96\87\82Å
\94\84\82Á
\82½%s
\81D%s")
3881 : "%s
\82ð
\93n
\82µ
\81C
\8bà
\89Ý%ld
\96\87\82Ì
\91ã
\8f\9e\82ð
\8eó
\82¯
\82Æ
\82Á
\82½%s
\81D%s",
3886 impossible("invalid sell response");
3893 int mode; /* 0: deliver count 1: paged */
3896 void sasc_bug(struct obj *, unsigned);
3900 struct bill_x *bp, *end_bp;
3906 shkp = shop_keeper(*u.ushops);
3907 if (!shkp || !inhishop(shkp)) {
3909 impossible("doinvbill: no shopkeeper?");
3915 /* count expended items, so that the `I' command can decide
3916 whether to include 'x' in its prompt string */
3917 int cnt = !eshkp->debit ? 0 : 1;
3919 for (bp = eshkp->bill_p, end_bp = &eshkp->bill_p[eshkp->billct];
3922 || ((obj = bp_to_obj(bp)) != 0 && obj->quan < bp->bquan))
3927 datawin = create_nhwindow(NHW_MENU);
3929 putstr(datawin, 0, "Unpaid articles already used up:");
3931 putstr(datawin, 0, "
\82·
\82Å
\82É
\8eg
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\96¢
\95¥
\82Ì
\95i
\96Ú
\81F");
3932 putstr(datawin, 0, "");
3935 for (bp = eshkp->bill_p, end_bp = &eshkp->bill_p[eshkp->billct];
3936 bp < end_bp; bp++) {
3937 obj = bp_to_obj(bp);
3939 impossible("Bad shopkeeper administration.");
3942 if (bp->useup || bp->bquan > obj->quan) {
3943 long oquan, uquan, thisused;
3946 uquan = (bp->useup ? bp->bquan : bp->bquan - oquan);
3947 thisused = bp->price * uquan;
3948 totused += thisused;
3949 iflags.suppress_price++; /* suppress "(unpaid)" suffix */
3950 /* Why 'x'? To match `I x', more or less. */
3951 buf_p = xprname(obj, (char *) 0, 'x', FALSE, thisused, uquan);
3952 iflags.suppress_price--;
3953 putstr(datawin, 0, buf_p);
3957 /* additional shop debt which has no itemization available */
3959 putstr(datawin, 0, "");
3960 totused += eshkp->debit;
3962 buf_p = xprname((struct obj *) 0, "usage charges and/or other fees",
3963 GOLD_SYM, FALSE, eshkp->debit, 0L);
3965 buf_p = xprname((struct obj *) 0, "
\8eg
\97p
\97¿
\82Ü
\82½
\82Í
\91¼
\82Ì
\8eè
\90\94\97¿",
3966 GOLD_SYM, FALSE, eshkp->debit, 0L);
3968 putstr(datawin, 0, buf_p);
3971 buf_p = xprname((struct obj *) 0, "Total:", '*', FALSE, totused, 0L);
3973 buf_p = xprname((struct obj *) 0, "
\8d\87\8cv
\81F", '*', FALSE, totused, 0L);
3974 putstr(datawin, 0, "");
3975 putstr(datawin, 0, buf_p);
3976 display_nhwindow(datawin, FALSE);
3978 destroy_nhwindow(datawin);
3983 getprice(obj, shk_buying)
3984 register struct obj *obj;
3987 register long tmp = (long) objects[obj->otyp].oc_cost;
3989 if (obj->oartifact) {
3990 tmp = arti_cost(obj);
3994 switch (obj->oclass) {
3996 /* simpler hunger check, (2-4)*cost */
3997 if (u.uhs >= HUNGRY && !shk_buying)
3998 tmp *= (long) u.uhs;
4007 if (obj->otyp == POT_WATER && !obj->blessed && !obj->cursed)
4013 tmp += 10L * (long) obj->spe;
4017 && obj->age < 20L * (long) objects[obj->otyp].oc_cost)
4024 /* shk catches thrown pick-axe */
4027 register struct obj *obj;
4028 register xchar x, y;
4030 register struct monst *shkp;
4032 if (!(shkp = shop_keeper(inside_shop(x, y))) || !inhishop(shkp))
4035 if (shkp->mcanmove && !shkp->msleeping
4036 && (*u.ushops != ESHK(shkp)->shoproom || !inside_shop(u.ux, u.uy))
4037 && dist2(shkp->mx, shkp->my, x, y) < 3
4038 /* if it is the shk's pos, you hit and anger him */
4039 && (shkp->mx != x || shkp->my != y)) {
4040 if (mnearto(shkp, x, y, TRUE) == 2 && !Deaf && !muteshk(shkp))
4042 verbalize("Out of my way, scum!");
4044 verbalize("
\82Ç
\82¯
\81C
\83N
\83\
\82Á
\82½
\82ê
\81I");
4047 pline("%s nimbly%s catches %s.", Shknam(shkp),
4048 (x == shkp->mx && y == shkp->my) ? "" : " reaches over and",
4051 pline("%s
\82Í
\82·
\82Î
\82â
\82%s%s
\82ð
\82Â
\82©
\82Ü
\82¦
\82½
\81D", Shknam(shkp),
4052 (x == shkp->mx && y == shkp->my) ? "" : "
\8bß
\82Ã
\82¢
\82Ä",
4055 if (!canspotmon(shkp))
4056 map_invisible(x, y);
4060 subfrombill(obj, shkp);
4061 (void) mpickobj(shkp, obj);
4064 return (struct monst *) 0;
4068 add_damage(x, y, cost)
4069 register xchar x, y;
4072 struct damage *tmp_dam;
4075 if (IS_DOOR(levl[x][y].typ)) {
4078 /* Don't schedule for repair unless it's a real shop entrance */
4079 for (shops = in_rooms(x, y, SHOPBASE); *shops; shops++)
4080 if ((mtmp = shop_keeper(*shops)) != 0
4081 && x == ESHK(mtmp)->shd.x && y == ESHK(mtmp)->shd.y)
4086 for (tmp_dam = level.damagelist; tmp_dam; tmp_dam = tmp_dam->next)
4087 if (tmp_dam->place.x == x && tmp_dam->place.y == y) {
4088 tmp_dam->cost += cost;
4089 tmp_dam->when = monstermoves; /* needed by pay_for_damage() */
4092 tmp_dam = (struct damage *) alloc((unsigned) sizeof *tmp_dam);
4093 (void) memset((genericptr_t) tmp_dam, 0, sizeof *tmp_dam);
4094 tmp_dam->when = monstermoves;
4095 tmp_dam->place.x = x;
4096 tmp_dam->place.y = y;
4097 tmp_dam->cost = cost;
4098 tmp_dam->typ = levl[x][y].typ;
4099 tmp_dam->next = level.damagelist;
4100 level.damagelist = tmp_dam;
4101 /* If player saw damage, display as a wall forever */
4103 levl[x][y].seenv = SVALL;
4107 * Do something about damage. Either (!croaked) try to repair it, or
4108 * (croaked) just discard damage structs for non-shared locations, since
4109 * they'll never get repaired. Assume that shared locations will get
4110 * repaired eventually by the other shopkeeper(s). This might be an erroneous
4111 * assumption (they might all be dead too), but we have no reasonable way of
4116 remove_damage(shkp, croaked)
4120 struct damage *tmp_dam, *tmp2_dam;
4121 struct obj *shk_inv = shkp->minvent;
4122 boolean did_repair = FALSE, saw_door = FALSE, saw_floor = FALSE,
4123 stop_picking = FALSE, doorway_trap = FALSE, skip_msg = FALSE;
4124 int saw_walls = 0, saw_untrap = 0, feedback;
4125 char trapmsg[BUFSZ];
4127 feedback = !croaked; /* 1 => give feedback, 0 => don't or already did */
4128 tmp_dam = level.damagelist;
4131 register xchar x = tmp_dam->place.x, y = tmp_dam->place.y;
4134 unsigned old_doormask = 0;
4137 Strcpy(shops, in_rooms(x, y, SHOPBASE));
4138 if (index(shops, ESHK(shkp)->shoproom)) {
4139 if (IS_DOOR(levl[x][y].typ))
4140 old_doormask = levl[x][y].doormask;
4143 disposition = (shops[1]) ? 0 : 1;
4144 } else if (stop_picking) {
4145 disposition = repair_damage(shkp, tmp_dam, &feedback, FALSE);
4147 /* Defer the stop_occupation() until after repair msgs */
4148 if (closed_door(x, y))
4149 stop_picking = picking_at(x, y);
4150 disposition = repair_damage(shkp, tmp_dam, &feedback, FALSE);
4152 stop_picking = FALSE;
4158 tmp_dam = tmp_dam->next;
4162 if (disposition > 1) {
4165 if (IS_WALL(levl[x][y].typ)) {
4167 } else if (IS_DOOR(levl[x][y].typ)
4168 /* an existing door here implies trap removal */
4169 && !(old_doormask & (D_ISOPEN | D_CLOSED))) {
4171 } else if (disposition == 3) { /* untrapped */
4173 if (IS_DOOR(levl[x][y].typ))
4174 doorway_trap = TRUE;
4181 tmp_dam = tmp_dam->next;
4183 free((genericptr_t) level.damagelist);
4184 level.damagelist = tmp_dam;
4186 free((genericptr_t) tmp2_dam->next);
4187 tmp2_dam->next = tmp_dam;
4193 trapmsg[0] = '\0'; /* not just lint suppression... */
4194 shk_inv = (shkp->minvent != shk_inv) ? shkp->minvent : 0;
4195 if (saw_untrap == 1 && shk_inv
4196 && (shk_inv->otyp == BEARTRAP || shk_inv->otyp == LAND_MINE)
4197 && canseemon(shkp)) {
4198 pline("%s untraps %s.", Shknam(shkp), ansimpleoname(shk_inv));
4199 /* we've already reported this trap (and know it's the only one) */
4201 skip_msg = !(saw_walls || saw_door || saw_floor);
4202 } else if (saw_untrap) {
4204 Sprintf(trapmsg, "%s trap%s",
4205 (saw_untrap > 3) ? "several" : (saw_untrap > 1) ? "some"
4208 Sprintf(eos(trapmsg), " %s", vtense(trapmsg, "are"));
4209 Sprintf(eos(trapmsg), " removed from the %s",
4210 (doorway_trap && saw_untrap == 1) ? "doorway" : "floor");
4212 Sprintf(trapmsg, "%sã©
\82ª%s
\82©
\82ç
\8fÁ
\82¦",
4213 (saw_untrap > 3) ? "
\82 \82¿
\82±
\82¿
\82Ì" : (saw_untrap > 1) ? "
\89½
\83J
\8f\8a\82Ì"
4215 (doorway_trap && saw_untrap == 1) ? "
\94à" : "
\8f°");
4220 ; /* already gave an untrap message which covered the only repair */
4221 } else if (saw_walls) {
4223 char wallbuf[BUFSZ];
4225 Sprintf(wallbuf, "section%s", plur(saw_walls));
4226 pline("Suddenly, %s %s of wall %s up!",
4227 (saw_walls == 1) ? "a" : (saw_walls <= 3) ? "some" : "several",
4228 wallbuf, vtense(wallbuf, "close"));
4230 pline("
\93Ë
\91R
\81C
\95Ç
\82ª%s
\95Â
\82Ü
\82Á
\82½
\81I",
4231 (saw_walls == 1) ? "" : (saw_walls <= 3) ? "
\89½
\89Ó
\8f\8a\82©" : "
\82 \82¿
\82±
\82¿
\82Å");
4236 pline_The("shop door reappears!");
4238 pline("
\93X
\82Ì
\94à
\82ª
\82Ü
\82½
\8c»
\82í
\82ê
\82½
\81I");
4241 pline_The("floor is repaired!");
4243 pline("
\8f°
\82Í
\8fC
\95\9c\82³
\82ê
\82½
\81I");
4246 pline("%s!", upstart(trapmsg));
4248 pline("%s
\82½
\81I", trapmsg);
4250 if (saw_door || saw_floor || saw_untrap)
4252 pline("Suddenly, %s%s%s%s%s!",
4253 saw_door ? "the shop door reappears" : "",
4254 (saw_door && saw_floor) ? " and " : "",
4255 saw_floor ? "the floor damage is gone" : "",
4256 ((saw_door || saw_floor) && *trapmsg) ? " and " : "",
4259 pline("
\93Ë
\91R
\81C%s%s%s%s%s
\82½!",
4260 saw_door ? "
\93X
\82Ì
\94à
\82ª
\82Ü
\82½
\8c»
\82í
\82ê" : "",
4261 (saw_door && saw_floor) ? "
\81C" : "",
4262 saw_floor ? "
\8f°
\82Ì
\8f\9d\82ª
\8fC
\95\9c\82³
\82ê" : "",
4263 ((saw_door || saw_floor) && *trapmsg) ? "
\81C" : "",
4267 * these messages aren't right if the unseen repairs were only
4268 * for trap removal (except for hole and possibly trap door).
4270 else if (inside_shop(u.ux, u.uy) == ESHK(shkp)->shoproom)
4272 You_feel("more claustrophobic than before.");
4274 You("
\91O
\82æ
\82è
\95Â
\8f\8a\8b°
\95|
\8fÇ
\8bC
\96¡
\82É
\82È
\82Á
\82½
\81D");
4275 else if (!Deaf && !rn2(10))
4277 Norep("The dungeon acoustics noticeably change.");
4279 Norep("
\96À
\8b{
\82Ì
\89¹
\8b¿
\82Í
\82¢
\82¿
\82¶
\82é
\82µ
\82
\95Ï
\82Á
\82½
\81D");
4286 * 0: repair postponed, 1: silent repair (no messages), 2: normal repair
4290 repair_damage(shkp, tmp_dam, once, catchup)
4292 struct damage *tmp_dam;
4294 boolean catchup; /* restoring a level */
4301 int i, k, ix, iy, disposition = 1;
4303 if ((monstermoves - tmp_dam->when) < REPAIR_DELAY)
4305 if (shkp->msleeping || !shkp->mcanmove || ESHK(shkp)->following)
4307 x = tmp_dam->place.x;
4308 y = tmp_dam->place.y;
4309 if (!IS_ROOM(tmp_dam->typ)) {
4310 if ((x == u.ux && y == u.uy && !Passes_walls)
4311 || (x == shkp->mx && y == shkp->my)
4312 || ((mtmp = m_at(x, y)) != 0 && !passes_walls(mtmp->data)))
4316 if (ttmp && x == u.ux && y == u.uy && !Passes_walls)
4319 if (once && *once) {
4320 boolean shk_closeby = (distu(shkp->mx, shkp->my)
4321 <= (BOLT_LIM / 2) * (BOLT_LIM / 2));
4323 /* this is suboptimal if we eventually give a "shk untraps"
4324 message for the only repair, but perhaps the shop repair
4325 incantation means that shk's untrap attempt will never fail */
4326 if (canseemon(shkp))
4328 pline("%s whispers %s.", Shknam(shkp),
4329 shk_closeby ? "an incantation" : "something");
4331 pline("%s
\82Í%s
\82ð
\82³
\82³
\82â
\82¢
\82½
\81D", Shknam(shkp),
4332 shk_closeby ? "
\8eô
\95¶" : "
\89½
\82©");
4334 else if (!Deaf && shk_closeby)
4336 You_hear("someone muttering an incantation.");
4338 You_hear("
\92N
\82©
\82ª
\8eô
\95¶
\82ð
\82Â
\82Ô
\82â
\82¢
\82Ä
\82¢
\82é
\82Ì
\82ð
\95·
\82¢
\82½
\81D");
4342 if ((ttmp->ttyp == LANDMINE || ttmp->ttyp == BEAR_TRAP)
4343 && dist2(x, y, shkp->mx, shkp->my) <= 2) {
4344 /* convert to an object */
4345 otmp = mksobj((ttmp->ttyp == LANDMINE) ? LAND_MINE : BEARTRAP,
4348 otmp->owt = weight(otmp);
4349 (void) mpickobj(shkp, otmp);
4357 if (IS_ROOM(tmp_dam->typ)
4358 || (tmp_dam->typ == levl[x][y].typ
4359 && (!IS_DOOR(tmp_dam->typ) || levl[x][y].doormask > D_BROKEN)))
4360 /* no terrain fix necessary (trap removal or manually repaired) */
4363 /* door or wall repair; trap, if any, is now gone;
4364 restore original terrain type and move any items away */
4365 levl[x][y].typ = tmp_dam->typ;
4366 if (IS_DOOR(tmp_dam->typ))
4367 levl[x][y].doormask = D_CLOSED; /* arbitrary */
4369 (void) memset((genericptr_t) litter, 0, sizeof litter);
4370 #define NEED_UPDATE 1
4373 #define horiz(i) ((i % 3) - 1)
4374 #define vert(i) ((i / 3) - 1)
4375 k = 0; /* number of adjacent shop spots */
4376 if (level.objects[x][y] && !IS_ROOM(levl[x][y].typ)) {
4377 for (i = 0; i < 9; i++) {
4380 if (i == 4 || !isok(ix, iy) || !ZAP_POS(levl[ix][iy].typ))
4383 if (inside_shop(ix, iy) == ESHK(shkp)->shoproom) {
4384 litter[i] |= INSHOP;
4389 /* placement below assumes there is always at least one adjacent
4390 spot; the 'k' check guards against getting stuck in an infinite
4391 loop if some irregularly shaped room breaks that assumption */
4393 /* Scatter objects haphazardly into the shop */
4394 if (Punished && !u.uswallow
4395 && ((uchain->ox == x && uchain->oy == y)
4396 || (uball->ox == x && uball->oy == y))) {
4398 * Either the ball or chain is in the repair location.
4399 * Take the easy way out and put ball&chain under hero.
4401 * FIXME: message should be reworded; this might be the
4402 * shop's doorway rather than a wall, there might be some
4403 * other stuff here which isn't junk, and "your junk" has
4404 * a slang connotation which could be applicable if hero
4405 * has Passes_walls ability.
4407 if (!Deaf && !muteshk(shkp))
4409 verbalize("Get your junk out of my wall!");
4411 verbalize("
\82»
\82Ì
\83K
\83\89\83N
\83^
\82ð
\8aO
\82É
\8e\9d\82Á
\82Ä
\8ds
\82«
\82È
\81I");
4412 unplacebc(); /* pick 'em up */
4413 placebc(); /* put 'em down */
4415 while ((otmp = level.objects[x][y]) != 0)
4416 /* Don't mess w/ boulders -- just merge into wall */
4417 if (otmp->otyp == BOULDER || otmp->otyp == ROCK) {
4418 obj_extract_self(otmp);
4419 obfree(otmp, (struct obj *) 0);
4423 /* otmp must be moved otherwise level.objects[x][y] will
4424 never become Null and while-loop won't terminate */
4427 } while (--trylimit && !(litter[i] & INSHOP));
4428 if ((litter[i] & (OPEN | INSHOP)) != 0) {
4432 /* we know shk isn't at <x,y> because repair
4433 is deferred in that situation */
4437 remove_object(otmp);
4438 place_object(otmp, ix, iy);
4439 litter[i] |= NEED_UPDATE;
4443 return 1; /* repair occurred while off level so no messages */
4447 if (IS_WALL(tmp_dam->typ))
4448 /* player sees actual repair process, so KNOWS it's a wall */
4449 levl[x][y].seenv = SVALL;
4452 for (i = 0; i < 9; i++)
4453 if (litter[i] & NEED_UPDATE)
4454 newsym(x + horiz(i), y + vert(i));
4456 if (disposition < 3)
4467 * shk_move: return 1: moved 0: didn't -1: let m_move do it -2: died
4473 xchar gx, gy, omx, omy;
4476 struct eshk *eshkp = ESHK(shkp);
4478 boolean uondoor = FALSE, satdoor, avoid = FALSE, badinv;
4484 remove_damage(shkp, FALSE);
4486 if ((udist = distu(omx, omy)) < 3 && (shkp->data != &mons[PM_GRID_BUG]
4487 || (omx == u.ux || omy == u.uy))) {
4488 if (ANGRY(shkp) || (Conflict && !resist(shkp, RING_CLASS, 0, 0))) {
4491 Your("displaced image doesn't fool %s!", shkname(shkp));
4493 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\8c¶
\89e
\82É
\82¾
\82Ü
\82³
\82ê
\82È
\82©
\82Á
\82½
\81I", shkname(shkp));
4494 (void) mattacku(shkp);
4497 if (eshkp->following) {
4498 if (strncmp(eshkp->customer, plname, PL_NSIZ)) {
4499 if (!Deaf && !muteshk(shkp))
4501 verbalize("%s, %s! I was looking for %s.", Hello(shkp),
4502 plname, eshkp->customer);
4504 verbalize("%s
\81I
\82í
\82½
\82µ
\82Í%s
\82ð
\92T
\82µ
\82Ä
\82¢
\82Ü
\82·
\81D", Hello(shkp),
4507 eshkp->following = 0;
4510 if (moves > followmsg + 4) {
4511 if (!Deaf && !muteshk(shkp))
4513 verbalize("%s, %s! Didn't you forget to pay?",
4514 Hello(shkp), plname);
4516 verbalize("%s
\81I
\8ex
\95¥
\82¢
\82ð
\96Y
\82ê
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\82©
\81H",
4521 pline("%s holds out %s upturned %s.",
4522 Shknam(shkp), noit_mhis(shkp),
4523 mbodypart(shkp, HAND));
4525 pline("%s
\82Í%s
\82ð
\8fã
\82É
\8cü
\82¯
\82Ä
\8d·
\82µ
\8fo
\82µ
\82½
\81D",
4527 mbodypart(shkp, HAND));
4532 pline("%s doesn't like customers who don't pay.",
4535 pline("%s
\82Í
\8bà
\82ð
\95¥
\82í
\82È
\82¢
\8bq
\82ª
\8c\99\82¢
\82Ý
\82½
\82¢
\82¾
\81D",
4549 satdoor = (gx == omx && gy == omy);
4550 if (eshkp->following || ((z = holetime()) >= 0 && z * z <= udist)) {
4551 /* [This distance check used to apply regardless of
4552 whether the shk was following, but that resulted in
4553 m_move() sometimes taking the shk out of the shop if
4554 the player had fenced him in with boulders or traps.
4555 Such voluntary abandonment left unpaid objects in
4556 invent, triggering billing impossibilities on the
4557 next level once the character fell through the hole.] */
4558 if (udist > 4 && eshkp->following && !eshkp->billct)
4559 return -1; /* leave it to m_move */
4562 } else if (ANGRY(shkp)) {
4563 /* Move towards the hero if the shopkeeper can see him. */
4564 if (shkp->mcansee && m_canseeu(shkp)) {
4570 #define GDIST(x, y) (dist2(x, y, gx, gy))
4571 if (Invis || u.usteed) {
4574 uondoor = (u.ux == eshkp->shd.x && u.uy == eshkp->shd.y);
4577 (carrying(PICK_AXE) || carrying(DWARVISH_MATTOCK)
4578 || (Fast && (sobj_at(PICK_AXE, u.ux, u.uy)
4579 || sobj_at(DWARVISH_MATTOCK, u.ux, u.uy))));
4580 if (satdoor && badinv)
4584 avoid = (*u.ushops && distu(gx, gy) > 8);
4588 if (((!eshkp->robbed && !eshkp->billct && !eshkp->debit) || avoid)
4589 && GDIST(omx, omy) < 3) {
4590 if (!badinv && !onlineu(omx, omy))
4598 z = move_special(shkp, inhishop(shkp), appr, uondoor, avoid, omx, omy, gx,
4601 after_shk_move(shkp);
4606 /* called after shopkeeper moves, in case themove causes re-entry into shop */
4608 after_shk_move(shkp)
4611 struct eshk *eshkp = ESHK(shkp);
4613 if (eshkp->bill_p == (struct bill_x *) -1000 && inhishop(shkp)) {
4614 /* reset bill_p, need to re-calc player's occupancy too */
4615 eshkp->bill_p = &eshkp->bill[0];
4616 check_special_room(FALSE);
4620 /* for use in levl_follower (mondata.c) */
4623 register struct monst *mtmp;
4625 return (boolean) (mtmp->isshk && ESHK(mtmp)->following);
4628 /* You are digging in the shop. */
4633 register struct monst *shkp = shop_keeper(*u.ushops);
4636 const char *grabs = "grabs";
4638 const char *grabs = "
\82Â
\82©
\82ñ
\82¾";
4643 /* 0 == can't speak, 1 == makes animal noises, 2 == speaks */
4645 if (shkp->msleeping || !shkp->mcanmove || is_silent(shkp->data))
4646 ; /* lang stays 0 */
4647 else if (shkp->data->msound <= MS_ANIMAL)
4649 else if (shkp->data->msound >= MS_HUMANOID)
4652 if (!inhishop(shkp)) {
4653 if (Role_if(PM_KNIGHT)) {
4655 You_feel("like a common thief.");
4657 You("
\93D
\96_
\93¯
\91R
\82È
\8bC
\82ª
\82µ
\82½
\81D");
4658 adjalign(-sgn(u.ualign.type));
4665 if (!Deaf && !muteshk(shkp)) {
4666 if (u.utraptype == TT_PIT)
4669 "Be careful, %s, or you might fall through the floor.",
4670 flags.female ? "madam" : "sir");
4673 "
\92\8d\88Ó
\82µ
\82Ä
\82
\82¾
\82³
\82¢%s
\81C
\8f°
\82©
\82ç
\97\8e\82¿
\82Ü
\82·
\82æ
\81D",
4674 flags.female ? "
\82¨
\8fì
\82³
\82ñ" : "
\82¨
\8bq
\82³
\82ñ");
4678 verbalize("%s, do not damage the floor here!",
4679 flags.female ? "Madam" : "Sir");
4681 verbalize("%s
\81C
\8f°
\82É
\8f\9d\82ð
\82Â
\82¯
\82È
\82¢
\82Å
\82
\82¾
\82³
\82¢
\81I",
4682 flags.female ? "
\82¨
\8fì
\82³
\82ñ" : "
\82¨
\8bq
\82³
\82ñ");
4686 if (Role_if(PM_KNIGHT)) {
4688 You_feel("like a common thief.");
4690 You("
\93D
\96_
\93¯
\91R
\82È
\8bC
\82ª
\82µ
\82½
\81D");
4691 adjalign(-sgn(u.ualign.type));
4693 } else if (!um_dist(shkp->mx, shkp->my, 5)
4694 && !shkp->msleeping && shkp->mcanmove
4695 && (ESHK(shkp)->billct || ESHK(shkp)->debit)) {
4696 register struct obj *obj, *obj2;
4698 if (nolimbs(shkp->data)) {
4700 grabs = "knocks off";
4702 grabs = "
\92@
\82«
\97\8e\82µ
\82½";
4704 /* This is what should happen, but for balance
4705 * reasons, it isn't currently.
4708 pline("%s curses %s inability to grab your backpack!",
4709 Shknam(shkp), noit_mhim(shkp));
4714 if (distu(shkp->mx, shkp->my) > 2) {
4716 /* for some reason the shopkeeper can't come next to you */
4717 if (distu(shkp->mx, shkp->my) > 2) {
4721 pline("%s curses you in anger and frustration!",
4723 pline("
\93{
\82è
\82Å
\95s
\96\9e\82Ì
\82½
\82Ü
\82Á
\82Ä
\82¢
\82é%s
\82Í
\82 \82È
\82½
\82ð
\8eô
\82Á
\82½
\81I",
4731 pline("%s %s, and %s your backpack!", Shknam(shkp),
4732 makeplural(locomotion(shkp->data, "leap")), grabs);
4734 pline("%s
\82Í
\94ò
\82Ñ
\82Â
\82¢
\82Ä
\81C
\82 \82È
\82½
\82Ì
\94w
\95\89\82¢
\91Ü
\82ð%s
\81I", Shknam(shkp),
4739 pline("%s %s your backpack!", Shknam(shkp), grabs);
4741 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\94w
\95\89\82¢
\91Ü
\82ð%s
\81I", Shknam(shkp), grabs);
4743 for (obj = invent; obj; obj = obj2) {
4745 if ((obj->owornmask & ~(W_SWAPWEP | W_QUIVER)) != 0
4746 || (obj == uswapwep && u.twoweap)
4747 || (obj->otyp == LEASH && obj->leashmon))
4749 if (obj == current_wand)
4753 subfrombill(obj, shkp);
4754 (void) add_to_minv(shkp, obj); /* may free obj */
4763 static const short k_mndx[4] = { PM_KEYSTONE_KOP, PM_KOP_SERGEANT,
4764 PM_KOP_LIEUTENANT, PM_KOP_KAPTAIN };
4765 int k_cnt[4], cnt, mndx, k;
4767 k_cnt[0] = cnt = abs(depth(&u.uz)) + rnd(5);
4768 k_cnt[1] = (cnt / 3) + 1; /* at least one sarge */
4769 k_cnt[2] = (cnt / 6); /* maybe a lieutenant */
4770 k_cnt[3] = (cnt / 9); /* and maybe a kaptain */
4772 for (k = 0; k < 4; k++) {
4773 if ((cnt = k_cnt[k]) == 0)
4776 if (mvitals[mndx].mvflags & G_GONE)
4780 if (enexto(mm, mm->x, mm->y, &mons[mndx]))
4781 (void) makemon(&mons[mndx], mm->x, mm->y, NO_MM_FLAGS);
4786 pay_for_damage(dmgstr, cant_mollify)
4788 boolean cant_mollify;
4790 register struct monst *shkp = (struct monst *) 0;
4791 char shops_affected[5];
4792 boolean uinshp = (*u.ushops != '\0');
4796 boolean dugwall = (!strcmp(dmgstr, "dig into") /* wand */
4797 || !strcmp(dmgstr, "damage")); /* pick-axe */
4799 boolean ni_wo = !strcmp(dmgstr, "
\8c\8a\82ð
\82 \82¯
\82é"); /* wand */
4800 boolean dugwall = (ni_wo || !strcmp(dmgstr, "
\8f\9d\82Â
\82¯
\82é")); /* pick-axe */
4802 boolean animal, pursue;
4803 struct damage *tmp_dam, *appear_here = 0;
4804 long cost_of_damage = 0L;
4805 unsigned int nearest_shk = (ROWNO * ROWNO) + (COLNO * COLNO),
4806 nearest_damage = nearest_shk;
4809 for (tmp_dam = level.damagelist; tmp_dam; tmp_dam = tmp_dam->next) {
4812 if (tmp_dam->when != monstermoves || !tmp_dam->cost)
4814 cost_of_damage += tmp_dam->cost;
4815 Strcpy(shops_affected,
4816 in_rooms(tmp_dam->place.x, tmp_dam->place.y, SHOPBASE));
4817 for (shp = shops_affected; *shp; shp++) {
4818 struct monst *tmp_shk;
4819 unsigned int shk_distance;
4821 if (!(tmp_shk = shop_keeper(*shp)))
4823 if (tmp_shk == shkp) {
4824 unsigned int damage_distance =
4825 distu(tmp_dam->place.x, tmp_dam->place.y);
4827 if (damage_distance < nearest_damage) {
4828 nearest_damage = damage_distance;
4829 appear_here = tmp_dam;
4833 if (!inhishop(tmp_shk))
4835 shk_distance = distu(tmp_shk->mx, tmp_shk->my);
4836 if (shk_distance > nearest_shk)
4838 if ((shk_distance == nearest_shk) && picks) {
4844 nearest_shk = shk_distance;
4845 appear_here = tmp_dam;
4846 nearest_damage = distu(tmp_dam->place.x, tmp_dam->place.y);
4850 if (!cost_of_damage || !shkp)
4853 animal = (shkp->data->msound <= MS_ANIMAL);
4855 x = appear_here->place.x;
4856 y = appear_here->place.y;
4858 /* not the best introduction to the shk... */
4859 (void) strncpy(ESHK(shkp)->customer, plname, PL_NSIZ);
4861 /* if the shk is already on the war path, be sure it's all out */
4862 if (ANGRY(shkp) || ESHK(shkp)->following) {
4867 /* if the shk is not in their shop.. */
4868 if (!*in_rooms(shkp->mx, shkp->my, SHOPBASE)) {
4869 if (!cansee(shkp->mx, shkp->my))
4876 if (um_dist(shkp->mx, shkp->my, 1)
4877 && !um_dist(shkp->mx, shkp->my, 3)) {
4879 pline("%s leaps towards you!", Shknam(shkp));
4881 pline("%s
\82Í
\82 \82È
\82½
\82É
\94ò
\82Ñ
\82©
\82©
\82Á
\82½
\81I", Shknam(shkp));
4884 pursue = um_dist(shkp->mx, shkp->my, 1);
4889 * Make shkp show up at the door. Effect: If there is a monster
4890 * in the doorway, have the hero hear the shopkeeper yell a bit,
4891 * pause, then have the shopkeeper appear at the door, having
4892 * yanked the hapless critter out of the way.
4896 if (!Deaf && !muteshk(shkp)) {
4898 You_hear("an angry voice:");
4900 You("
\93{
\82è
\82Ì
\90º
\82ð
\95·
\82¢
\82½
\81F");
4902 verbalize("Out of my way, scum!");
4904 verbalize("
\82Ç
\82¯
\81I
\83N
\83\
\82Á
\82½
\82ê
\81I");
4907 #if defined(UNIX) || defined(VMS)
4908 #if defined(SYSV) || defined(ULTRIX) || defined(VMS)
4917 (void) mnearto(shkp, x, y, TRUE);
4920 if ((um_dist(x, y, 1) && !uinshp) || cant_mollify
4921 || (money_cnt(invent) + ESHK(shkp)->credit) < cost_of_damage
4924 if (muteshk(shkp)) {
4925 if (animal && shkp->mcanmove && !shkp->msleeping)
4927 } else if (pursue || uinshp || !um_dist(x, y, 1)) {
4930 verbalize("How dare you %s my %s?", dmgstr,
4931 dugwall ? "shop" : "door");
4933 verbalize("
\82Ç
\82¤
\82µ
\82Ä%s%s%s
\82è
\82µ
\82½
\82ñ
\82¾
\81H",
4934 dugwall ? "
\93X" : "
\94à",
4935 ni_wo ? "
\82É" : "
\82ð",
4940 pline("%s is %s that you decided to %s %s %s!",
4941 Shknam(shkp), angrytexts[rn2(SIZE(angrytexts))],
4942 dmgstr, noit_mhis(shkp), dugwall ? "shop" : "door");
4944 pline("%s
\82Í
\82 \82È
\82½
\82ª%s
\82ð%s
\82±
\82Æ
\82É
\91Î
\82µ
\82Ä%s
\81I",
4946 dugwall ? "
\93X" : "
\94à", dmgstr,
4947 angrytexts[rn2(SIZE(angrytexts))]);
4952 pline("%s shouts:", Shknam(shkp));
4954 pline("%s
\82Í
\82³
\82¯
\82ñ
\82¾
\81F", Shknam(shkp));
4956 verbalize("Who dared %s my %s?", dmgstr,
4957 dugwall ? "shop" : "door");
4959 verbalize("
\92N
\82ª%s%s%s
\82è
\82µ
\82½
\82ñ
\82¾
\82ë
\82¤
\81H",
4960 dugwall ? "
\93X" : "
\94à",
4961 ni_wo ? "
\82É" : "
\82ð",
4966 pline("%s is %s that someone decided to %s %s %s!",
4967 Shknam(shkp), angrytexts[rn2(SIZE(angrytexts))],
4968 dmgstr, noit_mhis(shkp), dugwall ? "shop" : "door");
4970 pline("%s
\82Í
\92N
\82©
\82ª%s
\82ð%s
\82±
\82Æ
\82É
\91Î
\82µ
\82Ä%s
\81I",
4972 dugwall ? "
\93X" : "
\94à", dmgstr,
4973 angrytexts[rn2(SIZE(angrytexts))]);
4983 Your("invisibility does not fool %s!", shkname(shkp));
4985 pline("%s
\82Í
\93§
\96¾
\82È
\82 \82È
\82½
\82É
\82¾
\82Ü
\82³
\82ê
\82È
\82©
\82Á
\82½
\81I", shkname(shkp));
4987 Sprintf(qbuf, "%sYou did %ld %s worth of damage!%s Pay?",
4988 !animal ? cad(TRUE) : "", cost_of_damage,
4989 currency(cost_of_damage), !animal ? "\"" : "");
4991 Sprintf(qbuf,"
\81u
\82¨
\82¢
\81I%ld%s
\82Ì
\91¹
\8aQ
\82¾
\81I
\81v
\95¥
\82¢
\82Ü
\82·
\82©
\81H",
4992 cost_of_damage, currency(cost_of_damage));
4994 if (yn(qbuf) != 'n') {
4995 cost_of_damage = check_credit(cost_of_damage, shkp);
4996 if (cost_of_damage > 0L) {
4997 money2mon(shkp, cost_of_damage);
5001 pline("Mollified, %s accepts your restitution.", shkname(shkp));
5003 pline("%s
\82Í
\81C
\8a´
\8fî
\82ð
\82â
\82í
\82ç
\82°
\94\85\8f\9e\8bà
\82ð
\8eó
\82¯
\82Æ
\82Á
\82½
\81D", shkname(shkp));
5004 /* move shk back to his home loc */
5005 home_shk(shkp, FALSE);
5009 if (!Deaf && !muteshk(shkp))
5011 verbalize("Oh, yes! You'll pay!");
5013 verbalize("
\82³
\82 \81C
\95¥
\82¤
\82ñ
\82¾
\81I");
5016 pline("%s lunges %s %s toward your %s!",
5017 Shknam(shkp), noit_mhis(shkp),
5018 mbodypart(shkp, HAND), body_part(NECK));
5020 pline("%s
\82Í%s
\82ð
\82 \82È
\82½
\82Ì%s
\82É
\93Ë
\82«
\8fo
\82µ
\82½
\81I",
5022 mbodypart(shkp, HAND),
5028 adjalign(-sgn(u.ualign.type));
5032 /* called in dokick.c when we kick an object that might be in a store */
5035 register xchar x, y;
5040 if (!level.flags.has_shop)
5042 shkp = shop_keeper(*in_rooms(x, y, SHOPBASE));
5043 if (!shkp || !inhishop(shkp))
5046 return (boolean) (inside_shop(x, y)
5047 && !(x == eshkp->shk.x && y == eshkp->shk.y));
5050 /* called by dotalk(sounds.c) when #chatting; returns obj if location
5051 contains shop goods and shopkeeper is willing & able to speak */
5054 register xchar x, y;
5056 register struct obj *otmp;
5057 register struct monst *shkp;
5059 if (!(shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) || !inhishop(shkp))
5060 return (struct obj *) 0;
5062 for (otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere)
5063 if (otmp->oclass != COIN_CLASS)
5065 /* note: otmp might have ->no_charge set, but that's ok */
5066 return (otmp && costly_spot(x, y)
5067 && NOTANGRY(shkp) && shkp->mcanmove && !shkp->msleeping)
5072 /* give price quotes for all objects linked to this one (ie, on this spot) */
5074 price_quote(first_obj)
5075 register struct obj *first_obj;
5077 register struct obj *otmp;
5078 char buf[BUFSZ], price[40];
5081 boolean contentsonly = FALSE;
5083 struct monst *shkp = shop_keeper(inside_shop(u.ux, u.uy));
5085 tmpwin = create_nhwindow(NHW_MENU);
5087 putstr(tmpwin, 0, "Fine goods for sale:");
5089 putstr(tmpwin, 0, "
\94\84\82è
\82É
\82Å
\82Ä
\82¢
\82é
\82·
\82Î
\82ç
\82µ
\82¢
\8f¤
\95i
\81F");
5090 putstr(tmpwin, 0, "");
5091 for (otmp = first_obj; otmp; otmp = otmp->nexthere) {
5092 if (otmp->oclass == COIN_CLASS)
5094 cost = (otmp->no_charge || otmp == uball || otmp == uchain) ? 0L
5095 : get_cost(otmp, shkp);
5096 contentsonly = !cost;
5097 if (Has_contents(otmp))
5098 cost += contained_cost(otmp, shkp, 0L, FALSE, FALSE);
5101 Strcpy(price, "no charge");
5103 Strcpy(price, "
\96³
\97¿");
5104 contentsonly = FALSE;
5107 Sprintf(price, "%ld %s%s", cost, currency(cost),
5108 (otmp->quan) > 1L ? " each" : "");
5110 Sprintf(price, "%s%ld%s",
5111 otmp->quan > 1L ? "
\82»
\82ê
\82¼
\82ê" : "", cost, currency(cost));
5115 Sprintf(buf, "%s%s, %s", contentsonly ? the_contents_of : "",
5116 doname(otmp), price);
5118 Sprintf(buf, "%s%s
\81C%s", doname(otmp),
5119 contentsonly ? "
\82Ì
\92\86\90g" : "", price);
5121 putstr(tmpwin, 0, buf), cnt++;
5124 display_nhwindow(tmpwin, TRUE);
5125 } else if (cnt == 1) {
5127 /* "<doname(obj)>, no charge" */
5129 pline("%s!", upstart(buf)); /* buf still contains the string */
5131 pline("%s
\81I", buf); /* buf still contains the string */
5134 /* print cost in slightly different format, so can't reuse buf;
5135 cost and contentsonly are already set up */
5137 Sprintf(buf, "%s%s", contentsonly ? the_contents_of : "",
5140 Sprintf(buf, "%s%s", doname(first_obj),
5141 contentsonly ? "
\82Ì
\92\86\90g" : "");
5144 pline("%s, price %ld %s%s%s", upstart(buf), cost, currency(cost),
5145 (first_obj->quan > 1L) ? " each" : "",
5146 contentsonly ? "." : shk_embellish(first_obj, cost));
5148 pline("%s%s
\82Í%s%ld%s
\82¾
\81D",
5149 shk_embellish(first_obj, cost), buf,
5150 first_obj->quan > 1L ? "
\82»
\82ê
\82¼
\82ê" : "",
5151 cost, currency(cost));
5155 destroy_nhwindow(tmpwin);
5159 \93X
\8eå
\82Ì
\94\84\82è
\95¶
\8bå
\81B
\89p
\8cê
\82Å
\82Í
\96\96\94ö
\82É
\95t
\82
\82ª
\93ú
\96{
\8cê
\82Å
\82Í
\90æ
\93ª
\82É
\95t
\82
\81B
5160 \92¼
\8cã
\82É
\83A
\83C
\83e
\83\80\96¼
\82ª
\97\88\82é
\82Ì
\82Å
\81A
\83A
\83C
\83e
\83\80\82É
\91Î
\82·
\82é
\8c`
\97e
\82Å
\82à
\93Æ
\97§
\82µ
\82½
\95¶
\82Å
\82à
\97Ç
\82¢
\81B
5162 STATIC_OVL const char *
5163 shk_embellish(itm, cost)
5164 register struct obj *itm;
5168 register int o, choice = rn2(5);
5171 choice = (cost < 100L ? 1 : cost < 500L ? 2 : 3);
5178 if (o == FOOD_CLASS)
5180 return ", gourmets' delight!";
5182 return "
\83O
\83\8b\83\81\82ª
\8b\83\82¢
\82Ä
\8aì
\82Ô";
5183 if (objects[itm->otyp].oc_name_known
5184 ? objects[itm->otyp].oc_magic
5185 : (o == AMULET_CLASS || o == RING_CLASS || o == WAND_CLASS
5186 || o == POTION_CLASS || o == SCROLL_CLASS
5187 || o == SPBOOK_CLASS))
5189 return ", painstakingly developed!";
5191 return "
\88ê
\8b\89\82Ì
\96\82\97Í
\82ð
\94é
\82ß
\82½";
5193 return ", superb craftsmanship!";
5195 return "
\88ê
\97¬
\90E
\90l
\82Ì
\8dì
\82Á
\82½";
5198 return ", finest quality.";
5200 return "
\8dÅ
\8d\82\82Ì
\95i
\8e¿
\82ð
\8cÖ
\82é";
5203 return ", an excellent choice.";
5205 return "
\82³
\82·
\82ª
\82¨
\8bq
\82³
\82ñ
\96Ú
\82ª
\8d\82\82¢
\81I";
5208 return ", a real bargain.";
5210 return "
\96{
\93ú
\82Ì
\96Ú
\8bÊ
\8f¤
\95i
\81I";
5214 } else if (itm->oartifact) {
5216 return ", one of a kind!";
5218 return "
\82±
\82ê
\82Í
\90¢
\8aE
\82É
\82Ü
\82½
\82Æ
\82È
\82¢
\81I";
5226 /* First 4 supplied by Ronen and Tamar, remainder by development team */
5227 const char *Izchak_speaks[] = {
5229 "%s says: 'These shopping malls give me a headache.'",
5231 "%s
\9eH
\82
\81w
\82±
\82ê
\82ç
\83V
\83\87\83b
\83s
\83\93\83O
\8aX
\82Í
\93ª
\92É
\82Ì
\83^
\83l
\82¾
\81D
\81x",
5233 "%s says: 'Slow down. Think clearly.'",
5235 "%s
\9eH
\82
\81w
\97\8e\82¿
\92\85\82¢
\82Ä
\81C
\96¾
\9dð
\82É
\8dl
\82¦
\82æ
\81D
\81x",
5237 "%s says: 'You need to take things one at a time.'",
5239 "%s
\9eH
\82
\81w
\88ê
\93x
\82É
\88ê
\8cÂ
\82¸
\82Â
\8eæ
\82é
\95K
\97v
\82ª
\82 \82é
\81D
\81x",
5241 "%s says: 'I don't like poofy coffee... give me Columbian Supremo.'",
5243 "%s
\9eH
\82
\81w
\83z
\83\82\82Á
\82Û
\82¢
\83R
\81[
\83q
\82Í
\8dD
\82«
\82¶
\82á
\82È
\82¢
\81D
\81D
\81D
\83R
\83\8d\83\93\83r
\83A
\83\93\81E
\83X
\83v
\83\8c\83\82\82ð
\82½
\82Ì
\82Þ
\81D
\81x",
5245 "%s says that getting the devteam's agreement on anything is difficult.",
5247 "
\8aJ
\94
\83`
\81[
\83\80\82É
\89½
\82ç
\82©
\82Ì
\8b¦
\92è
\82ð
\8b\81\82ß
\82é
\82±
\82Æ
\82Í
\8d¢
\93ï
\82¾
\82Æ%s
\82Í
\8fq
\82×
\82½
\81D",
5249 "%s says that he has noticed those who serve their deity will prosper.",
5251 "%s
\82Í
\90_
\82É
\8ed
\82¦
\82Ä
\82¢
\82é
\82â
\82Â
\82Í
\90¬
\8c÷
\82µ
\82Ä
\82¢
\82é
\82Æ
\8fq
\82×
\82½
\81D",
5253 "%s says: 'Don't try to steal from me - I have friends in high places!'",
5255 "%s
\9eH
\82
\81w
\8e\84\82©
\82ç
\93\90\82à
\82¤
\82È
\82ñ
\82Ä
\8ev
\82í
\82È
\82¢
\82±
\82Æ
\82¾
\81D
\8fã
\82Ì
\95û
\82É
\92m
\82è
\8d\87\82¢
\82ª
\82¢
\82é
\82ñ
\82¾
\82©
\82ç
\81D
\81x",
5257 "%s says: 'You may well need something from this shop in the future.'",
5259 "%s
\9eH
\82
\81w
\8f«
\97\88\82±
\82Ì
\93X
\82Ì
\89½
\82©
\82ª
\95K
\97v
\82Æ
\82È
\82é
\82¾
\82ë
\82¤
\81x",
5261 "%s comments about the Valley of the Dead as being a gateway."
5263 "%s
\82Í
\8e\80\82Ì
\92J
\82Í
\83Q
\81[
\83g
\83E
\83F
\83C
\82¾
\82ë
\82¤
\82Æ
\83R
\83\81\83\93\83g
\82ð
\8fq
\82×
\82½
\81D"
5274 /* The monster type is shopkeeper, but this monster is
5275 not actually a shk, which could happen if someone
5276 wishes for a shopkeeper statue and then animates it.
5277 (Note: shkname() would be "" in a case like this.) */
5279 pline("%s asks whether you've seen any untended shops recently.",
5281 pline("%s
\82Í
\8dÅ
\8bß
\82Ç
\82±
\82©
\82É
\93X
\88õ
\82Ì
\82¢
\82È
\82¢
\93X
\82Í
\82È
\82¢
\82©
\82Æ
\82½
\82¸
\82Ë
\82½
\81D",
5284 /* [Perhaps we ought to check whether this conversation
5285 is taking place inside an untended shop, but a shopless
5286 shk can probably be expected to be rather disoriented.] */
5293 pline("%s %s how much %s dislikes %s customers.",
5295 (!Deaf && !muteshk(shkp)) ? "mentions" : "indicates",
5296 noit_mhe(shkp), eshk->robbed ? "non-paying" : "rude");
5298 pline("%s
\82Í%s
\8bq
\82Í
\91å
\8c\99\82¢
\82¾
\82Æ%s
\81D",
5300 eshk->robbed ? "
\8bà
\82ð
\8ex
\95¥
\82í
\82È
\82¢" : "
\96³
\97ç
\82È",
5301 (!Deaf && !muteshk(shkp)) ? "
\8c¾
\82Á
\82½" : "
\8e¦
\82µ
\82½");
5303 } else if (eshk->following) {
5304 if (strncmp(eshk->customer, plname, PL_NSIZ)) {
5305 if (!Deaf && !muteshk(shkp))
5307 verbalize("%s %s! I was looking for %s.",
5308 Hello(shkp), plname, eshk->customer);
5310 verbalize("%s
\81I
\8e\84\82Í%s
\82ð
\92T
\82µ
\82Ä
\82¢
\82Ü
\82·
\81D",
5311 Hello(shkp), eshk->customer);
5313 eshk->following = 0;
5315 if (!Deaf && !muteshk(shkp))
5317 verbalize("%s %s! Didn't you forget to pay?",
5318 Hello(shkp), plname);
5320 verbalize("%s
\81I
\8ex
\95¥
\82¢
\82ð
\96Y
\82ê
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\82©
\81H",
5325 pline("%s taps you on the %s.",
5326 Shknam(shkp), body_part(ARM));
5328 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82ð
\8cy
\82
\82½
\82½
\82¢
\82½
\81D",
5329 Shknam(shkp), body_part(ARM));
5332 } else if (eshk->billct) {
5333 register long total = addupbill(shkp) + eshk->debit;
5336 pline("%s %s that your bill comes to %ld %s.",
5338 (!Deaf && !muteshk(shkp)) ? "says" : "indicates",
5339 total, currency(total));
5341 pline("%s
\82Í
\8a¨
\92è
\82ª%ld%s
\82É
\82È
\82é
\82Æ%s
\81D",
5343 total, currency(total),
5344 (!Deaf && !muteshk(shkp)) ? "
\8c¾
\82Á
\82½" : "
\8e¦
\82µ
\82½");
5346 } else if (eshk->debit) {
5348 pline("%s %s that you owe %s %ld %s.",
5350 (!Deaf && !muteshk(shkp)) ? "reminds you" : "indicates",
5351 noit_mhim(shkp), eshk->debit, currency(eshk->debit));
5353 pline("
\82 \82È
\82½
\82Í%s
\82É%ld%s
\82Ì
\8eØ
\82è
\82ª
\82 \82é
\82±
\82Æ
\82ð
\8ev
\82¢
\82¾
\82µ
\82½
\81D",
5354 Shknam(shkp), eshk->debit, currency(eshk->debit));
5356 } else if (eshk->credit) {
5358 pline("%s encourages you to use your %ld %s of credit.",
5359 Shknam(shkp), eshk->credit, currency(eshk->credit));
5361 pline("%s
\82Í%ld%s
\82Ì
\97a
\82¯
\8bà
\82ð
\8eg
\82¤
\82æ
\82¤
\8a©
\82ß
\82½
\81D",
5362 Shknam(shkp), eshk->credit, currency(eshk->credit));
5364 } else if (eshk->robbed) {
5366 pline("%s %s about a recent robbery.",
5368 (!Deaf && !muteshk(shkp)) ? "complains" : "indicates concern");
5370 pline("%s
\82Í
\8dÅ
\8bß
\82Ì
\8b
\93\90\82É
\82Â
\82¢
\82Ä%s
\81D",
5372 (!Deaf && !muteshk(shkp)) ? "
\8bð
\92s
\82ð
\82±
\82Ú
\82µ
\82½" : "
\8c\9c\94O
\82ð
\8e¦
\82µ
\82½");
5374 } else if ((shkmoney = money_cnt(shkp->minvent)) < 50L) {
5376 pline("%s %s that business is bad.",
5378 (!Deaf && !muteshk(shkp)) ? "complains" : "indicates");
5380 pline("%s
\82Í
\8f¤
\94\84\82ª
\8e|
\82
\82¢
\82Á
\82Ä
\82È
\82¢
\82Æ%s
\81D",
5382 (!Deaf && !muteshk(shkp)) ? "
\8bð
\92s
\82ð
\82±
\82Ú
\82µ
\82½" : "
\8e¦
\82µ
\82½");
5384 } else if (shkmoney > 4000) {
5386 pline("%s %s that business is good.",
5388 (!Deaf && !muteshk(shkp)) ? "says" : "indicates");
5390 pline("%s
\82Í
\8f¤
\94\84\82ª
\8e|
\82
\82¢
\82Á
\82Ä
\82¢
\82é
\82Æ%s
\81D",
5392 (!Deaf && !muteshk(shkp)) ? "
\8c¾
\82Á
\82½" : "
\8e¦
\82µ
\82½");
5394 } else if (is_izchak(shkp, FALSE)) {
5395 if (!Deaf && !muteshk(shkp))
5396 pline(Izchak_speaks[rn2(SIZE(Izchak_speaks))], shkname(shkp));
5398 if (!Deaf && !muteshk(shkp))
5400 pline("%s talks about the problem of shoplifters.", Shknam(shkp));
5402 pline("%s
\82Í
\96\9c\88ø
\82Ì
\96â
\91è
\82É
\82Â
\82¢
\82Ä
\98b
\82µ
\82½
\81D", Shknam(shkp));
5410 register int cnt = 0;
5411 register struct monst *mtmp, *mtmp2;
5413 for (mtmp = fmon; mtmp; mtmp = mtmp2) {
5415 if (mtmp->data->mlet == S_KOP) {
5416 if (canspotmon(mtmp))
5423 pline_The("Kop%s (disappointed) vanish%s into thin air.",
5424 plur(cnt), (cnt == 1) ? "es" : "");
5426 pline("
\8cx
\8a¯
\82Í(
\82ª
\82Á
\82©
\82è
\82µ
\82Ä)
\8ep
\82ð
\8fÁ
\82µ
\82½
\81D");
5431 cost_per_charge(shkp, otmp, altusage)
5434 boolean altusage; /* some items have an "alternate" use with different cost */
5438 if (!shkp || !inhishop(shkp))
5439 return 0L; /* insurance */
5440 tmp = get_cost(otmp, shkp);
5442 /* The idea is to make the exhaustive use of an unpaid item
5443 * more expensive than buying it outright.
5445 if (otmp->otyp == MAGIC_LAMP) { /* 1 */
5446 /* normal use (ie, as light source) of a magic lamp never
5447 degrades its value, but not charging anything would make
5448 identification too easy; charge an amount comparable to
5449 what is charged for an ordinary lamp (don't bother with
5450 angry shk surcharge) */
5452 tmp = (long) objects[OIL_LAMP].oc_cost;
5454 tmp += tmp / 3L; /* djinni is being released */
5455 } else if (otmp->otyp == MAGIC_MARKER) { /* 70 - 100 */
5456 /* No way to determine in advance how many charges will be
5457 * wasted. So, arbitrarily, one half of the price per use.
5460 } else if (otmp->otyp == BAG_OF_TRICKS /* 1 - 20 */
5461 || otmp->otyp == HORN_OF_PLENTY) {
5462 /* altusage: emptying of all the contents at once */
5465 } else if (otmp->otyp == CRYSTAL_BALL /* 1 - 5 */
5466 || otmp->otyp == OIL_LAMP /* 1 - 10 */
5467 || otmp->otyp == BRASS_LANTERN
5468 || (otmp->otyp >= MAGIC_FLUTE
5469 && otmp->otyp <= DRUM_OF_EARTHQUAKE) /* 5 - 9 */
5470 || otmp->oclass == WAND_CLASS) { /* 3 - 11 */
5473 } else if (otmp->oclass == SPBOOK_CLASS) {
5475 } else if (otmp->otyp == CAN_OF_GREASE || otmp->otyp == TINNING_KIT
5476 || otmp->otyp == EXPENSIVE_CAMERA) {
5478 } else if (otmp->otyp == POT_OIL) {
5484 /* Charge the player for partial use of an unpaid object.
5486 * Note that bill_dummy_object() should be used instead
5487 * when an object is completely used.
5490 check_unpaid_usage(otmp, altusage)
5495 const char *fmt, *arg1, *arg2;
5499 if (!otmp->unpaid || !*u.ushops
5500 || (otmp->spe <= 0 && objects[otmp->otyp].oc_charged))
5502 if (!(shkp = shop_keeper(*u.ushops)) || !inhishop(shkp))
5504 if ((tmp = cost_per_charge(shkp, otmp, altusage)) == 0L)
5508 if (otmp->oclass == SPBOOK_CLASS) {
5510 fmt = "%sYou owe%s %ld %s.";
5512 fmt = "%s%s%ld%s
\82Ì
\8eØ
\82è
\82¾
\81D";
5514 Sprintf(buf, "This is no free library, %s! ", cad(FALSE));
5516 Strcpy(buf, "
\82¨
\82¢
\81I
\82±
\82±
\82Í
\90}
\8f\91\8aÙ
\82¶
\82á
\82È
\82¢
\81I");
5517 arg1 = rn2(2) ? buf : "";
5519 arg2 = ESHK(shkp)->debit > 0L ? " an additional" : "";
5521 arg2 = ESHK(shkp)->debit > 0L ? "
\82³
\82ç
\82É
\8c¾
\82¦
\82Î" : "";
5522 } else if (otmp->otyp == POT_OIL) {
5524 fmt = "%s%sThat will cost you %ld %s (Yendorian Fuel Tax).";
5526 fmt = "%s%s
\92l
\92i
\82Í%ld%s(
\83C
\83F
\83\93\83_
\81[
\94R
\97¿
\90Å)
\82¾
\81D";
5527 } else if (altusage && (otmp->otyp == BAG_OF_TRICKS
5528 || otmp->otyp == HORN_OF_PLENTY)) {
5530 fmt = "%s%sEmptying that will cost you %ld %s.";
5532 fmt = "%s%s
\82»
\82ê
\82Ì
\8eg
\97p
\97¿
\82Í%ld%s
\82¾
\81D";
5537 arg1 = "
\82¤
\82í
\81I";
5540 arg1 = "Watch it! ";
5542 arg1 = "
\8bC
\82ð
\82Â
\82¯
\82ë
\81I";
5545 fmt = "%s%sUsage fee, %ld %s.";
5547 fmt = "%s%s
\8eg
\97p
\97¿
\82Í
\81C%ld%s
\82¾
\81D";
5552 arg1 = "
\82¨
\82¢
\81I";
5557 arg2 = "
\83S
\83z
\83\93\81D";
5560 if (!Deaf && !muteshk(shkp)) {
5561 verbalize(fmt, arg1, arg2, tmp, currency(tmp));
5562 exercise(A_WIS, TRUE); /* you just got info */
5564 ESHK(shkp)->debit += tmp;
5567 /* for using charges of unpaid objects "used in the normal manner" */
5572 check_unpaid_usage(otmp, FALSE); /* normal item use */
5576 costly_gold(x, y, amount)
5577 register xchar x, y;
5578 register long amount;
5580 register long delta;
5581 register struct monst *shkp;
5582 register struct eshk *eshkp;
5584 if (!costly_spot(x, y))
5586 /* shkp now guaranteed to exist by costly_spot() */
5587 shkp = shop_keeper(*in_rooms(x, y, SHOPBASE));
5590 if (eshkp->credit >= amount) {
5591 if (eshkp->credit > amount)
5593 Your("credit is reduced by %ld %s.", amount, currency(amount));
5595 Your("
\97a
\82¯
\8bà
\82Í%ld%s
\8c¸
\82Á
\82½
\81D", amount, currency(amount));
5598 Your("credit is erased.");
5600 Your("
\97a
\82¯
\8bà
\82Í
\92 \8fÁ
\82µ
\82É
\82È
\82Á
\82½
\81D");
5601 eshkp->credit -= amount;
5603 delta = amount - eshkp->credit;
5606 Your("credit is erased.");
5608 Your("
\97a
\82¯
\8bà
\82Í
\92 \8fÁ
\82µ
\82É
\82È
\82Á
\82½
\81D");
5611 Your("debt increases by %ld %s.", delta, currency(delta));
5613 Your("
\8eØ
\8bà
\82Í%ld%s
\91\9d\82¦
\82½
\81D", delta, currency(delta));
5616 You("owe %s %ld %s.", shkname(shkp), delta, currency(delta));
5618 You("%s
\82É%ld%s
\82Ì
\8eØ
\82è
\82ð
\82Â
\82
\82Á
\82½
\81D", shkname(shkp), delta, currency(delta));
5619 eshkp->debit += delta;
5620 eshkp->loan += delta;
5625 /* used in domove to block diagonal shop-exit */
5626 /* x,y should always be a door */
5629 register xchar x, y;
5631 register int roomno = *in_rooms(x, y, SHOPBASE);
5632 register struct monst *shkp;
5634 if (roomno < 0 || !IS_SHOP(roomno))
5636 if (!IS_DOOR(levl[x][y].typ))
5638 if (roomno != *u.ushops)
5641 if (!(shkp = shop_keeper((char) roomno)) || !inhishop(shkp))
5644 if (shkp->mx == ESHK(shkp)->shk.x && shkp->my == ESHK(shkp)->shk.y
5645 /* Actually, the shk should be made to block _any_
5646 * door, including a door the player digs, if the
5647 * shk is within a 'jumping' distance.
5649 && ESHK(shkp)->shd.x == x
5650 && ESHK(shkp)->shd.y == y
5651 && shkp->mcanmove && !shkp->msleeping
5652 && (ESHK(shkp)->debit || ESHK(shkp)->billct || ESHK(shkp)->robbed)) {
5654 pline("%s%s blocks your way!", Shknam(shkp),
5655 Invis ? " senses your motion and" : "");
5657 pline("%s
\82Í%s
\82 \82È
\82½
\82Ì
\91O
\82É
\97§
\82¿
\82Ó
\82³
\82ª
\82Á
\82½
\81I", Shknam(shkp),
5658 Invis ? "
\93®
\82«
\82ð
\8a´
\82¶
\82Æ
\82è
\81C" : "");
5665 /* used in domove to block diagonal shop-entry;
5666 u.ux, u.uy should always be a door */
5669 register xchar x, y;
5671 register xchar sx, sy;
5672 register int roomno;
5673 register struct monst *shkp;
5675 if (!(IS_DOOR(levl[u.ux][u.uy].typ)
5676 && levl[u.ux][u.uy].doormask == D_BROKEN))
5679 roomno = *in_rooms(x, y, SHOPBASE);
5680 if (roomno < 0 || !IS_SHOP(roomno))
5682 if (!(shkp = shop_keeper((char) roomno)) || !inhishop(shkp))
5685 if (ESHK(shkp)->shd.x != u.ux || ESHK(shkp)->shd.y != u.uy)
5688 sx = ESHK(shkp)->shk.x;
5689 sy = ESHK(shkp)->shk.y;
5691 if (shkp->mx == sx && shkp->my == sy && shkp->mcanmove && !shkp->msleeping
5692 && (x == sx - 1 || x == sx + 1 || y == sy - 1 || y == sy + 1)
5693 && (Invis || carrying(PICK_AXE) || carrying(DWARVISH_MATTOCK)
5696 pline("%s%s blocks your way!", Shknam(shkp),
5697 Invis ? " senses your motion and" : "");
5699 pline("%s%s
\82 \82È
\82½
\82Ì
\91O
\82É
\97§
\82¿
\82Ó
\82³
\82ª
\82Á
\82½
\81I", Shknam(shkp),
5700 Invis ? "
\93®
\82«
\82ð
\8a´
\82¶
\82Æ
\82è
\81C" : "");
5707 /* "your " or "Foobar's " (note the trailing space) */
5708 /*
\81u
\82 \82È
\82½
\82Ì
\81v
\82©
\81uFoobar
\82Ì
\81v(
\96\96\94ö
\82É
\8bó
\94\92\82Í
\95s
\97v) */
5714 if (!shk_owns(buf, obj) && !mon_owns(buf, obj))
5715 Strcpy(buf, the_your[carried(obj) ? 1 : 0]);
5717 return strcat(buf, " ");
5727 (void) shk_your(buf, obj);
5742 if (get_obj_location(obj, &x, &y, 0)
5743 && (obj->unpaid || (obj->where == OBJ_FLOOR && !obj->no_charge
5744 && costly_spot(x, y)))) {
5745 shkp = shop_keeper(inside_shop(x, y));
5747 return strcpy(buf, shkp ? s_suffix(shkname(shkp)) : the_your[0]);
5750 strcpy(buf, shkname(shkp));
5751 strcat(buf, "
\82Ì");
5766 if (obj->where == OBJ_MINVENT)
5768 return strcpy(buf, s_suffix(y_monnam(obj->ocarry)));
5771 strcpy(buf, mon_nam(obj->ocarry));
5772 strcat(buf, "
\82Ì");
5779 #if 0 /*JP*//*
\97\90\96\
\82É
\8cÄ
\82Ñ
\82©
\82¯
\82é
\82Æ
\82«
\82Ì
\93ñ
\90l
\8fÌ
\81B
\93ú
\96{
\8cê
\82Å
\82Í
\81u
\82¨
\82¢
\81v
\82Å
\8dÏ
\82Þ
\82Ì
\82Å
\8eg
\82í
\82È
\82¢*/
5780 STATIC_OVL const char *
5782 boolean altusage; /* used as a verbalized exclamation: \"Cad! ...\" */
5784 const char *res = 0;
5786 switch (is_demon(youmonst.data) ? 3 : poly_gender()) {
5800 impossible("cad: unknown gender");
5805 char *cadbuf = mon_nam(&youmonst); /* snag an output buffer */
5807 /* alternate usage adds a leading double quote and trailing
5808 exclamation point plus sentence separating spaces */
5809 Sprintf(cadbuf, "\"%s! ", res);
5810 cadbuf[1] = highc(cadbuf[1]);
5819 sasc_bug(struct obj *op, unsigned x)