OSDN Git Service

fix #39767
[jnethack/source.git] / src / pickup.c
1 /* NetHack 3.6  pickup.c        $NHDT-Date: 1545785547 2018/12/26 00:52:27 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.222 $ */
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. */
5
6 /* JNetHack Copyright */
7 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000  */
8 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2019            */
9 /* JNetHack may be freely redistributed.  See license for details. */
10
11 /*
12  *      Contains code for picking objects up, and container use.
13  */
14
15 #include "hack.h"
16
17 #define CONTAINED_SYM '>' /* from invent.c */
18
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 *,
22                                          BOOLEAN_P, int *));
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 *));
27 #if 0 /* not used */
28 STATIC_DCL boolean FDECL(allow_cat_no_uchain, (struct obj *));
29 #endif
30 STATIC_DCL int FDECL(autopick, (struct obj *, int, menu_item **));
31 STATIC_DCL int FDECL(count_categories, (struct obj *, int));
32 STATIC_DCL int FDECL(delta_cwt, (struct obj *, struct obj *));
33 STATIC_DCL long FDECL(carry_count, (struct obj *, struct obj *, long,
34                                     BOOLEAN_P, int *, int *));
35 STATIC_DCL int FDECL(lift_object, (struct obj *, struct obj *, long *,
36                                    BOOLEAN_P));
37 STATIC_DCL boolean FDECL(mbag_explodes, (struct obj *, int));
38 STATIC_DCL long FDECL(boh_loss, (struct obj *container, int));
39 STATIC_PTR int FDECL(in_container, (struct obj *));
40 STATIC_PTR int FDECL(out_container, (struct obj *));
41 STATIC_DCL void FDECL(removed_from_icebox, (struct obj *));
42 STATIC_DCL long FDECL(mbag_item_gone, (int, struct obj *));
43 STATIC_DCL void FDECL(explain_container_prompt, (BOOLEAN_P));
44 STATIC_DCL int FDECL(traditional_loot, (BOOLEAN_P));
45 STATIC_DCL int FDECL(menu_loot, (int, BOOLEAN_P));
46 STATIC_DCL char FDECL(in_or_out_menu, (const char *, struct obj *, BOOLEAN_P,
47                                        BOOLEAN_P, BOOLEAN_P, BOOLEAN_P));
48 STATIC_DCL boolean FDECL(able_to_loot, (int, int, BOOLEAN_P));
49 STATIC_DCL boolean NDECL(reverse_loot);
50 STATIC_DCL boolean FDECL(mon_beside, (int, int));
51 STATIC_DCL int FDECL(do_loot_cont, (struct obj **, int, int));
52 STATIC_DCL void FDECL(tipcontainer, (struct obj *));
53
54 /* define for query_objlist() and autopickup() */
55 #define FOLLOW(curr, flags) \
56     (((flags) & BY_NEXTHERE) ? (curr)->nexthere : (curr)->nobj)
57
58 #define GOLD_WT(n) (((n) + 50L) / 100L)
59 /* if you can figure this out, give yourself a hearty pat on the back... */
60 #define GOLD_CAPACITY(w, n) (((w) * -100L) - ((n) + 50L) - 1L)
61
62 /* A variable set in use_container(), to be used by the callback routines
63    in_container() and out_container() from askchain() and use_container().
64    Also used by menu_loot() and container_gone(). */
65 static NEARDATA struct obj *current_container;
66 static NEARDATA boolean abort_looting;
67 #define Icebox (current_container->otyp == ICE_BOX)
68
69 static const char
70 /*JP
71         moderateloadmsg[] = "You have a little trouble lifting",
72 */
73         moderateloadmsg[] = "\82ð\8e\9d\82Á\82½\82ç\8f­\82µ\82Ó\82ç\82Â\82¢\82½",
74 /*JP
75         nearloadmsg[] = "You have much trouble lifting",
76 */
77         nearloadmsg[] = "\82Í\82¸\82Á\82µ\82è\82Æ\8c¨\82É\82Ì\82µ\82©\82©\82Á\82½",
78 /*JP
79         overloadmsg[] = "You have extreme difficulty lifting";
80 */
81         overloadmsg[] = "\82ð\8e\9d\82¿\82 \82°\82é\82Ì\82Í\82Æ\82Ä\82à\82Â\82ç\82¢";
82
83 /* BUG: this lets you look at cockatrice corpses while blind without
84    touching them */
85 /* much simpler version of the look-here code; used by query_classes() */
86 STATIC_OVL void
87 simple_look(otmp, here)
88 struct obj *otmp; /* list of objects */
89 boolean here;     /* flag for type of obj list linkage */
90 {
91     /* Neither of the first two cases is expected to happen, since
92      * we're only called after multiple classes of objects have been
93      * detected, hence multiple objects must be present.
94      */
95     if (!otmp) {
96         impossible("simple_look(null)");
97     } else if (!(here ? otmp->nexthere : otmp->nobj)) {
98         pline1(doname(otmp));
99     } else {
100         winid tmpwin = create_nhwindow(NHW_MENU);
101
102         putstr(tmpwin, 0, "");
103         do {
104             putstr(tmpwin, 0, doname(otmp));
105             otmp = here ? otmp->nexthere : otmp->nobj;
106         } while (otmp);
107         display_nhwindow(tmpwin, TRUE);
108         destroy_nhwindow(tmpwin);
109     }
110 }
111
112 int
113 collect_obj_classes(ilets, otmp, here, filter, itemcount)
114 char ilets[];
115 register struct obj *otmp;
116 boolean here;
117 boolean FDECL((*filter), (OBJ_P));
118 int *itemcount;
119 {
120     register int iletct = 0;
121     register char c;
122
123     *itemcount = 0;
124     ilets[iletct] = '\0'; /* terminate ilets so that index() will work */
125     while (otmp) {
126         c = def_oc_syms[(int) otmp->oclass].sym;
127         if (!index(ilets, c) && (!filter || (*filter)(otmp)))
128             ilets[iletct++] = c, ilets[iletct] = '\0';
129         *itemcount += 1;
130         otmp = here ? otmp->nexthere : otmp->nobj;
131     }
132
133     return iletct;
134 }
135
136 /*
137  * Suppose some '?' and '!' objects are present, but '/' objects aren't:
138  *      "a" picks all items without further prompting;
139  *      "A" steps through all items, asking one by one;
140  *      "?" steps through '?' items, asking, and ignores '!' ones;
141  *      "/" becomes 'A', since no '/' present;
142  *      "?a" or "a?" picks all '?' without further prompting;
143  *      "/a" or "a/" becomes 'A' since there aren't any '/'
144  *          (bug fix:  3.1.0 thru 3.1.3 treated it as "a");
145  *      "?/a" or "a?/" or "/a?",&c picks all '?' even though no '/'
146  *          (ie, treated as if it had just been "?a").
147  */
148 /*JP CHECK: 3.4.3 \82Å\82Ì\8cÄ\82Ñ\8fo\82µ\8c³
149 pickup.c:572:("\8fE\82¤")   if (!query_classes(oclasses, &selective, &all_of_a_type,
150 pickup.c:2604:("\8eæ\82è\8fo\82·")    if (query_classes(select, &one_by_one, &allflag,
151 pickup.c:2704:("\93ü\82ê\82é")        if (query_classes(select, &one_by_one, &allflag, "\93ü\82ê\82é",
152 */
153 STATIC_OVL boolean
154 query_classes(oclasses, one_at_a_time, everything, action, objs, here,
155               menu_on_demand)
156 char oclasses[];
157 boolean *one_at_a_time, *everything;
158 const char *action;
159 struct obj *objs;
160 boolean here;
161 int *menu_on_demand;
162 {
163     char ilets[36], inbuf[BUFSZ] = DUMMY; /* FIXME: hardcoded ilets[] length */
164     int iletct, oclassct;
165     boolean not_everything, filtered;
166     char qbuf[QBUFSZ];
167     boolean m_seen;
168     int itemcount, bcnt, ucnt, ccnt, xcnt, ocnt;
169
170     oclasses[oclassct = 0] = '\0';
171     *one_at_a_time = *everything = m_seen = FALSE;
172     if (menu_on_demand)
173         *menu_on_demand = 0;
174     iletct = collect_obj_classes(ilets, objs, here,
175                                  (boolean FDECL((*), (OBJ_P))) 0, &itemcount);
176     if (iletct == 0)
177         return FALSE;
178
179     if (iletct == 1) {
180         oclasses[0] = def_char_to_objclass(ilets[0]);
181         oclasses[1] = '\0';
182     } else { /* more than one choice available */
183         /* additional choices */
184         ilets[iletct++] = ' ';
185         ilets[iletct++] = 'a';
186         ilets[iletct++] = 'A';
187         ilets[iletct++] = (objs == invent ? 'i' : ':');
188     }
189     if (itemcount && menu_on_demand)
190         ilets[iletct++] = 'm';
191     if (count_unpaid(objs))
192         ilets[iletct++] = 'u';
193
194     tally_BUCX(objs, here, &bcnt, &ucnt, &ccnt, &xcnt, &ocnt);
195     if (bcnt)
196         ilets[iletct++] = 'B';
197     if (ucnt)
198         ilets[iletct++] = 'U';
199     if (ccnt)
200         ilets[iletct++] = 'C';
201     if (xcnt)
202         ilets[iletct++] = 'X';
203     ilets[iletct] = '\0';
204
205     if (iletct > 1) {
206         const char *where = 0;
207         char sym, oc_of_sym, *p;
208
209     ask_again:
210         oclasses[oclassct = 0] = '\0';
211         *one_at_a_time = *everything = FALSE;
212         not_everything = filtered = FALSE;
213 #if 0 /*JP:T*/
214         Sprintf(qbuf, "What kinds of thing do you want to %s? [%s]", action,
215                 ilets);
216 #else
217         Sprintf(qbuf,"\82Ç\82Ì\8eí\97Þ\82Ì\82à\82Ì\82ð%s\82©\81H[%s]", jpolite(action),
218                 ilets);
219 #endif
220         getlin(qbuf, inbuf);
221         if (*inbuf == '\033')
222             return FALSE;
223
224         for (p = inbuf; (sym = *p++) != 0; ) {
225             if (sym == ' ')
226                 continue;
227             else if (sym == 'A')
228                 *one_at_a_time = TRUE;
229             else if (sym == 'a')
230                 *everything = TRUE;
231             else if (sym == ':') {
232                 simple_look(objs, here); /* dumb if objs==invent */
233                 /* if we just scanned the contents of a container
234                    then mark it as having known contents */
235                 if (objs->where == OBJ_CONTAINED)
236                     objs->ocontainer->cknown = 1;
237                 goto ask_again;
238             } else if (sym == 'i') {
239                 (void) display_inventory((char *) 0, TRUE);
240                 goto ask_again;
241             } else if (sym == 'm') {
242                 m_seen = TRUE;
243             } else if (index("uBUCX", sym)) {
244                 add_valid_menu_class(sym); /* 'u' or 'B','U','C',or 'X' */
245                 filtered = TRUE;
246             } else {
247                 oc_of_sym = def_char_to_objclass(sym);
248                 if (index(ilets, sym)) {
249                     add_valid_menu_class(oc_of_sym);
250                     oclasses[oclassct++] = oc_of_sym;
251                     oclasses[oclassct] = '\0';
252                 } else {
253                     if (!where)
254 /*JP
255                         where = !strcmp(action, "pick up") ? "here"
256 */
257                         where = !strcmp(action, "\8fE\82¤") ? "\82±\82±"
258 /*JP
259                                 : !strcmp(action, "take out") ? "inside" : "";
260 */
261                                 : !strcmp(action, "\8eæ\82è\8fo\82·") ? "\82Ì\92\86" : "";
262                     if (*where)
263 /*JP
264                         There("are no %c's %s.", sym, where);
265 */
266                         pline("%c\82Í%s\82É\82È\82¢\81D", sym, where);
267                     else
268 /*JP
269                         You("have no %c's.", sym);
270 */
271                         You("%c\82Í\8e\9d\82Á\82Ä\82¢\82È\82¢\81D", sym);
272                     not_everything = TRUE;
273                 }
274             }
275         } /* for p:sym in inbuf */
276
277         if (m_seen && menu_on_demand) {
278             *menu_on_demand = (((*everything || !oclassct) && !filtered)
279                                ? -2 : -3);
280             return FALSE;
281         }
282         if (!oclassct && (!*everything || not_everything)) {
283             /* didn't pick anything,
284                or tried to pick something that's not present */
285             *one_at_a_time = TRUE; /* force 'A' */
286             *everything = FALSE;   /* inhibit 'a' */
287         }
288     }
289     return TRUE;
290 }
291
292 /* check whether hero is bare-handedly touching a cockatrice corpse */
293 STATIC_OVL boolean
294 fatal_corpse_mistake(obj, remotely)
295 struct obj *obj;
296 boolean remotely;
297 {
298     if (uarmg || remotely || obj->otyp != CORPSE
299         || !touch_petrifies(&mons[obj->corpsenm]) || Stone_resistance)
300         return FALSE;
301
302     if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) {
303         display_nhwindow(WIN_MESSAGE, FALSE); /* --More-- */
304         return FALSE;
305     }
306
307 /*JP
308     pline("Touching %s is a fatal mistake.",
309 */
310     pline("%s\82É\90G\82ê\82é\82Ì\82Í\92v\96½\93I\82È\8aÔ\88á\82¢\82¾\81D",
311           corpse_xname(obj, (const char *) 0, CXN_SINGULAR | CXN_ARTICLE));
312     instapetrify(killer_xname(obj));
313     return TRUE;
314 }
315
316 /* attempting to manipulate a Rider's corpse triggers its revival */
317 boolean
318 rider_corpse_revival(obj, remotely)
319 struct obj *obj;
320 boolean remotely;
321 {
322     if (!obj || obj->otyp != CORPSE || !is_rider(&mons[obj->corpsenm]))
323         return FALSE;
324
325 /*JP
326     pline("At your %s, the corpse suddenly moves...",
327 */
328     pline("\82 \82È\82½\82ª%s\82é\82Æ\93Ë\91R\8e\80\91Ì\82ª\93®\82«\8fo\82µ\82½\81D\81D\81D",
329 /*JP
330           remotely ? "attempted acquisition" : "touch");
331 */
332           remotely ? "\8al\93¾\82µ\82æ\82¤\82Æ\82·" : "\90G");
333     (void) revive_corpse(obj);
334     exercise(A_WIS, FALSE);
335     return TRUE;
336 }
337
338 /* look at the objects at our location, unless there are too many of them */
339 STATIC_OVL void
340 check_here(picked_some)
341 boolean picked_some;
342 {
343     register struct obj *obj;
344     register int ct = 0;
345
346     /* count the objects here */
347     for (obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere) {
348         if (obj != uchain)
349             ct++;
350     }
351
352     /* If there are objects here, take a look. */
353     if (ct) {
354         if (context.run)
355             nomul(0);
356         flush_screen(1);
357         (void) look_here(ct, picked_some);
358     } else {
359         read_engr_at(u.ux, u.uy);
360     }
361 }
362
363 /* Value set by query_objlist() for n_or_more(). */
364 static long val_for_n_or_more;
365
366 /* query_objlist callback: return TRUE if obj's count is >= reference value */
367 STATIC_OVL boolean
368 n_or_more(obj)
369 struct obj *obj;
370 {
371     if (obj == uchain)
372         return FALSE;
373     return (boolean) (obj->quan >= val_for_n_or_more);
374 }
375
376 /* list of valid menu classes for query_objlist() and allow_category callback
377    (with room for all object classes, 'u'npaid, BUCX, and terminator) */
378 static char valid_menu_classes[MAXOCLASSES + 1 + 4 + 1];
379 static boolean class_filter, bucx_filter, shop_filter;
380
381 /* check valid_menu_classes[] for an entry; also used by askchain() */
382 boolean
383 menu_class_present(c)
384 int c;
385 {
386     return (c && index(valid_menu_classes, c)) ? TRUE : FALSE;
387 }
388
389 void
390 add_valid_menu_class(c)
391 int c;
392 {
393     static int vmc_count = 0;
394
395     if (c == 0) { /* reset */
396         vmc_count = 0;
397         class_filter = bucx_filter = shop_filter = FALSE;
398     } else if (!menu_class_present(c)) {
399         valid_menu_classes[vmc_count++] = (char) c;
400         /* categorize the new class */
401         switch (c) {
402         case 'B':
403         case 'U':
404         case 'C': /*FALLTHRU*/
405         case 'X':
406             bucx_filter = TRUE;
407             break;
408         case 'u':
409             shop_filter = TRUE;
410             break;
411         default:
412             class_filter = TRUE;
413             break;
414         }
415     }
416     valid_menu_classes[vmc_count] = '\0';
417 }
418
419 /* query_objlist callback: return TRUE if not uchain */
420 STATIC_OVL boolean
421 all_but_uchain(obj)
422 struct obj *obj;
423 {
424     return (boolean) (obj != uchain);
425 }
426
427 /* query_objlist callback: return TRUE */
428 /*ARGUSED*/
429 boolean
430 allow_all(obj)
431 struct obj *obj UNUSED;
432 {
433     return TRUE;
434 }
435
436 boolean
437 allow_category(obj)
438 struct obj *obj;
439 {
440     /* For coins, if any class filter is specified, accept if coins
441      * are included regardless of whether either unpaid or BUC-status
442      * is also specified since player has explicitly requested coins.
443      * If no class filtering is specified but bless/curse state is,
444      * coins are either unknown or uncursed based on an option setting.
445      */
446     if (obj->oclass == COIN_CLASS)
447         return class_filter
448                  ? (index(valid_menu_classes, COIN_CLASS) ? TRUE : FALSE)
449                  : shop_filter /* coins are never unpaid, but check anyway */
450                     ? (obj->unpaid ? TRUE : FALSE)
451                     : bucx_filter
452                        ? (index(valid_menu_classes, iflags.goldX ? 'X' : 'U')
453                           ? TRUE : FALSE)
454                        : TRUE; /* catchall: no filters specified, so accept */
455
456     if (Role_if(PM_PRIEST))
457         obj->bknown = TRUE;
458
459     /*
460      * There are three types of filters possible and the first and
461      * third can have more than one entry:
462      *  1) object class (armor, potion, &c);
463      *  2) unpaid shop item;
464      *  3) bless/curse state (blessed, uncursed, cursed, BUC-unknown).
465      * When only one type is present, the situation is simple:
466      * to be accepted, obj's status must match one of the entries.
467      * When more than one type is present, the obj will now only
468      * be accepted when it matches one entry of each type.
469      * So ?!B will accept blessed scrolls or potions, and [u will
470      * accept unpaid armor.  (In 3.4.3, an object was accepted by
471      * this filter if it met any entry of any type, so ?!B resulted
472      * in accepting all scrolls and potions regardless of bless/curse
473      * state plus all blessed non-scroll, non-potion objects.)
474      */
475
476     /* if class is expected but obj's class is not in the list, reject */
477     if (class_filter && !index(valid_menu_classes, obj->oclass))
478         return FALSE;
479     /* if unpaid is expected and obj isn't unpaid, reject (treat a container
480        holding any unpaid object as unpaid even if isn't unpaid itself) */
481     if (shop_filter && !obj->unpaid
482         && !(Has_contents(obj) && count_unpaid(obj->cobj) > 0))
483         return FALSE;
484     /* check for particular bless/curse state */
485     if (bucx_filter) {
486         /* first categorize this object's bless/curse state */
487         char bucx = !obj->bknown ? 'X'
488                       : obj->blessed ? 'B' : obj->cursed ? 'C' : 'U';
489
490         /* if its category is not in the list, reject */
491         if (!index(valid_menu_classes, bucx))
492             return FALSE;
493     }
494     /* obj didn't fail any of the filter checks, so accept */
495     return TRUE;
496 }
497
498 #if 0 /* not used */
499 /* query_objlist callback: return TRUE if valid category (class), no uchain */
500 STATIC_OVL boolean
501 allow_cat_no_uchain(obj)
502 struct obj *obj;
503 {
504     if (obj != uchain
505         && ((index(valid_menu_classes, 'u') && obj->unpaid)
506             || index(valid_menu_classes, obj->oclass)))
507         return TRUE;
508     return FALSE;
509 }
510 #endif
511
512 /* query_objlist callback: return TRUE if valid class and worn */
513 boolean
514 is_worn_by_type(otmp)
515 register struct obj *otmp;
516 {
517     return (is_worn(otmp) && allow_category(otmp)) ? TRUE : FALSE;
518 }
519
520 /*
521  * Have the hero pick things from the ground
522  * or a monster's inventory if swallowed.
523  *
524  * Arg what:
525  *      >0  autopickup
526  *      =0  interactive
527  *      <0  pickup count of something
528  *
529  * Returns 1 if tried to pick something up, whether
530  * or not it succeeded.
531  */
532 int
533 pickup(what)
534 int what; /* should be a long */
535 {
536     int i, n, res, count, n_tried = 0, n_picked = 0;
537     menu_item *pick_list = (menu_item *) 0;
538     boolean autopickup = what > 0;
539     struct obj **objchain_p;
540     int traverse_how;
541
542     /* we might have arrived here while fainted or sleeping, via
543        random teleport or levitation timeout; if so, skip check_here
544        and read_engr_at in addition to bypassing autopickup itself
545        [probably ought to check whether hero is using a cockatrice
546        corpse for a pillow here... (also at initial faint/sleep)] */
547     if (autopickup && multi < 0 && unconscious())
548         return 0;
549
550     if (what < 0) /* pick N of something */
551         count = -what;
552     else /* pick anything */
553         count = 0;
554
555     if (!u.uswallow) {
556         struct trap *ttmp;
557
558         /* no auto-pick if no-pick move, nothing there, or in a pool */
559         if (autopickup && (context.nopick || !OBJ_AT(u.ux, u.uy)
560                            || (is_pool(u.ux, u.uy) && !Underwater)
561                            || is_lava(u.ux, u.uy))) {
562             read_engr_at(u.ux, u.uy);
563             return 0;
564         }
565         /* no pickup if levitating & not on air or water level */
566         if (!can_reach_floor(TRUE)) {
567             if ((multi && !context.run) || (autopickup && !flags.pickup)
568                 || ((ttmp = t_at(u.ux, u.uy)) != 0
569                     && uteetering_at_seen_pit(ttmp)))
570                 read_engr_at(u.ux, u.uy);
571             return 0;
572         }
573         /* multi && !context.run means they are in the middle of some other
574          * action, or possibly paralyzed, sleeping, etc.... and they just
575          * teleported onto the object.  They shouldn't pick it up.
576          */
577         if ((multi && !context.run) || (autopickup && !flags.pickup)) {
578             check_here(FALSE);
579             return 0;
580         }
581         if (notake(youmonst.data)) {
582             if (!autopickup)
583 /*JP
584                 You("are physically incapable of picking anything up.");
585 */
586                 You("\95¨\97\9d\93I\82É\8fE\82¢\82 \82°\82é\82±\82Æ\82ª\82Å\82«\82È\82¢\81D");
587             else
588                 check_here(FALSE);
589             return 0;
590         }
591
592         /* if there's anything here, stop running */
593         if (OBJ_AT(u.ux, u.uy) && context.run && context.run != 8
594             && !context.nopick)
595             nomul(0);
596     }
597
598     add_valid_menu_class(0); /* reset */
599     if (!u.uswallow) {
600         objchain_p = &level.objects[u.ux][u.uy];
601         traverse_how = BY_NEXTHERE;
602     } else {
603         objchain_p = &u.ustuck->minvent;
604         traverse_how = 0; /* nobj */
605     }
606     /*
607      * Start the actual pickup process.  This is split into two main
608      * sections, the newer menu and the older "traditional" methods.
609      * Automatic pickup has been split into its own menu-style routine
610      * to make things less confusing.
611      */
612     if (autopickup) {
613         n = autopick(*objchain_p, traverse_how, &pick_list);
614         goto menu_pickup;
615     }
616
617     if (flags.menu_style != MENU_TRADITIONAL || iflags.menu_requested) {
618         /* use menus exclusively */
619         traverse_how |= AUTOSELECT_SINGLE
620                         | (flags.sortpack ? INVORDER_SORT : 0);
621         if (count) { /* looking for N of something */
622             char qbuf[QBUFSZ];
623
624 /*JP
625             Sprintf(qbuf, "Pick %d of what?", count);
626 */
627             Sprintf(qbuf, "\89½\82ð%d\8cÂ\8fE\82¢\82Ü\82·\82©\81H", count);
628             val_for_n_or_more = count; /* set up callback selector */
629             n = query_objlist(qbuf, objchain_p, traverse_how,
630                               &pick_list, PICK_ONE, n_or_more);
631             /* correct counts, if any given */
632             for (i = 0; i < n; i++)
633                 pick_list[i].count = count;
634         } else {
635 #if 0 /*JP*/
636             n = query_objlist("Pick up what?", objchain_p,
637                               (traverse_how | FEEL_COCKATRICE),
638                               &pick_list, PICK_ANY, all_but_uchain);
639 #else
640             n = query_objlist("\89½\82ð\8fE\82¢\82Ü\82·\82©\81H", objchain_p,
641                               (traverse_how | FEEL_COCKATRICE),
642                               &pick_list, PICK_ANY, all_but_uchain);
643 #endif
644         }
645
646     menu_pickup:
647         n_tried = n;
648         for (n_picked = i = 0; i < n; i++) {
649             res = pickup_object(pick_list[i].item.a_obj, pick_list[i].count,
650                                 FALSE);
651             if (res < 0)
652                 break; /* can't continue */
653             n_picked += res;
654         }
655         if (pick_list)
656             free((genericptr_t) pick_list);
657
658     } else {
659         /* old style interface */
660         int ct = 0;
661         long lcount;
662         boolean all_of_a_type, selective, bycat;
663         char oclasses[MAXOCLASSES + 10]; /* +10: room for B,U,C,X plus slop */
664         struct obj *obj, *obj2;
665
666         oclasses[0] = '\0';   /* types to consider (empty for all) */
667         all_of_a_type = TRUE; /* take all of considered types */
668         selective = FALSE;    /* ask for each item */
669
670         /* check for more than one object */
671         for (obj = *objchain_p; obj; obj = FOLLOW(obj, traverse_how))
672             ct++;
673
674         if (ct == 1 && count) {
675             /* if only one thing, then pick it */
676             obj = *objchain_p;
677             lcount = min(obj->quan, (long) count);
678             n_tried++;
679             if (pickup_object(obj, lcount, FALSE) > 0)
680                 n_picked++; /* picked something */
681             goto end_query;
682
683         } else if (ct >= 2) {
684             int via_menu = 0;
685
686 /*JP
687             There("are %s objects here.", (ct <= 10) ? "several" : "many");
688 */
689             pline("\82±\82±\82É\82Í%s\82à\82Ì\82ª\82 \82é\81D", (ct <= 10) ? "\82¢\82­\82Â\82©" : "\91ò\8eR\82Ì");
690 #if 0 /*JP*/
691             if (!query_classes(oclasses, &selective, &all_of_a_type,
692                                "pick up", *objchain_p,
693                                (traverse_how & BY_NEXTHERE) ? TRUE : FALSE,
694                                &via_menu)) {
695 #else
696             if (!query_classes(oclasses, &selective, &all_of_a_type,
697                                "\8fE\82¤", *objchain_p,
698                                (traverse_how & BY_NEXTHERE) ? TRUE : FALSE,
699                                &via_menu)) {
700 #endif
701                 if (!via_menu)
702                     goto pickupdone;
703                 if (selective)
704                     traverse_how |= INVORDER_SORT;
705 #if 0 /*JP*/
706                 n = query_objlist("Pick up what?", objchain_p, traverse_how,
707                                   &pick_list, PICK_ANY,
708                                   (via_menu == -2) ? allow_all
709                                                    : allow_category);
710 #else
711                 n = query_objlist("\89½\82ð\8fE\82¢\82Ü\82·\82©\81H", objchain_p, traverse_how,
712                                   &pick_list, PICK_ANY,
713                                   (via_menu == -2) ? allow_all
714                                                    : allow_category);
715 #endif
716                 goto menu_pickup;
717             }
718         }
719         bycat = (menu_class_present('B') || menu_class_present('U')
720                  || menu_class_present('C') || menu_class_present('X'));
721
722         for (obj = *objchain_p; obj; obj = obj2) {
723             obj2 = FOLLOW(obj, traverse_how);
724             if (bycat ? !allow_category(obj)
725                       : (!selective && oclasses[0]
726                          && !index(oclasses, obj->oclass)))
727                 continue;
728
729             lcount = -1L;
730             if (!all_of_a_type) {
731                 char qbuf[BUFSZ];
732
733 #if 0 /*JP*/
734                 (void) safe_qbuf(qbuf, "Pick up ", "?", obj, doname,
735                                  ansimpleoname, something);
736 #else
737                 (void) safe_qbuf(qbuf, "", "\82ð\8fE\82¢\82Ü\82·\82©\81H", obj, doname,
738                                  ansimpleoname, "\82±\82ê");
739 #endif
740                 switch ((obj->quan < 2L) ? ynaq(qbuf) : ynNaq(qbuf)) {
741                 case 'q':
742                     goto end_query; /* out 2 levels */
743                 case 'n':
744                     continue;
745                 case 'a':
746                     all_of_a_type = TRUE;
747                     if (selective) {
748                         selective = FALSE;
749                         oclasses[0] = obj->oclass;
750                         oclasses[1] = '\0';
751                     }
752                     break;
753                 case '#': /* count was entered */
754                     if (!yn_number)
755                         continue; /* 0 count => No */
756                     lcount = (long) yn_number;
757                     if (lcount > obj->quan)
758                         lcount = obj->quan;
759                     /*FALLTHRU*/
760                 default: /* 'y' */
761                     break;
762                 }
763             }
764             if (lcount == -1L)
765                 lcount = obj->quan;
766
767             n_tried++;
768             if ((res = pickup_object(obj, lcount, FALSE)) < 0)
769                 break;
770             n_picked += res;
771         }
772     end_query:
773         ; /* statement required after label */
774     }
775
776     if (!u.uswallow) {
777         if (hides_under(youmonst.data))
778             (void) hideunder(&youmonst);
779
780         /* position may need updating (invisible hero) */
781         if (n_picked)
782             newsym_force(u.ux, u.uy);
783
784         /* check if there's anything else here after auto-pickup is done */
785         if (autopickup)
786             check_here(n_picked > 0);
787     }
788  pickupdone:
789     add_valid_menu_class(0); /* reset */
790     return (n_tried > 0);
791 }
792
793 boolean
794 is_autopickup_exception(obj, grab)
795 struct obj *obj;
796 boolean grab; /* forced pickup, rather than forced leave behind? */
797 {
798     /*
799      *  Does the text description of this match an exception?
800      */
801     struct autopickup_exception
802         *ape = (grab) ? iflags.autopickup_exceptions[AP_GRAB]
803                       : iflags.autopickup_exceptions[AP_LEAVE];
804
805     if (ape) {
806         char *objdesc = makesingular(doname(obj));
807
808         while (ape) {
809             if (regex_match(objdesc, ape->regex))
810                 return TRUE;
811             ape = ape->next;
812         }
813     }
814     return FALSE;
815 }
816
817 boolean
818 autopick_testobj(otmp, calc_costly)
819 struct obj *otmp;
820 boolean calc_costly;
821 {
822     static boolean costly = FALSE;
823     const char *otypes = flags.pickup_types;
824     boolean pickit;
825
826     /* calculate 'costly' just once for a given autopickup operation */
827     if (calc_costly)
828         costly = (otmp->where == OBJ_FLOOR
829                   && costly_spot(otmp->ox, otmp->oy));
830
831     /* first check: reject if an unpaid item in a shop */
832     if (costly && !otmp->no_charge)
833         return FALSE;
834
835     /* check for pickup_types */
836     pickit = (!*otypes || index(otypes, otmp->oclass));
837     /* check for "always pick up */
838     if (!pickit)
839         pickit = is_autopickup_exception(otmp, TRUE);
840     /* then for "never pick up */
841     if (pickit)
842         pickit = !is_autopickup_exception(otmp, FALSE);
843     /* pickup_thrown overrides pickup_types and exceptions */
844     if (!pickit)
845         pickit = (flags.pickup_thrown && otmp->was_thrown);
846     return pickit;
847 }
848
849 /*
850  * Pick from the given list using flags.pickup_types.  Return the number
851  * of items picked (not counts).  Create an array that returns pointers
852  * and counts of the items to be picked up.  If the number of items
853  * picked is zero, the pickup list is left alone.  The caller of this
854  * function must free the pickup list.
855  */
856 STATIC_OVL int
857 autopick(olist, follow, pick_list)
858 struct obj *olist;     /* the object list */
859 int follow;            /* how to follow the object list */
860 menu_item **pick_list; /* list of objects and counts to pick up */
861 {
862     menu_item *pi; /* pick item */
863     struct obj *curr;
864     int n;
865     boolean check_costly = TRUE;
866
867     /* first count the number of eligible items */
868     for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) {
869         if (autopick_testobj(curr, check_costly))
870             ++n;
871         check_costly = FALSE; /* only need to check once per autopickup */
872     }
873
874     if (n) {
875         *pick_list = pi = (menu_item *) alloc(sizeof (menu_item) * n);
876         for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) {
877             if (autopick_testobj(curr, FALSE)) {
878                 pi[n].item.a_obj = curr;
879                 pi[n].count = curr->quan;
880                 n++;
881             }
882         }
883     }
884     return n;
885 }
886
887 /*
888  * Put up a menu using the given object list.  Only those objects on the
889  * list that meet the approval of the allow function are displayed.  Return
890  * a count of the number of items selected, as well as an allocated array of
891  * menu_items, containing pointers to the objects selected and counts.  The
892  * returned counts are guaranteed to be in bounds and non-zero.
893  *
894  * Query flags:
895  *      BY_NEXTHERE       - Follow object list via nexthere instead of nobj.
896  *      AUTOSELECT_SINGLE - Don't ask if only 1 object qualifies - just
897  *                          use it.
898  *      USE_INVLET        - Use object's invlet.
899  *      INVORDER_SORT     - Use hero's pack order.
900  *      INCLUDE_HERO      - Showing engulfer's invent; show hero too.
901  *      SIGNAL_NOMENU     - Return -1 rather than 0 if nothing passes "allow".
902  *      SIGNAL_ESCAPE     - Return -1 rather than 0 if player uses ESC to
903  *                          pick nothing.
904  *      FEEL_COCKATRICE   - touch corpse.
905  */
906 int
907 query_objlist(qstr, olist_p, qflags, pick_list, how, allow)
908 const char *qstr;                 /* query string */
909 struct obj **olist_p;             /* the list to pick from */
910 int qflags;                       /* options to control the query */
911 menu_item **pick_list;            /* return list of items picked */
912 int how;                          /* type of query */
913 boolean FDECL((*allow), (OBJ_P)); /* allow function */
914 {
915     int i, n;
916     winid win;
917     struct obj *curr, *last, fake_hero_object, *olist = *olist_p;
918     char *pack;
919     anything any;
920     boolean printed_type_name, first,
921             sorted = (qflags & INVORDER_SORT) != 0,
922             engulfer = (qflags & INCLUDE_HERO) != 0;
923     unsigned sortflags;
924     Loot *sortedolist, *srtoli;
925
926     *pick_list = (menu_item *) 0;
927     if (!olist && !engulfer)
928         return 0;
929
930     /* count the number of items allowed */
931     for (n = 0, last = 0, curr = olist; curr; curr = FOLLOW(curr, qflags))
932         if ((*allow)(curr)) {
933             last = curr;
934             n++;
935         }
936     if (engulfer) {
937         ++n;
938         /* don't autoselect swallowed hero if it's the only choice */
939         qflags &= ~AUTOSELECT_SINGLE;
940     }
941
942     if (n == 0) /* nothing to pick here */
943         return (qflags & SIGNAL_NOMENU) ? -1 : 0;
944
945     if (n == 1 && (qflags & AUTOSELECT_SINGLE)) {
946         *pick_list = (menu_item *) alloc(sizeof (menu_item));
947         (*pick_list)->item.a_obj = last;
948         (*pick_list)->count = last->quan;
949         return 1;
950     }
951
952     sortflags = (((flags.sortloot == 'f'
953                    || (flags.sortloot == 'l' && !(qflags & USE_INVLET)))
954                   ? SORTLOOT_LOOT
955                   : ((qflags & USE_INVLET) ? SORTLOOT_INVLET : 0))
956                  | (flags.sortpack ? SORTLOOT_PACK : 0)
957                  | ((qflags & FEEL_COCKATRICE) ? SORTLOOT_PETRIFY : 0));
958     sortedolist = sortloot(&olist, sortflags,
959                            (qflags & BY_NEXTHERE) ? TRUE : FALSE, allow);
960
961     win = create_nhwindow(NHW_MENU);
962     start_menu(win);
963     any = zeroany;
964     /*
965      * Run through the list and add the objects to the menu.  If
966      * INVORDER_SORT is set, we'll run through the list once for
967      * each type so we can group them.  The allow function was
968      * called by sortloot() and will be called once per item here.
969      */
970     pack = flags.inv_order;
971     first = TRUE;
972     do {
973         printed_type_name = FALSE;
974         for (srtoli = sortedolist; ((curr = srtoli->obj) != 0); ++srtoli) {
975             if (sorted && curr->oclass != *pack)
976                 continue;
977             if ((qflags & FEEL_COCKATRICE) && curr->otyp == CORPSE
978                 && will_feel_cockatrice(curr, FALSE)) {
979                 destroy_nhwindow(win); /* stop the menu and revert */
980                 (void) look_here(0, FALSE);
981                 return 0;
982             }
983             if ((*allow)(curr)) {
984                 /* if sorting, print type name (once only) */
985                 if (sorted && !printed_type_name) {
986                     any = zeroany;
987                     add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
988                              let_to_name(*pack, FALSE,
989                                          ((how != PICK_NONE)
990                                           && iflags.menu_head_objsym)),
991                              MENU_UNSELECTED);
992                     printed_type_name = TRUE;
993                 }
994
995                 any.a_obj = curr;
996                 add_menu(win, obj_to_glyph(curr, rn2_on_display_rng), &any,
997                          (qflags & USE_INVLET) ? curr->invlet
998                            : (first && curr->oclass == COIN_CLASS) ? '$' : 0,
999                          def_oc_syms[(int) objects[curr->otyp].oc_class].sym,
1000                          ATR_NONE, doname_with_price(curr), MENU_UNSELECTED);
1001                 first = FALSE;
1002             }
1003         }
1004         pack++;
1005     } while (sorted && *pack);
1006     unsortloot(&sortedolist);
1007
1008     if (engulfer) {
1009         char buf[BUFSZ];
1010
1011         any = zeroany;
1012         if (sorted && n > 1) {
1013 #if 0 /*JP*/
1014             Sprintf(buf, "%s Creatures",
1015                     is_animal(u.ustuck->data) ? "Swallowed" : "Engulfed");
1016 #else
1017             Sprintf(buf, "%s\8d\9e\82Ü\82ê\82Ä\82¢\82é\89ö\95¨",
1018                     is_animal(u.ustuck->data) ? "\88ù\82Ý" : "\8aª\82«");
1019 #endif
1020             add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings, buf,
1021                      MENU_UNSELECTED);
1022         }
1023         fake_hero_object = zeroobj;
1024         fake_hero_object.quan = 1L; /* not strictly necessary... */
1025         any.a_obj = &fake_hero_object;
1026         add_menu(win, mon_to_glyph(&youmonst, rn2_on_display_rng), &any,
1027                  /* fake inventory letter, no group accelerator */
1028                  CONTAINED_SYM, 0, ATR_NONE, an(self_lookat(buf)),
1029                  MENU_UNSELECTED);
1030     }
1031
1032     end_menu(win, qstr);
1033     n = select_menu(win, how, pick_list);
1034     destroy_nhwindow(win);
1035
1036     if (n > 0) {
1037         menu_item *mi;
1038         int k;
1039
1040         /* fix up counts:  -1 means no count used => pick all;
1041            if fake_hero_object was picked, discard that choice */
1042         for (i = k = 0, mi = *pick_list; i < n; i++, mi++) {
1043             if (mi->item.a_obj == &fake_hero_object)
1044                 continue;
1045             if (mi->count == -1L || mi->count > mi->item.a_obj->quan)
1046                 mi->count = mi->item.a_obj->quan;
1047             if (k < i)
1048                 (*pick_list)[k] = *mi;
1049             ++k;
1050         }
1051         if (!k) {
1052             /* fake_hero was only choice so discard whole list */
1053             free((genericptr_t) *pick_list);
1054             *pick_list = 0;
1055             n = 0;
1056         } else if (k < n) {
1057             /* other stuff plus fake_hero; last slot is now unused */
1058             (*pick_list)[k].item = zeroany;
1059             (*pick_list)[k].count = 0L;
1060             n = k;
1061         }
1062     } else if (n < 0) {
1063         /* -1 is used for SIGNAL_NOMENU, so callers don't expect it
1064            to indicate that the player declined to make a choice */
1065         n = (qflags & SIGNAL_ESCAPE) ? -2 : 0;
1066     }
1067     return n;
1068 }
1069
1070 /*
1071  * allow menu-based category (class) selection (for Drop,take off etc.)
1072  *
1073  */
1074 int
1075 query_category(qstr, olist, qflags, pick_list, how)
1076 const char *qstr;      /* query string */
1077 struct obj *olist;     /* the list to pick from */
1078 int qflags;            /* behaviour modification flags */
1079 menu_item **pick_list; /* return list of items picked */
1080 int how;               /* type of query */
1081 {
1082     int n;
1083     winid win;
1084     struct obj *curr;
1085     char *pack;
1086     anything any;
1087     boolean collected_type_name;
1088     char invlet;
1089     int ccount;
1090     boolean FDECL((*ofilter), (OBJ_P)) = (boolean FDECL((*), (OBJ_P))) 0;
1091     boolean do_unpaid = FALSE;
1092     boolean do_blessed = FALSE, do_cursed = FALSE, do_uncursed = FALSE,
1093             do_buc_unknown = FALSE;
1094     int num_buc_types = 0;
1095
1096     *pick_list = (menu_item *) 0;
1097     if (!olist)
1098         return 0;
1099     if ((qflags & UNPAID_TYPES) && count_unpaid(olist))
1100         do_unpaid = TRUE;
1101     if (qflags & WORN_TYPES)
1102         ofilter = is_worn;
1103     if ((qflags & BUC_BLESSED) && count_buc(olist, BUC_BLESSED, ofilter)) {
1104         do_blessed = TRUE;
1105         num_buc_types++;
1106     }
1107     if ((qflags & BUC_CURSED) && count_buc(olist, BUC_CURSED, ofilter)) {
1108         do_cursed = TRUE;
1109         num_buc_types++;
1110     }
1111     if ((qflags & BUC_UNCURSED) && count_buc(olist, BUC_UNCURSED, ofilter)) {
1112         do_uncursed = TRUE;
1113         num_buc_types++;
1114     }
1115     if ((qflags & BUC_UNKNOWN) && count_buc(olist, BUC_UNKNOWN, ofilter)) {
1116         do_buc_unknown = TRUE;
1117         num_buc_types++;
1118     }
1119
1120     ccount = count_categories(olist, qflags);
1121     /* no point in actually showing a menu for a single category */
1122     if (ccount == 1 && !do_unpaid && num_buc_types <= 1
1123         && !(qflags & BILLED_TYPES)) {
1124         for (curr = olist; curr; curr = FOLLOW(curr, qflags)) {
1125             if (ofilter && !(*ofilter)(curr))
1126                 continue;
1127             break;
1128         }
1129         if (curr) {
1130             *pick_list = (menu_item *) alloc(sizeof(menu_item));
1131             (*pick_list)->item.a_int = curr->oclass;
1132             return 1;
1133         } else {
1134             debugpline0("query_category: no single object match");
1135         }
1136         return 0;
1137     }
1138
1139     win = create_nhwindow(NHW_MENU);
1140     start_menu(win);
1141     pack = flags.inv_order;
1142
1143     if (qflags & CHOOSE_ALL) {
1144         invlet = 'A';
1145         any = zeroany;
1146         any.a_int = 'A';
1147         add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1148 /*JP
1149                  (qflags & WORN_TYPES) ? "Auto-select every item being worn"
1150 */
1151                  (qflags & WORN_TYPES) ? "\90g\82É\82Â\82¯\82ç\82ê\82é\95¨\91S\82Ä"
1152 /*JP
1153                                        : "Auto-select every item",
1154 */
1155                                        : "\91S\82Ä",
1156                  MENU_UNSELECTED);
1157
1158         any = zeroany;
1159         add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED);
1160     }
1161
1162     if ((qflags & ALL_TYPES) && (ccount > 1)) {
1163         invlet = 'a';
1164         any = zeroany;
1165         any.a_int = ALL_TYPES_SELECTED;
1166         add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1167 /*JP
1168                  (qflags & WORN_TYPES) ? "All worn types" : "All types",
1169 */
1170                  (qflags & WORN_TYPES) ? "\90g\82É\82Â\82¯\82é\82à\82Ì\91S\82Ä" : "\91S\82Ä",
1171                  MENU_UNSELECTED);
1172         invlet = 'b';
1173     } else
1174         invlet = 'a';
1175     do {
1176         collected_type_name = FALSE;
1177         for (curr = olist; curr; curr = FOLLOW(curr, qflags)) {
1178             if (curr->oclass == *pack) {
1179                 if (ofilter && !(*ofilter)(curr))
1180                     continue;
1181                 if (!collected_type_name) {
1182                     any = zeroany;
1183                     any.a_int = curr->oclass;
1184                     add_menu(
1185                         win, NO_GLYPH, &any, invlet++,
1186                         def_oc_syms[(int) objects[curr->otyp].oc_class].sym,
1187                         ATR_NONE, let_to_name(*pack, FALSE,
1188                                               (how != PICK_NONE)
1189                                                   && iflags.menu_head_objsym),
1190                         MENU_UNSELECTED);
1191                     collected_type_name = TRUE;
1192                 }
1193             }
1194         }
1195         pack++;
1196         if (invlet >= 'u') {
1197             impossible("query_category: too many categories");
1198             return 0;
1199         }
1200     } while (*pack);
1201
1202     if (do_unpaid || (qflags & BILLED_TYPES) || do_blessed || do_cursed
1203         || do_uncursed || do_buc_unknown) {
1204         any = zeroany;
1205         add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED);
1206     }
1207
1208     /* unpaid items if there are any */
1209     if (do_unpaid) {
1210         invlet = 'u';
1211         any = zeroany;
1212         any.a_int = 'u';
1213 /*JP
1214         add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, "Unpaid items",
1215 */
1216         add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, "\96¢\95¥\82Ì\82à\82Ì",
1217                  MENU_UNSELECTED);
1218     }
1219     /* billed items: checked by caller, so always include if BILLED_TYPES */
1220     if (qflags & BILLED_TYPES) {
1221         invlet = 'x';
1222         any = zeroany;
1223         any.a_int = 'x';
1224         add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1225 /*JP
1226                  "Unpaid items already used up", MENU_UNSELECTED);
1227 */
1228                  "\96¢\95¥\82Å\8eg\82Á\82Ä\82µ\82Ü\82Á\82½\82à\82Ì", MENU_UNSELECTED);
1229     }
1230
1231     /* items with b/u/c/unknown if there are any;
1232        this cluster of menu entries is in alphabetical order,
1233        reversing the usual sequence of 'U' and 'C' in BUCX */
1234     if (do_blessed) {
1235         invlet = 'B';
1236         any = zeroany;
1237         any.a_int = 'B';
1238         add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1239 /*JP
1240                  "Items known to be Blessed", MENU_UNSELECTED);
1241 */
1242                  "\8fj\95\9f\82³\82ê\82Ä\82¢\82é\82Æ\82í\82©\82Á\82Ä\82¢\82é\82à\82Ì", MENU_UNSELECTED);
1243     }
1244     if (do_cursed) {
1245         invlet = 'C';
1246         any = zeroany;
1247         any.a_int = 'C';
1248         add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1249 /*JP
1250                  "Items known to be Cursed", MENU_UNSELECTED);
1251 */
1252                  "\8eô\82í\82ê\82Ä\82¢\82é\82Æ\82í\82©\82Á\82Ä\82¢\82é\82à\82Ì", MENU_UNSELECTED);
1253     }
1254     if (do_uncursed) {
1255         invlet = 'U';
1256         any = zeroany;
1257         any.a_int = 'U';
1258         add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1259 /*JP
1260                  "Items known to be Uncursed", MENU_UNSELECTED);
1261 */
1262                  "\8eô\82í\82ê\82Ä\82¢\82È\82¢\82Æ\82í\82©\82Á\82Ä\82¢\82é\82à\82Ì", MENU_UNSELECTED);
1263     }
1264     if (do_buc_unknown) {
1265         invlet = 'X';
1266         any = zeroany;
1267         any.a_int = 'X';
1268 #if 0 /*JP*/
1269         add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1270                  "Items of unknown Bless/Curse status", MENU_UNSELECTED);
1271 #else
1272         add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
1273                  "\8fj\95\9f\81^\8eô\82¢\82ª\82í\82©\82ç\82È\82¢\82à\82Ì", MENU_UNSELECTED);
1274 #endif
1275     }
1276     end_menu(win, qstr);
1277     n = select_menu(win, how, pick_list);
1278     destroy_nhwindow(win);
1279     if (n < 0)
1280         n = 0; /* caller's don't expect -1 */
1281     return n;
1282 }
1283
1284 STATIC_OVL int
1285 count_categories(olist, qflags)
1286 struct obj *olist;
1287 int qflags;
1288 {
1289     char *pack;
1290     boolean counted_category;
1291     int ccount = 0;
1292     struct obj *curr;
1293
1294     pack = flags.inv_order;
1295     do {
1296         counted_category = FALSE;
1297         for (curr = olist; curr; curr = FOLLOW(curr, qflags)) {
1298             if (curr->oclass == *pack) {
1299                 if ((qflags & WORN_TYPES)
1300                     && !(curr->owornmask & (W_ARMOR | W_ACCESSORY | W_WEAPON)))
1301                     continue;
1302                 if (!counted_category) {
1303                     ccount++;
1304                     counted_category = TRUE;
1305                 }
1306             }
1307         }
1308         pack++;
1309     } while (*pack);
1310     return ccount;
1311 }
1312
1313 /*
1314  *  How much the weight of the given container will change when the given
1315  *  object is removed from it.  Use before and after weight amounts rather
1316  *  than trying to match the calculation used by weight() in mkobj.c.
1317  */
1318 STATIC_OVL int
1319 delta_cwt(container, obj)
1320 struct obj *container, *obj;
1321 {
1322     struct obj **prev;
1323     int owt, nwt;
1324
1325     if (container->otyp != BAG_OF_HOLDING)
1326         return obj->owt;
1327
1328     owt = nwt = container->owt;
1329     /* find the object so that we can remove it */
1330     for (prev = &container->cobj; *prev; prev = &(*prev)->nobj)
1331         if (*prev == obj)
1332             break;
1333     if (!*prev) {
1334         panic("delta_cwt: obj not inside container?");
1335     } else {
1336         /* temporarily remove the object and calculate resulting weight */
1337         *prev = obj->nobj;
1338         nwt = weight(container);
1339         *prev = obj; /* put the object back; obj->nobj is still valid */
1340     }
1341     return owt - nwt;
1342 }
1343
1344 /* could we carry `obj'? if not, could we carry some of it/them? */
1345 STATIC_OVL long
1346 carry_count(obj, container, count, telekinesis, wt_before, wt_after)
1347 struct obj *obj, *container; /* object to pick up, bag it's coming out of */
1348 long count;
1349 boolean telekinesis;
1350 int *wt_before, *wt_after;
1351 {
1352     boolean adjust_wt = container && carried(container),
1353             is_gold = obj->oclass == COIN_CLASS;
1354     int wt, iw, ow, oow;
1355     long qq, savequan, umoney;
1356     unsigned saveowt;
1357 #if 0 /*JP*/
1358     const char *verb, *prefx1, *prefx2, *suffx;
1359 #else
1360     const char *verb, *prefx1;
1361 #endif
1362     char obj_nambuf[BUFSZ], where[BUFSZ];
1363
1364     savequan = obj->quan;
1365     saveowt = obj->owt;
1366     umoney = money_cnt(invent);
1367     iw = max_capacity();
1368
1369     if (count != savequan) {
1370         obj->quan = count;
1371         obj->owt = (unsigned) weight(obj);
1372     }
1373     wt = iw + (int) obj->owt;
1374     if (adjust_wt)
1375         wt -= delta_cwt(container, obj);
1376     /* This will go with silver+copper & new gold weight */
1377     if (is_gold) /* merged gold might affect cumulative weight */
1378         wt -= (GOLD_WT(umoney) + GOLD_WT(count) - GOLD_WT(umoney + count));
1379     if (count != savequan) {
1380         obj->quan = savequan;
1381         obj->owt = saveowt;
1382     }
1383     *wt_before = iw;
1384     *wt_after = wt;
1385
1386     if (wt < 0)
1387         return count;
1388
1389     /* see how many we can lift */
1390     if (is_gold) {
1391         iw -= (int) GOLD_WT(umoney);
1392         if (!adjust_wt) {
1393             qq = GOLD_CAPACITY((long) iw, umoney);
1394         } else {
1395             oow = 0;
1396             qq = 50L - (umoney % 100L) - 1L;
1397             if (qq < 0L)
1398                 qq += 100L;
1399             for (; qq <= count; qq += 100L) {
1400                 obj->quan = qq;
1401                 obj->owt = (unsigned) GOLD_WT(qq);
1402                 ow = (int) GOLD_WT(umoney + qq);
1403                 ow -= delta_cwt(container, obj);
1404                 if (iw + ow >= 0)
1405                     break;
1406                 oow = ow;
1407             }
1408             iw -= oow;
1409             qq -= 100L;
1410         }
1411         if (qq < 0L)
1412             qq = 0L;
1413         else if (qq > count)
1414             qq = count;
1415         wt = iw + (int) GOLD_WT(umoney + qq);
1416     } else if (count > 1 || count < obj->quan) {
1417         /*
1418          * Ugh. Calc num to lift by changing the quan of of the
1419          * object and calling weight.
1420          *
1421          * This works for containers only because containers
1422          * don't merge.  -dean
1423          */
1424         for (qq = 1L; qq <= count; qq++) {
1425             obj->quan = qq;
1426             obj->owt = (unsigned) (ow = weight(obj));
1427             if (adjust_wt)
1428                 ow -= delta_cwt(container, obj);
1429             if (iw + ow >= 0)
1430                 break;
1431             wt = iw + ow;
1432         }
1433         --qq;
1434     } else {
1435         /* there's only one, and we can't lift it */
1436         qq = 0L;
1437     }
1438     obj->quan = savequan;
1439     obj->owt = saveowt;
1440
1441     if (qq < count) {
1442         /* some message will be given */
1443         Strcpy(obj_nambuf, doname(obj));
1444         if (container) {
1445 /*JP
1446             Sprintf(where, "in %s", the(xname(container)));
1447 */
1448             Sprintf(where, "%s\82Ì\92\86\82É\93ü\82Á\82Ä\82¢\82é", the(xname(container)));
1449 /*JP
1450             verb = "carry";
1451 */
1452             verb = "\89^\82×\82È\82¢";
1453         } else {
1454 /*JP
1455             Strcpy(where, "lying here");
1456 */
1457             Strcpy(where, "\82±\82±\82É\92u\82¢\82Ä\82 \82é");
1458 /*JP
1459             verb = telekinesis ? "acquire" : "lift";
1460 */
1461             verb = telekinesis ? "\8al\93¾\82Å\82«\82È\82¢" : "\8e\9d\82¿\82 \82°\82ç\82ê\82È\82¢";
1462         }
1463     } else {
1464         /* lint suppression */
1465         *obj_nambuf = *where = '\0';
1466         verb = "";
1467     }
1468     /* we can carry qq of them */
1469     if (qq > 0) {
1470         if (qq < count)
1471 #if 0 /*JP*/
1472             You("can only %s %s of the %s %s.", verb,
1473                 (qq == 1L) ? "one" : "some", obj_nambuf, where);
1474 #else
1475             You("%s%s\82Ì\82¤\82¿\82Ì%s\82µ\82©%s\81D",
1476                 where, obj_nambuf, (qq == 1L) ? "\88ê\82Â" : "\82¢\82­\82Â\82©", verb);
1477 #endif
1478         *wt_after = wt;
1479         return qq;
1480     }
1481
1482     if (!container)
1483 #if 0 /*JP*/
1484         Strcpy(where, "here"); /* slightly shorter form */
1485 #else
1486         Strcpy(where, "\82±\82±\82É\82Í");  /* slightly shorter form */
1487 #endif
1488     if (invent || umoney) {
1489 #if 0 /*JP*/
1490         prefx1 = "you cannot ";
1491         prefx2 = "";
1492         suffx = " any more";
1493 #else
1494         prefx1 = "\82±\82ê\88È\8fã";
1495 #endif
1496     } else {
1497 #if 0 /*JP*/
1498         prefx1 = (obj->quan == 1L) ? "it " : "even one ";
1499         prefx2 = "is too heavy for you to ";
1500         suffx = "";
1501 #else
1502         prefx1 = "\8fd\82·\82¬\82Ä";
1503 #endif
1504     }
1505 #if 0 /*JP:C*/
1506     There("%s %s %s, but %s%s%s%s.", otense(obj, "are"), obj_nambuf, where,
1507           prefx1, prefx2, verb, suffx);
1508 #else
1509     pline("%s%s\82ª\82 \82é\81C\82µ\82©\82µ%s%s\81D",
1510           where, obj_nambuf, prefx1, verb);
1511 #endif
1512
1513     /* *wt_after = iw; */
1514     return 0L;
1515 }
1516
1517 /* determine whether character is able and player is willing to carry `obj' */
1518 STATIC_OVL
1519 int
1520 lift_object(obj, container, cnt_p, telekinesis)
1521 struct obj *obj, *container; /* object to pick up, bag it's coming out of */
1522 long *cnt_p;
1523 boolean telekinesis;
1524 {
1525     int result, old_wt, new_wt, prev_encumbr, next_encumbr;
1526
1527     if (obj->otyp == BOULDER && Sokoban) {
1528 #if 0 /*JP*/
1529         You("cannot get your %s around this %s.", body_part(HAND),
1530             xname(obj));
1531 #else
1532         You("%s\82ð%s\82Å\8e\9d\82¿\82 \82°\82é\82±\82Æ\82ª\82Å\82«\82È\82¢\81D",
1533                         xname(obj), body_part(HAND));
1534 #endif
1535         return -1;
1536     }
1537     /* override weight consideration for loadstone picked up by anybody
1538        and for boulder picked up by hero poly'd into a giant; override
1539        availability of open inventory slot iff not already carrying one */
1540     if (obj->otyp == LOADSTONE
1541         || (obj->otyp == BOULDER && throws_rocks(youmonst.data))) {
1542         if (inv_cnt(FALSE) < 52 || !carrying(obj->otyp)
1543             || merge_choice(invent, obj))
1544             return 1; /* lift regardless of current situation */
1545         /* if we reach here, we're out of slots and already have at least
1546            one of these, so treat this one more like a normal item */
1547 #if 0 /*JP*/
1548         You("are carrying too much stuff to pick up %s %s.",
1549             (obj->quan == 1L) ? "another" : "more", simpleonames(obj));
1550 #else
1551         You("%s\82ð%s\8fE\82¤\82É\82Í\95¨\82ð\8e\9d\82¿\82·\82¬\82Ä\82¢\82é\81D",
1552             simpleonames(obj), (obj->quan == 1L) ? "\82à\82¤\88ê\82Â" : "\82à\82Á\82Æ");
1553 #endif
1554         return -1;
1555     }
1556
1557     *cnt_p = carry_count(obj, container, *cnt_p, telekinesis,
1558                          &old_wt, &new_wt);
1559     if (*cnt_p < 1L) {
1560         result = -1; /* nothing lifted */
1561     } else if (obj->oclass != COIN_CLASS
1562                /* [exception for gold coins will have to change
1563                    if silver/copper ones ever get implemented] */
1564                && inv_cnt(FALSE) >= 52 && !merge_choice(invent, obj)) {
1565 /*JP
1566         Your("knapsack cannot accommodate any more items.");
1567 */
1568         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");
1569         result = -1; /* nothing lifted */
1570     } else {
1571         result = 1;
1572         prev_encumbr = near_capacity();
1573         if (prev_encumbr < flags.pickup_burden)
1574             prev_encumbr = flags.pickup_burden;
1575         next_encumbr = calc_capacity(new_wt - old_wt);
1576         if (next_encumbr > prev_encumbr) {
1577             if (telekinesis) {
1578                 result = 0; /* don't lift */
1579             } else {
1580                 char qbuf[BUFSZ];
1581 #if 1 /*JP*/
1582                 char qsfx[BUFSZ];
1583 #endif
1584                 long savequan = obj->quan;
1585
1586                 obj->quan = *cnt_p;
1587 #if 0 /*JP*/
1588                 Strcpy(qbuf, (next_encumbr > HVY_ENCUMBER)
1589                                  ? overloadmsg
1590                                  : (next_encumbr > MOD_ENCUMBER)
1591                                        ? nearloadmsg
1592                                        : moderateloadmsg);
1593 #else
1594                 /*JP:\83A\83C\83e\83\80\96¼\82Ì\8cã\82ë\82É\95t\82¯\82½\82¢\82ªsafe_qbuf\82Ìqsuffix\82Í
1595                      qbuf\82Æ\8b¤\97p\82Å\82«\82È\82¢\82Ì\82Å\95Ê\82Éqsfx\82ð\97p\88Ó\82µ\82Ä\82»\82¿\82ç\82ð\8eg\82¤*/
1596                 Strcpy(qsfx, (next_encumbr > HVY_ENCUMBER)
1597                                  ? overloadmsg
1598                                  : (next_encumbr > MOD_ENCUMBER)
1599                                        ? nearloadmsg
1600                                        : moderateloadmsg);
1601                 Strcat(qsfx, "\81D\91±\82¯\82Ü\82·\82©\81H");
1602 #endif
1603
1604 #if 0 /*JP*//*\93ú\96{\8cê\82Å\82Í\82Ç\82¿\82ç\82à\81u\8e\9d\82Â\81v\82Å\8dÏ\82Ü\82¹\82é*/
1605                 if (container)
1606                     (void) strsubst(qbuf, "lifting", "removing");
1607 #endif
1608 #if 0 /*JP*/
1609                 Strcat(qbuf, " ");
1610                 (void) safe_qbuf(qbuf, qbuf, ".  Continue?", obj, doname,
1611                                  ansimpleoname, something);
1612 #else /*JP:\91O\82É\82Í\89½\82à\95t\82¯\82¸\8cã\82ë\82Éqsfx\82ð\95t\82¯\82é*/
1613                 (void) safe_qbuf(qbuf, "", qsfx, obj, doname,
1614                                  ansimpleoname, "\82±\82ê");
1615 #endif
1616                 obj->quan = savequan;
1617                 switch (ynq(qbuf)) {
1618                 case 'q':
1619                     result = -1;
1620                     break;
1621                 case 'n':
1622                     result = 0;
1623                     break;
1624                 default:
1625                     break; /* 'y' => result == 1 */
1626                 }
1627                 clear_nhwindow(WIN_MESSAGE);
1628             }
1629         }
1630     }
1631
1632     if (obj->otyp == SCR_SCARE_MONSTER && result <= 0 && !container)
1633         obj->spe = 0;
1634     return result;
1635 }
1636
1637 /*
1638  * Pick up <count> of obj from the ground and add it to the hero's inventory.
1639  * Returns -1 if caller should break out of its loop, 0 if nothing picked
1640  * up, 1 if otherwise.
1641  */
1642 int
1643 pickup_object(obj, count, telekinesis)
1644 struct obj *obj;
1645 long count;
1646 boolean telekinesis; /* not picking it up directly by hand */
1647 {
1648     int res, nearload;
1649
1650     if (obj->quan < count) {
1651         impossible("pickup_object: count %ld > quan %ld?", count, obj->quan);
1652         return 0;
1653     }
1654
1655     /* In case of auto-pickup, where we haven't had a chance
1656        to look at it yet; affects docall(SCR_SCARE_MONSTER). */
1657     if (!Blind)
1658         obj->dknown = 1;
1659
1660     if (obj == uchain) { /* do not pick up attached chain */
1661         return 0;
1662     } else if (obj->oartifact && !touch_artifact(obj, &youmonst)) {
1663         return 0;
1664     } else if (obj->otyp == CORPSE) {
1665         if (fatal_corpse_mistake(obj, telekinesis)
1666             || rider_corpse_revival(obj, telekinesis))
1667             return -1;
1668     } else if (obj->otyp == SCR_SCARE_MONSTER) {
1669         if (obj->blessed)
1670             obj->blessed = 0;
1671         else if (!obj->spe && !obj->cursed)
1672             obj->spe = 1;
1673         else {
1674 #if 0 /*JP*/
1675             pline_The("scroll%s %s to dust as you %s %s up.", plur(obj->quan),
1676                       otense(obj, "turn"), telekinesis ? "raise" : "pick",
1677                       (obj->quan == 1L) ? "it" : "them");
1678 #else
1679             pline("\8aª\95¨\82Í\82 \82È\82½\82ª%s\8fã\82°\82é\82Æ\90o\82Æ\82È\82Á\82Ä\82µ\82Ü\82Á\82½\81D",
1680                       telekinesis ? "\8e\9d\82¿" : "\8fE\82¢");
1681 #endif
1682             if (!(objects[SCR_SCARE_MONSTER].oc_name_known)
1683                 && !(objects[SCR_SCARE_MONSTER].oc_uname))
1684                 docall(obj);
1685             useupf(obj, obj->quan);
1686             return 1; /* tried to pick something up and failed, but
1687                          don't want to terminate pickup loop yet   */
1688         }
1689     }
1690
1691     if ((res = lift_object(obj, (struct obj *) 0, &count, telekinesis)) <= 0)
1692         return res;
1693
1694     /* Whats left of the special case for gold :-) */
1695     if (obj->oclass == COIN_CLASS)
1696         context.botl = 1;
1697     if (obj->quan != count && obj->otyp != LOADSTONE)
1698         obj = splitobj(obj, count);
1699
1700     obj = pick_obj(obj);
1701
1702     if (uwep && uwep == obj)
1703         mrg_to_wielded = TRUE;
1704     nearload = near_capacity();
1705     prinv(nearload == SLT_ENCUMBER ? moderateloadmsg : (char *) 0, obj,
1706           count);
1707     mrg_to_wielded = FALSE;
1708     return 1;
1709 }
1710
1711 /*
1712  * Do the actual work of picking otmp from the floor or monster's interior
1713  * and putting it in the hero's inventory.  Take care of billing.  Return a
1714  * pointer to the object where otmp ends up.  This may be different
1715  * from otmp because of merging.
1716  */
1717 struct obj *
1718 pick_obj(otmp)
1719 struct obj *otmp;
1720 {
1721     struct obj *result;
1722     int ox = otmp->ox, oy = otmp->oy;
1723     boolean robshop = (!u.uswallow && otmp != uball && costly_spot(ox, oy));
1724
1725     obj_extract_self(otmp);
1726     newsym(ox, oy);
1727
1728     /* for shop items, addinv() needs to be after addtobill() (so that
1729        object merger can take otmp->unpaid into account) but before
1730        remote_robbery() (which calls rob_shop() which calls setpaid()
1731        after moving costs of unpaid items to shop debt; setpaid()
1732        calls clear_unpaid() for lots of object chains, but 'otmp' isn't
1733        on any of those between obj_extract_self() and addinv(); for
1734        3.6.0, 'otmp' remained flagged as an unpaid item in inventory
1735        and triggered impossible() every time inventory was examined) */
1736     if (robshop) {
1737         char saveushops[5], fakeshop[2];
1738
1739         /* addtobill cares about your location rather than the object's;
1740            usually they'll be the same, but not when using telekinesis
1741            (if ever implemented) or a grappling hook */
1742         Strcpy(saveushops, u.ushops);
1743         fakeshop[0] = *in_rooms(ox, oy, SHOPBASE);
1744         fakeshop[1] = '\0';
1745         Strcpy(u.ushops, fakeshop);
1746         /* sets obj->unpaid if necessary */
1747         addtobill(otmp, TRUE, FALSE, FALSE);
1748         Strcpy(u.ushops, saveushops);
1749         robshop = otmp->unpaid && !index(u.ushops, *fakeshop);
1750     }
1751
1752     result = addinv(otmp);
1753     /* if you're taking a shop item from outside the shop, make shk notice */
1754     if (robshop)
1755         remote_burglary(ox, oy);
1756
1757     return result;
1758 }
1759
1760 /*
1761  * prints a message if encumbrance changed since the last check and
1762  * returns the new encumbrance value (from near_capacity()).
1763  */
1764 int
1765 encumber_msg()
1766 {
1767     static int oldcap = UNENCUMBERED;
1768     int newcap = near_capacity();
1769
1770     if (oldcap < newcap) {
1771         switch (newcap) {
1772         case 1:
1773 /*JP
1774             Your("movements are slowed slightly because of your load.");
1775 */
1776             Your("\93®\82«\82Í\89×\95¨\82Ì\82½\82ß\82É\8f­\82µ\92x\82­\82È\82Á\82½\81D");
1777             break;
1778         case 2:
1779 /*JP
1780             You("rebalance your load.  Movement is difficult.");
1781 */
1782             You("\89×\95¨\82Ì\92Þ\8d\87\82ð\82Æ\82è\92¼\82µ\82½\82ª\81C\93®\82«\82É\82­\82¢\81D");
1783             break;
1784         case 3:
1785 #if 0 /*JP*/
1786             You("%s under your heavy load.  Movement is very hard.",
1787                 stagger(youmonst.data, "stagger"));
1788 #else
1789             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");
1790 #endif
1791             break;
1792         default:
1793 #if 0 /*JP*/
1794             You("%s move a handspan with this load!",
1795                 newcap == 4 ? "can barely" : "can't even");
1796 #else
1797             You("\82±\82Ì\8fd\82³\82Å\82Í\8f­\82µ\82à\93®\82¯\82È\82¢\81I");
1798 #endif
1799             break;
1800         }
1801         context.botl = 1;
1802     } else if (oldcap > newcap) {
1803         switch (newcap) {
1804         case 0:
1805 /*JP
1806             Your("movements are now unencumbered.");
1807 */
1808             Your("\93®\82«\82Í\8ay\82É\82È\82Á\82½\81D");
1809             break;
1810         case 1:
1811 /*JP
1812             Your("movements are only slowed slightly by your load.");
1813 */
1814             You("\82¿\82å\82Á\82Æ\93®\82«\82â\82·\82­\82È\82Á\82½\81D");
1815             break;
1816         case 2:
1817 /*JP
1818             You("rebalance your load.  Movement is still difficult.");
1819 */
1820             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");
1821             break;
1822         case 3:
1823 #if 0 /*JP*/
1824             You("%s under your load.  Movement is still very hard.",
1825                 stagger(youmonst.data, "stagger"));
1826 #else
1827             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");
1828 #endif
1829             break;
1830         }
1831         context.botl = 1;
1832     }
1833
1834     oldcap = newcap;
1835     return newcap;
1836 }
1837
1838 /* Is there a container at x,y. Optional: return count of containers at x,y */
1839 int
1840 container_at(x, y, countem)
1841 int x, y;
1842 boolean countem;
1843 {
1844     struct obj *cobj, *nobj;
1845     int container_count = 0;
1846
1847     for (cobj = level.objects[x][y]; cobj; cobj = nobj) {
1848         nobj = cobj->nexthere;
1849         if (Is_container(cobj)) {
1850             container_count++;
1851             if (!countem)
1852                 break;
1853         }
1854     }
1855     return container_count;
1856 }
1857
1858 STATIC_OVL boolean
1859 able_to_loot(x, y, looting)
1860 int x, y;
1861 boolean looting; /* loot vs tip */
1862 {
1863 /*JP
1864     const char *verb = looting ? "loot" : "tip";
1865 */
1866     const char *verb = looting ? "\8aJ\82¯\82é" : "\82Ð\82Á\82­\82è\95Ô\82·";
1867
1868     if (!can_reach_floor(TRUE)) {
1869         if (u.usteed && P_SKILL(P_RIDING) < P_BASIC)
1870             rider_cant_reach(); /* not skilled enough to reach */
1871         else
1872             cant_reach_floor(x, y, FALSE, TRUE);
1873         return FALSE;
1874     } else if ((is_pool(x, y) && (looting || !Underwater)) || is_lava(x, y)) {
1875         /* at present, can't loot in water even when Underwater;
1876            can tip underwater, but not when over--or stuck in--lava */
1877 #if 0 /*JP:T*/
1878         You("cannot %s things that are deep in the %s.", verb,
1879             hliquid(is_lava(x, y) ? "lava" : "water"));
1880 #else
1881         You("%s\82É\90[\82­\82É\92¾\82ñ\82¾\82à\82Ì\82ð%s\82±\82Æ\82Í\82Å\82«\82È\82¢\81D",
1882             hliquid(is_lava(u.ux, u.uy) ? "\97n\8aâ" : "\90\85"), verb);
1883 #endif
1884         return FALSE;
1885     } else if (nolimbs(youmonst.data)) {
1886 /*JP
1887         pline("Without limbs, you cannot %s anything.", verb);
1888 */
1889         pline("\8eè\91«\82ª\82È\82¢\82Ì\82Å\81C%s\82±\82Æ\82Í\82Å\82«\82È\82¢\81D", verb);
1890         return FALSE;
1891     } else if (looting && !freehand()) {
1892 /*JP
1893         pline("Without a free %s, you cannot loot anything.",
1894 */
1895         pline("\8e©\97R\82É\82È\82é%s\82ª\82È\82¢\82Ì\82Å\81C\8aJ\82¯\82é\82±\82Æ\82Í\82Å\82«\82È\82¢\81D",
1896               body_part(HAND));
1897         return FALSE;
1898     }
1899     return TRUE;
1900 }
1901
1902 STATIC_OVL boolean
1903 mon_beside(x, y)
1904 int x, y;
1905 {
1906     int i, j, nx, ny;
1907
1908     for (i = -1; i <= 1; i++)
1909         for (j = -1; j <= 1; j++) {
1910             nx = x + i;
1911             ny = y + j;
1912             if (isok(nx, ny) && MON_AT(nx, ny))
1913                 return TRUE;
1914         }
1915     return FALSE;
1916 }
1917
1918 int
1919 do_loot_cont(cobjp, cindex, ccount)
1920 struct obj **cobjp;
1921 int cindex, ccount; /* index of this container (1..N), number of them (N) */
1922 {
1923     struct obj *cobj = *cobjp;
1924
1925     if (!cobj)
1926         return 0;
1927     if (cobj->olocked) {
1928         if (ccount < 2)
1929 #if 0 /*JP:T*/
1930             pline("%s locked.",
1931                   cobj->lknown ? "It is" : "Hmmm, it turns out to be");
1932 #else
1933             pline("%s\8c®\82ª\82©\82©\82Á\82Ä\82¢\82é\81D",
1934                   cobj->lknown ? "" : "\82Þ\81[\82ñ\81C");
1935 #endif
1936         else if (cobj->lknown)
1937 /*JP
1938             pline("%s is locked.", The(xname(cobj)));
1939 */
1940             pline("%s\82Í\8c®\82ª\82©\82©\82Á\82Ä\82¢\82é\81D", xname(cobj));
1941         else
1942 /*JP
1943             pline("Hmmm, %s turns out to be locked.", the(xname(cobj)));
1944 */
1945             pline("\82Þ\81[\82ñ\81C%s\82Í\8c®\82ª\82©\82©\82Á\82Ä\82¢\82é\81D", xname(cobj));
1946         cobj->lknown = 1;
1947         return 0;
1948     }
1949     cobj->lknown = 1;
1950
1951     if (cobj->otyp == BAG_OF_TRICKS) {
1952         int tmp;
1953
1954 /*JP
1955         You("carefully open %s...", the(xname(cobj)));
1956 */
1957         You("\90T\8fd\82É%s\82ð\8aJ\82¯\82½\81D\81D\81D", xname(cobj));
1958 /*JP
1959         pline("It develops a huge set of teeth and bites you!");
1960 */
1961         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");
1962         tmp = rnd(10);
1963 /*JP
1964         losehp(Maybe_Half_Phys(tmp), "carnivorous bag", KILLED_BY_AN);
1965 */
1966         losehp(Maybe_Half_Phys(tmp), "\90H\93÷\8a\93\82É\8a\9a\82Ü\82ê\82Ä", KILLED_BY_AN);
1967         makeknown(BAG_OF_TRICKS);
1968         abort_looting = TRUE;
1969         return 1;
1970     }
1971
1972 /*JP
1973     You("%sopen %s...", (!cobj->cknown || !cobj->lknown) ? "carefully " : "",
1974 */
1975     You("%s%s\82ð\8aJ\82¯\82½\81D\81D\81D", (!cobj->cknown || !cobj->lknown) ? "\90T\8fd\82É" : "",
1976         the(xname(cobj)));
1977     return use_container(cobjp, 0, (boolean) (cindex < ccount));
1978 }
1979
1980 /* loot a container on the floor or loot saddle from mon. */
1981 int
1982 doloot()
1983 {
1984     struct obj *cobj, *nobj;
1985     register int c = -1;
1986     int timepassed = 0;
1987     coord cc;
1988     boolean underfoot = TRUE;
1989 #if 0 /*JP*//*not used*/
1990     const char *dont_find_anything = "don't find anything";
1991 #endif
1992     struct monst *mtmp;
1993     char qbuf[BUFSZ];
1994     int prev_inquiry = 0;
1995     boolean prev_loot = FALSE;
1996     int num_conts = 0;
1997
1998     abort_looting = FALSE;
1999
2000     if (check_capacity((char *) 0)) {
2001         /* "Can't do that while carrying so much stuff." */
2002         return 0;
2003     }
2004     if (nohands(youmonst.data)) {
2005 #if 0 /*JP*/
2006         You("have no hands!"); /* not `body_part(HAND)' */
2007 #else
2008         pline("\82 \82È\82½\82É\82Í\8eè\82ª\82È\82¢\81I");
2009 #endif
2010         return 0;
2011     }
2012     if (Confusion) {
2013         if (rn2(6) && reverse_loot())
2014             return 1;
2015         if (rn2(2)) {
2016 /*JP
2017             pline("Being confused, you find nothing to loot.");
2018 */
2019             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");
2020             return 1; /* costs a turn */
2021         }             /* else fallthrough to normal looting */
2022     }
2023     cc.x = u.ux;
2024     cc.y = u.uy;
2025
2026     if (iflags.menu_requested)
2027         goto lootmon;
2028
2029  lootcont:
2030     if ((num_conts = container_at(cc.x, cc.y, TRUE)) > 0) {
2031         boolean anyfound = FALSE;
2032
2033         if (!able_to_loot(cc.x, cc.y, TRUE))
2034             return 0;
2035
2036         if (Blind && !uarmg) {
2037             /* if blind and without gloves, attempting to #loot at the
2038                location of a cockatrice corpse is fatal before asking
2039                whether to manipulate any containers */
2040             for (nobj = sobj_at(CORPSE, cc.x, cc.y); nobj;
2041                  nobj = nxtobj(nobj, CORPSE, TRUE))
2042                 if (will_feel_cockatrice(nobj, FALSE)) {
2043                     feel_cockatrice(nobj, FALSE);
2044                     /* if life-saved (or poly'd into stone golem),
2045                        terminate attempt to loot */
2046                     return 1;
2047                 }
2048         }
2049
2050         if (num_conts > 1) {
2051             /* use a menu to loot many containers */
2052             int n, i;
2053             winid win;
2054             anything any;
2055             menu_item *pick_list = (menu_item *) 0;
2056
2057             any.a_void = 0;
2058             win = create_nhwindow(NHW_MENU);
2059             start_menu(win);
2060
2061             for (cobj = level.objects[cc.x][cc.y]; cobj;
2062                  cobj = cobj->nexthere)
2063                 if (Is_container(cobj)) {
2064                     any.a_obj = cobj;
2065                     add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
2066                              doname(cobj), MENU_UNSELECTED);
2067                 }
2068 /*JP
2069             end_menu(win, "Loot which containers?");
2070 */
2071             end_menu(win, "\82Ç\82ê\82ð\8aJ\82¯\82Ü\82·\82©\81H");
2072             n = select_menu(win, PICK_ANY, &pick_list);
2073             destroy_nhwindow(win);
2074
2075             if (n > 0) {
2076                 for (i = 1; i <= n; i++) {
2077                     cobj = pick_list[i - 1].item.a_obj;
2078                     timepassed |= do_loot_cont(&cobj, i, n);
2079                     if (abort_looting) {
2080                         /* chest trap or magic bag explosion or <esc> */
2081                         free((genericptr_t) pick_list);
2082                         return timepassed;
2083                     }
2084                 }
2085                 free((genericptr_t) pick_list);
2086             }
2087             if (n != 0)
2088                 c = 'y';
2089         } else {
2090             for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) {
2091                 nobj = cobj->nexthere;
2092
2093                 if (Is_container(cobj)) {
2094 #if 0 /*JP*/
2095                     c = ynq(safe_qbuf(qbuf, "There is ", " here, loot it?",
2096                                       cobj, doname, ansimpleoname,
2097                                       "a container"));
2098 #else
2099                     c = ynq(safe_qbuf(qbuf, "\82±\82±\82É\82Í", "\82ª\82 \82é\81C\8aJ\82¯\82Ü\82·\82©\81H",
2100                                       cobj, doname, ansimpleoname,
2101                                       "\93ü\82ê\95¨"));
2102 #endif
2103                     if (c == 'q')
2104                         return timepassed;
2105                     if (c == 'n')
2106                         continue;
2107                     anyfound = TRUE;
2108
2109                     timepassed |= do_loot_cont(&cobj, 1, 1);
2110                     if (abort_looting)
2111                         /* chest trap or magic bag explosion or <esc> */
2112                         return timepassed;
2113                 }
2114             }
2115             if (anyfound)
2116                 c = 'y';
2117         }
2118     } else if (IS_GRAVE(levl[cc.x][cc.y].typ)) {
2119 /*JP
2120         You("need to dig up the grave to effectively loot it...");
2121 */
2122         You("\95æ\8dr\82ç\82µ\82ð\82·\82é\82É\82Í\8c@\82ç\82È\82­\82Ä\82Í\81D\81D\81D");
2123     }
2124
2125     /*
2126      * 3.3.1 introduced directional looting for some things.
2127      */
2128  lootmon:
2129     if (c != 'y' && mon_beside(u.ux, u.uy)) {
2130 /*JP
2131         if (!get_adjacent_loc("Loot in what direction?",
2132 */
2133         if (!get_adjacent_loc("\82Ç\82Ì\95û\8cü\82ð\92²\82×\82é\81H",
2134 /*JP
2135                               "Invalid loot location", u.ux, u.uy, &cc))
2136 */
2137                               "\96³\8cø\82È\95û\8cü", u.ux, u.uy, &cc))
2138             return 0;
2139         if (cc.x == u.ux && cc.y == u.uy) {
2140             underfoot = TRUE;
2141             if (container_at(cc.x, cc.y, FALSE))
2142                 goto lootcont;
2143         } else
2144             underfoot = FALSE;
2145         if (u.dz < 0) {
2146 #if 0 /*JP*/
2147             You("%s to loot on the %s.", dont_find_anything,
2148                 ceiling(cc.x, cc.y));
2149 #else
2150             You("%s\82ð\92²\82×\82½\82ª\89½\82à\82Ý\82Â\82©\82ç\82È\82©\82Á\82½\81D",
2151                 ceiling(cc.x, cc.y));
2152 #endif
2153             timepassed = 1;
2154             return timepassed;
2155         }
2156         mtmp = m_at(cc.x, cc.y);
2157         if (mtmp)
2158             timepassed = loot_mon(mtmp, &prev_inquiry, &prev_loot);
2159         /* always use a turn when choosing a direction is impaired,
2160            even if you've successfully targetted a saddled creature
2161            and then answered "no" to the "remove its saddle?" prompt */
2162         if (Confusion || Stunned)
2163             timepassed = 1;
2164
2165         /* Preserve pre-3.3.1 behaviour for containers.
2166          * Adjust this if-block to allow container looting
2167          * from one square away to change that in the future.
2168          */
2169         if (!underfoot) {
2170             if (container_at(cc.x, cc.y, FALSE)) {
2171                 if (mtmp) {
2172 #if 0 /*JP*/
2173                     You_cant("loot anything %sthere with %s in the way.",
2174                              prev_inquiry ? "else " : "", mon_nam(mtmp));
2175 #else
2176                     pline("%s\82ª\82¢\82é\82Ì\82Å%s\94 \82ð\8aJ\82¯\82ç\82ê\82È\82¢\81D",
2177                             mon_nam(mtmp), prev_inquiry ? "\82Ù\82©\82Ì" : "");
2178 #endif
2179                     return timepassed;
2180                 } else {
2181 #if 0 /*JP*/
2182                     You("have to be at a container to loot it.");
2183 #else
2184                     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");
2185 #endif
2186                 }
2187             } else {
2188 #if 0 /*JP*/
2189                 You("%s %sthere to loot.", dont_find_anything,
2190                     (prev_inquiry || prev_loot) ? "else " : "");
2191 #else
2192                 pline("\82±\82±\82É\82Í%s\8aJ\82¯\82ç\82ê\82é\82à\82Ì\82Í\82È\82¢\81D",
2193                     (prev_inquiry || prev_loot) ? "\82Ù\82©\82É" : "");
2194 #endif
2195                 return timepassed;
2196             }
2197         }
2198     } else if (c != 'y' && c != 'n') {
2199 #if 0 /*JP*/
2200         You("%s %s to loot.", dont_find_anything,
2201             underfoot ? "here" : "there");
2202 #else
2203         pline("%s\82É\82Í\8aJ\82¯\82ç\82ê\82é\82à\82Ì\82Í\82È\82¢\81D",
2204             underfoot ? "\82±\82±" : "\82»\82±");
2205 #endif
2206     }
2207     return timepassed;
2208 }
2209
2210 /* called when attempting to #loot while confused */
2211 STATIC_OVL boolean
2212 reverse_loot()
2213 {
2214     struct obj *goldob = 0, *coffers, *otmp, boxdummy;
2215     struct monst *mon;
2216     long contribution;
2217     int n, x = u.ux, y = u.uy;
2218
2219     if (!rn2(3)) {
2220         /* n objects: 1/(n+1) chance per object plus 1/(n+1) to fall off end
2221          */
2222         for (n = inv_cnt(TRUE), otmp = invent; otmp; --n, otmp = otmp->nobj)
2223             if (!rn2(n + 1)) {
2224 /*JP
2225                 prinv("You find old loot:", otmp, 0L);
2226 */
2227                 prinv("\88È\91O\8aJ\82¯\82½\82à\82Ì:", otmp, 0L);
2228                 return TRUE;
2229             }
2230         return FALSE;
2231     }
2232
2233     /* find a money object to mess with */
2234     for (goldob = invent; goldob; goldob = goldob->nobj)
2235         if (goldob->oclass == COIN_CLASS) {
2236             contribution = ((long) rnd(5) * goldob->quan + 4L) / 5L;
2237             if (contribution < goldob->quan)
2238                 goldob = splitobj(goldob, contribution);
2239             break;
2240         }
2241     if (!goldob)
2242         return FALSE;
2243
2244     if (!IS_THRONE(levl[x][y].typ)) {
2245         dropx(goldob);
2246         /* the dropped gold might have fallen to lower level */
2247         if (g_at(x, y))
2248 /*JP
2249             pline("Ok, now there is loot here.");
2250 */
2251             pline("\83I\81[\83P\81[\81C\82±\82±\82É\98d\98G\82ð\92u\82¢\82Ä\82¨\82±\82¤\81D");
2252     } else {
2253         /* find original coffers chest if present, otherwise use nearest one
2254          */
2255         otmp = 0;
2256         for (coffers = fobj; coffers; coffers = coffers->nobj)
2257             if (coffers->otyp == CHEST) {
2258                 if (coffers->spe == 2)
2259                     break; /* a throne room chest */
2260                 if (!otmp
2261                     || distu(coffers->ox, coffers->oy)
2262                            < distu(otmp->ox, otmp->oy))
2263                     otmp = coffers; /* remember closest ordinary chest */
2264             }
2265         if (!coffers)
2266             coffers = otmp;
2267
2268         if (coffers) {
2269 /*JP
2270             verbalize("Thank you for your contribution to reduce the debt.");
2271 */
2272             verbalize("\90Ô\8e\9a\8d\91\8dÂ\95Ô\8dÏ\82Ì\82½\82ß\82Ì\8añ\95t\82É\8a´\8eÓ\82µ\82Ü\82·\81D");
2273             freeinv(goldob);
2274             (void) add_to_container(coffers, goldob);
2275             coffers->owt = weight(coffers);
2276             coffers->cknown = 0;
2277             if (!coffers->olocked) {
2278                 boxdummy = zeroobj, boxdummy.otyp = SPE_WIZARD_LOCK;
2279                 (void) boxlock(coffers, &boxdummy);
2280             }
2281         } else if (levl[x][y].looted != T_LOOTED
2282                    && (mon = makemon(courtmon(), x, y, NO_MM_FLAGS)) != 0) {
2283             freeinv(goldob);
2284             add_to_minv(mon, goldob);
2285 /*JP
2286             pline("The exchequer accepts your contribution.");
2287 */
2288             pline("\8dà\96±\8fÈ\82Í\82 \82È\82½\82Ì\8añ\95t\82ð\8eó\82¯\82Æ\82Á\82½\81D");
2289             if (!rn2(10))
2290                 levl[x][y].looted = T_LOOTED;
2291         } else {
2292 /*JP
2293             You("drop %s.", doname(goldob));
2294 */
2295             You("%s\82ð\97\8e\82µ\82½\81D", doname(goldob));
2296             dropx(goldob);
2297         }
2298     }
2299     return TRUE;
2300 }
2301
2302 /* loot_mon() returns amount of time passed.
2303  */
2304 int
2305 loot_mon(mtmp, passed_info, prev_loot)
2306 struct monst *mtmp;
2307 int *passed_info;
2308 boolean *prev_loot;
2309 {
2310     int c = -1;
2311     int timepassed = 0;
2312     struct obj *otmp;
2313     char qbuf[QBUFSZ];
2314
2315     /* 3.3.1 introduced the ability to remove saddle from a steed.
2316      *  *passed_info is set to TRUE if a loot query was given.
2317      *  *prev_loot is set to TRUE if something was actually acquired in here.
2318      */
2319     if (mtmp && mtmp != u.usteed && (otmp = which_armor(mtmp, W_SADDLE))) {
2320         long unwornmask;
2321
2322         if (passed_info)
2323             *passed_info = 1;
2324 #if 0 /*JP*/
2325         Sprintf(qbuf, "Do you want to remove the saddle from %s?",
2326                 x_monnam(mtmp, ARTICLE_THE, (char *) 0,
2327                          SUPPRESS_SADDLE, FALSE));
2328 #else
2329         Sprintf(qbuf, "%s\82©\82ç\88Æ\82ð\82Í\82¸\82µ\82Ü\82·\82©\81H",
2330                 x_monnam(mtmp, ARTICLE_THE, (char *) 0,
2331                          SUPPRESS_SADDLE, FALSE));
2332 #endif
2333         if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y') {
2334             if (nolimbs(youmonst.data)) {
2335 #if 0 /*JP*/
2336                 You_cant("do that without limbs."); /* not body_part(HAND) */
2337 #else
2338                 You_cant("\8eè\82ª\82È\82¢\82Æ\82Å\82«\82È\82¢\81D");
2339 #endif
2340                 return 0;
2341             }
2342             if (otmp->cursed) {
2343 /*JP
2344                 You("can't.  The saddle seems to be stuck to %s.",
2345 */
2346                 pline("\88Æ\82Í%s\82É\82­\82Á\82Â\82¢\82Ä\82¢\82é\82æ\82¤\82¾\81D",
2347                     x_monnam(mtmp, ARTICLE_THE, (char *) 0,
2348                              SUPPRESS_SADDLE, FALSE));
2349                 /* the attempt costs you time */
2350                 return 1;
2351             }
2352             obj_extract_self(otmp);
2353             if ((unwornmask = otmp->owornmask) != 0L) {
2354                 mtmp->misc_worn_check &= ~unwornmask;
2355                 otmp->owornmask = 0L;
2356                 update_mon_intrinsics(mtmp, otmp, FALSE, FALSE);
2357             }
2358 /*JP
2359             otmp = hold_another_object(otmp, "You drop %s!", doname(otmp),
2360 */
2361             otmp = hold_another_object(otmp, "%s\82ð\97\8e\82Æ\82µ\82½\81I", doname(otmp),
2362                                        (const char *) 0);
2363             nhUse(otmp);
2364             timepassed = rnd(3);
2365             if (prev_loot)
2366                 *prev_loot = TRUE;
2367         } else if (c == 'q') {
2368             return 0;
2369         }
2370     }
2371     /* 3.4.0 introduced ability to pick things up from swallower's stomach */
2372     if (u.uswallow) {
2373         int count = passed_info ? *passed_info : 0;
2374
2375         timepassed = pickup(count);
2376     }
2377     return timepassed;
2378 }
2379
2380 /*
2381  * Decide whether an object being placed into a magic bag will cause
2382  * it to explode.  If the object is a bag itself, check recursively.
2383  */
2384 STATIC_OVL boolean
2385 mbag_explodes(obj, depthin)
2386 struct obj *obj;
2387 int depthin;
2388 {
2389     /* these won't cause an explosion when they're empty */
2390     if ((obj->otyp == WAN_CANCELLATION || obj->otyp == BAG_OF_TRICKS)
2391         && obj->spe <= 0)
2392         return FALSE;
2393
2394     /* odds: 1/1, 2/2, 3/4, 4/8, 5/16, 6/32, 7/64, 8/128, 9/128, 10/128,... */
2395     if ((Is_mbag(obj) || obj->otyp == WAN_CANCELLATION)
2396         && (rn2(1 << (depthin > 7 ? 7 : depthin)) <= depthin))
2397         return TRUE;
2398     else if (Has_contents(obj)) {
2399         struct obj *otmp;
2400
2401         for (otmp = obj->cobj; otmp; otmp = otmp->nobj)
2402             if (mbag_explodes(otmp, depthin + 1))
2403                 return TRUE;
2404     }
2405     return FALSE;
2406 }
2407
2408 STATIC_OVL long
2409 boh_loss(container, held)
2410 struct obj *container;
2411 int held;
2412 {
2413     /* sometimes toss objects if a cursed magic bag */
2414     if (Is_mbag(container) && container->cursed && Has_contents(container)) {
2415         long loss = 0L;
2416         struct obj *curr, *otmp;
2417
2418         for (curr = container->cobj; curr; curr = otmp) {
2419             otmp = curr->nobj;
2420             if (!rn2(13)) {
2421                 obj_extract_self(curr);
2422                 loss += mbag_item_gone(held, curr);
2423             }
2424         }
2425         return loss;
2426     }
2427     return 0;
2428 }
2429
2430 /* Returns: -1 to stop, 1 item was inserted, 0 item was not inserted. */
2431 STATIC_PTR int
2432 in_container(obj)
2433 register struct obj *obj;
2434 {
2435     boolean floor_container = !carried(current_container);
2436     boolean was_unpaid = FALSE;
2437     char buf[BUFSZ];
2438
2439     if (!current_container) {
2440         impossible("<in> no current_container?");
2441         return 0;
2442     } else if (obj == uball || obj == uchain) {
2443 /*JP
2444         You("must be kidding.");
2445 */
2446         pline("\82²\8fç\92k\82ð\81D");
2447         return 0;
2448     } else if (obj == current_container) {
2449 /*JP
2450         pline("That would be an interesting topological exercise.");
2451 */
2452         pline("\82»\82ê\82Í\8b»\96¡\82ð\82»\82»\82ç\82ê\82é\83g\83|\83\8d\83W\81[\82Ì\96â\91è\82¾\81D");
2453         return 0;
2454     } else if (obj->owornmask & (W_ARMOR | W_ACCESSORY)) {
2455 #if 0 /*JP*/
2456         Norep("You cannot %s %s you are wearing.",
2457               Icebox ? "refrigerate" : "stash", something);
2458 #else
2459         Norep("\90g\82É\82Â\82¯\82Ä\82¢\82é\82à\82Ì\82ð%s\82±\82Æ\82Í\82Å\82«\82È\82¢\81D", 
2460               Icebox ? "\97â\93\80\82·\82é" : "\82µ\82Ü\82¤");
2461 #endif
2462         return 0;
2463     } else if ((obj->otyp == LOADSTONE) && obj->cursed) {
2464         obj->bknown = 1;
2465 /*JP
2466         pline_The("stone%s won't leave your person.", plur(obj->quan));
2467 */
2468         pline("\82Ç\82¤\82¢\82¤\82í\82¯\82©\82»\82Ì\90Î\82ð\82µ\82Ü\82¤\82±\82Æ\82Í\82Å\82«\82È\82¢\81D");
2469         return 0;
2470     } else if (obj->otyp == AMULET_OF_YENDOR
2471                || obj->otyp == CANDELABRUM_OF_INVOCATION
2472                || obj->otyp == BELL_OF_OPENING
2473                || obj->otyp == SPE_BOOK_OF_THE_DEAD) {
2474         /* Prohibit Amulets in containers; if you allow it, monsters can't
2475          * steal them.  It also becomes a pain to check to see if someone
2476          * has the Amulet.  Ditto for the Candelabrum, the Bell and the Book.
2477          */
2478 /*JP
2479         pline("%s cannot be confined in such trappings.", The(xname(obj)));
2480 */
2481         pline("%s\82Í\8bl\82ß\82é\82±\82Æ\82Í\82Å\82«\82È\82¢\81D", The(xname(obj)));
2482         return 0;
2483     } else if (obj->otyp == LEASH && obj->leashmon != 0) {
2484 /*JP
2485         pline("%s attached to your pet.", Tobjnam(obj, "are"));
2486 */
2487         pline("%s\82Í\83y\83b\83g\82É\95t\82¯\82ç\82ê\82Ä\82¢\82é\81D", xname(obj));
2488         return 0;
2489     } else if (obj == uwep) {
2490         if (welded(obj)) {
2491             weldmsg(obj);
2492             return 0;
2493         }
2494         setuwep((struct obj *) 0);
2495         /* This uwep check is obsolete.  It dates to 3.0 and earlier when
2496          * unwielding Firebrand would be fatal in hell if hero had no other
2497          * fire resistance.  Life-saving would force it to be re-wielded.
2498          */
2499         if (uwep)
2500             return 0; /* unwielded, died, rewielded */
2501     } else if (obj == uswapwep) {
2502         setuswapwep((struct obj *) 0);
2503     } else if (obj == uquiver) {
2504         setuqwep((struct obj *) 0);
2505     }
2506
2507     if (fatal_corpse_mistake(obj, FALSE))
2508         return -1;
2509
2510     /* boxes, boulders, and big statues can't fit into any container */
2511     if (obj->otyp == ICE_BOX || Is_box(obj) || obj->otyp == BOULDER
2512         || (obj->otyp == STATUE && bigmonst(&mons[obj->corpsenm]))) {
2513         /*
2514          *  xname() uses a static result array.  Save obj's name
2515          *  before current_container's name is computed.  Don't
2516          *  use the result of strcpy() within You() --- the order
2517          *  of evaluation of the parameters is undefined.
2518          */
2519         Strcpy(buf, the(xname(obj)));
2520 /*JP
2521         You("cannot fit %s into %s.", buf, the(xname(current_container)));
2522 */
2523         pline("%s\82ð%s\82É\8bl\82ß\8d\9e\82Þ\82±\82Æ\82Í\82Å\82«\82È\82¢\81D", buf, the(xname(current_container)));
2524         return 0;
2525     }
2526
2527     freeinv(obj);
2528
2529     if (obj_is_burning(obj)) /* this used to be part of freeinv() */
2530         (void) snuff_lit(obj);
2531
2532     if (floor_container && costly_spot(u.ux, u.uy)) {
2533         /* defer gold until after put-in message */
2534         if (obj->oclass != COIN_CLASS) {
2535             /* sellobj() will take an unpaid item off the shop bill */
2536             was_unpaid = obj->unpaid ? TRUE : FALSE;
2537             /* don't sell when putting the item into your own container,
2538              * but handle billing correctly */
2539             sellobj_state(current_container->no_charge
2540                           ? SELL_DONTSELL : SELL_DELIBERATE);
2541             sellobj(obj, u.ux, u.uy);
2542             sellobj_state(SELL_NORMAL);
2543         }
2544     }
2545     if (Icebox && !age_is_relative(obj)) {
2546         obj->age = monstermoves - obj->age; /* actual age */
2547         /* stop any corpse timeouts when frozen */
2548         if (obj->otyp == CORPSE && obj->timed) {
2549             long rot_alarm = stop_timer(ROT_CORPSE, obj_to_any(obj));
2550
2551             (void) stop_timer(REVIVE_MON, obj_to_any(obj));
2552             /* mark a non-reviving corpse as such */
2553             if (rot_alarm)
2554                 obj->norevive = 1;
2555         }
2556     } else if (Is_mbag(current_container) && mbag_explodes(obj, 0)) {
2557         /* explicitly mention what item is triggering the explosion */
2558 /*JP
2559         pline("As you put %s inside, you are blasted by a magical explosion!",
2560 */
2561         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",
2562               doname(obj));
2563         /* did not actually insert obj yet */
2564         if (was_unpaid)
2565             addtobill(obj, FALSE, FALSE, TRUE);
2566         obfree(obj, (struct obj *) 0);
2567         /* if carried, shop goods will be flagged 'unpaid' and obfree() will
2568            handle bill issues, but if on floor, we need to put them on bill
2569            before deleting them (non-shop items will be flagged 'no_charge') */
2570         if (floor_container
2571             && costly_spot(current_container->ox, current_container->oy)) {
2572             struct obj save_no_charge;
2573
2574             save_no_charge.no_charge = current_container->no_charge;
2575             addtobill(current_container, FALSE, FALSE, FALSE);
2576             /* addtobill() clears no charge; we need to set it back
2577                so that useupf() doesn't double bill */
2578             current_container->no_charge = save_no_charge.no_charge;
2579         }
2580         delete_contents(current_container);
2581         if (!floor_container)
2582             useup(current_container);
2583         else if (obj_here(current_container, u.ux, u.uy))
2584             useupf(current_container, current_container->quan);
2585         else
2586             panic("in_container:  bag not found.");
2587
2588 /*JP
2589         losehp(d(6, 6), "magical explosion", KILLED_BY_AN);
2590 */
2591         losehp(d(6, 6), "\96\82\96@\82Ì\94\9a\94­\82Å", KILLED_BY_AN);
2592         current_container = 0; /* baggone = TRUE; */
2593     }
2594
2595     if (current_container) {
2596         Strcpy(buf, the(xname(current_container)));
2597 /*JP
2598         You("put %s into %s.", doname(obj), buf);
2599 */
2600         You("%s\82ð%s\82Ì\92\86\82É\82µ\82Ü\82Á\82½\81D", doname(obj), buf);
2601
2602         /* gold in container always needs to be added to credit */
2603         if (floor_container && obj->oclass == COIN_CLASS)
2604             sellobj(obj, current_container->ox, current_container->oy);
2605         (void) add_to_container(current_container, obj);
2606         current_container->owt = weight(current_container);
2607     }
2608     /* gold needs this, and freeinv() many lines above may cause
2609      * the encumbrance to disappear from the status, so just always
2610      * update status immediately.
2611      */
2612     bot();
2613     return (current_container ? 1 : -1);
2614 }
2615
2616 /* askchain() filter used by in_container();
2617  * returns True if the container is intact and 'obj' isn't it, False if
2618  * container is gone (magic bag explosion) or 'obj' is the container itself;
2619  * also used by getobj() when picking a single item to stash
2620  */
2621 int
2622 ck_bag(obj)
2623 struct obj *obj;
2624 {
2625     return (current_container && obj != current_container);
2626 }
2627
2628 /* Returns: -1 to stop, 1 item was removed, 0 item was not removed. */
2629 STATIC_PTR int
2630 out_container(obj)
2631 register struct obj *obj;
2632 {
2633     register struct obj *otmp;
2634     boolean is_gold = (obj->oclass == COIN_CLASS);
2635     int res, loadlev;
2636     long count;
2637
2638     if (!current_container) {
2639         impossible("<out> no current_container?");
2640         return -1;
2641     } else if (is_gold) {
2642         obj->owt = weight(obj);
2643     }
2644
2645     if (obj->oartifact && !touch_artifact(obj, &youmonst))
2646         return 0;
2647
2648     if (fatal_corpse_mistake(obj, FALSE))
2649         return -1;
2650
2651     count = obj->quan;
2652     if ((res = lift_object(obj, current_container, &count, FALSE)) <= 0)
2653         return res;
2654
2655     if (obj->quan != count && obj->otyp != LOADSTONE)
2656         obj = splitobj(obj, count);
2657
2658     /* Remove the object from the list. */
2659     obj_extract_self(obj);
2660     current_container->owt = weight(current_container);
2661
2662     if (Icebox)
2663         removed_from_icebox(obj);
2664
2665     if (!obj->unpaid && !carried(current_container)
2666         && costly_spot(current_container->ox, current_container->oy)) {
2667         obj->ox = current_container->ox;
2668         obj->oy = current_container->oy;
2669         addtobill(obj, FALSE, FALSE, FALSE);
2670     }
2671     if (is_pick(obj))
2672         pick_pick(obj); /* shopkeeper feedback */
2673
2674     otmp = addinv(obj);
2675     loadlev = near_capacity();
2676     prinv(loadlev ? ((loadlev < MOD_ENCUMBER)
2677 /*JP
2678                         ? "You have a little trouble removing"
2679 */
2680                         ? "\82ð\89^\82Ô\82Ì\82Í\8f­\81X\8d¢\93ï\82¾\81D"
2681 /*JP
2682                                         : "You have much trouble removing")
2683 */
2684                                         : "\82ð\89^\82Ô\82Ì\82Í\82©\82È\82è\8d¢\93ï\82¾\81D")
2685                   : (char *) 0,
2686           otmp, count);
2687
2688     if (is_gold) {
2689         bot(); /* update character's gold piece count immediately */
2690     }
2691     return 1;
2692 }
2693
2694 /* taking a corpse out of an ice box needs a couple of adjustments */
2695 STATIC_OVL void
2696 removed_from_icebox(obj)
2697 struct obj *obj;
2698 {
2699     if (!age_is_relative(obj)) {
2700         obj->age = monstermoves - obj->age; /* actual age */
2701         if (obj->otyp == CORPSE)
2702             start_corpse_timeout(obj);
2703     }
2704 }
2705
2706 /* an object inside a cursed bag of holding is being destroyed */
2707 STATIC_OVL long
2708 mbag_item_gone(held, item)
2709 int held;
2710 struct obj *item;
2711 {
2712     struct monst *shkp;
2713     long loss = 0L;
2714
2715     if (item->dknown)
2716 /*JP
2717         pline("%s %s vanished!", Doname2(item), otense(item, "have"));
2718 */
2719         pline("%s\82Í\8fÁ\82¦\8b\8e\82Á\82½\81I", Doname2(item));
2720     else
2721 #if 0 /*JP*/
2722         You("%s %s disappear!", Blind ? "notice" : "see", doname(item));
2723 #else
2724         You("%s\82ª\8c©\82¦\82È\82­\82È\82é\82Ì%s\81D", doname(item), Blind ? "\82É\8bC\82Ã\82¢\82½" : "\82ð\8c©\82½");
2725 #endif
2726
2727     if (*u.ushops && (shkp = shop_keeper(*u.ushops)) != 0) {
2728         if (held ? (boolean) item->unpaid : costly_spot(u.ux, u.uy))
2729             loss = stolen_value(item, u.ux, u.uy, (boolean) shkp->mpeaceful,
2730                                 TRUE);
2731     }
2732     obfree(item, (struct obj *) 0);
2733     return loss;
2734 }
2735
2736 /* used for #loot/apply, #tip, and final disclosure */
2737 void
2738 observe_quantum_cat(box, makecat, givemsg)
2739 struct obj *box;
2740 boolean makecat, givemsg;
2741 {
2742 /*JP
2743     static NEARDATA const char sc[] = "Schroedinger's Cat";
2744 */
2745     static NEARDATA const char sc[] = "\83V\83\85\83\8c\83f\83B\83\93\83K\81[\82Ì\94L";
2746     struct obj *deadcat;
2747     struct monst *livecat = 0;
2748     xchar ox, oy;
2749     boolean itsalive = !rn2(2);
2750
2751     if (get_obj_location(box, &ox, &oy, 0))
2752         box->ox = ox, box->oy = oy; /* in case it's being carried */
2753
2754     /* this isn't really right, since any form of observation
2755        (telepathic or monster/object/food detection) ought to
2756        force the determination of alive vs dead state; but basing it
2757        just on opening or disclosing the box is much simpler to cope with */
2758
2759     /* SchroedingersBox already has a cat corpse in it */
2760     deadcat = box->cobj;
2761     if (itsalive) {
2762         if (makecat)
2763             livecat = makemon(&mons[PM_HOUSECAT], box->ox, box->oy,
2764                               NO_MINVENT | MM_ADJACENTOK);
2765         if (livecat) {
2766             livecat->mpeaceful = 1;
2767             set_malign(livecat);
2768             if (givemsg) {
2769                 if (!canspotmon(livecat))
2770 #if 0 /*JP*/
2771                     You("think %s brushed your %s.", something,
2772                         body_part(FOOT));
2773 #else
2774                     You("%s\82ª\82 \82È\82½\82Ì%s\82ð\82­\82·\82®\82Á\82½\82Æ\8ev\82Á\82½\81D", something,
2775                         body_part(FOOT));
2776 #endif
2777                 else
2778 #if 0 /*JP*/
2779                     pline("%s inside the box is still alive!",
2780                           Monnam(livecat));
2781 #else
2782                     pline("\94 \82Ì\82È\82©\82Ì%s\82Í\82Ü\82¾\90\82«\82Ä\82¢\82é\81I",
2783                           Monnam(livecat));
2784 #endif
2785             }
2786             (void) christen_monst(livecat, sc);
2787             if (deadcat) {
2788                 obj_extract_self(deadcat);
2789                 obfree(deadcat, (struct obj *) 0), deadcat = 0;
2790             }
2791             box->owt = weight(box);
2792             box->spe = 0;
2793         }
2794     } else {
2795         box->spe = 0; /* now an ordinary box (with a cat corpse inside) */
2796         if (deadcat) {
2797             /* set_corpsenm() will start the rot timer that was removed
2798                when makemon() created SchroedingersBox; start it from
2799                now rather than from when this special corpse got created */
2800             deadcat->age = monstermoves;
2801             set_corpsenm(deadcat, PM_HOUSECAT);
2802             deadcat = oname(deadcat, sc);
2803         }
2804         if (givemsg)
2805 #if 0 /*JP:T*/
2806             pline_The("%s inside the box is dead!",
2807                       Hallucination ? rndmonnam((char *) 0) : "housecat");
2808 #else
2809             pline_The("\94 \82Ì\92\86\82Ì%s\82Í\8e\80\82ñ\82Å\82¢\82é\81I",
2810                       Hallucination ? rndmonnam((char *) 0) : "\94L");
2811 #endif
2812     }
2813     nhUse(deadcat);
2814     return;
2815 }
2816
2817 #undef Icebox
2818
2819 /* used by askchain() to check for magic bag explosion */
2820 boolean
2821 container_gone(fn)
2822 int FDECL((*fn), (OBJ_P));
2823 {
2824     /* result is only meaningful while use_container() is executing */
2825     return ((fn == in_container || fn == out_container)
2826             && !current_container);
2827 }
2828
2829 STATIC_OVL void
2830 explain_container_prompt(more_containers)
2831 boolean more_containers;
2832 {
2833     static const char *const explaintext[] = {
2834 #if 0 /*JP*/
2835         "Container actions:",
2836         "",
2837         " : -- Look: examine contents",
2838         " o -- Out: take things out",
2839         " i -- In: put things in",
2840         " b -- Both: first take things out, then put things in",
2841         " r -- Reversed: put things in, then take things out",
2842         " s -- Stash: put one item in", "",
2843         " n -- Next: loot next selected container",
2844         " q -- Quit: finished",
2845         " ? -- Help: display this text.",
2846         "", 0
2847 #else
2848         "\93ü\82ê\95¨\82Ö\82Ì\8ds\93®\81F",
2849         "",
2850         " : -- Look: \92\86\90g\82ð\92²\82×\82é",
2851         " o -- Out: \95¨\82ð\8fo\82·",
2852         " i -- In: \95¨\82ð\93ü\82ê\82é",
2853         " b -- Both: \82Ü\82¸\95¨\82ð\8fo\82µ\81A\82»\82ê\82©\82ç\95¨\82ð\93ü\82ê\82é",
2854         " r -- Reversed: \95¨\82ð\93ü\82ê\81A\82»\82ê\82©\82ç\95¨\82ð\8fo\82·",
2855         " s -- Stash: \95¨\82ð\88ê\82Â\93ü\82ê\82é",
2856         " n -- Next: \8e\9f\82É\91I\82ñ\82¾\93ü\82ê\95¨\82ð\92²\82×\82é",
2857         " q -- Quit: \89½\82à\82µ\82È\82¢",
2858         " ? -- Help: \82±\82ê\82ð\95\\8e¦\82·\82é",
2859         "", 0
2860 #endif
2861     };
2862     const char *const *txtpp;
2863     winid win;
2864
2865     /* "Do what with <container>? [:oibrsq or ?] (q)" */
2866     if ((win = create_nhwindow(NHW_TEXT)) != WIN_ERR) {
2867         for (txtpp = explaintext; *txtpp; ++txtpp) {
2868             if (!more_containers && !strncmp(*txtpp, " n ", 3))
2869                 continue;
2870             putstr(win, 0, *txtpp);
2871         }
2872         display_nhwindow(win, FALSE);
2873         destroy_nhwindow(win);
2874     }
2875 }
2876
2877 boolean
2878 u_handsy()
2879 {
2880     if (nohands(youmonst.data)) {
2881 #if 0 /*JP*/
2882         You("have no hands!"); /* not `body_part(HAND)' */
2883 #else
2884         pline("\82 \82È\82½\82É\82Í\8eè\82ª\82È\82¢\81I");  /* not `body_part(HAND)' */
2885 #endif
2886         return FALSE;
2887     } else if (!freehand()) {
2888 /*JP
2889         You("have no free %s.", body_part(HAND));
2890 */
2891         You("%s\82Ì\8e©\97R\82ª\8cø\82©\82È\82¢\81D", body_part(HAND));
2892         return FALSE;
2893     }
2894     return TRUE;
2895 }
2896
2897 static const char stashable[] = { ALLOW_COUNT, COIN_CLASS, ALL_CLASSES, 0 };
2898
2899 int
2900 use_container(objp, held, more_containers)
2901 struct obj **objp;
2902 int held;
2903 boolean more_containers; /* True iff #loot multiple and this isn't last one */
2904 {
2905     struct obj *otmp, *obj = *objp;
2906     boolean quantum_cat, cursed_mbag, loot_out, loot_in, loot_in_first,
2907         stash_one, inokay, outokay, outmaybe;
2908     char c, emptymsg[BUFSZ], qbuf[QBUFSZ], pbuf[QBUFSZ], xbuf[QBUFSZ];
2909     int used = 0;
2910     long loss;
2911
2912     abort_looting = FALSE;
2913     emptymsg[0] = '\0';
2914
2915     if (!u_handsy())
2916         return 0;
2917
2918     if (obj->olocked) {
2919 /*JP
2920         pline("%s locked.", Tobjnam(obj, "are"));
2921 */
2922         pline("%s\82Í\8c®\82ª\82©\82©\82Á\82Ä\82¢\82é\81D", xname(obj));
2923         if (held)
2924 /*JP
2925             You("must put it down to unlock.");
2926 */
2927             if (held) pline("\89º\82É\92u\82©\82È\82¢\82±\82Æ\82É\82Í\8c®\82ð\82Í\82¸\82¹\82È\82¢\81D");
2928         obj->lknown = 1;
2929         return 0;
2930     } else if (obj->otrapped) {
2931         if (held)
2932 /*JP
2933             You("open %s...", the(xname(obj)));
2934 */
2935             You("%s\82ð\8aJ\82¯\82½\81D\81D\81D", the(xname(obj)));
2936         obj->lknown = 1;
2937         (void) chest_trap(obj, HAND, FALSE);
2938         /* even if the trap fails, you've used up this turn */
2939         if (multi >= 0) { /* in case we didn't become paralyzed */
2940             nomul(-1);
2941 /*JP
2942             multi_reason = "opening a container";
2943 */
2944             multi_reason = "\94 \82ð\8aJ\82¯\82Ä\82¢\82é\8e\9e\82É";
2945             nomovemsg = "";
2946         }
2947         abort_looting = TRUE;
2948         return 1;
2949     }
2950     obj->lknown = 1;
2951
2952     current_container = obj; /* for use by in/out_container */
2953     /*
2954      * From here on out, all early returns go through 'containerdone:'.
2955      */
2956
2957     /* check for Schroedinger's Cat */
2958     quantum_cat = SchroedingersBox(current_container);
2959     if (quantum_cat) {
2960         observe_quantum_cat(current_container, TRUE, TRUE);
2961         used = 1;
2962     }
2963
2964     cursed_mbag = Is_mbag(current_container)
2965         && current_container->cursed
2966         && Has_contents(current_container);
2967     if (cursed_mbag
2968         && (loss = boh_loss(current_container, held)) != 0) {
2969         used = 1;
2970 /*JP
2971             You("owe %ld %s for lost merchandise.", loss, currency(loss));
2972 */
2973             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));
2974         current_container->owt = weight(current_container);
2975     }
2976     inokay = (invent != 0
2977               && !(invent == current_container && !current_container->nobj));
2978     outokay = Has_contents(current_container);
2979     if (!outokay) /* preformat the empty-container message */
2980 #if 0 /*JP:T*/
2981         Sprintf(emptymsg, "%s is %sempty.", Ysimple_name2(current_container),
2982                 (quantum_cat || cursed_mbag) ? "now " : "");
2983 #else
2984         Sprintf(emptymsg, "%s\82Í%s\8bó\82Á\82Û\82¾\81D", Ysimple_name2(current_container),
2985                 (quantum_cat || cursed_mbag) ? "\8d¡\82Í" : "");
2986 #endif
2987
2988     /*
2989      * What-to-do prompt's list of possible actions:
2990      * always include the look-inside choice (':');
2991      * include the take-out choice ('o') if container
2992      * has anything in it or if player doesn't yet know
2993      * that it's empty (latter can change on subsequent
2994      * iterations if player picks ':' response);
2995      * include the put-in choices ('i','s') if hero
2996      * carries any inventory (including gold);
2997      * include do-both when 'o' is available, even if
2998      * inventory is empty--taking out could alter that;
2999      * include do-both-reversed when 'i' is available,
3000      * even if container is empty--for similar reason;
3001      * include the next container choice ('n') when
3002      * relevant, and make it the default;
3003      * always include the quit choice ('q'), and make
3004      * it the default if there's no next containter;
3005      * include the help choice (" or ?") if `cmdassist'
3006      * run-time option is set;
3007      * (Player can pick any of (o,i,b,r,n,s,?) even when
3008      * they're not listed among the available actions.)
3009      *
3010      * Do what with <the/your/Shk's container>? [:oibrs nq or ?] (q)
3011      * or
3012      * <The/Your/Shk's container> is empty.  Do what with it? [:irs nq or ?]
3013      */
3014     for (;;) { /* repeats iff '?' or ":' gets chosen */
3015         outmaybe = (outokay || !current_container->cknown);
3016         if (!outmaybe)
3017 #if 0 /*JP*/
3018             (void) safe_qbuf(qbuf, (char *) 0, " is empty.  Do what with it?",
3019                              current_container, Yname2, Ysimple_name2,
3020                              "This");
3021 #else
3022             (void) safe_qbuf(qbuf, (char *) 0, "\82Í\8bó\82¾\81D\82Ç\82¤\82·\82é\81H",
3023                              current_container, Yname2, Ysimple_name2,
3024                              "\82±\82ê");
3025 #endif
3026         else
3027 #if 0 /*JP*/
3028             (void) safe_qbuf(qbuf, "Do what with ", "?", current_container,
3029                              yname, ysimple_name, "it");
3030 #else
3031             (void) safe_qbuf(qbuf, (char *) 0, "\82ð\82Ç\82¤\82·\82é\81H", current_container,
3032                              yname, ysimple_name, "\82±\82ê");
3033 #endif
3034         /* ask player about what to do with this container */
3035         if (flags.menu_style == MENU_PARTIAL
3036             || flags.menu_style == MENU_FULL) {
3037             if (!inokay && !outmaybe) {
3038                 /* nothing to take out, nothing to put in;
3039                    trying to do both will yield proper feedback */
3040                 c = 'b';
3041             } else {
3042                 c = in_or_out_menu(qbuf, current_container, outmaybe, inokay,
3043                                    (boolean) (used != 0), more_containers);
3044             }
3045         } else { /* TRADITIONAL or COMBINATION */
3046             xbuf[0] = '\0'; /* list of extra acceptable responses */
3047             Strcpy(pbuf, ":");                   /* look inside */
3048             Strcat(outmaybe ? pbuf : xbuf, "o"); /* take out */
3049             Strcat(inokay ? pbuf : xbuf, "i");   /* put in */
3050             Strcat(outmaybe ? pbuf : xbuf, "b"); /* both */
3051             Strcat(inokay ? pbuf : xbuf, "rs");  /* reversed, stash */
3052             Strcat(pbuf, " ");                   /* separator */
3053             Strcat(more_containers ? pbuf : xbuf, "n"); /* next container */
3054             Strcat(pbuf, "q");                   /* quit */
3055             if (iflags.cmdassist)
3056                 /* this unintentionally allows user to answer with 'o' or
3057                    'r'; fortunately, those are already valid choices here */
3058                 Strcat(pbuf, " or ?"); /* help */
3059             else
3060                 Strcat(xbuf, "?");
3061             if (*xbuf)
3062                 Strcat(strcat(pbuf, "\033"), xbuf);
3063             c = yn_function(qbuf, pbuf, more_containers ? 'n' : 'q');
3064         } /* PARTIAL|FULL vs other modes */
3065
3066         if (c == '?') {
3067             explain_container_prompt(more_containers);
3068         } else if (c == ':') { /* note: will set obj->cknown */
3069             if (!current_container->cknown)
3070                 used = 1; /* gaining info */
3071             container_contents(current_container, FALSE, FALSE, TRUE);
3072         } else
3073             break;
3074     } /* loop until something other than '?' or ':' is picked */
3075
3076     if (c == 'q')
3077         abort_looting = TRUE;
3078     if (c == 'n' || c == 'q') /* [not strictly needed; falling thru works] */
3079         goto containerdone;
3080     loot_out = (c == 'o' || c == 'b' || c == 'r');
3081     loot_in = (c == 'i' || c == 'b' || c == 'r');
3082     loot_in_first = (c == 'r'); /* both, reversed */
3083     stash_one = (c == 's');
3084
3085     /* out-only or out before in */
3086     if (loot_out && !loot_in_first) {
3087         if (!Has_contents(current_container)) {
3088             pline1(emptymsg); /* <whatever> is empty. */
3089             if (!current_container->cknown)
3090                 used = 1;
3091             current_container->cknown = 1;
3092         } else {
3093             add_valid_menu_class(0); /* reset */
3094             if (flags.menu_style == MENU_TRADITIONAL)
3095                 used |= traditional_loot(FALSE);
3096             else
3097                 used |= (menu_loot(0, FALSE) > 0);
3098             add_valid_menu_class(0);
3099         }
3100     }
3101
3102     if ((loot_in || stash_one)
3103         && (!invent || (invent == current_container && !invent->nobj))) {
3104 #if 0 /*JP*/
3105         You("don't have anything%s to %s.", invent ? " else" : "",
3106             stash_one ? "stash" : "put in");
3107 #else
3108         You("%s\93ü\82ê\82é\82à\82Ì\82ª\82È\82¢\81D", invent ? "\91¼\82É" : "");
3109 #endif
3110         loot_in = stash_one = FALSE;
3111     }
3112
3113     /*
3114      * Gone: being nice about only selecting food if we know we are
3115      * putting things in an ice chest.
3116      */
3117     if (loot_in) {
3118         add_valid_menu_class(0); /* reset */
3119         if (flags.menu_style == MENU_TRADITIONAL)
3120             used |= traditional_loot(TRUE);
3121         else
3122             used |= (menu_loot(0, TRUE) > 0);
3123         add_valid_menu_class(0);
3124     } else if (stash_one) {
3125         /* put one item into container */
3126         if ((otmp = getobj(stashable, "stash")) != 0) {
3127             if (in_container(otmp)) {
3128                 used = 1;
3129             } else {
3130                 /* couldn't put selected item into container for some
3131                    reason; might need to undo splitobj() */
3132                 (void) unsplitobj(otmp);
3133             }
3134         }
3135     }
3136     /* putting something in might have triggered magic bag explosion */
3137     if (!current_container)
3138         loot_out = FALSE;
3139
3140     /* out after in */
3141     if (loot_out && loot_in_first) {
3142         if (!Has_contents(current_container)) {
3143             pline1(emptymsg); /* <whatever> is empty. */
3144             if (!current_container->cknown)
3145                 used = 1;
3146             current_container->cknown = 1;
3147         } else {
3148             add_valid_menu_class(0); /* reset */
3149             if (flags.menu_style == MENU_TRADITIONAL)
3150                 used |= traditional_loot(FALSE);
3151             else
3152                 used |= (menu_loot(0, FALSE) > 0);
3153             add_valid_menu_class(0);
3154         }
3155     }
3156
3157 containerdone:
3158     if (used) {
3159         /* Not completely correct; if we put something in without knowing
3160            whatever was already inside, now we suddenly do.  That can't
3161            be helped unless we want to track things item by item and then
3162            deal with containers whose contents are "partly known". */
3163         if (current_container)
3164             current_container->cknown = 1;
3165         update_inventory();
3166     }
3167
3168     *objp = current_container; /* might have become null */
3169     if (current_container)
3170         current_container = 0; /* avoid hanging on to stale pointer */
3171     else
3172         abort_looting = TRUE;
3173     return used;
3174 }
3175
3176 /* loot current_container (take things out or put things in), by prompting */
3177 STATIC_OVL int
3178 traditional_loot(put_in)
3179 boolean put_in;
3180 {
3181     int FDECL((*actionfunc), (OBJ_P)), FDECL((*checkfunc), (OBJ_P));
3182     struct obj **objlist;
3183     char selection[MAXOCLASSES + 10]; /* +10: room for B,U,C,X plus slop */
3184     const char *action;
3185     boolean one_by_one, allflag;
3186     int used = 0, menu_on_request = 0;
3187
3188     if (put_in) {
3189 /*JP
3190         action = "put in";
3191 */
3192         action = "\93ü\82ê\82é";
3193         objlist = &invent;
3194         actionfunc = in_container;
3195         checkfunc = ck_bag;
3196     } else {
3197 /*JP
3198         action = "take out";
3199 */
3200         action = "\8eæ\82è\8fo\82·";
3201         objlist = &(current_container->cobj);
3202         actionfunc = out_container;
3203         checkfunc = (int FDECL((*), (OBJ_P))) 0;
3204     }
3205
3206     if (query_classes(selection, &one_by_one, &allflag, action, *objlist,
3207                       FALSE, &menu_on_request)) {
3208         if (askchain(objlist, (one_by_one ? (char *) 0 : selection), allflag,
3209                      actionfunc, checkfunc, 0, action))
3210             used = 1;
3211     } else if (menu_on_request < 0) {
3212         used = (menu_loot(menu_on_request, put_in) > 0);
3213     }
3214     return used;
3215 }
3216
3217 /* loot current_container (take things out or put things in), using a menu */
3218 STATIC_OVL int
3219 menu_loot(retry, put_in)
3220 int retry;
3221 boolean put_in;
3222 {
3223     int n, i, n_looted = 0;
3224     boolean all_categories = TRUE, loot_everything = FALSE;
3225     char buf[BUFSZ];
3226 /*JP
3227     const char *action = put_in ? "Put in" : "Take out";
3228 */
3229     const char *action = put_in ? "\93ü\82ê\82é" : "\8eæ\82è\8fo\82·";
3230     struct obj *otmp, *otmp2;
3231     menu_item *pick_list;
3232     int mflags, res;
3233     long count;
3234
3235     if (retry) {
3236         all_categories = (retry == -2);
3237     } else if (flags.menu_style == MENU_FULL) {
3238         all_categories = FALSE;
3239 /*JP
3240         Sprintf(buf, "%s what type of objects?", action);
3241 */
3242         Sprintf(buf, "\82Ç\82Ì\8eí\97Þ\82Ì\82à\82Ì\82ð%s\81H", action);
3243         mflags = (ALL_TYPES | UNPAID_TYPES | BUCX_TYPES | CHOOSE_ALL);
3244         n = query_category(buf, put_in ? invent : current_container->cobj,
3245                            mflags, &pick_list, PICK_ANY);
3246         if (!n)
3247             return 0;
3248         for (i = 0; i < n; i++) {
3249             if (pick_list[i].item.a_int == 'A')
3250                 loot_everything = TRUE;
3251             else if (pick_list[i].item.a_int == ALL_TYPES_SELECTED)
3252                 all_categories = TRUE;
3253             else
3254                 add_valid_menu_class(pick_list[i].item.a_int);
3255         }
3256         free((genericptr_t) pick_list);
3257     }
3258
3259     if (loot_everything) {
3260         if (!put_in) {
3261             current_container->cknown = 1;
3262             for (otmp = current_container->cobj; otmp; otmp = otmp2) {
3263                 otmp2 = otmp->nobj;
3264                 res = out_container(otmp);
3265                 if (res < 0)
3266                     break;
3267                 n_looted += res;
3268             }
3269         } else {
3270             for (otmp = invent; otmp && current_container; otmp = otmp2) {
3271                 otmp2 = otmp->nobj;
3272                 res = in_container(otmp);
3273                 if (res < 0)
3274                     break;
3275                 n_looted += res;
3276             }
3277         }
3278     } else {
3279         mflags = INVORDER_SORT;
3280         if (put_in && flags.invlet_constant)
3281             mflags |= USE_INVLET;
3282         if (!put_in)
3283             current_container->cknown = 1;
3284 /*JP
3285         Sprintf(buf, "%s what?", action);
3286 */
3287         Sprintf(buf, "\89½\82ð%s\81H", action);
3288         n = query_objlist(buf, put_in ? &invent : &(current_container->cobj),
3289                           mflags, &pick_list, PICK_ANY,
3290                           all_categories ? allow_all : allow_category);
3291         if (n) {
3292             n_looted = n;
3293             for (i = 0; i < n; i++) {
3294                 otmp = pick_list[i].item.a_obj;
3295                 count = pick_list[i].count;
3296                 if (count > 0 && count < otmp->quan) {
3297                     otmp = splitobj(otmp, count);
3298                     /* special split case also handled by askchain() */
3299                 }
3300                 res = put_in ? in_container(otmp) : out_container(otmp);
3301                 if (res < 0) {
3302                     if (!current_container) {
3303                         /* otmp caused current_container to explode;
3304                            both are now gone */
3305                         otmp = 0; /* and break loop */
3306                     } else if (otmp && otmp != pick_list[i].item.a_obj) {
3307                         /* split occurred, merge again */
3308                         (void) merged(&pick_list[i].item.a_obj, &otmp);
3309                     }
3310                     break;
3311                 }
3312             }
3313             free((genericptr_t) pick_list);
3314         }
3315     }
3316     return n_looted;
3317 }
3318
3319 STATIC_OVL char
3320 in_or_out_menu(prompt, obj, outokay, inokay, alreadyused, more_containers)
3321 const char *prompt;
3322 struct obj *obj;
3323 boolean outokay, inokay, alreadyused, more_containers;
3324 {
3325     /* underscore is not a choice; it's used to skip element [0] */
3326     static const char lootchars[] = "_:oibrsnq", abc_chars[] = "_:abcdenq";
3327     winid win;
3328     anything any;
3329     menu_item *pick_list;
3330     char buf[BUFSZ];
3331     int n;
3332     const char *menuselector = flags.lootabc ? abc_chars : lootchars;
3333
3334     any = zeroany;
3335     win = create_nhwindow(NHW_MENU);
3336     start_menu(win);
3337
3338     any.a_int = 1; /* ':' */
3339 /*JP
3340     Sprintf(buf, "Look inside %s", thesimpleoname(obj));
3341 */
3342     Sprintf(buf, "%s\82Ì\92\86\90g\82ð\8c©\82é", thesimpleoname(obj));
3343     add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE, buf,
3344              MENU_UNSELECTED);
3345     if (outokay) {
3346         any.a_int = 2; /* 'o' */
3347 /*JP
3348         Sprintf(buf, "take %s out", something);
3349 */
3350         Strcpy(buf, "\89½\82©\82ð\8eæ\82è\8fo\82·");
3351         add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3352                  buf, MENU_UNSELECTED);
3353     }
3354     if (inokay) {
3355         any.a_int = 3; /* 'i' */
3356 /*JP
3357         Sprintf(buf, "put %s in", something);
3358 */
3359         Strcpy(buf, "\89½\82©\82ð\93ü\82ê\82é");
3360         add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3361                  buf, MENU_UNSELECTED);
3362     }
3363     if (outokay) {
3364         any.a_int = 4; /* 'b' */
3365 /*JP
3366         Sprintf(buf, "%stake out, then put in", inokay ? "both; " : "");
3367 */
3368         Sprintf(buf, "%s\82Ü\82¸\8eæ\82è\8fo\82·\81C\82»\82ê\82©\82ç\93ü\82ê\82é", inokay ? "\97¼\95û; " : "");
3369         add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3370                  buf, MENU_UNSELECTED);
3371     }
3372     if (inokay) {
3373         any.a_int = 5; /* 'r' */
3374 #if 0 /*JP*/
3375         Sprintf(buf, "%sput in, then take out",
3376                 outokay ? "both reversed; " : "");
3377 #else
3378         Sprintf(buf, "%s\82Ü\82¸\93ü\82ê\82é\81C\82»\82ê\82©\82ç\8eæ\82è\8fo\82·",
3379                 outokay ? "\97¼\95û\82ð\8bt\8f\87\82Å; " : "");
3380 #endif
3381         add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3382                  buf, MENU_UNSELECTED);
3383         any.a_int = 6; /* 's' */
3384 /*JP
3385         Sprintf(buf, "stash one item into %s", thesimpleoname(obj));
3386 */
3387         Sprintf(buf, "\82à\82Ì\82ð\88ê\82Â\82¾\82¯%s\82É\93ü\82ê\82é", thesimpleoname(obj));
3388         add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3389                  buf, MENU_UNSELECTED);
3390     }
3391     any.a_int = 0;
3392     add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED);
3393     if (more_containers) {
3394         any.a_int = 7; /* 'n' */
3395 #if 0 /*JP*/
3396         add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3397                  "loot next container", MENU_SELECTED);
3398 #else
3399         add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
3400                  "\8e\9f\82Ì\94 \82ð\8aJ\82¯\82é", MENU_SELECTED);
3401 #endif
3402     }
3403     any.a_int = 8; /* 'q' */
3404 /*JP
3405     Strcpy(buf, alreadyused ? "done" : "do nothing");
3406 */
3407     Strcpy(buf, alreadyused ? "\8fI\82í\82é" : "\89½\82à\82µ\82È\82¢");
3408     add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE, buf,
3409              more_containers ? MENU_UNSELECTED : MENU_SELECTED);
3410
3411     end_menu(win, prompt);
3412     n = select_menu(win, PICK_ONE, &pick_list);
3413     destroy_nhwindow(win);
3414     if (n > 0) {
3415         int k = pick_list[0].item.a_int;
3416
3417         if (n > 1 && k == (more_containers ? 7 : 8))
3418             k = pick_list[1].item.a_int;
3419         free((genericptr_t) pick_list);
3420         return lootchars[k]; /* :,o,i,b,r,s,n,q */
3421     }
3422     return (n == 0 && more_containers) ? 'n' : 'q'; /* next or quit */
3423 }
3424
3425 static const char tippables[] = { ALL_CLASSES, TOOL_CLASS, 0 };
3426
3427 /* #tip command -- empty container contents onto floor */
3428 int
3429 dotip()
3430 {
3431     struct obj *cobj, *nobj;
3432     coord cc;
3433     int boxes;
3434     char c, buf[BUFSZ], qbuf[BUFSZ];
3435     const char *spillage = 0;
3436
3437     /*
3438      * doesn't require free hands;
3439      * limbs are needed to tip floor containers
3440      */
3441
3442     /* at present, can only tip things at current spot, not adjacent ones */
3443     cc.x = u.ux, cc.y = u.uy;
3444
3445     /* check floor container(s) first; at most one will be accessed */
3446     if ((boxes = container_at(cc.x, cc.y, TRUE)) > 0) {
3447 #if 0 /*JP*/
3448         Sprintf(buf, "You can't tip %s while carrying so much.",
3449                 !flags.verbose ? "a container" : (boxes > 1) ? "one" : "it");
3450 #else
3451         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");
3452 #endif
3453         if (!check_capacity(buf) && able_to_loot(cc.x, cc.y, FALSE)) {
3454             if (boxes > 1 && (flags.menu_style != MENU_TRADITIONAL
3455                               || iflags.menu_requested)) {
3456                 /* use menu to pick a container to tip */
3457                 int n, i;
3458                 winid win;
3459                 anything any;
3460                 menu_item *pick_list = (menu_item *) 0;
3461                 struct obj dummyobj, *otmp;
3462
3463                 any = zeroany;
3464                 win = create_nhwindow(NHW_MENU);
3465                 start_menu(win);
3466
3467                 for (cobj = level.objects[cc.x][cc.y], i = 0; cobj;
3468                      cobj = cobj->nexthere)
3469                     if (Is_container(cobj)) {
3470                         ++i;
3471                         any.a_obj = cobj;
3472                         add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
3473                                  doname(cobj), MENU_UNSELECTED);
3474                     }
3475                 if (invent) {
3476                     any = zeroany;
3477                     add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
3478                              "", MENU_UNSELECTED);
3479                     any.a_obj = &dummyobj;
3480                     /* use 'i' for inventory unless there are so many
3481                        containers that it's already being used */
3482                     i = (i <= 'i' - 'a' && !flags.lootabc) ? 'i' : 0;
3483 #if 0 /*JP*/
3484                     add_menu(win, NO_GLYPH, &any, i, 0, ATR_NONE,
3485                              "tip something being carried", MENU_SELECTED);
3486 #else
3487                     add_menu(win, NO_GLYPH, &any, i, 0, ATR_NONE,
3488                              "\93ü\82ê\95¨\82ð\82Ð\82Á\82­\82è\82©\82¦\82·", MENU_SELECTED);
3489 #endif
3490                 }
3491                 end_menu(win, "\82Ç\82Ì\93ü\82ê\95¨\82ð\82Ð\82Á\82­\82è\82©\82¦\82·\81H");
3492                 n = select_menu(win, PICK_ONE, &pick_list);
3493                 destroy_nhwindow(win);
3494                 /*
3495                  * Deal with quirk of preselected item in pick-one menu:
3496                  * n ==  0 => picked preselected entry, toggling it off;
3497                  * n ==  1 => accepted preselected choice via SPACE or RETURN;
3498                  * n ==  2 => picked something other than preselected entry;
3499                  * n == -1 => cancelled via ESC;
3500                  */
3501                 otmp = (n <= 0) ? (struct obj *) 0 : pick_list[0].item.a_obj;
3502                 if (n > 1 && otmp == &dummyobj)
3503                     otmp = pick_list[1].item.a_obj;
3504                 if (pick_list)
3505                     free((genericptr_t) pick_list);
3506                 if (otmp && otmp != &dummyobj) {
3507                     tipcontainer(otmp);
3508                     return 1;
3509                 }
3510                 if (n == -1)
3511                     return 0;
3512                 /* else pick-from-invent below */
3513             } else {
3514                 for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) {
3515                     nobj = cobj->nexthere;
3516                     if (!Is_container(cobj))
3517                         continue;
3518 #if 0 /*JP*/
3519                     c = ynq(safe_qbuf(qbuf, "There is ", " here, tip it?",
3520                                       cobj,
3521                                       doname, ansimpleoname, "container"));
3522 #else
3523                     c = ynq(safe_qbuf(qbuf, "\82±\82±\82É\82Í", " \82ª\82 \82é\81C\82Ð\82Á\82­\82è\95Ô\82·?",
3524                                       cobj,
3525                                       doname, ansimpleoname, "\93ü\82ê\95¨"));
3526 #endif
3527                     if (c == 'q')
3528                         return 0;
3529                     if (c == 'n')
3530                         continue;
3531                     tipcontainer(cobj);
3532                     /* can only tip one container at a time */
3533                     return 1;
3534                 }
3535             }
3536         }
3537     }
3538
3539     /* either no floor container(s) or couldn't tip one or didn't tip any */
3540     cobj = getobj(tippables, "tip");
3541     if (!cobj)
3542         return 0;
3543
3544     /* normal case */
3545     if (Is_container(cobj) || cobj->otyp == HORN_OF_PLENTY) {
3546         tipcontainer(cobj);
3547         return 1;
3548     }
3549     /* assorted other cases */
3550     if (Is_candle(cobj) && cobj->lamplit) {
3551         /* note "wax" even for tallow candles to avoid giving away info */
3552 /*JP
3553         spillage = "wax";
3554 */
3555         spillage = "\82ë\82¤";
3556     } else if ((cobj->otyp == POT_OIL && cobj->lamplit)
3557                || (cobj->otyp == OIL_LAMP && cobj->age != 0L)
3558                || (cobj->otyp == MAGIC_LAMP && cobj->spe != 0)) {
3559 /*JP
3560         spillage = "oil";
3561 */
3562         spillage = "\96û";
3563         /* todo: reduce potion's remaining burn timer or oil lamp's fuel */
3564     } else if (cobj->otyp == CAN_OF_GREASE && cobj->spe > 0) {
3565         /* charged consumed below */
3566 /*JP
3567         spillage = "grease";
3568 */
3569         spillage = "\8e\89";
3570     } else if (cobj->otyp == FOOD_RATION || cobj->otyp == CRAM_RATION
3571                || cobj->otyp == LEMBAS_WAFER) {
3572 /*JP
3573         spillage = "crumbs";
3574 */
3575         spillage = "\83p\83\93\82­\82¸";
3576     } else if (cobj->oclass == VENOM_CLASS) {
3577 /*JP
3578         spillage = "venom";
3579 */
3580         spillage = "\93Å\89t";
3581     }
3582     if (spillage) {
3583         buf[0] = '\0';
3584         if (is_pool(u.ux, u.uy))
3585 /*JP
3586             Sprintf(buf, " and gradually %s", vtense(spillage, "dissipate"));
3587 */
3588             Strcpy(buf, "\82»\82µ\82Ä\8f\99\81X\82É\8eU\82Á\82Ä\82¢\82Á\82½\81D");
3589         else if (is_lava(u.ux, u.uy))
3590 #if 0 /*JP*/
3591             Sprintf(buf, " and immediately %s away",
3592                     vtense(spillage, "burn"));
3593 #else
3594             Strcpy(buf, "\82»\82µ\82Ä\82·\82®\82É\94R\82¦\82Â\82«\82½\81D");
3595 #endif
3596 #if 0 /*JP*/
3597         pline("Some %s %s onto the %s%s.", spillage,
3598               vtense(spillage, "spill"), surface(u.ux, u.uy), buf);
3599 #else
3600         pline("%s\82ª%s\82Ì\8fã\82É\94ò\82Ñ\8eU\82Á\82½\81D%s", spillage,
3601               surface(u.ux, u.uy), buf);
3602 #endif
3603         /* shop usage message comes after the spill message */
3604         if (cobj->otyp == CAN_OF_GREASE && cobj->spe > 0) {
3605             consume_obj_charge(cobj, TRUE);
3606         }
3607         /* something [useless] happened */
3608         return 1;
3609     }
3610     /* anything not covered yet */
3611     if (cobj->oclass == POTION_CLASS) /* can't pour potions... */
3612 /*JP
3613         pline_The("%s %s securely sealed.", xname(cobj), otense(cobj, "are"));
3614 */
3615         pline_The("%s\82Í\82µ\82Á\82©\82è\82Æ\90ð\82ª\82³\82ê\82Ä\82¢\82é\81D", xname(cobj));
3616     else if (cobj->otyp == STATUE)
3617 /*JP
3618         pline("Nothing interesting happens.");
3619 */
3620         pline("\96Ê\94\92\82¢\82±\82Æ\82Í\89½\82à\8bN\82«\82È\82©\82Á\82½\81D");
3621     else
3622         pline1(nothing_happens);
3623     return 0;
3624 }
3625
3626 STATIC_OVL void
3627 tipcontainer(box)
3628 struct obj *box; /* or bag */
3629 {
3630     xchar ox = u.ux, oy = u.uy; /* #tip only works at hero's location */
3631     boolean empty_it = FALSE, maybeshopgoods;
3632
3633     /* box is either held or on floor at hero's spot; no need to check for
3634        nesting; when held, we need to update its location to match hero's;
3635        for floor, the coordinate updating is redundant */
3636     if (get_obj_location(box, &ox, &oy, 0))
3637         box->ox = ox, box->oy = oy;
3638
3639     /* Shop handling:  can't rely on the container's own unpaid
3640        or no_charge status because contents might differ with it.
3641        A carried container's contents will be flagged as unpaid
3642        or not, as appropriate, and need no special handling here.
3643        Items owned by the hero get sold to the shop without
3644        confirmation as with other uncontrolled drops.  A floor
3645        container's contents will be marked no_charge if owned by
3646        hero, otherwise they're owned by the shop.  By passing
3647        the contents through shop billing, they end up getting
3648        treated the same as in the carried case.   We do so one
3649        item at a time instead of doing whole container at once
3650        to reduce the chance of exhausting shk's billing capacity. */
3651     maybeshopgoods = !carried(box) && costly_spot(box->ox, box->oy);
3652
3653     /* caveat: this assumes that cknown, lknown, olocked, and otrapped
3654        fields haven't been overloaded to mean something special for the
3655        non-standard "container" horn of plenty */
3656     box->lknown = 1;
3657     if (box->olocked) {
3658 /*JP
3659         pline("It's locked.");
3660 */
3661         pline("\8c®\82ª\8a|\82©\82Á\82Ä\82¢\82é\81D");
3662     } else if (box->otrapped) {
3663         /* we're not reaching inside but we're still handling it... */
3664         (void) chest_trap(box, HAND, FALSE);
3665         /* even if the trap fails, you've used up this turn */
3666         if (multi >= 0) { /* in case we didn't become paralyzed */
3667             nomul(-1);
3668 /*JP
3669             multi_reason = "tipping a container";
3670 */
3671             multi_reason = "\94 \82ð\82Ð\82Á\82­\82è\95Ô\82µ\82Ä\82¢\82é\8e\9e\82É";
3672             nomovemsg = "";
3673         }
3674     } else if (box->otyp == BAG_OF_TRICKS || box->otyp == HORN_OF_PLENTY) {
3675         boolean bag = box->otyp == BAG_OF_TRICKS;
3676         int old_spe = box->spe, seen = 0;
3677
3678         if (maybeshopgoods && !box->no_charge)
3679             addtobill(box, FALSE, FALSE, TRUE);
3680         /* apply this bag/horn until empty or monster/object creation fails
3681            (if the latter occurs, force the former...) */
3682         do {
3683             if (!(bag ? bagotricks(box, TRUE, &seen)
3684                       : hornoplenty(box, TRUE)))
3685                 break;
3686         } while (box->spe > 0);
3687
3688         if (box->spe < old_spe) {
3689             if (bag)
3690 #if 0 /*JP*/
3691                 pline((seen == 0) ? "Nothing seems to happen."
3692                                   : (seen == 1) ? "A monster appears."
3693                                                 : "Monsters appear!");
3694 #else
3695                 pline((seen == 0) ? "\89½\82à\8bN\82«\82È\82©\82Á\82½\82æ\82¤\82¾\81D"
3696                                   : (seen == 1) ? "\89ö\95¨\82ª\8c»\82ê\82½\81D"
3697                                                 : "\89ö\95¨\82ª\8c»\82ê\82½\81I");
3698 #endif
3699             /* check_unpaid wants to see a non-zero charge count */
3700             box->spe = old_spe;
3701             check_unpaid_usage(box, TRUE);
3702             box->spe = 0; /* empty */
3703             box->cknown = 1;
3704         }
3705         if (maybeshopgoods && !box->no_charge)
3706             subfrombill(box, shop_keeper(*in_rooms(ox, oy, SHOPBASE)));
3707     } else if (SchroedingersBox(box)) {
3708         char yourbuf[BUFSZ];
3709
3710         observe_quantum_cat(box, TRUE, TRUE);
3711         if (!Has_contents(box)) /* evidently a live cat came out */
3712             /* container type of "large box" is inferred */
3713 /*JP
3714             pline("%sbox is now empty.", Shk_Your(yourbuf, box));
3715 */
3716             pline("%s\94 \82Í\8bó\82É\82È\82Á\82½\81D", Shk_Your(yourbuf, box));
3717         else /* holds cat corpse */
3718             empty_it = TRUE;
3719         box->cknown = 1;
3720     } else if (!Has_contents(box)) {
3721         box->cknown = 1;
3722 /*JP
3723         pline("It's empty.");
3724 */
3725         pline("\82±\82ê\82Í\8bó\82¾\81D");
3726     } else {
3727         empty_it = TRUE;
3728     }
3729
3730     if (empty_it) {
3731         struct obj *otmp, *nobj;
3732         boolean terse, highdrop = !can_reach_floor(TRUE),
3733                 altarizing = IS_ALTAR(levl[ox][oy].typ),
3734                 cursed_mbag = (Is_mbag(box) && box->cursed);
3735         int held = carried(box);
3736         long loss = 0L;
3737
3738         if (u.uswallow)
3739             highdrop = altarizing = FALSE;
3740         terse = !(highdrop || altarizing || costly_spot(box->ox, box->oy));
3741         box->cknown = 1;
3742         /* Terse formatting is
3743          * "Objects spill out: obj1, obj2, obj3, ..., objN."
3744          * If any other messages intervene between objects, we revert to
3745          * "ObjK drops to the floor.", "ObjL drops to the floor.", &c.
3746          */
3747 #if 0 /*JP:T*/
3748         pline("%s out%c",
3749               box->cobj->nobj ? "Objects spill" : "An object spills",
3750               terse ? ':' : '.');
3751 #else
3752         pline("\92\86\90g\82ª\8fo\82Ä\82«\82½%s",
3753               !(highdrop || altarizing) ? "\81F" : "\81D");
3754 #endif
3755         for (otmp = box->cobj; otmp; otmp = nobj) {
3756             nobj = otmp->nobj;
3757             obj_extract_self(otmp);
3758             otmp->ox = box->ox, otmp->oy = box->oy;
3759
3760             if (box->otyp == ICE_BOX) {
3761                 removed_from_icebox(otmp); /* resume rotting for corpse */
3762             } else if (cursed_mbag && !rn2(13)) {
3763                 loss += mbag_item_gone(held, otmp);
3764                 /* abbreviated drop format is no longer appropriate */
3765                 terse = FALSE;
3766                 continue;
3767             }
3768
3769             if (maybeshopgoods) {
3770                 addtobill(otmp, FALSE, FALSE, TRUE);
3771                 iflags.suppress_price++; /* doname formatting */
3772             }
3773
3774             if (highdrop) {
3775                 /* might break or fall down stairs; handles altars itself */
3776                 hitfloor(otmp, TRUE);
3777             } else {
3778                 if (altarizing) {
3779                     doaltarobj(otmp);
3780                 } else if (!terse) {
3781 #if 0 /*JP:T*/
3782                     pline("%s %s to the %s.", Doname2(otmp),
3783                           otense(otmp, "drop"), surface(ox, oy));
3784 #else
3785                     pline("%s\82Í%s\82Ì\8fã\82É\97\8e\82¿\82½\81D", Doname2(otmp),
3786                           surface(ox, oy));
3787 #endif
3788                 } else {
3789 /*JP
3790                     pline("%s%c", doname(otmp), nobj ? ',' : '.');
3791 */
3792                     pline("%s%s", doname(otmp), nobj ? "\81C" : "\81D");
3793                     iflags.last_msg = PLNMSG_OBJNAM_ONLY;
3794                 }
3795                 dropy(otmp);
3796                 if (iflags.last_msg != PLNMSG_OBJNAM_ONLY)
3797                     terse = FALSE; /* terse formatting has been interrupted */
3798             }
3799             if (maybeshopgoods)
3800                 iflags.suppress_price--; /* reset */
3801         }
3802         if (loss) /* magic bag lost some shop goods */
3803 /*JP
3804             You("owe %ld %s for lost merchandise.", loss, currency(loss));
3805 */
3806             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));
3807         box->owt = weight(box); /* mbag_item_gone() doesn't update this */
3808         if (held)
3809             (void) encumber_msg();
3810     }
3811 }
3812
3813 /*pickup.c*/