1 /* NetHack 3.6 pickup.c $NHDT-Date: 1576282488 2019/12/14 00:14:48 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.237 $ */
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-2020 */
9 /* JNetHack may be freely redistributed. See license for details. */
12 * Contains code for picking objects up, and container use.
17 #define CONTAINED_SYM '>' /* from invent.c */
19 STATIC_DCL void FDECL(simple_look, (struct obj *, BOOLEAN_P));
20 STATIC_DCL boolean FDECL(query_classes, (char *, boolean *, boolean *,
21 const char *, struct obj *,
23 STATIC_DCL boolean FDECL(fatal_corpse_mistake, (struct obj *, BOOLEAN_P));
24 STATIC_DCL void FDECL(check_here, (BOOLEAN_P));
25 STATIC_DCL boolean FDECL(n_or_more, (struct obj *));
26 STATIC_DCL boolean FDECL(all_but_uchain, (struct obj *));
28 STATIC_DCL boolean FDECL(allow_cat_no_uchain, (struct obj *));
30 STATIC_DCL int FDECL(autopick, (struct obj *, int, menu_item **));
31 STATIC_DCL int FDECL(count_categories, (struct obj *, int));
32 STATIC_DCL int FDECL(delta_cwt, (struct obj *, struct obj *));
33 STATIC_DCL long FDECL(carry_count, (struct obj *, struct obj *, long,
34 BOOLEAN_P, int *, int *));
35 STATIC_DCL int FDECL(lift_object, (struct obj *, struct obj *, long *,
37 STATIC_DCL boolean FDECL(mbag_explodes, (struct obj *, int));
38 STATIC_DCL long FDECL(boh_loss, (struct obj *container, int));
39 STATIC_PTR int FDECL(in_container, (struct obj *));
40 STATIC_PTR int FDECL(out_container, (struct obj *));
41 STATIC_DCL void FDECL(removed_from_icebox, (struct obj *));
42 STATIC_DCL long FDECL(mbag_item_gone, (int, struct obj *));
43 STATIC_DCL void FDECL(explain_container_prompt, (BOOLEAN_P));
44 STATIC_DCL int FDECL(traditional_loot, (BOOLEAN_P));
45 STATIC_DCL int FDECL(menu_loot, (int, BOOLEAN_P));
46 STATIC_DCL char FDECL(in_or_out_menu, (const char *, struct obj *, BOOLEAN_P,
47 BOOLEAN_P, BOOLEAN_P, BOOLEAN_P));
48 STATIC_DCL boolean FDECL(able_to_loot, (int, int, BOOLEAN_P));
49 STATIC_DCL boolean NDECL(reverse_loot);
50 STATIC_DCL boolean FDECL(mon_beside, (int, int));
51 STATIC_DCL int FDECL(do_loot_cont, (struct obj **, int, int));
52 STATIC_DCL void FDECL(tipcontainer, (struct obj *));
54 /* define for query_objlist() and autopickup() */
55 #define FOLLOW(curr, flags) \
56 (((flags) & BY_NEXTHERE) ? (curr)->nexthere : (curr)->nobj)
58 #define GOLD_WT(n) (((n) + 50L) / 100L)
59 /* if you can figure this out, give yourself a hearty pat on the back... */
60 #define GOLD_CAPACITY(w, n) (((w) * -100L) - ((n) + 50L) - 1L)
62 /* A variable set in use_container(), to be used by the callback routines
63 in_container() and out_container() from askchain() and use_container().
64 Also used by menu_loot() and container_gone(). */
65 static NEARDATA struct obj *current_container;
66 static NEARDATA boolean abort_looting;
67 #define Icebox (current_container->otyp == ICE_BOX)
71 moderateloadmsg[] = "You have a little trouble lifting",
73 moderateloadmsg[] = "
\82ð
\8e\9d\82Á
\82½
\82ç
\8f
\82µ
\82Ó
\82ç
\82Â
\82¢
\82½",
75 nearloadmsg[] = "You have much trouble lifting",
77 nearloadmsg[] = "
\82Í
\82¸
\82Á
\82µ
\82è
\82Æ
\8c¨
\82É
\82Ì
\82µ
\82©
\82©
\82Á
\82½",
79 overloadmsg[] = "You have extreme difficulty lifting";
81 overloadmsg[] = "
\82ð
\8e\9d\82¿
\82 \82°
\82é
\82Ì
\82Í
\82Æ
\82Ä
\82à
\82Â
\82ç
\82¢";
83 /* BUG: this lets you look at cockatrice corpses while blind without
85 /* much simpler version of the look-here code; used by query_classes() */
87 simple_look(otmp, here)
88 struct obj *otmp; /* list of objects */
89 boolean here; /* flag for type of obj list linkage */
91 /* Neither of the first two cases is expected to happen, since
92 * we're only called after multiple classes of objects have been
93 * detected, hence multiple objects must be present.
96 impossible("simple_look(null)");
97 } else if (!(here ? otmp->nexthere : otmp->nobj)) {
100 winid tmpwin = create_nhwindow(NHW_MENU);
102 putstr(tmpwin, 0, "");
104 putstr(tmpwin, 0, doname(otmp));
105 otmp = here ? otmp->nexthere : otmp->nobj;
107 display_nhwindow(tmpwin, TRUE);
108 destroy_nhwindow(tmpwin);
113 collect_obj_classes(ilets, otmp, here, filter, itemcount)
115 register struct obj *otmp;
117 boolean FDECL((*filter), (OBJ_P));
120 register int iletct = 0;
124 ilets[iletct] = '\0'; /* terminate ilets so that index() will work */
126 c = def_oc_syms[(int) otmp->oclass].sym;
127 if (!index(ilets, c) && (!filter || (*filter)(otmp)))
128 ilets[iletct++] = c, ilets[iletct] = '\0';
130 otmp = here ? otmp->nexthere : otmp->nobj;
137 * Suppose some '?' and '!' objects are present, but '/' objects aren't:
138 * "a" picks all items without further prompting;
139 * "A" steps through all items, asking one by one;
140 * "?" steps through '?' items, asking, and ignores '!' ones;
141 * "/" becomes 'A', since no '/' present;
142 * "?a" or "a?" picks all '?' without further prompting;
143 * "/a" or "a/" becomes 'A' since there aren't any '/'
144 * (bug fix: 3.1.0 thru 3.1.3 treated it as "a");
145 * "?/a" or "a?/" or "/a?",&c picks all '?' even though no '/'
146 * (ie, treated as if it had just been "?a").
148 /*JP CHECK: 3.4.3
\82Å
\82Ì
\8cÄ
\82Ñ
\8fo
\82µ
\8c³
149 pickup.c:572:("
\8fE
\82¤") if (!query_classes(oclasses, &selective, &all_of_a_type,
150 pickup.c:2604:("
\8eæ
\82è
\8fo
\82·") if (query_classes(select, &one_by_one, &allflag,
151 pickup.c:2704:("
\93ü
\82ê
\82é") if (query_classes(select, &one_by_one, &allflag, "
\93ü
\82ê
\82é",
154 query_classes(oclasses, one_at_a_time, everything, action, objs, here,
157 boolean *one_at_a_time, *everything;
163 char ilets[36], inbuf[BUFSZ] = DUMMY; /* FIXME: hardcoded ilets[] length */
164 int iletct, oclassct;
165 boolean not_everything, filtered;
168 int itemcount, bcnt, ucnt, ccnt, xcnt, ocnt;
170 oclasses[oclassct = 0] = '\0';
171 *one_at_a_time = *everything = m_seen = FALSE;
174 iletct = collect_obj_classes(ilets, objs, here,
175 (boolean FDECL((*), (OBJ_P))) 0, &itemcount);
180 oclasses[0] = def_char_to_objclass(ilets[0]);
182 } else { /* more than one choice available */
183 /* additional choices */
184 ilets[iletct++] = ' ';
185 ilets[iletct++] = 'a';
186 ilets[iletct++] = 'A';
187 ilets[iletct++] = (objs == invent ? 'i' : ':');
189 if (itemcount && menu_on_demand)
190 ilets[iletct++] = 'm';
191 if (count_unpaid(objs))
192 ilets[iletct++] = 'u';
194 tally_BUCX(objs, here, &bcnt, &ucnt, &ccnt, &xcnt, &ocnt);
196 ilets[iletct++] = 'B';
198 ilets[iletct++] = 'U';
200 ilets[iletct++] = 'C';
202 ilets[iletct++] = 'X';
203 ilets[iletct] = '\0';
206 const char *where = 0;
207 char sym, oc_of_sym, *p;
210 oclasses[oclassct = 0] = '\0';
211 *one_at_a_time = *everything = FALSE;
212 not_everything = filtered = FALSE;
214 Sprintf(qbuf, "What kinds of thing do you want to %s? [%s]", action,
217 Sprintf(qbuf,"
\82Ç
\82Ì
\8eí
\97Þ
\82Ì
\82à
\82Ì
\82ð%s
\82©
\81H[%s]", jpolite(action),
221 if (*inbuf == '\033')
224 for (p = inbuf; (sym = *p++) != 0; ) {
228 *one_at_a_time = TRUE;
231 else if (sym == ':') {
232 simple_look(objs, here); /* dumb if objs==invent */
233 /* if we just scanned the contents of a container
234 then mark it as having known contents */
235 if (objs->where == OBJ_CONTAINED)
236 objs->ocontainer->cknown = 1;
238 } else if (sym == 'i') {
239 (void) display_inventory((char *) 0, TRUE);
241 } else if (sym == 'm') {
243 } else if (index("uBUCX", sym)) {
244 add_valid_menu_class(sym); /* 'u' or 'B','U','C',or 'X' */
247 oc_of_sym = def_char_to_objclass(sym);
248 if (index(ilets, sym)) {
249 add_valid_menu_class(oc_of_sym);
250 oclasses[oclassct++] = oc_of_sym;
251 oclasses[oclassct] = '\0';
255 where = !strcmp(action, "pick up") ? "here"
257 where = !strcmp(action, "
\8fE
\82¤") ? "
\82±
\82±"
259 : !strcmp(action, "take out") ? "inside" : "";
261 : !strcmp(action, "
\8eæ
\82è
\8fo
\82·") ? "
\82Ì
\92\86" : "";
264 There("are no %c's %s.", sym, where);
266 pline("%c
\82Í%s
\82É
\82È
\82¢
\81D", sym, where);
269 You("have no %c's.", sym);
271 You("%c
\82Í
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\81D", sym);
272 not_everything = TRUE;
275 } /* for p:sym in inbuf */
277 if (m_seen && menu_on_demand) {
278 *menu_on_demand = (((*everything || !oclassct) && !filtered)
282 if (!oclassct && (!*everything || not_everything)) {
283 /* didn't pick anything,
284 or tried to pick something that's not present */
285 *one_at_a_time = TRUE; /* force 'A' */
286 *everything = FALSE; /* inhibit 'a' */
292 /* check whether hero is bare-handedly touching a cockatrice corpse */
294 fatal_corpse_mistake(obj, remotely)
298 if (uarmg || remotely || obj->otyp != CORPSE
299 || !touch_petrifies(&mons[obj->corpsenm]) || Stone_resistance)
302 if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) {
303 display_nhwindow(WIN_MESSAGE, FALSE); /* --More-- */
308 pline("Touching %s is a fatal mistake.",
310 pline("%s
\82É
\90G
\82ê
\82é
\82Ì
\82Í
\92v
\96½
\93I
\82È
\8aÔ
\88á
\82¢
\82¾
\81D",
311 corpse_xname(obj, (const char *) 0, CXN_SINGULAR | CXN_ARTICLE));
312 instapetrify(killer_xname(obj));
316 /* attempting to manipulate a Rider's corpse triggers its revival */
318 rider_corpse_revival(obj, remotely)
322 if (!obj || obj->otyp != CORPSE || !is_rider(&mons[obj->corpsenm]))
326 pline("At your %s, the corpse suddenly moves...",
328 pline("
\82 \82È
\82½
\82ª%s
\82é
\82Æ
\93Ë
\91R
\8e\80\91Ì
\82ª
\93®
\82«
\8fo
\82µ
\82½
\81D
\81D
\81D",
330 remotely ? "attempted acquisition" : "touch");
332 remotely ? "
\8al
\93¾
\82µ
\82æ
\82¤
\82Æ
\82·" : "
\90G");
333 (void) revive_corpse(obj);
334 exercise(A_WIS, FALSE);
338 /* look at the objects at our location, unless there are too many of them */
340 check_here(picked_some)
343 register struct obj *obj;
346 /* count the objects here */
347 for (obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere) {
352 /* If there are objects here, take a look. */
357 (void) look_here(ct, picked_some);
359 read_engr_at(u.ux, u.uy);
363 /* Value set by query_objlist() for n_or_more(). */
364 static long val_for_n_or_more;
366 /* query_objlist callback: return TRUE if obj's count is >= reference value */
373 return (boolean) (obj->quan >= val_for_n_or_more);
376 /* list of valid menu classes for query_objlist() and allow_category callback
377 (with room for all object classes, 'u'npaid, BUCX, and terminator) */
378 static char valid_menu_classes[MAXOCLASSES + 1 + 4 + 1];
379 static boolean class_filter, bucx_filter, shop_filter;
381 /* check valid_menu_classes[] for an entry; also used by askchain() */
383 menu_class_present(c)
386 return (c && index(valid_menu_classes, c)) ? TRUE : FALSE;
390 add_valid_menu_class(c)
393 static int vmc_count = 0;
395 if (c == 0) { /* reset */
397 class_filter = bucx_filter = shop_filter = FALSE;
398 } else if (!menu_class_present(c)) {
399 valid_menu_classes[vmc_count++] = (char) c;
400 /* categorize the new class */
404 case 'C': /*FALLTHRU*/
416 valid_menu_classes[vmc_count] = '\0';
419 /* query_objlist callback: return TRUE if not uchain */
424 return (boolean) (obj != uchain);
427 /* query_objlist callback: return TRUE */
431 struct obj *obj UNUSED;
440 /* For coins, if any class filter is specified, accept if coins
441 * are included regardless of whether either unpaid or BUC-status
442 * is also specified since player has explicitly requested coins.
443 * If no class filtering is specified but bless/curse state is,
444 * coins are either unknown or uncursed based on an option setting.
446 if (obj->oclass == COIN_CLASS)
448 ? (index(valid_menu_classes, COIN_CLASS) ? TRUE : FALSE)
449 : shop_filter /* coins are never unpaid, but check anyway */
450 ? (obj->unpaid ? TRUE : FALSE)
452 ? (index(valid_menu_classes, iflags.goldX ? 'X' : 'U')
454 : TRUE; /* catchall: no filters specified, so accept */
456 if (Role_if(PM_PRIEST) && !obj->bknown)
460 * There are three types of filters possible and the first and
461 * third can have more than one entry:
462 * 1) object class (armor, potion, &c);
463 * 2) unpaid shop item;
464 * 3) bless/curse state (blessed, uncursed, cursed, BUC-unknown).
465 * When only one type is present, the situation is simple:
466 * to be accepted, obj's status must match one of the entries.
467 * When more than one type is present, the obj will now only
468 * be accepted when it matches one entry of each type.
469 * So ?!B will accept blessed scrolls or potions, and [u will
470 * accept unpaid armor. (In 3.4.3, an object was accepted by
471 * this filter if it met any entry of any type, so ?!B resulted
472 * in accepting all scrolls and potions regardless of bless/curse
473 * state plus all blessed non-scroll, non-potion objects.)
476 /* if class is expected but obj's class is not in the list, reject */
477 if (class_filter && !index(valid_menu_classes, obj->oclass))
479 /* if unpaid is expected and obj isn't unpaid, reject (treat a container
480 holding any unpaid object as unpaid even if isn't unpaid itself) */
481 if (shop_filter && !obj->unpaid
482 && !(Has_contents(obj) && count_unpaid(obj->cobj) > 0))
484 /* check for particular bless/curse state */
486 /* first categorize this object's bless/curse state */
487 char bucx = !obj->bknown ? 'X'
488 : obj->blessed ? 'B' : obj->cursed ? 'C' : 'U';
490 /* if its category is not in the list, reject */
491 if (!index(valid_menu_classes, bucx))
494 /* obj didn't fail any of the filter checks, so accept */
499 /* query_objlist callback: return TRUE if valid category (class), no uchain */
501 allow_cat_no_uchain(obj)
505 && ((index(valid_menu_classes, 'u') && obj->unpaid)
506 || index(valid_menu_classes, obj->oclass)))
512 /* query_objlist callback: return TRUE if valid class and worn */
514 is_worn_by_type(otmp)
515 register struct obj *otmp;
517 return (is_worn(otmp) && allow_category(otmp)) ? TRUE : FALSE;
521 * Have the hero pick things from the ground
522 * or a monster's inventory if swallowed.
527 * <0 pickup count of something
529 * Returns 1 if tried to pick something up, whether
530 * or not it succeeded.
534 int what; /* should be a long */
536 int i, n, res, count, n_tried = 0, n_picked = 0;
537 menu_item *pick_list = (menu_item *) 0;
538 boolean autopickup = what > 0;
539 struct obj **objchain_p;
542 /* we might have arrived here while fainted or sleeping, via
543 random teleport or levitation timeout; if so, skip check_here
544 and read_engr_at in addition to bypassing autopickup itself
545 [probably ought to check whether hero is using a cockatrice
546 corpse for a pillow here... (also at initial faint/sleep)] */
547 if (autopickup && multi < 0 && unconscious())
550 if (what < 0) /* pick N of something */
552 else /* pick anything */
558 /* no auto-pick if no-pick move, nothing there, or in a pool */
559 if (autopickup && (context.nopick || !OBJ_AT(u.ux, u.uy)
560 || (is_pool(u.ux, u.uy) && !Underwater)
561 || is_lava(u.ux, u.uy))) {
562 read_engr_at(u.ux, u.uy);
565 /* no pickup if levitating & not on air or water level */
566 if (!can_reach_floor(TRUE)) {
567 if ((multi && !context.run) || (autopickup && !flags.pickup)
568 || ((ttmp = t_at(u.ux, u.uy)) != 0
569 && (uteetering_at_seen_pit(ttmp) || uescaped_shaft(ttmp))))
570 read_engr_at(u.ux, u.uy);
573 /* multi && !context.run means they are in the middle of some other
574 * action, or possibly paralyzed, sleeping, etc.... and they just
575 * teleported onto the object. They shouldn't pick it up.
577 if ((multi && !context.run) || (autopickup && !flags.pickup)) {
581 if (notake(youmonst.data)) {
584 You("are physically incapable of picking anything up.");
586 You("
\95¨
\97\9d\93I
\82É
\8fE
\82¢
\82 \82°
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
592 /* if there's anything here, stop running */
593 if (OBJ_AT(u.ux, u.uy) && context.run && context.run != 8
598 add_valid_menu_class(0); /* reset */
600 objchain_p = &level.objects[u.ux][u.uy];
601 traverse_how = BY_NEXTHERE;
603 objchain_p = &u.ustuck->minvent;
604 traverse_how = 0; /* nobj */
607 * Start the actual pickup process. This is split into two main
608 * sections, the newer menu and the older "traditional" methods.
609 * Automatic pickup has been split into its own menu-style routine
610 * to make things less confusing.
613 n = autopick(*objchain_p, traverse_how, &pick_list);
617 if (flags.menu_style != MENU_TRADITIONAL || iflags.menu_requested) {
618 /* use menus exclusively */
619 traverse_how |= AUTOSELECT_SINGLE
620 | (flags.sortpack ? INVORDER_SORT : 0);
621 if (count) { /* looking for N of something */
625 Sprintf(qbuf, "Pick %d of what?", count);
627 Sprintf(qbuf, "
\89½
\82ð%d
\8cÂ
\8fE
\82¢
\82Ü
\82·
\82©
\81H", count);
628 val_for_n_or_more = count; /* set up callback selector */
629 n = query_objlist(qbuf, objchain_p, traverse_how,
630 &pick_list, PICK_ONE, n_or_more);
631 /* correct counts, if any given */
632 for (i = 0; i < n; i++)
633 pick_list[i].count = count;
636 n = query_objlist("Pick up what?", objchain_p,
637 (traverse_how | FEEL_COCKATRICE),
638 &pick_list, PICK_ANY, all_but_uchain);
640 n = query_objlist("
\89½
\82ð
\8fE
\82¢
\82Ü
\82·
\82©
\81H", objchain_p,
641 (traverse_how | FEEL_COCKATRICE),
642 &pick_list, PICK_ANY, all_but_uchain);
648 for (n_picked = i = 0; i < n; i++) {
649 res = pickup_object(pick_list[i].item.a_obj, pick_list[i].count,
652 break; /* can't continue */
656 free((genericptr_t) pick_list);
659 /* old style interface */
662 boolean all_of_a_type, selective, bycat;
663 char oclasses[MAXOCLASSES + 10]; /* +10: room for B,U,C,X plus slop */
664 struct obj *obj, *obj2;
666 oclasses[0] = '\0'; /* types to consider (empty for all) */
667 all_of_a_type = TRUE; /* take all of considered types */
668 selective = FALSE; /* ask for each item */
670 /* check for more than one object */
671 for (obj = *objchain_p; obj; obj = FOLLOW(obj, traverse_how))
674 if (ct == 1 && count) {
675 /* if only one thing, then pick it */
677 lcount = min(obj->quan, (long) count);
679 if (pickup_object(obj, lcount, FALSE) > 0)
680 n_picked++; /* picked something */
683 } else if (ct >= 2) {
687 There("are %s objects here.", (ct <= 10) ? "several" : "many");
689 pline("
\82±
\82±
\82É
\82Í%s
\82à
\82Ì
\82ª
\82 \82é
\81D", (ct <= 10) ? "
\82¢
\82
\82Â
\82©" : "
\91ò
\8eR
\82Ì");
691 if (!query_classes(oclasses, &selective, &all_of_a_type,
692 "pick up", *objchain_p,
693 (traverse_how & BY_NEXTHERE) ? TRUE : FALSE,
696 if (!query_classes(oclasses, &selective, &all_of_a_type,
697 "
\8fE
\82¤", *objchain_p,
698 (traverse_how & BY_NEXTHERE) ? TRUE : FALSE,
704 traverse_how |= INVORDER_SORT;
706 n = query_objlist("Pick up what?", objchain_p, traverse_how,
707 &pick_list, PICK_ANY,
708 (via_menu == -2) ? allow_all
711 n = query_objlist("
\89½
\82ð
\8fE
\82¢
\82Ü
\82·
\82©
\81H", objchain_p, traverse_how,
712 &pick_list, PICK_ANY,
713 (via_menu == -2) ? allow_all
719 bycat = (menu_class_present('B') || menu_class_present('U')
720 || menu_class_present('C') || menu_class_present('X'));
722 for (obj = *objchain_p; obj; obj = obj2) {
723 obj2 = FOLLOW(obj, traverse_how);
724 if (bycat ? !allow_category(obj)
725 : (!selective && oclasses[0]
726 && !index(oclasses, obj->oclass)))
730 if (!all_of_a_type) {
734 (void) safe_qbuf(qbuf, "Pick up ", "?", obj, doname,
735 ansimpleoname, something);
737 (void) safe_qbuf(qbuf, "", "
\82ð
\8fE
\82¢
\82Ü
\82·
\82©
\81H", obj, doname,
738 ansimpleoname, "
\82±
\82ê");
740 switch ((obj->quan < 2L) ? ynaq(qbuf) : ynNaq(qbuf)) {
742 goto end_query; /* out 2 levels */
746 all_of_a_type = TRUE;
749 oclasses[0] = obj->oclass;
753 case '#': /* count was entered */
755 continue; /* 0 count => No */
756 lcount = (long) yn_number;
757 if (lcount > obj->quan)
768 if ((res = pickup_object(obj, lcount, FALSE)) < 0)
773 ; /* statement required after label */
777 if (hides_under(youmonst.data))
778 (void) hideunder(&youmonst);
780 /* position may need updating (invisible hero) */
782 newsym_force(u.ux, u.uy);
784 /* check if there's anything else here after auto-pickup is done */
786 check_here(n_picked > 0);
789 add_valid_menu_class(0); /* reset */
790 return (n_tried > 0);
793 struct autopickup_exception *
794 check_autopickup_exceptions(obj)
798 * Does the text description of this match an exception?
800 struct autopickup_exception *ape = apelist;
803 char *objdesc = makesingular(doname(obj));
805 while (ape && !regex_match(objdesc, ape->regex))
812 autopick_testobj(otmp, calc_costly)
816 struct autopickup_exception *ape;
817 static boolean costly = FALSE;
818 const char *otypes = flags.pickup_types;
821 /* calculate 'costly' just once for a given autopickup operation */
823 costly = (otmp->where == OBJ_FLOOR
824 && costly_spot(otmp->ox, otmp->oy));
826 /* first check: reject if an unpaid item in a shop */
827 if (costly && !otmp->no_charge)
830 /* check for pickup_types */
831 pickit = (!*otypes || index(otypes, otmp->oclass));
833 /* check for autopickup exceptions */
834 ape = check_autopickup_exceptions(otmp);
838 /* pickup_thrown overrides pickup_types and exceptions */
840 pickit = (flags.pickup_thrown && otmp->was_thrown);
845 * Pick from the given list using flags.pickup_types. Return the number
846 * of items picked (not counts). Create an array that returns pointers
847 * and counts of the items to be picked up. If the number of items
848 * picked is zero, the pickup list is left alone. The caller of this
849 * function must free the pickup list.
852 autopick(olist, follow, pick_list)
853 struct obj *olist; /* the object list */
854 int follow; /* how to follow the object list */
855 menu_item **pick_list; /* list of objects and counts to pick up */
857 menu_item *pi; /* pick item */
860 boolean check_costly = TRUE;
862 /* first count the number of eligible items */
863 for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) {
864 if (autopick_testobj(curr, check_costly))
866 check_costly = FALSE; /* only need to check once per autopickup */
870 *pick_list = pi = (menu_item *) alloc(sizeof (menu_item) * n);
871 for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) {
872 if (autopick_testobj(curr, FALSE)) {
873 pi[n].item.a_obj = curr;
874 pi[n].count = curr->quan;
883 * Put up a menu using the given object list. Only those objects on the
884 * list that meet the approval of the allow function are displayed. Return
885 * a count of the number of items selected, as well as an allocated array of
886 * menu_items, containing pointers to the objects selected and counts. The
887 * returned counts are guaranteed to be in bounds and non-zero.
890 * BY_NEXTHERE - Follow object list via nexthere instead of nobj.
891 * AUTOSELECT_SINGLE - Don't ask if only 1 object qualifies - just
893 * USE_INVLET - Use object's invlet.
894 * INVORDER_SORT - Use hero's pack order.
895 * INCLUDE_HERO - Showing engulfer's invent; show hero too.
896 * SIGNAL_NOMENU - Return -1 rather than 0 if nothing passes "allow".
897 * SIGNAL_ESCAPE - Return -1 rather than 0 if player uses ESC to
899 * FEEL_COCKATRICE - touch corpse.
902 query_objlist(qstr, olist_p, qflags, pick_list, how, allow)
903 const char *qstr; /* query string */
904 struct obj **olist_p; /* the list to pick from */
905 int qflags; /* options to control the query */
906 menu_item **pick_list; /* return list of items picked */
907 int how; /* type of query */
908 boolean FDECL((*allow), (OBJ_P)); /* allow function */
912 struct obj *curr, *last, fake_hero_object, *olist = *olist_p;
915 boolean printed_type_name, first,
916 sorted = (qflags & INVORDER_SORT) != 0,
917 engulfer = (qflags & INCLUDE_HERO) != 0,
920 Loot *sortedolist, *srtoli;
922 *pick_list = (menu_item *) 0;
923 if (!olist && !engulfer)
926 /* count the number of items allowed */
927 for (n = 0, last = 0, curr = olist; curr; curr = FOLLOW(curr, qflags))
928 if ((*allow)(curr)) {
932 /* can't depend upon 'engulfer' because that's used to indicate whether
933 hero should be shown as an extra, fake item */
934 engulfer_minvent = (olist && olist->where == OBJ_MINVENT
935 && u.uswallow && olist->ocarry == u.ustuck);
936 if (engulfer_minvent && n == 1 && olist->owornmask != 0L) {
937 qflags &= ~AUTOSELECT_SINGLE;
941 /* don't autoselect swallowed hero if it's the only choice */
942 qflags &= ~AUTOSELECT_SINGLE;
945 if (n == 0) /* nothing to pick here */
946 return (qflags & SIGNAL_NOMENU) ? -1 : 0;
948 if (n == 1 && (qflags & AUTOSELECT_SINGLE)) {
949 *pick_list = (menu_item *) alloc(sizeof (menu_item));
950 (*pick_list)->item.a_obj = last;
951 (*pick_list)->count = last->quan;
955 sortflags = (((flags.sortloot == 'f'
956 || (flags.sortloot == 'l' && !(qflags & USE_INVLET)))
958 : ((qflags & USE_INVLET) ? SORTLOOT_INVLET : 0))
959 | (flags.sortpack ? SORTLOOT_PACK : 0)
960 | ((qflags & FEEL_COCKATRICE) ? SORTLOOT_PETRIFY : 0));
961 sortedolist = sortloot(&olist, sortflags,
962 (qflags & BY_NEXTHERE) ? TRUE : FALSE, allow);
964 win = create_nhwindow(NHW_MENU);
968 * Run through the list and add the objects to the menu. If
969 * INVORDER_SORT is set, we'll run through the list once for
970 * each type so we can group them. The allow function was
971 * called by sortloot() and will be called once per item here.
973 pack = flags.inv_order;
976 printed_type_name = FALSE;
977 for (srtoli = sortedolist; ((curr = srtoli->obj) != 0); ++srtoli) {
978 if (sorted && curr->oclass != *pack)
980 if ((qflags & FEEL_COCKATRICE) && curr->otyp == CORPSE
981 && will_feel_cockatrice(curr, FALSE)) {
982 destroy_nhwindow(win); /* stop the menu and revert */
983 (void) look_here(0, FALSE);
984 unsortloot(&sortedolist);
987 if ((*allow)(curr)) {
988 /* if sorting, print type name (once only) */
989 if (sorted && !printed_type_name) {
991 add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
992 let_to_name(*pack, FALSE,
994 && iflags.menu_head_objsym)),
996 printed_type_name = TRUE;
1000 add_menu(win, obj_to_glyph(curr, rn2_on_display_rng), &any,
1001 (qflags & USE_INVLET) ? curr->invlet
1002 : (first && curr->oclass == COIN_CLASS) ? '$' : 0,
1003 def_oc_syms[(int) objects[curr->otyp].oc_class].sym,
1004 ATR_NONE, doname_with_price(curr), MENU_UNSELECTED);
1009 } while (sorted && *pack);
1010 unsortloot(&sortedolist);
1016 if (sorted && n > 1) {
1018 Sprintf(buf, "%s Creatures",
1019 is_animal(u.ustuck->data) ? "Swallowed" : "Engulfed");
1021 Sprintf(buf, "%s
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82é
\89ö
\95¨",
1022 is_animal(u.ustuck->data) ? "
\88ù
\82Ý" : "
\8aª
\82«");
1024 add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings, buf,
1027 fake_hero_object = zeroobj;
1028 fake_hero_object.quan = 1L; /* not strictly necessary... */
1029 any.a_obj = &fake_hero_object;
1030 add_menu(win, mon_to_glyph(&youmonst, rn2_on_display_rng), &any,
1031 /* fake inventory letter, no group accelerator */
1032 CONTAINED_SYM, 0, ATR_NONE, an(self_lookat(buf)),
1036 end_menu(win, qstr);
1037 n = select_menu(win, how, pick_list);
1038 destroy_nhwindow(win);
1044 /* fix up counts: -1 means no count used => pick all;
1045 if fake_hero_object was picked, discard that choice */
1046 for (i = k = 0, mi = *pick_list; i < n; i++, mi++) {
1047 curr = mi->item.a_obj;
1048 if (curr == &fake_hero_object) {
1049 /* this isn't actually possible; fake item representing
1050 hero is only included for look here (':'), not pickup,
1051 and that's PICK_NONE so we can't get here from there */
1053 You_cant("pick yourself up!");
1055 You_cant("
\8e©
\95ª
\8e©
\90g
\82Í
\8fE
\82¦
\82È
\82¢
\81I");
1058 if (engulfer_minvent && curr->owornmask != 0L) {
1060 You_cant("pick %s up.", ysimple_name(curr));
1062 You_cant("%s
\82ð
\8fE
\82¦
\82È
\82¢
\81D", ysimple_name(curr));
1065 if (mi->count == -1L || mi->count > curr->quan)
1066 mi->count = curr->quan;
1068 (*pick_list)[k] = *mi;
1072 /* fake_hero was only choice so discard whole list */
1073 free((genericptr_t) *pick_list);
1077 /* other stuff plus fake_hero; last slot is now unused
1078 (could be more than one if player tried to pick items
1079 worn by engulfer) */
1082 (*pick_list)[n].item = zeroany;
1083 (*pick_list)[n].count = 0L;
1087 /* -1 is used for SIGNAL_NOMENU, so callers don't expect it
1088 to indicate that the player declined to make a choice */
1089 n = (qflags & SIGNAL_ESCAPE) ? -2 : 0;
1095 * allow menu-based category (class) selection (for Drop,take off etc.)
1099 query_category(qstr, olist, qflags, pick_list, how)
1100 const char *qstr; /* query string */
1101 struct obj *olist; /* the list to pick from */
1102 int qflags; /* behaviour modification flags */
1103 menu_item **pick_list; /* return list of items picked */
1104 int how; /* type of query */
1111 boolean collected_type_name;
1114 boolean FDECL((*ofilter), (OBJ_P)) = (boolean FDECL((*), (OBJ_P))) 0;
1115 boolean do_unpaid = FALSE;
1116 boolean do_blessed = FALSE, do_cursed = FALSE, do_uncursed = FALSE,
1117 do_buc_unknown = FALSE;
1118 int num_buc_types = 0;
1120 *pick_list = (menu_item *) 0;
1123 if ((qflags & UNPAID_TYPES) && count_unpaid(olist))
1125 if (qflags & WORN_TYPES)
1127 if ((qflags & BUC_BLESSED) && count_buc(olist, BUC_BLESSED, ofilter)) {
1131 if ((qflags & BUC_CURSED) && count_buc(olist, BUC_CURSED, ofilter)) {
1135 if ((qflags & BUC_UNCURSED) && count_buc(olist, BUC_UNCURSED, ofilter)) {
1139 if ((qflags & BUC_UNKNOWN) && count_buc(olist, BUC_UNKNOWN, ofilter)) {
1140 do_buc_unknown = TRUE;
1144 ccount = count_categories(olist, qflags);
1145 /* no point in actually showing a menu for a single category */
1146 if (ccount == 1 && !do_unpaid && num_buc_types <= 1
1147 && !(qflags & BILLED_TYPES)) {
1148 for (curr = olist; curr; curr = FOLLOW(curr, qflags)) {
1149 if (ofilter && !(*ofilter)(curr))
1154 *pick_list = (menu_item *) alloc(sizeof(menu_item));
1155 (*pick_list)->item.a_int = curr->oclass;
1158 debugpline0("query_category: no single object match");
1161 /* early return is ok; there's no temp window yet */
1165 win = create_nhwindow(NHW_MENU);
1167 pack = flags.inv_order;
1169 if (qflags & CHOOSE_ALL) {
1173 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1175 (qflags & WORN_TYPES) ? "Auto-select every item being worn"
1177 (qflags & WORN_TYPES) ? "
\90g
\82É
\82Â
\82¯
\82ç
\82ê
\82é
\95¨
\91S
\82Ä"
1179 : "Auto-select every item",
1185 add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED);
1188 if ((qflags & ALL_TYPES) && (ccount > 1)) {
1191 any.a_int = ALL_TYPES_SELECTED;
1192 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1194 (qflags & WORN_TYPES) ? "All worn types" : "All types",
1196 (qflags & WORN_TYPES) ? "
\90g
\82É
\82Â
\82¯
\82é
\82à
\82Ì
\91S
\82Ä" : "
\91S
\82Ä",
1202 collected_type_name = FALSE;
1203 for (curr = olist; curr; curr = FOLLOW(curr, qflags)) {
1204 if (curr->oclass == *pack) {
1205 if (ofilter && !(*ofilter)(curr))
1207 if (!collected_type_name) {
1209 any.a_int = curr->oclass;
1211 win, NO_GLYPH, &any, invlet++,
1212 def_oc_syms[(int) objects[curr->otyp].oc_class].sym,
1213 ATR_NONE, let_to_name(*pack, FALSE,
1215 && iflags.menu_head_objsym),
1217 collected_type_name = TRUE;
1222 if (invlet >= 'u') {
1223 impossible("query_category: too many categories");
1229 if (do_unpaid || (qflags & BILLED_TYPES) || do_blessed || do_cursed
1230 || do_uncursed || do_buc_unknown) {
1232 add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED);
1235 /* unpaid items if there are any */
1241 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, "Unpaid items",
1243 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, "
\96¢
\95¥
\82Ì
\82à
\82Ì",
1246 /* billed items: checked by caller, so always include if BILLED_TYPES */
1247 if (qflags & BILLED_TYPES) {
1251 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1253 "Unpaid items already used up", MENU_UNSELECTED);
1255 "
\96¢
\95¥
\82Å
\8eg
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\82à
\82Ì", MENU_UNSELECTED);
1258 /* items with b/u/c/unknown if there are any;
1259 this cluster of menu entries is in alphabetical order,
1260 reversing the usual sequence of 'U' and 'C' in BUCX */
1265 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1267 "Items known to be Blessed", MENU_UNSELECTED);
1269 "
\8fj
\95\9f\82³
\82ê
\82Ä
\82¢
\82é
\82Æ
\82í
\82©
\82Á
\82Ä
\82¢
\82é
\82à
\82Ì", MENU_UNSELECTED);
1275 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1277 "Items known to be Cursed", MENU_UNSELECTED);
1279 "
\8eô
\82í
\82ê
\82Ä
\82¢
\82é
\82Æ
\82í
\82©
\82Á
\82Ä
\82¢
\82é
\82à
\82Ì", MENU_UNSELECTED);
1285 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1287 "Items known to be Uncursed", MENU_UNSELECTED);
1289 "
\8eô
\82í
\82ê
\82Ä
\82¢
\82È
\82¢
\82Æ
\82í
\82©
\82Á
\82Ä
\82¢
\82é
\82à
\82Ì", MENU_UNSELECTED);
1291 if (do_buc_unknown) {
1296 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1297 "Items of unknown Bless/Curse status", MENU_UNSELECTED);
1299 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1300 "
\8fj
\95\9f\81^
\8eô
\82¢
\82ª
\82í
\82©
\82ç
\82È
\82¢
\82à
\82Ì", MENU_UNSELECTED);
1303 end_menu(win, qstr);
1304 n = select_menu(win, how, pick_list);
1306 destroy_nhwindow(win);
1308 n = 0; /* caller's don't expect -1 */
1313 count_categories(olist, qflags)
1318 boolean counted_category;
1322 pack = flags.inv_order;
1324 counted_category = FALSE;
1325 for (curr = olist; curr; curr = FOLLOW(curr, qflags)) {
1326 if (curr->oclass == *pack) {
1327 if ((qflags & WORN_TYPES)
1328 && !(curr->owornmask & (W_ARMOR | W_ACCESSORY
1331 if (!counted_category) {
1333 counted_category = TRUE;
1343 * How much the weight of the given container will change when the given
1344 * object is removed from it. Use before and after weight amounts rather
1345 * than trying to match the calculation used by weight() in mkobj.c.
1348 delta_cwt(container, obj)
1349 struct obj *container, *obj;
1354 if (container->otyp != BAG_OF_HOLDING)
1357 owt = nwt = container->owt;
1358 /* find the object so that we can remove it */
1359 for (prev = &container->cobj; *prev; prev = &(*prev)->nobj)
1363 panic("delta_cwt: obj not inside container?");
1365 /* temporarily remove the object and calculate resulting weight */
1367 nwt = weight(container);
1368 *prev = obj; /* put the object back; obj->nobj is still valid */
1373 /* could we carry `obj'? if not, could we carry some of it/them? */
1375 carry_count(obj, container, count, telekinesis, wt_before, wt_after)
1376 struct obj *obj, *container; /* object to pick up, bag it's coming out of */
1378 boolean telekinesis;
1379 int *wt_before, *wt_after;
1381 boolean adjust_wt = container && carried(container),
1382 is_gold = obj->oclass == COIN_CLASS;
1383 int wt, iw, ow, oow;
1384 long qq, savequan, umoney;
1387 const char *verb, *prefx1, *prefx2, *suffx;
1389 const char *verb, *prefx1;
1391 char obj_nambuf[BUFSZ], where[BUFSZ];
1393 savequan = obj->quan;
1395 umoney = money_cnt(invent);
1396 iw = max_capacity();
1398 if (count != savequan) {
1400 obj->owt = (unsigned) weight(obj);
1402 wt = iw + (int) obj->owt;
1404 wt -= delta_cwt(container, obj);
1405 /* This will go with silver+copper & new gold weight */
1406 if (is_gold) /* merged gold might affect cumulative weight */
1407 wt -= (GOLD_WT(umoney) + GOLD_WT(count) - GOLD_WT(umoney + count));
1408 if (count != savequan) {
1409 obj->quan = savequan;
1418 /* see how many we can lift */
1420 iw -= (int) GOLD_WT(umoney);
1422 qq = GOLD_CAPACITY((long) iw, umoney);
1425 qq = 50L - (umoney % 100L) - 1L;
1428 for (; qq <= count; qq += 100L) {
1430 obj->owt = (unsigned) GOLD_WT(qq);
1431 ow = (int) GOLD_WT(umoney + qq);
1432 ow -= delta_cwt(container, obj);
1442 else if (qq > count)
1444 wt = iw + (int) GOLD_WT(umoney + qq);
1445 } else if (count > 1 || count < obj->quan) {
1447 * Ugh. Calc num to lift by changing the quan of of the
1448 * object and calling weight.
1450 * This works for containers only because containers
1451 * don't merge. -dean
1453 for (qq = 1L; qq <= count; qq++) {
1455 obj->owt = (unsigned) (ow = weight(obj));
1457 ow -= delta_cwt(container, obj);
1464 /* there's only one, and we can't lift it */
1467 obj->quan = savequan;
1471 /* some message will be given */
1472 Strcpy(obj_nambuf, doname(obj));
1475 Sprintf(where, "in %s", the(xname(container)));
1477 Sprintf(where, "%s
\82Ì
\92\86\82É
\93ü
\82Á
\82Ä
\82¢
\82é", the(xname(container)));
1481 verb = "
\89^
\82×
\82È
\82¢";
1484 Strcpy(where, "lying here");
1486 Strcpy(where, "
\82±
\82±
\82É
\92u
\82¢
\82Ä
\82 \82é");
1488 verb = telekinesis ? "acquire" : "lift";
1490 verb = telekinesis ? "
\8al
\93¾
\82Å
\82«
\82È
\82¢" : "
\8e\9d\82¿
\82 \82°
\82ç
\82ê
\82È
\82¢";
1493 /* lint suppression */
1494 *obj_nambuf = *where = '\0';
1497 /* we can carry qq of them */
1501 You("can only %s %s of the %s %s.", verb,
1502 (qq == 1L) ? "one" : "some", obj_nambuf, where);
1504 You("%s%s
\82Ì
\82¤
\82¿
\82Ì%s
\82µ
\82©%s
\81D",
1505 where, obj_nambuf, (qq == 1L) ? "
\88ê
\82Â" : "
\82¢
\82
\82Â
\82©", verb);
1513 Strcpy(where, "here"); /* slightly shorter form */
1515 Strcpy(where, "
\82±
\82±
\82É
\82Í"); /* slightly shorter form */
1517 if (invent || umoney) {
1519 prefx1 = "you cannot ";
1521 suffx = " any more";
1523 prefx1 = "
\82±
\82ê
\88È
\8fã";
1527 prefx1 = (obj->quan == 1L) ? "it " : "even one ";
1528 prefx2 = "is too heavy for you to ";
1531 prefx1 = "
\8fd
\82·
\82¬
\82Ä";
1535 There("%s %s %s, but %s%s%s%s.", otense(obj, "are"), obj_nambuf, where,
1536 prefx1, prefx2, verb, suffx);
1538 pline("%s%s
\82ª
\82 \82é
\81C
\82µ
\82©
\82µ%s%s
\81D",
1539 where, obj_nambuf, prefx1, verb);
1542 /* *wt_after = iw; */
1546 /* determine whether character is able and player is willing to carry `obj' */
1549 lift_object(obj, container, cnt_p, telekinesis)
1550 struct obj *obj, *container; /* object to pick up, bag it's coming out of */
1552 boolean telekinesis;
1554 int result, old_wt, new_wt, prev_encumbr, next_encumbr;
1556 if (obj->otyp == BOULDER && Sokoban) {
1558 You("cannot get your %s around this %s.", body_part(HAND),
1561 You("%s
\82ð%s
\82Å
\8e\9d\82¿
\82 \82°
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D",
1562 xname(obj), body_part(HAND));
1566 /* override weight consideration for loadstone picked up by anybody
1567 and for boulder picked up by hero poly'd into a giant; override
1568 availability of open inventory slot iff not already carrying one */
1569 if (obj->otyp == LOADSTONE
1570 || (obj->otyp == BOULDER && throws_rocks(youmonst.data))) {
1571 if (inv_cnt(FALSE) < 52 || !carrying(obj->otyp)
1572 || merge_choice(invent, obj))
1573 return 1; /* lift regardless of current situation */
1574 /* if we reach here, we're out of slots and already have at least
1575 one of these, so treat this one more like a normal item */
1577 You("are carrying too much stuff to pick up %s %s.",
1578 (obj->quan == 1L) ? "another" : "more", simpleonames(obj));
1580 You("%s
\82ð%s
\8fE
\82¤
\82É
\82Í
\95¨
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä
\82¢
\82é
\81D",
1581 simpleonames(obj), (obj->quan == 1L) ? "
\82à
\82¤
\88ê
\82Â" : "
\82à
\82Á
\82Æ");
1586 *cnt_p = carry_count(obj, container, *cnt_p, telekinesis,
1589 result = -1; /* nothing lifted */
1590 } else if (obj->oclass != COIN_CLASS
1591 /* [exception for gold coins will have to change
1592 if silver/copper ones ever get implemented] */
1593 && inv_cnt(FALSE) >= 52 && !merge_choice(invent, obj)) {
1594 /* if there is some gold here (and we haven't already skipped it),
1595 we aren't limited by the 52 item limit for it, but caller and
1596 "grandcaller" aren't prepared to skip stuff and then pickup
1597 just gold, so the best we can do here is vary the message */
1599 Your("knapsack cannot accommodate any more items%s.",
1600 /* floor follows by nexthere, otherwise container so by nobj */
1601 nxtobj(obj, GOLD_PIECE, (boolean) (obj->where == OBJ_FLOOR))
1602 ? " (except gold)" : "");
1604 Your("
\83i
\83b
\83v
\83U
\83b
\83N
\82Í%s
\82±
\82ê
\88È
\8fã
\83A
\83C
\83e
\83\80\82ð
\8bl
\82ß
\8d\9e\82ß
\82È
\82¢
\81D",
1605 /* floor follows by nexthere, otherwise container so by nobj */
1606 nxtobj(obj, GOLD_PIECE, (boolean) (obj->where == OBJ_FLOOR))
1607 ? "(
\8bà
\89Ý
\88È
\8aO)" : "");
1609 result = -1; /* nothing lifted */
1612 prev_encumbr = near_capacity();
1613 if (prev_encumbr < flags.pickup_burden)
1614 prev_encumbr = flags.pickup_burden;
1615 next_encumbr = calc_capacity(new_wt - old_wt);
1616 if (next_encumbr > prev_encumbr) {
1618 result = 0; /* don't lift */
1624 long savequan = obj->quan;
1628 Strcpy(qbuf, (next_encumbr > HVY_ENCUMBER)
1630 : (next_encumbr > MOD_ENCUMBER)
1634 /*JP:
\83A
\83C
\83e
\83\80\96¼
\82Ì
\8cã
\82ë
\82É
\95t
\82¯
\82½
\82¢
\82ªsafe_qbuf
\82Ìqsuffix
\82Í
1635 qbuf
\82Æ
\8b¤
\97p
\82Å
\82«
\82È
\82¢
\82Ì
\82Å
\95Ê
\82Éqsfx
\82ð
\97p
\88Ó
\82µ
\82Ä
\82»
\82¿
\82ç
\82ð
\8eg
\82¤*/
1636 Strcpy(qsfx, (next_encumbr > HVY_ENCUMBER)
1638 : (next_encumbr > MOD_ENCUMBER)
1641 Strcat(qsfx, "
\81D
\91±
\82¯
\82Ü
\82·
\82©
\81H");
1644 #if 0 /*JP*//*
\93ú
\96{
\8cê
\82Å
\82Í
\82Ç
\82¿
\82ç
\82à
\81u
\8e\9d\82Â
\81v
\82Å
\8dÏ
\82Ü
\82¹
\82é*/
1646 (void) strsubst(qbuf, "lifting", "removing");
1650 (void) safe_qbuf(qbuf, qbuf, ". Continue?", obj, doname,
1651 ansimpleoname, something);
1652 #else /*JP:
\91O
\82É
\82Í
\89½
\82à
\95t
\82¯
\82¸
\8cã
\82ë
\82Éqsfx
\82ð
\95t
\82¯
\82é*/
1653 (void) safe_qbuf(qbuf, "", qsfx, obj, doname,
1654 ansimpleoname, "
\82±
\82ê");
1656 obj->quan = savequan;
1657 switch (ynq(qbuf)) {
1665 break; /* 'y' => result == 1 */
1667 clear_nhwindow(WIN_MESSAGE);
1672 if (obj->otyp == SCR_SCARE_MONSTER && result <= 0 && !container)
1678 * Pick up <count> of obj from the ground and add it to the hero's inventory.
1679 * Returns -1 if caller should break out of its loop, 0 if nothing picked
1680 * up, 1 if otherwise.
1683 pickup_object(obj, count, telekinesis)
1686 boolean telekinesis; /* not picking it up directly by hand */
1690 if (obj->quan < count) {
1691 impossible("pickup_object: count %ld > quan %ld?", count, obj->quan);
1695 /* In case of auto-pickup, where we haven't had a chance
1696 to look at it yet; affects docall(SCR_SCARE_MONSTER). */
1700 if (obj == uchain) { /* do not pick up attached chain */
1702 } else if (obj->where == OBJ_MINVENT && obj->owornmask != 0L
1703 && u.uswallow && obj->ocarry == u.ustuck) {
1705 You_cant("pick %s up.", ysimple_name(obj));
1707 You_cant("%s
\82ð
\8fE
\82¦
\82È
\82¢
\81D", ysimple_name(obj));
1709 } else if (obj->oartifact && !touch_artifact(obj, &youmonst)) {
1711 } else if (obj->otyp == CORPSE) {
1712 if (fatal_corpse_mistake(obj, telekinesis)
1713 || rider_corpse_revival(obj, telekinesis))
1715 } else if (obj->otyp == SCR_SCARE_MONSTER) {
1718 else if (!obj->spe && !obj->cursed)
1722 pline_The("scroll%s %s to dust as you %s %s up.", plur(obj->quan),
1723 otense(obj, "turn"), telekinesis ? "raise" : "pick",
1724 (obj->quan == 1L) ? "it" : "them");
1726 pline("
\8aª
\95¨
\82Í
\82 \82È
\82½
\82ª%s
\8fã
\82°
\82é
\82Æ
\90o
\82Æ
\82È
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D",
1727 telekinesis ? "
\8e\9d\82¿" : "
\8fE
\82¢");
1729 if (!(objects[SCR_SCARE_MONSTER].oc_name_known)
1730 && !(objects[SCR_SCARE_MONSTER].oc_uname))
1732 useupf(obj, obj->quan);
1733 return 1; /* tried to pick something up and failed, but
1734 don't want to terminate pickup loop yet */
1738 if ((res = lift_object(obj, (struct obj *) 0, &count, telekinesis)) <= 0)
1741 /* Whats left of the special case for gold :-) */
1742 if (obj->oclass == COIN_CLASS)
1744 if (obj->quan != count && obj->otyp != LOADSTONE)
1745 obj = splitobj(obj, count);
1747 obj = pick_obj(obj);
1749 if (uwep && uwep == obj)
1750 mrg_to_wielded = TRUE;
1751 nearload = near_capacity();
1752 prinv(nearload == SLT_ENCUMBER ? moderateloadmsg : (char *) 0, obj,
1754 mrg_to_wielded = FALSE;
1759 * Do the actual work of picking otmp from the floor or monster's interior
1760 * and putting it in the hero's inventory. Take care of billing. Return a
1761 * pointer to the object where otmp ends up. This may be different
1762 * from otmp because of merging.
1769 int ox = otmp->ox, oy = otmp->oy;
1770 boolean robshop = (!u.uswallow && otmp != uball && costly_spot(ox, oy));
1772 obj_extract_self(otmp);
1775 /* for shop items, addinv() needs to be after addtobill() (so that
1776 object merger can take otmp->unpaid into account) but before
1777 remote_robbery() (which calls rob_shop() which calls setpaid()
1778 after moving costs of unpaid items to shop debt; setpaid()
1779 calls clear_unpaid() for lots of object chains, but 'otmp' isn't
1780 on any of those between obj_extract_self() and addinv(); for
1781 3.6.0, 'otmp' remained flagged as an unpaid item in inventory
1782 and triggered impossible() every time inventory was examined) */
1784 char saveushops[5], fakeshop[2];
1786 /* addtobill cares about your location rather than the object's;
1787 usually they'll be the same, but not when using telekinesis
1788 (if ever implemented) or a grappling hook */
1789 Strcpy(saveushops, u.ushops);
1790 fakeshop[0] = *in_rooms(ox, oy, SHOPBASE);
1792 Strcpy(u.ushops, fakeshop);
1793 /* sets obj->unpaid if necessary */
1794 addtobill(otmp, TRUE, FALSE, FALSE);
1795 Strcpy(u.ushops, saveushops);
1796 robshop = otmp->unpaid && !index(u.ushops, *fakeshop);
1799 result = addinv(otmp);
1800 /* if you're taking a shop item from outside the shop, make shk notice */
1802 remote_burglary(ox, oy);
1808 * prints a message if encumbrance changed since the last check and
1809 * returns the new encumbrance value (from near_capacity()).
1814 static int oldcap = UNENCUMBERED;
1815 int newcap = near_capacity();
1817 if (oldcap < newcap) {
1821 Your("movements are slowed slightly because of your load.");
1823 Your("
\93®
\82«
\82Í
\89×
\95¨
\82Ì
\82½
\82ß
\82É
\8f
\82µ
\92x
\82
\82È
\82Á
\82½
\81D");
1827 You("rebalance your load. Movement is difficult.");
1829 You("
\89×
\95¨
\82Ì
\92Þ
\8d\87\82ð
\82Æ
\82è
\92¼
\82µ
\82½
\82ª
\81C
\93®
\82«
\82É
\82
\82¢
\81D");
1833 You("%s under your heavy load. Movement is very hard.",
1834 stagger(youmonst.data, "stagger"));
1836 You("
\89×
\95¨
\82Ì
\8fd
\82Ý
\82Å
\82æ
\82ë
\82æ
\82ë
\82µ
\82½
\81D
\93®
\82
\82Ì
\82ª
\94ñ
\8fí
\82É
\82«
\82Â
\82¢
\81D");
1841 You("%s move a handspan with this load!",
1842 newcap == 4 ? "can barely" : "can't even");
1844 You("
\82±
\82Ì
\8fd
\82³
\82Å
\82Í
\8f
\82µ
\82à
\93®
\82¯
\82È
\82¢
\81I");
1849 } else if (oldcap > newcap) {
1853 Your("movements are now unencumbered.");
1855 Your("
\93®
\82«
\82Í
\8ay
\82É
\82È
\82Á
\82½
\81D");
1859 Your("movements are only slowed slightly by your load.");
1861 You("
\82¿
\82å
\82Á
\82Æ
\93®
\82«
\82â
\82·
\82
\82È
\82Á
\82½
\81D");
1865 You("rebalance your load. Movement is still difficult.");
1867 You("
\89×
\95¨
\82Ì
\92Þ
\8d\87\82ð
\82Æ
\82è
\92¼
\82µ
\82½
\81D
\82¾
\82ª
\82Ü
\82¾
\93®
\82
\82Ì
\82Í
\82«
\82Â
\82¢
\81D");
1871 You("%s under your load. Movement is still very hard.",
1872 stagger(youmonst.data, "stagger"));
1874 You("
\89×
\95¨
\82Ì
\8fd
\82Ý
\82ª
\82¸
\82Á
\82µ
\82è
\82Æ
\82
\82é
\81D
\82Ü
\82¾
\93®
\82
\82Ì
\82ª
\94ñ
\8fí
\82É
\82«
\82Â
\82¢
\81D");
1885 /* Is there a container at x,y. Optional: return count of containers at x,y */
1887 container_at(x, y, countem)
1891 struct obj *cobj, *nobj;
1892 int container_count = 0;
1894 for (cobj = level.objects[x][y]; cobj; cobj = nobj) {
1895 nobj = cobj->nexthere;
1896 if (Is_container(cobj)) {
1902 return container_count;
1906 able_to_loot(x, y, looting)
1908 boolean looting; /* loot vs tip */
1911 const char *verb = looting ? "loot" : "tip";
1913 const char *verb = looting ? "
\8aJ
\82¯
\82é" : "
\82Ð
\82Á
\82
\82è
\95Ô
\82·";
1915 if (!can_reach_floor(TRUE)) {
1916 if (u.usteed && P_SKILL(P_RIDING) < P_BASIC)
1917 rider_cant_reach(); /* not skilled enough to reach */
1919 cant_reach_floor(x, y, FALSE, TRUE);
1921 } else if ((is_pool(x, y) && (looting || !Underwater)) || is_lava(x, y)) {
1922 /* at present, can't loot in water even when Underwater;
1923 can tip underwater, but not when over--or stuck in--lava */
1925 You("cannot %s things that are deep in the %s.", verb,
1926 hliquid(is_lava(x, y) ? "lava" : "water"));
1928 You("%s
\82É
\90[
\82
\82É
\92¾
\82ñ
\82¾
\82à
\82Ì
\82ð%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D",
1929 hliquid(is_lava(u.ux, u.uy) ? "
\97n
\8aâ" : "
\90\85"), verb);
1932 } else if (nolimbs(youmonst.data)) {
1934 pline("Without limbs, you cannot %s anything.", verb);
1936 pline("
\8eè
\91«
\82ª
\82È
\82¢
\82Ì
\82Å
\81C%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", verb);
1938 } else if (looting && !freehand()) {
1940 pline("Without a free %s, you cannot loot anything.",
1942 pline("
\8e©
\97R
\82É
\82È
\82é%s
\82ª
\82È
\82¢
\82Ì
\82Å
\81C
\8aJ
\82¯
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D",
1955 for (i = -1; i <= 1; i++)
1956 for (j = -1; j <= 1; j++) {
1959 if (isok(nx, ny) && MON_AT(nx, ny))
1966 do_loot_cont(cobjp, cindex, ccount)
1968 int cindex, ccount; /* index of this container (1..N), number of them (N) */
1970 struct obj *cobj = *cobjp;
1974 if (cobj->olocked) {
1978 cobj->lknown ? "It is" : "Hmmm, it turns out to be");
1980 pline("%s
\8c®
\82ª
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D",
1981 cobj->lknown ? "" : "
\82Þ
\81[
\82ñ
\81C");
1983 else if (cobj->lknown)
1985 pline("%s is locked.", The(xname(cobj)));
1987 pline("%s
\82Í
\8c®
\82ª
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D", xname(cobj));
1990 pline("Hmmm, %s turns out to be locked.", the(xname(cobj)));
1992 pline("
\82Þ
\81[
\82ñ
\81C%s
\82Í
\8c®
\82ª
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D", xname(cobj));
1996 cobj->lknown = 1; /* floor container, so no need for update_inventory() */
1998 if (cobj->otyp == BAG_OF_TRICKS) {
2002 You("carefully open %s...", the(xname(cobj)));
2004 You("
\90T
\8fd
\82É%s
\82ð
\8aJ
\82¯
\82½
\81D
\81D
\81D", xname(cobj));
2006 pline("It develops a huge set of teeth and bites you!");
2008 pline("
\8a\93\82©
\82ç
\91å
\82«
\82È
\8e\95\82ª
\90¶
\82¦
\82Ä
\82«
\82Ä
\81C
\82 \82È
\82½
\82ð
\8a\9a\82ñ
\82¾
\81I");
2011 losehp(Maybe_Half_Phys(tmp), "carnivorous bag", KILLED_BY_AN);
2013 losehp(Maybe_Half_Phys(tmp), "
\90H
\93÷
\8a\93\82É
\8a\9a\82Ü
\82ê
\82Ä", KILLED_BY_AN);
2014 makeknown(BAG_OF_TRICKS);
2015 abort_looting = TRUE;
2020 You("%sopen %s...", (!cobj->cknown || !cobj->lknown) ? "carefully " : "",
2022 You("%s%s
\82ð
\8aJ
\82¯
\82½
\81D
\81D
\81D", (!cobj->cknown || !cobj->lknown) ? "
\90T
\8fd
\82É" : "",
2024 return use_container(cobjp, 0, (boolean) (cindex < ccount));
2027 /* loot a container on the floor or loot saddle from mon. */
2031 struct obj *cobj, *nobj;
2032 register int c = -1;
2035 boolean underfoot = TRUE;
2036 #if 0 /*JP*//*not used*/
2037 const char *dont_find_anything = "don't find anything";
2041 int prev_inquiry = 0;
2042 boolean prev_loot = FALSE;
2045 abort_looting = FALSE;
2047 if (check_capacity((char *) 0)) {
2048 /* "Can't do that while carrying so much stuff." */
2051 if (nohands(youmonst.data)) {
2053 You("have no hands!"); /* not `body_part(HAND)' */
2055 pline("
\82 \82È
\82½
\82É
\82Í
\8eè
\82ª
\82È
\82¢
\81I");
2060 if (rn2(6) && reverse_loot())
2064 pline("Being confused, you find nothing to loot.");
2066 pline("
\8d¬
\97\90\82µ
\82Ä
\82¢
\82é
\82Ì
\82Å
\81C
\8aJ
\82¯
\82é
\82à
\82Ì
\82ð
\8c©
\82Â
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
2067 return 1; /* costs a turn */
2068 } /* else fallthrough to normal looting */
2073 if (iflags.menu_requested)
2077 if ((num_conts = container_at(cc.x, cc.y, TRUE)) > 0) {
2078 boolean anyfound = FALSE;
2080 if (!able_to_loot(cc.x, cc.y, TRUE))
2083 if (Blind && !uarmg) {
2084 /* if blind and without gloves, attempting to #loot at the
2085 location of a cockatrice corpse is fatal before asking
2086 whether to manipulate any containers */
2087 for (nobj = sobj_at(CORPSE, cc.x, cc.y); nobj;
2088 nobj = nxtobj(nobj, CORPSE, TRUE))
2089 if (will_feel_cockatrice(nobj, FALSE)) {
2090 feel_cockatrice(nobj, FALSE);
2091 /* if life-saved (or poly'd into stone golem),
2092 terminate attempt to loot */
2097 if (num_conts > 1) {
2098 /* use a menu to loot many containers */
2102 menu_item *pick_list = (menu_item *) 0;
2105 win = create_nhwindow(NHW_MENU);
2108 for (cobj = level.objects[cc.x][cc.y]; cobj;
2109 cobj = cobj->nexthere)
2110 if (Is_container(cobj)) {
2112 add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
2113 doname(cobj), MENU_UNSELECTED);
2116 end_menu(win, "Loot which containers?");
2118 end_menu(win, "
\82Ç
\82ê
\82ð
\8aJ
\82¯
\82Ü
\82·
\82©
\81H");
2119 n = select_menu(win, PICK_ANY, &pick_list);
2120 destroy_nhwindow(win);
2123 for (i = 1; i <= n; i++) {
2124 cobj = pick_list[i - 1].item.a_obj;
2125 timepassed |= do_loot_cont(&cobj, i, n);
2126 if (abort_looting) {
2127 /* chest trap or magic bag explosion or <esc> */
2128 free((genericptr_t) pick_list);
2132 free((genericptr_t) pick_list);
2137 for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) {
2138 nobj = cobj->nexthere;
2140 if (Is_container(cobj)) {
2142 c = ynq(safe_qbuf(qbuf, "There is ", " here, loot it?",
2143 cobj, doname, ansimpleoname,
2146 c = ynq(safe_qbuf(qbuf, "
\82±
\82±
\82É
\82Í", "
\82ª
\82 \82é
\81C
\8aJ
\82¯
\82Ü
\82·
\82©
\81H",
2147 cobj, doname, ansimpleoname,
2156 timepassed |= do_loot_cont(&cobj, 1, 1);
2158 /* chest trap or magic bag explosion or <esc> */
2165 } else if (IS_GRAVE(levl[cc.x][cc.y].typ)) {
2167 You("need to dig up the grave to effectively loot it...");
2169 You("
\95æ
\8dr
\82ç
\82µ
\82ð
\82·
\82é
\82É
\82Í
\8c@
\82ç
\82È
\82
\82Ä
\82Í
\81D
\81D
\81D");
2173 * 3.3.1 introduced directional looting for some things.
2176 if (c != 'y' && mon_beside(u.ux, u.uy)) {
2178 if (!get_adjacent_loc("Loot in what direction?",
2180 if (!get_adjacent_loc("
\82Ç
\82Ì
\95û
\8cü
\82ð
\92²
\82×
\82é
\81H",
2182 "Invalid loot location", u.ux, u.uy, &cc))
2184 "
\96³
\8cø
\82È
\95û
\8cü", u.ux, u.uy, &cc))
2186 if (cc.x == u.ux && cc.y == u.uy) {
2188 if (container_at(cc.x, cc.y, FALSE))
2194 You("%s to loot on the %s.", dont_find_anything,
2195 ceiling(cc.x, cc.y));
2197 You("%s
\82ð
\92²
\82×
\82½
\82ª
\89½
\82à
\82Ý
\82Â
\82©
\82ç
\82È
\82©
\82Á
\82½
\81D",
2198 ceiling(cc.x, cc.y));
2203 mtmp = m_at(cc.x, cc.y);
2205 timepassed = loot_mon(mtmp, &prev_inquiry, &prev_loot);
2206 /* always use a turn when choosing a direction is impaired,
2207 even if you've successfully targetted a saddled creature
2208 and then answered "no" to the "remove its saddle?" prompt */
2209 if (Confusion || Stunned)
2212 /* Preserve pre-3.3.1 behaviour for containers.
2213 * Adjust this if-block to allow container looting
2214 * from one square away to change that in the future.
2217 if (container_at(cc.x, cc.y, FALSE)) {
2220 You_cant("loot anything %sthere with %s in the way.",
2221 prev_inquiry ? "else " : "", mon_nam(mtmp));
2223 pline("%s
\82ª
\82¢
\82é
\82Ì
\82Å%s
\94 \82ð
\8aJ
\82¯
\82ç
\82ê
\82È
\82¢
\81D",
2224 mon_nam(mtmp), prev_inquiry ? "
\82Ù
\82©
\82Ì" : "");
2229 You("have to be at a container to loot it.");
2231 You("
\82Í
\94 \82ð
\8aJ
\82¯
\82é
\82½
\82ß
\82É
\82Í
\93¯
\82¶
\88Ê
\92u
\82É
\82¢
\82È
\82¯
\82ê
\82Î
\82È
\82ç
\82È
\82¢
\81D");
2236 You("%s %sthere to loot.", dont_find_anything,
2237 (prev_inquiry || prev_loot) ? "else " : "");
2239 pline("
\82±
\82±
\82É
\82Í%s
\8aJ
\82¯
\82ç
\82ê
\82é
\82à
\82Ì
\82Í
\82È
\82¢
\81D",
2240 (prev_inquiry || prev_loot) ? "
\82Ù
\82©
\82É" : "");
2245 } else if (c != 'y' && c != 'n') {
2247 You("%s %s to loot.", dont_find_anything,
2248 underfoot ? "here" : "there");
2250 pline("%s
\82É
\82Í
\8aJ
\82¯
\82ç
\82ê
\82é
\82à
\82Ì
\82Í
\82È
\82¢
\81D",
2251 underfoot ? "
\82±
\82±" : "
\82»
\82±");
2257 /* called when attempting to #loot while confused */
2261 struct obj *goldob = 0, *coffers, *otmp, boxdummy;
2264 int n, x = u.ux, y = u.uy;
2267 /* n objects: 1/(n+1) chance per object plus 1/(n+1) to fall off end
2269 for (n = inv_cnt(TRUE), otmp = invent; otmp; --n, otmp = otmp->nobj)
2272 prinv("You find old loot:", otmp, 0L);
2274 prinv("
\88È
\91O
\8aJ
\82¯
\82½
\82à
\82Ì:", otmp, 0L);
2280 /* find a money object to mess with */
2281 for (goldob = invent; goldob; goldob = goldob->nobj)
2282 if (goldob->oclass == COIN_CLASS) {
2283 contribution = ((long) rnd(5) * goldob->quan + 4L) / 5L;
2284 if (contribution < goldob->quan)
2285 goldob = splitobj(goldob, contribution);
2291 if (!IS_THRONE(levl[x][y].typ)) {
2293 /* the dropped gold might have fallen to lower level */
2296 pline("Ok, now there is loot here.");
2298 pline("
\83I
\81[
\83P
\81[
\81C
\82±
\82±
\82É
\98d
\98G
\82ð
\92u
\82¢
\82Ä
\82¨
\82±
\82¤
\81D");
2300 /* find original coffers chest if present, otherwise use nearest one */
2302 for (coffers = fobj; coffers; coffers = coffers->nobj)
2303 if (coffers->otyp == CHEST) {
2304 if (coffers->spe == 2)
2305 break; /* a throne room chest */
2307 || distu(coffers->ox, coffers->oy)
2308 < distu(otmp->ox, otmp->oy))
2309 otmp = coffers; /* remember closest ordinary chest */
2316 verbalize("Thank you for your contribution to reduce the debt.");
2318 verbalize("
\90Ô
\8e\9a\8d\91\8dÂ
\95Ô
\8dÏ
\82Ì
\82½
\82ß
\82Ì
\8añ
\95t
\82É
\8a´
\8eÓ
\82µ
\82Ü
\82·
\81D");
2320 (void) add_to_container(coffers, goldob);
2321 coffers->owt = weight(coffers);
2322 coffers->cknown = 0;
2323 if (!coffers->olocked) {
2324 boxdummy = zeroobj, boxdummy.otyp = SPE_WIZARD_LOCK;
2325 (void) boxlock(coffers, &boxdummy);
2327 } else if (levl[x][y].looted != T_LOOTED
2328 && (mon = makemon(courtmon(), x, y, NO_MM_FLAGS)) != 0) {
2330 add_to_minv(mon, goldob);
2332 pline("The exchequer accepts your contribution.");
2334 pline("
\8dà
\96±
\8fÈ
\82Í
\82 \82È
\82½
\82Ì
\8añ
\95t
\82ð
\8eó
\82¯
\82Æ
\82Á
\82½
\81D");
2336 levl[x][y].looted = T_LOOTED;
2339 You("drop %s.", doname(goldob));
2341 You("%s
\82ð
\97\8e\82µ
\82½
\81D", doname(goldob));
2348 /* loot_mon() returns amount of time passed.
2351 loot_mon(mtmp, passed_info, prev_loot)
2361 /* 3.3.1 introduced the ability to remove saddle from a steed.
2362 * *passed_info is set to TRUE if a loot query was given.
2363 * *prev_loot is set to TRUE if something was actually acquired in here.
2365 if (mtmp && mtmp != u.usteed && (otmp = which_armor(mtmp, W_SADDLE))) {
2371 Sprintf(qbuf, "Do you want to remove the saddle from %s?",
2372 x_monnam(mtmp, ARTICLE_THE, (char *) 0,
2373 SUPPRESS_SADDLE, FALSE));
2375 Sprintf(qbuf, "%s
\82©
\82ç
\88Æ
\82ð
\82Í
\82¸
\82µ
\82Ü
\82·
\82©
\81H",
2376 x_monnam(mtmp, ARTICLE_THE, (char *) 0,
2377 SUPPRESS_SADDLE, FALSE));
2379 if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y') {
2380 if (nolimbs(youmonst.data)) {
2382 You_cant("do that without limbs."); /* not body_part(HAND) */
2384 You_cant("
\8eè
\82ª
\82È
\82¢
\82Æ
\82Å
\82«
\82È
\82¢
\81D");
2390 You("can't. The saddle seems to be stuck to %s.",
2392 pline("
\88Æ
\82Í%s
\82É
\82
\82Á
\82Â
\82¢
\82Ä
\82¢
\82é
\82æ
\82¤
\82¾
\81D",
2393 x_monnam(mtmp, ARTICLE_THE, (char *) 0,
2394 SUPPRESS_SADDLE, FALSE));
2395 /* the attempt costs you time */
2398 obj_extract_self(otmp);
2399 if ((unwornmask = otmp->owornmask) != 0L) {
2400 mtmp->misc_worn_check &= ~unwornmask;
2401 otmp->owornmask = 0L;
2402 update_mon_intrinsics(mtmp, otmp, FALSE, FALSE);
2405 otmp = hold_another_object(otmp, "You drop %s!", doname(otmp),
2407 otmp = hold_another_object(otmp, "%s
\82ð
\97\8e\82Æ
\82µ
\82½
\81I", doname(otmp),
2410 timepassed = rnd(3);
2413 } else if (c == 'q') {
2417 /* 3.4.0 introduced ability to pick things up from swallower's stomach */
2419 int count = passed_info ? *passed_info : 0;
2421 timepassed = pickup(count);
2427 * Decide whether an object being placed into a magic bag will cause
2428 * it to explode. If the object is a bag itself, check recursively.
2431 mbag_explodes(obj, depthin)
2435 /* these won't cause an explosion when they're empty */
2436 if ((obj->otyp == WAN_CANCELLATION || obj->otyp == BAG_OF_TRICKS)
2440 /* odds: 1/1, 2/2, 3/4, 4/8, 5/16, 6/32, 7/64, 8/128, 9/128, 10/128,... */
2441 if ((Is_mbag(obj) || obj->otyp == WAN_CANCELLATION)
2442 && (rn2(1 << (depthin > 7 ? 7 : depthin)) <= depthin))
2444 else if (Has_contents(obj)) {
2447 for (otmp = obj->cobj; otmp; otmp = otmp->nobj)
2448 if (mbag_explodes(otmp, depthin + 1))
2455 boh_loss(container, held)
2456 struct obj *container;
2459 /* sometimes toss objects if a cursed magic bag */
2460 if (Is_mbag(container) && container->cursed && Has_contents(container)) {
2462 struct obj *curr, *otmp;
2464 for (curr = container->cobj; curr; curr = otmp) {
2467 obj_extract_self(curr);
2468 loss += mbag_item_gone(held, curr);
2476 /* Returns: -1 to stop, 1 item was inserted, 0 item was not inserted. */
2479 register struct obj *obj;
2481 boolean floor_container = !carried(current_container);
2482 boolean was_unpaid = FALSE;
2485 if (!current_container) {
2486 impossible("<in> no current_container?");
2488 } else if (obj == uball || obj == uchain) {
2490 You("must be kidding.");
2492 pline("
\82²
\8fç
\92k
\82ð
\81D");
2494 } else if (obj == current_container) {
2496 pline("That would be an interesting topological exercise.");
2498 pline("
\82»
\82ê
\82Í
\8b»
\96¡
\82ð
\82»
\82»
\82ç
\82ê
\82é
\83g
\83|
\83\8d\83W
\81[
\82Ì
\96â
\91è
\82¾
\81D");
2500 } else if (obj->owornmask & (W_ARMOR | W_ACCESSORY)) {
2502 Norep("You cannot %s %s you are wearing.",
2503 Icebox ? "refrigerate" : "stash", something);
2505 Norep("
\90g
\82É
\82Â
\82¯
\82Ä
\82¢
\82é
\82à
\82Ì
\82ð%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D",
2506 Icebox ? "
\97â
\93\80\82·
\82é" : "
\82µ
\82Ü
\82¤");
2509 } else if ((obj->otyp == LOADSTONE) && obj->cursed) {
2512 pline_The("stone%s won't leave your person.", plur(obj->quan));
2514 pline("
\82Ç
\82¤
\82¢
\82¤
\82í
\82¯
\82©
\82»
\82Ì
\90Î
\82ð
\82µ
\82Ü
\82¤
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2516 } else if (obj->otyp == AMULET_OF_YENDOR
2517 || obj->otyp == CANDELABRUM_OF_INVOCATION
2518 || obj->otyp == BELL_OF_OPENING
2519 || obj->otyp == SPE_BOOK_OF_THE_DEAD) {
2520 /* Prohibit Amulets in containers; if you allow it, monsters can't
2521 * steal them. It also becomes a pain to check to see if someone
2522 * has the Amulet. Ditto for the Candelabrum, the Bell and the Book.
2525 pline("%s cannot be confined in such trappings.", The(xname(obj)));
2527 pline("%s
\82Í
\8bl
\82ß
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", The(xname(obj)));
2529 } else if (obj->otyp == LEASH && obj->leashmon != 0) {
2531 pline("%s attached to your pet.", Tobjnam(obj, "are"));
2533 pline("%s
\82Í
\83y
\83b
\83g
\82É
\95t
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D", xname(obj));
2535 } else if (obj == uwep) {
2540 setuwep((struct obj *) 0);
2541 /* This uwep check is obsolete. It dates to 3.0 and earlier when
2542 * unwielding Firebrand would be fatal in hell if hero had no other
2543 * fire resistance. Life-saving would force it to be re-wielded.
2546 return 0; /* unwielded, died, rewielded */
2547 } else if (obj == uswapwep) {
2548 setuswapwep((struct obj *) 0);
2549 } else if (obj == uquiver) {
2550 setuqwep((struct obj *) 0);
2553 if (fatal_corpse_mistake(obj, FALSE))
2556 /* boxes, boulders, and big statues can't fit into any container */
2557 if (obj->otyp == ICE_BOX || Is_box(obj) || obj->otyp == BOULDER
2558 || (obj->otyp == STATUE && bigmonst(&mons[obj->corpsenm]))) {
2560 * xname() uses a static result array. Save obj's name
2561 * before current_container's name is computed. Don't
2562 * use the result of strcpy() within You() --- the order
2563 * of evaluation of the parameters is undefined.
2565 Strcpy(buf, the(xname(obj)));
2567 You("cannot fit %s into %s.", buf, the(xname(current_container)));
2569 pline("%s
\82ð%s
\82É
\8bl
\82ß
\8d\9e\82Þ
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", buf, the(xname(current_container)));
2575 if (obj_is_burning(obj)) /* this used to be part of freeinv() */
2576 (void) snuff_lit(obj);
2578 if (floor_container && costly_spot(u.ux, u.uy)) {
2579 /* defer gold until after put-in message */
2580 if (obj->oclass != COIN_CLASS) {
2581 /* sellobj() will take an unpaid item off the shop bill */
2582 was_unpaid = obj->unpaid ? TRUE : FALSE;
2583 /* don't sell when putting the item into your own container,
2584 * but handle billing correctly */
2585 sellobj_state(current_container->no_charge
2586 ? SELL_DONTSELL : SELL_DELIBERATE);
2587 sellobj(obj, u.ux, u.uy);
2588 sellobj_state(SELL_NORMAL);
2591 if (Icebox && !age_is_relative(obj)) {
2592 obj->age = monstermoves - obj->age; /* actual age */
2593 /* stop any corpse timeouts when frozen */
2594 if (obj->otyp == CORPSE && obj->timed) {
2595 long rot_alarm = stop_timer(ROT_CORPSE, obj_to_any(obj));
2597 (void) stop_timer(REVIVE_MON, obj_to_any(obj));
2598 /* mark a non-reviving corpse as such */
2602 } else if (Is_mbag(current_container) && mbag_explodes(obj, 0)) {
2603 /* explicitly mention what item is triggering the explosion */
2605 pline("As you put %s inside, you are blasted by a magical explosion!",
2607 pline("%s
\82ð
\92\86\82É
\93ü
\82ê
\82é
\82Æ
\81C
\82 \82È
\82½
\82Í
\96\82\96@
\82Ì
\94\9a\94
\82ð
\97\81\82Ñ
\82½
\81I",
2609 /* did not actually insert obj yet */
2611 addtobill(obj, FALSE, FALSE, TRUE);
2612 obfree(obj, (struct obj *) 0);
2613 /* if carried, shop goods will be flagged 'unpaid' and obfree() will
2614 handle bill issues, but if on floor, we need to put them on bill
2615 before deleting them (non-shop items will be flagged 'no_charge') */
2617 && costly_spot(current_container->ox, current_container->oy)) {
2618 struct obj save_no_charge;
2620 save_no_charge.no_charge = current_container->no_charge;
2621 addtobill(current_container, FALSE, FALSE, FALSE);
2622 /* addtobill() clears no charge; we need to set it back
2623 so that useupf() doesn't double bill */
2624 current_container->no_charge = save_no_charge.no_charge;
2626 delete_contents(current_container);
2627 if (!floor_container)
2628 useup(current_container);
2629 else if (obj_here(current_container, u.ux, u.uy))
2630 useupf(current_container, current_container->quan);
2632 panic("in_container: bag not found.");
2635 losehp(d(6, 6), "magical explosion", KILLED_BY_AN);
2637 losehp(d(6, 6), "
\96\82\96@
\82Ì
\94\9a\94
\82Å", KILLED_BY_AN);
2638 current_container = 0; /* baggone = TRUE; */
2641 if (current_container) {
2642 Strcpy(buf, the(xname(current_container)));
2644 You("put %s into %s.", doname(obj), buf);
2646 You("%s
\82ð%s
\82Ì
\92\86\82É
\82µ
\82Ü
\82Á
\82½
\81D", doname(obj), buf);
2648 /* gold in container always needs to be added to credit */
2649 if (floor_container && obj->oclass == COIN_CLASS)
2650 sellobj(obj, current_container->ox, current_container->oy);
2651 (void) add_to_container(current_container, obj);
2652 current_container->owt = weight(current_container);
2654 /* gold needs this, and freeinv() many lines above may cause
2655 * the encumbrance to disappear from the status, so just always
2656 * update status immediately.
2659 return (current_container ? 1 : -1);
2662 /* askchain() filter used by in_container();
2663 * returns True if the container is intact and 'obj' isn't it, False if
2664 * container is gone (magic bag explosion) or 'obj' is the container itself;
2665 * also used by getobj() when picking a single item to stash
2671 return (current_container && obj != current_container);
2674 /* Returns: -1 to stop, 1 item was removed, 0 item was not removed. */
2677 register struct obj *obj;
2679 register struct obj *otmp;
2680 boolean is_gold = (obj->oclass == COIN_CLASS);
2684 if (!current_container) {
2685 impossible("<out> no current_container?");
2687 } else if (is_gold) {
2688 obj->owt = weight(obj);
2691 if (obj->oartifact && !touch_artifact(obj, &youmonst))
2694 if (fatal_corpse_mistake(obj, FALSE))
2698 if ((res = lift_object(obj, current_container, &count, FALSE)) <= 0)
2701 if (obj->quan != count && obj->otyp != LOADSTONE)
2702 obj = splitobj(obj, count);
2704 /* Remove the object from the list. */
2705 obj_extract_self(obj);
2706 current_container->owt = weight(current_container);
2709 removed_from_icebox(obj);
2711 if (!obj->unpaid && !carried(current_container)
2712 && costly_spot(current_container->ox, current_container->oy)) {
2713 obj->ox = current_container->ox;
2714 obj->oy = current_container->oy;
2715 addtobill(obj, FALSE, FALSE, FALSE);
2718 pick_pick(obj); /* shopkeeper feedback */
2721 loadlev = near_capacity();
2722 prinv(loadlev ? ((loadlev < MOD_ENCUMBER)
2724 ? "You have a little trouble removing"
2726 ? "
\82ð
\89^
\82Ô
\82Ì
\82Í
\8f
\81X
\8d¢
\93ï
\82¾
\81D"
2728 : "You have much trouble removing")
2730 : "
\82ð
\89^
\82Ô
\82Ì
\82Í
\82©
\82È
\82è
\8d¢
\93ï
\82¾
\81D")
2735 bot(); /* update character's gold piece count immediately */
2740 /* taking a corpse out of an ice box needs a couple of adjustments */
2742 removed_from_icebox(obj)
2745 if (!age_is_relative(obj)) {
2746 obj->age = monstermoves - obj->age; /* actual age */
2747 if (obj->otyp == CORPSE)
2748 start_corpse_timeout(obj);
2752 /* an object inside a cursed bag of holding is being destroyed */
2754 mbag_item_gone(held, item)
2763 pline("%s %s vanished!", Doname2(item), otense(item, "have"));
2765 pline("%s
\82Í
\8fÁ
\82¦
\8b\8e\82Á
\82½
\81I", Doname2(item));
2768 You("%s %s disappear!", Blind ? "notice" : "see", doname(item));
2770 You("%s
\82ª
\8c©
\82¦
\82È
\82
\82È
\82é
\82Ì%s
\81D", doname(item), Blind ? "
\82É
\8bC
\82Ã
\82¢
\82½" : "
\82ð
\8c©
\82½");
2773 if (*u.ushops && (shkp = shop_keeper(*u.ushops)) != 0) {
2774 if (held ? (boolean) item->unpaid : costly_spot(u.ux, u.uy))
2775 loss = stolen_value(item, u.ux, u.uy, (boolean) shkp->mpeaceful,
2778 obfree(item, (struct obj *) 0);
2782 /* used for #loot/apply, #tip, and final disclosure */
2784 observe_quantum_cat(box, makecat, givemsg)
2786 boolean makecat, givemsg;
2789 static NEARDATA const char sc[] = "Schroedinger's Cat";
2791 static NEARDATA const char sc[] = "
\83V
\83\85\83\8c\83f
\83B
\83\93\83K
\81[
\82Ì
\94L";
2792 struct obj *deadcat;
2793 struct monst *livecat = 0;
2795 boolean itsalive = !rn2(2);
2797 if (get_obj_location(box, &ox, &oy, 0))
2798 box->ox = ox, box->oy = oy; /* in case it's being carried */
2800 /* this isn't really right, since any form of observation
2801 (telepathic or monster/object/food detection) ought to
2802 force the determination of alive vs dead state; but basing it
2803 just on opening or disclosing the box is much simpler to cope with */
2805 /* SchroedingersBox already has a cat corpse in it */
2806 deadcat = box->cobj;
2809 livecat = makemon(&mons[PM_HOUSECAT], box->ox, box->oy,
2810 NO_MINVENT | MM_ADJACENTOK);
2812 livecat->mpeaceful = 1;
2813 set_malign(livecat);
2815 if (!canspotmon(livecat))
2817 You("think %s brushed your %s.", something,
2820 You("%s
\82ª
\82 \82È
\82½
\82Ì%s
\82ð
\82
\82·
\82®
\82Á
\82½
\82Æ
\8ev
\82Á
\82½
\81D", something,
2825 pline("%s inside the box is still alive!",
2828 pline("
\94 \82Ì
\82È
\82©
\82Ì%s
\82Í
\82Ü
\82¾
\90¶
\82«
\82Ä
\82¢
\82é
\81I",
2832 (void) christen_monst(livecat, sc);
2834 obj_extract_self(deadcat);
2835 obfree(deadcat, (struct obj *) 0), deadcat = 0;
2837 box->owt = weight(box);
2841 box->spe = 0; /* now an ordinary box (with a cat corpse inside) */
2843 /* set_corpsenm() will start the rot timer that was removed
2844 when makemon() created SchroedingersBox; start it from
2845 now rather than from when this special corpse got created */
2846 deadcat->age = monstermoves;
2847 set_corpsenm(deadcat, PM_HOUSECAT);
2848 deadcat = oname(deadcat, sc);
2852 pline_The("%s inside the box is dead!",
2853 Hallucination ? rndmonnam((char *) 0) : "housecat");
2855 pline_The("
\94 \82Ì
\92\86\82Ì%s
\82Í
\8e\80\82ñ
\82Å
\82¢
\82é
\81I",
2856 Hallucination ? rndmonnam((char *) 0) : "
\94L");
2865 /* used by askchain() to check for magic bag explosion */
2868 int FDECL((*fn), (OBJ_P));
2870 /* result is only meaningful while use_container() is executing */
2871 return ((fn == in_container || fn == out_container)
2872 && !current_container);
2876 explain_container_prompt(more_containers)
2877 boolean more_containers;
2879 static const char *const explaintext[] = {
2881 "Container actions:",
2883 " : -- Look: examine contents",
2884 " o -- Out: take things out",
2885 " i -- In: put things in",
2886 " b -- Both: first take things out, then put things in",
2887 " r -- Reversed: put things in, then take things out",
2888 " s -- Stash: put one item in", "",
2889 " n -- Next: loot next selected container",
2890 " q -- Quit: finished",
2891 " ? -- Help: display this text.",
2894 "
\93ü
\82ê
\95¨
\82Ö
\82Ì
\8ds
\93®
\81F",
2896 " : -- Look:
\92\86\90g
\82ð
\92²
\82×
\82é",
2897 " o -- Out:
\95¨
\82ð
\8fo
\82·",
2898 " i -- In:
\95¨
\82ð
\93ü
\82ê
\82é",
2899 " b -- Both:
\82Ü
\82¸
\95¨
\82ð
\8fo
\82µ
\81A
\82»
\82ê
\82©
\82ç
\95¨
\82ð
\93ü
\82ê
\82é",
2900 " r -- Reversed:
\95¨
\82ð
\93ü
\82ê
\81A
\82»
\82ê
\82©
\82ç
\95¨
\82ð
\8fo
\82·",
2901 " s -- Stash:
\95¨
\82ð
\88ê
\82Â
\93ü
\82ê
\82é",
2902 " n -- Next:
\8e\9f\82É
\91I
\82ñ
\82¾
\93ü
\82ê
\95¨
\82ð
\92²
\82×
\82é",
2903 " q -- Quit:
\89½
\82à
\82µ
\82È
\82¢",
2904 " ? -- Help:
\82±
\82ê
\82ð
\95\
\8e¦
\82·
\82é",
2908 const char *const *txtpp;
2911 /* "Do what with <container>? [:oibrsq or ?] (q)" */
2912 if ((win = create_nhwindow(NHW_TEXT)) != WIN_ERR) {
2913 for (txtpp = explaintext; *txtpp; ++txtpp) {
2914 if (!more_containers && !strncmp(*txtpp, " n ", 3))
2916 putstr(win, 0, *txtpp);
2918 display_nhwindow(win, FALSE);
2919 destroy_nhwindow(win);
2926 if (nohands(youmonst.data)) {
2928 You("have no hands!"); /* not `body_part(HAND)' */
2930 pline("
\82 \82È
\82½
\82É
\82Í
\8eè
\82ª
\82È
\82¢
\81I"); /* not `body_part(HAND)' */
2933 } else if (!freehand()) {
2935 You("have no free %s.", body_part(HAND));
2937 You("%s
\82Ì
\8e©
\97R
\82ª
\8cø
\82©
\82È
\82¢
\81D", body_part(HAND));
2943 static const char stashable[] = { ALLOW_COUNT, COIN_CLASS, ALL_CLASSES, 0 };
2946 use_container(objp, held, more_containers)
2949 boolean more_containers; /* True iff #loot multiple and this isn't last one */
2951 struct obj *otmp, *obj = *objp;
2952 boolean quantum_cat, cursed_mbag, loot_out, loot_in, loot_in_first,
2953 stash_one, inokay, outokay, outmaybe;
2954 char c, emptymsg[BUFSZ], qbuf[QBUFSZ], pbuf[QBUFSZ], xbuf[QBUFSZ];
2958 abort_looting = FALSE;
2964 if (!obj->lknown) { /* do this in advance */
2971 pline("%s locked.", Tobjnam(obj, "are"));
2973 pline("%s
\82Í
\8c®
\82ª
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D", xname(obj));
2976 You("must put it down to unlock.");
2978 if (held) pline("
\89º
\82É
\92u
\82©
\82È
\82¢
\82±
\82Æ
\82É
\82Í
\8c®
\82ð
\82Í
\82¸
\82¹
\82È
\82¢
\81D");
2980 } else if (obj->otrapped) {
2983 You("open %s...", the(xname(obj)));
2985 You("%s
\82ð
\8aJ
\82¯
\82½
\81D
\81D
\81D", the(xname(obj)));
2986 (void) chest_trap(obj, HAND, FALSE);
2987 /* even if the trap fails, you've used up this turn */
2988 if (multi >= 0) { /* in case we didn't become paralyzed */
2991 multi_reason = "opening a container";
2993 multi_reason = "
\94 \82ð
\8aJ
\82¯
\82Ä
\82¢
\82é
\8e\9e\82É";
2996 abort_looting = TRUE;
3000 current_container = obj; /* for use by in/out_container */
3002 * From here on out, all early returns go through 'containerdone:'.
3005 /* check for Schroedinger's Cat */
3006 quantum_cat = SchroedingersBox(current_container);
3008 observe_quantum_cat(current_container, TRUE, TRUE);
3012 cursed_mbag = Is_mbag(current_container)
3013 && current_container->cursed
3014 && Has_contents(current_container);
3016 && (loss = boh_loss(current_container, held)) != 0) {
3019 You("owe %ld %s for lost merchandise.", loss, currency(loss));
3021 You("
\8e¸
\82Á
\82½
\8f¤
\95i
\82Ì
\82½
\82ß
\82É%ld%s
\82Ì
\95\89\8dÂ
\82ð
\95\89\82Á
\82½
\81D", loss, currency(loss));
3022 current_container->owt = weight(current_container);
3024 inokay = (invent != 0
3025 && !(invent == current_container && !current_container->nobj));
3026 outokay = Has_contents(current_container);
3027 if (!outokay) /* preformat the empty-container message */
3029 Sprintf(emptymsg, "%s is %sempty.", Ysimple_name2(current_container),
3030 (quantum_cat || cursed_mbag) ? "now " : "");
3032 Sprintf(emptymsg, "%s
\82Í%s
\8bó
\82Á
\82Û
\82¾
\81D", Ysimple_name2(current_container),
3033 (quantum_cat || cursed_mbag) ? "
\8d¡
\82Í" : "");
3037 * What-to-do prompt's list of possible actions:
3038 * always include the look-inside choice (':');
3039 * include the take-out choice ('o') if container
3040 * has anything in it or if player doesn't yet know
3041 * that it's empty (latter can change on subsequent
3042 * iterations if player picks ':' response);
3043 * include the put-in choices ('i','s') if hero
3044 * carries any inventory (including gold);
3045 * include do-both when 'o' is available, even if
3046 * inventory is empty--taking out could alter that;
3047 * include do-both-reversed when 'i' is available,
3048 * even if container is empty--for similar reason;
3049 * include the next container choice ('n') when
3050 * relevant, and make it the default;
3051 * always include the quit choice ('q'), and make
3052 * it the default if there's no next containter;
3053 * include the help choice (" or ?") if `cmdassist'
3054 * run-time option is set;
3055 * (Player can pick any of (o,i,b,r,n,s,?) even when
3056 * they're not listed among the available actions.)
3058 * Do what with <the/your/Shk's container>? [:oibrs nq or ?] (q)
3060 * <The/Your/Shk's container> is empty. Do what with it? [:irs nq or ?]
3062 for (;;) { /* repeats iff '?' or ':' gets chosen */
3063 outmaybe = (outokay || !current_container->cknown);
3066 (void) safe_qbuf(qbuf, (char *) 0, " is empty. Do what with it?",
3067 current_container, Yname2, Ysimple_name2,
3070 (void) safe_qbuf(qbuf, (char *) 0, "
\82Í
\8bó
\82¾
\81D
\82Ç
\82¤
\82·
\82é
\81H",
3071 current_container, Yname2, Ysimple_name2,
3076 (void) safe_qbuf(qbuf, "Do what with ", "?", current_container,
3077 yname, ysimple_name, "it");
3079 (void) safe_qbuf(qbuf, (char *) 0, "
\82ð
\82Ç
\82¤
\82·
\82é
\81H", current_container,
3080 yname, ysimple_name, "
\82±
\82ê");
3082 /* ask player about what to do with this container */
3083 if (flags.menu_style == MENU_PARTIAL
3084 || flags.menu_style == MENU_FULL) {
3085 if (!inokay && !outmaybe) {
3086 /* nothing to take out, nothing to put in;
3087 trying to do both will yield proper feedback */
3090 c = in_or_out_menu(qbuf, current_container, outmaybe, inokay,
3091 (boolean) (used != 0), more_containers);
3093 } else { /* TRADITIONAL or COMBINATION */
3094 xbuf[0] = '\0'; /* list of extra acceptable responses */
3095 Strcpy(pbuf, ":"); /* look inside */
3096 Strcat(outmaybe ? pbuf : xbuf, "o"); /* take out */
3097 Strcat(inokay ? pbuf : xbuf, "i"); /* put in */
3098 Strcat(outmaybe ? pbuf : xbuf, "b"); /* both */
3099 Strcat(inokay ? pbuf : xbuf, "rs"); /* reversed, stash */
3100 Strcat(pbuf, " "); /* separator */
3101 Strcat(more_containers ? pbuf : xbuf, "n"); /* next container */
3102 Strcat(pbuf, "q"); /* quit */
3103 if (iflags.cmdassist)
3104 /* this unintentionally allows user to answer with 'o' or
3105 'r'; fortunately, those are already valid choices here */
3107 Strcat(pbuf, " or ?"); /* help */
3109 Strcat(pbuf, "
\82Ü
\82½
\82Í?"); /* help */
3114 Strcat(strcat(pbuf, "\033"), xbuf);
3115 c = yn_function(qbuf, pbuf, more_containers ? 'n' : 'q');
3116 } /* PARTIAL|FULL vs other modes */
3119 explain_container_prompt(more_containers);
3120 } else if (c == ':') { /* note: will set obj->cknown */
3121 if (!current_container->cknown)
3122 used = 1; /* gaining info */
3123 container_contents(current_container, FALSE, FALSE, TRUE);
3126 } /* loop until something other than '?' or ':' is picked */
3129 abort_looting = TRUE;
3130 if (c == 'n' || c == 'q') /* [not strictly needed; falling thru works] */
3132 loot_out = (c == 'o' || c == 'b' || c == 'r');
3133 loot_in = (c == 'i' || c == 'b' || c == 'r');
3134 loot_in_first = (c == 'r'); /* both, reversed */
3135 stash_one = (c == 's');
3137 /* out-only or out before in */
3138 if (loot_out && !loot_in_first) {
3139 if (!Has_contents(current_container)) {
3140 pline1(emptymsg); /* <whatever> is empty. */
3141 if (!current_container->cknown)
3143 current_container->cknown = 1;
3145 add_valid_menu_class(0); /* reset */
3146 if (flags.menu_style == MENU_TRADITIONAL)
3147 used |= traditional_loot(FALSE);
3149 used |= (menu_loot(0, FALSE) > 0);
3150 add_valid_menu_class(0);
3154 if ((loot_in || stash_one)
3155 && (!invent || (invent == current_container && !invent->nobj))) {
3157 You("don't have anything%s to %s.", invent ? " else" : "",
3158 stash_one ? "stash" : "put in");
3160 You("%s
\93ü
\82ê
\82é
\82à
\82Ì
\82ª
\82È
\82¢
\81D", invent ? "
\91¼
\82É" : "");
3162 loot_in = stash_one = FALSE;
3166 * Gone: being nice about only selecting food if we know we are
3167 * putting things in an ice chest.
3170 add_valid_menu_class(0); /* reset */
3171 if (flags.menu_style == MENU_TRADITIONAL)
3172 used |= traditional_loot(TRUE);
3174 used |= (menu_loot(0, TRUE) > 0);
3175 add_valid_menu_class(0);
3176 } else if (stash_one) {
3177 /* put one item into container */
3178 if ((otmp = getobj(stashable, "stash")) != 0) {
3179 if (in_container(otmp)) {
3182 /* couldn't put selected item into container for some
3183 reason; might need to undo splitobj() */
3184 (void) unsplitobj(otmp);
3188 /* putting something in might have triggered magic bag explosion */
3189 if (!current_container)
3193 if (loot_out && loot_in_first) {
3194 if (!Has_contents(current_container)) {
3195 pline1(emptymsg); /* <whatever> is empty. */
3196 if (!current_container->cknown)
3198 current_container->cknown = 1;
3200 add_valid_menu_class(0); /* reset */
3201 if (flags.menu_style == MENU_TRADITIONAL)
3202 used |= traditional_loot(FALSE);
3204 used |= (menu_loot(0, FALSE) > 0);
3205 add_valid_menu_class(0);
3211 /* Not completely correct; if we put something in without knowing
3212 whatever was already inside, now we suddenly do. That can't
3213 be helped unless we want to track things item by item and then
3214 deal with containers whose contents are "partly known". */
3215 if (current_container)
3216 current_container->cknown = 1;
3220 *objp = current_container; /* might have become null */
3221 if (current_container)
3222 current_container = 0; /* avoid hanging on to stale pointer */
3224 abort_looting = TRUE;
3228 /* loot current_container (take things out or put things in), by prompting */
3230 traditional_loot(put_in)
3233 int FDECL((*actionfunc), (OBJ_P)), FDECL((*checkfunc), (OBJ_P));
3234 struct obj **objlist;
3235 char selection[MAXOCLASSES + 10]; /* +10: room for B,U,C,X plus slop */
3237 boolean one_by_one, allflag;
3238 int used = 0, menu_on_request = 0;
3244 action = "
\93ü
\82ê
\82é";
3246 actionfunc = in_container;
3250 action = "take out";
3252 action = "
\8eæ
\82è
\8fo
\82·";
3253 objlist = &(current_container->cobj);
3254 actionfunc = out_container;
3255 checkfunc = (int FDECL((*), (OBJ_P))) 0;
3258 if (query_classes(selection, &one_by_one, &allflag, action, *objlist,
3259 FALSE, &menu_on_request)) {
3260 if (askchain(objlist, (one_by_one ? (char *) 0 : selection), allflag,
3261 actionfunc, checkfunc, 0, action))
3263 } else if (menu_on_request < 0) {
3264 used = (menu_loot(menu_on_request, put_in) > 0);
3269 /* loot current_container (take things out or put things in), using a menu */
3271 menu_loot(retry, put_in)
3275 int n, i, n_looted = 0;
3276 boolean all_categories = TRUE, loot_everything = FALSE;
3279 const char *action = put_in ? "Put in" : "Take out";
3281 const char *action = put_in ? "
\93ü
\82ê
\82é" : "
\8eæ
\82è
\8fo
\82·";
3282 struct obj *otmp, *otmp2;
3283 menu_item *pick_list;
3288 all_categories = (retry == -2);
3289 } else if (flags.menu_style == MENU_FULL) {
3290 all_categories = FALSE;
3292 Sprintf(buf, "%s what type of objects?", action);
3294 Sprintf(buf, "
\82Ç
\82Ì
\8eí
\97Þ
\82Ì
\82à
\82Ì
\82ð%s
\81H", action);
3295 mflags = (ALL_TYPES | UNPAID_TYPES | BUCX_TYPES | CHOOSE_ALL);
3296 n = query_category(buf, put_in ? invent : current_container->cobj,
3297 mflags, &pick_list, PICK_ANY);
3300 for (i = 0; i < n; i++) {
3301 if (pick_list[i].item.a_int == 'A')
3302 loot_everything = TRUE;
3303 else if (pick_list[i].item.a_int == ALL_TYPES_SELECTED)
3304 all_categories = TRUE;
3306 add_valid_menu_class(pick_list[i].item.a_int);
3308 free((genericptr_t) pick_list);
3311 if (loot_everything) {
3313 current_container->cknown = 1;
3314 for (otmp = current_container->cobj; otmp; otmp = otmp2) {
3316 res = out_container(otmp);
3322 for (otmp = invent; otmp && current_container; otmp = otmp2) {
3324 res = in_container(otmp);
3331 mflags = INVORDER_SORT;
3332 if (put_in && flags.invlet_constant)
3333 mflags |= USE_INVLET;
3335 current_container->cknown = 1;
3337 Sprintf(buf, "%s what?", action);
3339 Sprintf(buf, "
\89½
\82ð%s
\81H", action);
3340 n = query_objlist(buf, put_in ? &invent : &(current_container->cobj),
3341 mflags, &pick_list, PICK_ANY,
3342 all_categories ? allow_all : allow_category);
3345 for (i = 0; i < n; i++) {
3346 otmp = pick_list[i].item.a_obj;
3347 count = pick_list[i].count;
3348 if (count > 0 && count < otmp->quan) {
3349 otmp = splitobj(otmp, count);
3350 /* special split case also handled by askchain() */
3352 res = put_in ? in_container(otmp) : out_container(otmp);
3354 if (!current_container) {
3355 /* otmp caused current_container to explode;
3356 both are now gone */
3357 otmp = 0; /* and break loop */
3358 } else if (otmp && otmp != pick_list[i].item.a_obj) {
3359 /* split occurred, merge again */
3360 (void) merged(&pick_list[i].item.a_obj, &otmp);
3365 free((genericptr_t) pick_list);
3372 in_or_out_menu(prompt, obj, outokay, inokay, alreadyused, more_containers)
3375 boolean outokay, inokay, alreadyused, more_containers;
3377 /* underscore is not a choice; it's used to skip element [0] */
3378 static const char lootchars[] = "_:oibrsnq", abc_chars[] = "_:abcdenq";
3381 menu_item *pick_list;
3384 const char *menuselector = flags.lootabc ? abc_chars : lootchars;
3387 win = create_nhwindow(NHW_MENU);
3390 any.a_int = 1; /* ':' */
3392 Sprintf(buf, "Look inside %s", thesimpleoname(obj));
3394 Sprintf(buf, "%s
\82Ì
\92\86\90g
\82ð
\8c©
\82é", thesimpleoname(obj));
3395 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE, buf,
3398 any.a_int = 2; /* 'o' */
3400 Sprintf(buf, "take %s out", something);
3402 Strcpy(buf, "
\89½
\82©
\82ð
\8eæ
\82è
\8fo
\82·");
3403 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3404 buf, MENU_UNSELECTED);
3407 any.a_int = 3; /* 'i' */
3409 Sprintf(buf, "put %s in", something);
3411 Strcpy(buf, "
\89½
\82©
\82ð
\93ü
\82ê
\82é");
3412 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3413 buf, MENU_UNSELECTED);
3416 any.a_int = 4; /* 'b' */
3418 Sprintf(buf, "%stake out, then put in", inokay ? "both; " : "");
3420 Sprintf(buf, "%s
\82Ü
\82¸
\8eæ
\82è
\8fo
\82·
\81C
\82»
\82ê
\82©
\82ç
\93ü
\82ê
\82é", inokay ? "
\97¼
\95û; " : "");
3421 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3422 buf, MENU_UNSELECTED);
3425 any.a_int = 5; /* 'r' */
3427 Sprintf(buf, "%sput in, then take out",
3428 outokay ? "both reversed; " : "");
3430 Sprintf(buf, "%s
\82Ü
\82¸
\93ü
\82ê
\82é
\81C
\82»
\82ê
\82©
\82ç
\8eæ
\82è
\8fo
\82·",
3431 outokay ? "
\97¼
\95û
\82ð
\8bt
\8f\87\82Å; " : "");
3433 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3434 buf, MENU_UNSELECTED);
3435 any.a_int = 6; /* 's' */
3437 Sprintf(buf, "stash one item into %s", thesimpleoname(obj));
3439 Sprintf(buf, "
\82à
\82Ì
\82ð
\88ê
\82Â
\82¾
\82¯%s
\82É
\93ü
\82ê
\82é", thesimpleoname(obj));
3440 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3441 buf, MENU_UNSELECTED);
3444 add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED);
3445 if (more_containers) {
3446 any.a_int = 7; /* 'n' */
3448 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3449 "loot next container", MENU_SELECTED);
3451 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3452 "
\8e\9f\82Ì
\94 \82ð
\8aJ
\82¯
\82é", MENU_SELECTED);
3455 any.a_int = 8; /* 'q' */
3457 Strcpy(buf, alreadyused ? "done" : "do nothing");
3459 Strcpy(buf, alreadyused ? "
\8fI
\82í
\82é" : "
\89½
\82à
\82µ
\82È
\82¢");
3460 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE, buf,
3461 more_containers ? MENU_UNSELECTED : MENU_SELECTED);
3463 end_menu(win, prompt);
3464 n = select_menu(win, PICK_ONE, &pick_list);
3465 destroy_nhwindow(win);
3467 int k = pick_list[0].item.a_int;
3469 if (n > 1 && k == (more_containers ? 7 : 8))
3470 k = pick_list[1].item.a_int;
3471 free((genericptr_t) pick_list);
3472 return lootchars[k]; /* :,o,i,b,r,s,n,q */
3474 return (n == 0 && more_containers) ? 'n' : 'q'; /* next or quit */
3477 static const char tippables[] = { ALL_CLASSES, TOOL_CLASS, 0 };
3479 /* #tip command -- empty container contents onto floor */
3483 struct obj *cobj, *nobj;
3486 char c, buf[BUFSZ], qbuf[BUFSZ];
3487 const char *spillage = 0;
3490 * doesn't require free hands;
3491 * limbs are needed to tip floor containers
3494 /* at present, can only tip things at current spot, not adjacent ones */
3495 cc.x = u.ux, cc.y = u.uy;
3497 /* check floor container(s) first; at most one will be accessed */
3498 if ((boxes = container_at(cc.x, cc.y, TRUE)) > 0) {
3500 Sprintf(buf, "You can't tip %s while carrying so much.",
3501 !flags.verbose ? "a container" : (boxes > 1) ? "one" : "it");
3503 Strcpy(buf, "
\82½
\82
\82³
\82ñ
\82à
\82Ì
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä
\82¢
\82é
\82Ì
\82Å
\82Ð
\82Á
\82
\82è
\82©
\82¦
\82¹
\82È
\82¢
\81D");
3505 if (!check_capacity(buf) && able_to_loot(cc.x, cc.y, FALSE)) {
3506 if (boxes > 1 && (flags.menu_style != MENU_TRADITIONAL
3507 || iflags.menu_requested)) {
3508 /* use menu to pick a container to tip */
3512 menu_item *pick_list = (menu_item *) 0;
3513 struct obj dummyobj, *otmp;
3516 win = create_nhwindow(NHW_MENU);
3519 for (cobj = level.objects[cc.x][cc.y], i = 0; cobj;
3520 cobj = cobj->nexthere)
3521 if (Is_container(cobj)) {
3524 add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
3525 doname(cobj), MENU_UNSELECTED);
3529 add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
3530 "", MENU_UNSELECTED);
3531 any.a_obj = &dummyobj;
3532 /* use 'i' for inventory unless there are so many
3533 containers that it's already being used */
3534 i = (i <= 'i' - 'a' && !flags.lootabc) ? 'i' : 0;
3536 add_menu(win, NO_GLYPH, &any, i, 0, ATR_NONE,
3537 "tip something being carried", MENU_SELECTED);
3539 add_menu(win, NO_GLYPH, &any, i, 0, ATR_NONE,
3540 "
\93ü
\82ê
\95¨
\82ð
\82Ð
\82Á
\82
\82è
\82©
\82¦
\82·", MENU_SELECTED);
3544 end_menu(win, "Tip which container?");
3546 end_menu(win, "
\82Ç
\82Ì
\93ü
\82ê
\95¨
\82ð
\82Ð
\82Á
\82
\82è
\82©
\82¦
\82·
\81H");
3547 n = select_menu(win, PICK_ONE, &pick_list);
3548 destroy_nhwindow(win);
3550 * Deal with quirk of preselected item in pick-one menu:
3551 * n == 0 => picked preselected entry, toggling it off;
3552 * n == 1 => accepted preselected choice via SPACE or RETURN;
3553 * n == 2 => picked something other than preselected entry;
3554 * n == -1 => cancelled via ESC;
3556 otmp = (n <= 0) ? (struct obj *) 0 : pick_list[0].item.a_obj;
3557 if (n > 1 && otmp == &dummyobj)
3558 otmp = pick_list[1].item.a_obj;
3560 free((genericptr_t) pick_list);
3561 if (otmp && otmp != &dummyobj) {
3567 /* else pick-from-invent below */
3569 for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) {
3570 nobj = cobj->nexthere;
3571 if (!Is_container(cobj))
3574 c = ynq(safe_qbuf(qbuf, "There is ", " here, tip it?",
3576 doname, ansimpleoname, "container"));
3578 c = ynq(safe_qbuf(qbuf, "
\82±
\82±
\82É
\82Í", "
\82ª
\82 \82é
\81C
\82Ð
\82Á
\82
\82è
\95Ô
\82·?",
3580 doname, ansimpleoname, "
\93ü
\82ê
\95¨"));
3587 /* can only tip one container at a time */
3594 /* either no floor container(s) or couldn't tip one or didn't tip any */
3595 cobj = getobj(tippables, "tip");
3600 if (Is_container(cobj) || cobj->otyp == HORN_OF_PLENTY) {
3604 /* assorted other cases */
3605 if (Is_candle(cobj) && cobj->lamplit) {
3606 /* note "wax" even for tallow candles to avoid giving away info */
3610 spillage = "
\82ë
\82¤";
3611 } else if ((cobj->otyp == POT_OIL && cobj->lamplit)
3612 || (cobj->otyp == OIL_LAMP && cobj->age != 0L)
3613 || (cobj->otyp == MAGIC_LAMP && cobj->spe != 0)) {
3618 /* todo: reduce potion's remaining burn timer or oil lamp's fuel */
3619 } else if (cobj->otyp == CAN_OF_GREASE && cobj->spe > 0) {
3620 /* charged consumed below */
3622 spillage = "grease";
3624 spillage = "
\8e\89";
3625 } else if (cobj->otyp == FOOD_RATION || cobj->otyp == CRAM_RATION
3626 || cobj->otyp == LEMBAS_WAFER) {
3628 spillage = "crumbs";
3630 spillage = "
\83p
\83\93\82
\82¸";
3631 } else if (cobj->oclass == VENOM_CLASS) {
3635 spillage = "
\93Å
\89t";
3639 if (is_pool(u.ux, u.uy))
3641 Sprintf(buf, " and gradually %s", vtense(spillage, "dissipate"));
3643 Strcpy(buf, "
\82»
\82µ
\82Ä
\8f\99\81X
\82É
\8eU
\82Á
\82Ä
\82¢
\82Á
\82½
\81D");
3644 else if (is_lava(u.ux, u.uy))
3646 Sprintf(buf, " and immediately %s away",
3647 vtense(spillage, "burn"));
3649 Strcpy(buf, "
\82»
\82µ
\82Ä
\82·
\82®
\82É
\94R
\82¦
\82Â
\82«
\82½
\81D");
3652 pline("Some %s %s onto the %s%s.", spillage,
3653 vtense(spillage, "spill"), surface(u.ux, u.uy), buf);
3655 pline("%s
\82ª%s
\82Ì
\8fã
\82É
\94ò
\82Ñ
\8eU
\82Á
\82½
\81D%s", spillage,
3656 surface(u.ux, u.uy), buf);
3658 /* shop usage message comes after the spill message */
3659 if (cobj->otyp == CAN_OF_GREASE && cobj->spe > 0) {
3660 consume_obj_charge(cobj, TRUE);
3662 /* something [useless] happened */
3665 /* anything not covered yet */
3666 if (cobj->oclass == POTION_CLASS) /* can't pour potions... */
3668 pline_The("%s %s securely sealed.", xname(cobj), otense(cobj, "are"));
3670 pline_The("%s
\82Í
\82µ
\82Á
\82©
\82è
\82Æ
\90ð
\82ª
\82³
\82ê
\82Ä
\82¢
\82é
\81D", xname(cobj));
3671 else if (cobj->otyp == STATUE)
3673 pline("Nothing interesting happens.");
3675 pline("
\96Ê
\94\92\82¢
\82±
\82Æ
\82Í
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D");
3677 pline1(nothing_happens);
3683 struct obj *box; /* or bag */
3685 xchar ox = u.ux, oy = u.uy; /* #tip only works at hero's location */
3686 boolean empty_it = FALSE, maybeshopgoods;
3688 /* box is either held or on floor at hero's spot; no need to check for
3689 nesting; when held, we need to update its location to match hero's;
3690 for floor, the coordinate updating is redundant */
3691 if (get_obj_location(box, &ox, &oy, 0))
3692 box->ox = ox, box->oy = oy;
3694 /* Shop handling: can't rely on the container's own unpaid
3695 or no_charge status because contents might differ with it.
3696 A carried container's contents will be flagged as unpaid
3697 or not, as appropriate, and need no special handling here.
3698 Items owned by the hero get sold to the shop without
3699 confirmation as with other uncontrolled drops. A floor
3700 container's contents will be marked no_charge if owned by
3701 hero, otherwise they're owned by the shop. By passing
3702 the contents through shop billing, they end up getting
3703 treated the same as in the carried case. We do so one
3704 item at a time instead of doing whole container at once
3705 to reduce the chance of exhausting shk's billing capacity. */
3706 maybeshopgoods = !carried(box) && costly_spot(box->ox, box->oy);
3708 /* caveat: this assumes that cknown, lknown, olocked, and otrapped
3709 fields haven't been overloaded to mean something special for the
3710 non-standard "container" horn of plenty */
3714 update_inventory(); /* jumping the gun slightly; hope that's ok */
3718 pline("It's locked.");
3720 pline("
\8c®
\82ª
\8a|
\82©
\82Á
\82Ä
\82¢
\82é
\81D");
3721 } else if (box->otrapped) {
3722 /* we're not reaching inside but we're still handling it... */
3723 (void) chest_trap(box, HAND, FALSE);
3724 /* even if the trap fails, you've used up this turn */
3725 if (multi >= 0) { /* in case we didn't become paralyzed */
3728 multi_reason = "tipping a container";
3730 multi_reason = "
\94 \82ð
\82Ð
\82Á
\82
\82è
\95Ô
\82µ
\82Ä
\82¢
\82é
\8e\9e\82É";
3733 } else if (box->otyp == BAG_OF_TRICKS || box->otyp == HORN_OF_PLENTY) {
3734 boolean bag = box->otyp == BAG_OF_TRICKS;
3735 int old_spe = box->spe, seen = 0;
3737 if (maybeshopgoods && !box->no_charge)
3738 addtobill(box, FALSE, FALSE, TRUE);
3739 /* apply this bag/horn until empty or monster/object creation fails
3740 (if the latter occurs, force the former...) */
3742 if (!(bag ? bagotricks(box, TRUE, &seen)
3743 : hornoplenty(box, TRUE)))
3745 } while (box->spe > 0);
3747 if (box->spe < old_spe) {
3750 pline((seen == 0) ? "Nothing seems to happen."
3751 : (seen == 1) ? "A monster appears."
3752 : "Monsters appear!");
3754 pline((seen == 0) ? "
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D"
3755 : (seen == 1) ? "
\89ö
\95¨
\82ª
\8c»
\82ê
\82½
\81D"
3756 : "
\89ö
\95¨
\82ª
\8c»
\82ê
\82½
\81I");
3758 /* check_unpaid wants to see a non-zero charge count */
3760 check_unpaid_usage(box, TRUE);
3761 box->spe = 0; /* empty */
3764 if (maybeshopgoods && !box->no_charge)
3765 subfrombill(box, shop_keeper(*in_rooms(ox, oy, SHOPBASE)));
3766 } else if (SchroedingersBox(box)) {
3767 char yourbuf[BUFSZ];
3769 observe_quantum_cat(box, TRUE, TRUE);
3770 if (!Has_contents(box)) /* evidently a live cat came out */
3771 /* container type of "large box" is inferred */
3773 pline("%sbox is now empty.", Shk_Your(yourbuf, box));
3775 pline("%s
\94 \82Í
\8bó
\82É
\82È
\82Á
\82½
\81D", Shk_Your(yourbuf, box));
3776 else /* holds cat corpse */
3779 } else if (!Has_contents(box)) {
3782 pline("It's empty.");
3784 pline("
\82±
\82ê
\82Í
\8bó
\82¾
\81D");
3790 struct obj *otmp, *nobj;
3791 boolean terse, highdrop = !can_reach_floor(TRUE),
3792 altarizing = IS_ALTAR(levl[ox][oy].typ),
3793 cursed_mbag = (Is_mbag(box) && box->cursed);
3794 int held = carried(box);
3798 highdrop = altarizing = FALSE;
3799 terse = !(highdrop || altarizing || costly_spot(box->ox, box->oy));
3801 /* Terse formatting is
3802 * "Objects spill out: obj1, obj2, obj3, ..., objN."
3803 * If any other messages intervene between objects, we revert to
3804 * "ObjK drops to the floor.", "ObjL drops to the floor.", &c.
3808 box->cobj->nobj ? "Objects spill" : "An object spills",
3811 pline("
\92\86\90g
\82ª
\8fo
\82Ä
\82«
\82½%s",
3812 !(highdrop || altarizing) ? "
\81F" : "
\81D");
3814 for (otmp = box->cobj; otmp; otmp = nobj) {
3816 obj_extract_self(otmp);
3817 otmp->ox = box->ox, otmp->oy = box->oy;
3819 if (box->otyp == ICE_BOX) {
3820 removed_from_icebox(otmp); /* resume rotting for corpse */
3821 } else if (cursed_mbag && !rn2(13)) {
3822 loss += mbag_item_gone(held, otmp);
3823 /* abbreviated drop format is no longer appropriate */
3828 if (maybeshopgoods) {
3829 addtobill(otmp, FALSE, FALSE, TRUE);
3830 iflags.suppress_price++; /* doname formatting */
3834 /* might break or fall down stairs; handles altars itself */
3835 hitfloor(otmp, TRUE);
3839 } else if (!terse) {
3841 pline("%s %s to the %s.", Doname2(otmp),
3842 otense(otmp, "drop"), surface(ox, oy));
3844 pline("%s
\82Í%s
\82Ì
\8fã
\82É
\97\8e\82¿
\82½
\81D", Doname2(otmp),
3849 pline("%s%c", doname(otmp), nobj ? ',' : '.');
3851 pline("%s%s", doname(otmp), nobj ? "
\81C" : "
\81D");
3852 iflags.last_msg = PLNMSG_OBJNAM_ONLY;
3855 if (iflags.last_msg != PLNMSG_OBJNAM_ONLY)
3856 terse = FALSE; /* terse formatting has been interrupted */
3859 iflags.suppress_price--; /* reset */
3861 if (loss) /* magic bag lost some shop goods */
3863 You("owe %ld %s for lost merchandise.", loss, currency(loss));
3865 You("
\8e¸
\82Á
\82½
\82à
\82Ì
\82É
\91Î
\82µ
\82Ä%ld%s
\82Ì
\95\89\8dÂ
\82ð
\95\89\82Á
\82½
\81D", loss, currency(loss));
3866 box->owt = weight(box); /* mbag_item_gone() doesn't update this */
3868 (void) encumber_msg();
3870 if (carried(box)) /* box is now empty with cknown set */