1 /* NetHack 3.6 shk.c $NHDT-Date: 1515144230 2018/01/05 09:23:50 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.136 $ */
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));
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) || ((mtmp->m_ap_type == M_AP_NOTHING
573 || mtmp->m_ap_type == 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.", shkname(shkp));
644 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\91¶
\8dÝ
\82É
\8bC
\82ª
\82Â
\82¢
\82½
\81D", shkname(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), 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!",
676 angrytexts[rn2(SIZE(angrytexts))],
678 shtypes[rt - SHOPBASE].name);
680 pline("
\82 \82È
\82½
\82ª%s
\82É
\96ß
\82Á
\82Ä
\82«
\82½
\82Ì
\82Å%s
\82Í%s
\82æ
\82¤
\82¾
\81I",
681 shtypes[rt - SHOPBASE].name,
683 angrytexts[rn2(SIZE(angrytexts))]);
685 } else if (eshkp->robbed) {
688 pline("%s mutters imprecations against shoplifters.",
691 pline("%s
\82Í
\93D
\96_
\82ð
\82Ì
\82Ì
\82µ
\82Á
\82½
\81D",
696 pline("%s is combing through %s inventory list.",
700 pline("%s
\82Í
\8e©
\95ª
\82Ì
\8e\9d\82¿
\95¨
\88ê
\97\97\82ð
\8am
\94F
\82µ
\82Ä
\82¢
\82é
\81D",
704 if (!Deaf && !muteshk(shkp))
706 verbalize("%s, %s! Welcome%s to %s %s!", Hello(shkp), plname,
707 eshkp->visitct++ ? " again" : "",
708 s_suffix(shkname(shkp)), shtypes[rt - SHOPBASE].name);
710 verbalize("%s
\81I%s
\82Ì%s
\82É%s
\81I", Hello(shkp),
711 shkname(shkp), shtypes[rt - SHOPBASE].name,
712 eshkp->visitct++ ? "
\82Ü
\82½
\97\88\82Ü
\82µ
\82½
\82Ë" : "
\82æ
\82¤
\82±
\82»");
716 You("enter %s %s%s!",
717 s_suffix(shkname(shkp)),
718 shtypes[rt - SHOPBASE].name,
719 eshkp->visitct++ ? " again" : "");
721 You("%s%s
\82Ì%s
\82ð
\96K
\82ê
\82½
\81I",
722 eshkp->visitct++ ? "
\8dÄ
\82Ñ" : "",
724 shtypes[rt - SHOPBASE].name);
727 /* can't do anything about blocking if teleported in */
728 if (!inside_shop(u.ux, u.uy)) {
729 boolean should_block;
732 struct obj *pick = carrying(PICK_AXE),
733 *mattock = carrying(DWARVISH_MATTOCK);
735 if (pick || mattock) {
736 cnt = 1; /* so far */
737 if (pick && mattock) { /* carrying both types */
739 tool = "digging tool";
741 tool = "
\8c@
\82é
\93¹
\8bï";
742 cnt = 2; /* `more than 1' is all that matters */
747 tool = "
\82Â
\82é
\82Í
\82µ";
748 /* hack: `pick' already points somewhere into inventory */
749 while ((pick = pick->nobj) != 0)
750 if (pick->otyp == PICK_AXE)
752 } else { /* assert(mattock != 0) */
756 tool = "
\82Â
\82é
\82Í
\82µ";
757 while ((mattock = mattock->nobj) != 0)
758 if (mattock->otyp == DWARVISH_MATTOCK)
760 /* [ALI] Shopkeeper identifies mattock(s) */
762 makeknown(DWARVISH_MATTOCK);
764 if (!Deaf && !muteshk(shkp))
766 verbalize(NOTANGRY(shkp)
767 ? "Will you please leave your %s%s outside?"
768 : "Leave the %s%s outside.",
771 verbalize(NOTANGRY(shkp)
772 ? "%s
\82ð
\8aO
\82É
\92u
\82¢
\82Ä
\82«
\82Ä
\82¢
\82½
\82¾
\82¯
\82Ü
\82¹
\82ñ
\82©
\81H"
773 : "%s
\82ð
\8aO
\82Ö
\92u
\82¢
\82Ä
\82±
\82¢
\81I",
778 pline("%s %s to let you in with your %s%s.",
780 NOTANGRY(shkp) ? "is hesitant" : "refuses",
783 pline("%s
\82Í
\82 \82È
\82½
\82ª%s
\82ð
\8e\9d\82Á
\82Ä
\93ü
\82é
\82Ì%s
\81D",
786 NOTANGRY(shkp) ? "
\82Í
\8bC
\82ª
\82·
\82·
\82Ü
\82È
\82¢
\82æ
\82¤
\82¾" : "
\82ð
\8b\91\94Û
\82µ
\82½");
789 } else if (u.usteed) {
790 if (!Deaf && !muteshk(shkp))
792 verbalize(NOTANGRY(shkp) ? "Will you please leave %s outside?"
793 : "Leave %s outside.",
796 verbalize(NOTANGRY(shkp) ? "%s
\82ð
\8aO
\82É
\92u
\82¢
\82Ä
\82«
\82Ä
\82¢
\82½
\82¾
\82¯
\82Ü
\82¹
\82ñ
\82©
\81H"
797 : "%s
\82ð
\8aO
\82Ö
\92u
\82¢
\82Ä
\82±
\82¢
\81I",
802 pline("%s %s to let you in while you're riding %s.",
804 NOTANGRY(shkp) ? "doesn't want" : "refuses",
807 pline("%s
\82Í
\82 \82È
\82½
\82ª%s
\82É
\8fæ
\82Á
\82½
\82Ü
\82Ü
\82È
\82Ì%s.",
810 NOTANGRY(shkp) ? "
\82Í
\96]
\82Ü
\82È
\82¢
\82æ
\82¤
\82¾" : "
\82ð
\8b\91\94Û
\82µ
\82½");
815 (Fast && (sobj_at(PICK_AXE, u.ux, u.uy)
816 || sobj_at(DWARVISH_MATTOCK, u.ux, u.uy)));
819 (void) dochug(shkp); /* shk gets extra move */
824 /* called when removing a pick-axe or mattock from a container */
831 if (obj->unpaid || !is_pick(obj))
833 shkp = shop_keeper(*u.ushops);
834 if (shkp && inhishop(shkp)) {
835 static NEARDATA long pickmovetime = 0L;
837 /* if you bring a sack of N picks into a shop to sell,
838 don't repeat this N times when they're taken out */
839 if (moves != pickmovetime) {
840 if (!Deaf && !muteshk(shkp))
842 verbalize("You sneaky %s! Get out of here with that pick!",
845 verbalize("
\82Ð
\82«
\82å
\82¤
\8eÒ
\82ß
\81I
\82Â
\82é
\82Í
\82µ
\82ð
\8e\9d\82Á
\82Ä
\8aO
\82É
\8fo
\82ë
\81I");
849 pline("%s %s your pick!",
851 haseyes(shkp->data) ? "glares at"
852 : "is dismayed because of");
854 pline("%s
\82Í
\82Â
\82é
\82Í
\82µ%s
\81I",
856 haseyes(shkp->data) ? "
\82ð
\82É
\82ç
\82Ý
\82Â
\82¯
\82½"
857 : "
\82É
\93®
\97h
\82µ
\82Ä
\82¢
\82é");
860 pickmovetime = moves;
865 Decide whether two unpaid items are mergable; caller is responsible for
866 making sure they're unpaid and the same type of object; we check the price
867 quoted by the shopkeeper and also that they both belong to the same shk.
870 same_price(obj1, obj2)
871 struct obj *obj1, *obj2;
873 register struct monst *shkp1, *shkp2;
874 struct bill_x *bp1 = 0, *bp2 = 0;
875 boolean are_mergable = FALSE;
877 /* look up the first object by finding shk whose bill it's on */
878 for (shkp1 = next_shkp(fmon, TRUE); shkp1;
879 shkp1 = next_shkp(shkp1->nmon, TRUE))
880 if ((bp1 = onbill(obj1, shkp1, TRUE)) != 0)
882 /* second object is probably owned by same shk; if not, look harder */
883 if (shkp1 && (bp2 = onbill(obj2, shkp1, TRUE)) != 0) {
886 for (shkp2 = next_shkp(fmon, TRUE); shkp2;
887 shkp2 = next_shkp(shkp2->nmon, TRUE))
888 if ((bp2 = onbill(obj2, shkp2, TRUE)) != 0)
893 impossible("same_price: object wasn't on any bill!");
895 are_mergable = (shkp1 == shkp2 && bp1->price == bp2->price);
900 * Figure out how much is owed to a given shopkeeper.
901 * At present, we ignore any amount robbed from the shop, to avoid
902 * turning the `$' command into a way to discover that the current
903 * level is bones data which has a shk on the warpath.
911 long debt = eshkp->debit;
913 for (bp = eshkp->bill_p, ct = eshkp->billct; ct > 0; bp++, ct--)
914 debt += bp->price * bp->bquan;
918 /* called in response to the `$' command */
920 shopper_financial_report()
922 struct monst *shkp, *this_shkp = shop_keeper(inside_shop(u.ux, u.uy));
927 eshkp = this_shkp ? ESHK(this_shkp) : 0;
928 if (eshkp && !(eshkp->credit || shop_debt(eshkp))) {
930 You("have no credit or debt in here.");
932 You("
\97a
\82¯
\8bà
\82à
\8eØ
\8bà
\82à
\82È
\82¢
\81D");
933 this_shkp = 0; /* skip first pass */
936 /* pass 0: report for the shop we're currently in, if any;
937 pass 1: report for all other shops on this level. */
938 for (pass = this_shkp ? 0 : 1; pass <= 1; pass++)
939 for (shkp = next_shkp(fmon, FALSE); shkp;
940 shkp = next_shkp(shkp->nmon, FALSE)) {
941 if ((shkp != this_shkp) ^ pass)
944 if ((amt = eshkp->credit) != 0)
946 You("have %ld %s credit at %s %s.", amt, currency(amt),
947 s_suffix(shkname(shkp)),
948 shtypes[eshkp->shoptype - SHOPBASE].name);
950 You("%ld%s
\82Ì
\97a
\82¯
\8bà
\82ª%s
\82Ì%s
\82É
\82 \82é
\81D", amt, currency(amt),
952 shtypes[eshkp->shoptype - SHOPBASE].name);
954 else if (shkp == this_shkp)
956 You("have no credit in here.");
958 You("
\97a
\82¯
\8bà
\82Í
\82È
\82¢
\81D");
959 if ((amt = shop_debt(eshkp)) != 0)
961 You("owe %s %ld %s.", shkname(shkp), amt, currency(amt));
963 You("%s
\82É%ld%s
\82Ì
\8eØ
\82è
\82ª
\82 \82é
\81D", shkname(shkp), amt, currency(amt));
964 else if (shkp == this_shkp)
966 You("don't owe any money here.");
968 pline("
\82±
\82Ì
\93X
\82É
\8eØ
\82è
\82Í
\82È
\82¢
\81D");
974 register struct monst *mtmp;
976 struct eshk *eshkp = ESHK(mtmp);
978 return (index(in_rooms(mtmp->mx, mtmp->my, SHOPBASE), eshkp->shoproom)
979 && on_level(&eshkp->shoplevel, &u.uz));
988 shkp = (rmno >= ROOMOFFSET) ? rooms[rmno - ROOMOFFSET].resident : 0;
990 if (has_eshk(shkp)) {
991 if (NOTANGRY(shkp)) {
992 if (ESHK(shkp)->surcharge)
995 if (!ESHK(shkp)->surcharge)
999 /* would have segfaulted on ESHK dereference previously */
1000 impossible("%s? (rmno=%d, rtype=%d, mnum=%d, \"%s\")",
1001 shkp->isshk ? "shopkeeper career change"
1002 : "shop resident not shopkeeper",
1004 (int) rooms[rmno - ROOMOFFSET].rtype,
1006 /* [real shopkeeper name is kept in ESHK, not MNAME] */
1007 has_mname(shkp) ? MNAME(shkp) : "anonymous");
1008 /* not sure if this is appropriate, because it does nothing to
1009 correct the underlying rooms[].resident issue but... */
1010 return (struct monst *) 0;
1018 struct mkroom *sroom;
1020 struct monst *mtmp = sroom->resident;
1022 return !mtmp ? FALSE : (boolean) inhishop(mtmp);
1025 STATIC_OVL struct bill_x *
1026 onbill(obj, shkp, silent)
1032 register struct bill_x *bp = ESHK(shkp)->bill_p;
1033 register int ct = ESHK(shkp)->billct;
1036 if (bp->bo_id == obj->o_id) {
1039 pline("onbill: paid obj on bill?");
1041 pline("
\8a¨
\92è
\81F
\95¥
\82¤
\81H");
1046 if (obj->unpaid && !silent)
1048 pline("onbill: unpaid obj not on bill?");
1050 pline("
\8a¨
\92è
\81F
\95¥
\82í
\82È
\82¢
\81H");
1051 return (struct bill_x *) 0;
1054 /* check whether an object or any of its contents belongs to a shop */
1059 return (boolean) (obj->unpaid
1060 || (Has_contents(obj) && count_unpaid(obj->cobj)));
1063 /* Delete the contents of the given object. */
1065 delete_contents(obj)
1066 register struct obj *obj;
1068 register struct obj *curr;
1070 while ((curr = obj->cobj) != 0) {
1071 obj_extract_self(curr);
1072 obfree(curr, (struct obj *) 0);
1076 /* called with two args on merge */
1079 register struct obj *obj, *merge;
1081 register struct bill_x *bp;
1082 register struct bill_x *bpm;
1083 register struct monst *shkp;
1085 if (obj->otyp == LEASH && obj->leashmon)
1087 if (obj->oclass == FOOD_CLASS)
1088 food_disappears(obj);
1089 if (obj->oclass == SPBOOK_CLASS)
1090 book_disappears(obj);
1091 if (Has_contents(obj))
1092 delete_contents(obj);
1096 /* look for a shopkeeper who owns this object */
1097 for (shkp = next_shkp(fmon, TRUE); shkp;
1098 shkp = next_shkp(shkp->nmon, TRUE))
1099 if (onbill(obj, shkp, TRUE))
1102 /* sanity check, more or less */
1104 shkp = shop_keeper(*u.ushops);
1106 * Note: `shkp = shop_keeper(*u.ushops)' used to be
1107 * unconditional. But obfree() is used all over
1108 * the place, so making its behavior be dependent
1109 * upon player location doesn't make much sense.
1112 if ((bp = onbill(obj, shkp, FALSE)) != 0) {
1115 obj->unpaid = 0; /* only for doinvbill */
1116 add_to_billobjs(obj);
1119 bpm = onbill(merge, shkp, FALSE);
1121 /* this used to be a rename */
1122 impossible("obfree: not on bill??");
1125 /* this was a merger */
1126 bpm->bquan += bp->bquan;
1127 ESHK(shkp)->billct--;
1130 /* DRS/NS 2.2.6 messes up -- Peter Kendell */
1131 int indx = ESHK(shkp)->billct;
1133 *bp = ESHK(shkp)->bill_p[indx];
1136 *bp = ESHK(shkp)->bill_p[ESHK(shkp)->billct];
1140 if (obj->owornmask) {
1141 impossible("obfree: deleting worn obj (%d: %ld)", obj->otyp,
1143 /* unfortunately at this point we don't know whether worn mask
1144 applied to hero or a monster or perhaps something bogus, so
1145 can't call remove_worn_item() to get <X>_off() side-effects */
1152 check_credit(tmp, shkp)
1154 register struct monst *shkp;
1156 long credit = ESHK(shkp)->credit;
1159 ; /* nothing to do; just 'return tmp;' */
1160 } else if (credit >= tmp) {
1162 pline_The("price is deducted from your credit.");
1164 pline("
\91ã
\8bà
\82Í
\97a
\82¯
\8bà
\82©
\82ç
\8d·
\82µ
\88ø
\82©
\82ê
\82½
\81D");
1165 ESHK(shkp)->credit -= tmp;
1169 pline_The("price is partially covered by your credit.");
1171 pline("
\91ã
\8bà
\82Ì
\88ê
\95\94\82Í
\82 \82È
\82½
\82Ì
\97a
\82¯
\8bà
\82Å
\95â
\82í
\82ê
\82½
\81D");
1172 ESHK(shkp)->credit = 0L;
1181 register struct monst *shkp;
1183 long robbed = ESHK(shkp)->robbed;
1184 long balance = ((tmp <= 0L) ? tmp : check_credit(tmp, shkp));
1187 money2mon(shkp, balance);
1188 else if (balance < 0)
1189 money2u(shkp, -balance);
1195 ESHK(shkp)->robbed = robbed;
1199 /* return shkp to home position */
1201 home_shk(shkp, killkops)
1202 register struct monst *shkp;
1203 register boolean killkops;
1205 register xchar x = ESHK(shkp)->shk.x, y = ESHK(shkp)->shk.y;
1207 (void) mnearto(shkp, x, y, TRUE);
1208 level.flags.has_shop = 1;
1213 after_shk_move(shkp);
1219 register struct monst *shkp;
1221 for (shkp = next_shkp(fmon, FALSE); shkp;
1222 shkp = next_shkp(shkp->nmon, FALSE))
1228 /* remove previously applied surcharge from all billed items */
1231 register struct monst *shkp;
1233 NOTANGRY(shkp) = TRUE; /* make peaceful */
1234 if (ESHK(shkp)->surcharge) {
1235 register struct bill_x *bp = ESHK(shkp)->bill_p;
1236 register int ct = ESHK(shkp)->billct;
1238 ESHK(shkp)->surcharge = FALSE;
1240 register long reduction = (bp->price + 3L) / 4L;
1241 bp->price -= reduction; /* undo 33% increase */
1247 /* add aggravation surcharge to all billed items */
1250 register struct monst *shkp;
1252 NOTANGRY(shkp) = FALSE; /* make angry */
1253 if (!ESHK(shkp)->surcharge) {
1254 register struct bill_x *bp = ESHK(shkp)->bill_p;
1255 register int ct = ESHK(shkp)->billct;
1257 ESHK(shkp)->surcharge = TRUE;
1259 register long surcharge = (bp->price + 2L) / 3L;
1260 bp->price += surcharge;
1266 /* wakeup and/or unparalyze shopkeeper */
1268 rouse_shk(shkp, verbosely)
1272 if (!shkp->mcanmove || shkp->msleeping) {
1273 /* greed induced recovery... */
1274 if (verbosely && canspotmon(shkp))
1276 pline("%s %s.", Shknam(shkp),
1277 shkp->msleeping ? "wakes up" : "can move again");
1279 pline("%s
\82Í%s
\81D", Monnam(shkp),
1280 shkp->msleeping ? "
\96Ú
\82ª
\8ao
\82ß
\82½" : "
\82Ó
\82½
\82½
\82Ñ
\93®
\82¯
\82é
\82æ
\82¤
\82É
\82È
\82Á
\82½");
1282 shkp->msleeping = 0;
1289 make_happy_shk(shkp, silentkops)
1290 register struct monst *shkp;
1291 register boolean silentkops;
1293 boolean wasmad = ANGRY(shkp);
1294 struct eshk *eshkp = ESHK(shkp);
1297 eshkp->following = 0;
1299 if (!Role_if(PM_ROGUE))
1300 adjalign(sgn(u.ualign.type));
1301 if (!inhishop(shkp)) {
1302 char shk_nam[BUFSZ];
1303 boolean vanished = canseemon(shkp);
1305 Strcpy(shk_nam, shkname(shkp));
1306 if (on_level(&eshkp->shoplevel, &u.uz)) {
1307 home_shk(shkp, FALSE);
1308 /* didn't disappear if shk can still be seen */
1309 if (canseemon(shkp))
1312 /* if sensed, does disappear regardless whether seen */
1315 /* can't act as porter for the Amulet, even if shk
1316 happens to be going farther down rather than up */
1317 mdrop_special_objs(shkp);
1318 /* arrive near shop's door */
1319 migrate_to_level(shkp, ledger_no(&eshkp->shoplevel),
1320 MIGR_APPROX_XY, &eshkp->shd);
1321 /* dismiss kops on that level when shk arrives */
1322 eshkp->dismiss_kops = TRUE;
1326 pline("Satisfied, %s suddenly disappears!", shk_nam);
1328 pline("%s
\82Í
\96\9e\91«
\82·
\82é
\82Æ
\81C
\93Ë
\91R
\8fÁ
\82¦
\82½
\81I", shk_nam);
1331 pline("%s calms down.", Shknam(shkp));
1333 pline("%s
\82Í
\97\8e\92\85\82¢
\82½
\81D", Shknam(shkp));
1335 make_happy_shoppers(silentkops);
1338 /* called by make_happy_shk() and also by losedogs() for migrating shk */
1340 make_happy_shoppers(silentkops)
1343 if (!angry_shk_exists()) {
1344 kops_gone(silentkops);
1351 register struct monst *shkp;
1357 (void) strncpy(ESHK(shkp)->customer, plname, PL_NSIZ);
1358 ESHK(shkp)->following = 1;
1361 /* Used when the shkp is teleported or falls (ox == 0) out of his shop, or
1362 when the player is not on a costly_spot and he damages something inside
1363 the shop. These conditions must be checked by the calling function. */
1366 make_angry_shk(shkp, ox, oy)
1368 xchar ox UNUSED; /* <ox,oy> predate 'noit_Monnam()', let alone Shknam() */
1371 struct eshk *eshkp = ESHK(shkp);
1373 /* all pending shop transactions are now "past due" */
1374 if (eshkp->billct || eshkp->debit || eshkp->loan || eshkp->credit) {
1375 eshkp->robbed += (addupbill(shkp) + eshkp->debit + eshkp->loan);
1376 eshkp->robbed -= eshkp->credit;
1377 if (eshkp->robbed < 0L)
1379 /* billct, debit, loan, and credit will be cleared by setpaid */
1384 pline("%s %s!", Shknam(shkp), !ANGRY(shkp) ? "gets angry" : "is furious");
1386 pline("%s
\82Í%s
\81I", Shknam(shkp), !ANGRY(shkp) ? "
\93{
\82Á
\82½" : "
\93{
\82è
\8b¶
\82Á
\82½");
1390 STATIC_VAR const char
1392 no_money[] = "Moreover, you%s have no money.",
1394 no_money[] = "
\82µ
\82©
\82à
\81C
\82 \82È
\82½
\82Í
\82¨
\8bà
\82ª
\82È
\82¢%s
\81D",
1396 not_enough_money[] = "Besides, you don't have enough to interest %s.";
1398 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";
1400 /* delivers the cheapest item on the list */
1403 register struct monst *shkp;
1405 register int ct = ESHK(shkp)->billct;
1406 register struct bill_x *bp = ESHK(shkp)->bill_p;
1407 register long gmin = (bp->price * bp->bquan);
1410 if (bp->price * bp->bquan < gmin)
1411 gmin = bp->price * bp->bquan;
1420 register struct eshk *eshkp;
1421 register struct monst *shkp;
1422 struct monst *nxtm, *resident;
1425 int pass, tmp, sk = 0, seensk = 0;
1426 boolean paid = FALSE, stashed_gold = (hidden_gold() > 0L);
1430 /* Find how many shk's there are, how many are in
1431 * sight, and are you in a shop room with one.
1433 nxtm = resident = 0;
1434 for (shkp = next_shkp(fmon, FALSE); shkp;
1435 shkp = next_shkp(shkp->nmon, FALSE)) {
1437 if (ANGRY(shkp) && distu(shkp->mx, shkp->my) <= 2)
1439 if (canspotmon(shkp))
1441 if (inhishop(shkp) && (*u.ushops == ESHK(shkp)->shoproom))
1445 if (nxtm) { /* Player should always appease an */
1446 shkp = nxtm; /* irate shk standing next to them. */
1450 if ((!sk && (!Blind || Blind_telepat)) || (!Blind && !seensk)) {
1452 There("appears to be no shopkeeper here to receive your payment.");
1454 pline("
\8ex
\95¥
\82¢
\82ð
\8eó
\82¯
\82Æ
\82é
\93X
\8eå
\82Í
\82±
\82±
\82É
\82Í
\82¢
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
1462 You("
\8c©
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D
\81D
\81D");
1466 /* The usual case. Allow paying at a distance when
1467 * inside a tended shop. Should we change that?
1469 if (sk == 1 && resident) {
1475 for (shkp = next_shkp(fmon, FALSE); shkp;
1476 shkp = next_shkp(shkp->nmon, FALSE))
1477 if (canspotmon(shkp))
1479 if (shkp != resident && distu(shkp->mx, shkp->my) > 2) {
1481 pline("%s is not near enough to receive your payment.",
1483 pline("%s
\82Í
\89\93\82
\82É
\82¢
\82é
\82Ì
\82Å
\8ex
\95¥
\82¦
\82È
\82¢
\81D",
1495 pline("
\92N
\82É
\95¥
\82¤
\81H");
1499 if (getpos(&cc, TRUE, "the creature you want to pay") < 0)
1501 if (getpos(&cc, TRUE, "
\8ex
\95¥
\82¢
\82½
\82¢
\91\8a\8eè") < 0)
1502 return 0; /* player pressed ESC */
1507 pline("Try again...");
1509 pline("
\82à
\82¤
\88ê
\93x
\81D
\81D
\81D");
1512 if (u.ux == cx && u.uy == cy) {
1514 You("are generous to yourself.");
1516 pline("
\8e©
\95ª
\8e©
\90g
\82É
\82È
\82ñ
\82Ä
\8bC
\91O
\82Ì
\82¢
\82¢
\82±
\82Æ
\81I");
1519 mtmp = m_at(cx, cy);
1520 if (!cansee(cx, cy) && (!mtmp || !canspotmon(mtmp))) {
1521 You("can't %s anyone there.", !Blind ? "see" : "sense");
1526 There("is no one there to receive your payment.");
1528 pline("
\8ex
\95¥
\82¢
\82ð
\8eó
\82¯
\82Æ
\82ê
\82é
\91\8a\8eè
\82Í
\82¢
\82È
\82¢
\81D");
1533 pline("%s is not interested in your payment.", Monnam(mtmp));
1535 pline("%s
\82Í
\8ex
\95¥
\82¢
\82É
\8b»
\96¡
\82ð
\8e¦
\82³
\82È
\82¢
\81D", Monnam(mtmp));
1538 if (mtmp != resident && distu(mtmp->mx, mtmp->my) > 2) {
1540 pline("%s is too far to receive your payment.", Shknam(mtmp));
1542 pline("%s
\82Í
\8ex
\95¥
\82¢
\82É
\8b»
\96¡
\82ð
\8e¦
\82³
\82È
\82¢
\81D", Shknam(mtmp));
1549 debugpline0("dopay: null shkp.");
1554 ltmp = eshkp->robbed;
1556 /* wake sleeping shk when someone who owes money offers payment */
1557 if (ltmp || eshkp->billct || eshkp->debit)
1558 rouse_shk(shkp, TRUE);
1560 if (!shkp->mcanmove || shkp->msleeping) { /* still asleep/paralyzed */
1562 pline("%s %s.", Shknam(shkp),
1563 rn2(2) ? "seems to be napping" : "doesn't respond");
1565 pline("%s
\82Í%s
\81D", Shknam(shkp),
1566 rn2(2) ? "
\8b\8f\96°
\82è
\82ð
\82µ
\82Ä
\82¢
\82é
\82æ
\82¤
\82¾" : "
\94½
\89\9e\82ª
\82È
\82¢");
1571 if (shkp != resident && NOTANGRY(shkp)) {
1572 umoney = money_cnt(invent);
1575 You("do not owe %s anything.", shkname(shkp));
1577 You("%s
\82É
\8eØ
\82è
\82Í
\82È
\82¢
\81D", shkname(shkp));
1580 You("%shave no money.", stashed_gold ? "seem to " : "");
1582 You("
\82¨
\8bà
\82ª
\82È
\82¢%s
\81D", stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1585 pline("But you have some gold stashed away.");
1587 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");
1589 if (umoney > ltmp) {
1591 You("give %s the %ld gold piece%s %s asked for.",
1592 shkname(shkp), ltmp, plur(ltmp), mhe(shkp));
1594 You("%s
\82É
\96]
\82Ý
\92Ê
\82è%ld
\96\87\82Ì
\8bà
\89Ý
\82ð
\97^
\82¦
\82½
\81D",
1595 shkname(shkp), ltmp);
1600 You("give %s all your%s gold.", shkname(shkp),
1601 stashed_gold ? " openly kept" : "");
1603 You("%s
\82É%s
\82¨
\8bà
\91S
\95\94\82ð
\97^
\82¦
\82½
\81D", shkname(shkp),
1604 stashed_gold ? "
\8eè
\8e\9d\82¿
\82Ì" : "");
1609 pline("But you have hidden gold!");
1611 pline("
\82µ
\82©
\82µ
\81C
\82 \82È
\82½
\82Í
\83w
\83\
\83N
\83\8a\82ª
\82 \82é
\81I");
1613 if ((umoney < ltmp / 2L) || (umoney < ltmp && stashed_gold))
1615 pline("Unfortunately, %s doesn't look satisfied.", mhe(shkp));
1617 pline("
\8ec
\94O
\82È
\82ª
\82ç
\81C%s
\82Í
\96\9e\91«
\82µ
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D", mhe(shkp));
1619 make_happy_shk(shkp, FALSE);
1624 /* ltmp is still eshkp->robbed here */
1625 if (!eshkp->billct && !eshkp->debit) {
1626 umoney = money_cnt(invent);
1627 if (!ltmp && NOTANGRY(shkp)) {
1629 You("do not owe %s anything.", shkname(shkp));
1631 You("%s
\82É
\8eØ
\82è
\82Í
\82È
\82¢
\81D", shkname(shkp));
1634 pline(no_money, stashed_gold ? " seem to" : "");
1636 pline(no_money, stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1639 pline("%s is after blood, not money!", shkname(shkp));
1641 pline("%s
\82Í
\8c\8c\82Ü
\82Ý
\82ê
\82¾
\81D
\82¨
\8bà
\82Ç
\82±
\82ë
\82¶
\82á
\82È
\82¢
\81I", Monnam(shkp));
1642 if (umoney < ltmp / 2L || (umoney < ltmp && stashed_gold)) {
1645 pline(no_money, stashed_gold ? " seem to" : "");
1647 pline(no_money, stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1649 pline(not_enough_money, mhim(shkp));
1653 pline("But since %s shop has been robbed recently,", mhis(shkp));
1655 pline("
\82µ
\82©
\82µ
\81C%s
\93X
\82Í
\8dÅ
\8bß
\93\90\82Ý
\82É
\82 \82Á
\82½
\82Ì
\82Å
\81C", mhis(shkp));
1657 pline("you %scompensate %s for %s losses.",
1658 (umoney < ltmp) ? "partially " : "", shkname(shkp),
1661 pline("%s
\82Ì
\91¹
\8e¸%s
\82ð
\95â
\93U
\82µ
\82½
\81D", mhis(shkp),
1662 (umoney < ltmp) ? "
\82Ì
\88ê
\95\94" : "");
1664 pay(umoney < ltmp ? umoney : ltmp, shkp);
1665 make_happy_shk(shkp, FALSE);
1667 /* shopkeeper is angry, but has not been robbed --
1668 * door broken, attacked, etc. */
1670 pline("%s is after your hide, not your money!", Shknam(shkp));
1672 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));
1673 if (umoney < 1000L) {
1676 pline(no_money, stashed_gold ? " seem to" : "");
1678 pline(no_money, stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1680 pline(not_enough_money, mhim(shkp));
1684 You("try to appease %s by giving %s 1000 gold pieces.",
1685 x_monnam(shkp, ARTICLE_THE, "angry", 0, FALSE), mhim(shkp));
1687 You("
\8bà
\89Ý1000
\96\87\82ð%s
\82É
\8eè
\93n
\82µ
\82Ä
\82È
\82¾
\82ß
\82æ
\82¤
\82Æ
\82µ
\82½
\81D",
1688 x_monnam(shkp, ARTICLE_THE, "
\93{
\82Á
\82½", 0, FALSE));
1691 if (strncmp(eshkp->customer, plname, PL_NSIZ) || rn2(3))
1692 make_happy_shk(shkp, FALSE);
1695 pline("But %s is as angry as ever.", shkname(shkp));
1697 pline("
\82µ
\82©
\82µ%s
\82Í
\82Ü
\82¾
\93{
\82Á
\82Ä
\82¢
\82é
\81D", shkname(shkp));
1701 if (shkp != resident) {
1702 impossible("dopay: not to shopkeeper?");
1707 /* pay debt, if any, first */
1709 long dtmp = eshkp->debit;
1710 long loan = eshkp->loan;
1713 umoney = money_cnt(invent);
1714 #if 0 /*JP*//*
\96\96\94ö
\82É
\89ñ
\82·*/
1715 Sprintf(sbuf, "You owe %s %ld %s ", shkname(shkp), dtmp,
1721 Strcat(sbuf, "you picked up in the store.");
1723 Strcpy(sbuf, "
\93X
\82Ì
\92\86\82Å
\8fE
\82Á
\82½
\82à
\82Ì
\82É
\91Î
\82µ
\82Ä
\81C");
1727 "for gold picked up and the use of merchandise.");
1729 Strcpy(sbuf,"
\8fE
\82Á
\82½
\82¨
\8bà
\82â
\8eg
\82Á
\82½
\8eG
\89Ý
\82É
\91Î
\82µ
\82Ä
\81C");
1733 Strcat(sbuf, "for the use of merchandise.");
1735 Strcpy(sbuf, "
\8eg
\82Á
\82½
\8eG
\89Ý
\82É
\91Î
\82µ
\82Ä
\81C");
1736 #if 1 /*JP*//*
\8fã
\82©
\82ç
\88Ú
\93®*/
1737 Sprintf(eos(sbuf), "%s
\82É%ld%s
\82Ì
\8eØ
\82è
\82ª
\82 \82é
\81D",
1738 shkname(shkp), dtmp, currency(dtmp));
1741 if (umoney + eshkp->credit < dtmp) {
1743 pline("But you don't%s have enough gold%s.",
1744 stashed_gold ? " seem to" : "",
1745 eshkp->credit ? " or credit" : "");
1747 pline("
\82µ
\82©
\82µ
\81C
\82¨
\8bà%s
\91«
\82è
\82È
\82¢%s
\81D",
1748 eshkp->credit ? "
\82à
\97a
\82¯
\8bà
\82à" : "
\82ª",
1749 stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1753 if (eshkp->credit >= dtmp) {
1754 eshkp->credit -= dtmp;
1758 Your("debt is covered by your credit.");
1760 Your("
\8eØ
\8bà
\82Í
\97a
\82¯
\8bà
\82Å
\95â
\82í
\82ê
\82½
\81D");
1761 } else if (!eshkp->credit) {
1762 money2mon(shkp, dtmp);
1766 You("pay that debt.");
1768 You("
\8eØ
\8bà
\82ð
\95¥
\82Á
\82½
\81D");
1771 dtmp -= eshkp->credit;
1773 money2mon(shkp, dtmp);
1777 pline("That debt is partially offset by your credit.");
1779 pline("
\82»
\82Ì
\8eØ
\8bà
\82Í
\88ê
\95\94\97a
\82¯
\8bà
\82Å
\91\8a\8eE
\82³
\82ê
\82½
\81D");
1781 You("pay the remainder.");
1783 You("
\8ec
\82è
\82ð
\95¥
\82Á
\82½
\81D");
1789 /* now check items on bill */
1790 if (eshkp->billct) {
1791 register boolean itemize;
1794 umoney = money_cnt(invent);
1795 if (!umoney && !eshkp->credit) {
1797 You("%shave no money or credit%s.",
1798 stashed_gold ? "seem to " : "", paid ? " left" : "");
1800 You("%s
\82¨
\8bà
\82à
\97a
\82¯
\8bà
\82à
\8e\9d\82Á
\82Ä
\82È
\82¢%s
\81D",
1801 paid ? "
\82à
\82¤" : "", stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1805 if ((umoney + eshkp->credit) < cheapest_item(shkp)) {
1807 You("don't have enough money to buy%s the item%s you picked.",
1808 eshkp->billct > 1 ? " any of" : "", plur(eshkp->billct));
1810 pline("
\8fE
\82Á
\82½
\95i
\95¨
\82ð
\94\83\82¤
\82É
\82Í
\82¨
\8bà
\82ª
\91«
\82è
\82È
\82¢
\81D");
1814 pline("Maybe you have some gold stashed away?");
1816 You("
\82Ç
\82±
\82©
\82É
\82¨
\8bà
\82ð
\89B
\82µ
\82Ä
\82¢
\82é
\82Ì
\82©
\82à
\81H");
1820 /* this isn't quite right; it itemizes without asking if the
1821 * single item on the bill is partly used up and partly unpaid */
1823 iprompt = (eshkp->billct > 1 ? ynq("Itemized billing?") : 'y');
1825 iprompt = (eshkp->billct > 1 ? ynq("
\8cÂ
\95Ê
\82É
\8a¨
\92è
\82µ
\82Ü
\82·
\82©
\81H") : 'y');
1826 itemize = (iprompt == 'y');
1830 for (pass = 0; pass <= 1; pass++) {
1832 while (tmp < eshkp->billct) {
1834 register struct bill_x *bp = &(eshkp->bill_p[tmp]);
1836 /* find the object on one of the lists */
1837 if ((otmp = bp_to_obj(bp)) != 0) {
1838 /* if completely used up, object quantity is stale;
1839 restoring it to its original value here avoids
1840 making the partly-used-up code more complicated */
1842 otmp->quan = bp->bquan;
1844 impossible("Shopkeeper administration out of order.");
1845 setpaid(shkp); /* be nice to the player */
1848 if (pass == bp->useup && otmp->quan == bp->bquan) {
1849 /* pay for used-up items on first pass and others
1850 * on second, so player will be stuck in the store
1851 * less often; things which are partly used up
1852 * are processed on both passes */
1855 switch (dopayobj(shkp, bp, &otmp, pass, itemize)) {
1860 goto thanks; /*break*/
1875 *bp = eshkp->bill_p[--eshkp->billct];
1881 update_inventory(); /* Done in dopayobj() if itemize. */
1883 if (!ANGRY(shkp) && paid) {
1884 if (!Deaf && !muteshk(shkp))
1886 verbalize("Thank you for shopping in %s %s!", s_suffix(shkname(shkp)),
1887 shtypes[eshkp->shoptype - SHOPBASE].name);
1889 verbalize("%s
\82Ì%s
\82Ö
\82Ü
\82½
\82Ç
\82¤
\82¼
\81I", shkname(shkp),
1890 shtypes[eshkp->shoptype - SHOPBASE].name);
1894 pline("%s nods appreciatively at you for shopping in %s %s!",
1897 shtypes[eshkp->shoptype - SHOPBASE].name);
1899 pline("%s
\82Í%s
\82Å
\82Ì
\94\83\82¢
\95¨
\82É
\8a´
\8eÓ
\82µ
\82Ä
\82¤
\82È
\82Ã
\82¢
\82½
\81I",
1901 shtypes[eshkp->shoptype - SHOPBASE].name);
1907 /* return 2 if used-up portion paid
1908 * 1 if paid successfully
1909 * 0 if not enough money
1910 * -1 if skip this object
1911 * -2 if no money/credit left
1914 dopayobj(shkp, bp, obj_p, which, itemize)
1915 register struct monst *shkp;
1916 register struct bill_x *bp;
1918 int which; /* 0 => used-up item, 1 => other (unpaid or lost) */
1921 register struct obj *obj = *obj_p;
1922 long ltmp, quan, save_quan;
1923 long umoney = money_cnt(invent);
1925 boolean stashed_gold = (hidden_gold() > 0L), consumed = (which == 0);
1927 if (!obj->unpaid && !bp->useup) {
1928 impossible("Paid object on bill??");
1931 if (itemize && umoney + ESHK(shkp)->credit == 0L) {
1933 You("%shave no money or credit left.",
1934 stashed_gold ? "seem to " : "");
1936 You("
\82à
\82¤
\82¨
\8bà
\82à
\97a
\82¯
\8bà
\82à
\82È
\82¢%s
\81D",
1937 stashed_gold ? "
\82æ
\82¤
\82¾" : "");
1941 /* we may need to temporarily adjust the object, if part of the
1942 original quantity has been used up but part remains unpaid */
1943 save_quan = obj->quan;
1945 /* either completely used up (simple), or split needed */
1947 if (quan > obj->quan) /* difference is amount used up */
1950 /* dealing with ordinary unpaid item */
1953 obj->quan = quan; /* to be used by doname() */
1954 obj->unpaid = 0; /* ditto */
1955 iflags.suppress_price++; /* affects containers */
1956 ltmp = bp->price * quan;
1957 buy = PAY_BUY; /* flag; if changed then return early */
1960 char qbuf[BUFSZ], qsfx[BUFSZ];
1963 Sprintf(qsfx, " for %ld %s. Pay?", ltmp, currency(ltmp));
1965 Sprintf(qsfx, "
\82Í%ld%s
\82Å
\82·.
\94\83\82¢
\82Ü
\82·
\82©
\81H", ltmp, currency(ltmp));
1967 (void) safe_qbuf(qbuf, (char *) 0, qsfx, obj,
1968 (quan == 1L) ? Doname2 : doname, ansimpleoname,
1969 (quan == 1L) ? "that" : "those");
1971 (void) safe_qbuf(qbuf, (char *) 0, qsfx, obj,
1972 (quan == 1L) ? Doname2 : doname, ansimpleoname,
1975 if (yn(qbuf) == 'n') {
1976 buy = PAY_SKIP; /* don't want to buy */
1977 } else if (quan < bp->bquan && !consumed) { /* partly used goods */
1978 obj->quan = bp->bquan - save_quan; /* used up amount */
1979 if (!Deaf && !muteshk(shkp)) {
1981 verbalize("%s for the other %s before buying %s.",
1982 ANGRY(shkp) ? "Pay" : "Please pay",
1983 simpleonames(obj), /* short name suffices */
1984 save_quan > 1L ? "these" : "this one");
1986 verbalize("
\82»
\82ê
\82ð
\94\83\82¤
\82Ü
\82¦
\82É
\91¼
\82Ì%s
\82ð%s",
1988 ANGRY(shkp) ? "
\95¥
\82¦
\81I" : "
\95¥
\82Á
\82Ä
\82
\82¾
\82³
\82¢
\81D");
1992 pline("%s %s%s your bill for the other %s first.",
1994 ANGRY(shkp) ? "angrily " : "",
1995 nolimbs(shkp->data) ? "motions to" : "points out",
1998 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",
2000 ANGRY(shkp) ? "
\93{
\82Á
\82Ä" : "",
2004 buy = PAY_SKIP; /* shk won't sell */
2007 if (buy == PAY_BUY && umoney + ESHK(shkp)->credit < ltmp) {
2009 You("don't%s have gold%s enough to pay for %s.",
2010 stashed_gold ? " seem to" : "",
2011 (ESHK(shkp)->credit > 0L) ? " or credit" : "",
2012 thesimpleoname(obj));
2014 You("%s
\82Ì
\91ã
\8bà
\82ð
\8ex
\95¥
\82¤
\82¾
\82¯
\82Ì
\82¨
\8bà%s
\8e\9d\82Á
\82Ä
\82È
\82¢%s
\81D",
2015 thesimpleoname(obj),
2016 (ESHK(shkp)->credit > 0L) ? "
\82à
\97a
\82¯
\8bà
\82à" : "
\82ð",
2017 stashed_gold ? "
\82æ
\82¤
\82¾" : "");
2019 buy = itemize ? PAY_SKIP : PAY_CANT;
2022 if (buy != PAY_BUY) {
2023 /* restore unpaid object to original state */
2024 obj->quan = save_quan;
2026 iflags.suppress_price--;
2032 shk_names_obj(shkp, obj,
2033 consumed ? "paid for %s at a cost of %ld gold piece%s.%s"
2034 : "bought %s for %ld gold piece%s.%s",
2037 shk_names_obj(shkp, obj,
2038 consumed ? "%s
\82É
\8bà
\89Ý%ld
\96\87%s
\82ð
\8ex
\95¥
\82Á
\82½
\81D%s"
2039 : "%s
\82ð
\8bà
\89Ý%ld
\96\87%s
\82Å
\94\83\82Á
\82½
\81D%s",
2042 obj->quan = save_quan; /* restore original count */
2043 /* quan => amount just bought, save_quan => remaining unpaid count */
2045 if (quan != bp->bquan) {
2046 /* eliminate used-up portion; remainder is still unpaid */
2047 bp->bquan = obj->quan;
2051 } else { /* completely used-up, so get rid of it */
2052 obj_extract_self(obj);
2053 /* assert( obj == *obj_p ); */
2055 *obj_p = 0; /* destroy pointer to freed object */
2058 update_inventory(); /* Done just once in dopay() if !itemize. */
2059 iflags.suppress_price--;
2063 static struct repo { /* repossession context */
2064 struct monst *shopkeeper;
2068 /* routine called after dying (or quitting) */
2071 int croaked; /* -1: escaped dungeon; 0: quit; 1: died */
2073 struct monst *mtmp, *mtmp2, *firstshk, *resident, *creditor, *hostile,
2076 boolean taken = FALSE, local;
2079 /* if we escaped from the dungeon, shopkeepers can't reach us;
2080 shops don't occur on level 1, but this could happen if hero
2081 level teleports out of the dungeon and manages not to die */
2084 /* [should probably also return false when dead hero has been
2085 petrified since shk shouldn't be able to grab inventory
2086 which has been shut inside a statue] */
2088 /* this is where inventory will end up if any shk takes it */
2089 repo.location.x = repo.location.y = 0;
2090 repo.shopkeeper = 0;
2093 * Scan all shopkeepers on the level, to prioritize them:
2094 * 1) keeper of shop hero is inside and who is owed money,
2095 * 2) keeper of shop hero is inside who isn't owed any money,
2096 * 3) other shk who is owed money, 4) other shk who is angry,
2097 * 5) any shk local to this level, and if none is found,
2098 * 6) first shk on monster list (last resort; unlikely, since
2099 * any nonlocal shk will probably be in the owed category
2100 * and almost certainly be in the angry category).
2102 resident = creditor = hostile = localshk = (struct monst *) 0;
2103 for (mtmp = next_shkp(fmon, FALSE); mtmp;
2104 mtmp = next_shkp(mtmp2, FALSE)) {
2107 local = on_level(&eshkp->shoplevel, &u.uz);
2108 if (local && index(u.ushops, eshkp->shoproom)) {
2109 /* inside this shk's shop [there might be more than one
2110 resident shk if hero is standing in a breech of a shared
2111 wall, so give priority to one who's also owed money] */
2112 if (!resident || eshkp->billct || eshkp->debit || eshkp->robbed)
2114 } else if (eshkp->billct || eshkp->debit || eshkp->robbed) {
2115 /* owe this shopkeeper money (might also owe others) */
2118 } else if (eshkp->following || ANGRY(mtmp)) {
2119 /* this shopkeeper is antagonistic (others might be too) */
2123 /* this shopkeeper's shop is on current level */
2129 /* give highest priority shopkeeper first crack */
2130 firstshk = resident ? resident
2131 : creditor ? creditor
2136 taken = inherits(firstshk, numsk, croaked);
2139 /* now handle the rest */
2140 for (mtmp = next_shkp(fmon, FALSE); mtmp;
2141 mtmp = next_shkp(mtmp2, FALSE)) {
2144 local = on_level(&eshkp->shoplevel, &u.uz);
2145 if (mtmp != firstshk) {
2147 taken |= inherits(mtmp, numsk, croaked);
2149 /* for bones: we don't want a shopless shk around */
2157 inherits(shkp, numsk, croaked)
2164 struct eshk *eshkp = ESHK(shkp);
2165 boolean take = FALSE, taken = FALSE;
2166 unsigned save_minvis = shkp->minvis;
2167 int roomno = *u.ushops;
2171 /* The simplifying principle is that first-come
2172 already took everything you had. */
2174 if (cansee(shkp->mx, shkp->my) && croaked) {
2176 if (has_head(shkp->data) && !rn2(2))
2178 Sprintf(takes, ", shakes %s %s,", mhis(shkp),
2179 mbodypart(shkp, HEAD));
2181 Strcpy(takes, "
\8eñ
\82ð
\90U
\82è
\81C");
2184 pline("%s %slooks at your corpse%s and %s.", Shknam(shkp),
2185 (!shkp->mcanmove || shkp->msleeping) ? "wakes up, " : "",
2186 takes, !inhishop(shkp) ? "disappears" : "sighs");
2188 pline("%s
\82Í%s
\82 \82È
\82½
\82Ì
\8e\80\91Ì
\82ð
\8c©
\82Ä%s%s
\81D", Shknam(shkp),
2189 (!shkp->mcanmove || shkp->msleeping) ? "
\96Ú
\82ð
\82³
\82Ü
\82·
\82Æ" : "",
2190 takes, !inhishop(shkp) ? "
\8ep
\82ð
\8fÁ
\82µ
\82½" : "
\97
\91§
\82ð
\82Â
\82¢
\82½");
2193 rouse_shk(shkp, FALSE); /* wake shk for bones */
2194 taken = (roomno == eshkp->shoproom);
2198 /* get one case out of the way: you die in the shop, the */
2199 /* shopkeeper is peaceful, nothing stolen, nothing owed. */
2200 if (roomno == eshkp->shoproom && inhishop(shkp) && !eshkp->billct
2201 && !eshkp->robbed && !eshkp->debit && NOTANGRY(shkp)
2202 && !eshkp->following && u.ugrave_arise < LOW_PM) {
2203 taken = (invent != 0);
2206 pline("%s gratefully inherits all your possessions.",
2208 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\8e\9d\82¿
\95¨
\82ð
\82 \82è
\82ª
\82½
\82
\8eó
\82¯
\82Æ
\82Á
\82½
\81D",
2214 if (eshkp->billct || eshkp->debit || eshkp->robbed) {
2215 if (roomno == eshkp->shoproom && inhishop(shkp))
2216 loss = addupbill(shkp) + eshkp->debit;
2217 if (loss < eshkp->robbed)
2218 loss = eshkp->robbed;
2222 if (eshkp->following || ANGRY(shkp) || take) {
2225 umoney = money_cnt(invent);
2227 if (!shkp->mcanmove || shkp->msleeping)
2229 Strcat(takes, "wakes up and ");
2231 Strcat(takes, "
\96Ú
\82ª
\82³
\82ß
\82é
\82Æ
\81C");
2232 if (distu(shkp->mx, shkp->my) > 2)
2234 Strcat(takes, "comes and ");
2236 Strcat(takes, "
\8bß
\82Ã
\82«
\81C");
2238 Strcat(takes, "takes");
2241 if (loss > umoney || !loss || roomno == eshkp->shoproom) {
2242 eshkp->robbed -= umoney;
2243 if (eshkp->robbed < 0L)
2246 money2mon(shkp, umoney);
2249 pline("%s %s all your possessions.", shkname(shkp), takes);
2251 pline("%s
\82Í%s
\82 \82È
\82½
\82Ì
\8e\9d\82¿
\95¨
\82·
\82×
\82Ä
\82ð
\82à
\82ç
\82Á
\82½
\81D", shkname(shkp), takes);
2253 /* where to put player's invent (after disclosure) */
2256 money2mon(shkp, loss);
2259 pline("%s %s the %ld %s %sowed %s.", Shknam(shkp),
2260 takes, loss, currency(loss),
2261 strncmp(eshkp->customer, plname, PL_NSIZ) ? "" : "you ",
2264 pline("%s
\82Í%s%s
\8eØ
\82è
\82Ä
\82¢
\82é%ld%s
\82ð
\8eó
\82¯
\82Æ
\82Á
\82½
\81D", Shknam(shkp),
2266 strncmp(eshkp->customer, plname, PL_NSIZ) ? "" : "
\82 \82È
\82½
\82ª",
2267 loss, currency(loss));
2269 /* shopkeeper has now been paid in full */
2271 eshkp->following = 0;
2275 /* in case we create bones */
2276 rouse_shk(shkp, FALSE); /* wake up */
2277 if (!inhishop(shkp))
2278 home_shk(shkp, FALSE);
2281 shkp->minvis = save_minvis;
2290 register xchar ox, oy;
2291 struct eshk *eshkp = ESHK(shkp);
2293 /* if you're not in this shk's shop room, or if you're in its doorway
2294 or entry spot, then your gear gets dumped all the way inside */
2295 if (*u.ushops != eshkp->shoproom || IS_DOOR(levl[u.ux][u.uy].typ)
2296 || (u.ux == eshkp->shk.x && u.uy == eshkp->shk.y)) {
2297 /* shk.x,shk.y is the position immediately in
2298 * front of the door -- move in one more space
2302 ox += sgn(ox - eshkp->shd.x);
2303 oy += sgn(oy - eshkp->shd.y);
2304 } else { /* already inside this shk's shop */
2308 /* finish_paybill will deposit invent here */
2309 repo.location.x = ox;
2310 repo.location.y = oy;
2311 repo.shopkeeper = shkp;
2314 /* called at game exit, after inventory disclosure but before making bones */
2318 struct monst *shkp = repo.shopkeeper;
2319 int ox = repo.location.x, oy = repo.location.y;
2321 #if 0 /* don't bother */
2322 if (ox == 0 && oy == 0)
2323 impossible("finish_paybill: no location");
2325 /* normally done by savebones(), but that's too late in this case */
2327 /* if hero has any gold left, take it into shopkeeper's possession */
2329 long umoney = money_cnt(invent);
2332 money2mon(shkp, umoney);
2334 /* transfer rest of the character's inventory to the shop floor */
2335 drop_upon_death((struct monst *) 0, (struct obj *) 0, ox, oy);
2338 /* find obj on one of the lists */
2339 STATIC_OVL struct obj *
2341 register struct bill_x *bp;
2343 register struct obj *obj;
2344 register unsigned int id = bp->bo_id;
2347 obj = o_on(id, billobjs);
2354 * Look for o_id on all lists but billobj. Return obj or NULL if not found.
2355 * Its OK for restore_timers() to call this function, there should not
2356 * be any timeouts on the billobjs chain.
2363 struct monst *mon, *mmtmp[3];
2366 /* first check various obj lists directly */
2367 if ((obj = o_on(id, invent)) != 0)
2369 if ((obj = o_on(id, fobj)) != 0)
2371 if ((obj = o_on(id, level.buriedobjlist)) != 0)
2373 if ((obj = o_on(id, migrating_objs)) != 0)
2376 /* not found yet; check inventory for members of various monst lists */
2378 mmtmp[1] = migrating_mons;
2379 mmtmp[2] = mydogs; /* for use during level changes */
2380 for (i = 0; i < 3; i++)
2381 for (mon = mmtmp[i]; mon; mon = mon->nmon)
2382 if ((obj = o_on(id, mon->minvent)) != 0)
2385 /* not found at all */
2386 return (struct obj *) 0;
2389 /* Returns the price of an arbitrary item in the shop.
2390 Returns 0 if the item doesn't belong to a shopkeeper. */
2392 get_cost_of_shop_item(obj)
2393 register struct obj *obj;
2400 && obj->oclass != COIN_CLASS
2401 && obj != uball && obj != uchain
2402 && get_obj_location(obj, &x, &y, 0)
2404 || (obj->where == OBJ_FLOOR
2405 && !obj->no_charge && costly_spot(x, y)))
2406 && (shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) != 0
2407 && inhishop(shkp)) {
2408 cost = obj->quan * get_cost(obj, shkp);
2409 if (Has_contents(obj))
2410 cost += contained_cost(obj, shkp, 0L, FALSE, FALSE);
2415 /* calculate the value that the shk will charge for [one of] an object */
2418 register struct obj *obj;
2419 register struct monst *shkp; /* if angry, impose a surcharge */
2421 long tmp = getprice(obj, FALSE),
2422 /* used to perform a single calculation even when multiple
2423 adjustments (unID'd, dunce/tourist, charisma) are made */
2424 multiplier = 1L, divisor = 1L;
2428 /* shopkeeper may notice if the player isn't very knowledgeable -
2429 especially when gem prices are concerned */
2430 if (!obj->dknown || !objects[obj->otyp].oc_name_known) {
2431 if (obj->oclass == GEM_CLASS
2432 && objects[obj->otyp].oc_material == GLASS) {
2434 /* get a value that's 'random' from game to game, but the
2435 same within the same game */
2436 boolean pseudorand =
2437 (((int) ubirthday % obj->otyp) >= obj->otyp / 2);
2439 /* all gems are priced high - real or not */
2440 switch (obj->otyp - LAST_GEM) {
2442 i = pseudorand ? DIAMOND : OPAL;
2445 i = pseudorand ? SAPPHIRE : AQUAMARINE;
2448 i = pseudorand ? RUBY : JASPER;
2450 case 4: /* yellowish brown */
2451 i = pseudorand ? AMBER : TOPAZ;
2453 case 5: /* orange */
2454 i = pseudorand ? JACINTH : AGATE;
2456 case 6: /* yellow */
2457 i = pseudorand ? CITRINE : CHRYSOBERYL;
2460 i = pseudorand ? BLACK_OPAL : JET;
2463 i = pseudorand ? EMERALD : JADE;
2465 case 9: /* violet */
2466 i = pseudorand ? AMETHYST : FLUORITE;
2469 impossible("bad glass gem %d?", obj->otyp);
2473 tmp = (long) objects[i].oc_cost;
2474 } else if (!(obj->o_id % 4)) {
2475 /* unid'd, arbitrarily impose surcharge: tmp *= 4/3 */
2480 if (uarmh && uarmh->otyp == DUNCE_CAP)
2481 multiplier *= 4L, divisor *= 3L;
2482 else if ((Role_if(PM_TOURIST) && u.ulevel < (MAXULEV / 2))
2483 || (uarmu && !uarm && !uarmc)) /* touristy shirt visible */
2484 multiplier *= 4L, divisor *= 3L;
2486 if (ACURR(A_CHA) > 18)
2488 else if (ACURR(A_CHA) == 18)
2489 multiplier *= 2L, divisor *= 3L;
2490 else if (ACURR(A_CHA) >= 16)
2491 multiplier *= 3L, divisor *= 4L;
2492 else if (ACURR(A_CHA) <= 5)
2494 else if (ACURR(A_CHA) <= 7)
2495 multiplier *= 3L, divisor *= 2L;
2496 else if (ACURR(A_CHA) <= 10)
2497 multiplier *= 4L, divisor *= 3L;
2499 /* tmp = (tmp * multiplier) / divisor [with roundoff tweak] */
2502 /* tmp = (((tmp * 10) / divisor) + 5) / 10 */
2511 /* the artifact prices in artilist[] are also used as a score bonus;
2512 inflate their shop price here without affecting score calculation */
2516 /* anger surcharge should match rile_shk's, so we do it separately
2517 from the multiplier/divisor calculation */
2518 if (shkp && ESHK(shkp)->surcharge)
2519 tmp += (tmp + 2L) / 3L;
2523 /* returns the price of a container's content. the price
2524 * of the "top" container is added in the calling functions.
2525 * a different price quoted for selling as vs. buying.
2528 contained_cost(obj, shkp, price, usell, unpaid_only)
2533 boolean unpaid_only;
2535 register struct obj *otmp;
2537 /* price of contained objects; "top" container handled by caller */
2538 for (otmp = obj->cobj; otmp; otmp = otmp->nobj) {
2539 if (otmp->oclass == COIN_CLASS)
2543 if (saleable(shkp, otmp) && !otmp->unpaid
2544 && otmp->oclass != BALL_CLASS
2545 && !(otmp->oclass == FOOD_CLASS && otmp->oeaten)
2546 && !(Is_candle(otmp)
2547 && otmp->age < 20L * (long) objects[otmp->otyp].oc_cost))
2548 price += set_cost(otmp, shkp);
2549 } else if (!otmp->no_charge && (otmp->unpaid || !unpaid_only)) {
2550 price += get_cost(otmp, shkp) * otmp->quan;
2553 if (Has_contents(otmp))
2554 price = contained_cost(otmp, shkp, price, usell, unpaid_only);
2560 /* count amount of gold inside container 'obj' and any nested containers */
2565 register struct obj *otmp;
2566 register long value = 0L;
2568 /* accumulate contained gold */
2569 for (otmp = obj->cobj; otmp; otmp = otmp->nobj)
2570 if (otmp->oclass == COIN_CLASS)
2571 value += otmp->quan;
2572 else if (Has_contents(otmp))
2573 value += contained_gold(otmp);
2579 dropped_container(obj, shkp, sale)
2580 register struct obj *obj;
2581 register struct monst *shkp;
2582 register boolean sale;
2584 register struct obj *otmp;
2586 /* the "top" container is treated in the calling fn */
2587 for (otmp = obj->cobj; otmp; otmp = otmp->nobj) {
2588 if (otmp->oclass == COIN_CLASS)
2591 if (!otmp->unpaid && !(sale && saleable(shkp, otmp)))
2592 otmp->no_charge = 1;
2594 if (Has_contents(otmp))
2595 dropped_container(otmp, shkp, sale);
2600 picked_container(obj)
2601 register struct obj *obj;
2603 register struct obj *otmp;
2605 /* the "top" container is treated in the calling fn */
2606 for (otmp = obj->cobj; otmp; otmp = otmp->nobj) {
2607 if (otmp->oclass == COIN_CLASS)
2610 if (otmp->no_charge)
2611 otmp->no_charge = 0;
2613 if (Has_contents(otmp))
2614 picked_container(otmp);
2619 special_stock(obj, shkp, quietly)
2624 /* for unique situations */
2625 if (ESHK(shkp)->shoptype == CANDLESHOP
2626 && obj->otyp == CANDELABRUM_OF_INVOCATION) {
2628 if (is_izchak(shkp, TRUE) && !u.uevent.invoked) {
2629 if (Deaf || muteshk(shkp)) {
2631 pline("%s seems %s that you want to sell that.",
2633 (obj->spe < 7) ? "horrified" : "concerned");
2635 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",
2637 (obj->spe < 7) ? "
\8b°
\82ê" : "
\90S
\94z
\82µ");
2641 verbalize("No thanks, I'd hang onto that if I were you.");
2643 verbalize("
\82¢
\82â
\81C
\82¢
\82ç
\82È
\82¢
\81D
\8e\84\82È
\82ç
\82»
\82ê
\82ð
\8eè
\95ú
\82³
\82È
\82¢
\82Ë
\81D");
2647 "You'll need %d%s candle%s to go along with it.",
2648 (7 - obj->spe), (obj->spe > 0) ? " more" : "",
2649 plur(7 - obj->spe));
2652 "
\82»
\82ê
\82ð
\8eg
\82¤
\82É
\82Í%s%d
\96{
\82Ì
\82ë
\82¤
\82»
\82
\82ª
\95K
\97v
\82¾
\81D",
2653 (obj->spe > 0) ? "
\82 \82Æ" : "", (7 - obj->spe));
2655 /* [what if hero is already carrying enough candles?
2656 should Izchak explain how to attach them instead?] */
2659 if (!Deaf && !muteshk(shkp))
2661 verbalize("I won't stock that. Take it out of here!");
2663 verbalize("
\82»
\82ê
\82Í
\8ed
\93ü
\82ê
\82È
\82¢
\82æ
\81D
\8e\9d\82Á
\82Ä
\82¢
\82«
\82È
\82³
\82¢
\81I");
2666 pline("%s shakes %s %s in refusal.",
2669 mbodypart(shkp, HEAD));
2671 pline("%s
\82Í%s
\82ð
\90U
\82Á
\82Ä
\8b\91\94Û
\82µ
\82½
\81D",
2673 mbodypart(shkp, HEAD));
2682 /* calculate how much the shk will pay when buying [all of] an object */
2685 register struct obj *obj;
2686 register struct monst *shkp;
2688 long tmp = getprice(obj, TRUE) * obj->quan, multiplier = 1L, divisor = 1L;
2690 if (uarmh && uarmh->otyp == DUNCE_CAP)
2692 else if ((Role_if(PM_TOURIST) && u.ulevel < (MAXULEV / 2))
2693 || (uarmu && !uarm && !uarmc)) /* touristy shirt visible */
2698 /* shopkeeper may notice if the player isn't very knowledgeable -
2699 especially when gem prices are concerned */
2700 if (!obj->dknown || !objects[obj->otyp].oc_name_known) {
2701 if (obj->oclass == GEM_CLASS) {
2702 /* different shop keepers give different prices */
2703 if (objects[obj->otyp].oc_material == GEMSTONE
2704 || objects[obj->otyp].oc_material == GLASS) {
2705 tmp = (obj->otyp % (6 - shkp->m_id % 3));
2706 tmp = (tmp + 3) * obj->quan;
2708 } else if (tmp > 1L && !(shkp->m_id % 4))
2709 multiplier *= 3L, divisor *= 4L;
2713 /* [see get_cost()] */
2721 /* avoid adjusting nonzero to zero */
2726 /* (no adjustment for angry shk here) */
2730 /* called when an item's value has been enhanced; if it happens to be
2731 on any shop bill, update that bill to reflect the new higher price
2732 [if the new price drops for some reason, keep the old one in place] */
2734 alter_cost(obj, amt)
2736 long amt; /* if 0, use regular shop pricing, otherwise force amount;
2737 if negative, use abs(amt) even if it's less than old cost */
2739 struct bill_x *bp = 0;
2743 for (shkp = next_shkp(fmon, TRUE); shkp; shkp = next_shkp(shkp, TRUE))
2744 if ((bp = onbill(obj, shkp, TRUE)) != 0) {
2745 new_price = !amt ? get_cost(obj, shkp) : (amt < 0L) ? -amt : amt;
2746 if (new_price > bp->price || amt < 0L) {
2747 bp->price = new_price;
2755 /* called from doinv(invent.c) for inventory of unpaid objects */
2757 unpaid_cost(unp_obj, include_contents)
2758 struct obj *unp_obj; /* known to be unpaid or contain unpaid */
2759 boolean include_contents;
2761 struct bill_x *bp = (struct bill_x *) 0;
2766 if (!get_obj_location(unp_obj, &ox, &oy, BURIED_TOO | CONTAINED_TOO))
2767 ox = u.ux, oy = u.uy; /* (shouldn't happen) */
2768 if ((shkp = shop_keeper(*in_rooms(ox, oy, SHOPBASE))) != 0) {
2769 bp = onbill(unp_obj, shkp, TRUE);
2771 /* didn't find shk? try searching bills */
2772 for (shkp = next_shkp(fmon, TRUE); shkp;
2773 shkp = next_shkp(shkp->nmon, TRUE))
2774 if ((bp = onbill(unp_obj, shkp, TRUE)) != 0)
2778 /* onbill() gave no message if unexpected problem occurred */
2779 if (!shkp || (unp_obj->unpaid && !bp)) {
2780 impossible("unpaid_cost: object wasn't on any bill.");
2783 amt = unp_obj->quan * bp->price;
2784 if (include_contents && Has_contents(unp_obj))
2785 amt = contained_cost(unp_obj, shkp, amt, FALSE, TRUE);
2791 add_one_tobill(obj, dummy, shkp)
2800 if (!billable(&shkp, obj, *u.ushops, TRUE))
2804 if (eshkp->billct == BILLSZ) {
2806 You("got that for free!");
2808 You("
\82»
\82ê
\82ð
\82½
\82¾
\82Å
\8eè
\82É
\93ü
\82ê
\82½
\81I");
2812 /* normally bill_p gets set up whenever you enter the shop, but obj
2813 might be going onto the bill because hero just snagged it with
2814 a grappling hook from outside without ever having been inside */
2816 eshkp->bill_p = &(eshkp->bill[0]);
2818 bct = eshkp->billct;
2819 bp = &(eshkp->bill_p[bct]);
2820 bp->bo_id = obj->o_id;
2821 bp->bquan = obj->quan;
2822 if (dummy) { /* a dummy object must be inserted into */
2823 bp->useup = 1; /* the billobjs chain here. crucial for */
2824 add_to_billobjs(obj); /* eating floorfood in shop. see eat.c */
2827 bp->price = get_cost(obj, shkp);
2833 add_to_billobjs(obj)
2836 if (obj->where != OBJ_FREE)
2837 panic("add_to_billobjs: obj not free");
2839 obj_stop_timers(obj);
2841 obj->nobj = billobjs;
2843 obj->where = OBJ_ONBILL;
2846 /* recursive billing of objects within containers. */
2848 bill_box_content(obj, ininv, dummy, shkp)
2849 register struct obj *obj;
2850 register boolean ininv, dummy;
2851 register struct monst *shkp;
2853 register struct obj *otmp;
2855 for (otmp = obj->cobj; otmp; otmp = otmp->nobj) {
2856 if (otmp->oclass == COIN_CLASS)
2859 /* the "top" box is added in addtobill() */
2860 if (!otmp->no_charge)
2861 add_one_tobill(otmp, dummy, shkp);
2862 if (Has_contents(otmp))
2863 bill_box_content(otmp, ininv, dummy, shkp);
2867 /* shopkeeper tells you what you bought or sold, sometimes partly IDing it */
2869 shk_names_obj(shkp, obj, fmt, amt, arg)
2872 const char *fmt; /* "%s %ld %s %s", doname(obj), amt, plur(amt), arg */
2877 char *obj_name, fmtbuf[BUFSZ];
2881 boolean was_unknown = !obj->dknown;
2884 /* Use real name for ordinary weapons/armor, and spell-less
2885 * scrolls/books (that is, blank and mail), but only if the
2886 * object is within the shk's area of interest/expertise.
2888 if (!objects[obj->otyp].oc_magic && saleable(shkp, obj)
2889 && (obj->oclass == WEAPON_CLASS || obj->oclass == ARMOR_CLASS
2890 || obj->oclass == SCROLL_CLASS || obj->oclass == SPBOOK_CLASS
2891 || obj->otyp == MIRROR)) {
2892 was_unknown |= !objects[obj->otyp].oc_name_known;
2893 makeknown(obj->otyp);
2895 obj_name = doname(obj);
2896 /* Use an alternate message when extra information is being provided */
2897 #if 0 /*JP*//*
\93ú
\96{
\8cê
\82Å
\82Í
\93¯
\82¶
\88µ
\82¢*/
2899 Sprintf(fmtbuf, "%%s; you %s", fmt);
2900 obj_name[0] = highc(obj_name[0]);
2901 pline(fmtbuf, obj_name, (obj->quan > 1L) ? "them" : "it", amt,
2904 You(fmt, obj_name, amt, plur(amt), arg);
2907 You(fmt, obj_name, amt, "", arg);
2911 /* decide whether a shopkeeper thinks an item belongs to her */
2913 billable(shkpp, obj, roomno, reset_nocharge)
2914 struct monst **shkpp; /* in: non-null if shk has been validated; out: shk */
2917 boolean reset_nocharge;
2919 struct monst *shkp = *shkpp;
2921 /* if caller hasn't supplied a shopkeeper, look one up now */
2925 shkp = shop_keeper(roomno);
2926 if (!shkp || !inhishop(shkp))
2930 /* perhaps we threw it away earlier */
2931 if (onbill(obj, shkp, FALSE)
2932 || (obj->oclass == FOOD_CLASS && obj->oeaten))
2934 /* outer container might be marked no_charge but still have contents
2935 which should be charged for; clear no_charge when picking things up */
2936 if (obj->no_charge) {
2937 if (!Has_contents(obj) || (contained_gold(obj) == 0L
2938 && contained_cost(obj, shkp, 0L, FALSE,
2939 !reset_nocharge) == 0L))
2940 shkp = 0; /* not billable */
2941 if (reset_nocharge && !shkp && obj->oclass != COIN_CLASS) {
2943 if (Has_contents(obj))
2944 picked_container(obj); /* clear no_charge */
2947 return shkp ? TRUE : FALSE;
2951 addtobill(obj, ininv, dummy, silent)
2953 boolean ininv, dummy, silent;
2955 struct monst *shkp = 0;
2956 long ltmp, cltmp, gltmp;
2960 if (!billable(&shkp, obj, *u.ushops, TRUE))
2963 if (obj->oclass == COIN_CLASS) {
2964 costly_gold(obj->ox, obj->oy, obj->quan);
2966 } else if (ESHK(shkp)->billct == BILLSZ) {
2969 You("got that for free!");
2971 You("
\82»
\82ê
\82ð
\82½
\82¾
\82Å
\8eè
\82É
\93ü
\82ê
\82½
\81I");
2975 ltmp = cltmp = gltmp = 0L;
2976 container = Has_contents(obj);
2978 if (!obj->no_charge)
2979 ltmp = get_cost(obj, shkp);
2981 if (obj->no_charge && !container) {
2987 cltmp = contained_cost(obj, shkp, cltmp, FALSE, FALSE);
2988 gltmp = contained_gold(obj);
2991 add_one_tobill(obj, dummy, shkp);
2993 bill_box_content(obj, ininv, dummy, shkp);
2994 picked_container(obj); /* reset contained obj->no_charge */
2999 costly_gold(obj->ox, obj->oy, gltmp);
3006 contentscount = count_unpaid(obj->cobj);
3007 } else { /* !container */
3008 add_one_tobill(obj, dummy, shkp);
3012 if (!Deaf && !muteshk(shkp) && !silent) {
3017 pline("%s has no interest in %s.", Shknam(shkp), the(xname(obj)));
3019 pline("%s
\82Í%s
\82É
\8b»
\96¡
\82ð
\8e¦
\82³
\82È
\82¢
\81D", Shknam(shkp), the(xname(obj)));
3024 pline("%s will cost you %ld %s%s.", The(xname(obj)), ltmp,
3025 currency(ltmp), (obj->quan > 1L) ? " each" : "");
3027 pline("%s
\82Í%s
\82½
\82Á
\82½
\82Ì%ld%s
\82¾
\81D", xname(obj),
3028 (obj->quan > 1L) ? "
\88ê
\82Â" : "", ltmp, currency(ltmp));
3031 long save_quan = obj->quan;
3034 Strcpy(buf, "\"For you, ");
3036 Strcat(buf, "scum;");
3038 append_honorific(buf);
3039 Strcat(buf, "; only");
3042 Strcpy(buf, "
\81u");
3044 Strcat(buf, "
\82±
\82Ì
\83N
\83\
\82Á
\82½
\82ê
\81C");
3046 append_honorific(buf);
3047 Strcat(buf, "
\81C");
3050 obj->quan = 1L; /* fool xname() into giving singular */
3052 pline("%s %ld %s %s %s%s.\"", buf, ltmp, currency(ltmp),
3053 (save_quan > 1L) ? "per"
3054 : (contentscount && !obj->unpaid)
3055 ? "for the contents of this"
3058 (contentscount && obj->unpaid) ? and_its_contents : "");
3060 pline("%s%s%s
\82½
\82Á
\82½
\82Ì%ld%s
\82¾
\81D
\81v", buf, xname(obj),
3061 (save_quan > 1L) ? "
\82Í
\88ê
\82Â" : (contentscount && !obj->unpaid)
3062 ? "
\82Ì
\92\86\90g
\82Í"
3064 ltmp, currency(ltmp));
3066 obj->quan = save_quan;
3068 } else if (!silent) {
3071 pline_The("list price of %s%s%s is %ld %s%s.",
3072 (contentscount && !obj->unpaid) ? the_contents_of : "",
3074 (contentscount && obj->unpaid) ? and_its_contents : "",
3075 ltmp, currency(ltmp), (obj->quan > 1L) ? " each" : "");
3077 pline_The("%s%s%s%s
\82½
\82Á
\82½
\82Ì%ld%s
\82¾.",
3079 (contentscount && !obj->unpaid) ? "
\82Ì
\92\86\90g
\82Í" : "",
3080 (contentscount && obj->unpaid) ? and_its_contents : "",
3081 (obj->quan > 1L) ? "
\82»
\82ê
\82¼
\82ê" : "", ltmp, currency(ltmp));
3085 pline("%s does not notice.", Shknam(shkp));
3087 pline("%s
\82Í
\8bC
\82ª
\82Â
\82¢
\82Ä
\82¢
\82È
\82¢
\81D", Shknam(shkp));
3092 append_honorific(buf)
3095 /* (chooses among [0]..[3] normally; [1]..[4] after the
3096 Wizard has been killed or invocation ritual performed) */
3098 static const char *const honored[] = { "good", "honored", "most gracious",
3100 "most renowned and sacred" };
3102 static const char *const honored[] = {
3103 "
\82â
\82\9f", "
\82â
\82\9f\81C
\96¼
\97_
\82 \82é", "
\82â
\82\9f\81C
\8fã
\95i
\82È",
3104 "
\82â
\82\9f\81C
\91¸
\8ch
\82·
\82é",
3105 "
\82â
\82\9f\81C
\8d\82\96¼
\82Å
\90_
\90¹
\82È"
3108 Strcat(buf, honored[rn2(SIZE(honored) - 1) + u.uevent.udemigod]);
3109 #if 0 /*JP*//*
\93ú
\96{
\8cê
\82Å
\82Í
\82»
\82±
\82Ü
\82Å
\82µ
\82È
\82¢*/
3110 if (is_vampire(youmonst.data))
3111 Strcat(buf, (flags.female) ? " dark lady" : " dark lord");
3112 else if (is_elf(youmonst.data))
3113 Strcat(buf, (flags.female) ? " hiril" : " hir");
3117 Strcat(buf, !is_human(youmonst.data) ? " creature" : (flags.female)
3121 Strcat(buf, !is_human(youmonst.data) ? "
\90¶
\95¨
\82³
\82ñ" : (flags.female)
3122 ? "
\82¨
\8fì
\82³
\82ñ"
3123 : "
\92U
\93ß
\82³
\82ñ");
3128 splitbill(obj, otmp)
3129 register struct obj *obj, *otmp;
3131 /* otmp has been split off from obj */
3132 register struct bill_x *bp;
3134 register struct monst *shkp = shop_keeper(*u.ushops);
3136 if (!shkp || !inhishop(shkp)) {
3137 impossible("splitbill: no resident shopkeeper??");
3140 bp = onbill(obj, shkp, FALSE);
3142 impossible("splitbill: not on bill?");
3145 if (bp->bquan < otmp->quan) {
3146 impossible("Negative quantity on bill??");
3148 if (bp->bquan == otmp->quan) {
3149 impossible("Zero quantity on bill??");
3151 bp->bquan -= otmp->quan;
3153 if (ESHK(shkp)->billct == BILLSZ)
3157 bp = &(ESHK(shkp)->bill_p[ESHK(shkp)->billct]);
3158 bp->bo_id = otmp->o_id;
3159 bp->bquan = otmp->quan;
3162 ESHK(shkp)->billct++;
3167 sub_one_frombill(obj, shkp)
3168 register struct obj *obj;
3169 register struct monst *shkp;
3171 register struct bill_x *bp;
3173 if ((bp = onbill(obj, shkp, FALSE)) != 0) {
3174 register struct obj *otmp;
3177 if (bp->bquan > obj->quan) {
3180 otmp->oextra = (struct oextra *) 0;
3181 bp->bo_id = otmp->o_id = context.ident++;
3182 otmp->where = OBJ_FREE;
3183 otmp->quan = (bp->bquan -= obj->quan);
3184 otmp->owt = 0; /* superfluous */
3186 add_to_billobjs(otmp);
3189 ESHK(shkp)->billct--;
3192 /* DRS/NS 2.2.6 messes up -- Peter Kendell */
3193 int indx = ESHK(shkp)->billct;
3195 *bp = ESHK(shkp)->bill_p[indx];
3198 *bp = ESHK(shkp)->bill_p[ESHK(shkp)->billct];
3201 } else if (obj->unpaid) {
3202 impossible("sub_one_frombill: unpaid object not on bill");
3207 /* recursive check of unpaid objects within nested containers. */
3209 subfrombill(obj, shkp)
3210 register struct obj *obj;
3211 register struct monst *shkp;
3213 register struct obj *otmp;
3215 sub_one_frombill(obj, shkp);
3217 if (Has_contents(obj))
3218 for (otmp = obj->cobj; otmp; otmp = otmp->nobj) {
3219 if (otmp->oclass == COIN_CLASS)
3222 if (Has_contents(otmp))
3223 subfrombill(otmp, shkp);
3225 sub_one_frombill(otmp, shkp);
3230 stolen_container(obj, shkp, price, ininv)
3240 /* the price of contained objects; caller handles top container */
3241 for (otmp = obj->cobj; otmp; otmp = otmp->nobj) {
3242 if (otmp->oclass == COIN_CLASS)
3245 if (!billable(&shkp, otmp, ESHK(shkp)->shoproom, TRUE)) {
3246 /* billable() returns false for objects already on bill */
3247 if ((bp = onbill(otmp, shkp, FALSE)) == 0)
3249 /* this assumes that we're being called by stolen_value()
3250 (or by a recursive call to self on behalf of it) where
3251 the cost of this object is about to be added to shop
3252 debt in place of having it remain on the current bill */
3253 billamt = bp->bquan * bp->price;
3254 sub_one_frombill(otmp, shkp); /* avoid double billing */
3259 else if (ininv ? otmp->unpaid : !otmp->no_charge)
3260 price += otmp->quan * get_cost(otmp, shkp);
3262 if (Has_contents(otmp))
3263 price = stolen_container(otmp, shkp, price, ininv);
3270 stolen_value(obj, x, y, peaceful, silent)
3273 boolean peaceful, silent;
3275 long value = 0L, gvalue = 0L, billamt = 0L;
3276 char roomno = *in_rooms(x, y, SHOPBASE);
3278 struct monst *shkp = 0;
3280 if (!billable(&shkp, obj, roomno, FALSE)) {
3281 /* things already on the bill yield a not-billable result, so
3282 we need to check bill before deciding that shk doesn't care */
3283 if ((bp = onbill(obj, shkp, FALSE)) == 0)
3285 /* shk does care; take obj off bill to avoid double billing */
3286 billamt = bp->bquan * bp->price;
3287 sub_one_frombill(obj, shkp);
3290 if (obj->oclass == COIN_CLASS) {
3291 gvalue += obj->quan;
3295 else if (!obj->no_charge)
3296 value += obj->quan * get_cost(obj, shkp);
3298 if (Has_contents(obj)) {
3300 (obj->where == OBJ_INVENT || obj->where == OBJ_FREE);
3302 value += stolen_container(obj, shkp, 0L, ininv);
3304 gvalue += contained_gold(obj);
3308 if (gvalue + value == 0L)
3314 boolean credit_use = !!ESHK(shkp)->credit;
3315 value = check_credit(value, shkp);
3316 /* 'peaceful' affects general treatment, but doesn't affect
3317 * the fact that other code expects that all charges after the
3318 * shopkeeper is angry are included in robbed, not debit */
3320 ESHK(shkp)->robbed += value;
3322 ESHK(shkp)->debit += value;
3325 const char *still = "";
3328 if (ESHK(shkp)->credit) {
3330 You("have %ld %s credit remaining.", ESHK(shkp)->credit,
3331 currency(ESHK(shkp)->credit));
3333 You("%ld%s
\82Ì
\97a
\82¯
\8bà
\82ª
\8ec
\82Á
\82Ä
\82¢
\82é
\81D", ESHK(shkp)->credit,
3334 currency(ESHK(shkp)->credit));
3337 } else if (!value) {
3339 You("have no credit remaining.");
3341 pline("
\97a
\82¯
\8bà
\82Í
\82È
\82
\82È
\82Á
\82½
\81D");
3347 still = "
\82³
\82ç
\82É";
3349 if (obj->oclass == COIN_CLASS)
3351 You("%sowe %s %ld %s!", still, shkname(shkp), value,
3354 You("%s%s
\82É%ld%s
\82Ì
\8eØ
\82è
\82ð
\82Â
\82
\82Á
\82½
\81I", still, shkname(shkp), value,
3359 You("%sowe %s %ld %s for %s!", still, shkname(shkp),
3360 value, currency(value), (obj->quan > 1L) ? "them" : "it");
3362 You("%s%s
\82É%ld%s
\82Ì
\8eØ
\82è
\82ð
\82Â
\82
\82Á
\82½
\81I", still, mon_nam(shkp), value,
3367 ESHK(shkp)->robbed += value;
3370 if (canseemon(shkp)) {
3372 Norep("%s booms: \"%s, you are a thief!\"",
3373 Shknam(shkp), plname);
3375 Norep("%s
\82Í
\8b©
\82ñ
\82¾
\81F
\81u%s
\81C
\91Ò
\82Ä
\81I
\82±
\82Ì
\82Ç
\82ë
\82Ú
\82¤
\82ß
\81I
\81v",
3376 Shknam(shkp), plname);
3380 Norep("You hear a scream, \"Thief!\"");
3382 Norep("
\8bà
\90Ø
\82è
\90º
\82ð
\95·
\82¢
\82½
\81C
\81u
\91Ò
\82Ä
\81I
\82±
\82Ì
\82Ç
\82ë
\82Ú
\82¤
\82ß
\81I
\81v");
3385 (void) angry_guards(FALSE);
3390 /* auto-response flag for/from "sell foo?" 'a' => 'y', 'q' => 'n' */
3391 static char sell_response = 'a';
3392 static int sell_how = SELL_NORMAL;
3393 /* can't just use sell_response='y' for auto_credit because the 'a' response
3394 shouldn't carry over from ordinary selling to credit selling */
3395 static boolean auto_credit = FALSE;
3398 sellobj_state(deliberate)
3401 /* If we're deliberately dropping something, there's no automatic
3402 response to the shopkeeper's "want to sell" query; however, if we
3403 accidentally drop anything, the shk will buy it/them without asking.
3404 This retains the old pre-query risk that slippery fingers while in
3405 shops entailed: you drop it, you've lost it.
3407 sell_response = (deliberate != SELL_NORMAL) ? '\0' : 'a';
3408 sell_how = deliberate;
3409 auto_credit = FALSE;
3414 register struct obj *obj;
3417 register struct monst *shkp;
3418 register struct eshk *eshkp;
3419 long ltmp = 0L, cltmp = 0L, gltmp = 0L, offer, shkmoney;
3420 boolean saleitem, cgold = FALSE, container = Has_contents(obj);
3421 boolean isgold = (obj->oclass == COIN_CLASS);
3422 boolean only_partially_your_contents = FALSE;
3424 if (!*u.ushops) /* do cheapest exclusion test first */
3426 if (!(shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) || !inhishop(shkp))
3428 if (!costly_spot(x, y))
3431 if (obj->unpaid && !container && !isgold) {
3432 sub_one_frombill(obj, shkp);
3436 /* find the price of content before subfrombill */
3437 cltmp = contained_cost(obj, shkp, cltmp, TRUE, FALSE);
3438 /* find the value of contained gold */
3439 gltmp += contained_gold(obj);
3440 cgold = (gltmp > 0L);
3443 saleitem = saleable(shkp, obj);
3444 if (!isgold && !obj->unpaid && saleitem)
3445 ltmp = set_cost(obj, shkp);
3447 offer = ltmp + cltmp;
3449 /* get one case out of the way: nothing to sell, and no gold */
3450 if (!(isgold || cgold)
3451 && ((offer + gltmp) == 0L || sell_how == SELL_DONTSELL)) {
3452 boolean unpaid = is_unpaid(obj);
3455 dropped_container(obj, shkp, FALSE);
3459 subfrombill(obj, shkp);
3463 if (!unpaid && (sell_how != SELL_DONTSELL)
3464 && !special_stock(obj, shkp, FALSE))
3466 pline("%s seems uninterested.", Shknam(shkp));
3468 pline("%s
\82Í
\8b»
\96¡
\82ª
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Shknam(shkp));
3472 /* you dropped something of your own - probably want to sell it */
3473 rouse_shk(shkp, TRUE); /* wake up sleeping or paralyzed shk */
3476 if (ANGRY(shkp)) { /* they become shop-objects, no pay */
3477 if (!Deaf && !muteshk(shkp))
3479 verbalize("Thank you, scum!");
3481 verbalize("
\82 \82è
\82ª
\82Æ
\82æ
\81C
\82±
\82Ì
\83N
\83\
\82Á
\82½
\82ê
\81I");
3484 pline("%s smirks with satisfaction.", Shknam(shkp));
3486 pline("%s
\82Í
\96\9e\91«
\82µ
\82Ä
\8dì
\82è
\8fÎ
\82¢
\82ð
\95\82\82©
\82×
\82½
\81D", Shknam(shkp));
3487 subfrombill(obj, shkp);
3491 if (eshkp->robbed) { /* shkp is not angry? */
3496 if ((eshkp->robbed -= offer < 0L))
3498 if (offer && !Deaf && !muteshk(shkp))
3501 "Thank you for your contribution to restock this recently plundered shop.");
3503 "
\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");
3504 subfrombill(obj, shkp);
3508 if (isgold || cgold) {
3512 if (eshkp->debit >= gltmp) {
3513 if (eshkp->loan) { /* you carry shop's gold */
3514 if (eshkp->loan >= gltmp)
3515 eshkp->loan -= gltmp;
3519 eshkp->debit -= gltmp;
3521 Your("debt is %spaid off.", eshkp->debit ? "partially " : "");
3523 Your("
\8eØ
\8bà
\82Í%s
\8ex
\95¥
\82í
\82ê
\82½
\81D", eshkp->debit ? "
\88ê
\95\94" : "");
3525 long delta = gltmp - eshkp->debit;
3527 eshkp->credit += delta;
3532 Your("debt is paid off.");
3534 Your("
\8eØ
\8bà
\82Í
\8ex
\95¥
\82í
\82ê
\82½
\81D");
3536 if (eshkp->credit == delta)
3538 You("have established %ld %s credit.", delta,
3541 pline("%ld%s
\82ð
\97a
\82¯
\82½
\81D", delta,
3546 pline("%ld %s added to your credit; total is now %ld %s.",
3547 delta, currency(delta), eshkp->credit,
3548 currency(eshkp->credit));
3550 pline("
\97a
\82¯
\8bà
\82É%ld%s
\92Ç
\89Á
\82³
\82ê
\82½;
\8d\87\8cv
\82Í%ld%s
\82É
\82È
\82Á
\82½
\81D.",
3551 delta, currency(delta), eshkp->credit,
3552 currency(eshkp->credit));
3556 if (!offer || sell_how == SELL_DONTSELL) {
3559 dropped_container(obj, shkp, FALSE);
3562 subfrombill(obj, shkp);
3568 if ((!saleitem && !(container && cltmp > 0L)) || eshkp->billct == BILLSZ
3569 || obj->oclass == BALL_CLASS || obj->oclass == CHAIN_CLASS
3570 || offer == 0L || (obj->oclass == FOOD_CLASS && obj->oeaten)
3572 && obj->age < 20L * (long) objects[obj->otyp].oc_cost)) {
3574 pline("%s seems uninterested%s.", Shknam(shkp),
3575 cgold ? " in the rest" : "");
3577 pline("%s
\82Í%s
\8b»
\96¡
\82ª
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Shknam(shkp),
3578 cgold ? "
\8ec
\82è
\95¨
\82É
\82Í" : "");
3581 dropped_container(obj, shkp, FALSE);
3586 shkmoney = money_cnt(shkp->minvent);
3588 char c, qbuf[BUFSZ];
3592 long tmpcr = ((offer * 9L) / 10L) + (offer <= 1L);
3594 if (sell_how == SELL_NORMAL || auto_credit) {
3595 c = sell_response = 'y';
3596 } else if (sell_response != 'n') {
3598 pline("%s cannot pay you at present.", shkname(shkp));
3600 pline("%s
\82Í
\8d¡
\82Ì
\82Æ
\82±
\82ë
\82Í
\8ex
\95¥
\82¦
\82È
\82¢
\81D", Monnam(shkp));
3602 Sprintf(qbuf, "Will you accept %ld %s in credit for ", tmpcr,
3604 c = ynaq(safe_qbuf(qbuf, qbuf, "?", obj, doname, thesimpleoname,
3605 (obj->quan == 1L) ? "that" : "those"));
3607 Sprintf(qsfx, "
\82É
\82Â
\82¢
\82Ä%ld%s
\82Ì
\97a
\82¯
\8bà
\82ð
\8eó
\82¯
\82¢
\82ê
\82Ü
\82·
\82©
\81H", tmpcr,
3609 c = ynaq(safe_qbuf(qbuf, "", qsfx, obj, doname, thesimpleoname,
3616 } else /* previously specified "quit" */
3623 (sell_how != SELL_NORMAL)
3624 ? "traded %s for %ld zorkmid%s in %scredit."
3625 : "relinquish %s and acquire %ld zorkmid%s in %scredit.",
3626 tmpcr, (eshkp->credit > 0L) ? "additional " : "");
3630 (sell_how != SELL_NORMAL)
3631 ? "%s
\82ð
\8bà
\89Ý%ld
\96\87\95ª
\82Ì
\97a
\82¯
\8bà
\82Å
\8eó
\82¯
\82Æ
\82Á
\82½%s
\81D"
3632 : "%s
\82ð
\93n
\82µ
\81C
\8bà
\89Ý%ld
\96\87\95ª
\82Ì
\97a
\82¯
\8bà
\82ð
\93¾
\82½%s
\81D",
3635 eshkp->credit += tmpcr;
3636 subfrombill(obj, shkp);
3639 sell_response = 'n';
3641 dropped_container(obj, shkp, FALSE);
3644 subfrombill(obj, shkp);
3647 char qbuf[BUFSZ], qsfx[BUFSZ];
3649 boolean short_funds = (offer > shkmoney), one;
3651 boolean short_funds = (offer > shkmoney);
3656 if (!sell_response) {
3657 long yourc = 0L, shksc;
3660 /* number of items owned by shk */
3661 shksc = count_contents(obj, TRUE, TRUE, FALSE);
3662 /* number of items owned by you (total - shksc) */
3663 yourc = count_contents(obj, TRUE, TRUE, TRUE) - shksc;
3664 only_partially_your_contents = shksc && yourc;
3667 "<shk> offers * for ..." query formatting.
3669 "... your <object>. Sell it?"
3670 "... your <objects>. Sell them?"
3671 A container is either owned by the hero, or already
3672 owned by the shk (!ltmp), or the shk isn't interested
3673 in buying it (also !ltmp). It's either empty (!cltmp)
3674 or it has contents owned by the hero or it has some
3675 contents owned by the hero and others by the shk.
3676 (The case where it has contents already entirely owned
3677 by the shk is treated the same was if it were empty
3678 since the hero isn't selling any of those contents.)
3680 "... your <empty bag>. Sell it?"
3681 "... your <bag> and its contents. Sell them?"
3682 "... your <bag> and item inside. Sell them?"
3683 "... your <bag> and items inside. Sell them?"
3685 "... your item in the <bag>. Sell it?"
3686 "... your items in the <bag>. Sell them?"
3689 Sprintf(qbuf, "%s offers%s %ld gold piece%s for %s%s ",
3690 shkname(shkp), short_funds ? " only" : "", offer,
3693 ? ((yourc == 1L) ? "your item in " : "your items in ")
3695 obj->unpaid ? "the" : "your");
3696 one = obj->unpaid ? (yourc == 1L) : (obj->quan == 1L && !cltmp);
3697 Sprintf(qsfx, "%s. Sell %s?",
3699 ? (only_partially_your_contents
3700 ? ((yourc == 1L) ? " and item inside"
3701 : " and items inside")
3704 one ? "it" : "them");
3705 (void) safe_qbuf(qbuf, qbuf, qsfx, obj, xname, simpleonames,
3706 one ? "that" : "those");
3709 "%s
\82Í
\82 \82È
\82½
\82Ì", Monnam(shkp));
3711 "%s
\82É%ld
\82Ì
\92l%s
\81D
\94\84\82è
\82Ü
\82·
\82©
\81H",
3712 (!ltmp && cltmp) ? "
\82Ì
\92\86\90g" : "",
3714 short_funds ? "
\82µ
\82©
\82Â
\82¯
\82È
\82©
\82Á
\82½" : "
\82ð
\82Â
\82¯
\82½");
3715 (void) safe_qbuf(qbuf, qbuf, qsfx, obj, xname, simpleonames,
3719 qbuf[0] = '\0'; /* just to pacify lint */
3721 switch (sell_response ? sell_response : ynaq(qbuf)) {
3723 sell_response = 'n';
3727 dropped_container(obj, shkp, FALSE);
3730 subfrombill(obj, shkp);
3733 sell_response = 'y';
3737 dropped_container(obj, shkp, TRUE);
3738 if (!obj->unpaid && !saleitem)
3740 subfrombill(obj, shkp);
3743 shk_names_obj(shkp, obj,
3744 (sell_how != SELL_NORMAL)
3745 ? ((!ltmp && cltmp && only_partially_your_contents)
3746 ? "sold some items inside %s for %ld gold piece%s.%s"
3747 : "sold %s for %ld gold piece%s.%s")
3748 : "relinquish %s and receive %ld gold piece%s in compensation.%s",
3751 shk_names_obj(shkp, obj,
3752 (sell_how != SELL_NORMAL)
3753 ? ((!ltmp && cltmp && only_partially_your_contents)
3754 ? "%s
\82Ì
\92\86\90g
\82ð
\8bà
\89Ý%ld
\96\87\82Å
\94\84\82Á
\82½%s
\81D%s"
3755 : "%s
\82ð
\8bà
\89Ý%ld
\96\87\82Å
\94\84\82Á
\82½%s
\81D%s")
3756 : "%s
\82ð
\93n
\82µ
\81C
\8bà
\89Ý%ld
\96\87\82Ì
\91ã
\8f\9e\82ð
\8eó
\82¯
\82Æ
\82Á
\82½%s
\81D%s",
3761 impossible("invalid sell response");
3768 int mode; /* 0: deliver count 1: paged */
3771 void sasc_bug(struct obj *, unsigned);
3775 struct bill_x *bp, *end_bp;
3781 shkp = shop_keeper(*u.ushops);
3782 if (!shkp || !inhishop(shkp)) {
3784 impossible("doinvbill: no shopkeeper?");
3790 /* count expended items, so that the `I' command can decide
3791 whether to include 'x' in its prompt string */
3792 int cnt = !eshkp->debit ? 0 : 1;
3794 for (bp = eshkp->bill_p, end_bp = &eshkp->bill_p[eshkp->billct];
3797 || ((obj = bp_to_obj(bp)) != 0 && obj->quan < bp->bquan))
3802 datawin = create_nhwindow(NHW_MENU);
3804 putstr(datawin, 0, "Unpaid articles already used up:");
3806 putstr(datawin, 0, "
\82·
\82Å
\82É
\8eg
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\96¢
\95¥
\82Ì
\95i
\96Ú
\81F");
3807 putstr(datawin, 0, "");
3810 for (bp = eshkp->bill_p, end_bp = &eshkp->bill_p[eshkp->billct];
3811 bp < end_bp; bp++) {
3812 obj = bp_to_obj(bp);
3814 impossible("Bad shopkeeper administration.");
3817 if (bp->useup || bp->bquan > obj->quan) {
3818 long oquan, uquan, thisused;
3821 uquan = (bp->useup ? bp->bquan : bp->bquan - oquan);
3822 thisused = bp->price * uquan;
3823 totused += thisused;
3824 iflags.suppress_price++; /* suppress "(unpaid)" suffix */
3825 /* Why 'x'? To match `I x', more or less. */
3826 buf_p = xprname(obj, (char *) 0, 'x', FALSE, thisused, uquan);
3827 iflags.suppress_price--;
3828 putstr(datawin, 0, buf_p);
3832 /* additional shop debt which has no itemization available */
3834 putstr(datawin, 0, "");
3835 totused += eshkp->debit;
3837 buf_p = xprname((struct obj *) 0, "usage charges and/or other fees",
3838 GOLD_SYM, FALSE, eshkp->debit, 0L);
3840 buf_p = xprname((struct obj *) 0, "
\8eg
\97p
\97¿
\82Ü
\82½
\82Í
\91¼
\82Ì
\8eè
\90\94\97¿",
3841 GOLD_SYM, FALSE, eshkp->debit, 0L);
3843 putstr(datawin, 0, buf_p);
3846 buf_p = xprname((struct obj *) 0, "Total:", '*', FALSE, totused, 0L);
3848 buf_p = xprname((struct obj *) 0, "
\8d\87\8cv
\81F", '*', FALSE, totused, 0L);
3849 putstr(datawin, 0, "");
3850 putstr(datawin, 0, buf_p);
3851 display_nhwindow(datawin, FALSE);
3853 destroy_nhwindow(datawin);
3858 getprice(obj, shk_buying)
3859 register struct obj *obj;
3862 register long tmp = (long) objects[obj->otyp].oc_cost;
3864 if (obj->oartifact) {
3865 tmp = arti_cost(obj);
3869 switch (obj->oclass) {
3871 /* simpler hunger check, (2-4)*cost */
3872 if (u.uhs >= HUNGRY && !shk_buying)
3873 tmp *= (long) u.uhs;
3882 if (obj->otyp == POT_WATER && !obj->blessed && !obj->cursed)
3888 tmp += 10L * (long) obj->spe;
3892 && obj->age < 20L * (long) objects[obj->otyp].oc_cost)
3899 /* shk catches thrown pick-axe */
3902 register struct obj *obj;
3903 register xchar x, y;
3905 register struct monst *shkp;
3907 if (!(shkp = shop_keeper(inside_shop(x, y))) || !inhishop(shkp))
3910 if (shkp->mcanmove && !shkp->msleeping
3911 && (*u.ushops != ESHK(shkp)->shoproom || !inside_shop(u.ux, u.uy))
3912 && dist2(shkp->mx, shkp->my, x, y) < 3
3913 /* if it is the shk's pos, you hit and anger him */
3914 && (shkp->mx != x || shkp->my != y)) {
3915 if (mnearto(shkp, x, y, TRUE) && !Deaf && !muteshk(shkp))
3917 verbalize("Out of my way, scum!");
3919 verbalize("
\82Ç
\82¯
\81C
\83N
\83\
\82Á
\82½
\82ê
\81I");
3922 pline("%s nimbly%s catches %s.", Shknam(shkp),
3923 (x == shkp->mx && y == shkp->my) ? "" : " reaches over and",
3926 pline("%s
\82Í
\82·
\82Î
\82â
\82%s%s
\82ð
\82Â
\82©
\82Ü
\82¦
\82½
\81D", Shknam(shkp),
3927 (x == shkp->mx && y == shkp->my) ? "" : "
\8bß
\82Ã
\82¢
\82Ä",
3930 if (!canspotmon(shkp))
3931 map_invisible(x, y);
3935 subfrombill(obj, shkp);
3936 (void) mpickobj(shkp, obj);
3939 return (struct monst *) 0;
3943 add_damage(x, y, cost)
3944 register xchar x, y;
3947 struct damage *tmp_dam;
3950 if (IS_DOOR(levl[x][y].typ)) {
3953 /* Don't schedule for repair unless it's a real shop entrance */
3954 for (shops = in_rooms(x, y, SHOPBASE); *shops; shops++)
3955 if ((mtmp = shop_keeper(*shops)) != 0 && x == ESHK(mtmp)->shd.x
3956 && y == ESHK(mtmp)->shd.y)
3961 for (tmp_dam = level.damagelist; tmp_dam; tmp_dam = tmp_dam->next)
3962 if (tmp_dam->place.x == x && tmp_dam->place.y == y) {
3963 tmp_dam->cost += cost;
3966 tmp_dam = (struct damage *) alloc((unsigned) sizeof(struct damage));
3967 (void) memset((genericptr_t)tmp_dam, 0, sizeof(struct damage));
3968 tmp_dam->when = monstermoves;
3969 tmp_dam->place.x = x;
3970 tmp_dam->place.y = y;
3971 tmp_dam->cost = cost;
3972 tmp_dam->typ = levl[x][y].typ;
3973 tmp_dam->next = level.damagelist;
3974 level.damagelist = tmp_dam;
3975 /* If player saw damage, display as a wall forever */
3977 levl[x][y].seenv = SVALL;
3981 * Do something about damage. Either (!croaked) try to repair it, or
3982 * (croaked) just discard damage structs for non-shared locations, since
3983 * they'll never get repaired. Assume that shared locations will get
3984 * repaired eventually by the other shopkeeper(s). This might be an erroneous
3985 * assumption (they might all be dead too), but we have no reasonable way of
3990 remove_damage(shkp, croaked)
3994 struct damage *tmp_dam, *tmp2_dam;
3995 boolean did_repair = FALSE, saw_door = FALSE, saw_floor = FALSE,
3996 stop_picking = FALSE, doorway_trap = FALSE;
3997 int saw_walls = 0, saw_untrap = 0;
3998 char trapmsg[BUFSZ];
4000 tmp_dam = level.damagelist;
4003 register xchar x = tmp_dam->place.x, y = tmp_dam->place.y;
4006 unsigned old_doormask = 0;
4009 Strcpy(shops, in_rooms(x, y, SHOPBASE));
4010 if (index(shops, ESHK(shkp)->shoproom)) {
4011 if (IS_DOOR(levl[x][y].typ))
4012 old_doormask = levl[x][y].doormask;
4015 disposition = (shops[1]) ? 0 : 1;
4016 else if (stop_picking)
4017 disposition = repair_damage(shkp, tmp_dam, FALSE);
4019 /* Defer the stop_occupation() until after repair msgs */
4020 if (closed_door(x, y))
4021 stop_picking = picking_at(x, y);
4022 disposition = repair_damage(shkp, tmp_dam, FALSE);
4024 stop_picking = FALSE;
4030 tmp_dam = tmp_dam->next;
4034 if (disposition > 1) {
4037 if (IS_WALL(levl[x][y].typ)) {
4039 } else if (IS_DOOR(levl[x][y].typ)
4040 /* an existing door here implies trap removal */
4041 && !(old_doormask & (D_ISOPEN | D_CLOSED))) {
4043 } else if (disposition == 3) { /* untrapped */
4045 if (IS_DOOR(levl[x][y].typ))
4046 doorway_trap = TRUE;
4053 tmp_dam = tmp_dam->next;
4055 free((genericptr_t) level.damagelist);
4056 level.damagelist = tmp_dam;
4058 free((genericptr_t) tmp2_dam->next);
4059 tmp2_dam->next = tmp_dam;
4067 Sprintf(trapmsg, "%s trap%s",
4068 (saw_untrap > 3) ? "several" : (saw_untrap > 1) ? "some"
4071 Sprintf(eos(trapmsg), " %s", vtense(trapmsg, "are"));
4072 Sprintf(eos(trapmsg), " removed from the %s",
4073 (doorway_trap && saw_untrap == 1) ? "doorway" : "floor");
4075 Sprintf(trapmsg, "%sã©
\82ª%s
\82©
\82ç
\8fÁ
\82¦",
4076 (saw_untrap > 3) ? "
\82 \82¿
\82±
\82¿
\82Ì" : (saw_untrap > 1) ? "
\89½
\83J
\8f\8a\82Ì"
4078 (doorway_trap && saw_untrap == 1) ? "
\94à" : "
\8f°");
4081 trapmsg[0] = '\0'; /* not just lint suppression... */
4085 char wallbuf[BUFSZ];
4087 Sprintf(wallbuf, "section%s", plur(saw_walls));
4088 pline("Suddenly, %s %s of wall %s up!",
4089 (saw_walls == 1) ? "a" : (saw_walls <= 3) ? "some" : "several",
4090 wallbuf, vtense(wallbuf, "close"));
4092 pline("
\93Ë
\91R
\81C
\95Ç
\82ª%s
\95Â
\82Ü
\82Á
\82½
\81I",
4093 (saw_walls == 1) ? "" : (saw_walls <= 3) ? "
\89½
\89Ó
\8f\8a\82©" : "
\82 \82¿
\82±
\82¿
\82Å");
4098 pline_The("shop door reappears!");
4100 pline("
\93X
\82Ì
\94à
\82ª
\82Ü
\82½
\8c»
\82í
\82ê
\82½
\81I");
4103 pline_The("floor is repaired!");
4105 pline("
\8f°
\82Í
\8fC
\95\9c\82³
\82ê
\82½
\81I");
4108 pline("%s!", upstart(trapmsg));
4110 pline("%s
\82½
\81I", trapmsg);
4112 if (saw_door || saw_floor || saw_untrap)
4114 pline("Suddenly, %s%s%s%s%s!",
4115 saw_door ? "the shop door reappears" : "",
4116 (saw_door && saw_floor) ? " and " : "",
4117 saw_floor ? "the floor damage is gone" : "",
4118 ((saw_door || saw_floor) && *trapmsg) ? " and " : "",
4121 pline("
\93Ë
\91R
\81C%s%s%s%s%s
\82½!",
4122 saw_door ? "
\93X
\82Ì
\94à
\82ª
\82Ü
\82½
\8c»
\82í
\82ê" : "",
4123 (saw_door && saw_floor) ? "
\81C" : "",
4124 saw_floor ? "
\8f°
\82Ì
\8f\9d\82ª
\8fC
\95\9c\82³
\82ê" : "",
4125 ((saw_door || saw_floor) && *trapmsg) ? "
\81C" : "",
4128 else if (inside_shop(u.ux, u.uy) == ESHK(shkp)->shoproom)
4130 You_feel("more claustrophobic than before.");
4132 You("
\91O
\82æ
\82è
\95Â
\8f\8a\8b°
\95|
\8fÇ
\8bC
\96¡
\82É
\82È
\82Á
\82½
\81D");
4133 else if (!Deaf && !rn2(10))
4135 Norep("The dungeon acoustics noticeably change.");
4137 Norep("
\96À
\8b{
\82Ì
\89¹
\8b¿
\82Í
\82¢
\82¿
\82¶
\82é
\82µ
\82
\95Ï
\82Á
\82½
\81D");
4144 * 0: repair postponed, 1: silent repair (no messages), 2: normal repair
4148 repair_damage(shkp, tmp_dam, catchup)
4149 register struct monst *shkp;
4150 register struct damage *tmp_dam;
4151 boolean catchup; /* restoring a level */
4153 register xchar x, y, i;
4155 register struct monst *mtmp;
4156 register struct obj *otmp;
4157 register struct trap *ttmp;
4159 if ((monstermoves - tmp_dam->when) < REPAIR_DELAY)
4161 if (shkp->msleeping || !shkp->mcanmove || ESHK(shkp)->following)
4163 x = tmp_dam->place.x;
4164 y = tmp_dam->place.y;
4165 if (!IS_ROOM(tmp_dam->typ)) {
4166 if (x == u.ux && y == u.uy)
4169 if (x == shkp->mx && y == shkp->my)
4171 if ((mtmp = m_at(x, y)) && (!passes_walls(mtmp->data)))
4174 if ((ttmp = t_at(x, y)) != 0) {
4175 if (x == u.ux && y == u.uy)
4178 if (ttmp->ttyp == LANDMINE || ttmp->ttyp == BEAR_TRAP) {
4179 /* convert to an object */
4180 otmp = mksobj((ttmp->ttyp == LANDMINE) ? LAND_MINE : BEARTRAP,
4183 otmp->owt = weight(otmp);
4184 (void) mpickobj(shkp, otmp);
4187 if (IS_DOOR(tmp_dam->typ) && !(levl[x][y].doormask & D_ISOPEN)) {
4188 levl[x][y].doormask = D_CLOSED;
4190 } else if (IS_WALL(tmp_dam->typ)) {
4191 levl[x][y].typ = tmp_dam->typ;
4197 if (IS_ROOM(tmp_dam->typ)) {
4198 /* No messages, because player already filled trap door */
4201 if ((tmp_dam->typ == levl[x][y].typ)
4202 && (!IS_DOOR(tmp_dam->typ) || (levl[x][y].doormask > D_BROKEN)))
4203 /* No messages if player already replaced shop door */
4205 levl[x][y].typ = tmp_dam->typ;
4206 (void) memset((genericptr_t) litter, 0, sizeof(litter));
4207 if ((otmp = level.objects[x][y]) != 0) {
4208 /* Scatter objects haphazardly into the shop */
4209 #define NEED_UPDATE 1
4212 #define horiz(i) ((i % 3) - 1)
4213 #define vert(i) ((i / 3) - 1)
4214 for (i = 0; i < 9; i++) {
4215 if ((i == 4) || (!ZAP_POS(levl[x + horiz(i)][y + vert(i)].typ)))
4218 if (inside_shop(x + horiz(i), y + vert(i))
4219 == ESHK(shkp)->shoproom)
4220 litter[i] |= INSHOP;
4222 if (Punished && !u.uswallow
4223 && ((uchain->ox == x && uchain->oy == y)
4224 || (uball->ox == x && uball->oy == y))) {
4226 * Either the ball or chain is in the repair location.
4228 * Take the easy way out and put ball&chain under hero.
4230 if (!Deaf && !muteshk(shkp))
4232 verbalize("Get your junk out of my wall!");
4234 verbalize("
\82»
\82Ì
\83K
\83\89\83N
\83^
\82ð
\8aO
\82É
\8e\9d\82Á
\82Ä
\8ds
\82«
\82È
\81I");
4235 unplacebc(); /* pick 'em up */
4236 placebc(); /* put 'em down */
4238 while ((otmp = level.objects[x][y]) != 0)
4239 /* Don't mess w/ boulders -- just merge into wall */
4240 if ((otmp->otyp == BOULDER) || (otmp->otyp == ROCK)) {
4241 obj_extract_self(otmp);
4242 obfree(otmp, (struct obj *) 0);
4244 while (!(litter[i = rn2(9)] & INSHOP))
4246 remove_object(otmp);
4247 place_object(otmp, x + horiz(i), y + vert(i));
4248 litter[i] |= NEED_UPDATE;
4252 return 1; /* repair occurred while off level */
4255 if (IS_DOOR(tmp_dam->typ)) {
4256 levl[x][y].doormask = D_CLOSED; /* arbitrary */
4259 /* don't set doormask - it is (hopefully) the same as it was
4260 if not, perhaps save it with the damage array... */
4262 if (IS_WALL(tmp_dam->typ) && cansee(x, y)) {
4263 /* Player sees actual repair process, so they KNOW it's a wall */
4264 levl[x][y].seenv = SVALL;
4267 /* Mark this wall as "repaired". There currently is no code
4268 to do anything about repaired walls, so don't do it. */
4270 for (i = 0; i < 9; i++)
4271 if (litter[i] & NEED_UPDATE)
4272 newsym(x + horiz(i), y + vert(i));
4282 * shk_move: return 1: moved 0: didn't -1: let m_move do it -2: died
4286 register struct monst *shkp;
4288 register xchar gx, gy, omx, omy;
4290 register schar appr;
4291 register struct eshk *eshkp = ESHK(shkp);
4293 boolean uondoor = FALSE, satdoor, avoid = FALSE, badinv;
4299 remove_damage(shkp, FALSE);
4301 if ((udist = distu(omx, omy)) < 3 && (shkp->data != &mons[PM_GRID_BUG]
4302 || (omx == u.ux || omy == u.uy))) {
4303 if (ANGRY(shkp) || (Conflict && !resist(shkp, RING_CLASS, 0, 0))) {
4306 Your("displaced image doesn't fool %s!", shkname(shkp));
4308 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\8c¶
\89e
\82É
\82¾
\82Ü
\82³
\82ê
\82È
\82©
\82Á
\82½
\81I", shkname(shkp));
4309 (void) mattacku(shkp);
4312 if (eshkp->following) {
4313 if (strncmp(eshkp->customer, plname, PL_NSIZ)) {
4314 if (!Deaf && !muteshk(shkp))
4316 verbalize("%s, %s! I was looking for %s.", Hello(shkp),
4317 plname, eshkp->customer);
4319 verbalize("%s
\81I
\82í
\82½
\82µ
\82Í%s
\82ð
\92T
\82µ
\82Ä
\82¢
\82Ü
\82·
\81D", Hello(shkp),
4322 eshkp->following = 0;
4325 if (moves > followmsg + 4) {
4326 if (!Deaf && !muteshk(shkp))
4328 verbalize("%s, %s! Didn't you forget to pay?",
4329 Hello(shkp), plname);
4331 verbalize("%s
\81I
\8ex
\95¥
\82¢
\82ð
\96Y
\82ê
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\82©
\81H",
4336 pline("%s holds out %s upturned %s.",
4339 mbodypart(shkp, HAND));
4341 pline("%s
\82Í%s
\82ð
\8fã
\82É
\8cü
\82¯
\82Ä
\8d·
\82µ
\8fo
\82µ
\82½
\81D",
4343 mbodypart(shkp, HAND));
4348 pline("%s doesn't like customers who don't pay.",
4351 pline("%s
\82Í
\8bà
\82ð
\95¥
\82í
\82È
\82¢
\8bq
\82ª
\8c\99\82¢
\82Ý
\82½
\82¢
\82¾
\81D",
4365 satdoor = (gx == omx && gy == omy);
4366 if (eshkp->following || ((z = holetime()) >= 0 && z * z <= udist)) {
4367 /* [This distance check used to apply regardless of
4368 whether the shk was following, but that resulted in
4369 m_move() sometimes taking the shk out of the shop if
4370 the player had fenced him in with boulders or traps.
4371 Such voluntary abandonment left unpaid objects in
4372 invent, triggering billing impossibilities on the
4373 next level once the character fell through the hole.] */
4374 if (udist > 4 && eshkp->following && !eshkp->billct)
4375 return -1; /* leave it to m_move */
4378 } else if (ANGRY(shkp)) {
4379 /* Move towards the hero if the shopkeeper can see him. */
4380 if (shkp->mcansee && m_canseeu(shkp)) {
4386 #define GDIST(x, y) (dist2(x, y, gx, gy))
4387 if (Invis || u.usteed) {
4390 uondoor = (u.ux == eshkp->shd.x && u.uy == eshkp->shd.y);
4393 (carrying(PICK_AXE) || carrying(DWARVISH_MATTOCK)
4394 || (Fast && (sobj_at(PICK_AXE, u.ux, u.uy)
4395 || sobj_at(DWARVISH_MATTOCK, u.ux, u.uy))));
4396 if (satdoor && badinv)
4400 avoid = (*u.ushops && distu(gx, gy) > 8);
4404 if (((!eshkp->robbed && !eshkp->billct && !eshkp->debit) || avoid)
4405 && GDIST(omx, omy) < 3) {
4406 if (!badinv && !onlineu(omx, omy))
4414 z = move_special(shkp, inhishop(shkp), appr, uondoor, avoid, omx, omy, gx,
4417 after_shk_move(shkp);
4422 /* called after shopkeeper moves, in case themove causes re-entry into shop */
4424 after_shk_move(shkp)
4427 struct eshk *eshkp = ESHK(shkp);
4429 if (eshkp->bill_p == (struct bill_x *) -1000 && inhishop(shkp)) {
4430 /* reset bill_p, need to re-calc player's occupancy too */
4431 eshkp->bill_p = &eshkp->bill[0];
4432 check_special_room(FALSE);
4436 /* for use in levl_follower (mondata.c) */
4439 register struct monst *mtmp;
4441 return (boolean) (mtmp->isshk && ESHK(mtmp)->following);
4444 /* You are digging in the shop. */
4449 register struct monst *shkp = shop_keeper(*u.ushops);
4452 const char *grabs = "grabs";
4454 const char *grabs = "
\82Â
\82©
\82ñ
\82¾";
4459 /* 0 == can't speak, 1 == makes animal noises, 2 == speaks */
4461 if (shkp->msleeping || !shkp->mcanmove || is_silent(shkp->data))
4462 ; /* lang stays 0 */
4463 else if (shkp->data->msound <= MS_ANIMAL)
4465 else if (shkp->data->msound >= MS_HUMANOID)
4468 if (!inhishop(shkp)) {
4469 if (Role_if(PM_KNIGHT)) {
4471 You_feel("like a common thief.");
4473 You("
\93D
\96_
\93¯
\91R
\82È
\8bC
\82ª
\82µ
\82½
\81D");
4474 adjalign(-sgn(u.ualign.type));
4481 if (!Deaf && !muteshk(shkp)) {
4482 if (u.utraptype == TT_PIT)
4485 "Be careful, %s, or you might fall through the floor.",
4486 flags.female ? "madam" : "sir");
4489 "
\92\8d\88Ó
\82µ
\82Ä
\82
\82¾
\82³
\82¢%s
\81C
\8f°
\82©
\82ç
\97\8e\82¿
\82Ü
\82·
\82æ
\81D",
4490 flags.female ? "
\82¨
\8fì
\82³
\82ñ" : "
\82¨
\8bq
\82³
\82ñ");
4494 verbalize("%s, do not damage the floor here!",
4495 flags.female ? "Madam" : "Sir");
4497 verbalize("%s
\81C
\8f°
\82É
\8f\9d\82ð
\82Â
\82¯
\82È
\82¢
\82Å
\82
\82¾
\82³
\82¢
\81I",
4498 flags.female ? "
\82¨
\8fì
\82³
\82ñ" : "
\82¨
\8bq
\82³
\82ñ");
4502 if (Role_if(PM_KNIGHT)) {
4504 You_feel("like a common thief.");
4506 You("
\93D
\96_
\93¯
\91R
\82È
\8bC
\82ª
\82µ
\82½
\81D");
4507 adjalign(-sgn(u.ualign.type));
4509 } else if (!um_dist(shkp->mx, shkp->my, 5)
4510 && !shkp->msleeping && shkp->mcanmove
4511 && (ESHK(shkp)->billct || ESHK(shkp)->debit)) {
4512 register struct obj *obj, *obj2;
4514 if (nolimbs(shkp->data)) {
4516 grabs = "knocks off";
4518 grabs = "
\92@
\82«
\97\8e\82µ
\82½";
4520 /* This is what should happen, but for balance
4521 * reasons, it isn't currently.
4524 pline("%s curses %s inability to grab your backpack!",
4525 shkname(shkp), mhim(shkp));
4530 if (distu(shkp->mx, shkp->my) > 2) {
4532 /* for some reason the shopkeeper can't come next to you */
4533 if (distu(shkp->mx, shkp->my) > 2) {
4537 pline("%s curses you in anger and frustration!",
4539 pline("
\93{
\82è
\82Å
\95s
\96\9e\82Ì
\82½
\82Ü
\82Á
\82Ä
\82¢
\82é%s
\82Í
\82 \82È
\82½
\82ð
\8eô
\82Á
\82½
\81I",
4547 pline("%s %s, and %s your backpack!", shkname(shkp),
4548 makeplural(locomotion(shkp->data, "leap")), grabs);
4550 pline("%s
\82Í
\94ò
\82Ñ
\82Â
\82¢
\82Ä
\81C
\82 \82È
\82½
\82Ì
\94w
\95\89\82¢
\91Ü
\82ð%s
\81I", shkname(shkp),
4555 pline("%s %s your backpack!", shkname(shkp), grabs);
4557 pline("%s
\82Í
\82 \82È
\82½
\82Ì
\94w
\95\89\82¢
\91Ü
\82ð%s
\81I", shkname(shkp), grabs);
4559 for (obj = invent; obj; obj = obj2) {
4561 if ((obj->owornmask & ~(W_SWAPWEP | W_QUIVER)) != 0
4562 || (obj == uswapwep && u.twoweap)
4563 || (obj->otyp == LEASH && obj->leashmon))
4565 if (obj == current_wand)
4569 subfrombill(obj, shkp);
4570 (void) add_to_minv(shkp, obj); /* may free obj */
4579 static const short k_mndx[4] = { PM_KEYSTONE_KOP, PM_KOP_SERGEANT,
4580 PM_KOP_LIEUTENANT, PM_KOP_KAPTAIN };
4581 int k_cnt[4], cnt, mndx, k;
4583 k_cnt[0] = cnt = abs(depth(&u.uz)) + rnd(5);
4584 k_cnt[1] = (cnt / 3) + 1; /* at least one sarge */
4585 k_cnt[2] = (cnt / 6); /* maybe a lieutenant */
4586 k_cnt[3] = (cnt / 9); /* and maybe a kaptain */
4588 for (k = 0; k < 4; k++) {
4589 if ((cnt = k_cnt[k]) == 0)
4592 if (mvitals[mndx].mvflags & G_GONE)
4596 if (enexto(mm, mm->x, mm->y, &mons[mndx]))
4597 (void) makemon(&mons[mndx], mm->x, mm->y, NO_MM_FLAGS);
4602 pay_for_damage(dmgstr, cant_mollify)
4604 boolean cant_mollify;
4606 register struct monst *shkp = (struct monst *) 0;
4607 char shops_affected[5];
4608 register boolean uinshp = (*u.ushops != '\0');
4610 register xchar x, y;
4612 boolean dugwall = (!strcmp(dmgstr, "dig into") /* wand */
4613 || !strcmp(dmgstr, "damage")); /* pick-axe */
4615 boolean ni_wo = !strcmp(dmgstr, "
\8c\8a\82ð
\82 \82¯
\82é"); /* wand */
4616 boolean dugwall = (ni_wo || !strcmp(dmgstr, "
\8f\9d\82Â
\82¯
\82é")); /* pick-axe */
4618 boolean animal, pursue;
4619 struct damage *tmp_dam, *appear_here = 0;
4620 /* any number >= (80*80)+(24*24) would do, actually */
4621 long cost_of_damage = 0L;
4622 unsigned int nearest_shk = 7000, nearest_damage = 7000;
4625 for (tmp_dam = level.damagelist;
4626 (tmp_dam && (tmp_dam->when == monstermoves));
4627 tmp_dam = tmp_dam->next) {
4632 cost_of_damage += tmp_dam->cost;
4633 Strcpy(shops_affected,
4634 in_rooms(tmp_dam->place.x, tmp_dam->place.y, SHOPBASE));
4635 for (shp = shops_affected; *shp; shp++) {
4636 struct monst *tmp_shk;
4637 unsigned int shk_distance;
4639 if (!(tmp_shk = shop_keeper(*shp)))
4641 if (tmp_shk == shkp) {
4642 unsigned int damage_distance =
4643 distu(tmp_dam->place.x, tmp_dam->place.y);
4645 if (damage_distance < nearest_damage) {
4646 nearest_damage = damage_distance;
4647 appear_here = tmp_dam;
4651 if (!inhishop(tmp_shk))
4653 shk_distance = distu(tmp_shk->mx, tmp_shk->my);
4654 if (shk_distance > nearest_shk)
4656 if ((shk_distance == nearest_shk) && picks) {
4662 nearest_shk = shk_distance;
4663 appear_here = tmp_dam;
4664 nearest_damage = distu(tmp_dam->place.x, tmp_dam->place.y);
4668 if (!cost_of_damage || !shkp)
4671 animal = (shkp->data->msound <= MS_ANIMAL);
4673 x = appear_here->place.x;
4674 y = appear_here->place.y;
4676 /* not the best introduction to the shk... */
4677 (void) strncpy(ESHK(shkp)->customer, plname, PL_NSIZ);
4679 /* if the shk is already on the war path, be sure it's all out */
4680 if (ANGRY(shkp) || ESHK(shkp)->following) {
4685 /* if the shk is not in their shop.. */
4686 if (!*in_rooms(shkp->mx, shkp->my, SHOPBASE)) {
4687 if (!cansee(shkp->mx, shkp->my))
4694 if (um_dist(shkp->mx, shkp->my, 1)
4695 && !um_dist(shkp->mx, shkp->my, 3)) {
4697 pline("%s leaps towards you!", shkname(shkp));
4699 pline("%s
\82Í
\82 \82È
\82½
\82É
\94ò
\82Ñ
\82©
\82©
\82Á
\82½
\81I", shkname(shkp));
4702 pursue = um_dist(shkp->mx, shkp->my, 1);
4707 * Make shkp show up at the door. Effect: If there is a monster
4708 * in the doorway, have the hero hear the shopkeeper yell a bit,
4709 * pause, then have the shopkeeper appear at the door, having
4710 * yanked the hapless critter out of the way.
4714 if (!Deaf && !muteshk(shkp)) {
4716 You_hear("an angry voice:");
4718 You("
\93{
\82è
\82Ì
\90º
\82ð
\95·
\82¢
\82½
\81F");
4720 verbalize("Out of my way, scum!");
4722 verbalize("
\82Ç
\82¯
\81I
\83N
\83\
\82Á
\82½
\82ê
\81I");
4725 #if defined(UNIX) || defined(VMS)
4726 #if defined(SYSV) || defined(ULTRIX) || defined(VMS)
4735 (void) mnearto(shkp, x, y, TRUE);
4738 if ((um_dist(x, y, 1) && !uinshp) || cant_mollify
4739 || (money_cnt(invent) + ESHK(shkp)->credit) < cost_of_damage
4742 if (muteshk(shkp)) {
4743 if (animal && shkp->mcanmove && !shkp->msleeping)
4745 } else if (pursue || uinshp || !um_dist(x, y, 1)) {
4748 verbalize("How dare you %s my %s?", dmgstr,
4749 dugwall ? "shop" : "door");
4751 verbalize("
\82Ç
\82¤
\82µ
\82Ä%s%s%s
\82è
\82µ
\82½
\82ñ
\82¾
\81H",
4752 dugwall ? "
\93X" : "
\94à",
4753 ni_wo ? "
\82É" : "
\82ð",
4758 pline("%s is %s that you decided to %s %s %s!",
4759 Shknam(shkp), angrytexts[rn2(SIZE(angrytexts))],
4760 dmgstr, mhis(shkp), dugwall ? "shop" : "door");
4762 pline("%s
\82Í
\82 \82È
\82½
\82ª%s
\82ð%s
\82±
\82Æ
\82É
\91Î
\82µ
\82Ä%s
\81I",
4764 dugwall ? "
\93X" : "
\94à", dmgstr,
4765 angrytexts[rn2(SIZE(angrytexts))]);
4770 pline("%s shouts:", shkname(shkp));
4772 pline("%s
\82Í
\82³
\82¯
\82ñ
\82¾
\81F", shkname(shkp));
4774 verbalize("Who dared %s my %s?", dmgstr,
4775 dugwall ? "shop" : "door");
4777 verbalize("
\92N
\82ª%s%s%s
\82è
\82µ
\82½
\82ñ
\82¾
\82ë
\82¤
\81H",
4778 dugwall ? "
\93X" : "
\94à",
4779 ni_wo ? "
\82É" : "
\82ð",
4784 pline("%s is %s that someone decided to %s %s %s!",
4785 Shknam(shkp), angrytexts[rn2(SIZE(angrytexts))],
4786 dmgstr, mhis(shkp), dugwall ? "shop" : "door");
4788 pline("%s
\82Í
\92N
\82©
\82ª%s
\82ð%s
\82±
\82Æ
\82É
\91Î
\82µ
\82Ä%s
\81I",
4790 dugwall ? "
\93X" : "
\94à", dmgstr,
4791 angrytexts[rn2(SIZE(angrytexts))]);
4801 Your("invisibility does not fool %s!", shkname(shkp));
4803 pline("%s
\82Í
\93§
\96¾
\82È
\82 \82È
\82½
\82É
\82¾
\82Ü
\82³
\82ê
\82È
\82©
\82Á
\82½
\81I", shkname(shkp));
4805 Sprintf(qbuf, "%sYou did %ld %s worth of damage!%s Pay?",
4806 !animal ? cad(TRUE) : "", cost_of_damage,
4807 currency(cost_of_damage), !animal ? "\"" : "");
4809 Sprintf(qbuf,"
\81u
\82¨
\82¢
\81I%ld%s
\82Ì
\91¹
\8aQ
\82¾
\81I
\81v
\95¥
\82¢
\82Ü
\82·
\82©
\81H",
4810 cost_of_damage, currency(cost_of_damage));
4812 if (yn(qbuf) != 'n') {
4813 cost_of_damage = check_credit(cost_of_damage, shkp);
4814 money2mon(shkp, cost_of_damage);
4817 pline("Mollified, %s accepts your restitution.", shkname(shkp));
4819 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));
4820 /* move shk back to his home loc */
4821 home_shk(shkp, FALSE);
4825 if (!Deaf && !muteshk(shkp))
4827 verbalize("Oh, yes! You'll pay!");
4829 verbalize("
\82³
\82 \81C
\95¥
\82¤
\82ñ
\82¾
\81I");
4832 pline("%s lunges %s %s toward your %s!",
4835 mbodypart(shkp, HAND),
4838 pline("%s
\82Í%s
\82ð
\82 \82È
\82½
\82Ì%s
\82É
\93Ë
\82«
\8fo
\82µ
\82½
\81I",
4840 mbodypart(shkp, HAND),
4846 adjalign(-sgn(u.ualign.type));
4850 /* called in dokick.c when we kick an object that might be in a store */
4853 register xchar x, y;
4858 if (!level.flags.has_shop)
4860 shkp = shop_keeper(*in_rooms(x, y, SHOPBASE));
4861 if (!shkp || !inhishop(shkp))
4864 return (boolean) (inside_shop(x, y)
4865 && !(x == eshkp->shk.x && y == eshkp->shk.y));
4868 /* called by dotalk(sounds.c) when #chatting; returns obj if location
4869 contains shop goods and shopkeeper is willing & able to speak */
4872 register xchar x, y;
4874 register struct obj *otmp;
4875 register struct monst *shkp;
4877 if (!(shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) || !inhishop(shkp))
4878 return (struct obj *) 0;
4880 for (otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere)
4881 if (otmp->oclass != COIN_CLASS)
4883 /* note: otmp might have ->no_charge set, but that's ok */
4884 return (otmp && costly_spot(x, y)
4885 && NOTANGRY(shkp) && shkp->mcanmove && !shkp->msleeping)
4890 /* give price quotes for all objects linked to this one (ie, on this spot) */
4892 price_quote(first_obj)
4893 register struct obj *first_obj;
4895 register struct obj *otmp;
4896 char buf[BUFSZ], price[40];
4899 boolean contentsonly = FALSE;
4901 struct monst *shkp = shop_keeper(inside_shop(u.ux, u.uy));
4903 tmpwin = create_nhwindow(NHW_MENU);
4905 putstr(tmpwin, 0, "Fine goods for sale:");
4907 putstr(tmpwin, 0, "
\94\84\82è
\82É
\82Å
\82Ä
\82¢
\82é
\82·
\82Î
\82ç
\82µ
\82¢
\8f¤
\95i
\81F");
4908 putstr(tmpwin, 0, "");
4909 for (otmp = first_obj; otmp; otmp = otmp->nexthere) {
4910 if (otmp->oclass == COIN_CLASS)
4912 cost = (otmp->no_charge || otmp == uball || otmp == uchain)
4914 : get_cost(otmp, (struct monst *) 0);
4915 contentsonly = !cost;
4916 if (Has_contents(otmp))
4917 cost += contained_cost(otmp, shkp, 0L, FALSE, FALSE);
4920 Strcpy(price, "no charge");
4922 Strcpy(price, "
\96³
\97¿");
4923 contentsonly = FALSE;
4926 Sprintf(price, "%ld %s%s", cost, currency(cost),
4927 (otmp->quan) > 1L ? " each" : "");
4929 Sprintf(price, "%s%ld%s",
4930 otmp->quan > 1L ? "
\82»
\82ê
\82¼
\82ê" : "", cost, currency(cost));
4934 Sprintf(buf, "%s%s, %s", contentsonly ? the_contents_of : "",
4935 doname(otmp), price);
4937 Sprintf(buf, "%s%s
\81C%s", doname(otmp),
4938 contentsonly ? "
\82Ì
\92\86\90g" : "", price);
4940 putstr(tmpwin, 0, buf), cnt++;
4943 display_nhwindow(tmpwin, TRUE);
4944 } else if (cnt == 1) {
4946 /* "<doname(obj)>, no charge" */
4948 pline("%s!", upstart(buf)); /* buf still contains the string */
4950 pline("%s
\81I", buf); /* buf still contains the string */
4953 /* print cost in slightly different format, so can't reuse buf;
4954 cost and contentsonly are already set up */
4956 Sprintf(buf, "%s%s", contentsonly ? the_contents_of : "",
4959 Sprintf(buf, "%s%s", doname(first_obj),
4960 contentsonly ? "
\82Ì
\92\86\90g" : "");
4963 pline("%s, price %ld %s%s%s", upstart(buf), cost, currency(cost),
4964 (first_obj->quan > 1L) ? " each" : "",
4965 contentsonly ? "." : shk_embellish(first_obj, cost));
4967 pline("%s%s
\82Í%s%ld%s
\82¾
\81D",
4968 shk_embellish(first_obj, cost), buf,
4969 first_obj->quan > 1L ? "
\82»
\82ê
\82¼
\82ê" : "",
4970 cost, currency(cost));
4974 destroy_nhwindow(tmpwin);
4978 \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
4979 \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
4981 STATIC_OVL const char *
4982 shk_embellish(itm, cost)
4983 register struct obj *itm;
4987 register int o, choice = rn2(5);
4990 choice = (cost < 100L ? 1 : cost < 500L ? 2 : 3);
4997 if (o == FOOD_CLASS)
4999 return ", gourmets' delight!";
5001 return "
\83O
\83\8b\83\81\82ª
\8b\83\82¢
\82Ä
\8aì
\82Ô";
5002 if (objects[itm->otyp].oc_name_known
5003 ? objects[itm->otyp].oc_magic
5004 : (o == AMULET_CLASS || o == RING_CLASS || o == WAND_CLASS
5005 || o == POTION_CLASS || o == SCROLL_CLASS
5006 || o == SPBOOK_CLASS))
5008 return ", painstakingly developed!";
5010 return "
\88ê
\8b\89\82Ì
\96\82\97Í
\82ð
\94é
\82ß
\82½";
5012 return ", superb craftsmanship!";
5014 return "
\88ê
\97¬
\90E
\90l
\82Ì
\8dì
\82Á
\82½";
5017 return ", finest quality.";
5019 return "
\8dÅ
\8d\82\82Ì
\95i
\8e¿
\82ð
\8cÖ
\82é";
5022 return ", an excellent choice.";
5024 return "
\82³
\82·
\82ª
\82¨
\8bq
\82³
\82ñ
\96Ú
\82ª
\8d\82\82¢
\81I";
5027 return ", a real bargain.";
5029 return "
\96{
\93ú
\82Ì
\96Ú
\8bÊ
\8f¤
\95i
\81I";
5033 } else if (itm->oartifact) {
5035 return ", one of a kind!";
5037 return "
\82±
\82ê
\82Í
\90¢
\8aE
\82É
\82Ü
\82½
\82Æ
\82È
\82¢
\81I";
5045 /* First 4 supplied by Ronen and Tamar, remainder by development team */
5046 const char *Izchak_speaks[] = {
5048 "%s says: 'These shopping malls give me a headache.'",
5050 "%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",
5052 "%s says: 'Slow down. Think clearly.'",
5054 "%s
\9eH
\82
\81w
\97\8e\82¿
\92\85\82¢
\82Ä
\81C
\96¾
\9dð
\82É
\8dl
\82¦
\82æ
\81D
\81x",
5056 "%s says: 'You need to take things one at a time.'",
5058 "%s
\9eH
\82
\81w
\88ê
\93x
\82É
\88ê
\8cÂ
\82¸
\82Â
\8eæ
\82é
\95K
\97v
\82ª
\82 \82é
\81D
\81x",
5060 "%s says: 'I don't like poofy coffee... give me Columbian Supremo.'",
5062 "%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",
5064 "%s says that getting the devteam's agreement on anything is difficult.",
5066 "
\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",
5068 "%s says that he has noticed those who serve their deity will prosper.",
5070 "%s
\82Í
\90_
\82É
\8ed
\82¦
\82Ä
\82¢
\82é
\82â
\82Â
\82Í
\90¬
\8c÷
\82µ
\82Ä
\82¢
\82é
\82Æ
\8fq
\82×
\82½
\81D",
5072 "%s says: 'Don't try to steal from me - I have friends in high places!'",
5074 "%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",
5076 "%s says: 'You may well need something from this shop in the future.'",
5078 "%s
\9eH
\82
\81w
\8f«
\97\88\82±
\82Ì
\93X
\82Ì
\89½
\82©
\82ª
\95K
\97v
\82Æ
\82È
\82é
\82¾
\82ë
\82¤
\81x",
5080 "%s comments about the Valley of the Dead as being a gateway."
5082 "%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"
5093 /* The monster type is shopkeeper, but this monster is
5094 not actually a shk, which could happen if someone
5095 wishes for a shopkeeper statue and then animates it.
5096 (Note: shkname() would be "" in a case like this.) */
5098 pline("%s asks whether you've seen any untended shops recently.",
5100 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",
5103 /* [Perhaps we ought to check whether this conversation
5104 is taking place inside an untended shop, but a shopless
5105 shk can probably be expected to be rather disoriented.] */
5112 pline("%s %s how much %s dislikes %s customers.",
5114 (!Deaf && !muteshk(shkp)) ? "mentions" : "indicates",
5115 mhe(shkp), eshk->robbed ? "non-paying" : "rude");
5117 pline("%s
\82Í%s
\8bq
\82Í
\91å
\8c\99\82¢
\82¾
\82Æ%s
\81D",
5119 eshk->robbed ? "
\8bà
\82ð
\8ex
\95¥
\82í
\82È
\82¢" : "
\96³
\97ç
\82È",
5120 (!Deaf && !muteshk(shkp)) ? "
\8c¾
\82Á
\82½" : "
\8e¦
\82µ
\82½");
5122 } else if (eshk->following) {
5123 if (strncmp(eshk->customer, plname, PL_NSIZ)) {
5124 if (!Deaf && !muteshk(shkp))
5126 verbalize("%s %s! I was looking for %s.",
5127 Hello(shkp), plname, eshk->customer);
5129 verbalize("%s
\81I
\8e\84\82Í%s
\82ð
\92T
\82µ
\82Ä
\82¢
\82Ü
\82·
\81D",
5130 Hello(shkp), eshk->customer);
5132 eshk->following = 0;
5134 if (!Deaf && !muteshk(shkp))
5136 verbalize("%s %s! Didn't you forget to pay?",
5137 Hello(shkp), plname);
5139 verbalize("%s
\81I
\8ex
\95¥
\82¢
\82ð
\96Y
\82ê
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\82©
\81H",
5144 pline("%s taps you on the %s.",
5145 Shknam(shkp), body_part(ARM));
5147 pline("%s
\82Í
\82 \82È
\82½
\82Ì%s
\82ð
\8cy
\82
\82½
\82½
\82¢
\82½
\81D",
5148 Shknam(shkp), body_part(ARM));
5151 } else if (eshk->billct) {
5152 register long total = addupbill(shkp) + eshk->debit;
5155 pline("%s %s that your bill comes to %ld %s.",
5157 (!Deaf && !muteshk(shkp)) ? "says" : "indicates",
5158 total, currency(total));
5160 pline("%s
\82Í
\8a¨
\92è
\82ª%ld%s
\82É
\82È
\82é
\82Æ%s
\81D",
5161 shkname(shkp), total, currency(total),
5162 (!Deaf && !muteshk(shkp)) ? "
\8c¾
\82Á
\82½" : "
\8e¦
\82µ
\82½");
5164 } else if (eshk->debit) {
5166 pline("%s %s that you owe %s %ld %s.",
5168 (!Deaf && !muteshk(shkp)) ? "reminds you" : "indicates",
5169 mhim(shkp), eshk->debit, currency(eshk->debit));
5171 pline("
\82 \82È
\82½
\82Í%s
\82É%ld%s
\82Ì
\8eØ
\82è
\82ª
\82 \82é
\82±
\82Æ
\82ð
\8ev
\82¢
\82¾
\82µ
\82½
\81D",
5172 shkname(shkp), eshk->debit, currency(eshk->debit));
5174 } else if (eshk->credit) {
5176 pline("%s encourages you to use your %ld %s of credit.",
5177 shkname(shkp), eshk->credit, currency(eshk->credit));
5179 pline("%s
\82Í%ld%s
\82Ì
\97a
\82¯
\8bà
\82ð
\8eg
\82¤
\82æ
\82¤
\8a©
\82ß
\82½
\81D",
5180 shkname(shkp), eshk->credit, currency(eshk->credit));
5182 } else if (eshk->robbed) {
5184 pline("%s %s about a recent robbery.",
5186 (!Deaf && !muteshk(shkp)) ? "complains" : "indicates concern");
5188 pline("%s
\82Í
\8dÅ
\8bß
\82Ì
\8b
\93\90\82É
\82Â
\82¢
\82Ä%s
\81D",
5190 (!Deaf && !muteshk(shkp)) ? "
\8bð
\92s
\82ð
\82±
\82Ú
\82µ
\82½" : "
\8c\9c\94O
\82ð
\8e¦
\82µ
\82½");
5192 } else if ((shkmoney = money_cnt(shkp->minvent)) < 50L) {
5194 pline("%s %s that business is bad.",
5196 (!Deaf && !muteshk(shkp)) ? "complains" : "indicates");
5198 pline("%s
\82Í
\8f¤
\94\84\82ª
\8e|
\82
\82¢
\82Á
\82Ä
\82È
\82¢
\82Æ%s
\81D",
5200 (!Deaf && !muteshk(shkp)) ? "
\8bð
\92s
\82ð
\82±
\82Ú
\82µ
\82½" : "
\8e¦
\82µ
\82½");
5202 } else if (shkmoney > 4000) {
5204 pline("%s %s that business is good.",
5206 (!Deaf && !muteshk(shkp)) ? "says" : "indicates");
5208 pline("%s
\82Í
\8f¤
\94\84\82ª
\8e|
\82
\82¢
\82Á
\82Ä
\82¢
\82é
\82Æ%s
\81D",
5210 (!Deaf && !muteshk(shkp)) ? "
\8c¾
\82Á
\82½" : "
\8e¦
\82µ
\82½");
5212 } else if (is_izchak(shkp, FALSE)) {
5213 if (!Deaf && !muteshk(shkp))
5214 pline(Izchak_speaks[rn2(SIZE(Izchak_speaks))], shkname(shkp));
5216 if (!Deaf && !muteshk(shkp))
5218 pline("%s talks about the problem of shoplifters.", shkname(shkp));
5220 pline("%s
\82Í
\96\9c\88ø
\82Ì
\96â
\91è
\82É
\82Â
\82¢
\82Ä
\98b
\82µ
\82½
\81D", shkname(shkp));
5228 register int cnt = 0;
5229 register struct monst *mtmp, *mtmp2;
5231 for (mtmp = fmon; mtmp; mtmp = mtmp2) {
5233 if (mtmp->data->mlet == S_KOP) {
5234 if (canspotmon(mtmp))
5241 pline_The("Kop%s (disappointed) vanish%s into thin air.",
5242 plur(cnt), (cnt == 1) ? "es" : "");
5244 pline("
\8cx
\8a¯
\82Í(
\82ª
\82Á
\82©
\82è
\82µ
\82Ä)
\8ep
\82ð
\8fÁ
\82µ
\82½
\81D");
5249 cost_per_charge(shkp, otmp, altusage)
5252 boolean altusage; /* some items have an "alternate" use with different cost */
5256 if (!shkp || !inhishop(shkp))
5257 return 0L; /* insurance */
5258 tmp = get_cost(otmp, shkp);
5260 /* The idea is to make the exhaustive use of an unpaid item
5261 * more expensive than buying it outright.
5263 if (otmp->otyp == MAGIC_LAMP) { /* 1 */
5264 /* normal use (ie, as light source) of a magic lamp never
5265 degrades its value, but not charging anything would make
5266 identification too easy; charge an amount comparable to
5267 what is charged for an ordinary lamp (don't bother with
5268 angry shk surcharge) */
5270 tmp = (long) objects[OIL_LAMP].oc_cost;
5272 tmp += tmp / 3L; /* djinni is being released */
5273 } else if (otmp->otyp == MAGIC_MARKER) { /* 70 - 100 */
5274 /* No way to determine in advance how many charges will be
5275 * wasted. So, arbitrarily, one half of the price per use.
5278 } else if (otmp->otyp == BAG_OF_TRICKS /* 1 - 20 */
5279 || otmp->otyp == HORN_OF_PLENTY) {
5280 /* altusage: emptying of all the contents at once */
5283 } else if (otmp->otyp == CRYSTAL_BALL /* 1 - 5 */
5284 || otmp->otyp == OIL_LAMP /* 1 - 10 */
5285 || otmp->otyp == BRASS_LANTERN
5286 || (otmp->otyp >= MAGIC_FLUTE
5287 && otmp->otyp <= DRUM_OF_EARTHQUAKE) /* 5 - 9 */
5288 || otmp->oclass == WAND_CLASS) { /* 3 - 11 */
5291 } else if (otmp->oclass == SPBOOK_CLASS) {
5293 } else if (otmp->otyp == CAN_OF_GREASE || otmp->otyp == TINNING_KIT
5294 || otmp->otyp == EXPENSIVE_CAMERA) {
5296 } else if (otmp->otyp == POT_OIL) {
5302 /* Charge the player for partial use of an unpaid object.
5304 * Note that bill_dummy_object() should be used instead
5305 * when an object is completely used.
5308 check_unpaid_usage(otmp, altusage)
5313 const char *fmt, *arg1, *arg2;
5317 if (!otmp->unpaid || !*u.ushops
5318 || (otmp->spe <= 0 && objects[otmp->otyp].oc_charged))
5320 if (!(shkp = shop_keeper(*u.ushops)) || !inhishop(shkp))
5322 if ((tmp = cost_per_charge(shkp, otmp, altusage)) == 0L)
5326 if (otmp->oclass == SPBOOK_CLASS) {
5328 fmt = "%sYou owe%s %ld %s.";
5330 fmt = "%s%s%ld%s
\82Ì
\8eØ
\82è
\82¾
\81D";
5332 Sprintf(buf, "This is no free library, %s! ", cad(FALSE));
5334 Strcpy(buf, "
\82¨
\82¢
\81I
\82±
\82±
\82Í
\90}
\8f\91\8aÙ
\82¶
\82á
\82È
\82¢
\81I");
5335 arg1 = rn2(2) ? buf : "";
5337 arg2 = ESHK(shkp)->debit > 0L ? " an additional" : "";
5339 arg2 = ESHK(shkp)->debit > 0L ? "
\82³
\82ç
\82É
\8c¾
\82¦
\82Î" : "";
5340 } else if (otmp->otyp == POT_OIL) {
5342 fmt = "%s%sThat will cost you %ld %s (Yendorian Fuel Tax).";
5344 fmt = "%s%s
\92l
\92i
\82Í%ld%s(
\83C
\83F
\83\93\83_
\81[
\94R
\97¿
\90Å)
\82¾
\81D";
5345 } else if (altusage && (otmp->otyp == BAG_OF_TRICKS
5346 || otmp->otyp == HORN_OF_PLENTY)) {
5348 fmt = "%s%sEmptying that will cost you %ld %s.";
5350 fmt = "%s%s
\82»
\82ê
\82Ì
\8eg
\97p
\97¿
\82Í%ld%s
\82¾
\81D";
5355 arg1 = "
\82¤
\82í
\81I";
5358 arg1 = "Watch it! ";
5360 arg1 = "
\8bC
\82ð
\82Â
\82¯
\82ë
\81I";
5363 fmt = "%s%sUsage fee, %ld %s.";
5365 fmt = "%s%s
\8eg
\97p
\97¿
\82Í
\81C%ld%s
\82¾
\81D";
5370 arg1 = "
\82¨
\82¢
\81I";
5375 arg2 = "
\83S
\83z
\83\93\81D";
5378 if (!Deaf && !muteshk(shkp)) {
5379 verbalize(fmt, arg1, arg2, tmp, currency(tmp));
5380 exercise(A_WIS, TRUE); /* you just got info */
5382 ESHK(shkp)->debit += tmp;
5385 /* for using charges of unpaid objects "used in the normal manner" */
5390 check_unpaid_usage(otmp, FALSE); /* normal item use */
5394 costly_gold(x, y, amount)
5395 register xchar x, y;
5396 register long amount;
5398 register long delta;
5399 register struct monst *shkp;
5400 register struct eshk *eshkp;
5402 if (!costly_spot(x, y))
5404 /* shkp now guaranteed to exist by costly_spot() */
5405 shkp = shop_keeper(*in_rooms(x, y, SHOPBASE));
5408 if (eshkp->credit >= amount) {
5409 if (eshkp->credit > amount)
5411 Your("credit is reduced by %ld %s.", amount, currency(amount));
5413 Your("
\97a
\82¯
\8bà
\82Í%ld%s
\8c¸
\82Á
\82½
\81D", amount, currency(amount));
5416 Your("credit is erased.");
5418 Your("
\97a
\82¯
\8bà
\82Í
\92 \8fÁ
\82µ
\82É
\82È
\82Á
\82½
\81D");
5419 eshkp->credit -= amount;
5421 delta = amount - eshkp->credit;
5424 Your("credit is erased.");
5426 Your("
\97a
\82¯
\8bà
\82Í
\92 \8fÁ
\82µ
\82É
\82È
\82Á
\82½
\81D");
5429 Your("debt increases by %ld %s.", delta, currency(delta));
5431 Your("
\8eØ
\8bà
\82Í%ld%s
\91\9d\82¦
\82½
\81D", delta, currency(delta));
5434 You("owe %s %ld %s.", shkname(shkp), delta, currency(delta));
5436 You("%s
\82É%ld%s
\82Ì
\8eØ
\82è
\82ð
\82Â
\82
\82Á
\82½
\81D", shkname(shkp), delta, currency(delta));
5437 eshkp->debit += delta;
5438 eshkp->loan += delta;
5443 /* used in domove to block diagonal shop-exit */
5444 /* x,y should always be a door */
5447 register xchar x, y;
5449 register int roomno = *in_rooms(x, y, SHOPBASE);
5450 register struct monst *shkp;
5452 if (roomno < 0 || !IS_SHOP(roomno))
5454 if (!IS_DOOR(levl[x][y].typ))
5456 if (roomno != *u.ushops)
5459 if (!(shkp = shop_keeper((char) roomno)) || !inhishop(shkp))
5462 if (shkp->mx == ESHK(shkp)->shk.x && shkp->my == ESHK(shkp)->shk.y
5463 /* Actually, the shk should be made to block _any_
5464 * door, including a door the player digs, if the
5465 * shk is within a 'jumping' distance.
5467 && ESHK(shkp)->shd.x == x
5468 && ESHK(shkp)->shd.y == y
5469 && shkp->mcanmove && !shkp->msleeping
5470 && (ESHK(shkp)->debit || ESHK(shkp)->billct || ESHK(shkp)->robbed)) {
5472 pline("%s%s blocks your way!", shkname(shkp),
5473 Invis ? " senses your motion and" : "");
5475 pline("%s
\82Í%s
\82 \82È
\82½
\82Ì
\91O
\82É
\97§
\82¿
\82Ó
\82³
\82ª
\82Á
\82½
\81I", shkname(shkp),
5476 Invis ? "
\93®
\82«
\82ð
\8a´
\82¶
\82Æ
\82è
\81C" : "");
5483 /* used in domove to block diagonal shop-entry;
5484 u.ux, u.uy should always be a door */
5487 register xchar x, y;
5489 register xchar sx, sy;
5490 register int roomno;
5491 register struct monst *shkp;
5493 if (!(IS_DOOR(levl[u.ux][u.uy].typ)
5494 && levl[u.ux][u.uy].doormask == D_BROKEN))
5497 roomno = *in_rooms(x, y, SHOPBASE);
5498 if (roomno < 0 || !IS_SHOP(roomno))
5500 if (!(shkp = shop_keeper((char) roomno)) || !inhishop(shkp))
5503 if (ESHK(shkp)->shd.x != u.ux || ESHK(shkp)->shd.y != u.uy)
5506 sx = ESHK(shkp)->shk.x;
5507 sy = ESHK(shkp)->shk.y;
5509 if (shkp->mx == sx && shkp->my == sy && shkp->mcanmove && !shkp->msleeping
5510 && (x == sx - 1 || x == sx + 1 || y == sy - 1 || y == sy + 1)
5511 && (Invis || carrying(PICK_AXE) || carrying(DWARVISH_MATTOCK)
5514 pline("%s%s blocks your way!", shkname(shkp),
5515 Invis ? " senses your motion and" : "");
5517 pline("%s%s
\82 \82È
\82½
\82Ì
\91O
\82É
\97§
\82¿
\82Ó
\82³
\82ª
\82Á
\82½
\81I", shkname(shkp),
5518 Invis ? "
\93®
\82«
\82ð
\8a´
\82¶
\82Æ
\82è
\81C" : "");
5525 /* "your " or "Foobar's " (note the trailing space) */
5526 /*
\81u
\82 \82È
\82½
\82Ì
\81v
\82©
\81uFoobar
\82Ì
\81v(
\96\96\94ö
\82É
\8bó
\94\92\82Í
\95s
\97v) */
5532 if (!shk_owns(buf, obj) && !mon_owns(buf, obj))
5533 Strcpy(buf, the_your[carried(obj) ? 1 : 0]);
5535 return strcat(buf, " ");
5545 (void) shk_your(buf, obj);
5560 if (get_obj_location(obj, &x, &y, 0)
5561 && (obj->unpaid || (obj->where == OBJ_FLOOR && !obj->no_charge
5562 && costly_spot(x, y)))) {
5563 shkp = shop_keeper(inside_shop(x, y));
5565 return strcpy(buf, shkp ? s_suffix(shkname(shkp)) : the_your[0]);
5568 strcpy(buf, shkname(shkp));
5569 strcat(buf, "
\82Ì");
5584 if (obj->where == OBJ_MINVENT)
5586 return strcpy(buf, s_suffix(y_monnam(obj->ocarry)));
5589 strcpy(buf, mon_nam(obj->ocarry));
5590 strcat(buf, "
\82Ì");
5597 #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¢*/
5598 STATIC_OVL const char *
5600 boolean altusage; /* used as a verbalized exclamation: \"Cad! ...\" */
5602 const char *res = 0;
5604 switch (is_demon(youmonst.data) ? 3 : poly_gender()) {
5618 impossible("cad: unknown gender");
5623 char *cadbuf = mon_nam(&youmonst); /* snag an output buffer */
5625 /* alternate usage adds a leading double quote and trailing
5626 exclamation point plus sentence separating spaces */
5627 Sprintf(cadbuf, "\"%s! ", res);
5628 cadbuf[1] = highc(cadbuf[1]);
5637 sasc_bug(struct obj *op, unsigned x)