1 /* NetHack 3.6 pickup.c $NHDT-Date: 1516581051 2018/01/22 00:30:51 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.194 $ */
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-2016 */
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 long FDECL(carry_count, (struct obj *, struct obj *, long,
33 BOOLEAN_P, int *, int *));
34 STATIC_DCL int FDECL(lift_object, (struct obj *, struct obj *, long *,
36 STATIC_DCL boolean FDECL(mbag_explodes, (struct obj *, int));
37 STATIC_DCL long FDECL(boh_loss, (struct obj *container, int));
38 STATIC_PTR int FDECL(in_container, (struct obj *));
39 STATIC_PTR int FDECL(out_container, (struct obj *));
40 STATIC_DCL void FDECL(removed_from_icebox, (struct obj *));
41 STATIC_DCL long FDECL(mbag_item_gone, (int, struct obj *));
42 STATIC_DCL void FDECL(observe_quantum_cat, (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)
59 * How much the weight of the given container will change when the given
60 * object is removed from it. This calculation must match the one used
61 * by weight() in mkobj.c.
63 #define DELTA_CWT(cont, obj) \
64 ((cont)->cursed ? (obj)->owt * 2 : (cont)->blessed \
65 ? ((obj)->owt + 3) / 4 \
66 : ((obj)->owt + 1) / 2)
67 #define GOLD_WT(n) (((n) + 50L) / 100L)
68 /* if you can figure this out, give yourself a hearty pat on the back... */
69 #define GOLD_CAPACITY(w, n) (((w) * -100L) - ((n) + 50L) - 1L)
71 /* A variable set in use_container(), to be used by the callback routines
72 in_container() and out_container() from askchain() and use_container().
73 Also used by menu_loot() and container_gone(). */
74 static NEARDATA struct obj *current_container;
75 static NEARDATA boolean abort_looting;
76 #define Icebox (current_container->otyp == ICE_BOX)
80 moderateloadmsg[] = "You have a little trouble lifting",
82 moderateloadmsg[] = "
\82ð
\8e\9d\82Á
\82½
\82ç
\8f
\82µ
\82Ó
\82ç
\82Â
\82¢
\82½",
84 nearloadmsg[] = "You have much trouble lifting",
86 nearloadmsg[] = "
\82Í
\82¸
\82Á
\82µ
\82è
\82Æ
\8c¨
\82É
\82Ì
\82µ
\82©
\82©
\82Á
\82½",
88 overloadmsg[] = "You have extreme difficulty lifting";
90 overloadmsg[] = "
\82ð
\8e\9d\82¿
\82 \82°
\82é
\82Ì
\82Í
\82Æ
\82Ä
\82à
\82Â
\82ç
\82¢";
92 /* BUG: this lets you look at cockatrice corpses while blind without
94 /* much simpler version of the look-here code; used by query_classes() */
96 simple_look(otmp, here)
97 struct obj *otmp; /* list of objects */
98 boolean here; /* flag for type of obj list linkage */
100 /* Neither of the first two cases is expected to happen, since
101 * we're only called after multiple classes of objects have been
102 * detected, hence multiple objects must be present.
105 impossible("simple_look(null)");
106 } else if (!(here ? otmp->nexthere : otmp->nobj)) {
107 pline1(doname(otmp));
109 winid tmpwin = create_nhwindow(NHW_MENU);
111 putstr(tmpwin, 0, "");
113 putstr(tmpwin, 0, doname(otmp));
114 otmp = here ? otmp->nexthere : otmp->nobj;
116 display_nhwindow(tmpwin, TRUE);
117 destroy_nhwindow(tmpwin);
122 collect_obj_classes(ilets, otmp, here, filter, itemcount)
124 register struct obj *otmp;
126 boolean FDECL((*filter), (OBJ_P));
129 register int iletct = 0;
133 ilets[iletct] = '\0'; /* terminate ilets so that index() will work */
135 c = def_oc_syms[(int) otmp->oclass].sym;
136 if (!index(ilets, c) && (!filter || (*filter)(otmp)))
137 ilets[iletct++] = c, ilets[iletct] = '\0';
139 otmp = here ? otmp->nexthere : otmp->nobj;
146 * Suppose some '?' and '!' objects are present, but '/' objects aren't:
147 * "a" picks all items without further prompting;
148 * "A" steps through all items, asking one by one;
149 * "?" steps through '?' items, asking, and ignores '!' ones;
150 * "/" becomes 'A', since no '/' present;
151 * "?a" or "a?" picks all '?' without further prompting;
152 * "/a" or "a/" becomes 'A' since there aren't any '/'
153 * (bug fix: 3.1.0 thru 3.1.3 treated it as "a");
154 * "?/a" or "a?/" or "/a?",&c picks all '?' even though no '/'
155 * (ie, treated as if it had just been "?a").
157 /*JP CHECK: 3.4.3
\82Å
\82Ì
\8cÄ
\82Ñ
\8fo
\82µ
\8c³
158 pickup.c:572:("
\8fE
\82¤") if (!query_classes(oclasses, &selective, &all_of_a_type,
159 pickup.c:2604:("
\8eæ
\82è
\8fo
\82·") if (query_classes(select, &one_by_one, &allflag,
160 pickup.c:2704:("
\93ü
\82ê
\82é") if (query_classes(select, &one_by_one, &allflag, "
\93ü
\82ê
\82é",
163 query_classes(oclasses, one_at_a_time, everything, action, objs, here,
166 boolean *one_at_a_time, *everything;
172 char ilets[36], inbuf[BUFSZ] = DUMMY; /* FIXME: hardcoded ilets[] length */
173 int iletct, oclassct;
174 boolean not_everything, filtered;
177 int itemcount, bcnt, ucnt, ccnt, xcnt, ocnt;
179 oclasses[oclassct = 0] = '\0';
180 *one_at_a_time = *everything = m_seen = FALSE;
183 iletct = collect_obj_classes(ilets, objs, here,
184 (boolean FDECL((*), (OBJ_P))) 0, &itemcount);
189 oclasses[0] = def_char_to_objclass(ilets[0]);
191 } else { /* more than one choice available */
192 /* additional choices */
193 ilets[iletct++] = ' ';
194 ilets[iletct++] = 'a';
195 ilets[iletct++] = 'A';
196 ilets[iletct++] = (objs == invent ? 'i' : ':');
198 if (itemcount && menu_on_demand)
199 ilets[iletct++] = 'm';
200 if (count_unpaid(objs))
201 ilets[iletct++] = 'u';
203 tally_BUCX(objs, here, &bcnt, &ucnt, &ccnt, &xcnt, &ocnt);
205 ilets[iletct++] = 'B';
207 ilets[iletct++] = 'U';
209 ilets[iletct++] = 'C';
211 ilets[iletct++] = 'X';
212 ilets[iletct] = '\0';
215 const char *where = 0;
216 char sym, oc_of_sym, *p;
219 oclasses[oclassct = 0] = '\0';
220 *one_at_a_time = *everything = FALSE;
221 not_everything = filtered = FALSE;
223 Sprintf(qbuf, "What kinds of thing do you want to %s? [%s]", action,
226 Sprintf(qbuf,"
\82Ç
\82Ì
\8eí
\97Þ
\82Ì
\82à
\82Ì
\82ð%s
\82©
\81H[%s]", jpolite(action),
230 if (*inbuf == '\033')
233 for (p = inbuf; (sym = *p++) != 0; ) {
237 *one_at_a_time = TRUE;
240 else if (sym == ':') {
241 simple_look(objs, here); /* dumb if objs==invent */
242 /* if we just scanned the contents of a container
243 then mark it as having known contents */
244 if (objs->where == OBJ_CONTAINED)
245 objs->ocontainer->cknown = 1;
247 } else if (sym == 'i') {
248 (void) display_inventory((char *) 0, TRUE);
250 } else if (sym == 'm') {
252 } else if (index("uBUCX", sym)) {
253 add_valid_menu_class(sym); /* 'u' or 'B','U','C',or 'X' */
256 oc_of_sym = def_char_to_objclass(sym);
257 if (index(ilets, sym)) {
258 add_valid_menu_class(oc_of_sym);
259 oclasses[oclassct++] = oc_of_sym;
260 oclasses[oclassct] = '\0';
264 where = !strcmp(action, "pick up") ? "here"
266 where = !strcmp(action, "
\8fE
\82¤") ? "
\82±
\82±"
268 : !strcmp(action, "take out") ? "inside" : "";
270 : !strcmp(action, "
\8eæ
\82è
\8fo
\82·") ? "
\82Ì
\92\86" : "";
273 There("are no %c's %s.", sym, where);
275 pline("%c
\82Í%s
\82É
\82È
\82¢
\81D", sym, where);
278 You("have no %c's.", sym);
280 You("%c
\82Í
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\81D", sym);
281 not_everything = TRUE;
284 } /* for p:sym in inbuf */
286 if (m_seen && menu_on_demand) {
287 *menu_on_demand = (((*everything || !oclassct) && !filtered)
291 if (!oclassct && (!*everything || not_everything)) {
292 /* didn't pick anything,
293 or tried to pick something that's not present */
294 *one_at_a_time = TRUE; /* force 'A' */
295 *everything = FALSE; /* inhibit 'a' */
301 /* check whether hero is bare-handedly touching a cockatrice corpse */
303 fatal_corpse_mistake(obj, remotely)
307 if (uarmg || remotely || obj->otyp != CORPSE
308 || !touch_petrifies(&mons[obj->corpsenm]) || Stone_resistance)
311 if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) {
312 display_nhwindow(WIN_MESSAGE, FALSE); /* --More-- */
317 pline("Touching %s is a fatal mistake.",
319 pline("%s
\82É
\90G
\82ê
\82é
\82Ì
\82Í
\92v
\96½
\93I
\82È
\8aÔ
\88á
\82¢
\82¾
\81D",
320 corpse_xname(obj, (const char *) 0, CXN_SINGULAR | CXN_ARTICLE));
321 instapetrify(killer_xname(obj));
325 /* attempting to manipulate a Rider's corpse triggers its revival */
327 rider_corpse_revival(obj, remotely)
331 if (!obj || obj->otyp != CORPSE || !is_rider(&mons[obj->corpsenm]))
335 pline("At your %s, the corpse suddenly moves...",
337 pline("
\82 \82È
\82½
\82ª%s
\82é
\82Æ
\93Ë
\91R
\8e\80\91Ì
\82ª
\93®
\82«
\8fo
\82µ
\82½
\81D
\81D
\81D",
339 remotely ? "attempted acquisition" : "touch");
341 remotely ? "
\8al
\93¾
\82µ
\82æ
\82¤
\82Æ
\82·" : "
\90G");
342 (void) revive_corpse(obj);
343 exercise(A_WIS, FALSE);
347 /* look at the objects at our location, unless there are too many of them */
349 check_here(picked_some)
352 register struct obj *obj;
355 /* count the objects here */
356 for (obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere) {
361 /* If there are objects here, take a look. */
366 (void) look_here(ct, picked_some);
368 read_engr_at(u.ux, u.uy);
372 /* Value set by query_objlist() for n_or_more(). */
373 static long val_for_n_or_more;
375 /* query_objlist callback: return TRUE if obj's count is >= reference value */
382 return (boolean) (obj->quan >= val_for_n_or_more);
385 /* list of valid menu classes for query_objlist() and allow_category callback
386 (with room for all object classes, 'u'npaid, BUCX, and terminator) */
387 static char valid_menu_classes[MAXOCLASSES + 1 + 4 + 1];
388 static boolean class_filter, bucx_filter, shop_filter;
390 /* check valid_menu_classes[] for an entry; also used by askchain() */
392 menu_class_present(c)
395 return (c && index(valid_menu_classes, c)) ? TRUE : FALSE;
399 add_valid_menu_class(c)
402 static int vmc_count = 0;
404 if (c == 0) { /* reset */
406 class_filter = bucx_filter = shop_filter = FALSE;
407 } else if (!menu_class_present(c)) {
408 valid_menu_classes[vmc_count++] = (char) c;
409 /* categorize the new class */
413 case 'C': /*FALLTHRU*/
425 valid_menu_classes[vmc_count] = '\0';
428 /* query_objlist callback: return TRUE if not uchain */
433 return (boolean) (obj != uchain);
436 /* query_objlist callback: return TRUE */
440 struct obj *obj UNUSED;
449 /* For coins, if any class filter is specified, accept if coins
450 * are included regardless of whether either unpaid or BUC-status
451 * is also specified since player has explicitly requested coins.
452 * If no class filtering is specified but bless/curse state is,
453 * coins are either unknown or uncursed based on an option setting.
455 if (obj->oclass == COIN_CLASS)
457 ? (index(valid_menu_classes, COIN_CLASS) ? TRUE : FALSE)
458 : shop_filter /* coins are never unpaid, but check anyway */
459 ? (obj->unpaid ? TRUE : FALSE)
461 ? (index(valid_menu_classes, iflags.goldX ? 'X' : 'U')
463 : TRUE; /* catchall: no filters specified, so accept */
465 if (Role_if(PM_PRIEST))
469 * There are three types of filters possible and the first and
470 * third can have more than one entry:
471 * 1) object class (armor, potion, &c);
472 * 2) unpaid shop item;
473 * 3) bless/curse state (blessed, uncursed, cursed, BUC-unknown).
474 * When only one type is present, the situation is simple:
475 * to be accepted, obj's status must match one of the entries.
476 * When more than one type is present, the obj will now only
477 * be accepted when it matches one entry of each type.
478 * So ?!B will accept blessed scrolls or potions, and [u will
479 * accept unpaid armor. (In 3.4.3, an object was accepted by
480 * this filter if it met any entry of any type, so ?!B resulted
481 * in accepting all scrolls and potions regardless of bless/curse
482 * state plus all blessed non-scroll, non-potion objects.)
485 /* if class is expected but obj's class is not in the list, reject */
486 if (class_filter && !index(valid_menu_classes, obj->oclass))
488 /* if unpaid is expected and obj isn't unpaid, reject (treat a container
489 holding any unpaid object as unpaid even if isn't unpaid itself) */
490 if (shop_filter && !obj->unpaid
491 && !(Has_contents(obj) && count_unpaid(obj->cobj) > 0))
493 /* check for particular bless/curse state */
495 /* first categorize this object's bless/curse state */
496 char bucx = !obj->bknown ? 'X'
497 : obj->blessed ? 'B' : obj->cursed ? 'C' : 'U';
499 /* if its category is not in the list, reject */
500 if (!index(valid_menu_classes, bucx))
503 /* obj didn't fail any of the filter checks, so accept */
508 /* query_objlist callback: return TRUE if valid category (class), no uchain */
510 allow_cat_no_uchain(obj)
514 && ((index(valid_menu_classes, 'u') && obj->unpaid)
515 || index(valid_menu_classes, obj->oclass)))
521 /* query_objlist callback: return TRUE if valid class and worn */
523 is_worn_by_type(otmp)
524 register struct obj *otmp;
526 return (is_worn(otmp) && allow_category(otmp)) ? TRUE : FALSE;
530 * Have the hero pick things from the ground
531 * or a monster's inventory if swallowed.
536 * <0 pickup count of something
538 * Returns 1 if tried to pick something up, whether
539 * or not it succeeded.
543 int what; /* should be a long */
545 int i, n, res, count, n_tried = 0, n_picked = 0;
546 menu_item *pick_list = (menu_item *) 0;
547 boolean autopickup = what > 0;
548 struct obj **objchain_p;
551 /* we might have arrived here while fainted or sleeping, via
552 random teleport or levitation timeout; if so, skip check_here
553 and read_engr_at in addition to bypassing autopickup itself
554 [probably ought to check whether hero is using a cockatrice
555 corpse for a pillow here... (also at initial faint/sleep)] */
556 if (autopickup && multi < 0 && unconscious())
559 if (what < 0) /* pick N of something */
561 else /* pick anything */
567 /* no auto-pick if no-pick move, nothing there, or in a pool */
568 if (autopickup && (context.nopick || !OBJ_AT(u.ux, u.uy)
569 || (is_pool(u.ux, u.uy) && !Underwater)
570 || is_lava(u.ux, u.uy))) {
571 read_engr_at(u.ux, u.uy);
574 /* no pickup if levitating & not on air or water level */
575 if (!can_reach_floor(TRUE)) {
576 if ((multi && !context.run) || (autopickup && !flags.pickup)
577 || ((ttmp = t_at(u.ux, u.uy)) != 0
578 && uteetering_at_seen_pit(ttmp)))
579 read_engr_at(u.ux, u.uy);
582 /* multi && !context.run means they are in the middle of some other
583 * action, or possibly paralyzed, sleeping, etc.... and they just
584 * teleported onto the object. They shouldn't pick it up.
586 if ((multi && !context.run) || (autopickup && !flags.pickup)) {
590 if (notake(youmonst.data)) {
593 You("are physically incapable of picking anything up.");
595 You("
\95¨
\97\9d\93I
\82É
\8fE
\82¢
\82 \82°
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D");
601 /* if there's anything here, stop running */
602 if (OBJ_AT(u.ux, u.uy) && context.run && context.run != 8
607 add_valid_menu_class(0); /* reset */
609 objchain_p = &level.objects[u.ux][u.uy];
610 traverse_how = BY_NEXTHERE;
612 objchain_p = &u.ustuck->minvent;
613 traverse_how = 0; /* nobj */
616 * Start the actual pickup process. This is split into two main
617 * sections, the newer menu and the older "traditional" methods.
618 * Automatic pickup has been split into its own menu-style routine
619 * to make things less confusing.
622 n = autopick(*objchain_p, traverse_how, &pick_list);
626 if (flags.menu_style != MENU_TRADITIONAL || iflags.menu_requested) {
627 /* use menus exclusively */
628 traverse_how |= AUTOSELECT_SINGLE | INVORDER_SORT;
629 if (count) { /* looking for N of something */
633 Sprintf(qbuf, "Pick %d of what?", count);
635 Sprintf(qbuf, "
\89½
\82ð%d
\8cÂ
\8fE
\82¢
\82Ü
\82·
\82©
\81H", count);
636 val_for_n_or_more = count; /* set up callback selector */
637 n = query_objlist(qbuf, objchain_p, traverse_how,
638 &pick_list, PICK_ONE, n_or_more);
639 /* correct counts, if any given */
640 for (i = 0; i < n; i++)
641 pick_list[i].count = count;
644 n = query_objlist("Pick up what?", objchain_p,
645 (traverse_how | FEEL_COCKATRICE),
646 &pick_list, PICK_ANY, all_but_uchain);
648 n = query_objlist("
\89½
\82ð
\8fE
\82¢
\82Ü
\82·
\82©
\81H", objchain_p,
649 (traverse_how | FEEL_COCKATRICE),
650 &pick_list, PICK_ANY, all_but_uchain);
656 for (n_picked = i = 0; i < n; i++) {
657 res = pickup_object(pick_list[i].item.a_obj, pick_list[i].count,
660 break; /* can't continue */
664 free((genericptr_t) pick_list);
667 /* old style interface */
670 boolean all_of_a_type, selective, bycat;
671 char oclasses[MAXOCLASSES + 10]; /* +10: room for B,U,C,X plus slop */
672 struct obj *obj, *obj2;
674 oclasses[0] = '\0'; /* types to consider (empty for all) */
675 all_of_a_type = TRUE; /* take all of considered types */
676 selective = FALSE; /* ask for each item */
678 /* check for more than one object */
679 for (obj = *objchain_p; obj; obj = FOLLOW(obj, traverse_how))
682 if (ct == 1 && count) {
683 /* if only one thing, then pick it */
685 lcount = min(obj->quan, (long) count);
687 if (pickup_object(obj, lcount, FALSE) > 0)
688 n_picked++; /* picked something */
691 } else if (ct >= 2) {
695 There("are %s objects here.", (ct <= 10) ? "several" : "many");
697 pline("
\82±
\82±
\82É
\82Í%s
\82à
\82Ì
\82ª
\82 \82é
\81D", (ct <= 10) ? "
\82¢
\82
\82Â
\82©" : "
\91ò
\8eR
\82Ì");
699 if (!query_classes(oclasses, &selective, &all_of_a_type,
700 "pick up", *objchain_p,
701 (traverse_how & BY_NEXTHERE) ? TRUE : FALSE,
704 if (!query_classes(oclasses, &selective, &all_of_a_type,
705 "
\8fE
\82¤", *objchain_p,
706 (traverse_how & BY_NEXTHERE) ? TRUE : FALSE,
712 traverse_how |= INVORDER_SORT;
714 n = query_objlist("Pick up what?", objchain_p, traverse_how,
715 &pick_list, PICK_ANY,
716 (via_menu == -2) ? allow_all
719 n = query_objlist("
\89½
\82ð
\8fE
\82¢
\82Ü
\82·
\82©
\81H", objchain_p, traverse_how,
720 &pick_list, PICK_ANY,
721 (via_menu == -2) ? allow_all
727 bycat = (menu_class_present('B') || menu_class_present('U')
728 || menu_class_present('C') || menu_class_present('X'));
730 for (obj = *objchain_p; obj; obj = obj2) {
731 obj2 = FOLLOW(obj, traverse_how);
732 if (bycat ? !allow_category(obj)
733 : (!selective && oclasses[0]
734 && !index(oclasses, obj->oclass)))
738 if (!all_of_a_type) {
742 (void) safe_qbuf(qbuf, "Pick up ", "?", obj, doname,
743 ansimpleoname, something);
745 (void) safe_qbuf(qbuf, "", "
\82ð
\8fE
\82¢
\82Ü
\82·
\82©
\81H", obj, doname,
746 ansimpleoname, "
\82±
\82ê");
748 switch ((obj->quan < 2L) ? ynaq(qbuf) : ynNaq(qbuf)) {
750 goto end_query; /* out 2 levels */
754 all_of_a_type = TRUE;
757 oclasses[0] = obj->oclass;
761 case '#': /* count was entered */
763 continue; /* 0 count => No */
764 lcount = (long) yn_number;
765 if (lcount > obj->quan)
776 if ((res = pickup_object(obj, lcount, FALSE)) < 0)
781 ; /* statement required after label */
785 if (hides_under(youmonst.data))
786 (void) hideunder(&youmonst);
788 /* position may need updating (invisible hero) */
790 newsym_force(u.ux, u.uy);
792 /* check if there's anything else here after auto-pickup is done */
794 check_here(n_picked > 0);
797 add_valid_menu_class(0); /* reset */
798 return (n_tried > 0);
802 is_autopickup_exception(obj, grab)
804 boolean grab; /* forced pickup, rather than forced leave behind? */
807 * Does the text description of this match an exception?
809 struct autopickup_exception
810 *ape = (grab) ? iflags.autopickup_exceptions[AP_GRAB]
811 : iflags.autopickup_exceptions[AP_LEAVE];
814 char *objdesc = makesingular(doname(obj));
817 if (regex_match(objdesc, ape->regex))
826 autopick_testobj(otmp, calc_costly)
830 static boolean costly = FALSE;
831 const char *otypes = flags.pickup_types;
834 /* calculate 'costly' just once for a given autopickup operation */
836 costly = (otmp->where == OBJ_FLOOR
837 && costly_spot(otmp->ox, otmp->oy));
839 /* first check: reject if an unpaid item in a shop */
840 if (costly && !otmp->no_charge)
843 /* check for pickup_types */
844 pickit = (!*otypes || index(otypes, otmp->oclass));
845 /* check for "always pick up */
847 pickit = is_autopickup_exception(otmp, TRUE);
848 /* then for "never pick up */
850 pickit = !is_autopickup_exception(otmp, FALSE);
851 /* pickup_thrown overrides pickup_types and exceptions */
853 pickit = (flags.pickup_thrown && otmp->was_thrown);
858 * Pick from the given list using flags.pickup_types. Return the number
859 * of items picked (not counts). Create an array that returns pointers
860 * and counts of the items to be picked up. If the number of items
861 * picked is zero, the pickup list is left alone. The caller of this
862 * function must free the pickup list.
865 autopick(olist, follow, pick_list)
866 struct obj *olist; /* the object list */
867 int follow; /* how to follow the object list */
868 menu_item **pick_list; /* list of objects and counts to pick up */
870 menu_item *pi; /* pick item */
873 boolean check_costly = TRUE;
875 /* first count the number of eligible items */
876 for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) {
877 if (autopick_testobj(curr, check_costly))
879 check_costly = FALSE; /* only need to check once per autopickup */
883 *pick_list = pi = (menu_item *) alloc(sizeof (menu_item) * n);
884 for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) {
885 if (autopick_testobj(curr, FALSE)) {
886 pi[n].item.a_obj = curr;
887 pi[n].count = curr->quan;
896 * Put up a menu using the given object list. Only those objects on the
897 * list that meet the approval of the allow function are displayed. Return
898 * a count of the number of items selected, as well as an allocated array of
899 * menu_items, containing pointers to the objects selected and counts. The
900 * returned counts are guaranteed to be in bounds and non-zero.
903 * BY_NEXTHERE - Follow object list via nexthere instead of nobj.
904 * AUTOSELECT_SINGLE - Don't ask if only 1 object qualifies - just
906 * USE_INVLET - Use object's invlet.
907 * INVORDER_SORT - Use hero's pack order.
908 * INCLUDE_HERO - Showing engulfer's invent; show hero too.
909 * SIGNAL_NOMENU - Return -1 rather than 0 if nothing passes "allow".
910 * SIGNAL_ESCAPE - Return -1 rather than 0 if player uses ESC to
912 * FEEL_COCKATRICE - touch corpse.
915 query_objlist(qstr, olist_p, qflags, pick_list, how, allow)
916 const char *qstr; /* query string */
917 struct obj **olist_p; /* the list to pick from */
918 int qflags; /* options to control the query */
919 menu_item **pick_list; /* return list of items picked */
920 int how; /* type of query */
921 boolean FDECL((*allow), (OBJ_P)); /* allow function */
925 struct obj *curr, *last, fake_hero_object, *olist = *olist_p;
928 boolean printed_type_name, first,
929 sorted = (qflags & INVORDER_SORT) != 0,
930 engulfer = (qflags & INCLUDE_HERO) != 0;
932 *pick_list = (menu_item *) 0;
933 if (!olist && !engulfer)
936 /* count the number of items allowed */
937 for (n = 0, last = 0, curr = olist; curr; curr = FOLLOW(curr, qflags))
938 if ((*allow)(curr)) {
944 /* don't autoselect swallowed hero if it's the only choice */
945 qflags &= ~AUTOSELECT_SINGLE;
948 if (n == 0) /* nothing to pick here */
949 return (qflags & SIGNAL_NOMENU) ? -1 : 0;
951 if (n == 1 && (qflags & AUTOSELECT_SINGLE)) {
952 *pick_list = (menu_item *) alloc(sizeof (menu_item));
953 (*pick_list)->item.a_obj = last;
954 (*pick_list)->count = last->quan;
958 if (sorted || flags.sortloot != 'n') {
960 (((flags.sortloot == 'f'
961 || (flags.sortloot == 'l' && !(qflags & USE_INVLET)))
963 : (qflags & USE_INVLET) ? SORTLOOT_INVLET : 0)
964 | (flags.sortpack ? SORTLOOT_PACK : 0)),
965 (qflags & BY_NEXTHERE) ? TRUE : FALSE);
969 win = create_nhwindow(NHW_MENU);
973 * Run through the list and add the objects to the menu. If
974 * INVORDER_SORT is set, we'll run through the list once for
975 * each type so we can group them. The allow function will only
976 * be called once per object in the list.
978 pack = flags.inv_order;
981 printed_type_name = FALSE;
982 for (curr = olist; curr; curr = FOLLOW(curr, qflags)) {
983 if (sorted && curr->oclass != *pack)
985 if ((qflags & FEEL_COCKATRICE) && curr->otyp == CORPSE
986 && will_feel_cockatrice(curr, FALSE)) {
987 destroy_nhwindow(win); /* stop the menu and revert */
988 (void) look_here(0, FALSE);
991 if ((*allow)(curr)) {
992 /* if sorting, print type name (once only) */
993 if (sorted && !printed_type_name) {
995 add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
996 let_to_name(*pack, FALSE,
998 && iflags.menu_head_objsym)),
1000 printed_type_name = TRUE;
1004 add_menu(win, obj_to_glyph(curr), &any,
1005 (qflags & USE_INVLET) ? curr->invlet
1006 : (first && curr->oclass == COIN_CLASS) ? '$' : 0,
1007 def_oc_syms[(int) objects[curr->otyp].oc_class].sym,
1008 ATR_NONE, doname_with_price(curr), MENU_UNSELECTED);
1013 } while (sorted && *pack);
1019 if (sorted && n > 1) {
1021 Sprintf(buf, "%s Creatures",
1022 is_animal(u.ustuck->data) ? "Swallowed" : "Engulfed");
1024 Sprintf(buf, "%s
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82é
\89ö
\95¨",
1025 is_animal(u.ustuck->data) ? "
\88ù
\82Ý" : "
\8aª
\82«");
1027 add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings, buf,
1030 fake_hero_object = zeroobj;
1031 fake_hero_object.quan = 1L; /* not strictly necessary... */
1032 any.a_obj = &fake_hero_object;
1033 add_menu(win, mon_to_glyph(&youmonst), &any,
1034 /* fake inventory letter, no group accelerator */
1035 CONTAINED_SYM, 0, ATR_NONE, an(self_lookat(buf)),
1039 end_menu(win, qstr);
1040 n = select_menu(win, how, pick_list);
1041 destroy_nhwindow(win);
1047 /* fix up counts: -1 means no count used => pick all;
1048 if fake_hero_object was picked, discard that choice */
1049 for (i = k = 0, mi = *pick_list; i < n; i++, mi++) {
1050 if (mi->item.a_obj == &fake_hero_object)
1052 if (mi->count == -1L || mi->count > mi->item.a_obj->quan)
1053 mi->count = mi->item.a_obj->quan;
1055 (*pick_list)[k] = *mi;
1059 /* fake_hero was only choice so discard whole list */
1060 free((genericptr_t) *pick_list);
1064 /* other stuff plus fake_hero; last slot is now unused */
1065 (*pick_list)[k].item = zeroany;
1066 (*pick_list)[k].count = 0L;
1070 /* -1 is used for SIGNAL_NOMENU, so callers don't expect it
1071 to indicate that the player declined to make a choice */
1072 n = (qflags & SIGNAL_ESCAPE) ? -2 : 0;
1078 * allow menu-based category (class) selection (for Drop,take off etc.)
1082 query_category(qstr, olist, qflags, pick_list, how)
1083 const char *qstr; /* query string */
1084 struct obj *olist; /* the list to pick from */
1085 int qflags; /* behaviour modification flags */
1086 menu_item **pick_list; /* return list of items picked */
1087 int how; /* type of query */
1094 boolean collected_type_name;
1097 boolean FDECL((*ofilter), (OBJ_P)) = (boolean FDECL((*), (OBJ_P))) 0;
1098 boolean do_unpaid = FALSE;
1099 boolean do_blessed = FALSE, do_cursed = FALSE, do_uncursed = FALSE,
1100 do_buc_unknown = FALSE;
1101 int num_buc_types = 0;
1103 *pick_list = (menu_item *) 0;
1106 if ((qflags & UNPAID_TYPES) && count_unpaid(olist))
1108 if (qflags & WORN_TYPES)
1110 if ((qflags & BUC_BLESSED) && count_buc(olist, BUC_BLESSED, ofilter)) {
1114 if ((qflags & BUC_CURSED) && count_buc(olist, BUC_CURSED, ofilter)) {
1118 if ((qflags & BUC_UNCURSED) && count_buc(olist, BUC_UNCURSED, ofilter)) {
1122 if ((qflags & BUC_UNKNOWN) && count_buc(olist, BUC_UNKNOWN, ofilter)) {
1123 do_buc_unknown = TRUE;
1127 ccount = count_categories(olist, qflags);
1128 /* no point in actually showing a menu for a single category */
1129 if (ccount == 1 && !do_unpaid && num_buc_types <= 1
1130 && !(qflags & BILLED_TYPES)) {
1131 for (curr = olist; curr; curr = FOLLOW(curr, qflags)) {
1132 if (ofilter && !(*ofilter)(curr))
1137 *pick_list = (menu_item *) alloc(sizeof(menu_item));
1138 (*pick_list)->item.a_int = curr->oclass;
1141 debugpline0("query_category: no single object match");
1146 win = create_nhwindow(NHW_MENU);
1148 pack = flags.inv_order;
1150 if (qflags & CHOOSE_ALL) {
1154 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1156 (qflags & WORN_TYPES) ? "Auto-select every item being worn"
1158 (qflags & WORN_TYPES) ? "
\90g
\82É
\82Â
\82¯
\82ç
\82ê
\82é
\95¨
\91S
\82Ä"
1160 : "Auto-select every item",
1166 add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED);
1169 if ((qflags & ALL_TYPES) && (ccount > 1)) {
1172 any.a_int = ALL_TYPES_SELECTED;
1173 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1175 (qflags & WORN_TYPES) ? "All worn types" : "All types",
1177 (qflags & WORN_TYPES) ? "
\90g
\82É
\82Â
\82¯
\82é
\82à
\82Ì
\91S
\82Ä" : "
\91S
\82Ä",
1183 collected_type_name = FALSE;
1184 for (curr = olist; curr; curr = FOLLOW(curr, qflags)) {
1185 if (curr->oclass == *pack) {
1186 if (ofilter && !(*ofilter)(curr))
1188 if (!collected_type_name) {
1190 any.a_int = curr->oclass;
1192 win, NO_GLYPH, &any, invlet++,
1193 def_oc_syms[(int) objects[curr->otyp].oc_class].sym,
1194 ATR_NONE, let_to_name(*pack, FALSE,
1196 && iflags.menu_head_objsym),
1198 collected_type_name = TRUE;
1203 if (invlet >= 'u') {
1204 impossible("query_category: too many categories");
1209 if (do_unpaid || (qflags & BILLED_TYPES) || do_blessed || do_cursed
1210 || do_uncursed || do_buc_unknown) {
1212 add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED);
1215 /* unpaid items if there are any */
1221 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, "Unpaid items",
1223 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, "
\96¢
\95¥
\82Ì
\82à
\82Ì",
1226 /* billed items: checked by caller, so always include if BILLED_TYPES */
1227 if (qflags & BILLED_TYPES) {
1231 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1233 "Unpaid items already used up", MENU_UNSELECTED);
1235 "
\96¢
\95¥
\82Å
\8eg
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\82à
\82Ì", MENU_UNSELECTED);
1238 /* items with b/u/c/unknown if there are any;
1239 this cluster of menu entries is in alphabetical order,
1240 reversing the usual sequence of 'U' and 'C' in BUCX */
1245 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1247 "Items known to be Blessed", MENU_UNSELECTED);
1249 "
\8fj
\95\9f\82³
\82ê
\82Ä
\82¢
\82é
\82Æ
\82í
\82©
\82Á
\82Ä
\82¢
\82é
\82à
\82Ì", MENU_UNSELECTED);
1255 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1257 "Items known to be Cursed", MENU_UNSELECTED);
1259 "
\8eô
\82í
\82ê
\82Ä
\82¢
\82é
\82Æ
\82í
\82©
\82Á
\82Ä
\82¢
\82é
\82à
\82Ì", MENU_UNSELECTED);
1265 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1267 "Items known to be Uncursed", MENU_UNSELECTED);
1269 "
\8eô
\82í
\82ê
\82Ä
\82¢
\82È
\82¢
\82Æ
\82í
\82©
\82Á
\82Ä
\82¢
\82é
\82à
\82Ì", MENU_UNSELECTED);
1271 if (do_buc_unknown) {
1276 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1277 "Items of unknown Bless/Curse status", MENU_UNSELECTED);
1279 add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1280 "
\8fj
\95\9f\81^
\8eô
\82¢
\82ª
\82í
\82©
\82ç
\82È
\82¢
\82à
\82Ì", MENU_UNSELECTED);
1283 end_menu(win, qstr);
1284 n = select_menu(win, how, pick_list);
1285 destroy_nhwindow(win);
1287 n = 0; /* caller's don't expect -1 */
1292 count_categories(olist, qflags)
1297 boolean counted_category;
1301 pack = flags.inv_order;
1303 counted_category = FALSE;
1304 for (curr = olist; curr; curr = FOLLOW(curr, qflags)) {
1305 if (curr->oclass == *pack) {
1306 if ((qflags & WORN_TYPES)
1307 && !(curr->owornmask & (W_ARMOR | W_ACCESSORY | W_WEAPON)))
1309 if (!counted_category) {
1311 counted_category = TRUE;
1320 /* could we carry `obj'? if not, could we carry some of it/them? */
1322 carry_count(obj, container, count, telekinesis, wt_before, wt_after)
1323 struct obj *obj, *container; /* object to pick up, bag it's coming out of */
1325 boolean telekinesis;
1326 int *wt_before, *wt_after;
1328 boolean adjust_wt = container && carried(container),
1329 is_gold = obj->oclass == COIN_CLASS;
1330 int wt, iw, ow, oow;
1331 long qq, savequan, umoney;
1334 const char *verb, *prefx1, *prefx2, *suffx;
1336 const char *verb, *prefx1;
1338 char obj_nambuf[BUFSZ], where[BUFSZ];
1340 savequan = obj->quan;
1342 umoney = money_cnt(invent);
1343 iw = max_capacity();
1345 if (count != savequan) {
1347 obj->owt = (unsigned) weight(obj);
1349 wt = iw + (int) obj->owt;
1351 wt -= (container->otyp == BAG_OF_HOLDING)
1352 ? (int) DELTA_CWT(container, obj)
1354 /* This will go with silver+copper & new gold weight */
1355 if (is_gold) /* merged gold might affect cumulative weight */
1356 wt -= (GOLD_WT(umoney) + GOLD_WT(count) - GOLD_WT(umoney + count));
1357 if (count != savequan) {
1358 obj->quan = savequan;
1367 /* see how many we can lift */
1369 iw -= (int) GOLD_WT(umoney);
1371 qq = GOLD_CAPACITY((long) iw, umoney);
1374 qq = 50L - (umoney % 100L) - 1L;
1377 for (; qq <= count; qq += 100L) {
1379 obj->owt = (unsigned) GOLD_WT(qq);
1380 ow = (int) GOLD_WT(umoney + qq);
1381 ow -= (container->otyp == BAG_OF_HOLDING)
1382 ? (int) DELTA_CWT(container, obj)
1393 else if (qq > count)
1395 wt = iw + (int) GOLD_WT(umoney + qq);
1396 } else if (count > 1 || count < obj->quan) {
1398 * Ugh. Calc num to lift by changing the quan of of the
1399 * object and calling weight.
1401 * This works for containers only because containers
1402 * don't merge. -dean
1404 for (qq = 1L; qq <= count; qq++) {
1406 obj->owt = (unsigned) (ow = weight(obj));
1408 ow -= (container->otyp == BAG_OF_HOLDING)
1409 ? (int) DELTA_CWT(container, obj)
1417 /* there's only one, and we can't lift it */
1420 obj->quan = savequan;
1424 /* some message will be given */
1425 Strcpy(obj_nambuf, doname(obj));
1428 Sprintf(where, "in %s", the(xname(container)));
1430 Sprintf(where, "%s
\82Ì
\92\86\82É
\93ü
\82Á
\82Ä
\82¢
\82é", the(xname(container)));
1434 verb = "
\89^
\82×
\82È
\82¢";
1437 Strcpy(where, "lying here");
1439 Strcpy(where, "
\82±
\82±
\82É
\92u
\82¢
\82Ä
\82 \82é");
1441 verb = telekinesis ? "acquire" : "lift";
1443 verb = telekinesis ? "
\8al
\93¾
\82Å
\82«
\82È
\82¢" : "
\8e\9d\82¿
\82 \82°
\82ç
\82ê
\82È
\82¢";
1446 /* lint suppression */
1447 *obj_nambuf = *where = '\0';
1450 /* we can carry qq of them */
1454 You("can only %s %s of the %s %s.", verb,
1455 (qq == 1L) ? "one" : "some", obj_nambuf, where);
1457 You("%s%s
\82Ì
\82¤
\82¿
\82Ì%s
\82µ
\82©%s
\81D",
1458 where, obj_nambuf, (qq == 1L) ? "
\88ê
\82Â" : "
\82¢
\82
\82Â
\82©", verb);
1466 Strcpy(where, "here"); /* slightly shorter form */
1468 Strcpy(where, "
\82±
\82±
\82É
\82Í"); /* slightly shorter form */
1470 if (invent || umoney) {
1472 prefx1 = "you cannot ";
1474 suffx = " any more";
1476 prefx1 = "
\82±
\82ê
\88È
\8fã";
1480 prefx1 = (obj->quan == 1L) ? "it " : "even one ";
1481 prefx2 = "is too heavy for you to ";
1484 prefx1 = "
\8fd
\82·
\82¬
\82Ä";
1488 There("%s %s %s, but %s%s%s%s.", otense(obj, "are"), obj_nambuf, where,
1489 prefx1, prefx2, verb, suffx);
1491 pline("%s%s
\82ª
\82 \82é
\81C
\82µ
\82©
\82µ%s%s
\81D",
1492 where, obj_nambuf, prefx1, verb);
1495 /* *wt_after = iw; */
1499 /* determine whether character is able and player is willing to carry `obj' */
1502 lift_object(obj, container, cnt_p, telekinesis)
1503 struct obj *obj, *container; /* object to pick up, bag it's coming out of */
1505 boolean telekinesis;
1507 int result, old_wt, new_wt, prev_encumbr, next_encumbr;
1509 if (obj->otyp == BOULDER && Sokoban) {
1511 You("cannot get your %s around this %s.", body_part(HAND),
1514 You("%s
\82ð%s
\82Å
\8e\9d\82¿
\82 \82°
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D",
1515 xname(obj), body_part(HAND));
1519 /* override weight consideration for loadstone picked up by anybody
1520 and for boulder picked up by hero poly'd into a giant; override
1521 availability of open inventory slot iff not already carrying one */
1522 if (obj->otyp == LOADSTONE
1523 || (obj->otyp == BOULDER && throws_rocks(youmonst.data))) {
1524 if (inv_cnt(FALSE) < 52 || !carrying(obj->otyp)
1525 || merge_choice(invent, obj))
1526 return 1; /* lift regardless of current situation */
1527 /* if we reach here, we're out of slots and already have at least
1528 one of these, so treat this one more like a normal item */
1530 You("are carrying too much stuff to pick up %s %s.",
1531 (obj->quan == 1L) ? "another" : "more", simpleonames(obj));
1533 You("%s
\82ð%s
\8fE
\82¤
\82É
\82Í
\95¨
\82ð
\8e\9d\82¿
\82·
\82¬
\82Ä
\82¢
\82é
\81D",
1534 simpleonames(obj), (obj->quan == 1L) ? "
\82à
\82¤
\88ê
\82Â" : "
\82à
\82Á
\82Æ");
1539 *cnt_p = carry_count(obj, container, *cnt_p, telekinesis,
1542 result = -1; /* nothing lifted */
1543 } else if (obj->oclass != COIN_CLASS
1544 /* [exception for gold coins will have to change
1545 if silver/copper ones ever get implemented] */
1546 && inv_cnt(FALSE) >= 52 && !merge_choice(invent, obj)) {
1548 Your("knapsack cannot accommodate any more items.");
1550 Your("
\83i
\83b
\83v
\83U
\83b
\83N
\82Í
\82±
\82ê
\88È
\8fã
\83A
\83C
\83e
\83\80\82ð
\8bl
\82ß
\8d\9e\82ß
\82È
\82¢
\81D");
1551 result = -1; /* nothing lifted */
1554 prev_encumbr = near_capacity();
1555 if (prev_encumbr < flags.pickup_burden)
1556 prev_encumbr = flags.pickup_burden;
1557 next_encumbr = calc_capacity(new_wt - old_wt);
1558 if (next_encumbr > prev_encumbr) {
1560 result = 0; /* don't lift */
1566 long savequan = obj->quan;
1570 Strcpy(qbuf, (next_encumbr > HVY_ENCUMBER)
1572 : (next_encumbr > MOD_ENCUMBER)
1576 /*JP:
\83A
\83C
\83e
\83\80\96¼
\82Ì
\8cã
\82ë
\82É
\95t
\82¯
\82½
\82¢
\82ªsafe_qbuf
\82Ìqsuffix
\82Í
1577 qbuf
\82Æ
\8b¤
\97p
\82Å
\82«
\82È
\82¢
\82Ì
\82Å
\95Ê
\82Éqsfx
\82ð
\97p
\88Ó
\82µ
\82Ä
\82»
\82¿
\82ç
\82ð
\8eg
\82¤*/
1578 Strcpy(qsfx, (next_encumbr > HVY_ENCUMBER)
1580 : (next_encumbr > MOD_ENCUMBER)
1583 Strcat(qsfx, "
\81D
\91±
\82¯
\82Ü
\82·
\82©
\81H");
1586 #if 0 /*JP*//*
\93ú
\96{
\8cê
\82Å
\82Í
\82Ç
\82¿
\82ç
\82à
\81u
\8e\9d\82Â
\81v
\82Å
\8dÏ
\82Ü
\82¹
\82é*/
1588 (void) strsubst(qbuf, "lifting", "removing");
1592 (void) safe_qbuf(qbuf, qbuf, ". Continue?", obj, doname,
1593 ansimpleoname, something);
1594 #else /*JP:
\91O
\82É
\82Í
\89½
\82à
\95t
\82¯
\82¸
\8cã
\82ë
\82Éqsfx
\82ð
\95t
\82¯
\82é*/
1595 (void) safe_qbuf(qbuf, "", qsfx, obj, doname,
1596 ansimpleoname, "
\82±
\82ê");
1598 obj->quan = savequan;
1599 switch (ynq(qbuf)) {
1607 break; /* 'y' => result == 1 */
1609 clear_nhwindow(WIN_MESSAGE);
1614 if (obj->otyp == SCR_SCARE_MONSTER && result <= 0 && !container)
1620 * Pick up <count> of obj from the ground and add it to the hero's inventory.
1621 * Returns -1 if caller should break out of its loop, 0 if nothing picked
1622 * up, 1 if otherwise.
1625 pickup_object(obj, count, telekinesis)
1628 boolean telekinesis; /* not picking it up directly by hand */
1632 if (obj->quan < count) {
1633 impossible("pickup_object: count %ld > quan %ld?", count, obj->quan);
1637 /* In case of auto-pickup, where we haven't had a chance
1638 to look at it yet; affects docall(SCR_SCARE_MONSTER). */
1642 if (obj == uchain) { /* do not pick up attached chain */
1644 } else if (obj->oartifact && !touch_artifact(obj, &youmonst)) {
1646 } else if (obj->otyp == CORPSE) {
1647 if (fatal_corpse_mistake(obj, telekinesis)
1648 || rider_corpse_revival(obj, telekinesis))
1650 } else if (obj->otyp == SCR_SCARE_MONSTER) {
1653 else if (!obj->spe && !obj->cursed)
1657 pline_The("scroll%s %s to dust as you %s %s up.", plur(obj->quan),
1658 otense(obj, "turn"), telekinesis ? "raise" : "pick",
1659 (obj->quan == 1L) ? "it" : "them");
1661 pline("
\8aª
\95¨
\82Í
\82 \82È
\82½
\82ª%s
\8fã
\82°
\82é
\82Æ
\90o
\82Æ
\82È
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D",
1662 telekinesis ? "
\8e\9d\82¿" : "
\8fE
\82¢");
1664 if (!(objects[SCR_SCARE_MONSTER].oc_name_known)
1665 && !(objects[SCR_SCARE_MONSTER].oc_uname))
1667 useupf(obj, obj->quan);
1668 return 1; /* tried to pick something up and failed, but
1669 don't want to terminate pickup loop yet */
1673 if ((res = lift_object(obj, (struct obj *) 0, &count, telekinesis)) <= 0)
1676 /* Whats left of the special case for gold :-) */
1677 if (obj->oclass == COIN_CLASS)
1679 if (obj->quan != count && obj->otyp != LOADSTONE)
1680 obj = splitobj(obj, count);
1682 obj = pick_obj(obj);
1684 if (uwep && uwep == obj)
1685 mrg_to_wielded = TRUE;
1686 nearload = near_capacity();
1687 prinv(nearload == SLT_ENCUMBER ? moderateloadmsg : (char *) 0, obj,
1689 mrg_to_wielded = FALSE;
1694 * Do the actual work of picking otmp from the floor or monster's interior
1695 * and putting it in the hero's inventory. Take care of billing. Return a
1696 * pointer to the object where otmp ends up. This may be different
1697 * from otmp because of merging.
1704 int ox = otmp->ox, oy = otmp->oy;
1705 boolean robshop = (!u.uswallow && otmp != uball && costly_spot(ox, oy));
1707 obj_extract_self(otmp);
1710 /* for shop items, addinv() needs to be after addtobill() (so that
1711 object merger can take otmp->unpaid into account) but before
1712 remote_robbery() (which calls rob_shop() which calls setpaid()
1713 after moving costs of unpaid items to shop debt; setpaid()
1714 calls clear_unpaid() for lots of object chains, but 'otmp' isn't
1715 on any of those between obj_extract_self() and addinv(); for
1716 3.6.0, 'otmp' remained flagged as an unpaid item in inventory
1717 and triggered impossible() every time inventory was examined) */
1719 char saveushops[5], fakeshop[2];
1721 /* addtobill cares about your location rather than the object's;
1722 usually they'll be the same, but not when using telekinesis
1723 (if ever implemented) or a grappling hook */
1724 Strcpy(saveushops, u.ushops);
1725 fakeshop[0] = *in_rooms(ox, oy, SHOPBASE);
1727 Strcpy(u.ushops, fakeshop);
1728 /* sets obj->unpaid if necessary */
1729 addtobill(otmp, TRUE, FALSE, FALSE);
1730 Strcpy(u.ushops, saveushops);
1731 robshop = otmp->unpaid && !index(u.ushops, *fakeshop);
1734 result = addinv(otmp);
1735 /* if you're taking a shop item from outside the shop, make shk notice */
1737 remote_burglary(ox, oy);
1743 * prints a message if encumbrance changed since the last check and
1744 * returns the new encumbrance value (from near_capacity()).
1749 static int oldcap = UNENCUMBERED;
1750 int newcap = near_capacity();
1752 if (oldcap < newcap) {
1756 Your("movements are slowed slightly because of your load.");
1758 Your("
\93®
\82«
\82Í
\89×
\95¨
\82Ì
\82½
\82ß
\82É
\8f
\82µ
\92x
\82
\82È
\82Á
\82½
\81D");
1762 You("rebalance your load. Movement is difficult.");
1764 You("
\89×
\95¨
\82Ì
\92Þ
\8d\87\82ð
\82Æ
\82è
\92¼
\82µ
\82½
\82ª
\81C
\93®
\82«
\82É
\82
\82¢
\81D");
1768 You("%s under your heavy load. Movement is very hard.",
1769 stagger(youmonst.data, "stagger"));
1771 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");
1776 You("%s move a handspan with this load!",
1777 newcap == 4 ? "can barely" : "can't even");
1779 You("
\82±
\82Ì
\8fd
\82³
\82Å
\82Í
\8f
\82µ
\82à
\93®
\82¯
\82È
\82¢
\81I");
1784 } else if (oldcap > newcap) {
1788 Your("movements are now unencumbered.");
1790 Your("
\93®
\82«
\82Í
\8ay
\82É
\82È
\82Á
\82½
\81D");
1794 Your("movements are only slowed slightly by your load.");
1796 You("
\82¿
\82å
\82Á
\82Æ
\93®
\82«
\82â
\82·
\82
\82È
\82Á
\82½
\81D");
1800 You("rebalance your load. Movement is still difficult.");
1802 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");
1806 You("%s under your load. Movement is still very hard.",
1807 stagger(youmonst.data, "stagger"));
1809 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");
1820 /* Is there a container at x,y. Optional: return count of containers at x,y */
1822 container_at(x, y, countem)
1826 struct obj *cobj, *nobj;
1827 int container_count = 0;
1829 for (cobj = level.objects[x][y]; cobj; cobj = nobj) {
1830 nobj = cobj->nexthere;
1831 if (Is_container(cobj)) {
1837 return container_count;
1841 able_to_loot(x, y, looting)
1843 boolean looting; /* loot vs tip */
1846 const char *verb = looting ? "loot" : "tip";
1848 const char *verb = looting ? "
\8aJ
\82¯
\82é" : "
\82Ð
\82Á
\82
\82è
\95Ô
\82·";
1850 if (!can_reach_floor(TRUE)) {
1851 if (u.usteed && P_SKILL(P_RIDING) < P_BASIC)
1852 rider_cant_reach(); /* not skilled enough to reach */
1854 cant_reach_floor(x, y, FALSE, TRUE);
1856 } else if ((is_pool(x, y) && (looting || !Underwater)) || is_lava(x, y)) {
1857 /* at present, can't loot in water even when Underwater;
1858 can tip underwater, but not when over--or stuck in--lava */
1860 You("cannot %s things that are deep in the %s.", verb,
1861 hliquid(is_lava(x, y) ? "lava" : "water"));
1863 You("%s
\82É
\90[
\82
\82É
\92¾
\82ñ
\82¾
\82à
\82Ì
\82ð%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D",
1864 hliquid(is_lava(u.ux, u.uy) ? "
\97n
\8aâ" : "
\90\85"), verb);
1867 } else if (nolimbs(youmonst.data)) {
1869 pline("Without limbs, you cannot %s anything.", verb);
1871 pline("
\8eè
\91«
\82ª
\82È
\82¢
\82Ì
\82Å
\81C%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", verb);
1873 } else if (looting && !freehand()) {
1875 pline("Without a free %s, you cannot loot anything.",
1877 pline("
\8e©
\97R
\82É
\82È
\82é%s
\82ª
\82È
\82¢
\82Ì
\82Å
\81C
\8aJ
\82¯
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D",
1890 for (i = -1; i <= 1; i++)
1891 for (j = -1; j <= 1; j++) {
1894 if (isok(nx, ny) && MON_AT(nx, ny))
1901 do_loot_cont(cobjp, cindex, ccount)
1903 int cindex, ccount; /* index of this container (1..N), number of them (N) */
1905 struct obj *cobj = *cobjp;
1909 if (cobj->olocked) {
1913 cobj->lknown ? "It is" : "Hmmm, it turns out to be");
1915 pline("%s
\8c®
\82ª
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D",
1916 cobj->lknown ? "" : "
\82Þ
\81[
\82ñ
\81C");
1918 else if (cobj->lknown)
1919 pline("%s is locked.", The(xname(cobj)));
1921 pline("Hmmm, %s turns out to be locked.", the(xname(cobj)));
1927 if (cobj->otyp == BAG_OF_TRICKS) {
1931 You("carefully open %s...", the(xname(cobj)));
1933 You("
\90T
\8fd
\82É%s
\82ð
\8aJ
\82¯
\82½
\81D
\81D
\81D", xname(cobj));
1935 pline("It develops a huge set of teeth and bites you!");
1937 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");
1940 losehp(Maybe_Half_Phys(tmp), "carnivorous bag", KILLED_BY_AN);
1942 losehp(Maybe_Half_Phys(tmp), "
\90H
\93÷
\8a\93\82É
\8a\9a\82Ü
\82ê
\82Ä", KILLED_BY_AN);
1943 makeknown(BAG_OF_TRICKS);
1944 abort_looting = TRUE;
1949 You("%sopen %s...", (!cobj->cknown || !cobj->lknown) ? "carefully " : "",
1951 You("%s%s
\82ð
\8aJ
\82¯
\82½
\81D
\81D
\81D", (!cobj->cknown || !cobj->lknown) ? "
\90T
\8fd
\82É" : "",
1953 return use_container(cobjp, 0, (boolean) (cindex < ccount));
1956 /* loot a container on the floor or loot saddle from mon. */
1960 struct obj *cobj, *nobj;
1961 register int c = -1;
1964 boolean underfoot = TRUE;
1965 #if 0 /*JP*//*not used*/
1966 const char *dont_find_anything = "don't find anything";
1970 int prev_inquiry = 0;
1971 boolean prev_loot = FALSE;
1974 abort_looting = FALSE;
1976 if (check_capacity((char *) 0)) {
1977 /* "Can't do that while carrying so much stuff." */
1980 if (nohands(youmonst.data)) {
1982 You("have no hands!"); /* not `body_part(HAND)' */
1984 pline("
\82 \82È
\82½
\82É
\82Í
\8eè
\82ª
\82È
\82¢
\81I");
1989 if (rn2(6) && reverse_loot())
1993 pline("Being confused, you find nothing to loot.");
1995 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");
1996 return 1; /* costs a turn */
1997 } /* else fallthrough to normal looting */
2002 if (iflags.menu_requested)
2006 if ((num_conts = container_at(cc.x, cc.y, TRUE)) > 0) {
2007 boolean anyfound = FALSE;
2009 if (!able_to_loot(cc.x, cc.y, TRUE))
2012 if (Blind && !uarmg) {
2013 /* if blind and without gloves, attempting to #loot at the
2014 location of a cockatrice corpse is fatal before asking
2015 whether to manipulate any containers */
2016 for (nobj = sobj_at(CORPSE, cc.x, cc.y); nobj;
2017 nobj = nxtobj(nobj, CORPSE, TRUE))
2018 if (will_feel_cockatrice(nobj, FALSE)) {
2019 feel_cockatrice(nobj, FALSE);
2020 /* if life-saved (or poly'd into stone golem),
2021 terminate attempt to loot */
2026 if (num_conts > 1) {
2027 /* use a menu to loot many containers */
2031 menu_item *pick_list = (menu_item *) 0;
2034 win = create_nhwindow(NHW_MENU);
2037 for (cobj = level.objects[cc.x][cc.y]; cobj;
2038 cobj = cobj->nexthere)
2039 if (Is_container(cobj)) {
2041 add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
2042 doname(cobj), MENU_UNSELECTED);
2045 end_menu(win, "Loot which containers?");
2047 end_menu(win, "
\82Ç
\82ê
\82ð
\8aJ
\82¯
\82Ü
\82·
\82©
\81H");
2048 n = select_menu(win, PICK_ANY, &pick_list);
2049 destroy_nhwindow(win);
2052 for (i = 1; i <= n; i++) {
2053 cobj = pick_list[i - 1].item.a_obj;
2054 timepassed |= do_loot_cont(&cobj, i, n);
2055 if (abort_looting) {
2056 /* chest trap or magic bag explosion or <esc> */
2057 free((genericptr_t) pick_list);
2061 free((genericptr_t) pick_list);
2066 for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) {
2067 nobj = cobj->nexthere;
2069 if (Is_container(cobj)) {
2071 c = ynq(safe_qbuf(qbuf, "There is ", " here, loot it?",
2072 cobj, doname, ansimpleoname,
2075 c = ynq(safe_qbuf(qbuf, "
\82±
\82±
\82É
\82Í", "
\82ª
\82 \82é
\81C
\8aJ
\82¯
\82Ü
\82·
\82©
\81H",
2076 cobj, doname, ansimpleoname,
2085 timepassed |= do_loot_cont(&cobj, 1, 1);
2087 /* chest trap or magic bag explosion or <esc> */
2094 } else if (IS_GRAVE(levl[cc.x][cc.y].typ)) {
2096 You("need to dig up the grave to effectively loot it...");
2098 You("
\95æ
\8dr
\82ç
\82µ
\82ð
\82·
\82é
\82É
\82Í
\8c@
\82ç
\82È
\82
\82Ä
\82Í
\81D
\81D
\81D");
2102 * 3.3.1 introduced directional looting for some things.
2105 if (c != 'y' && mon_beside(u.ux, u.uy)) {
2107 if (!get_adjacent_loc("Loot in what direction?",
2109 if (!get_adjacent_loc("
\82Ç
\82Ì
\95û
\8cü
\82ð
\92²
\82×
\82é
\81H",
2111 "Invalid loot location", u.ux, u.uy, &cc))
2113 "
\96³
\8cø
\82È
\95û
\8cü", u.ux, u.uy, &cc))
2115 if (cc.x == u.ux && cc.y == u.uy) {
2117 if (container_at(cc.x, cc.y, FALSE))
2123 You("%s to loot on the %s.", dont_find_anything,
2124 ceiling(cc.x, cc.y));
2126 You("%s
\82ð
\92²
\82×
\82½
\82ª
\89½
\82à
\82Ý
\82Â
\82©
\82ç
\82È
\82©
\82Á
\82½
\81D",
2127 ceiling(cc.x, cc.y));
2132 mtmp = m_at(cc.x, cc.y);
2134 timepassed = loot_mon(mtmp, &prev_inquiry, &prev_loot);
2135 /* always use a turn when choosing a direction is impaired,
2136 even if you've successfully targetted a saddled creature
2137 and then answered "no" to the "remove its saddle?" prompt */
2138 if (Confusion || Stunned)
2141 /* Preserve pre-3.3.1 behaviour for containers.
2142 * Adjust this if-block to allow container looting
2143 * from one square away to change that in the future.
2146 if (container_at(cc.x, cc.y, FALSE)) {
2149 You_cant("loot anything %sthere with %s in the way.",
2150 prev_inquiry ? "else " : "", mon_nam(mtmp));
2152 pline("%s
\82ª
\82¢
\82é
\82Ì
\82Å%s
\94 \82ð
\8aJ
\82¯
\82ç
\82ê
\82È
\82¢
\81D",
2153 mon_nam(mtmp), prev_inquiry ? "
\82Ù
\82©
\82Ì" : "");
2158 You("have to be at a container to loot it.");
2160 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");
2165 You("%s %sthere to loot.", dont_find_anything,
2166 (prev_inquiry || prev_loot) ? "else " : "");
2168 pline("
\82±
\82±
\82É
\82Í%s
\8aJ
\82¯
\82ç
\82ê
\82é
\82à
\82Ì
\82Í
\82È
\82¢
\81D",
2169 (prev_inquiry || prev_loot) ? "
\82Ù
\82©
\82É" : "");
2174 } else if (c != 'y' && c != 'n') {
2176 You("%s %s to loot.", dont_find_anything,
2177 underfoot ? "here" : "there");
2179 pline("%s
\82É
\82Í
\8aJ
\82¯
\82ç
\82ê
\82é
\82à
\82Ì
\82Í
\82È
\82¢
\81D",
2180 underfoot ? "
\82±
\82±" : "
\82»
\82±");
2186 /* called when attempting to #loot while confused */
2190 struct obj *goldob = 0, *coffers, *otmp, boxdummy;
2193 int n, x = u.ux, y = u.uy;
2196 /* n objects: 1/(n+1) chance per object plus 1/(n+1) to fall off end
2198 for (n = inv_cnt(TRUE), otmp = invent; otmp; --n, otmp = otmp->nobj)
2201 prinv("You find old loot:", otmp, 0L);
2203 prinv("
\88È
\91O
\8aJ
\82¯
\82½
\82à
\82Ì:", otmp, 0L);
2209 /* find a money object to mess with */
2210 for (goldob = invent; goldob; goldob = goldob->nobj)
2211 if (goldob->oclass == COIN_CLASS) {
2212 contribution = ((long) rnd(5) * goldob->quan + 4L) / 5L;
2213 if (contribution < goldob->quan)
2214 goldob = splitobj(goldob, contribution);
2220 if (!IS_THRONE(levl[x][y].typ)) {
2222 /* the dropped gold might have fallen to lower level */
2225 pline("Ok, now there is loot here.");
2227 pline("
\83I
\81[
\83P
\81[
\81C
\82±
\82±
\82É
\98d
\98G
\82ð
\92u
\82¢
\82Ä
\82¨
\82±
\82¤
\81D");
2229 /* find original coffers chest if present, otherwise use nearest one
2232 for (coffers = fobj; coffers; coffers = coffers->nobj)
2233 if (coffers->otyp == CHEST) {
2234 if (coffers->spe == 2)
2235 break; /* a throne room chest */
2237 || distu(coffers->ox, coffers->oy)
2238 < distu(otmp->ox, otmp->oy))
2239 otmp = coffers; /* remember closest ordinary chest */
2246 verbalize("Thank you for your contribution to reduce the debt.");
2248 verbalize("
\90Ô
\8e\9a\8d\91\8dÂ
\95Ô
\8dÏ
\82Ì
\82½
\82ß
\82Ì
\8añ
\95t
\82É
\8a´
\8eÓ
\82µ
\82Ü
\82·
\81D");
2250 (void) add_to_container(coffers, goldob);
2251 coffers->owt = weight(coffers);
2252 coffers->cknown = 0;
2253 if (!coffers->olocked) {
2254 boxdummy = zeroobj, boxdummy.otyp = SPE_WIZARD_LOCK;
2255 (void) boxlock(coffers, &boxdummy);
2257 } else if (levl[x][y].looted != T_LOOTED
2258 && (mon = makemon(courtmon(), x, y, NO_MM_FLAGS)) != 0) {
2260 add_to_minv(mon, goldob);
2262 pline("The exchequer accepts your contribution.");
2264 pline("
\8dà
\96±
\8fÈ
\82Í
\82 \82È
\82½
\82Ì
\8añ
\95t
\82ð
\8eó
\82¯
\82Æ
\82Á
\82½
\81D");
2266 levl[x][y].looted = T_LOOTED;
2269 You("drop %s.", doname(goldob));
2271 You("%s
\82ð
\97\8e\82µ
\82½
\81D", doname(goldob));
2278 /* loot_mon() returns amount of time passed.
2281 loot_mon(mtmp, passed_info, prev_loot)
2291 /* 3.3.1 introduced the ability to remove saddle from a steed.
2292 * *passed_info is set to TRUE if a loot query was given.
2293 * *prev_loot is set to TRUE if something was actually acquired in here.
2295 if (mtmp && mtmp != u.usteed && (otmp = which_armor(mtmp, W_SADDLE))) {
2301 Sprintf(qbuf, "Do you want to remove the saddle from %s?",
2302 x_monnam(mtmp, ARTICLE_THE, (char *) 0,
2303 SUPPRESS_SADDLE, FALSE));
2305 Sprintf(qbuf, "%s
\82©
\82ç
\88Æ
\82ð
\82Í
\82¸
\82µ
\82Ü
\82·
\82©
\81H",
2306 x_monnam(mtmp, ARTICLE_THE, (char *) 0,
2307 SUPPRESS_SADDLE, FALSE));
2309 if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y') {
2310 if (nolimbs(youmonst.data)) {
2312 You_cant("do that without limbs."); /* not body_part(HAND) */
2314 You_cant("
\8eè
\82ª
\82È
\82¢
\82Æ
\82Å
\82«
\82È
\82¢
\81D");
2320 You("can't. The saddle seems to be stuck to %s.",
2322 pline("
\88Æ
\82Í%s
\82É
\82
\82Á
\82Â
\82¢
\82Ä
\82¢
\82é
\82æ
\82¤
\82¾
\81D",
2323 x_monnam(mtmp, ARTICLE_THE, (char *) 0,
2324 SUPPRESS_SADDLE, FALSE));
2325 /* the attempt costs you time */
2328 obj_extract_self(otmp);
2329 if ((unwornmask = otmp->owornmask) != 0L) {
2330 mtmp->misc_worn_check &= ~unwornmask;
2331 otmp->owornmask = 0L;
2332 update_mon_intrinsics(mtmp, otmp, FALSE, FALSE);
2335 otmp = hold_another_object(otmp, "You drop %s!", doname(otmp),
2337 otmp = hold_another_object(otmp, "%s
\82ð
\97\8e\82Æ
\82µ
\82½
\81I", doname(otmp),
2339 timepassed = rnd(3);
2342 } else if (c == 'q') {
2346 /* 3.4.0 introduced ability to pick things up from swallower's stomach */
2348 int count = passed_info ? *passed_info : 0;
2350 timepassed = pickup(count);
2356 * Decide whether an object being placed into a magic bag will cause
2357 * it to explode. If the object is a bag itself, check recursively.
2360 mbag_explodes(obj, depthin)
2364 /* these won't cause an explosion when they're empty */
2365 if ((obj->otyp == WAN_CANCELLATION || obj->otyp == BAG_OF_TRICKS)
2369 /* odds: 1/1, 2/2, 3/4, 4/8, 5/16, 6/32, 7/64, 8/128, 9/128, 10/128,... */
2370 if ((Is_mbag(obj) || obj->otyp == WAN_CANCELLATION)
2371 && (rn2(1 << (depthin > 7 ? 7 : depthin)) <= depthin))
2373 else if (Has_contents(obj)) {
2376 for (otmp = obj->cobj; otmp; otmp = otmp->nobj)
2377 if (mbag_explodes(otmp, depthin + 1))
2384 boh_loss(container, held)
2385 struct obj *container;
2388 /* sometimes toss objects if a cursed magic bag */
2389 if (Is_mbag(container) && container->cursed && Has_contents(container)) {
2391 struct obj *curr, *otmp;
2393 for (curr = container->cobj; curr; curr = otmp) {
2396 obj_extract_self(curr);
2397 loss += mbag_item_gone(held, curr);
2405 /* Returns: -1 to stop, 1 item was inserted, 0 item was not inserted. */
2408 register struct obj *obj;
2410 boolean floor_container = !carried(current_container);
2411 boolean was_unpaid = FALSE;
2414 if (!current_container) {
2415 impossible("<in> no current_container?");
2417 } else if (obj == uball || obj == uchain) {
2419 You("must be kidding.");
2421 pline("
\82²
\8fç
\92k
\82ð
\81D");
2423 } else if (obj == current_container) {
2425 pline("That would be an interesting topological exercise.");
2427 pline("
\82»
\82ê
\82Í
\8b»
\96¡
\82ð
\82»
\82»
\82ç
\82ê
\82é
\83g
\83|
\83\8d\83W
\81[
\82Ì
\96â
\91è
\82¾
\81D");
2429 } else if (obj->owornmask & (W_ARMOR | W_ACCESSORY)) {
2431 Norep("You cannot %s %s you are wearing.",
2432 Icebox ? "refrigerate" : "stash", something);
2434 Norep("
\90g
\82É
\82Â
\82¯
\82Ä
\82¢
\82é
\82à
\82Ì
\82ð%s
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D",
2435 Icebox ? "
\97â
\93\80\82·
\82é" : "
\82µ
\82Ü
\82¤");
2438 } else if ((obj->otyp == LOADSTONE) && obj->cursed) {
2441 pline_The("stone%s won't leave your person.", plur(obj->quan));
2443 pline("
\82Ç
\82¤
\82¢
\82¤
\82í
\82¯
\82©
\82»
\82Ì
\90Î
\82ð
\82µ
\82Ü
\82¤
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2445 } else if (obj->otyp == AMULET_OF_YENDOR
2446 || obj->otyp == CANDELABRUM_OF_INVOCATION
2447 || obj->otyp == BELL_OF_OPENING
2448 || obj->otyp == SPE_BOOK_OF_THE_DEAD) {
2449 /* Prohibit Amulets in containers; if you allow it, monsters can't
2450 * steal them. It also becomes a pain to check to see if someone
2451 * has the Amulet. Ditto for the Candelabrum, the Bell and the Book.
2454 pline("%s cannot be confined in such trappings.", The(xname(obj)));
2456 pline("%s
\82Í
\8bl
\82ß
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", The(xname(obj)));
2458 } else if (obj->otyp == LEASH && obj->leashmon != 0) {
2460 pline("%s attached to your pet.", Tobjnam(obj, "are"));
2462 pline("%s
\82Í
\83y
\83b
\83g
\82É
\95t
\82¯
\82ç
\82ê
\82Ä
\82¢
\82é
\81D", xname(obj));
2464 } else if (obj == uwep) {
2469 setuwep((struct obj *) 0);
2470 /* This uwep check is obsolete. It dates to 3.0 and earlier when
2471 * unwielding Firebrand would be fatal in hell if hero had no other
2472 * fire resistance. Life-saving would force it to be re-wielded.
2475 return 0; /* unwielded, died, rewielded */
2476 } else if (obj == uswapwep) {
2477 setuswapwep((struct obj *) 0);
2478 } else if (obj == uquiver) {
2479 setuqwep((struct obj *) 0);
2482 if (fatal_corpse_mistake(obj, FALSE))
2485 /* boxes, boulders, and big statues can't fit into any container */
2486 if (obj->otyp == ICE_BOX || Is_box(obj) || obj->otyp == BOULDER
2487 || (obj->otyp == STATUE && bigmonst(&mons[obj->corpsenm]))) {
2489 * xname() uses a static result array. Save obj's name
2490 * before current_container's name is computed. Don't
2491 * use the result of strcpy() within You() --- the order
2492 * of evaluation of the parameters is undefined.
2494 Strcpy(buf, the(xname(obj)));
2496 You("cannot fit %s into %s.", buf, the(xname(current_container)));
2498 pline("%s
\82ð%s
\82É
\8bl
\82ß
\8d\9e\82Þ
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D", buf, the(xname(current_container)));
2504 if (obj_is_burning(obj)) /* this used to be part of freeinv() */
2505 (void) snuff_lit(obj);
2507 if (floor_container && costly_spot(u.ux, u.uy)) {
2508 /* defer gold until after put-in message */
2509 if (obj->oclass != COIN_CLASS) {
2510 /* sellobj() will take an unpaid item off the shop bill */
2511 was_unpaid = obj->unpaid ? TRUE : FALSE;
2512 /* don't sell when putting the item into your own container,
2513 * but handle billing correctly */
2514 sellobj_state(current_container->no_charge
2515 ? SELL_DONTSELL : SELL_DELIBERATE);
2516 sellobj(obj, u.ux, u.uy);
2517 sellobj_state(SELL_NORMAL);
2520 if (Icebox && !age_is_relative(obj)) {
2521 obj->age = monstermoves - obj->age; /* actual age */
2522 /* stop any corpse timeouts when frozen */
2523 if (obj->otyp == CORPSE && obj->timed) {
2524 long rot_alarm = stop_timer(ROT_CORPSE, obj_to_any(obj));
2526 (void) stop_timer(REVIVE_MON, obj_to_any(obj));
2527 /* mark a non-reviving corpse as such */
2531 } else if (Is_mbag(current_container) && mbag_explodes(obj, 0)) {
2532 /* explicitly mention what item is triggering the explosion */
2534 pline("As you put %s inside, you are blasted by a magical explosion!",
2536 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",
2538 /* did not actually insert obj yet */
2540 addtobill(obj, FALSE, FALSE, TRUE);
2541 obfree(obj, (struct obj *) 0);
2542 delete_contents(current_container);
2543 if (!floor_container)
2544 useup(current_container);
2545 else if (obj_here(current_container, u.ux, u.uy))
2546 useupf(current_container, current_container->quan);
2548 panic("in_container: bag not found.");
2551 losehp(d(6, 6), "magical explosion", KILLED_BY_AN);
2553 losehp(d(6, 6), "
\96\82\96@
\82Ì
\94\9a\94
\82Å", KILLED_BY_AN);
2554 current_container = 0; /* baggone = TRUE; */
2557 if (current_container) {
2558 Strcpy(buf, the(xname(current_container)));
2560 You("put %s into %s.", doname(obj), buf);
2562 You("%s
\82ð%s
\82Ì
\92\86\82É
\82µ
\82Ü
\82Á
\82½
\81D", doname(obj), buf);
2564 /* gold in container always needs to be added to credit */
2565 if (floor_container && obj->oclass == COIN_CLASS)
2566 sellobj(obj, current_container->ox, current_container->oy);
2567 (void) add_to_container(current_container, obj);
2568 current_container->owt = weight(current_container);
2570 /* gold needs this, and freeinv() many lines above may cause
2571 * the encumbrance to disappear from the status, so just always
2572 * update status immediately.
2575 return (current_container ? 1 : -1);
2578 /* askchain() filter used by in_container();
2579 * returns True if the container is intact and 'obj' isn't it, False if
2580 * container is gone (magic bag explosion) or 'obj' is the container itself;
2581 * also used by getobj() when picking a single item to stash
2587 return (current_container && obj != current_container);
2590 /* Returns: -1 to stop, 1 item was removed, 0 item was not removed. */
2593 register struct obj *obj;
2595 register struct obj *otmp;
2596 boolean is_gold = (obj->oclass == COIN_CLASS);
2600 if (!current_container) {
2601 impossible("<out> no current_container?");
2603 } else if (is_gold) {
2604 obj->owt = weight(obj);
2607 if (obj->oartifact && !touch_artifact(obj, &youmonst))
2610 if (fatal_corpse_mistake(obj, FALSE))
2614 if ((res = lift_object(obj, current_container, &count, FALSE)) <= 0)
2617 if (obj->quan != count && obj->otyp != LOADSTONE)
2618 obj = splitobj(obj, count);
2620 /* Remove the object from the list. */
2621 obj_extract_self(obj);
2622 current_container->owt = weight(current_container);
2625 removed_from_icebox(obj);
2627 if (!obj->unpaid && !carried(current_container)
2628 && costly_spot(current_container->ox, current_container->oy)) {
2629 obj->ox = current_container->ox;
2630 obj->oy = current_container->oy;
2631 addtobill(obj, FALSE, FALSE, FALSE);
2634 pick_pick(obj); /* shopkeeper feedback */
2637 loadlev = near_capacity();
2638 prinv(loadlev ? ((loadlev < MOD_ENCUMBER)
2640 ? "You have a little trouble removing"
2642 ? "
\82ð
\89^
\82Ô
\82Ì
\82Í
\8f
\81X
\8d¢
\93ï
\82¾
\81D"
2644 : "You have much trouble removing")
2646 : "
\82ð
\89^
\82Ô
\82Ì
\82Í
\82©
\82È
\82è
\8d¢
\93ï
\82¾
\81D")
2651 bot(); /* update character's gold piece count immediately */
2656 /* taking a corpse out of an ice box needs a couple of adjustments */
2658 removed_from_icebox(obj)
2661 if (!age_is_relative(obj)) {
2662 obj->age = monstermoves - obj->age; /* actual age */
2663 if (obj->otyp == CORPSE)
2664 start_corpse_timeout(obj);
2668 /* an object inside a cursed bag of holding is being destroyed */
2670 mbag_item_gone(held, item)
2679 pline("%s %s vanished!", Doname2(item), otense(item, "have"));
2681 pline("%s
\82Í
\8fÁ
\82¦
\8b\8e\82Á
\82½
\81I", Doname2(item));
2684 You("%s %s disappear!", Blind ? "notice" : "see", doname(item));
2686 You("%s
\82ª
\8c©
\82¦
\82È
\82
\82È
\82é
\82Ì%s
\81D", doname(item), Blind ? "
\82É
\8bC
\82Ã
\82¢
\82½" : "
\82ð
\8c©
\82½");
2689 if (*u.ushops && (shkp = shop_keeper(*u.ushops)) != 0) {
2690 if (held ? (boolean) item->unpaid : costly_spot(u.ux, u.uy))
2691 loss = stolen_value(item, u.ux, u.uy, (boolean) shkp->mpeaceful,
2694 obfree(item, (struct obj *) 0);
2699 observe_quantum_cat(box)
2703 static NEARDATA const char sc[] = "Schroedinger's Cat";
2705 static NEARDATA const char sc[] = "
\83V
\83\85\83\8c\83f
\83B
\83\93\83K
\81[
\82Ì
\94L";
2706 struct obj *deadcat;
2707 struct monst *livecat;
2710 box->spe = 0; /* box->owt will be updated below */
2711 if (get_obj_location(box, &ox, &oy, 0))
2712 box->ox = ox, box->oy = oy; /* in case it's being carried */
2714 /* this isn't really right, since any form of observation
2715 (telepathic or monster/object/food detection) ought to
2716 force the determination of alive vs dead state; but basing
2717 it just on opening the box is much simpler to cope with */
2719 ? makemon(&mons[PM_HOUSECAT], box->ox, box->oy, NO_MINVENT)
2722 livecat->mpeaceful = 1;
2723 set_malign(livecat);
2724 if (!canspotmon(livecat))
2726 You("think %s brushed your %s.", something, body_part(FOOT));
2728 You("%s
\82ª
\82 \82È
\82½
\82Ì%s
\82ð
\82
\82·
\82®
\82Á
\82½
\81D", something, body_part(FOOT));
2731 pline("%s inside the box is still alive!", Monnam(livecat));
2733 pline("
\94 \82Ì
\82È
\82©
\82Ì%s
\82Í
\82Ü
\82¾
\90¶
\82«
\82Ä
\82¢
\82é
\81I", Monnam(livecat));
2734 (void) christen_monst(livecat, sc);
2736 deadcat = mk_named_object(CORPSE, &mons[PM_HOUSECAT],
2737 box->ox, box->oy, sc);
2739 obj_extract_self(deadcat);
2740 (void) add_to_container(box, deadcat);
2743 pline_The("%s inside the box is dead!",
2744 Hallucination ? rndmonnam((char *) 0) : "housecat");
2746 pline_The("
\94 \82Ì
\92\86\82Ì%s
\82Í
\8e\80\82ñ
\82Å
\82¢
\82é
\81I",
2747 Hallucination ? rndmonnam((char *) 0) : "
\94L");
2750 box->owt = weight(box);
2756 /* used by askchain() to check for magic bag explosion */
2759 int FDECL((*fn), (OBJ_P));
2761 /* result is only meaningful while use_container() is executing */
2762 return ((fn == in_container || fn == out_container)
2763 && !current_container);
2767 explain_container_prompt(more_containers)
2768 boolean more_containers;
2770 static const char *const explaintext[] = {
2772 "Container actions:",
2774 " : -- Look: examine contents",
2775 " o -- Out: take things out",
2776 " i -- In: put things in",
2777 " b -- Both: first take things out, then put things in",
2778 " r -- Reversed: put things in, then take things out",
2779 " s -- Stash: put one item in", "",
2780 " n -- Next: loot next selected container",
2781 " q -- Quit: finished",
2782 " ? -- Help: display this text.",
2785 "
\93ü
\82ê
\95¨
\82Ö
\82Ì
\8ds
\93®
\81F",
2787 " : -- Look:
\92\86\90g
\82ð
\92²
\82×
\82é",
2788 " o -- Out:
\95¨
\82ð
\8fo
\82·",
2789 " i -- In:
\95¨
\82ð
\93ü
\82ê
\82é",
2790 " b -- Both:
\82Ü
\82¸
\95¨
\82ð
\8fo
\82µ
\81A
\82»
\82ê
\82©
\82ç
\95¨
\82ð
\93ü
\82ê
\82é",
2791 " r -- Reversed:
\95¨
\82ð
\93ü
\82ê
\81A
\82»
\82ê
\82©
\82ç
\95¨
\82ð
\8fo
\82·",
2792 " s -- Stash:
\95¨
\82ð
\88ê
\82Â
\93ü
\82ê
\82é",
2793 " n -- Next:
\8e\9f\82É
\91I
\82ñ
\82¾
\93ü
\82ê
\95¨
\82ð
\92²
\82×
\82é",
2794 " q -- Quit:
\89½
\82à
\82µ
\82È
\82¢",
2795 " ? -- Help:
\82±
\82ê
\82ð
\95\
\8e¦
\82·
\82é",
2799 const char *const *txtpp;
2802 /* "Do what with <container>? [:oibrsq or ?] (q)" */
2803 if ((win = create_nhwindow(NHW_TEXT)) != WIN_ERR) {
2804 for (txtpp = explaintext; *txtpp; ++txtpp) {
2805 if (!more_containers && !strncmp(*txtpp, " n ", 3))
2807 putstr(win, 0, *txtpp);
2809 display_nhwindow(win, FALSE);
2810 destroy_nhwindow(win);
2817 if (nohands(youmonst.data)) {
2819 You("have no hands!"); /* not `body_part(HAND)' */
2821 pline("
\82 \82È
\82½
\82É
\82Í
\8eè
\82ª
\82È
\82¢
\81I"); /* not `body_part(HAND)' */
2824 } else if (!freehand()) {
2826 You("have no free %s.", body_part(HAND));
2828 You("%s
\82Ì
\8e©
\97R
\82ª
\8cø
\82©
\82È
\82¢
\81D", body_part(HAND));
2834 static const char stashable[] = { ALLOW_COUNT, COIN_CLASS, ALL_CLASSES, 0 };
2837 use_container(objp, held, more_containers)
2840 boolean more_containers; /* True iff #loot multiple and this isn't last one */
2842 struct obj *otmp, *obj = *objp;
2843 boolean quantum_cat, cursed_mbag, loot_out, loot_in, loot_in_first,
2844 stash_one, inokay, outokay, outmaybe;
2845 char c, emptymsg[BUFSZ], qbuf[QBUFSZ], pbuf[QBUFSZ], xbuf[QBUFSZ];
2849 abort_looting = FALSE;
2857 pline("%s locked.", Tobjnam(obj, "are"));
2859 pline("%s
\82Í
\8c®
\82ª
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\81D", xname(obj));
2862 You("must put it down to unlock.");
2864 if (held) pline("
\89º
\82É
\92u
\82©
\82È
\82¢
\82±
\82Æ
\82É
\82Í
\8c®
\82ð
\82Í
\82¸
\82¹
\82È
\82¢
\81D");
2867 } else if (obj->otrapped) {
2870 You("open %s...", the(xname(obj)));
2872 You("%s
\82ð
\8aJ
\82¯
\82½
\81D
\81D
\81D", the(xname(obj)));
2874 (void) chest_trap(obj, HAND, FALSE);
2875 /* even if the trap fails, you've used up this turn */
2876 if (multi >= 0) { /* in case we didn't become paralyzed */
2879 multi_reason = "opening a container";
2881 multi_reason = "
\94 \82ð
\8aJ
\82¯
\82Ä
\82¢
\82é
\8e\9e\82É";
2884 abort_looting = TRUE;
2889 current_container = obj; /* for use by in/out_container */
2891 * From here on out, all early returns go through 'containerdone:'.
2894 /* check for Schroedinger's Cat */
2895 quantum_cat = SchroedingersBox(current_container);
2897 observe_quantum_cat(current_container);
2901 cursed_mbag = Is_mbag(current_container)
2902 && current_container->cursed
2903 && Has_contents(current_container);
2905 && (loss = boh_loss(current_container, held)) != 0) {
2908 You("owe %ld %s for lost merchandise.", loss, currency(loss));
2910 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));
2911 current_container->owt = weight(current_container);
2913 inokay = (invent != 0
2914 && !(invent == current_container && !current_container->nobj));
2915 outokay = Has_contents(current_container);
2916 if (!outokay) /* preformat the empty-container message */
2918 Sprintf(emptymsg, "%s is %sempty.", Ysimple_name2(current_container),
2919 (quantum_cat || cursed_mbag) ? "now " : "");
2921 Sprintf(emptymsg, "%s
\82Í%s
\8bó
\82Á
\82Û
\82¾
\81D", Ysimple_name2(current_container),
2922 (quantum_cat || cursed_mbag) ? "
\8d¡
\82Í" : "");
2926 * What-to-do prompt's list of possible actions:
2927 * always include the look-inside choice (':');
2928 * include the take-out choice ('o') if container
2929 * has anything in it or if player doesn't yet know
2930 * that it's empty (latter can change on subsequent
2931 * iterations if player picks ':' response);
2932 * include the put-in choices ('i','s') if hero
2933 * carries any inventory (including gold);
2934 * include do-both when 'o' is available, even if
2935 * inventory is empty--taking out could alter that;
2936 * include do-both-reversed when 'i' is available,
2937 * even if container is empty--for similar reason;
2938 * include the next container choice ('n') when
2939 * relevant, and make it the default;
2940 * always include the quit choice ('q'), and make
2941 * it the default if there's no next containter;
2942 * include the help choice (" or ?") if `cmdassist'
2943 * run-time option is set;
2944 * (Player can pick any of (o,i,b,r,n,s,?) even when
2945 * they're not listed among the available actions.)
2947 * Do what with <the/your/Shk's container>? [:oibrs nq or ?] (q)
2949 * <The/Your/Shk's container> is empty. Do what with it? [:irs nq or ?]
2951 for (;;) { /* repeats iff '?' or ":' gets chosen */
2952 outmaybe = (outokay || !current_container->cknown);
2955 (void) safe_qbuf(qbuf, (char *) 0, " is empty. Do what with it?",
2956 current_container, Yname2, Ysimple_name2,
2959 (void) safe_qbuf(qbuf, (char *) 0, "
\82Í
\8bó
\82¾
\81D
\82Ç
\82¤
\82·
\82é
\81H",
2960 current_container, Yname2, Ysimple_name2,
2965 (void) safe_qbuf(qbuf, "Do what with ", "?", current_container,
2966 yname, ysimple_name, "it");
2968 (void) safe_qbuf(qbuf, (char *) 0, "
\82ð
\82Ç
\82¤
\82·
\82é
\81H", current_container,
2969 yname, ysimple_name, "
\82±
\82ê");
2971 /* ask player about what to do with this container */
2972 if (flags.menu_style == MENU_PARTIAL
2973 || flags.menu_style == MENU_FULL) {
2974 if (!inokay && !outmaybe) {
2975 /* nothing to take out, nothing to put in;
2976 trying to do both will yield proper feedback */
2979 c = in_or_out_menu(qbuf, current_container, outmaybe, inokay,
2980 (boolean) (used != 0), more_containers);
2982 } else { /* TRADITIONAL or COMBINATION */
2983 xbuf[0] = '\0'; /* list of extra acceptable responses */
2984 Strcpy(pbuf, ":"); /* look inside */
2985 Strcat(outmaybe ? pbuf : xbuf, "o"); /* take out */
2986 Strcat(inokay ? pbuf : xbuf, "i"); /* put in */
2987 Strcat(outmaybe ? pbuf : xbuf, "b"); /* both */
2988 Strcat(inokay ? pbuf : xbuf, "rs"); /* reversed, stash */
2989 Strcat(pbuf, " "); /* separator */
2990 Strcat(more_containers ? pbuf : xbuf, "n"); /* next container */
2991 Strcat(pbuf, "q"); /* quit */
2992 if (iflags.cmdassist)
2993 /* this unintentionally allows user to answer with 'o' or
2994 'r'; fortunately, those are already valid choices here */
2995 Strcat(pbuf, " or ?"); /* help */
2999 Strcat(strcat(pbuf, "\033"), xbuf);
3000 c = yn_function(qbuf, pbuf, more_containers ? 'n' : 'q');
3001 } /* PARTIAL|FULL vs other modes */
3004 explain_container_prompt(more_containers);
3005 } else if (c == ':') { /* note: will set obj->cknown */
3006 if (!current_container->cknown)
3007 used = 1; /* gaining info */
3008 container_contents(current_container, FALSE, FALSE, TRUE);
3011 } /* loop until something other than '?' or ':' is picked */
3014 abort_looting = TRUE;
3015 if (c == 'n' || c == 'q') /* [not strictly needed; falling thru works] */
3017 loot_out = (c == 'o' || c == 'b' || c == 'r');
3018 loot_in = (c == 'i' || c == 'b' || c == 'r');
3019 loot_in_first = (c == 'r'); /* both, reversed */
3020 stash_one = (c == 's');
3022 /* out-only or out before in */
3023 if (loot_out && !loot_in_first) {
3024 if (!Has_contents(current_container)) {
3025 pline1(emptymsg); /* <whatever> is empty. */
3026 if (!current_container->cknown)
3028 current_container->cknown = 1;
3030 add_valid_menu_class(0); /* reset */
3031 if (flags.menu_style == MENU_TRADITIONAL)
3032 used |= traditional_loot(FALSE);
3034 used |= (menu_loot(0, FALSE) > 0);
3035 add_valid_menu_class(0);
3039 if ((loot_in || stash_one)
3040 && (!invent || (invent == current_container && !invent->nobj))) {
3042 You("don't have anything%s to %s.", invent ? " else" : "",
3043 stash_one ? "stash" : "put in");
3045 You("%s
\93ü
\82ê
\82é
\82à
\82Ì
\82ª
\82È
\82¢
\81D", invent ? "
\91¼
\82É" : "");
3047 loot_in = stash_one = FALSE;
3051 * Gone: being nice about only selecting food if we know we are
3052 * putting things in an ice chest.
3055 add_valid_menu_class(0); /* reset */
3056 if (flags.menu_style == MENU_TRADITIONAL)
3057 used |= traditional_loot(TRUE);
3059 used |= (menu_loot(0, TRUE) > 0);
3060 add_valid_menu_class(0);
3061 } else if (stash_one) {
3062 /* put one item into container */
3063 if ((otmp = getobj(stashable, "stash")) != 0) {
3064 if (in_container(otmp)) {
3067 /* couldn't put selected item into container for some
3068 reason; might need to undo splitobj() */
3069 (void) unsplitobj(otmp);
3073 /* putting something in might have triggered magic bag explosion */
3074 if (!current_container)
3078 if (loot_out && loot_in_first) {
3079 if (!Has_contents(current_container)) {
3080 pline1(emptymsg); /* <whatever> is empty. */
3081 if (!current_container->cknown)
3083 current_container->cknown = 1;
3085 add_valid_menu_class(0); /* reset */
3086 if (flags.menu_style == MENU_TRADITIONAL)
3087 used |= traditional_loot(FALSE);
3089 used |= (menu_loot(0, FALSE) > 0);
3090 add_valid_menu_class(0);
3096 /* Not completely correct; if we put something in without knowing
3097 whatever was already inside, now we suddenly do. That can't
3098 be helped unless we want to track things item by item and then
3099 deal with containers whose contents are "partly known". */
3100 if (current_container)
3101 current_container->cknown = 1;
3105 *objp = current_container; /* might have become null */
3106 if (current_container)
3107 current_container = 0; /* avoid hanging on to stale pointer */
3109 abort_looting = TRUE;
3113 /* loot current_container (take things out or put things in), by prompting */
3115 traditional_loot(put_in)
3118 int FDECL((*actionfunc), (OBJ_P)), FDECL((*checkfunc), (OBJ_P));
3119 struct obj **objlist;
3120 char selection[MAXOCLASSES + 10]; /* +10: room for B,U,C,X plus slop */
3122 boolean one_by_one, allflag;
3123 int used = 0, menu_on_request = 0;
3129 action = "
\93ü
\82ê
\82é";
3131 actionfunc = in_container;
3135 action = "take out";
3137 action = "
\8eæ
\82è
\8fo
\82·";
3138 objlist = &(current_container->cobj);
3139 actionfunc = out_container;
3140 checkfunc = (int FDECL((*), (OBJ_P))) 0;
3143 if (query_classes(selection, &one_by_one, &allflag, action, *objlist,
3144 FALSE, &menu_on_request)) {
3145 if (askchain(objlist, (one_by_one ? (char *) 0 : selection), allflag,
3146 actionfunc, checkfunc, 0, action))
3148 } else if (menu_on_request < 0) {
3149 used = (menu_loot(menu_on_request, put_in) > 0);
3154 /* loot current_container (take things out or put things in), using a menu */
3156 menu_loot(retry, put_in)
3160 int n, i, n_looted = 0;
3161 boolean all_categories = TRUE, loot_everything = FALSE;
3164 const char *action = put_in ? "Put in" : "Take out";
3166 const char *action = put_in ? "
\93ü
\82ê
\82é" : "
\8eæ
\82è
\8fo
\82·";
3167 struct obj *otmp, *otmp2;
3168 menu_item *pick_list;
3173 all_categories = (retry == -2);
3174 } else if (flags.menu_style == MENU_FULL) {
3175 all_categories = FALSE;
3177 Sprintf(buf, "%s what type of objects?", action);
3179 Sprintf(buf, "
\82Ç
\82Ì
\8eí
\97Þ
\82Ì
\82à
\82Ì
\82ð%s
\81H", action);
3180 mflags = (ALL_TYPES | UNPAID_TYPES | BUCX_TYPES);
3182 mflags |= CHOOSE_ALL;
3183 n = query_category(buf, put_in ? invent : current_container->cobj,
3184 mflags, &pick_list, PICK_ANY);
3187 for (i = 0; i < n; i++) {
3188 if (pick_list[i].item.a_int == 'A')
3189 loot_everything = TRUE;
3190 else if (pick_list[i].item.a_int == ALL_TYPES_SELECTED)
3191 all_categories = TRUE;
3193 add_valid_menu_class(pick_list[i].item.a_int);
3195 free((genericptr_t) pick_list);
3198 if (loot_everything) {
3199 current_container->cknown = 1;
3200 for (otmp = current_container->cobj; otmp; otmp = otmp2) {
3202 res = out_container(otmp);
3207 mflags = INVORDER_SORT;
3208 if (put_in && flags.invlet_constant)
3209 mflags |= USE_INVLET;
3211 current_container->cknown = 1;
3213 Sprintf(buf, "%s what?", action);
3215 Sprintf(buf, "
\89½
\82ð%s
\81H", action);
3216 n = query_objlist(buf, put_in ? &invent : &(current_container->cobj),
3217 mflags, &pick_list, PICK_ANY,
3218 all_categories ? allow_all : allow_category);
3221 for (i = 0; i < n; i++) {
3222 otmp = pick_list[i].item.a_obj;
3223 count = pick_list[i].count;
3224 if (count > 0 && count < otmp->quan) {
3225 otmp = splitobj(otmp, count);
3226 /* special split case also handled by askchain() */
3228 res = put_in ? in_container(otmp) : out_container(otmp);
3230 if (!current_container) {
3231 /* otmp caused current_container to explode;
3232 both are now gone */
3233 otmp = 0; /* and break loop */
3234 } else if (otmp && otmp != pick_list[i].item.a_obj) {
3235 /* split occurred, merge again */
3236 (void) merged(&pick_list[i].item.a_obj, &otmp);
3241 free((genericptr_t) pick_list);
3248 in_or_out_menu(prompt, obj, outokay, inokay, alreadyused, more_containers)
3251 boolean outokay, inokay, alreadyused, more_containers;
3253 /* underscore is not a choice; it's used to skip element [0] */
3254 static const char lootchars[] = "_:oibrsnq", abc_chars[] = "_:abcdenq";
3257 menu_item *pick_list;
3260 const char *menuselector = flags.lootabc ? abc_chars : lootchars;
3263 win = create_nhwindow(NHW_MENU);
3266 any.a_int = 1; /* ':' */
3268 Sprintf(buf, "Look inside %s", thesimpleoname(obj));
3270 Sprintf(buf, "%s
\82Ì
\92\86\90g
\82ð
\8c©
\82é", thesimpleoname(obj));
3271 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE, buf,
3274 any.a_int = 2; /* 'o' */
3276 Sprintf(buf, "take %s out", something);
3278 Strcpy(buf, "
\89½
\82©
\82ð
\8eæ
\82è
\8fo
\82·");
3279 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3280 buf, MENU_UNSELECTED);
3283 any.a_int = 3; /* 'i' */
3285 Sprintf(buf, "put %s in", something);
3287 Strcpy(buf, "
\89½
\82©
\82ð
\93ü
\82ê
\82é");
3288 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3289 buf, MENU_UNSELECTED);
3292 any.a_int = 4; /* 'b' */
3294 Sprintf(buf, "%stake out, then put in", inokay ? "both; " : "");
3296 Sprintf(buf, "%s
\82Ü
\82¸
\8eæ
\82è
\8fo
\82·
\81C
\82»
\82ê
\82©
\82ç
\93ü
\82ê
\82é", inokay ? "
\97¼
\95û; " : "");
3297 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3298 buf, MENU_UNSELECTED);
3301 any.a_int = 5; /* 'r' */
3303 Sprintf(buf, "%sput in, then take out",
3304 outokay ? "both reversed; " : "");
3306 Sprintf(buf, "%s
\82Ü
\82¸
\93ü
\82ê
\82é
\81C
\82»
\82ê
\82©
\82ç
\8eæ
\82è
\8fo
\82·",
3307 outokay ? "
\97¼
\95û
\82ð
\8bt
\8f\87\82Å; " : "");
3309 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3310 buf, MENU_UNSELECTED);
3311 any.a_int = 6; /* 's' */
3313 Sprintf(buf, "stash one item into %s", thesimpleoname(obj));
3315 Sprintf(buf, "
\82à
\82Ì
\82ð
\88ê
\82Â
\82¾
\82¯%s
\82É
\93ü
\82ê
\82é", thesimpleoname(obj));
3316 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3317 buf, MENU_UNSELECTED);
3320 add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED);
3321 if (more_containers) {
3322 any.a_int = 7; /* 'n' */
3323 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3324 "loot next container", MENU_SELECTED);
3326 any.a_int = 8; /* 'q' */
3328 Strcpy(buf, alreadyused ? "done" : "do nothing");
3330 Strcpy(buf, alreadyused ? "
\8fI
\82í
\82é" : "
\89½
\82à
\82µ
\82È
\82¢");
3331 add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE, buf,
3332 more_containers ? MENU_UNSELECTED : MENU_SELECTED);
3334 end_menu(win, prompt);
3335 n = select_menu(win, PICK_ONE, &pick_list);
3336 destroy_nhwindow(win);
3338 int k = pick_list[0].item.a_int;
3340 if (n > 1 && k == (more_containers ? 7 : 8))
3341 k = pick_list[1].item.a_int;
3342 free((genericptr_t) pick_list);
3343 return lootchars[k]; /* :,o,i,b,r,s,n,q */
3345 return (n == 0 && more_containers) ? 'n' : 'q'; /* next or quit */
3348 static const char tippables[] = { ALL_CLASSES, TOOL_CLASS, 0 };
3350 /* #tip command -- empty container contents onto floor */
3354 struct obj *cobj, *nobj;
3357 char c, buf[BUFSZ], qbuf[BUFSZ];
3358 const char *spillage = 0;
3361 * doesn't require free hands;
3362 * limbs are needed to tip floor containers
3365 /* at present, can only tip things at current spot, not adjacent ones */
3366 cc.x = u.ux, cc.y = u.uy;
3368 /* check floor container(s) first; at most one will be accessed */
3369 if ((boxes = container_at(cc.x, cc.y, TRUE)) > 0) {
3371 Sprintf(buf, "You can't tip %s while carrying so much.",
3372 !flags.verbose ? "a container" : (boxes > 1) ? "one" : "it");
3374 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");
3376 if (!check_capacity(buf) && able_to_loot(cc.x, cc.y, FALSE)) {
3377 if (boxes > 1 && (flags.menu_style != MENU_TRADITIONAL
3378 || iflags.menu_requested)) {
3379 /* use menu to pick a container to tip */
3383 menu_item *pick_list = (menu_item *) 0;
3384 struct obj dummyobj, *otmp;
3387 win = create_nhwindow(NHW_MENU);
3390 for (cobj = level.objects[cc.x][cc.y], i = 0; cobj;
3391 cobj = cobj->nexthere)
3392 if (Is_container(cobj)) {
3395 add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
3396 doname(cobj), MENU_UNSELECTED);
3400 add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
3401 "", MENU_UNSELECTED);
3402 any.a_obj = &dummyobj;
3403 /* use 'i' for inventory unless there are so many
3404 containers that it's already being used */
3405 i = (i <= 'i' - 'a' && !flags.lootabc) ? 'i' : 0;
3406 add_menu(win, NO_GLYPH, &any, i, 0, ATR_NONE,
3407 "tip something being carried", MENU_SELECTED);
3409 end_menu(win, "Tip which container?");
3410 n = select_menu(win, PICK_ONE, &pick_list);
3411 destroy_nhwindow(win);
3413 * Deal with quirk of preselected item in pick-one menu:
3414 * n == 0 => picked preselected entry, toggling it off;
3415 * n == 1 => accepted preselected choice via SPACE or RETURN;
3416 * n == 2 => picked something other than preselected entry;
3417 * n == -1 => cancelled via ESC;
3419 otmp = (n <= 0) ? (struct obj *) 0 : pick_list[0].item.a_obj;
3420 if (n > 1 && otmp == &dummyobj)
3421 otmp = pick_list[1].item.a_obj;
3423 free((genericptr_t) pick_list);
3424 if (otmp && otmp != &dummyobj) {
3430 /* else pick-from-invent below */
3432 for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) {
3433 nobj = cobj->nexthere;
3434 if (!Is_container(cobj))
3437 c = ynq(safe_qbuf(qbuf, "There is ", " here, tip it?",
3439 doname, ansimpleoname, "container"));
3441 c = ynq(safe_qbuf(qbuf, "
\82±
\82±
\82É
\82Í", "
\82ª
\82 \82é
\81C
\82Ð
\82Á
\82
\82è
\95Ô
\82·?",
3443 doname, ansimpleoname, "
\93ü
\82ê
\95¨"));
3450 /* can only tip one container at a time */
3457 /* either no floor container(s) or couldn't tip one or didn't tip any */
3458 cobj = getobj(tippables, "tip");
3463 if (Is_container(cobj) || cobj->otyp == HORN_OF_PLENTY) {
3467 /* assorted other cases */
3468 if (Is_candle(cobj) && cobj->lamplit) {
3469 /* note "wax" even for tallow candles to avoid giving away info */
3473 spillage = "
\82ë
\82¤";
3474 } else if ((cobj->otyp == POT_OIL && cobj->lamplit)
3475 || (cobj->otyp == OIL_LAMP && cobj->age != 0L)
3476 || (cobj->otyp == MAGIC_LAMP && cobj->spe != 0)) {
3481 /* todo: reduce potion's remaining burn timer or oil lamp's fuel */
3482 } else if (cobj->otyp == CAN_OF_GREASE && cobj->spe > 0) {
3483 /* charged consumed below */
3485 spillage = "grease";
3487 spillage = "
\8e\89";
3488 } else if (cobj->otyp == FOOD_RATION || cobj->otyp == CRAM_RATION
3489 || cobj->otyp == LEMBAS_WAFER) {
3491 spillage = "crumbs";
3493 spillage = "
\83p
\83\93\82
\82¸";
3494 } else if (cobj->oclass == VENOM_CLASS) {
3498 spillage = "
\93Å
\89t";
3502 if (is_pool(u.ux, u.uy))
3504 Sprintf(buf, " and gradually %s", vtense(spillage, "dissipate"));
3506 Strcpy(buf, "
\82»
\82µ
\82Ä
\8f\99\81X
\82É
\8eU
\82Á
\82Ä
\82¢
\82Á
\82½
\81D");
3507 else if (is_lava(u.ux, u.uy))
3509 Sprintf(buf, " and immediately %s away",
3510 vtense(spillage, "burn"));
3512 Strcpy(buf, "
\82»
\82µ
\82Ä
\82·
\82®
\82É
\94R
\82¦
\82Â
\82«
\82½
\81D");
3515 pline("Some %s %s onto the %s%s.", spillage,
3516 vtense(spillage, "spill"), surface(u.ux, u.uy), buf);
3518 pline("%s
\82ª%s
\82Ì
\8fã
\82É
\94ò
\82Ñ
\8eU
\82Á
\82½
\81D%s", spillage,
3519 surface(u.ux, u.uy), buf);
3521 /* shop usage message comes after the spill message */
3522 if (cobj->otyp == CAN_OF_GREASE && cobj->spe > 0) {
3523 consume_obj_charge(cobj, TRUE);
3525 /* something [useless] happened */
3528 /* anything not covered yet */
3529 if (cobj->oclass == POTION_CLASS) /* can't pour potions... */
3531 pline_The("%s %s securely sealed.", xname(cobj), otense(cobj, "are"));
3533 pline_The("%s
\82Í
\82µ
\82Á
\82©
\82è
\82Æ
\90ð
\82ª
\82³
\82ê
\82Ä
\82¢
\82é
\81D", xname(cobj));
3534 else if (cobj->otyp == STATUE)
3536 pline("Nothing interesting happens.");
3538 pline("
\96Ê
\94\92\82¢
\82±
\82Æ
\82Í
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\81D");
3540 pline1(nothing_happens);
3546 struct obj *box; /* or bag */
3548 xchar ox = u.ux, oy = u.uy; /* #tip only works at hero's location */
3549 boolean empty_it = FALSE, maybeshopgoods;
3551 /* box is either held or on floor at hero's spot; no need to check for
3552 nesting; when held, we need to update its location to match hero's;
3553 for floor, the coordinate updating is redundant */
3554 if (get_obj_location(box, &ox, &oy, 0))
3555 box->ox = ox, box->oy = oy;
3557 /* Shop handling: can't rely on the container's own unpaid
3558 or no_charge status because contents might differ with it.
3559 A carried container's contents will be flagged as unpaid
3560 or not, as appropriate, and need no special handling here.
3561 Items owned by the hero get sold to the shop without
3562 confirmation as with other uncontrolled drops. A floor
3563 container's contents will be marked no_charge if owned by
3564 hero, otherwise they're owned by the shop. By passing
3565 the contents through shop billing, they end up getting
3566 treated the same as in the carried case. We do so one
3567 item at a time instead of doing whole container at once
3568 to reduce the chance of exhausting shk's billing capacity. */
3569 maybeshopgoods = !carried(box) && costly_spot(box->ox, box->oy);
3571 /* caveat: this assumes that cknown, lknown, olocked, and otrapped
3572 fields haven't been overloaded to mean something special for the
3573 non-standard "container" horn of plenty */
3577 pline("It's locked.");
3579 pline("
\8c®
\82ª
\8a|
\82©
\82Á
\82Ä
\82¢
\82é
\81D");
3580 } else if (box->otrapped) {
3581 /* we're not reaching inside but we're still handling it... */
3582 (void) chest_trap(box, HAND, FALSE);
3583 /* even if the trap fails, you've used up this turn */
3584 if (multi >= 0) { /* in case we didn't become paralyzed */
3587 multi_reason = "tipping a container";
3589 multi_reason = "
\94 \82ð
\82Ð
\82Á
\82
\82è
\95Ô
\82µ
\82Ä
\82¢
\82é
\8e\9e\82É";
3592 } else if (box->otyp == BAG_OF_TRICKS || box->otyp == HORN_OF_PLENTY) {
3593 boolean bag = box->otyp == BAG_OF_TRICKS;
3594 int old_spe = box->spe, seen = 0;
3596 if (maybeshopgoods && !box->no_charge)
3597 addtobill(box, FALSE, FALSE, TRUE);
3598 /* apply this bag/horn until empty or monster/object creation fails
3599 (if the latter occurs, force the former...) */
3601 if (!(bag ? bagotricks(box, TRUE, &seen)
3602 : hornoplenty(box, TRUE)))
3604 } while (box->spe > 0);
3606 if (box->spe < old_spe) {
3609 pline((seen == 0) ? "Nothing seems to happen."
3610 : (seen == 1) ? "A monster appears."
3611 : "Monsters appear!");
3613 pline((seen == 0) ? "
\89½
\82à
\8bN
\82«
\82È
\82©
\82Á
\82½
\82æ
\82¤
\82¾
\81D"
3614 : (seen == 1) ? "
\89ö
\95¨
\82ª
\8c»
\82ê
\82½
\81D"
3615 : "
\89ö
\95¨
\82ª
\8c»
\82ê
\82½
\81I");
3617 /* check_unpaid wants to see a non-zero charge count */
3619 check_unpaid_usage(box, TRUE);
3620 box->spe = 0; /* empty */
3623 if (maybeshopgoods && !box->no_charge)
3624 subfrombill(box, shop_keeper(*in_rooms(ox, oy, SHOPBASE)));
3625 } else if (SchroedingersBox(box)) {
3626 char yourbuf[BUFSZ];
3628 observe_quantum_cat(box);
3629 if (!Has_contents(box)) /* evidently a live cat came out */
3630 /* container type of "large box" is inferred */
3632 pline("%sbox is now empty.", Shk_Your(yourbuf, box));
3634 pline("%s
\94 \82Í
\8bó
\82É
\82È
\82Á
\82½
\81D", Shk_Your(yourbuf, box));
3635 else /* holds cat corpse */
3638 } else if (!Has_contents(box)) {
3641 pline("It's empty.");
3643 pline("
\82±
\82ê
\82Í
\8bó
\82¾
\81D");
3649 struct obj *otmp, *nobj;
3650 boolean terse, highdrop = !can_reach_floor(TRUE),
3651 altarizing = IS_ALTAR(levl[ox][oy].typ),
3652 cursed_mbag = (Is_mbag(box) && box->cursed);
3653 int held = carried(box);
3657 highdrop = altarizing = FALSE;
3658 terse = !(highdrop || altarizing || costly_spot(box->ox, box->oy));
3660 /* Terse formatting is
3661 * "Objects spill out: obj1, obj2, obj3, ..., objN."
3662 * If any other messages intervene between objects, we revert to
3663 * "ObjK drops to the floor.", "ObjL drops to the floor.", &c.
3667 box->cobj->nobj ? "Objects spill" : "An object spills",
3670 pline("
\92\86\90g
\82ª
\8fo
\82Ä
\82«
\82½%s",
3671 !(highdrop || altarizing) ? "
\81F" : "
\81D");
3673 for (otmp = box->cobj; otmp; otmp = nobj) {
3675 obj_extract_self(otmp);
3676 otmp->ox = box->ox, otmp->oy = box->oy;
3678 if (box->otyp == ICE_BOX) {
3679 removed_from_icebox(otmp); /* resume rotting for corpse */
3680 } else if (cursed_mbag && !rn2(13)) {
3681 loss += mbag_item_gone(held, otmp);
3682 /* abbreviated drop format is no longer appropriate */
3687 if (maybeshopgoods) {
3688 addtobill(otmp, FALSE, FALSE, TRUE);
3689 iflags.suppress_price++; /* doname formatting */
3693 /* might break or fall down stairs; handles altars itself */
3698 } else if (!terse) {
3700 pline("%s %s to the %s.", Doname2(otmp),
3701 otense(otmp, "drop"), surface(ox, oy));
3703 pline("%s
\82Í%s
\82Ì
\8fã
\82É
\97\8e\82¿
\82½
\81D", Doname2(otmp),
3708 pline("%s%c", doname(otmp), nobj ? ',' : '.');
3710 pline("%s%s", doname(otmp), nobj ? "
\81C" : "
\81D");
3711 iflags.last_msg = PLNMSG_OBJNAM_ONLY;
3714 if (iflags.last_msg != PLNMSG_OBJNAM_ONLY)
3715 terse = FALSE; /* terse formatting has been interrupted */
3718 iflags.suppress_price--; /* reset */
3720 if (loss) /* magic bag lost some shop goods */
3722 You("owe %ld %s for lost merchandise.", loss, currency(loss));
3724 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));
3725 box->owt = weight(box); /* mbag_item_gone() doesn't update this */
3727 (void) encumber_msg();