OSDN Git Service

ascii_to_zenkakuの全角マイナス記号を適切なものに修正
[hengband/hengband.git] / src / object1.c
1 /*!
2  * @file object1.c
3  * @brief オブジェクトの実装 / Object code, part 1
4  * @date 2014/01/10
5  * @author
6  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7  *\n
8  * This software may be copied and distributed for educational, research,\n
9  * and not for profit purposes provided that this copyright and statement\n
10  * are included in all such copies.  Other copyrights may also apply.\n
11  * 2014 Deskull rearranged comment for Doxygen.\n
12  */
13
14 #include "angband.h"
15
16 #if defined(MACINTOSH) || defined(MACH_O_CARBON)
17 #ifdef verify
18 #undef verify
19 #endif
20 #endif
21
22 /*!
23  * @brief オブジェクト、地形の表示シンボルなど初期化する / Reset the "visual" lists
24  * @return なし
25  * This involves resetting various things to their "default" state.\n
26  *\n
27  * If the "prefs" flag is TRUE, then we will also load the appropriate\n
28  * "user pref file" based on the current setting of the "use_graphics"\n
29  * flag.  This is useful for switching "graphics" on/off.\n
30  *\n
31  * The features, objects, and monsters, should all be encoded in the\n
32  * relevant "font.pref" and/or "graf.prf" files.  XXX XXX XXX\n
33  *\n
34  * The "prefs" parameter is no longer meaningful.  XXX XXX XXX\n
35  */
36 void reset_visuals(void)
37 {
38         int i, j;
39
40         /* Extract some info about terrain features */
41         for (i = 0; i < max_f_idx; i++)
42         {
43                 feature_type *f_ptr = &f_info[i];
44
45                 /* Assume we will use the underlying values */
46                 for (j = 0; j < F_LIT_MAX; j++)
47                 {
48                         f_ptr->x_attr[j] = f_ptr->d_attr[j];
49                         f_ptr->x_char[j] = f_ptr->d_char[j];
50                 }
51         }
52
53         /* Extract default attr/char code for objects */
54         for (i = 0; i < max_k_idx; i++)
55         {
56                 object_kind *k_ptr = &k_info[i];
57
58                 /* Default attr/char */
59                 k_ptr->x_attr = k_ptr->d_attr;
60                 k_ptr->x_char = k_ptr->d_char;
61         }
62
63         /* Extract default attr/char code for monsters */
64         for (i = 0; i < max_r_idx; i++)
65         {
66                 monster_race *r_ptr = &r_info[i];
67
68                 /* Default attr/char */
69                 r_ptr->x_attr = r_ptr->d_attr;
70                 r_ptr->x_char = r_ptr->d_char;
71         }
72
73         if (use_graphics)
74         {
75                 char buf[1024];
76
77                 /* Process "graf.prf" */
78                 process_pref_file("graf.prf");
79
80                 /* Access the "character" pref file */
81                 sprintf(buf, "graf-%s.prf", player_base);
82
83                 /* Process "graf-<playername>.prf" */
84                 process_pref_file(buf);
85         }
86
87         /* Normal symbols */
88         else
89         {
90                 char buf[1024];
91
92                 /* Process "font.prf" */
93                 process_pref_file("font.prf");
94
95                 /* Access the "character" pref file */
96                 sprintf(buf, "font-%s.prf", player_base);
97
98                 /* Process "font-<playername>.prf" */
99                 process_pref_file(buf);
100         }
101 }
102
103 /*!
104  * @brief オブジェクトのフラグ類を配列に与える
105  * Obtain the "flags" for an item
106  * @param o_ptr フラグ取得元のオブジェクト構造体ポインタ
107  * @param flgs フラグ情報を受け取る配列
108  * @return なし
109  */
110 void object_flags(object_type *o_ptr, u32b flgs[TR_FLAG_SIZE])
111 {
112         object_kind *k_ptr = &k_info[o_ptr->k_idx];
113         int i;
114
115         /* Base object */
116         for (i = 0; i < TR_FLAG_SIZE; i++)
117                 flgs[i] = k_ptr->flags[i];
118
119         /* Artifact */
120         if (object_is_fixed_artifact(o_ptr))
121         {
122                 artifact_type *a_ptr = &a_info[o_ptr->name1];
123
124                 for (i = 0; i < TR_FLAG_SIZE; i++)
125                         flgs[i] = a_ptr->flags[i];
126         }
127
128         /* Ego-item */
129         if (object_is_ego(o_ptr))
130         {
131                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
132
133                 for (i = 0; i < TR_FLAG_SIZE; i++)
134                         flgs[i] |= e_ptr->flags[i];
135
136                 if ((o_ptr->name2 == EGO_LITE_AURA_FIRE) && !o_ptr->xtra4 && (o_ptr->sval <= SV_LITE_LANTERN))
137                 {
138                         remove_flag(flgs, TR_SH_FIRE);
139                 }
140                 else if ((o_ptr->name2 == EGO_LITE_INFRA) && !o_ptr->xtra4 && (o_ptr->sval <= SV_LITE_LANTERN))
141                 {
142                         remove_flag(flgs, TR_INFRA);
143                 }
144                 else if ((o_ptr->name2 == EGO_LITE_EYE) && !o_ptr->xtra4 && (o_ptr->sval <= SV_LITE_LANTERN))
145                 {
146                         remove_flag(flgs, TR_RES_BLIND);
147                         remove_flag(flgs, TR_SEE_INVIS);
148                 }
149         }
150
151         /* Random artifact ! */
152         for (i = 0; i < TR_FLAG_SIZE; i++)
153                 flgs[i] |= o_ptr->art_flags[i];
154
155         if (object_is_smith(o_ptr))
156         {
157                 int add = o_ptr->xtra3 - 1;
158
159                 if (add < TR_FLAG_MAX)
160                 {
161                         add_flag(flgs, add);
162                 }
163                 else if (add == ESSENCE_TMP_RES_ACID)
164                 {
165                         add_flag(flgs, TR_RES_ACID);
166                         add_flag(flgs, TR_ACTIVATE);
167                 }
168                 else if (add == ESSENCE_TMP_RES_ELEC)
169                 {
170                         add_flag(flgs, TR_RES_ELEC);
171                         add_flag(flgs, TR_ACTIVATE);
172                 }
173                 else if (add == ESSENCE_TMP_RES_FIRE)
174                 {
175                         add_flag(flgs, TR_RES_FIRE);
176                         add_flag(flgs, TR_ACTIVATE);
177                 }
178                 else if (add == ESSENCE_TMP_RES_COLD)
179                 {
180                         add_flag(flgs, TR_RES_COLD);
181                         add_flag(flgs, TR_ACTIVATE);
182                 }
183                 else if (add == ESSENCE_SH_FIRE)
184                 {
185                         add_flag(flgs, TR_RES_FIRE);
186                         add_flag(flgs, TR_SH_FIRE);
187                 }
188                 else if (add == ESSENCE_SH_ELEC)
189                 {
190                         add_flag(flgs, TR_RES_ELEC);
191                         add_flag(flgs, TR_SH_ELEC);
192                 }
193                 else if (add == ESSENCE_SH_COLD)
194                 {
195                         add_flag(flgs, TR_RES_COLD);
196                         add_flag(flgs, TR_SH_COLD);
197                 }
198                 else if (add == ESSENCE_RESISTANCE)
199                 {
200                         add_flag(flgs, TR_RES_ACID);
201                         add_flag(flgs, TR_RES_ELEC);
202                         add_flag(flgs, TR_RES_FIRE);
203                         add_flag(flgs, TR_RES_COLD);
204                 }
205                 else if (add == TR_IMPACT)
206                 {
207                         add_flag(flgs, TR_ACTIVATE);
208                 }
209         }
210 }
211
212 /*!
213  * @brief オブジェクトの明示されているフラグ類を取得する
214  * Obtain the "flags" for an item which are known to the player
215  * @param o_ptr フラグ取得元のオブジェクト構造体ポインタ
216  * @param flgs フラグ情報を受け取る配列
217  * @return なし
218  */
219 void object_flags_known(object_type *o_ptr, u32b flgs[TR_FLAG_SIZE])
220 {
221         bool spoil = FALSE;
222         int i;
223
224         object_kind *k_ptr = &k_info[o_ptr->k_idx];
225
226         /* Clear */
227         for (i = 0; i < TR_FLAG_SIZE; i++)
228                 flgs[i] = 0;
229
230         if (!object_is_aware(o_ptr)) return;
231
232         /* Base object */
233         for (i = 0; i < TR_FLAG_SIZE; i++)
234                 flgs[i] = k_ptr->flags[i];
235
236         /* Must be identified */
237         if (!object_is_known(o_ptr)) return;
238
239         /* Ego-item (known basic flags) */
240         if (object_is_ego(o_ptr))
241         {
242                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
243
244                 for (i = 0; i < TR_FLAG_SIZE; i++)
245                         flgs[i] |= e_ptr->flags[i];
246
247                 if ((o_ptr->name2 == EGO_LITE_AURA_FIRE) && !o_ptr->xtra4 && (o_ptr->sval <= SV_LITE_LANTERN))
248                 {
249                         remove_flag(flgs, TR_SH_FIRE);
250                 }
251                 else if ((o_ptr->name2 == EGO_LITE_INFRA) && !o_ptr->xtra4 && (o_ptr->sval <= SV_LITE_LANTERN))
252                 {
253                         remove_flag(flgs, TR_INFRA);
254                 }
255                 else if ((o_ptr->name2 == EGO_LITE_EYE) && !o_ptr->xtra4 && (o_ptr->sval <= SV_LITE_LANTERN))
256                 {
257                         remove_flag(flgs, TR_RES_BLIND);
258                         remove_flag(flgs, TR_SEE_INVIS);
259                 }
260         }
261
262
263 #ifdef SPOIL_ARTIFACTS
264         /* Full knowledge for some artifacts */
265         if (object_is_artifact(o_ptr)) spoil = TRUE;
266 #endif /* SPOIL_ARTIFACTS */
267
268 #ifdef SPOIL_EGO_ITEMS
269         /* Full knowledge for some ego-items */
270         if (object_is_ego(o_ptr)) spoil = TRUE;
271 #endif /* SPOIL_EGO_ITEMS */
272
273         /* Need full knowledge or spoilers */
274         if (spoil || (o_ptr->ident & IDENT_MENTAL))
275         {
276                 /* Artifact */
277                 if (object_is_fixed_artifact(o_ptr))
278                 {
279                         artifact_type *a_ptr = &a_info[o_ptr->name1];
280
281                         for (i = 0; i < TR_FLAG_SIZE; i++)
282                                 flgs[i] = a_ptr->flags[i];
283                 }
284
285                 /* Random artifact ! */
286                 for (i = 0; i < TR_FLAG_SIZE; i++)
287                         flgs[i] |= o_ptr->art_flags[i];
288         }
289
290         if (object_is_smith(o_ptr))
291         {
292                 int add = o_ptr->xtra3 - 1;
293
294                 if (add < TR_FLAG_MAX)
295                 {
296                         add_flag(flgs, add);
297                 }
298                 else if (add == ESSENCE_TMP_RES_ACID)
299                 {
300                         add_flag(flgs, TR_RES_ACID);
301                 }
302                 else if (add == ESSENCE_TMP_RES_ELEC)
303                 {
304                         add_flag(flgs, TR_RES_ELEC);
305                 }
306                 else if (add == ESSENCE_TMP_RES_FIRE)
307                 {
308                         add_flag(flgs, TR_RES_FIRE);
309                 }
310                 else if (add == ESSENCE_TMP_RES_COLD)
311                 {
312                         add_flag(flgs, TR_RES_COLD);
313                 }
314                 else if (add == ESSENCE_SH_FIRE)
315                 {
316                         add_flag(flgs, TR_RES_FIRE);
317                         add_flag(flgs, TR_SH_FIRE);
318                 }
319                 else if (add == ESSENCE_SH_ELEC)
320                 {
321                         add_flag(flgs, TR_RES_ELEC);
322                         add_flag(flgs, TR_SH_ELEC);
323                 }
324                 else if (add == ESSENCE_SH_COLD)
325                 {
326                         add_flag(flgs, TR_RES_COLD);
327                         add_flag(flgs, TR_SH_COLD);
328                 }
329                 else if (add == ESSENCE_RESISTANCE)
330                 {
331                         add_flag(flgs, TR_RES_ACID);
332                         add_flag(flgs, TR_RES_ELEC);
333                         add_flag(flgs, TR_RES_FIRE);
334                         add_flag(flgs, TR_RES_COLD);
335                 }
336         }
337 }
338
339 /*!
340  * @brief オブジェクトの発動効果名称を返す(サブルーチン/ブレス)
341  * @param o_ptr 名称を取得する元のオブジェクト構造体参照ポインタ
342  * @return cptr 発動名称を返す文字列ポインタ
343  */
344 static cptr item_activation_dragon_breath(object_type *o_ptr)
345 {
346         static char desc[256];
347         u32b flgs[TR_FLAG_SIZE]; /* for resistance flags */
348         int i, n = 0;
349
350         object_flags(o_ptr, flgs);
351         strcpy(desc, _("", "breath "));
352
353         for (i = 0; dragonbreath_info[i].flag != 0; i++)
354         {
355                 if (have_flag(flgs, dragonbreath_info[i].flag))
356                 {
357                         if (n > 0) strcat(desc, _("、", ", "));
358                         strcat(desc, dragonbreath_info[i].name);
359                         n++;
360                 }
361         }
362
363         strcat(desc, _("のブレス(250)", ""));
364
365         return (desc);
366 }
367
368 /*!
369  * @brief オブジェクトの発動効果名称を返す(サブルーチン/汎用)
370  * @param o_ptr 名称を取得する元のオブジェクト構造体参照ポインタ
371  * @return cptr 発動名称を返す文字列ポインタ
372  */
373 static cptr item_activation_aux(object_type *o_ptr)
374 {
375         static char activation_detail[256];
376         cptr desc;
377         char timeout[32];
378         int constant, dice;
379         const activation_type* const act_ptr = find_activation_info(o_ptr);
380
381         if (!act_ptr) return _("未定義", "something undefined");
382
383         desc = act_ptr->desc;
384
385         /* Overwrite description if it is special */
386         switch (act_ptr->index) {
387         case ACT_BR_FIRE:
388                 if ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_FLAMES))
389                         desc = _("火炎のブレス (200) と火への耐性", "breath of fire (200) and resist fire");
390                 break;
391         case ACT_BR_COLD:
392                 if ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_ICE))
393                         desc = _("冷気のブレス (200) と冷気への耐性", "breath of cold (200) and resist cold");
394                 break;
395         case ACT_BR_DRAGON:
396                 desc = item_activation_dragon_breath(o_ptr);
397                 break;
398         case ACT_AGGRAVATE:
399                 if (o_ptr->name1 == ART_HYOUSIGI)
400                         desc = _("拍子木を打ちならす", "beat wooden clappers");
401                 break;
402         case ACT_RESIST_ACID:
403                 if (((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_ACID)) || (o_ptr->name2 == EGO_BRAND_ACID))
404                         desc = _("アシッド・ボール (100) と酸への耐性", "ball of acid (100) and resist acid");
405                 break;
406         case ACT_RESIST_FIRE:
407                 if (((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_FLAMES)) || (o_ptr->name2 == EGO_BRAND_FIRE))
408                         desc = _("ファイア・ボール (100) と火への耐性", "ball of fire (100) and resist fire");
409                 break;
410         case ACT_RESIST_COLD:
411                 if (((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_ICE)) || (o_ptr->name2 == EGO_BRAND_COLD))
412                         desc = _("アイス・ボール (100) と冷気への耐性", "ball of cold (100) and resist cold");
413                 break;
414         case ACT_RESIST_ELEC:
415                 if (((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_ELEC)) || (o_ptr->name2 == EGO_BRAND_ELEC))
416                         desc = _("サンダー・ボール (100) と電撃への耐性", "ball of elec (100) and resist elec");
417                 break;
418         case ACT_RESIST_POIS:
419                 if (o_ptr->name2 == EGO_BRAND_POIS)
420                         desc = _("悪臭雲 (100) と毒への耐性", "ball of poison (100) and resist elec");
421                 break;
422         }
423
424         /* Timeout description */
425         constant = act_ptr->timeout.constant;
426         dice = act_ptr->timeout.dice;
427         if (constant == 0 && dice == 0) {
428                 /* We can activate it every turn */
429                 strcpy(timeout, _("いつでも", "every turn"));
430         } else if (constant < 0) {
431                 /* Activations that have special timeout */
432                 switch (act_ptr->index) {
433                 case ACT_BR_FIRE:
434                         sprintf(timeout, _("%d ターン毎", "every %d turns"),
435                                 ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_FLAMES)) ? 200 : 250);
436                         break;
437                 case ACT_BR_COLD:
438                         sprintf(timeout, _("%d ターン毎", "every %d turns"),
439                                 ((o_ptr->tval == TV_RING) && (o_ptr->sval == SV_RING_ICE)) ? 200 : 250);
440                         break;
441                 case ACT_TERROR:
442                         strcpy(timeout, _("3*(レベル+10) ターン毎", "every 3 * (level+10) turns"));
443                         break;
444                 case ACT_MURAMASA:
445                         strcpy(timeout, _("確率50%で壊れる", "(destroyed 50%)"));
446                         break;
447                 default:
448                         strcpy(timeout, "undefined");
449                         break;
450                 }
451         } else {
452                 /* Normal timeout activations */
453                 char constant_str[16], dice_str[16];
454                 sprintf(constant_str, "%d", constant);
455                 sprintf(dice_str, "d%d", dice);
456                 sprintf(timeout, _("%s%s%s ターン毎", "every %s%s%s turns"),
457                         (constant > 0) ? constant_str : "",
458                         (constant > 0 && dice > 0) ? "+" : "",
459                         (dice > 0) ? dice_str : "");
460         }
461
462         /* Build detail activate description */
463         sprintf(activation_detail, _("%s : %s", "%s %s"), desc, timeout);
464
465         return activation_detail;
466 }
467
468 /*!
469  * @brief オブジェクトの発動効果名称を返す(メインルーチン) /
470  * Determine the "Activation" (if any) for an artifact Return a string, or NULL for "no activation"
471  * @param o_ptr 名称を取得する元のオブジェクト構造体参照ポインタ
472  * @return cptr 発動名称を返す文字列ポインタ
473  */
474 cptr item_activation(object_type *o_ptr)
475 {
476         u32b flgs[TR_FLAG_SIZE];
477
478         /* Extract the flags */
479         object_flags(o_ptr, flgs);
480
481         /* Require activation ability */
482 #ifdef JP
483         if (!(have_flag(flgs, TR_ACTIVATE))) return ("なし");
484 #else
485         if (!(have_flag(flgs, TR_ACTIVATE))) return ("nothing");
486 #endif
487
488         /* Get an explain of an activation */
489         if (activation_index(o_ptr))
490         {
491                 return item_activation_aux(o_ptr);
492         }
493
494         /* Special items */
495         if (o_ptr->tval == TV_WHISTLE)
496         {
497 #ifdef JP
498 return "ペット呼び寄せ : 100+d100ターン毎";
499 #else
500                 return "call pet every 100+d100 turns";
501 #endif
502         }
503
504         if (o_ptr->tval == TV_CAPTURE)
505         {
506 #ifdef JP
507 return "モンスターを捕える、又は解放する。";
508 #else
509                 return "captures or releases a monster.";
510 #endif
511         }
512
513         /* Oops */
514 #ifdef JP
515         return "何も起きない";
516 #else
517         return "Nothing";
518 #endif
519 }
520
521
522 /*!
523  * @brief オブジェクトの*鑑定*内容を詳述して表示する /
524  * Describe a "fully identified" item
525  * @param o_ptr *鑑定*情報を取得する元のオブジェクト構造体参照ポインタ
526  * @param mode 表示オプション
527  * @return 特筆すべき情報が一つでもあった場合TRUE、一つもなく表示がキャンセルされた場合FALSEを返す。
528  */
529 bool screen_object(object_type *o_ptr, u32b mode)
530 {
531         int                     i = 0, j, k;
532
533         u32b flgs[TR_FLAG_SIZE];
534
535         char temp[70 * 20];
536         cptr            info[128];
537         char o_name[MAX_NLEN];
538         int wid, hgt;
539         int rad;
540         char desc[256];
541
542         int trivial_info = 0;
543
544         /* Extract the flags */
545         object_flags(o_ptr, flgs);
546
547         /* Extract the description */
548         {
549                 roff_to_buf(o_ptr->name1 ? (a_text + a_info[o_ptr->name1].text) :
550                             (k_text + k_info[o_ptr->k_idx].text),
551                             77 - 15, temp, sizeof(temp));
552                 for (j = 0; temp[j]; j += 1 + strlen(&temp[j]))
553                 { info[i] = &temp[j]; i++;}
554         }
555
556         if (object_is_equipment(o_ptr))
557         {
558                 /* Descriptions of a basic equipment is just a flavor */
559                 trivial_info = i;
560         }
561
562         /* Mega-Hack -- describe activation */
563         if (have_flag(flgs, TR_ACTIVATE))
564         {
565 #ifdef JP
566 info[i++] = "始動したときの効果...";
567 #else
568                 info[i++] = "It can be activated for...";
569 #endif
570
571                 info[i++] = item_activation(o_ptr);
572 #ifdef JP
573 info[i++] = "...ただし装備していなければならない。";
574 #else
575                 info[i++] = "...if it is being worn.";
576 #endif
577
578         }
579
580         /* Figurines, a hack */
581         if (o_ptr->tval == TV_FIGURINE)
582         {
583 #ifdef JP
584 info[i++] = "それは投げた時ペットに変化する。";
585 #else
586                 info[i++] = "It will transform into a pet when thrown.";
587 #endif
588
589         }
590
591         /* Figurines, a hack */
592         if (o_ptr->name1 == ART_STONEMASK)
593         {
594 #ifdef JP
595 info[i++] = "それを装備した者は吸血鬼になる。";
596 #else
597                 info[i++] = "It makes you turn into a vampire permanently.";
598 #endif
599
600         }
601
602         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI))
603         {
604 #ifdef JP
605 info[i++] = "それは相手を一撃で倒すことがある。";
606 #else
607                 info[i++] = "It will attempt to kill a monster instantly.";
608 #endif
609
610         }
611
612         if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE))
613         {
614 #ifdef JP
615 info[i++] = "それは自分自身に攻撃が返ってくることがある。";
616 #else
617                 info[i++] = "It causes you to strike yourself sometimes.";
618 #endif
619
620 #ifdef JP
621 info[i++] = "それは無敵のバリアを切り裂く。";
622 #else
623                 info[i++] = "It always penetrates invulnerability barriers.";
624 #endif
625         }
626
627         if (o_ptr->name2 == EGO_2WEAPON)
628         {
629 #ifdef JP
630 info[i++] = "それは二刀流での命中率を向上させる。";
631 #else
632                 info[i++] = "It affects your ability to hit when you are wielding two weapons.";
633 #endif
634
635         }
636
637         if (have_flag(flgs, TR_EASY_SPELL))
638         {
639 #ifdef JP
640 info[i++] = "それは魔法の難易度を下げる。";
641 #else
642                 info[i++] = "It affects your ability to cast spells.";
643 #endif
644         }
645
646         if (o_ptr->name2 == EGO_AMU_FOOL)
647         {
648 #ifdef JP
649 info[i++] = "それは魔法の難易度を上げる。";
650 #else
651                 info[i++] = "It interferes with casting spells.";
652 #endif
653         }
654
655         if (o_ptr->name2 == EGO_RING_THROW)
656         {
657 #ifdef JP
658 info[i++] = "それは物を強く投げることを可能にする。";
659 #else
660                 info[i++] = "It provides great strength when you throw an item.";
661 #endif
662         }
663
664         if (o_ptr->name2 == EGO_AMU_NAIVETY)
665         {
666 #ifdef JP
667 info[i++] = "それは魔法抵抗力を下げる。";
668 #else
669                 info[i++] = "It decreases your magic resistance.";
670 #endif
671         }
672
673         if (o_ptr->tval == TV_STATUE)
674         {
675                 monster_race *r_ptr = &r_info[o_ptr->pval];
676
677                 if (o_ptr->pval == MON_BULLGATES)
678 #ifdef JP
679                         info[i++] = "それは部屋に飾ると恥ずかしい。";
680 #else
681                         info[i++] = "It is shameful.";
682 #endif
683                 else if ( r_ptr->flags2 & (RF2_ELDRITCH_HORROR))
684 #ifdef JP
685                         info[i++] = "それは部屋に飾ると恐い。";
686 #else
687                 info[i++] = "It is fearful.";
688 #endif
689                 else
690 #ifdef JP
691                         info[i++] = "それは部屋に飾ると楽しい。";
692 #else
693                 info[i++] = "It is cheerful.";
694 #endif
695         }
696         
697         /* Hack -- describe lite's */
698         
699         if (o_ptr->name2 == EGO_LITE_DARKNESS) info[i++] = _("それは全く光らない。", "It provides no light.");
700         
701         rad = 0;
702         if (have_flag(flgs, TR_LITE_1) && o_ptr->name2 != EGO_LITE_DARKNESS)  rad += 1;
703         if (have_flag(flgs, TR_LITE_2) && o_ptr->name2 != EGO_LITE_DARKNESS)  rad += 2;
704         if (have_flag(flgs, TR_LITE_3) && o_ptr->name2 != EGO_LITE_DARKNESS)  rad += 3;
705         if (have_flag(flgs, TR_LITE_M1)) rad -= 1;
706         if (have_flag(flgs, TR_LITE_M2)) rad -= 2;
707         if (have_flag(flgs, TR_LITE_M3)) rad -= 3;
708         
709         if(o_ptr->name2 == EGO_LITE_SHINE) rad++;
710                 
711         if (have_flag(flgs, TR_LITE_FUEL) && o_ptr->name2 != EGO_LITE_DARKNESS)
712         {
713                 if(rad > 0) sprintf(desc, _("それは燃料補給によって明かり(半径 %d)を授ける。", "It provides light (radius %d) when fueled."), rad);        
714         }
715         else
716         {
717                 if(rad > 0) sprintf(desc, _("それは永遠なる明かり(半径 %d)を授ける。", "It provides light (radius %d) forever."), rad);        
718                 if(rad < 0) sprintf(desc, _("それは明かりの半径を狭める(半径に-%d)。", "It decreases radius of light source by %d."), -rad);
719         }
720         
721         if(rad != 0) info[i++] = desc;
722
723         
724         if (o_ptr->name2 == EGO_LITE_LONG)
725         {
726                 info[i++] = _("それは長いターン明かりを授ける。", "It provides light for much longer time.");
727         }
728
729         /* And then describe it fully */
730
731         if (have_flag(flgs, TR_RIDING))
732         {
733                 if ((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE)))
734 #ifdef JP
735 info[i++] = "それは乗馬中は非常に使いやすい。";
736 #else
737                         info[i++] = "It is made for use while riding.";
738 #endif
739                 else
740                 {
741 #ifdef JP
742                         info[i++] = "それは乗馬中でも使いやすい。";
743 #else
744                         info[i++] = "It is suitable for use while riding.";
745 #endif
746                         /* This information is not important enough */
747                         trivial_info++;
748                 }
749         }
750         if (have_flag(flgs, TR_STR))
751         {
752 #ifdef JP
753 info[i++] = "それは腕力に影響を及ぼす。";
754 #else
755                 info[i++] = "It affects your strength.";
756 #endif
757
758         }
759         if (have_flag(flgs, TR_INT))
760         {
761 #ifdef JP
762 info[i++] = "それは知能に影響を及ぼす。";
763 #else
764                 info[i++] = "It affects your intelligence.";
765 #endif
766
767         }
768         if (have_flag(flgs, TR_WIS))
769         {
770 #ifdef JP
771 info[i++] = "それは賢さに影響を及ぼす。";
772 #else
773                 info[i++] = "It affects your wisdom.";
774 #endif
775
776         }
777         if (have_flag(flgs, TR_DEX))
778         {
779 #ifdef JP
780 info[i++] = "それは器用さに影響を及ぼす。";
781 #else
782                 info[i++] = "It affects your dexterity.";
783 #endif
784
785         }
786         if (have_flag(flgs, TR_CON))
787         {
788 #ifdef JP
789 info[i++] = "それは耐久力に影響を及ぼす。";
790 #else
791                 info[i++] = "It affects your constitution.";
792 #endif
793
794         }
795         if (have_flag(flgs, TR_CHR))
796         {
797 #ifdef JP
798 info[i++] = "それは魅力に影響を及ぼす。";
799 #else
800                 info[i++] = "It affects your charisma.";
801 #endif
802
803         }
804
805         if (have_flag(flgs, TR_MAGIC_MASTERY))
806         {
807 #ifdef JP
808 info[i++] = "それは魔法道具使用能力に影響を及ぼす。";
809 #else
810                 info[i++] = "It affects your ability to use magic devices.";
811 #endif
812
813         }
814         if (have_flag(flgs, TR_STEALTH))
815         {
816 #ifdef JP
817 info[i++] = "それは隠密行動能力に影響を及ぼす。";
818 #else
819                 info[i++] = "It affects your stealth.";
820 #endif
821
822         }
823         if (have_flag(flgs, TR_SEARCH))
824         {
825 #ifdef JP
826 info[i++] = "それは探索能力に影響を及ぼす。";
827 #else
828                 info[i++] = "It affects your searching.";
829 #endif
830
831         }
832         if (have_flag(flgs, TR_INFRA))
833         {
834 #ifdef JP
835 info[i++] = "それは赤外線視力に影響を及ぼす。";
836 #else
837                 info[i++] = "It affects your infravision.";
838 #endif
839
840         }
841         if (have_flag(flgs, TR_TUNNEL))
842         {
843 #ifdef JP
844 info[i++] = "それは採掘能力に影響を及ぼす。";
845 #else
846                 info[i++] = "It affects your ability to tunnel.";
847 #endif
848
849         }
850         if (have_flag(flgs, TR_SPEED))
851         {
852 #ifdef JP
853 info[i++] = "それはスピードに影響を及ぼす。";
854 #else
855                 info[i++] = "It affects your speed.";
856 #endif
857
858         }
859         if (have_flag(flgs, TR_BLOWS))
860         {
861 #ifdef JP
862 info[i++] = "それは打撃回数に影響を及ぼす。";
863 #else
864                 info[i++] = "It affects your attack speed.";
865 #endif
866
867         }
868
869         if (have_flag(flgs, TR_BRAND_ACID))
870         {
871 #ifdef JP
872 info[i++] = "それは酸によって大きなダメージを与える。";
873 #else
874                 info[i++] = "It does extra damage from acid.";
875 #endif
876
877         }
878         if (have_flag(flgs, TR_BRAND_ELEC))
879         {
880 #ifdef JP
881 info[i++] = "それは電撃によって大きなダメージを与える。";
882 #else
883                 info[i++] = "It does extra damage from electricity.";
884 #endif
885
886         }
887         if (have_flag(flgs, TR_BRAND_FIRE))
888         {
889 #ifdef JP
890 info[i++] = "それは火炎によって大きなダメージを与える。";
891 #else
892                 info[i++] = "It does extra damage from fire.";
893 #endif
894
895         }
896         if (have_flag(flgs, TR_BRAND_COLD))
897         {
898 #ifdef JP
899 info[i++] = "それは冷気によって大きなダメージを与える。";
900 #else
901                 info[i++] = "It does extra damage from frost.";
902 #endif
903
904         }
905
906         if (have_flag(flgs, TR_BRAND_POIS))
907         {
908 #ifdef JP
909 info[i++] = "それは敵を毒する。";
910 #else
911                 info[i++] = "It poisons your foes.";
912 #endif
913
914         }
915
916         if (have_flag(flgs, TR_CHAOTIC))
917         {
918 #ifdef JP
919 info[i++] = "それはカオス的な効果を及ぼす。";
920 #else
921                 info[i++] = "It produces chaotic effects.";
922 #endif
923
924         }
925
926         if (have_flag(flgs, TR_VAMPIRIC))
927         {
928 #ifdef JP
929 info[i++] = "それは敵から生命力を吸収する。";
930 #else
931                 info[i++] = "It drains life from your foes.";
932 #endif
933
934         }
935
936         if (have_flag(flgs, TR_IMPACT))
937         {
938 #ifdef JP
939 info[i++] = "それは地震を起こすことができる。";
940 #else
941                 info[i++] = "It can cause earthquakes.";
942 #endif
943
944         }
945
946         if (have_flag(flgs, TR_VORPAL))
947         {
948 #ifdef JP
949 info[i++] = "それは非常に切れ味が鋭く敵を切断することができる。";
950 #else
951                 info[i++] = "It is very sharp and can cut your foes.";
952 #endif
953
954         }
955
956         if (have_flag(flgs, TR_KILL_DRAGON))
957         {
958 #ifdef JP
959 info[i++] = "それはドラゴンにとっての天敵である。";
960 #else
961                 info[i++] = "It is a great bane of dragons.";
962 #endif
963
964         }
965         else if (have_flag(flgs, TR_SLAY_DRAGON))
966         {
967 #ifdef JP
968 info[i++] = "それはドラゴンに対して特に恐るべき力を発揮する。";
969 #else
970                 info[i++] = "It is especially deadly against dragons.";
971 #endif
972
973         }
974
975         if (have_flag(flgs, TR_KILL_ORC))
976         {
977 #ifdef JP
978 info[i++] = "それはオークにとっての天敵である。";
979 #else
980                 info[i++] = "It is a great bane of orcs.";
981 #endif
982
983         }
984         if (have_flag(flgs, TR_SLAY_ORC))
985         {
986 #ifdef JP
987 info[i++] = "それはオークに対して特に恐るべき力を発揮する。";
988 #else
989                 info[i++] = "It is especially deadly against orcs.";
990 #endif
991
992         }
993
994         if (have_flag(flgs, TR_KILL_TROLL))
995         {
996 #ifdef JP
997 info[i++] = "それはトロルにとっての天敵である。";
998 #else
999                 info[i++] = "It is a great bane of trolls.";
1000 #endif
1001
1002         }
1003         if (have_flag(flgs, TR_SLAY_TROLL))
1004         {
1005 #ifdef JP
1006 info[i++] = "それはトロルに対して特に恐るべき力を発揮する。";
1007 #else
1008                 info[i++] = "It is especially deadly against trolls.";
1009 #endif
1010
1011         }
1012
1013         if (have_flag(flgs, TR_KILL_GIANT))
1014         {
1015 #ifdef JP
1016 info[i++] = "それは巨人にとっての天敵である。";
1017 #else
1018                 info[i++] = "It is a great bane of giants.";
1019 #endif
1020         }
1021         else if (have_flag(flgs, TR_SLAY_GIANT))
1022         {
1023 #ifdef JP
1024 info[i++] = "それはジャイアントに対して特に恐るべき力を発揮する。";
1025 #else
1026                 info[i++] = "It is especially deadly against giants.";
1027 #endif
1028
1029         }
1030
1031         if (have_flag(flgs, TR_KILL_DEMON))
1032         {
1033 #ifdef JP
1034 info[i++] = "それはデーモンにとっての天敵である。";
1035 #else
1036                 info[i++] = "It is a great bane of demons.";
1037 #endif
1038
1039         }
1040         if (have_flag(flgs, TR_SLAY_DEMON))
1041         {
1042 #ifdef JP
1043 info[i++] = "それはデーモンに対して聖なる力を発揮する。";
1044 #else
1045                 info[i++] = "It strikes at demons with holy wrath.";
1046 #endif
1047
1048         }
1049
1050         if (have_flag(flgs, TR_KILL_UNDEAD))
1051         {
1052 #ifdef JP
1053 info[i++] = "それはアンデッドにとっての天敵である。";
1054 #else
1055                 info[i++] = "It is a great bane of undead.";
1056 #endif
1057
1058         }
1059         if (have_flag(flgs, TR_SLAY_UNDEAD))
1060         {
1061 #ifdef JP
1062 info[i++] = "それはアンデッドに対して聖なる力を発揮する。";
1063 #else
1064                 info[i++] = "It strikes at undead with holy wrath.";
1065 #endif
1066
1067         }
1068
1069         if (have_flag(flgs, TR_KILL_EVIL))
1070         {
1071 #ifdef JP
1072 info[i++] = "それは邪悪なる存在にとっての天敵である。";
1073 #else
1074                 info[i++] = "It is a great bane of evil monsters.";
1075 #endif
1076
1077         }
1078         if (have_flag(flgs, TR_SLAY_EVIL))
1079         {
1080 #ifdef JP
1081 info[i++] = "それは邪悪なる存在に対して聖なる力で攻撃する。";
1082 #else
1083                 info[i++] = "It fights against evil with holy fury.";
1084 #endif
1085
1086         }
1087
1088         if (have_flag(flgs, TR_KILL_ANIMAL))
1089         {
1090 #ifdef JP
1091 info[i++] = "それは自然界の動物にとっての天敵である。";
1092 #else
1093                 info[i++] = "It is a great bane of natural creatures.";
1094 #endif
1095
1096         }
1097         if (have_flag(flgs, TR_SLAY_ANIMAL))
1098         {
1099 #ifdef JP
1100 info[i++] = "それは自然界の動物に対して特に恐るべき力を発揮する。";
1101 #else
1102                 info[i++] = "It is especially deadly against natural creatures.";
1103 #endif
1104
1105         }
1106
1107         if (have_flag(flgs, TR_KILL_HUMAN))
1108         {
1109 #ifdef JP
1110 info[i++] = "それは人間にとっての天敵である。";
1111 #else
1112                 info[i++] = "It is a great bane of humans.";
1113 #endif
1114
1115         }
1116         if (have_flag(flgs, TR_SLAY_HUMAN))
1117         {
1118 #ifdef JP
1119 info[i++] = "それは人間に対して特に恐るべき力を発揮する。";
1120 #else
1121                 info[i++] = "It is especially deadly against humans.";
1122 #endif
1123
1124         }
1125
1126         if (have_flag(flgs, TR_FORCE_WEAPON))
1127         {
1128 #ifdef JP
1129 info[i++] = "それは使用者の魔力を使って攻撃する。";
1130 #else
1131                 info[i++] = "It powerfully strikes at a monster using your mana.";
1132 #endif
1133
1134         }
1135         if (have_flag(flgs, TR_DEC_MANA))
1136         {
1137 #ifdef JP
1138 info[i++] = "それは魔力の消費を押さえる。";
1139 #else
1140                 info[i++] = "It decreases your mana consumption.";
1141 #endif
1142
1143         }
1144         if (have_flag(flgs, TR_SUST_STR))
1145         {
1146 #ifdef JP
1147 info[i++] = "それはあなたの腕力を維持する。";
1148 #else
1149                 info[i++] = "It sustains your strength.";
1150 #endif
1151
1152         }
1153         if (have_flag(flgs, TR_SUST_INT))
1154         {
1155 #ifdef JP
1156 info[i++] = "それはあなたの知能を維持する。";
1157 #else
1158                 info[i++] = "It sustains your intelligence.";
1159 #endif
1160
1161         }
1162         if (have_flag(flgs, TR_SUST_WIS))
1163         {
1164 #ifdef JP
1165 info[i++] = "それはあなたの賢さを維持する。";
1166 #else
1167                 info[i++] = "It sustains your wisdom.";
1168 #endif
1169
1170         }
1171         if (have_flag(flgs, TR_SUST_DEX))
1172         {
1173 #ifdef JP
1174 info[i++] = "それはあなたの器用さを維持する。";
1175 #else
1176                 info[i++] = "It sustains your dexterity.";
1177 #endif
1178
1179         }
1180         if (have_flag(flgs, TR_SUST_CON))
1181         {
1182 #ifdef JP
1183 info[i++] = "それはあなたの耐久力を維持する。";
1184 #else
1185                 info[i++] = "It sustains your constitution.";
1186 #endif
1187
1188         }
1189         if (have_flag(flgs, TR_SUST_CHR))
1190         {
1191 #ifdef JP
1192 info[i++] = "それはあなたの魅力を維持する。";
1193 #else
1194                 info[i++] = "It sustains your charisma.";
1195 #endif
1196
1197         }
1198
1199         if (have_flag(flgs, TR_IM_ACID))
1200         {
1201 #ifdef JP
1202 info[i++] = "それは酸に対する完全な免疫を授ける。";
1203 #else
1204                 info[i++] = "It provides immunity to acid.";
1205 #endif
1206
1207         }
1208         if (have_flag(flgs, TR_IM_ELEC))
1209         {
1210 #ifdef JP
1211 info[i++] = "それは電撃に対する完全な免疫を授ける。";
1212 #else
1213                 info[i++] = "It provides immunity to electricity.";
1214 #endif
1215
1216         }
1217         if (have_flag(flgs, TR_IM_FIRE))
1218         {
1219 #ifdef JP
1220 info[i++] = "それは火に対する完全な免疫を授ける。";
1221 #else
1222                 info[i++] = "It provides immunity to fire.";
1223 #endif
1224
1225         }
1226         if (have_flag(flgs, TR_IM_COLD))
1227         {
1228 #ifdef JP
1229 info[i++] = "それは寒さに対する完全な免疫を授ける。";
1230 #else
1231                 info[i++] = "It provides immunity to cold.";
1232 #endif
1233
1234         }
1235
1236         if (have_flag(flgs, TR_THROW))
1237         {
1238 #ifdef JP
1239 info[i++] = "それは敵に投げて大きなダメージを与えることができる。";
1240 #else
1241                 info[i++] = "It is perfectly balanced for throwing.";
1242 #endif
1243         }
1244
1245         if (have_flag(flgs, TR_FREE_ACT))
1246         {
1247 #ifdef JP
1248 info[i++] = "それは麻痺に対する完全な免疫を授ける。";
1249 #else
1250                 info[i++] = "It provides immunity to paralysis.";
1251 #endif
1252
1253         }
1254         if (have_flag(flgs, TR_HOLD_EXP))
1255         {
1256 #ifdef JP
1257 info[i++] = "それは経験値吸収に対する耐性を授ける。";
1258 #else
1259                 info[i++] = "It provides resistance to experience draining.";
1260 #endif
1261
1262         }
1263         if (have_flag(flgs, TR_RES_FEAR))
1264         {
1265 #ifdef JP
1266 info[i++] = "それは恐怖への完全な耐性を授ける。";
1267 #else
1268                 info[i++] = "It makes you completely fearless.";
1269 #endif
1270
1271         }
1272         if (have_flag(flgs, TR_RES_ACID))
1273         {
1274 #ifdef JP
1275 info[i++] = "それは酸への耐性を授ける。";
1276 #else
1277                 info[i++] = "It provides resistance to acid.";
1278 #endif
1279
1280         }
1281         if (have_flag(flgs, TR_RES_ELEC))
1282         {
1283 #ifdef JP
1284 info[i++] = "それは電撃への耐性を授ける。";
1285 #else
1286                 info[i++] = "It provides resistance to electricity.";
1287 #endif
1288
1289         }
1290         if (have_flag(flgs, TR_RES_FIRE))
1291         {
1292 #ifdef JP
1293 info[i++] = "それは火への耐性を授ける。";
1294 #else
1295                 info[i++] = "It provides resistance to fire.";
1296 #endif
1297
1298         }
1299         if (have_flag(flgs, TR_RES_COLD))
1300         {
1301 #ifdef JP
1302 info[i++] = "それは寒さへの耐性を授ける。";
1303 #else
1304                 info[i++] = "It provides resistance to cold.";
1305 #endif
1306
1307         }
1308         if (have_flag(flgs, TR_RES_POIS))
1309         {
1310 #ifdef JP
1311 info[i++] = "それは毒への耐性を授ける。";
1312 #else
1313                 info[i++] = "It provides resistance to poison.";
1314 #endif
1315
1316         }
1317
1318         if (have_flag(flgs, TR_RES_LITE))
1319         {
1320 #ifdef JP
1321 info[i++] = "それは閃光への耐性を授ける。";
1322 #else
1323                 info[i++] = "It provides resistance to light.";
1324 #endif
1325
1326         }
1327         if (have_flag(flgs, TR_RES_DARK))
1328         {
1329 #ifdef JP
1330 info[i++] = "それは暗黒への耐性を授ける。";
1331 #else
1332                 info[i++] = "It provides resistance to dark.";
1333 #endif
1334
1335         }
1336
1337         if (have_flag(flgs, TR_RES_BLIND))
1338         {
1339 #ifdef JP
1340 info[i++] = "それは盲目への耐性を授ける。";
1341 #else
1342                 info[i++] = "It provides resistance to blindness.";
1343 #endif
1344
1345         }
1346         if (have_flag(flgs, TR_RES_CONF))
1347         {
1348 #ifdef JP
1349 info[i++] = "それは混乱への耐性を授ける。";
1350 #else
1351                 info[i++] = "It provides resistance to confusion.";
1352 #endif
1353
1354         }
1355         if (have_flag(flgs, TR_RES_SOUND))
1356         {
1357 #ifdef JP
1358 info[i++] = "それは轟音への耐性を授ける。";
1359 #else
1360                 info[i++] = "It provides resistance to sound.";
1361 #endif
1362
1363         }
1364         if (have_flag(flgs, TR_RES_SHARDS))
1365         {
1366 #ifdef JP
1367 info[i++] = "それは破片への耐性を授ける。";
1368 #else
1369                 info[i++] = "It provides resistance to shards.";
1370 #endif
1371
1372         }
1373
1374         if (have_flag(flgs, TR_RES_NETHER))
1375         {
1376 #ifdef JP
1377 info[i++] = "それは地獄への耐性を授ける。";
1378 #else
1379                 info[i++] = "It provides resistance to nether.";
1380 #endif
1381
1382         }
1383         if (have_flag(flgs, TR_RES_NEXUS))
1384         {
1385 #ifdef JP
1386 info[i++] = "それは因果混乱への耐性を授ける。";
1387 #else
1388                 info[i++] = "It provides resistance to nexus.";
1389 #endif
1390
1391         }
1392         if (have_flag(flgs, TR_RES_CHAOS))
1393         {
1394 #ifdef JP
1395 info[i++] = "それはカオスへの耐性を授ける。";
1396 #else
1397                 info[i++] = "It provides resistance to chaos.";
1398 #endif
1399
1400         }
1401         if (have_flag(flgs, TR_RES_DISEN))
1402         {
1403 #ifdef JP
1404 info[i++] = "それは劣化への耐性を授ける。";
1405 #else
1406                 info[i++] = "It provides resistance to disenchantment.";
1407 #endif
1408
1409         }
1410
1411         if (have_flag(flgs, TR_LEVITATION))
1412         {
1413 #ifdef JP
1414 info[i++] = "それは宙に浮くことを可能にする。";
1415 #else
1416                 info[i++] = "It allows you to levitate.";
1417 #endif
1418
1419         }
1420                 
1421         if (have_flag(flgs, TR_SEE_INVIS))
1422         {
1423                 info[i++] = _("それは透明なモンスターを見ることを可能にする。", "It allows you to see invisible monsters.");
1424         }
1425         if (have_flag(flgs, TR_TELEPATHY))
1426         {
1427 #ifdef JP
1428 info[i++] = "それはテレパシー能力を授ける。";
1429 #else
1430                 info[i++] = "It gives telepathic powers.";
1431 #endif
1432
1433         }
1434         if (have_flag(flgs, TR_ESP_ANIMAL))
1435         {
1436 #ifdef JP
1437 info[i++] = "それは自然界の生物を感知する。";
1438 #else
1439                 info[i++] = "It senses natural creatures.";
1440 #endif
1441
1442         }
1443         if (have_flag(flgs, TR_ESP_UNDEAD))
1444         {
1445 #ifdef JP
1446 info[i++] = "それはアンデッドを感知する。";
1447 #else
1448                 info[i++] = "It senses undead.";
1449 #endif
1450
1451         }
1452         if (have_flag(flgs, TR_ESP_DEMON))
1453         {
1454 #ifdef JP
1455 info[i++] = "それは悪魔を感知する。";
1456 #else
1457                 info[i++] = "It senses demons.";
1458 #endif
1459
1460         }
1461         if (have_flag(flgs, TR_ESP_ORC))
1462         {
1463 #ifdef JP
1464 info[i++] = "それはオークを感知する。";
1465 #else
1466                 info[i++] = "It senses orcs.";
1467 #endif
1468
1469         }
1470         if (have_flag(flgs, TR_ESP_TROLL))
1471         {
1472 #ifdef JP
1473 info[i++] = "それはトロルを感知する。";
1474 #else
1475                 info[i++] = "It senses trolls.";
1476 #endif
1477
1478         }
1479         if (have_flag(flgs, TR_ESP_GIANT))
1480         {
1481 #ifdef JP
1482 info[i++] = "それは巨人を感知する。";
1483 #else
1484                 info[i++] = "It senses giants.";
1485 #endif
1486
1487         }
1488         if (have_flag(flgs, TR_ESP_DRAGON))
1489         {
1490 #ifdef JP
1491 info[i++] = "それはドラゴンを感知する。";
1492 #else
1493                 info[i++] = "It senses dragons.";
1494 #endif
1495
1496         }
1497         if (have_flag(flgs, TR_ESP_HUMAN))
1498         {
1499 #ifdef JP
1500 info[i++] = "それは人間を感知する。";
1501 #else
1502                 info[i++] = "It senses humans.";
1503 #endif
1504
1505         }
1506         if (have_flag(flgs, TR_ESP_EVIL))
1507         {
1508 #ifdef JP
1509 info[i++] = "それは邪悪な存在を感知する。";
1510 #else
1511                 info[i++] = "It senses evil creatures.";
1512 #endif
1513
1514         }
1515         if (have_flag(flgs, TR_ESP_GOOD))
1516         {
1517 #ifdef JP
1518 info[i++] = "それは善良な存在を感知する。";
1519 #else
1520                 info[i++] = "It senses good creatures.";
1521 #endif
1522
1523         }
1524         if (have_flag(flgs, TR_ESP_NONLIVING))
1525         {
1526 #ifdef JP
1527 info[i++] = "それは活動する無生物体を感知する。";
1528 #else
1529                 info[i++] = "It senses non-living creatures.";
1530 #endif
1531
1532         }
1533         if (have_flag(flgs, TR_ESP_UNIQUE))
1534         {
1535 #ifdef JP
1536 info[i++] = "それは特別な強敵を感知する。";
1537 #else
1538                 info[i++] = "It senses unique monsters.";
1539 #endif
1540
1541         }
1542         if (have_flag(flgs, TR_SLOW_DIGEST))
1543         {
1544 #ifdef JP
1545 info[i++] = "それはあなたの新陳代謝を遅くする。";
1546 #else
1547                 info[i++] = "It slows your metabolism.";
1548 #endif
1549
1550         }
1551         if (have_flag(flgs, TR_REGEN))
1552         {
1553 #ifdef JP
1554 info[i++] = "それは体力回復力を強化する。";
1555 #else
1556                 info[i++] = "It speeds your regenerative powers.";
1557 #endif
1558
1559         }
1560         if (have_flag(flgs, TR_WARNING))
1561         {
1562 #ifdef JP
1563 info[i++] = "それは危険に対して警告を発する。";
1564 #else
1565                 info[i++] = "It warns you of danger";
1566 #endif
1567
1568         }
1569         if (have_flag(flgs, TR_REFLECT))
1570         {
1571                 info[i++] = _("それは矢の呪文を反射する。", "It reflects bolt spells.");
1572         }
1573         if (have_flag(flgs, TR_SH_FIRE))
1574         {
1575                 info[i++] = _("それは炎のバリアを張る。", "It produces a fiery sheath.");
1576         }
1577         if (have_flag(flgs, TR_SH_ELEC))
1578         {
1579                 info[i++] = _("それは電気のバリアを張る。", "It produces an electric sheath.");
1580         }
1581         if (have_flag(flgs, TR_SH_COLD))
1582         {
1583 #ifdef JP
1584 info[i++] = "それは冷気のバリアを張る。";
1585 #else
1586                 info[i++] = "It produces a sheath of coldness.";
1587 #endif
1588
1589         }
1590         if (have_flag(flgs, TR_NO_MAGIC))
1591         {
1592 #ifdef JP
1593 info[i++] = "それは反魔法バリアを張る。";
1594 #else
1595                 info[i++] = "It produces an anti-magic shell.";
1596 #endif
1597
1598         }
1599         if (have_flag(flgs, TR_NO_TELE))
1600         {
1601 #ifdef JP
1602 info[i++] = "それはテレポートを邪魔する。";
1603 #else
1604                 info[i++] = "It prevents teleportation.";
1605 #endif
1606
1607         }
1608         if (have_flag(flgs, TR_XTRA_MIGHT))
1609         {
1610 #ifdef JP
1611 info[i++] = "それは矢/ボルト/弾をより強力に発射することができる。";
1612 #else
1613                 info[i++] = "It fires missiles with extra might.";
1614 #endif
1615
1616         }
1617         if (have_flag(flgs, TR_XTRA_SHOTS))
1618         {
1619 #ifdef JP
1620 info[i++] = "それは矢/ボルト/弾を非常に早く発射することができる。";
1621 #else
1622                 info[i++] = "It fires missiles excessively fast.";
1623 #endif
1624
1625         }
1626
1627         if (have_flag(flgs, TR_BLESSED))
1628         {
1629 #ifdef JP
1630 info[i++] = "それは神に祝福されている。";
1631 #else
1632                 info[i++] = "It has been blessed by the gods.";
1633 #endif
1634
1635         }
1636
1637         if (object_is_cursed(o_ptr))
1638         {
1639                 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
1640                 {
1641 #ifdef JP
1642 info[i++] = "それは永遠の呪いがかけられている。";
1643 #else
1644                         info[i++] = "It is permanently cursed.";
1645 #endif
1646
1647                 }
1648                 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
1649                 {
1650 #ifdef JP
1651 info[i++] = "それは強力な呪いがかけられている。";
1652 #else
1653                         info[i++] = "It is heavily cursed.";
1654 #endif
1655
1656                 }
1657                 else
1658                 {
1659 #ifdef JP
1660 info[i++] = "それは呪われている。";
1661 #else
1662                         info[i++] = "It is cursed.";
1663 #endif
1664
1665                         /*
1666                          * It's a trivial infomation since there is
1667                          * fake inscription {cursed}
1668                          */
1669                         trivial_info++;
1670                 }
1671         }
1672
1673         if ((have_flag(flgs, TR_TY_CURSE)) || (o_ptr->curse_flags & TRC_TY_CURSE))
1674         {
1675                 info[i++] = _("それは太古の禍々しい怨念が宿っている。", "It carries an ancient foul curse.");
1676         }
1677         if ((have_flag(flgs, TR_AGGRAVATE)) || (o_ptr->curse_flags & TRC_AGGRAVATE))
1678         {
1679                 info[i++] = _("それは付近のモンスターを怒らせる。", "It aggravates nearby creatures.");
1680         }
1681         if ((have_flag(flgs, TR_DRAIN_EXP)) || (o_ptr->curse_flags & TRC_DRAIN_EXP))
1682         {
1683                 info[i++] = _("それは経験値を吸い取る。", "It drains experience.");
1684         }
1685         if (o_ptr->curse_flags & TRC_SLOW_REGEN)
1686         {
1687                 info[i++] = _("それは回復力を弱める。", "It slows your regenerative powers.");
1688         }
1689         if ((o_ptr->curse_flags & TRC_ADD_L_CURSE) || have_flag(flgs, TR_ADD_L_CURSE))
1690         {
1691                 info[i++] = _("それは弱い呪いを増やす。","It adds weak curses.");
1692         }
1693         if ((o_ptr->curse_flags & TRC_ADD_H_CURSE) || have_flag(flgs, TR_ADD_H_CURSE))
1694         {
1695                 info[i++] = _("それは強力な呪いを増やす。","It adds heavy curses.");
1696         }
1697         if ((have_flag(flgs, TR_CALL_ANIMAL)) || (o_ptr->curse_flags & TRC_CALL_ANIMAL))
1698         {
1699                 info[i++] = _("それは動物を呼び寄せる。", "It attracts animals.");
1700         }
1701         if ((have_flag(flgs, TR_CALL_DEMON)) || (o_ptr->curse_flags & TRC_CALL_DEMON))
1702         {
1703                 info[i++] = _("それは悪魔を呼び寄せる。", "It attracts demons.");
1704         }
1705         if ((have_flag(flgs, TR_CALL_DRAGON)) || (o_ptr->curse_flags & TRC_CALL_DRAGON))
1706         {
1707                 info[i++] = _("それはドラゴンを呼び寄せる。", "It attracts dragons.");
1708         }
1709         if ((have_flag(flgs, TR_CALL_UNDEAD)) || (o_ptr->curse_flags & TRC_CALL_UNDEAD))
1710         {
1711                 info[i++] = _("それは死霊を呼び寄せる。", "It attracts undeads.");
1712         }
1713         if ((have_flag(flgs, TR_COWARDICE)) ||  (o_ptr->curse_flags & TRC_COWARDICE))
1714         {
1715                 info[i++] = _("それは恐怖感を引き起こす。", "It makes you subject to cowardice.");
1716         }
1717         if ((have_flag(flgs, TR_TELEPORT)) || (o_ptr->curse_flags & TRC_TELEPORT))
1718         {
1719                 info[i++] = _("それはランダムなテレポートを引き起こす。", "It induces random teleportation.");
1720         }
1721         if ((have_flag(flgs, TR_LOW_MELEE)) || o_ptr->curse_flags & TRC_LOW_MELEE)
1722         {
1723                 info[i++] = _("それは攻撃を外しやすい。", "It causes you to miss blows.");
1724         }
1725         if ((have_flag(flgs, TR_LOW_AC)) || (o_ptr->curse_flags & TRC_LOW_AC))
1726         {
1727                 info[i++] = _("それは攻撃を受けやすい。", "It helps your enemies' blows.");
1728         }
1729         if ((have_flag(flgs, TR_LOW_MAGIC)) || (o_ptr->curse_flags & TRC_LOW_MAGIC))
1730         {
1731                 info[i++] = _("それは魔法を唱えにくくする。", "It encumbers you while spellcasting.");
1732         }
1733         if ((have_flag(flgs, TR_FAST_DIGEST)) || (o_ptr->curse_flags & TRC_FAST_DIGEST))
1734         {
1735                 info[i++] = _("それはあなたの新陳代謝を速くする。", "It speeds your metabolism.");
1736         }
1737         if ((have_flag(flgs, TR_DRAIN_HP)) || (o_ptr->curse_flags & TRC_DRAIN_HP))
1738         {
1739                 info[i++] = _("それはあなたの体力を吸い取る。", "It drains you.");
1740         }
1741         if ((have_flag(flgs, TR_DRAIN_MANA)) || (o_ptr->curse_flags & TRC_DRAIN_MANA))
1742         {
1743                 info[i++] = _("それはあなたの魔力を吸い取る。", "It drains your mana.");
1744         }
1745
1746         /* Describe about this kind of object instead of THIS fake object */
1747         if (mode & SCROBJ_FAKE_OBJECT)
1748         {
1749                 switch (o_ptr->tval)
1750                 {
1751                 case TV_RING:
1752                         switch (o_ptr->sval)
1753                         {
1754                         case SV_RING_LORDLY:
1755 #ifdef JP
1756                                 info[i++] = "それは幾つかのランダムな耐性を授ける。";
1757 #else
1758                                 info[i++] = "It provides some random resistances.";
1759 #endif
1760                                 break;
1761                         case SV_RING_WARNING:
1762 #ifdef JP
1763                                 info[i++] = "それはひとつの低級なESPを授ける事がある。";
1764 #else
1765                                 info[i++] = "It may provide a low rank ESP.";
1766 #endif
1767                                 break;
1768                         }
1769                         break;
1770
1771                 case TV_AMULET:
1772                         switch (o_ptr->sval)
1773                         {
1774                         case SV_AMULET_RESISTANCE:
1775 #ifdef JP
1776                                 info[i++] = "それは毒への耐性を授ける事がある。";
1777 #else
1778                                 info[i++] = "It may provides resistance to poison.";
1779 #endif
1780 #ifdef JP
1781                                 info[i++] = "それはランダムな耐性を授ける事がある。";
1782 #else
1783                                 info[i++] = "It may provide a random resistances.";
1784 #endif
1785                                 break;
1786                         case SV_AMULET_THE_MAGI:
1787 #ifdef JP
1788                                 info[i++] = "それは最大で3つまでの低級なESPを授ける。";
1789 #else
1790                                 info[i++] = "It provides up to three low rank ESPs.";
1791 #endif
1792                                 break;
1793                         }
1794                         break;
1795                 }
1796         }
1797
1798         if (have_flag(flgs, TR_IGNORE_ACID) &&
1799             have_flag(flgs, TR_IGNORE_ELEC) &&
1800             have_flag(flgs, TR_IGNORE_FIRE) &&
1801             have_flag(flgs, TR_IGNORE_COLD))
1802         {
1803 #ifdef JP
1804                 info[i++] = "それは酸・電撃・火炎・冷気では傷つかない。";
1805 #else
1806                 info[i++] = "It cannot be harmed by the elements.";
1807 #endif
1808         }
1809         else
1810         {
1811                 if (have_flag(flgs, TR_IGNORE_ACID))
1812                 {
1813 #ifdef JP
1814                         info[i++] = "それは酸では傷つかない。";
1815 #else
1816                         info[i++] = "It cannot be harmed by acid.";
1817 #endif
1818                 }
1819                 if (have_flag(flgs, TR_IGNORE_ELEC))
1820                 {
1821 #ifdef JP
1822                         info[i++] = "それは電撃では傷つかない。";
1823 #else
1824                         info[i++] = "It cannot be harmed by electricity.";
1825 #endif
1826                 }
1827                 if (have_flag(flgs, TR_IGNORE_FIRE))
1828                 {
1829 #ifdef JP
1830                         info[i++] = "それは火炎では傷つかない。";
1831 #else
1832                         info[i++] = "It cannot be harmed by fire.";
1833 #endif
1834                 }
1835                 if (have_flag(flgs, TR_IGNORE_COLD))
1836                 {
1837 #ifdef JP
1838                         info[i++] = "それは冷気では傷つかない。";
1839 #else
1840                         info[i++] = "It cannot be harmed by cold.";
1841 #endif
1842                 }
1843         }
1844
1845         if (mode & SCROBJ_FORCE_DETAIL) trivial_info = 0;
1846
1847         /* No relevant informations */
1848         if (i <= trivial_info) return (FALSE);
1849
1850         /* Save the screen */
1851         screen_save();
1852
1853         /* Get size */
1854         Term_get_size(&wid, &hgt);
1855
1856         /* Display Item name */
1857         if (!(mode & SCROBJ_FAKE_OBJECT))
1858                 object_desc(o_name, o_ptr, 0);
1859         else
1860                 object_desc(o_name, o_ptr, (OD_NAME_ONLY | OD_STORE));
1861
1862         prt(o_name, 0, 0);
1863
1864         /* Erase the screen */
1865         for (k = 1; k < hgt; k++) prt("", k, 13);
1866
1867         /* Label the information */
1868         if ((o_ptr->tval == TV_STATUE) && (o_ptr->sval == SV_PHOTO))
1869         {
1870                 monster_race *r_ptr = &r_info[o_ptr->pval];
1871                 int namelen = strlen(r_name + r_ptr->name);
1872                 prt(format("%s: '", r_name + r_ptr->name), 1, 15);
1873                 Term_queue_bigchar(18 + namelen, 1, r_ptr->x_attr, r_ptr->x_char, 0, 0);
1874                 prt("'", 1, (use_bigtile ? 20 : 19) + namelen);
1875         }
1876         else
1877 #ifdef JP
1878 prt("     アイテムの能力:", 1, 15);
1879 #else
1880         prt("     Item Attributes:", 1, 15);
1881 #endif
1882
1883         /* We will print on top of the map (column 13) */
1884         for (k = 2, j = 0; j < i; j++)
1885         {
1886                 /* Show the info */
1887                 prt(info[j], k++, 15);
1888
1889                 /* Every 20 entries (lines 2 to 21), start over */
1890                 if ((k == hgt - 2) && (j+1 < i))
1891                 {
1892 #ifdef JP
1893 prt("-- 続く --", k, 15);
1894 #else
1895                         prt("-- more --", k, 15);
1896 #endif
1897                         inkey();
1898                         for (; k > 2; k--) prt("", k, 15);
1899                 }
1900         }
1901
1902         /* Wait for it */
1903 #ifdef JP
1904 prt("[何かキーを押すとゲームに戻ります]", k, 15);
1905 #else
1906         prt("[Press any key to continue]", k, 15);
1907 #endif
1908
1909         inkey();
1910
1911         /* Restore the screen */
1912         screen_load();
1913
1914         /* Gave knowledge */
1915         return (TRUE);
1916 }
1917
1918
1919
1920 /*!
1921  * @brief オブジェクト選択時の選択アルファベットラベルを返す /
1922  * Convert an inventory index into a one character label
1923  * @param i プレイヤーの所持/装備オブジェクトID
1924  * @return 対応するアルファベット
1925  * @details Note that the label does NOT distinguish inven/equip.
1926  */
1927 char index_to_label(int i)
1928 {
1929         /* Indexes for "inven" are easy */
1930         if (i < INVEN_RARM) return (I2A(i));
1931
1932         /* Indexes for "equip" are offset */
1933         return (I2A(i - INVEN_RARM));
1934 }
1935
1936 /*!
1937  * @brief 選択アルファベットラベルからプレイヤーの所持オブジェクトIDを返す /
1938  * Convert a label into the index of an item in the "inven"
1939  * @return 対応するID。該当スロットにオブジェクトが存在しなかった場合-1を返す / Return "-1" if the label does not indicate a real item
1940  * @details Note that the label does NOT distinguish inven/equip.
1941  */
1942 s16b label_to_inven(int c)
1943 {
1944         int i;
1945
1946         /* Convert */
1947         i = (islower(c) ? A2I(c) : -1);
1948
1949         /* Verify the index */
1950         if ((i < 0) || (i > INVEN_PACK)) return (-1);
1951
1952         /* Empty slots can never be chosen */
1953         if (!inventory[i].k_idx) return (-1);
1954
1955         /* Return the index */
1956         return (i);
1957 }
1958
1959
1960 /*! See cmd5.c */
1961 extern bool select_ring_slot;
1962
1963
1964 /*!
1965  * @brief プレイヤーの所持/装備オブジェクトIDが指輪枠かを返す /
1966  * @param i プレイヤーの所持/装備オブジェクトID
1967  * @return 指輪枠ならばTRUEを返す。
1968  */
1969 static bool is_ring_slot(int i)
1970 {
1971         return (i == INVEN_RIGHT) || (i == INVEN_LEFT);
1972 }
1973
1974
1975 /*!
1976  * @brief 選択アルファベットラベルからプレイヤーの装備オブジェクトIDを返す /
1977  * Convert a label into the index of a item in the "equip"
1978  * @return 対応するID。該当スロットにオブジェクトが存在しなかった場合-1を返す / Return "-1" if the label does not indicate a real item
1979  */
1980 s16b label_to_equip(int c)
1981 {
1982         int i;
1983
1984         /* Convert */
1985         i = (islower(c) ? A2I(c) : -1) + INVEN_RARM;
1986
1987         /* Verify the index */
1988         if ((i < INVEN_RARM) || (i >= INVEN_TOTAL)) return (-1);
1989
1990         if (select_ring_slot) return is_ring_slot(i) ? i : -1;
1991
1992         /* Empty slots can never be chosen */
1993         if (!inventory[i].k_idx) return (-1);
1994
1995         /* Return the index */
1996         return (i);
1997 }
1998
1999
2000
2001 /*!
2002  * @brief オブジェクトの該当装備部位IDを返す /
2003  * Determine which equipment slot (if any) an item likes
2004  * @param o_ptr 名称を取得する元のオブジェクト構造体参照ポインタ
2005  * @return 対応する装備部位ID
2006  */
2007 s16b wield_slot(object_type *o_ptr)
2008 {
2009         /* Slot for equipment */
2010         switch (o_ptr->tval)
2011         {
2012                 case TV_DIGGING:
2013                 case TV_HAFTED:
2014                 case TV_POLEARM:
2015                 case TV_SWORD:
2016                 {
2017                         if (!inventory[INVEN_RARM].k_idx) return (INVEN_RARM);
2018                         if (inventory[INVEN_LARM].k_idx) return (INVEN_RARM);
2019                         return (INVEN_LARM);
2020                 }
2021
2022                 case TV_CAPTURE:
2023                 case TV_CARD:
2024                 case TV_SHIELD:
2025                 {
2026                         if (!inventory[INVEN_LARM].k_idx) return (INVEN_LARM);
2027                         if (inventory[INVEN_RARM].k_idx) return (INVEN_LARM);
2028                         return (INVEN_RARM);
2029                 }
2030
2031                 case TV_BOW:
2032                 {
2033                         return (INVEN_BOW);
2034                 }
2035
2036                 case TV_RING:
2037                 {
2038                         /* Use the right hand first */
2039                         if (!inventory[INVEN_RIGHT].k_idx) return (INVEN_RIGHT);
2040
2041                         /* Use the left hand for swapping (by default) */
2042                         return (INVEN_LEFT);
2043                 }
2044
2045                 case TV_AMULET:
2046                 case TV_WHISTLE:
2047                 {
2048                         return (INVEN_NECK);
2049                 }
2050
2051                 case TV_LITE:
2052                 {
2053                         return (INVEN_LITE);
2054                 }
2055
2056                 case TV_DRAG_ARMOR:
2057                 case TV_HARD_ARMOR:
2058                 case TV_SOFT_ARMOR:
2059                 {
2060                         return (INVEN_BODY);
2061                 }
2062
2063                 case TV_CLOAK:
2064                 {
2065                         return (INVEN_OUTER);
2066                 }
2067
2068                 case TV_CROWN:
2069                 case TV_HELM:
2070                 {
2071                         return (INVEN_HEAD);
2072                 }
2073
2074                 case TV_GLOVES:
2075                 {
2076                         return (INVEN_HANDS);
2077                 }
2078
2079                 case TV_BOOTS:
2080                 {
2081                         return (INVEN_FEET);
2082                 }
2083         }
2084
2085         /* No slot available */
2086         return (-1);
2087 }
2088
2089 /*!
2090  * @brief 所持/装備オブジェクトIDの部位表現を返す /
2091  * Return a string mentioning how a given item is carried
2092  * @param i 部位表現を求めるプレイヤーの所持/装備オブジェクトID
2093  * @return 部位表現の文字列ポインタ
2094  */
2095 cptr mention_use(int i)
2096 {
2097         cptr p;
2098
2099         /* Examine the location */
2100         switch (i)
2101         {
2102 #ifdef JP
2103                 case INVEN_RARM:  p = p_ptr->heavy_wield[0] ? "運搬中" : ((p_ptr->ryoute && p_ptr->migite) ? " 両手" : (left_hander ? " 左手" : " 右手")); break;
2104 #else
2105                 case INVEN_RARM:  p = p_ptr->heavy_wield[0] ? "Just lifting" : (p_ptr->migite ? "Wielding" : "On arm"); break;
2106 #endif
2107
2108 #ifdef JP
2109                 case INVEN_LARM:  p = p_ptr->heavy_wield[1] ? "運搬中" : ((p_ptr->ryoute && p_ptr->hidarite) ? " 両手" : (left_hander ? " 右手" : " 左手")); break;
2110 #else
2111                 case INVEN_LARM:  p = p_ptr->heavy_wield[1] ? "Just lifting" : (p_ptr->hidarite ? "Wielding" : "On arm"); break;
2112 #endif
2113
2114 #ifdef JP
2115                 case INVEN_BOW:   p = (adj_str_hold[p_ptr->stat_ind[A_STR]] < inventory[i].weight / 10) ? "運搬中" : "射撃用"; break;
2116 #else
2117                 case INVEN_BOW:   p = (adj_str_hold[p_ptr->stat_ind[A_STR]] < inventory[i].weight / 10) ? "Just holding" : "Shooting"; break;
2118 #endif
2119
2120 #ifdef JP
2121                 case INVEN_RIGHT: p = (left_hander ? "左手指" : "右手指"); break;
2122 #else
2123                 case INVEN_RIGHT: p = (left_hander ? "On left hand" : "On right hand"); break;
2124 #endif
2125
2126 #ifdef JP
2127                 case INVEN_LEFT:  p = (left_hander ? "右手指" : "左手指"); break;
2128 #else
2129                 case INVEN_LEFT:  p = (left_hander ? "On right hand" : "On left hand"); break;
2130 #endif
2131
2132 #ifdef JP
2133                 case INVEN_NECK:  p = "  首"; break;
2134 #else
2135                 case INVEN_NECK:  p = "Around neck"; break;
2136 #endif
2137
2138 #ifdef JP
2139                 case INVEN_LITE:  p = " 光源"; break;
2140 #else
2141                 case INVEN_LITE:  p = "Light source"; break;
2142 #endif
2143
2144 #ifdef JP
2145                 case INVEN_BODY:  p = "  体"; break;
2146 #else
2147                 case INVEN_BODY:  p = "On body"; break;
2148 #endif
2149
2150 #ifdef JP
2151                 case INVEN_OUTER: p = "体の上"; break;
2152 #else
2153                 case INVEN_OUTER: p = "About body"; break;
2154 #endif
2155
2156 #ifdef JP
2157                 case INVEN_HEAD:  p = "  頭"; break;
2158 #else
2159                 case INVEN_HEAD:  p = "On head"; break;
2160 #endif
2161
2162 #ifdef JP
2163                 case INVEN_HANDS: p = "  手"; break;
2164 #else
2165                 case INVEN_HANDS: p = "On hands"; break;
2166 #endif
2167
2168 #ifdef JP
2169                 case INVEN_FEET:  p = "  足"; break;
2170 #else
2171                 case INVEN_FEET:  p = "On feet"; break;
2172 #endif
2173
2174 #ifdef JP
2175                 default:          p = "ザック"; break;
2176 #else
2177                 default:          p = "In pack"; break;
2178 #endif
2179         }
2180
2181         /* Return the result */
2182         return p;
2183 }
2184
2185
2186 /*!
2187  * @brief 所持/装備オブジェクトIDの現在の扱い方の状態表現を返す /
2188  * Return a string describing how a given item is being worn.
2189  * @param i 状態表現を求めるプレイヤーの所持/装備オブジェクトID
2190  * @return 状態表現内容の文字列ポインタ
2191  * @details
2192  * Currently, only used for items in the equipment, not inventory.
2193  */
2194 cptr describe_use(int i)
2195 {
2196         cptr p;
2197
2198         switch (i)
2199         {
2200 #ifdef JP
2201                 case INVEN_RARM:  p = p_ptr->heavy_wield[0] ? "運搬中の" : ((p_ptr->ryoute && p_ptr->migite) ? "両手に装備している" : (left_hander ? "左手に装備している" : "右手に装備している")); break;
2202 #else
2203                 case INVEN_RARM:  p = p_ptr->heavy_wield[0] ? "just lifting" : (p_ptr->migite ? "attacking monsters with" : "wearing on your arm"); break;
2204 #endif
2205
2206 #ifdef JP
2207                 case INVEN_LARM:  p = p_ptr->heavy_wield[1] ? "運搬中の" : ((p_ptr->ryoute && p_ptr->hidarite) ? "両手に装備している" : (left_hander ? "右手に装備している" : "左手に装備している")); break;
2208 #else
2209                 case INVEN_LARM:  p = p_ptr->heavy_wield[1] ? "just lifting" : (p_ptr->hidarite ? "attacking monsters with" : "wearing on your arm"); break;
2210 #endif
2211
2212 #ifdef JP
2213                 case INVEN_BOW:   p = (adj_str_hold[p_ptr->stat_ind[A_STR]] < inventory[i].weight / 10) ? "持つだけで精一杯の" : "射撃用に装備している"; break;
2214 #else
2215                 case INVEN_BOW:   p = (adj_str_hold[p_ptr->stat_ind[A_STR]] < inventory[i].weight / 10) ? "just holding" : "shooting missiles with"; break;
2216 #endif
2217
2218 #ifdef JP
2219                 case INVEN_RIGHT: p = (left_hander ? "左手の指にはめている" : "右手の指にはめている"); break;
2220 #else
2221                 case INVEN_RIGHT: p = (left_hander ? "wearing on your left hand" : "wearing on your right hand"); break;
2222 #endif
2223
2224 #ifdef JP
2225                 case INVEN_LEFT:  p = (left_hander ? "右手の指にはめている" : "左手の指にはめている"); break;
2226 #else
2227                 case INVEN_LEFT:  p = (left_hander ? "wearing on your right hand" : "wearing on your left hand"); break;
2228 #endif
2229
2230 #ifdef JP
2231                 case INVEN_NECK:  p = "首にかけている"; break;
2232 #else
2233                 case INVEN_NECK:  p = "wearing around your neck"; break;
2234 #endif
2235
2236 #ifdef JP
2237                 case INVEN_LITE:  p = "光源にしている"; break;
2238 #else
2239                 case INVEN_LITE:  p = "using to light the way"; break;
2240 #endif
2241
2242 #ifdef JP
2243                 case INVEN_BODY:  p = "体に着ている"; break;
2244 #else
2245                 case INVEN_BODY:  p = "wearing on your body"; break;
2246 #endif
2247
2248 #ifdef JP
2249                 case INVEN_OUTER: p = "身にまとっている"; break;
2250 #else
2251                 case INVEN_OUTER: p = "wearing on your back"; break;
2252 #endif
2253
2254 #ifdef JP
2255                 case INVEN_HEAD:  p = "頭にかぶっている"; break;
2256 #else
2257                 case INVEN_HEAD:  p = "wearing on your head"; break;
2258 #endif
2259
2260 #ifdef JP
2261                 case INVEN_HANDS: p = "手につけている"; break;
2262 #else
2263                 case INVEN_HANDS: p = "wearing on your hands"; break;
2264 #endif
2265
2266 #ifdef JP
2267                 case INVEN_FEET:  p = "足にはいている"; break;
2268 #else
2269                 case INVEN_FEET:  p = "wearing on your feet"; break;
2270 #endif
2271
2272 #ifdef JP
2273                 default:          p = "ザックに入っている"; break;
2274 #else
2275                 default:          p = "carrying in your pack"; break;
2276 #endif
2277         }
2278
2279         /* Return the result */
2280         return p;
2281 }
2282
2283
2284 /*!
2285  * @brief tval/sval指定のベースアイテムがプレイヤーの使用可能な魔法書かどうかを返す /
2286  * Hack: Check if a spellbook is one of the realms we can use. -- TY
2287  * @param book_tval ベースアイテムのtval
2288  * @param book_sval ベースアイテムのsval
2289  * @return 使用可能な魔法書ならばTRUEを返す。
2290  */
2291
2292 bool check_book_realm(const byte book_tval, const byte book_sval)
2293 {
2294         if (book_tval < TV_LIFE_BOOK) return FALSE;
2295         if (p_ptr->pclass == CLASS_SORCERER)
2296         {
2297                 return is_magic(tval2realm(book_tval));
2298         }
2299         else if (p_ptr->pclass == CLASS_RED_MAGE)
2300         {
2301                 if (is_magic(tval2realm(book_tval)))
2302                         return ((book_tval == TV_ARCANE_BOOK) || (book_sval < 2));
2303         }
2304         return (REALM1_BOOK == book_tval || REALM2_BOOK == book_tval);
2305 }
2306
2307 /*!
2308  * @brief アイテムがitem_tester_hookグローバル関数ポインタの条件を満たしているかを返す汎用関数
2309  * Check an item against the item tester info
2310  * @param o_ptr 判定を行いたいオブジェクト構造体参照ポインタ
2311  * @return item_tester_hookの参照先、その他いくつかの例外に応じてTRUE/FALSEを返す。
2312  */
2313 bool item_tester_okay(object_type *o_ptr)
2314 {
2315         /* Hack -- allow listing empty slots */
2316         if (item_tester_full) return (TRUE);
2317
2318         /* Require an item */
2319         if (!o_ptr->k_idx) return (FALSE);
2320
2321         /* Hack -- ignore "gold" */
2322         if (o_ptr->tval == TV_GOLD)
2323         {
2324                 /* See xtra2.c */
2325                 extern bool show_gold_on_floor;
2326
2327                 if (!show_gold_on_floor) return (FALSE);
2328         }
2329
2330         /* Check the tval */
2331         if (item_tester_tval)
2332         {
2333                 /* Is it a spellbook? If so, we need a hack -- TY */
2334                 if ((item_tester_tval <= TV_DEATH_BOOK) &&
2335                         (item_tester_tval >= TV_LIFE_BOOK))
2336                         return check_book_realm(o_ptr->tval, o_ptr->sval);
2337                 else
2338                         if (item_tester_tval != o_ptr->tval) return (FALSE);
2339         }
2340
2341         /* Check the hook */
2342         if (item_tester_hook)
2343         {
2344                 if (!(*item_tester_hook)(o_ptr)) return (FALSE);
2345         }
2346
2347         /* Assume okay */
2348         return (TRUE);
2349 }
2350
2351
2352 /*!
2353  * @brief 所持アイテム一覧を表示する /
2354  * Choice window "shadow" of the "show_inven()" function
2355  * @return なし
2356  */
2357 void display_inven(void)
2358 {
2359         register        int i, n, z = 0;
2360         object_type     *o_ptr;
2361         byte            attr = TERM_WHITE;
2362         char            tmp_val[80];
2363         char            o_name[MAX_NLEN];
2364         int             wid, hgt;
2365
2366         /* Get size */
2367         Term_get_size(&wid, &hgt);
2368
2369         /* Find the "final" slot */
2370         for (i = 0; i < INVEN_PACK; i++)
2371         {
2372                 o_ptr = &inventory[i];
2373
2374                 /* Skip non-objects */
2375                 if (!o_ptr->k_idx) continue;
2376
2377                 /* Track */
2378                 z = i + 1;
2379         }
2380
2381         /* Display the pack */
2382         for (i = 0; i < z; i++)
2383         {
2384                 /* Examine the item */
2385                 o_ptr = &inventory[i];
2386
2387                 /* Start with an empty "index" */
2388                 tmp_val[0] = tmp_val[1] = tmp_val[2] = ' ';
2389
2390                 /* Is this item "acceptable"? */
2391                 if (item_tester_okay(o_ptr))
2392                 {
2393                         /* Prepare an "index" */
2394                         tmp_val[0] = index_to_label(i);
2395
2396                         /* Bracket the "index" --(-- */
2397                         tmp_val[1] = ')';
2398                 }
2399
2400                 /* Display the index (or blank space) */
2401                 Term_putstr(0, i, 3, TERM_WHITE, tmp_val);
2402
2403                 /* Obtain an item description */
2404                 object_desc(o_name, o_ptr, 0);
2405
2406                 /* Obtain the length of the description */
2407                 n = strlen(o_name);
2408
2409                 /* Get a color */
2410                 attr = tval_to_attr[o_ptr->tval % 128];
2411
2412                 /* Grey out charging items */
2413                 if (o_ptr->timeout)
2414                 {
2415                         attr = TERM_L_DARK;
2416                 }
2417
2418                 /* Display the entry itself */
2419                 Term_putstr(3, i, n, attr, o_name);
2420
2421                 /* Erase the rest of the line */
2422                 Term_erase(3+n, i, 255);
2423
2424                 /* Display the weight if needed */
2425                 if (show_weights)
2426                 {
2427                         int wgt = o_ptr->weight * o_ptr->number;
2428 #ifdef JP
2429                         sprintf(tmp_val, "%3d.%1d kg", lbtokg1(wgt),lbtokg2(wgt) );
2430 #else
2431                         sprintf(tmp_val, "%3d.%1d lb", wgt / 10, wgt % 10);
2432 #endif
2433
2434                         prt(tmp_val, i, wid - 9);
2435                 }
2436         }
2437
2438         /* Erase the rest of the window */
2439         for (i = z; i < hgt; i++)
2440         {
2441                 /* Erase the line */
2442                 Term_erase(0, i, 255);
2443         }
2444 }
2445
2446
2447
2448 /*!
2449  * @brief 装備アイテム一覧を表示する /
2450  * Choice window "shadow" of the "show_equip()" function
2451  * @return なし
2452  */
2453 void display_equip(void)
2454 {
2455         register        int i, n;
2456         object_type     *o_ptr;
2457         byte            attr = TERM_WHITE;
2458         char            tmp_val[80];
2459         char            o_name[MAX_NLEN];
2460         int             wid, hgt;
2461
2462         /* Get size */
2463         Term_get_size(&wid, &hgt);
2464
2465         /* Display the equipment */
2466         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
2467         {
2468                 /* Examine the item */
2469                 o_ptr = &inventory[i];
2470
2471                 /* Start with an empty "index" */
2472                 tmp_val[0] = tmp_val[1] = tmp_val[2] = ' ';
2473
2474                 /* Is this item "acceptable"? */
2475                 if (select_ring_slot ? is_ring_slot(i) : item_tester_okay(o_ptr))
2476                 {
2477                         /* Prepare an "index" */
2478                         tmp_val[0] = index_to_label(i);
2479
2480                         /* Bracket the "index" --(-- */
2481                         tmp_val[1] = ')';
2482                 }
2483
2484                 /* Display the index (or blank space) */
2485                 Term_putstr(0, i - INVEN_RARM, 3, TERM_WHITE, tmp_val);
2486
2487                 /* Obtain an item description */
2488                 if ((((i == INVEN_RARM) && p_ptr->hidarite) || ((i == INVEN_LARM) && p_ptr->migite)) && p_ptr->ryoute)
2489                 {
2490 #ifdef JP
2491                         strcpy(o_name, "(武器を両手持ち)");
2492 #else
2493                         strcpy(o_name, "(wielding with two-hands)");
2494 #endif
2495                         attr = TERM_WHITE;
2496                 }
2497                 else
2498                 {
2499                         object_desc(o_name, o_ptr, 0);
2500                         attr = tval_to_attr[o_ptr->tval % 128];
2501                 }
2502
2503                 /* Obtain the length of the description */
2504                 n = strlen(o_name);
2505
2506                 /* Grey out charging items */
2507                 if (o_ptr->timeout)
2508                 {
2509                         attr = TERM_L_DARK;
2510                 }
2511
2512                 /* Display the entry itself */
2513                 Term_putstr(3, i - INVEN_RARM, n, attr, o_name);
2514
2515                 /* Erase the rest of the line */
2516                 Term_erase(3+n, i - INVEN_RARM, 255);
2517
2518                 /* Display the weight (if needed) */
2519                 if (show_weights)
2520                 {
2521                         int wgt = o_ptr->weight * o_ptr->number;
2522 #ifdef JP
2523                         sprintf(tmp_val, "%3d.%1d kg", lbtokg1(wgt) , lbtokg2(wgt));
2524 #else
2525                         sprintf(tmp_val, "%3d.%1d lb", wgt / 10, wgt % 10);
2526 #endif
2527
2528                         prt(tmp_val, i - INVEN_RARM, wid - (show_labels ? 28 : 9));
2529                 }
2530
2531                 /* Display the slot description (if needed) */
2532                 if (show_labels)
2533                 {
2534                         Term_putstr(wid - 20, i - INVEN_RARM, -1, TERM_WHITE, " <-- ");
2535                         prt(mention_use(i), i - INVEN_RARM, wid - 15);
2536                 }
2537         }
2538
2539         /* Erase the rest of the window */
2540         for (i = INVEN_TOTAL - INVEN_RARM; i < hgt; i++)
2541         {
2542                 /* Clear that line */
2543                 Term_erase(0, i, 255);
2544         }
2545 }
2546
2547
2548 /*!
2549  * @brief 所持/装備オブジェクトに選択タグを与える/タグに該当するオブジェクトがあるかを返す /
2550  * Find the "first" inventory object with the given "tag".
2551  * @param cp 対応するタグIDを与える参照ポインタ
2552  * @param tag 該当するオブジェクトがあるかを調べたいタグ
2553  * @param mode 所持、装備の切り替え
2554  * @return タグに該当するオブジェクトがあるならTRUEを返す
2555  * @details
2556  * A "tag" is a numeral "n" appearing as "@n" anywhere in the\n
2557  * inscription of an object.  Alphabetical characters don't work as a\n
2558  * tag in this form.\n
2559  *\n
2560  * Also, the tag "@xn" will work as well, where "n" is a any tag-char,\n
2561  * and "x" is the "current" command_cmd code.\n
2562  */
2563 static bool get_tag(int *cp, char tag, int mode)
2564 {
2565         int i, start, end;
2566         cptr s;
2567
2568         /* Extract index from mode */
2569         switch (mode)
2570         {
2571         case USE_EQUIP:
2572                 start = INVEN_RARM;
2573                 end = INVEN_TOTAL - 1;
2574                 break;
2575
2576         case USE_INVEN:
2577                 start = 0;
2578                 end = INVEN_PACK - 1;
2579                 break;
2580
2581         default:
2582                 return FALSE;
2583         }
2584
2585         /**** Find a tag in the form of {@x#} (allow alphabet tag) ***/
2586
2587         /* Check every inventory object */
2588         for (i = start; i <= end; i++)
2589         {
2590                 object_type *o_ptr = &inventory[i];
2591
2592                 /* Skip non-objects */
2593                 if (!o_ptr->k_idx) continue;
2594
2595                 /* Skip empty inscriptions */
2596                 if (!o_ptr->inscription) continue;
2597
2598                 /* Skip non-choice */
2599                 if (!item_tester_okay(o_ptr)) continue;
2600
2601                 /* Find a '@' */
2602                 s = my_strchr(quark_str(o_ptr->inscription), '@');
2603
2604                 /* Process all tags */
2605                 while (s)
2606                 {
2607                         /* Check the special tags */
2608                         if ((s[1] == command_cmd) && (s[2] == tag))
2609                         {
2610                                 /* Save the actual inventory ID */
2611                                 *cp = i;
2612
2613                                 /* Success */
2614                                 return (TRUE);
2615                         }
2616
2617                         /* Find another '@' */
2618                         s = my_strchr(s + 1, '@');
2619                 }
2620         }
2621
2622
2623         /**** Find a tag in the form of {@#} (allows only numerals)  ***/
2624
2625         /* Don't allow {@#} with '#' being alphabet */
2626         if (tag < '0' || '9' < tag)
2627         {
2628                 /* No such tag */
2629                 return FALSE;
2630         }
2631
2632         /* Check every object */
2633         for (i = start; i <= end; i++)
2634         {
2635                 object_type *o_ptr = &inventory[i];
2636
2637                 /* Skip non-objects */
2638                 if (!o_ptr->k_idx) continue;
2639
2640                 /* Skip empty inscriptions */
2641                 if (!o_ptr->inscription) continue;
2642
2643                 /* Skip non-choice */
2644                 if (!item_tester_okay(o_ptr)) continue;
2645
2646                 /* Find a '@' */
2647                 s = my_strchr(quark_str(o_ptr->inscription), '@');
2648
2649                 /* Process all tags */
2650                 while (s)
2651                 {
2652                         /* Check the normal tags */
2653                         if (s[1] == tag)
2654                         {
2655                                 /* Save the actual inventory ID */
2656                                 *cp = i;
2657
2658                                 /* Success */
2659                                 return (TRUE);
2660                         }
2661
2662                         /* Find another '@' */
2663                         s = my_strchr(s + 1, '@');
2664                 }
2665         }
2666
2667         /* No such tag */
2668         return (FALSE);
2669 }
2670
2671
2672 /*!
2673  * @brief 床オブジェクトに選択タグを与える/タグに該当するオブジェクトがあるかを返す /
2674  * Find the "first" inventory object with the given "tag".
2675  * @param cp 対応するタグIDを与える参照ポインタ
2676  * @param tag 該当するオブジェクトがあるかを調べたいタグ
2677  * @param floor_list 床上アイテムの配列
2678  * @param floor_num  床上アイテムの配列ID
2679  * @return タグに該当するオブジェクトがあるならTRUEを返す
2680  * @details
2681  * A "tag" is a numeral "n" appearing as "@n" anywhere in the\n
2682  * inscription of an object.  Alphabetical characters don't work as a\n
2683  * tag in this form.\n
2684  *\n
2685  * Also, the tag "@xn" will work as well, where "n" is a any tag-char,\n
2686  * and "x" is the "current" command_cmd code.\n
2687  */
2688 static bool get_tag_floor(int *cp, char tag, int floor_list[], int floor_num)
2689 {
2690         int i;
2691         cptr s;
2692
2693         /**** Find a tag in the form of {@x#} (allow alphabet tag) ***/
2694
2695         /* Check every object in the grid */
2696         for (i = 0; i < floor_num && i < 23; i++)
2697         {
2698                 object_type *o_ptr = &o_list[floor_list[i]];
2699
2700                 /* Skip empty inscriptions */
2701                 if (!o_ptr->inscription) continue;
2702
2703                 /* Find a '@' */
2704                 s = my_strchr(quark_str(o_ptr->inscription), '@');
2705
2706                 /* Process all tags */
2707                 while (s)
2708                 {
2709                         /* Check the special tags */
2710                         if ((s[1] == command_cmd) && (s[2] == tag))
2711                         {
2712                                 /* Save the actual floor object ID */
2713                                 *cp = i;
2714
2715                                 /* Success */
2716                                 return (TRUE);
2717                         }
2718
2719                         /* Find another '@' */
2720                         s = my_strchr(s + 1, '@');
2721                 }
2722         }
2723
2724
2725         /**** Find a tag in the form of {@#} (allows only numerals)  ***/
2726
2727         /* Don't allow {@#} with '#' being alphabet */
2728         if (tag < '0' || '9' < tag)
2729         {
2730                 /* No such tag */
2731                 return FALSE;
2732         }
2733
2734         /* Check every object in the grid */
2735         for (i = 0; i < floor_num && i < 23; i++)
2736         {
2737                 object_type *o_ptr = &o_list[floor_list[i]];
2738
2739                 /* Skip empty inscriptions */
2740                 if (!o_ptr->inscription) continue;
2741
2742                 /* Find a '@' */
2743                 s = my_strchr(quark_str(o_ptr->inscription), '@');
2744
2745                 /* Process all tags */
2746                 while (s)
2747                 {
2748                         /* Check the normal tags */
2749                         if (s[1] == tag)
2750                         {
2751                                 /* Save the floor object ID */
2752                                 *cp = i;
2753
2754                                 /* Success */
2755                                 return (TRUE);
2756                         }
2757
2758                         /* Find another '@' */
2759                         s = my_strchr(s + 1, '@');
2760                 }
2761         }
2762
2763         /* No such tag */
2764         return (FALSE);
2765 }
2766
2767
2768 /*!
2769  * @brief タグIDにあわせてタグアルファベットのリストを返す /
2770  * Move around label characters with correspond tags
2771  * @param label ラベルリストを取得する文字列参照ポインタ
2772  * @param mode 所持品リストか装備品リストかの切り替え
2773  * @return なし
2774  */
2775 static void prepare_label_string(char *label, int mode)
2776 {
2777         cptr alphabet_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
2778         int  offset = (mode == USE_EQUIP) ? INVEN_RARM : 0;
2779         int  i;
2780
2781         /* Prepare normal labels */
2782         strcpy(label, alphabet_chars);
2783
2784         /* Move each label */
2785         for (i = 0; i < 52; i++)
2786         {
2787                 int index;
2788                 char c = alphabet_chars[i];
2789
2790                 /* Find a tag with this label */
2791                 if (get_tag(&index, c, mode))
2792                 {
2793                         /* Delete the overwritten label */
2794                         if (label[i] == c) label[i] = ' ';
2795
2796                         /* Move the label to the place of corresponding tag */
2797                         label[index - offset] = c;
2798                 }
2799         }
2800 }
2801
2802
2803 /*!
2804  * @brief タグIDにあわせてタグアルファベットのリストを返す(床上アイテム用) /
2805  * Move around label characters with correspond tags (floor version)
2806  * @param label ラベルリストを取得する文字列参照ポインタ
2807  * @param floor_list 床上アイテムの配列
2808  * @param floor_num  床上アイテムの配列ID
2809  * @return なし
2810  */
2811 /*
2812  */
2813 static void prepare_label_string_floor(char *label, int floor_list[], int floor_num)
2814 {
2815         cptr alphabet_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
2816         int  i;
2817
2818         /* Prepare normal labels */
2819         strcpy(label, alphabet_chars);
2820
2821         /* Move each label */
2822         for (i = 0; i < 52; i++)
2823         {
2824                 int index;
2825                 char c = alphabet_chars[i];
2826
2827                 /* Find a tag with this label */
2828                 if (get_tag_floor(&index, c, floor_list, floor_num))
2829                 {
2830                         /* Delete the overwritten label */
2831                         if (label[i] == c) label[i] = ' ';
2832
2833                         /* Move the label to the place of corresponding tag */
2834                         label[index] = c;
2835                 }
2836         }
2837 }
2838
2839
2840 /*!
2841  * @brief 所持アイテムの表示を行う /
2842  * Display the inventory.
2843  * @param target_item アイテムの選択処理を行うか否か。
2844  * @return 選択したアイテムのタグ
2845  * @details
2846  * Hack -- do not display "trailing" empty slots
2847  */
2848 int show_inven(int target_item)
2849 {
2850         int             i, j, k, l, z = 0;
2851         int             col, cur_col, len;
2852         object_type     *o_ptr;
2853         char            o_name[MAX_NLEN];
2854         char            tmp_val[80];
2855         int             out_index[23];
2856         byte            out_color[23];
2857         char            out_desc[23][MAX_NLEN];
2858         int             target_item_label = 0;
2859         int             wid, hgt;
2860         char            inven_label[52 + 1];
2861
2862         /* Starting column */
2863         col = command_gap;
2864
2865         /* Get size */
2866         Term_get_size(&wid, &hgt);
2867
2868         /* Default "max-length" */
2869         len = wid - col - 1;
2870
2871
2872         /* Find the "final" slot */
2873         for (i = 0; i < INVEN_PACK; i++)
2874         {
2875                 o_ptr = &inventory[i];
2876
2877                 /* Skip non-objects */
2878                 if (!o_ptr->k_idx) continue;
2879
2880                 /* Track */
2881                 z = i + 1;
2882         }
2883
2884         prepare_label_string(inven_label, USE_INVEN);
2885
2886         /* Display the inventory */
2887         for (k = 0, i = 0; i < z; i++)
2888         {
2889                 o_ptr = &inventory[i];
2890
2891                 /* Is this item acceptable? */
2892                 if (!item_tester_okay(o_ptr)) continue;
2893
2894                 /* Describe the object */
2895                 object_desc(o_name, o_ptr, 0);
2896
2897                 /* Save the object index, color, and description */
2898                 out_index[k] = i;
2899                 out_color[k] = tval_to_attr[o_ptr->tval % 128];
2900
2901                 /* Grey out charging items */
2902                 if (o_ptr->timeout)
2903                 {
2904                         out_color[k] = TERM_L_DARK;
2905                 }
2906
2907                 (void)strcpy(out_desc[k], o_name);
2908
2909                 /* Find the predicted "line length" */
2910                 l = strlen(out_desc[k]) + 5;
2911
2912                 /* Be sure to account for the weight */
2913                 if (show_weights) l += 9;
2914
2915                 /* Account for icon if displayed */
2916                 if (show_item_graph)
2917                 {
2918                         l += 2;
2919                         if (use_bigtile) l++;
2920                 }
2921
2922                 /* Maintain the maximum length */
2923                 if (l > len) len = l;
2924
2925                 /* Advance to next "line" */
2926                 k++;
2927         }
2928
2929         /* Find the column to start in */
2930         col = (len > wid - 4) ? 0 : (wid - len - 1);
2931
2932         /* Output each entry */
2933         for (j = 0; j < k; j++)
2934         {
2935                 /* Get the index */
2936                 i = out_index[j];
2937
2938                 /* Get the item */
2939                 o_ptr = &inventory[i];
2940
2941                 /* Clear the line */
2942                 prt("", j + 1, col ? col - 2 : col);
2943
2944                 if (use_menu && target_item)
2945                 {
2946                         if (j == (target_item-1))
2947                         {
2948 #ifdef JP
2949                                 strcpy(tmp_val, "》");
2950 #else
2951                                 strcpy(tmp_val, "> ");
2952 #endif
2953                                 target_item_label = i;
2954                         }
2955                         else strcpy(tmp_val, "  ");
2956                 }
2957                 else if (i <= INVEN_PACK)
2958                 {
2959                         /* Prepare an index --(-- */
2960                         sprintf(tmp_val, "%c)", inven_label[i]);
2961                 }
2962                 else
2963                 {
2964                         /* Prepare an index --(-- */
2965                         sprintf(tmp_val, "%c)", index_to_label(i));
2966                 }
2967
2968                 /* Clear the line with the (possibly indented) index */
2969                 put_str(tmp_val, j + 1, col);
2970
2971                 cur_col = col + 3;
2972
2973                 /* Display graphics for object, if desired */
2974                 if (show_item_graph)
2975                 {
2976                         byte  a = object_attr(o_ptr);
2977                         char c = object_char(o_ptr);
2978
2979 #ifdef AMIGA
2980                         if (a & 0x80) a |= 0x40;
2981 #endif
2982
2983                         Term_queue_bigchar(cur_col, j + 1, a, c, 0, 0);
2984                         if (use_bigtile) cur_col++;
2985
2986                         cur_col += 2;
2987                 }
2988
2989
2990                 /* Display the entry itself */
2991                 c_put_str(out_color[j], out_desc[j], j + 1, cur_col);
2992
2993                 /* Display the weight if needed */
2994                 if (show_weights)
2995                 {
2996                         int wgt = o_ptr->weight * o_ptr->number;
2997 #ifdef JP
2998                         (void)sprintf(tmp_val, "%3d.%1d kg", lbtokg1(wgt) , lbtokg2(wgt) );
2999 #else
3000                         (void)sprintf(tmp_val, "%3d.%1d lb", wgt / 10, wgt % 10);
3001 #endif
3002
3003                         prt(tmp_val, j + 1, wid - 9);
3004                 }
3005         }
3006
3007         /* Make a "shadow" below the list (only if needed) */
3008         if (j && (j < 23)) prt("", j + 1, col ? col - 2 : col);
3009
3010         /* Save the new column */
3011         command_gap = col;
3012
3013         return target_item_label;
3014 }
3015
3016
3017 /*!
3018  * @brief 装備アイテムの表示を行う /
3019  * Display the equipment.
3020  * @param target_item アイテムの選択処理を行うか否か。
3021  * @return 選択したアイテムのタグ
3022  */
3023 int show_equip(int target_item)
3024 {
3025         int             i, j, k, l;
3026         int             col, cur_col, len;
3027         object_type     *o_ptr;
3028         char            tmp_val[80];
3029         char            o_name[MAX_NLEN];
3030         int             out_index[23];
3031         byte            out_color[23];
3032         char            out_desc[23][MAX_NLEN];
3033         int             target_item_label = 0;
3034         int             wid, hgt;
3035         char            equip_label[52 + 1];
3036
3037         /* Starting column */
3038         col = command_gap;
3039
3040         /* Get size */
3041         Term_get_size(&wid, &hgt);
3042
3043         /* Maximal length */
3044         len = wid - col - 1;
3045
3046
3047         /* Scan the equipment list */
3048         for (k = 0, i = INVEN_RARM; i < INVEN_TOTAL; i++)
3049         {
3050                 o_ptr = &inventory[i];
3051
3052                 /* Is this item acceptable? */
3053                 if (!(select_ring_slot ? is_ring_slot(i) : item_tester_okay(o_ptr)) &&
3054                     (!((((i == INVEN_RARM) && p_ptr->hidarite) || ((i == INVEN_LARM) && p_ptr->migite)) && p_ptr->ryoute) ||
3055                      item_tester_no_ryoute)) continue;
3056
3057                 /* Description */
3058                 object_desc(o_name, o_ptr, 0);
3059
3060                 if ((((i == INVEN_RARM) && p_ptr->hidarite) || ((i == INVEN_LARM) && p_ptr->migite)) && p_ptr->ryoute)
3061                 {
3062 #ifdef JP
3063                         (void)strcpy(out_desc[k],"(武器を両手持ち)");
3064 #else
3065                         (void)strcpy(out_desc[k],"(wielding with two-hands)");
3066 #endif
3067                         out_color[k] = TERM_WHITE;
3068                 }
3069                 else
3070                 {
3071                         (void)strcpy(out_desc[k], o_name);
3072                         out_color[k] = tval_to_attr[o_ptr->tval % 128];
3073                 }
3074
3075                 out_index[k] = i;
3076                 /* Grey out charging items */
3077                 if (o_ptr->timeout)
3078                 {
3079                         out_color[k] = TERM_L_DARK;
3080                 }
3081
3082                 /* Extract the maximal length (see below) */
3083 #ifdef JP
3084                 l = strlen(out_desc[k]) + (2 + 1);
3085 #else
3086                 l = strlen(out_desc[k]) + (2 + 3);
3087 #endif
3088
3089
3090                 /* Increase length for labels (if needed) */
3091 #ifdef JP
3092                 if (show_labels) l += (7 + 2);
3093 #else
3094                 if (show_labels) l += (14 + 2);
3095 #endif
3096
3097
3098                 /* Increase length for weight (if needed) */
3099                 if (show_weights) l += 9;
3100
3101                 if (show_item_graph) l += 2;
3102
3103                 /* Maintain the max-length */
3104                 if (l > len) len = l;
3105
3106                 /* Advance the entry */
3107                 k++;
3108         }
3109
3110         /* Hack -- Find a column to start in */
3111 #ifdef JP
3112         col = (len > wid - 6) ? 0 : (wid - len - 1);
3113 #else
3114         col = (len > wid - 4) ? 0 : (wid - len - 1);
3115 #endif
3116
3117         prepare_label_string(equip_label, USE_EQUIP);
3118
3119         /* Output each entry */
3120         for (j = 0; j < k; j++)
3121         {
3122                 /* Get the index */
3123                 i = out_index[j];
3124
3125                 /* Get the item */
3126                 o_ptr = &inventory[i];
3127
3128                 /* Clear the line */
3129                 prt("", j + 1, col ? col - 2 : col);
3130
3131                 if (use_menu && target_item)
3132                 {
3133                         if (j == (target_item-1))
3134                         {
3135 #ifdef JP
3136                                 strcpy(tmp_val, "》");
3137 #else
3138                                 strcpy(tmp_val, "> ");
3139 #endif
3140                                 target_item_label = i;
3141                         }
3142                         else strcpy(tmp_val, "  ");
3143                 }
3144                 else if (i >= INVEN_RARM)
3145                 {
3146                         /* Prepare an index --(-- */
3147                         sprintf(tmp_val, "%c)", equip_label[i - INVEN_RARM]);
3148                 }
3149                 else /* Paranoia */
3150                 {
3151                         /* Prepare an index --(-- */
3152                         sprintf(tmp_val, "%c)", index_to_label(i));
3153                 }
3154
3155                 /* Clear the line with the (possibly indented) index */
3156                 put_str(tmp_val, j+1, col);
3157
3158                 cur_col = col + 3;
3159
3160                 /* Display graphics for object, if desired */
3161                 if (show_item_graph)
3162                 {
3163                         byte a = object_attr(o_ptr);
3164                         char c = object_char(o_ptr);
3165
3166 #ifdef AMIGA
3167                         if (a & 0x80) a |= 0x40;
3168 #endif
3169
3170                         Term_queue_bigchar(cur_col, j + 1, a, c, 0, 0);
3171                         if (use_bigtile) cur_col++;
3172
3173                         cur_col += 2;
3174                 }
3175
3176                 /* Use labels */
3177                 if (show_labels)
3178                 {
3179                         /* Mention the use */
3180 #ifdef JP
3181                         (void)sprintf(tmp_val, "%-7s: ", mention_use(i));
3182 #else
3183                         (void)sprintf(tmp_val, "%-14s: ", mention_use(i));
3184 #endif
3185
3186                         put_str(tmp_val, j+1, cur_col);
3187
3188                         /* Display the entry itself */
3189 #ifdef JP
3190                         c_put_str(out_color[j], out_desc[j], j+1, cur_col + 9);
3191 #else
3192                         c_put_str(out_color[j], out_desc[j], j+1, cur_col + 16);
3193 #endif
3194                 }
3195
3196                 /* No labels */
3197                 else
3198                 {
3199                         /* Display the entry itself */
3200                         c_put_str(out_color[j], out_desc[j], j+1, cur_col);
3201                 }
3202
3203                 /* Display the weight if needed */
3204                 if (show_weights)
3205                 {
3206                         int wgt = o_ptr->weight * o_ptr->number;
3207 #ifdef JP
3208                         (void)sprintf(tmp_val, "%3d.%1d kg", lbtokg1(wgt) , lbtokg2(wgt) );
3209 #else
3210                         (void)sprintf(tmp_val, "%3d.%d lb", wgt / 10, wgt % 10);
3211 #endif
3212
3213                         prt(tmp_val, j + 1, wid - 9);
3214                 }
3215         }
3216
3217         /* Make a "shadow" below the list (only if needed) */
3218         if (j && (j < 23)) prt("", j + 1, col ? col - 2 : col);
3219
3220         /* Save the new column */
3221         command_gap = col;
3222
3223         return target_item_label;
3224 }
3225
3226 /*!
3227  * @brief サブウィンドウに所持品、装備品リストの表示を行う /
3228  * Flip "inven" and "equip" in any sub-windows
3229  * @return なし
3230  */
3231 void toggle_inven_equip(void)
3232 {
3233         int j;
3234
3235         /* Scan windows */
3236         for (j = 0; j < 8; j++)
3237         {
3238                 /* Unused */
3239                 if (!angband_term[j]) continue;
3240
3241                 /* Flip inven to equip */
3242                 if (window_flag[j] & (PW_INVEN))
3243                 {
3244                         /* Flip flags */
3245                         window_flag[j] &= ~(PW_INVEN);
3246                         window_flag[j] |= (PW_EQUIP);
3247
3248                         /* Window stuff */
3249                         p_ptr->window |= (PW_EQUIP);
3250                 }
3251
3252                 /* Flip inven to equip */
3253                 else if (window_flag[j] & (PW_EQUIP))
3254                 {
3255                         /* Flip flags */
3256                         window_flag[j] &= ~(PW_EQUIP);
3257                         window_flag[j] |= (PW_INVEN);
3258
3259                         /* Window stuff */
3260                         p_ptr->window |= (PW_INVEN);
3261                 }
3262         }
3263 }
3264
3265 /*!
3266  * @brief 選択したアイテムの確認処理の補助 /
3267  * Verify the choice of an item.
3268  * @param prompt メッセージ表示の一部
3269  * @param item 選択アイテムID
3270  * @return 確認がYesならTRUEを返す。
3271  * @details The item can be negative to mean "item on floor".
3272  */
3273 static bool verify(cptr prompt, int item)
3274 {
3275         char        o_name[MAX_NLEN];
3276         char        out_val[MAX_NLEN+20];
3277         object_type *o_ptr;
3278
3279
3280         /* Inventory */
3281         if (item >= 0)
3282         {
3283                 o_ptr = &inventory[item];
3284         }
3285
3286         /* Floor */
3287         else
3288         {
3289                 o_ptr = &o_list[0 - item];
3290         }
3291
3292         /* Describe */
3293         object_desc(o_name, o_ptr, 0);
3294
3295         /* Prompt */
3296 #ifdef JP
3297 (void)sprintf(out_val, "%s%sですか? ", prompt, o_name);
3298 #else
3299         (void)sprintf(out_val, "%s %s? ", prompt, o_name);
3300 #endif
3301
3302
3303         /* Query */
3304         return (get_check(out_val));
3305 }
3306
3307
3308 /*!
3309  * @brief 選択したアイテムの確認処理のメインルーチン /
3310  * @param item 選択アイテムID
3311  * @return 確認がYesならTRUEを返す。
3312  * @details The item can be negative to mean "item on floor".
3313  * Hack -- allow user to "prevent" certain choices
3314  */
3315 static bool get_item_allow(int item)
3316 {
3317         cptr s;
3318
3319         object_type *o_ptr;
3320
3321         if (!command_cmd) return TRUE; /* command_cmd is no longer effective */
3322
3323         /* Inventory */
3324         if (item >= 0)
3325         {
3326                 o_ptr = &inventory[item];
3327         }
3328
3329         /* Floor */
3330         else
3331         {
3332                 o_ptr = &o_list[0 - item];
3333         }
3334
3335         /* No inscription */
3336         if (!o_ptr->inscription) return (TRUE);
3337
3338         /* Find a '!' */
3339         s = my_strchr(quark_str(o_ptr->inscription), '!');
3340
3341         /* Process preventions */
3342         while (s)
3343         {
3344                 /* Check the "restriction" */
3345                 if ((s[1] == command_cmd) || (s[1] == '*'))
3346                 {
3347                         /* Verify the choice */
3348 #ifdef JP
3349 if (!verify("本当に", item)) return (FALSE);
3350 #else
3351                         if (!verify("Really try", item)) return (FALSE);
3352 #endif
3353
3354                 }
3355
3356                 /* Find another '!' */
3357                 s = my_strchr(s + 1, '!');
3358         }
3359
3360         /* Allow it */
3361         return (TRUE);
3362 }
3363
3364
3365 /*!
3366  * @brief プレイヤーの所持/装備オブジェクトが正規のものかを返す /
3367  * Auxiliary function for "get_item()" -- test an index
3368  * @param i 選択アイテムID
3369  * @return 正規のIDならばTRUEを返す。
3370  */
3371 static bool get_item_okay(int i)
3372 {
3373         /* Illegal items */
3374         if ((i < 0) || (i >= INVEN_TOTAL)) return (FALSE);
3375
3376         if (select_ring_slot) return is_ring_slot(i);
3377
3378         /* Verify the item */
3379         if (!item_tester_okay(&inventory[i])) return (FALSE);
3380
3381         /* Assume okay */
3382         return (TRUE);
3383 }
3384
3385 /*!
3386  * @brief プレイヤーがオブジェクトを拾うことができる状態かを返す /
3387  * Determine whether get_item() can get some item or not
3388  * @return アイテムを拾えるならばTRUEを返す。
3389  * @details assuming mode = (USE_EQUIP | USE_INVEN | USE_FLOOR).
3390  */
3391 bool can_get_item(void)
3392 {
3393         int j, floor_list[23], floor_num = 0;
3394
3395         for (j = 0; j < INVEN_TOTAL; j++)
3396                 if (item_tester_okay(&inventory[j]))
3397                         return TRUE;
3398
3399         floor_num = scan_floor(floor_list, py, px, 0x03);
3400         if (floor_num)
3401                 return TRUE;
3402
3403         return FALSE;
3404 }
3405
3406 /*!
3407  * @brief オブジェクト選択の汎用関数 /
3408  * Let the user select an item, save its "index"
3409  * @param cp 選択したオブジェクトのIDを返す。
3410  * @param pmt 選択目的のメッセージ
3411  * @param str 選択できるオブジェクトがない場合のキャンセルメッセージ
3412  * @param mode オプションフラグ
3413  * @return プレイヤーによりアイテムが選択されたならTRUEを返す。/
3414  * Return TRUE only if an acceptable item was chosen by the user.\n
3415  * @details
3416  * The selected item must satisfy the "item_tester_hook()" function,\n
3417  * if that hook is set, and the "item_tester_tval", if that value is set.\n
3418  *\n
3419  * All "item_tester" restrictions are cleared before this function returns.\n
3420  *\n
3421  * The user is allowed to choose acceptable items from the equipment,\n
3422  * inventory, or floor, respectively, if the proper flag was given,\n
3423  * and there are any acceptable items in that location.\n
3424  *\n
3425  * The equipment or inventory are displayed (even if no acceptable\n
3426  * items are in that location) if the proper flag was given.\n
3427  *\n
3428  * If there are no acceptable items available anywhere, and "str" is\n
3429  * not NULL, then it will be used as the text of a warning message\n
3430  * before the function returns.\n
3431  *\n
3432  * Note that the user must press "-" to specify the item on the floor,\n
3433  * and there is no way to "examine" the item on the floor, while the\n
3434  * use of "capital" letters will "examine" an inventory/equipment item,\n
3435  * and prompt for its use.\n
3436  *\n
3437  * If a legal item is selected from the inventory, we save it in "cp"\n
3438  * directly (0 to 35), and return TRUE.\n
3439  *\n
3440  * If a legal item is selected from the floor, we save it in "cp" as\n
3441  * a negative (-1 to -511), and return TRUE.\n
3442  *\n
3443  * If no item is available, we do nothing to "cp", and we display a\n
3444  * warning message, using "str" if available, and return FALSE.\n
3445  *\n
3446  * If no item is selected, we do nothing to "cp", and return FALSE.\n
3447  *\n
3448  * Global "p_ptr->command_new" is used when viewing the inventory or equipment\n
3449  * to allow the user to enter a command while viewing those screens, and\n
3450  * also to induce "auto-enter" of stores, and other such stuff.\n
3451  *\n
3452  * Global "p_ptr->command_see" may be set before calling this function to start\n
3453  * out in "browse" mode.  It is cleared before this function returns.\n
3454  *\n
3455  * Global "p_ptr->command_wrk" is used to choose between equip/inven listings.\n
3456  * If it is TRUE then we are viewing inventory, else equipment.\n
3457  *\n
3458  * We always erase the prompt when we are done, leaving a blank line,\n
3459  * or a warning message, if appropriate, if no items are available.\n
3460  */
3461 bool get_item(int *cp, cptr pmt, cptr str, int mode)
3462 {
3463         s16b this_o_idx, next_o_idx = 0;
3464
3465         char which = ' ';
3466
3467         int j, k, i1, i2, e1, e2;
3468
3469         bool done, item;
3470
3471         bool oops = FALSE;
3472
3473         bool equip = FALSE;
3474         bool inven = FALSE;
3475         bool floor = FALSE;
3476
3477         bool allow_floor = FALSE;
3478
3479         bool toggle = FALSE;
3480
3481         char tmp_val[160];
3482         char out_val[160];
3483
3484         /* See cmd5.c */
3485         extern bool select_the_force;
3486
3487         int menu_line = (use_menu ? 1 : 0);
3488         int max_inven = 0;
3489         int max_equip = 0;
3490
3491 #ifdef ALLOW_REPEAT
3492
3493         static char prev_tag = '\0';
3494         char cur_tag = '\0';
3495
3496 #endif /* ALLOW_REPEAT */
3497
3498 #ifdef ALLOW_EASY_FLOOR /* TNB */
3499
3500         if (easy_floor || use_menu) return get_item_floor(cp, pmt, str, mode);
3501
3502 #endif /* ALLOW_EASY_FLOOR -- TNB */
3503
3504         /* Extract args */
3505         if (mode & USE_EQUIP) equip = TRUE;
3506         if (mode & USE_INVEN) inven = TRUE;
3507         if (mode & USE_FLOOR) floor = TRUE;
3508
3509 #ifdef ALLOW_REPEAT
3510
3511         /* Get the item index */
3512         if (repeat_pull(cp))
3513         {
3514                 /* the_force */
3515                 if (select_the_force && (*cp == INVEN_FORCE))
3516                 {
3517                         item_tester_tval = 0;
3518                         item_tester_hook = NULL;
3519                         command_cmd = 0; /* Hack -- command_cmd is no longer effective */
3520                         return (TRUE);
3521                 }
3522
3523                 /* Floor item? */
3524                 else if (floor && (*cp < 0))
3525                 {
3526                         object_type *o_ptr;
3527
3528                         /* Special index */
3529                         k = 0 - (*cp);
3530
3531                         /* Acquire object */
3532                         o_ptr = &o_list[k];
3533
3534                         /* Validate the item */
3535                         if (item_tester_okay(o_ptr))
3536                         {
3537                                 /* Forget restrictions */
3538                                 item_tester_tval = 0;
3539                                 item_tester_hook = NULL;
3540                                 command_cmd = 0; /* Hack -- command_cmd is no longer effective */
3541
3542                                 /* Success */
3543                                 return TRUE;
3544                         }
3545                 }
3546
3547                 else if ((inven && (*cp >= 0) && (*cp < INVEN_PACK)) ||
3548                          (equip && (*cp >= INVEN_RARM) && (*cp < INVEN_TOTAL)))
3549                 {
3550                         if (prev_tag && command_cmd)
3551                         {
3552                                 /* Look up the tag and validate the item */
3553                                 if (!get_tag(&k, prev_tag, (*cp >= INVEN_RARM) ? USE_EQUIP : USE_INVEN)) /* Reject */;
3554                                 else if ((k < INVEN_RARM) ? !inven : !equip) /* Reject */;
3555                                 else if (!get_item_okay(k)) /* Reject */;
3556                                 else
3557                                 {
3558                                         /* Accept that choice */
3559                                         (*cp) = k;
3560
3561                                         /* Forget restrictions */
3562                                         item_tester_tval = 0;
3563                                         item_tester_hook = NULL;
3564                                         command_cmd = 0; /* Hack -- command_cmd is no longer effective */
3565
3566                                         /* Success */
3567                                         return TRUE;
3568                                 }
3569
3570                                 prev_tag = '\0'; /* prev_tag is no longer effective */
3571                         }
3572
3573                         /* Verify the item */
3574                         else if (get_item_okay(*cp))
3575                         {
3576                                 /* Forget restrictions */
3577                                 item_tester_tval = 0;
3578                                 item_tester_hook = NULL;
3579                                 command_cmd = 0; /* Hack -- command_cmd is no longer effective */
3580
3581                                 /* Success */
3582                                 return TRUE;
3583                         }
3584                 }
3585         }
3586
3587 #endif /* ALLOW_REPEAT */
3588
3589
3590         /* Paranoia XXX XXX XXX */
3591         msg_print(NULL);
3592
3593
3594         /* Not done */
3595         done = FALSE;
3596
3597         /* No item selected */
3598         item = FALSE;
3599
3600
3601         /* Full inventory */
3602         i1 = 0;
3603         i2 = INVEN_PACK - 1;
3604
3605         /* Forbid inventory */
3606         if (!inven) i2 = -1;
3607         else if (use_menu)
3608         {
3609                 for (j = 0; j < INVEN_PACK; j++)
3610                         if (item_tester_okay(&inventory[j])) max_inven++;
3611         }
3612
3613         /* Restrict inventory indexes */
3614         while ((i1 <= i2) && (!get_item_okay(i1))) i1++;
3615         while ((i1 <= i2) && (!get_item_okay(i2))) i2--;
3616
3617
3618         /* Full equipment */
3619         e1 = INVEN_RARM;
3620         e2 = INVEN_TOTAL - 1;
3621
3622         /* Forbid equipment */
3623         if (!equip) e2 = -1;
3624         else if (use_menu)
3625         {
3626                 for (j = INVEN_RARM; j < INVEN_TOTAL; j++)
3627                         if (select_ring_slot ? is_ring_slot(j) : item_tester_okay(&inventory[j])) max_equip++;
3628                 if (p_ptr->ryoute && !item_tester_no_ryoute) max_equip++;
3629         }
3630
3631         /* Restrict equipment indexes */
3632         while ((e1 <= e2) && (!get_item_okay(e1))) e1++;
3633         while ((e1 <= e2) && (!get_item_okay(e2))) e2--;
3634
3635         if (equip && p_ptr->ryoute && !item_tester_no_ryoute)
3636         {
3637                 if (p_ptr->migite)
3638                 {
3639                         if (e2 < INVEN_LARM) e2 = INVEN_LARM;
3640                 }
3641                 else if (p_ptr->hidarite) e1 = INVEN_RARM;
3642         }
3643
3644
3645         /* Restrict floor usage */
3646         if (floor)
3647         {
3648                 /* Scan all objects in the grid */
3649                 for (this_o_idx = cave[py][px].o_idx; this_o_idx; this_o_idx = next_o_idx)
3650                 {
3651                         object_type *o_ptr;
3652
3653                         /* Acquire object */
3654                         o_ptr = &o_list[this_o_idx];
3655
3656                         /* Acquire next object */
3657                         next_o_idx = o_ptr->next_o_idx;
3658
3659                         /* Accept the item on the floor if legal */
3660                         if (item_tester_okay(o_ptr) && (o_ptr->marked & OM_FOUND)) allow_floor = TRUE;
3661                 }
3662         }
3663
3664         /* Require at least one legal choice */
3665         if (!allow_floor && (i1 > i2) && (e1 > e2))
3666         {
3667                 /* Cancel p_ptr->command_see */
3668                 command_see = FALSE;
3669
3670                 /* Oops */
3671                 oops = TRUE;
3672
3673                 /* Done */
3674                 done = TRUE;
3675
3676                 if (select_the_force) {
3677                     *cp = INVEN_FORCE;
3678                     item = TRUE;
3679                 }
3680         }
3681
3682         /* Analyze choices */
3683         else
3684         {
3685                 /* Hack -- Start on equipment if requested */
3686                 if (command_see && command_wrk && equip)
3687                 {
3688                         command_wrk = TRUE;
3689                 }
3690
3691                 /* Use inventory if allowed */
3692                 else if (inven)
3693                 {
3694                         command_wrk = FALSE;
3695                 }
3696
3697                 /* Use equipment if allowed */
3698                 else if (equip)
3699                 {
3700                         command_wrk = TRUE;
3701                 }
3702
3703                 /* Use inventory for floor */
3704                 else
3705                 {
3706                         command_wrk = FALSE;
3707                 }
3708         }
3709
3710
3711         /*
3712          * 追加オプション(always_show_list)が設定されている場合は常に一覧を表示する
3713          */
3714         if ((always_show_list == TRUE) || use_menu) command_see = TRUE;
3715
3716         /* Hack -- start out in "display" mode */
3717         if (command_see)
3718         {
3719                 /* Save screen */
3720                 screen_save();
3721         }
3722
3723
3724         /* Repeat until done */
3725         while (!done)
3726         {
3727                 int get_item_label = 0;
3728
3729                 /* Show choices */
3730                 int ni = 0;
3731                 int ne = 0;
3732
3733                 /* Scan windows */
3734                 for (j = 0; j < 8; j++)
3735                 {
3736                         /* Unused */
3737                         if (!angband_term[j]) continue;
3738
3739                         /* Count windows displaying inven */
3740                         if (window_flag[j] & (PW_INVEN)) ni++;
3741
3742                         /* Count windows displaying equip */
3743                         if (window_flag[j] & (PW_EQUIP)) ne++;
3744                 }
3745
3746                 /* Toggle if needed */
3747                 if ((command_wrk && ni && !ne) ||
3748                     (!command_wrk && !ni && ne))
3749                 {
3750                         /* Toggle */
3751                         toggle_inven_equip();
3752
3753                         /* Track toggles */
3754                         toggle = !toggle;
3755                 }
3756
3757                 /* Update */
3758                 p_ptr->window |= (PW_INVEN | PW_EQUIP);
3759
3760                 /* Redraw windows */
3761                 window_stuff();
3762
3763
3764                 /* Inventory screen */
3765                 if (!command_wrk)
3766                 {
3767                         /* Redraw if needed */
3768                         if (command_see) get_item_label = show_inven(menu_line);
3769                 }
3770
3771                 /* Equipment screen */
3772                 else
3773                 {
3774                         /* Redraw if needed */
3775                         if (command_see) get_item_label = show_equip(menu_line);
3776                 }
3777
3778                 /* Viewing inventory */
3779                 if (!command_wrk)
3780                 {
3781                         /* Begin the prompt */
3782 #ifdef JP
3783                         sprintf(out_val, "持ち物:");
3784 #else
3785                         sprintf(out_val, "Inven:");
3786 #endif
3787
3788                         /* Some legal items */
3789                         if ((i1 <= i2) && !use_menu)
3790                         {
3791                                 /* Build the prompt */
3792 #ifdef JP
3793                                 sprintf(tmp_val, "%c-%c,'(',')',",
3794 #else
3795                                 sprintf(tmp_val, " %c-%c,'(',')',",
3796 #endif
3797                                         index_to_label(i1), index_to_label(i2));
3798
3799                                 /* Append */
3800                                 strcat(out_val, tmp_val);
3801                         }
3802
3803                         /* Indicate ability to "view" */
3804 #ifdef JP
3805                         if (!command_see && !use_menu) strcat(out_val, " '*'一覧,");
3806 #else
3807                         if (!command_see && !use_menu) strcat(out_val, " * to see,");
3808 #endif
3809
3810                         /* Append */
3811 #ifdef JP
3812                         if (equip) strcat(out_val, format(" %s 装備品,", use_menu ? "'4'or'6'" : "'/'"));
3813 #else
3814                         if (equip) strcat(out_val, format(" %s for Equip,", use_menu ? "4 or 6" : "/"));
3815 #endif
3816                 }
3817
3818                 /* Viewing equipment */
3819                 else
3820                 {
3821                         /* Begin the prompt */
3822 #ifdef JP
3823                         sprintf(out_val, "装備品:");
3824 #else
3825                         sprintf(out_val, "Equip:");
3826 #endif
3827
3828                         /* Some legal items */
3829                         if ((e1 <= e2) && !use_menu)
3830                         {
3831                                 /* Build the prompt */
3832 #ifdef JP
3833                                 sprintf(tmp_val, "%c-%c,'(',')',",
3834 #else
3835                                 sprintf(tmp_val, " %c-%c,'(',')',",
3836 #endif
3837                                         index_to_label(e1), index_to_label(e2));
3838
3839                                 /* Append */
3840                                 strcat(out_val, tmp_val);
3841                         }
3842
3843                         /* Indicate ability to "view" */
3844 #ifdef JP
3845                         if (!command_see && !use_menu) strcat(out_val, " '*'一覧,");
3846 #else
3847                         if (!command_see) strcat(out_val, " * to see,");
3848 #endif
3849
3850                         /* Append */
3851 #ifdef JP
3852                         if (inven) strcat(out_val, format(" %s 持ち物,", use_menu ? "'4'or'6'" : "'/'"));
3853 #else
3854                         if (inven) strcat(out_val, format(" %s for Inven,", use_menu ? "4 or 6" : "'/'"));
3855 #endif
3856                 }
3857
3858                 /* Indicate legality of the "floor" item */
3859 #ifdef JP
3860                 if (allow_floor) strcat(out_val, " '-'床上,");
3861                 if (select_the_force) strcat(out_val, " 'w'練気術,");
3862 #else
3863                 if (allow_floor) strcat(out_val, " - for floor,");
3864                 if (select_the_force) strcat(out_val, " w for the Force,");
3865 #endif
3866
3867                 /* Finish the prompt */
3868                 strcat(out_val, " ESC");
3869
3870                 /* Build the prompt */
3871                 sprintf(tmp_val, "(%s) %s", out_val, pmt);
3872
3873                 /* Show the prompt */
3874                 prt(tmp_val, 0, 0);
3875
3876                 /* Get a key */
3877                 which = inkey();
3878
3879                 if (use_menu)
3880                 {
3881                 int max_line = (command_wrk ? max_equip : max_inven);
3882                 switch (which)
3883                 {
3884                         case ESCAPE:
3885                         case 'z':
3886                         case 'Z':
3887                         case '0':
3888                         {
3889                                 done = TRUE;
3890                                 break;
3891                         }
3892
3893                         case '8':
3894                         case 'k':
3895                         case 'K':
3896                         {
3897                                 menu_line += (max_line - 1);
3898                                 break;
3899                         }
3900
3901                         case '2':
3902                         case 'j':
3903                         case 'J':
3904                         {
3905                                 menu_line++;
3906                                 break;
3907                         }
3908
3909                         case '4':
3910                         case '6':
3911                         case 'h':
3912                         case 'H':
3913                         case 'l':
3914                         case 'L':
3915                         {
3916                                 /* Verify legality */
3917                                 if (!inven || !equip)
3918                                 {
3919                                         bell();
3920                                         break;
3921                                 }
3922
3923                                 /* Hack -- Fix screen */
3924                                 if (command_see)
3925                                 {
3926                                         /* Load screen */
3927                                         screen_load();
3928
3929                                         /* Save screen */
3930                                         screen_save();
3931                                 }
3932
3933                                 /* Switch inven/equip */
3934                                 command_wrk = !command_wrk;
3935                                 max_line = (command_wrk ? max_equip : max_inven);
3936                                 if (menu_line > max_line) menu_line = max_line;
3937
3938                                 /* Need to redraw */
3939                                 break;
3940                         }
3941
3942                         case 'x':
3943                         case 'X':
3944                         case '\r':
3945                         case '\n':
3946                         {
3947                                 if (command_wrk == USE_FLOOR)
3948                                 {
3949                                         /* Special index */
3950                                         (*cp) = -get_item_label;
3951                                 }
3952                                 else
3953                                 {
3954                                         /* Validate the item */
3955                                         if (!get_item_okay(get_item_label))
3956                                         {
3957                                                 bell();
3958                                                 break;
3959                                         }
3960
3961                                         /* Allow player to "refuse" certain actions */
3962                                         if (!get_item_allow(get_item_label))
3963                                         {
3964                                                 done = TRUE;
3965                                                 break;
3966                                         }
3967
3968                                         /* Accept that choice */
3969                                         (*cp) = get_item_label;
3970                                 }
3971
3972                                 item = TRUE;
3973                                 done = TRUE;
3974                                 break;
3975                         }
3976                         case 'w':
3977                         {
3978                                 if (select_the_force) {
3979                                         *cp = INVEN_FORCE;
3980                                         item = TRUE;
3981                                         done = TRUE;
3982                                         break;
3983                                 }
3984                         }
3985                 }
3986                 if (menu_line > max_line) menu_line -= max_line;
3987                 }
3988                 else
3989                 {
3990                 /* Parse it */
3991                 switch (which)
3992                 {
3993                         case ESCAPE:
3994                         {
3995                                 done = TRUE;
3996                                 break;
3997                         }
3998
3999                         case '*':
4000                         case '?':
4001                         case ' ':
4002                         {
4003                                 /* Hide the list */
4004                                 if (command_see)
4005                                 {
4006                                         /* Flip flag */
4007                                         command_see = FALSE;
4008
4009                                         /* Load screen */
4010                                         screen_load();
4011                                 }
4012
4013                                 /* Show the list */
4014                                 else
4015                                 {
4016                                         /* Save screen */
4017                                         screen_save();
4018
4019                                         /* Flip flag */
4020                                         command_see = TRUE;
4021                                 }
4022                                 break;
4023                         }
4024
4025                         case '/':
4026                         {
4027                                 /* Verify legality */
4028                                 if (!inven || !equip)
4029                                 {
4030                                         bell();
4031                                         break;
4032                                 }
4033
4034                                 /* Hack -- Fix screen */
4035                                 if (command_see)
4036                                 {
4037                                         /* Load screen */
4038                                         screen_load();
4039
4040                                         /* Save screen */
4041                                         screen_save();
4042                                 }
4043
4044                                 /* Switch inven/equip */
4045                                 command_wrk = !command_wrk;
4046
4047                                 /* Need to redraw */
4048                                 break;
4049                         }
4050
4051                         case '-':
4052                         {
4053                                 /* Use floor item */
4054                                 if (allow_floor)
4055                                 {
4056                                         /* Scan all objects in the grid */
4057                                         for (this_o_idx = cave[py][px].o_idx; this_o_idx; this_o_idx = next_o_idx)
4058                                         {
4059                                                 object_type *o_ptr;
4060
4061                                                 /* Acquire object */
4062                                                 o_ptr = &o_list[this_o_idx];
4063
4064                                                 /* Acquire next object */
4065                                                 next_o_idx = o_ptr->next_o_idx;
4066
4067                                                 /* Validate the item */
4068                                                 if (!item_tester_okay(o_ptr)) continue;
4069
4070                                                 /* Special index */
4071                                                 k = 0 - this_o_idx;
4072
4073                                                 /* Verify the item (if required) */
4074 #ifdef JP
4075 if (other_query_flag && !verify("本当に", k)) continue;
4076 #else
4077                                                 if (other_query_flag && !verify("Try", k)) continue;
4078 #endif
4079
4080
4081                                                 /* Allow player to "refuse" certain actions */
4082                                                 if (!get_item_allow(k)) continue;
4083
4084                                                 /* Accept that choice */
4085                                                 (*cp) = k;
4086                                                 item = TRUE;
4087                                                 done = TRUE;
4088                                                 break;
4089                                         }
4090
4091                                         /* Outer break */
4092                                         if (done) break;
4093                                 }
4094
4095                                 /* Oops */
4096                                 bell();
4097                                 break;
4098                         }
4099
4100                         case '0':
4101                         case '1': case '2': case '3':
4102                         case '4': case '5': case '6':
4103                         case '7': case '8': case '9':
4104                         {
4105                                 /* Look up the tag */
4106                                 if (!get_tag(&k, which, command_wrk ? USE_EQUIP : USE_INVEN))
4107                                 {
4108                                         bell();
4109                                         break;
4110                                 }
4111
4112                                 /* Hack -- Validate the item */
4113                                 if ((k < INVEN_RARM) ? !inven : !equip)
4114                                 {
4115                                         bell();
4116                                         break;
4117                                 }
4118
4119                                 /* Validate the item */
4120                                 if (!get_item_okay(k))
4121                                 {
4122                                         bell();
4123                                         break;
4124                                 }
4125
4126                                 /* Allow player to "refuse" certain actions */
4127                                 if (!get_item_allow(k))
4128                                 {
4129                                         done = TRUE;
4130                                         break;
4131                                 }
4132
4133                                 /* Accept that choice */
4134                                 (*cp) = k;
4135                                 item = TRUE;
4136                                 done = TRUE;
4137 #ifdef ALLOW_REPEAT
4138                                 cur_tag = which;
4139 #endif /* ALLOW_REPEAT */
4140                                 break;
4141                         }
4142
4143 #if 0
4144                         case '\n':
4145                         case '\r':
4146                         {
4147                                 /* Choose "default" inventory item */
4148                                 if (!command_wrk)
4149                                 {
4150                                         k = ((i1 == i2) ? i1 : -1);
4151                                 }
4152
4153                                 /* Choose "default" equipment item */
4154                                 else
4155                                 {
4156                                         k = ((e1 == e2) ? e1 : -1);
4157                                 }
4158
4159                                 /* Validate the item */
4160                                 if (!get_item_okay(k))
4161                                 {
4162                                         bell();
4163                                         break;
4164                                 }
4165
4166                                 /* Allow player to "refuse" certain actions */
4167                                 if (!get_item_allow(k))
4168                                 {
4169                                         done = TRUE;
4170                                         break;
4171                                 }
4172
4173                                 /* Accept that choice */
4174                                 (*cp) = k;
4175                                 item = TRUE;
4176                                 done = TRUE;
4177                                 break;
4178                         }
4179 #endif
4180
4181                         case 'w':
4182                         {
4183                                 if (select_the_force) {
4184                                         *cp = INVEN_FORCE;
4185                                         item = TRUE;
4186                                         done = TRUE;
4187                                         break;
4188                                 }
4189
4190                                 /* Fall through */
4191                         }
4192
4193                         default:
4194                         {
4195                                 int ver;
4196                                 bool not_found = FALSE;
4197
4198                                 /* Look up the alphabetical tag */
4199                                 if (!get_tag(&k, which, command_wrk ? USE_EQUIP : USE_INVEN))
4200                                 {
4201                                         not_found = TRUE;
4202                                 }
4203
4204                                 /* Hack -- Validate the item */
4205                                 else if ((k < INVEN_RARM) ? !inven : !equip)
4206                                 {
4207                                         not_found = TRUE;
4208                                 }
4209
4210                                 /* Validate the item */
4211                                 else if (!get_item_okay(k))
4212                                 {
4213                                         not_found = TRUE;
4214                                 }
4215
4216                                 if (!not_found)
4217                                 {
4218                                         /* Accept that choice */
4219                                         (*cp) = k;
4220                                         item = TRUE;
4221                                         done = TRUE;
4222 #ifdef ALLOW_REPEAT
4223                                         cur_tag = which;
4224 #endif /* ALLOW_REPEAT */
4225                                         break;
4226                                 }
4227
4228                                 /* Extract "query" setting */
4229                                 ver = isupper(which);
4230                                 which = tolower(which);
4231
4232                                 /* Convert letter to inventory index */
4233                                 if (!command_wrk)
4234                                 {
4235                                         if (which == '(') k = i1;
4236                                         else if (which == ')') k = i2;
4237                                         else k = label_to_inven(which);
4238                                 }
4239
4240                                 /* Convert letter to equipment index */
4241                                 else
4242                                 {
4243                                         if (which == '(') k = e1;
4244                                         else if (which == ')') k = e2;
4245                                         else k = label_to_equip(which);
4246                                 }
4247
4248                                 /* Validate the item */
4249                                 if (!get_item_okay(k))
4250                                 {
4251                                         bell();
4252                                         break;
4253                                 }
4254
4255                                 /* Verify the item */
4256 #ifdef JP
4257 if (ver && !verify("本当に", k))
4258 #else
4259                                 if (ver && !verify("Try", k))
4260 #endif
4261
4262                                 {
4263                                         done = TRUE;
4264                                         break;
4265                                 }
4266
4267                                 /* Allow player to "refuse" certain actions */
4268                                 if (!get_item_allow(k))
4269                                 {
4270                                         done = TRUE;
4271                                         break;
4272                                 }
4273
4274                                 /* Accept that choice */
4275                                 (*cp) = k;
4276                                 item = TRUE;
4277                                 done = TRUE;
4278                                 break;
4279                         }
4280                 }
4281                 }
4282         }
4283
4284
4285         /* Fix the screen if necessary */
4286         if (command_see)
4287         {
4288                 /* Load screen */
4289                 screen_load();
4290
4291                 /* Hack -- Cancel "display" */
4292                 command_see = FALSE;
4293         }
4294
4295
4296         /* Forget the item_tester_tval restriction */
4297         item_tester_tval = 0;
4298
4299         item_tester_no_ryoute = FALSE;
4300
4301         /* Forget the item_tester_hook restriction */
4302         item_tester_hook = NULL;
4303
4304
4305         /* Clean up  'show choices' */
4306         /* Toggle again if needed */
4307         if (toggle) toggle_inven_equip();
4308
4309         /* Update */
4310         p_ptr->window |= (PW_INVEN | PW_EQUIP);
4311
4312         /* Window stuff */
4313         window_stuff();
4314
4315
4316         /* Clear the prompt line */
4317         prt("", 0, 0);
4318
4319         /* Warning if needed */
4320         if (oops && str) msg_print(str);
4321
4322         if (item)
4323         {
4324 #ifdef ALLOW_REPEAT
4325                 repeat_push(*cp);
4326                 if (command_cmd) prev_tag = cur_tag;
4327 #endif /* ALLOW_REPEAT */
4328
4329                 command_cmd = 0; /* Hack -- command_cmd is no longer effective */
4330         }
4331
4332         /* Result */
4333         return (item);
4334 }
4335
4336
4337 #ifdef ALLOW_EASY_FLOOR
4338
4339 /*!
4340  * @brief 床下に落ちているオブジェクトの数を返す / scan_floor
4341  * @param items オブジェクトのIDリストを返すための配列参照ポインタ
4342  * @param y 走査するフロアのY座標
4343  * @param x 走査するフロアのX座標
4344  * @param mode オプションフラグ
4345  * @return 対象のマスに落ちているアイテム数
4346  * @details
4347  * Return a list of o_list[] indexes of items at the given cave
4348  * location. Valid flags are:
4349  *
4350  *              mode & 0x01 -- Item tester
4351  *              mode & 0x02 -- Marked items only
4352  *              mode & 0x04 -- Stop after first
4353  */
4354 int scan_floor(int *items, int y, int x, int mode)
4355 {
4356         int this_o_idx, next_o_idx;
4357
4358         int num = 0;
4359
4360         /* Sanity */
4361         if (!in_bounds(y, x)) return 0;
4362
4363         /* Scan all objects in the grid */
4364         for (this_o_idx = cave[y][x].o_idx; this_o_idx; this_o_idx = next_o_idx)
4365         {
4366                 object_type *o_ptr;
4367
4368                 /* Acquire object */
4369                 o_ptr = &o_list[this_o_idx];
4370
4371                 /* Acquire next object */
4372                 next_o_idx = o_ptr->next_o_idx;
4373
4374                 /* Item tester */
4375                 if ((mode & 0x01) && !item_tester_okay(o_ptr)) continue;
4376
4377                 /* Marked */
4378                 if ((mode & 0x02) && !(o_ptr->marked & OM_FOUND)) continue;
4379
4380                 /* Accept this item */
4381                 /* XXX Hack -- Enforce limit */
4382                 if (num < 23)
4383                         items[num] = this_o_idx;
4384
4385                 num++;
4386
4387                 /* Only one */
4388                 if (mode & 0x04) break;
4389         }
4390
4391         /* Result */
4392         return num;
4393 }
4394
4395
4396 /*!
4397  * @brief 床下に落ちているアイテムの一覧を返す / Display a list of the items on the floor at the given location.
4398  * @param target_item カーソルの初期値
4399  * @param y 走査するフロアのY座標
4400  * @param x 走査するフロアのX座標
4401  * @param min_width 表示の長さ
4402  * @return 選択したアイテムのID
4403  * @details
4404  */
4405 int show_floor(int target_item, int y, int x, int *min_width)
4406 {
4407         int i, j, k, l;
4408         int col, len;
4409
4410         object_type *o_ptr;
4411
4412         char o_name[MAX_NLEN];
4413
4414         char tmp_val[80];
4415
4416         int out_index[23];
4417         byte out_color[23];
4418         char out_desc[23][MAX_NLEN];
4419         int target_item_label = 0;
4420
4421         int floor_list[23], floor_num;
4422         int wid, hgt;
4423         char floor_label[52 + 1];
4424
4425         bool dont_need_to_show_weights = TRUE;
4426
4427         /* Get size */
4428         Term_get_size(&wid, &hgt);
4429
4430         /* Default length */
4431         len = MAX((*min_width), 20);
4432
4433
4434         /* Scan for objects in the grid, using item_tester_okay() */
4435         floor_num = scan_floor(floor_list, y, x, 0x03);
4436
4437         /* Display the floor objects */
4438         for (k = 0, i = 0; i < floor_num && i < 23; i++)
4439         {
4440                 o_ptr = &o_list[floor_list[i]];
4441
4442                 /* Describe the object */
4443                 object_desc(o_name, o_ptr, 0);
4444
4445                 /* Save the index */
4446                 out_index[k] = i;
4447
4448                 /* Acquire inventory color */
4449                 out_color[k] = tval_to_attr[o_ptr->tval & 0x7F];
4450
4451                 /* Save the object description */
4452                 strcpy(out_desc[k], o_name);
4453
4454                 /* Find the predicted "line length" */
4455                 l = strlen(out_desc[k]) + 5;
4456
4457                 /* Be sure to account for the weight */
4458                 if (show_weights) l += 9;
4459
4460                 if (o_ptr->tval != TV_GOLD) dont_need_to_show_weights = FALSE;
4461
4462                 /* Maintain the maximum length */
4463                 if (l > len) len = l;
4464
4465                 /* Advance to next "line" */
4466                 k++;
4467         }
4468
4469         if (show_weights && dont_need_to_show_weights) len -= 9;
4470
4471         /* Save width */
4472         *min_width = len;
4473
4474         /* Find the column to start in */
4475         col = (len > wid - 4) ? 0 : (wid - len - 1);
4476
4477         prepare_label_string_floor(floor_label, floor_list, floor_num);
4478
4479         /* Output each entry */
4480         for (j = 0; j < k; j++)
4481         {
4482                 /* Get the index */
4483                 i = floor_list[out_index[j]];
4484
4485                 /* Get the item */
4486                 o_ptr = &o_list[i];
4487
4488                 /* Clear the line */
4489                 prt("", j + 1, col ? col - 2 : col);
4490
4491                 if (use_menu && target_item)
4492                 {
4493                         if (j == (target_item-1))
4494                         {
4495 #ifdef JP
4496                                 strcpy(tmp_val, "》");
4497 #else
4498                                 strcpy(tmp_val, "> ");
4499 #endif
4500                                 target_item_label = i;
4501                         }
4502                         else strcpy(tmp_val, "   ");
4503                 }
4504                 else
4505                 {
4506                         /* Prepare an index --(-- */
4507                         sprintf(tmp_val, "%c)", floor_label[j]);
4508                 }
4509
4510                 /* Clear the line with the (possibly indented) index */
4511                 put_str(tmp_val, j + 1, col);
4512
4513                 /* Display the entry itself */
4514                 c_put_str(out_color[j], out_desc[j], j + 1, col + 3);
4515
4516                 /* Display the weight if needed */
4517                 if (show_weights && (o_ptr->tval != TV_GOLD))
4518                 {
4519                         int wgt = o_ptr->weight * o_ptr->number;
4520 #ifdef JP
4521                         sprintf(tmp_val, "%3d.%1d kg", lbtokg1(wgt) , lbtokg2(wgt) );
4522 #else
4523                         sprintf(tmp_val, "%3d.%1d lb", wgt / 10, wgt % 10);
4524 #endif
4525
4526                         prt(tmp_val, j + 1, wid - 9);
4527                 }
4528         }
4529
4530         /* Make a "shadow" below the list (only if needed) */
4531         if (j && (j < 23)) prt("", j + 1, col ? col - 2 : col);
4532
4533         return target_item_label;
4534 }
4535
4536 /*!
4537  * @brief オブジェクト選択の汎用関数(床上アイテム用) /
4538  * Let the user select an item, save its "index"
4539  * @param cp 選択したオブジェクトのIDを返す。
4540  * @param pmt 選択目的のメッセージ
4541  * @param str 選択できるオブジェクトがない場合のキャンセルメッセージ
4542  * @param mode オプションフラグ
4543  * @return プレイヤーによりアイテムが選択されたならTRUEを返す。/
4544  */
4545 bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
4546 {
4547         char n1 = ' ', n2 = ' ', which = ' ';
4548
4549         int j, k, i1, i2, e1, e2;
4550
4551         bool done, item;
4552
4553         bool oops = FALSE;
4554
4555         /* Extract args */
4556         bool equip = (mode & USE_EQUIP) ? TRUE : FALSE;
4557         bool inven = (mode & USE_INVEN) ? TRUE : FALSE;
4558         bool floor = (mode & USE_FLOOR) ? TRUE : FALSE;
4559
4560         bool allow_equip = FALSE;
4561         bool allow_inven = FALSE;
4562         bool allow_floor = FALSE;
4563
4564         bool toggle = FALSE;
4565
4566         char tmp_val[160];
4567         char out_val[160];
4568
4569         int floor_num, floor_list[23], floor_top = 0;
4570         int min_width = 0;
4571
4572         extern bool select_the_force;
4573
4574         int menu_line = (use_menu ? 1 : 0);
4575         int max_inven = 0;
4576         int max_equip = 0;
4577
4578 #ifdef ALLOW_REPEAT
4579
4580         static char prev_tag = '\0';
4581         char cur_tag = '\0';
4582
4583         /* Get the item index */
4584         if (repeat_pull(cp))
4585         {
4586                 /* the_force */
4587                 if (select_the_force && (*cp == INVEN_FORCE))
4588                 {
4589                         item_tester_tval = 0;
4590                         item_tester_hook = NULL;
4591                         command_cmd = 0; /* Hack -- command_cmd is no longer effective */
4592                         return (TRUE);
4593                 }
4594
4595                 /* Floor item? */
4596                 else if (floor && (*cp < 0))
4597                 {
4598                         if (prev_tag && command_cmd)
4599                         {
4600                                 /* Scan all objects in the grid */
4601                                 floor_num = scan_floor(floor_list, py, px, 0x03);
4602
4603                                 /* Look up the tag */
4604                                 if (get_tag_floor(&k, prev_tag, floor_list, floor_num))
4605                                 {
4606                                         /* Accept that choice */
4607                                         (*cp) = 0 - floor_list[k];
4608
4609                                         /* Forget restrictions */
4610                                         item_tester_tval = 0;
4611                                         item_tester_hook = NULL;
4612                                         command_cmd = 0; /* Hack -- command_cmd is no longer effective */
4613
4614                                         /* Success */
4615                                         return TRUE;
4616                                 }
4617
4618                                 prev_tag = '\0'; /* prev_tag is no longer effective */
4619                         }
4620
4621                         /* Validate the item */
4622                         else if (item_tester_okay(&o_list[0 - (*cp)]))
4623                         {
4624                                 /* Forget restrictions */
4625                                 item_tester_tval = 0;
4626                                 item_tester_hook = NULL;
4627                                 command_cmd = 0; /* Hack -- command_cmd is no longer effective */
4628
4629                                 /* Success */
4630                                 return TRUE;
4631                         }
4632                 }
4633
4634                 else if ((inven && (*cp >= 0) && (*cp < INVEN_PACK)) ||
4635                          (equip && (*cp >= INVEN_RARM) && (*cp < INVEN_TOTAL)))
4636                 {
4637                         if (prev_tag && command_cmd)
4638                         {
4639                                 /* Look up the tag and validate the item */
4640                                 if (!get_tag(&k, prev_tag, (*cp >= INVEN_RARM) ? USE_EQUIP : USE_INVEN)) /* Reject */;
4641                                 else if ((k < INVEN_RARM) ? !inven : !equip) /* Reject */;
4642                                 else if (!get_item_okay(k)) /* Reject */;
4643                                 else
4644                                 {
4645                                         /* Accept that choice */
4646                                         (*cp) = k;
4647
4648                                         /* Forget restrictions */
4649                                         item_tester_tval = 0;
4650                                         item_tester_hook = NULL;
4651                                         command_cmd = 0; /* Hack -- command_cmd is no longer effective */
4652
4653                                         /* Success */
4654                                         return TRUE;
4655                                 }
4656
4657                                 prev_tag = '\0'; /* prev_tag is no longer effective */
4658                         }
4659
4660                         /* Verify the item */
4661                         else if (get_item_okay(*cp))
4662                         {
4663                                 /* Forget restrictions */
4664                                 item_tester_tval = 0;
4665                                 item_tester_hook = NULL;
4666                                 command_cmd = 0; /* Hack -- command_cmd is no longer effective */
4667
4668                                 /* Success */
4669                                 return TRUE;
4670                         }
4671                 }
4672         }
4673
4674 #endif /* ALLOW_REPEAT */
4675
4676
4677         /* Paranoia XXX XXX XXX */
4678         msg_print(NULL);
4679
4680
4681         /* Not done */
4682         done = FALSE;
4683
4684         /* No item selected */
4685         item = FALSE;
4686
4687
4688         /* Full inventory */
4689         i1 = 0;
4690         i2 = INVEN_PACK - 1;
4691
4692         /* Forbid inventory */
4693         if (!inven) i2 = -1;
4694         else if (use_menu)
4695         {
4696                 for (j = 0; j < INVEN_PACK; j++)
4697                         if (item_tester_okay(&inventory[j])) max_inven++;
4698         }
4699
4700         /* Restrict inventory indexes */
4701         while ((i1 <= i2) && (!get_item_okay(i1))) i1++;
4702         while ((i1 <= i2) && (!get_item_okay(i2))) i2--;
4703
4704
4705         /* Full equipment */
4706         e1 = INVEN_RARM;
4707         e2 = INVEN_TOTAL - 1;
4708
4709         /* Forbid equipment */
4710         if (!equip) e2 = -1;
4711         else if (use_menu)
4712         {
4713                 for (j = INVEN_RARM; j < INVEN_TOTAL; j++)
4714                         if (select_ring_slot ? is_ring_slot(j) : item_tester_okay(&inventory[j])) max_equip++;
4715                 if (p_ptr->ryoute && !item_tester_no_ryoute) max_equip++;
4716         }
4717
4718         /* Restrict equipment indexes */
4719         while ((e1 <= e2) && (!get_item_okay(e1))) e1++;
4720         while ((e1 <= e2) && (!get_item_okay(e2))) e2--;
4721
4722         if (equip && p_ptr->ryoute && !item_tester_no_ryoute)
4723         {
4724                 if (p_ptr->migite)
4725                 {
4726                         if (e2 < INVEN_LARM) e2 = INVEN_LARM;
4727                 }
4728                 else if (p_ptr->hidarite) e1 = INVEN_RARM;
4729         }
4730
4731
4732         /* Count "okay" floor items */
4733         floor_num = 0;
4734
4735         /* Restrict floor usage */
4736         if (floor)
4737         {
4738                 /* Scan all objects in the grid */
4739                 floor_num = scan_floor(floor_list, py, px, 0x03);
4740         }
4741
4742         /* Accept inventory */
4743         if (i1 <= i2) allow_inven = TRUE;
4744
4745         /* Accept equipment */
4746         if (e1 <= e2) allow_equip = TRUE;
4747
4748         /* Accept floor */
4749         if (floor_num) allow_floor = TRUE;
4750
4751         /* Require at least one legal choice */
4752         if (!allow_inven && !allow_equip && !allow_floor)
4753         {
4754                 /* Cancel p_ptr->command_see */
4755                 command_see = FALSE;
4756
4757                 /* Oops */
4758                 oops = TRUE;
4759
4760                 /* Done */
4761                 done = TRUE;
4762
4763                 if (select_the_force) {
4764                     *cp = INVEN_FORCE;
4765                     item = TRUE;
4766                 }
4767         }
4768
4769         /* Analyze choices */
4770         else
4771         {
4772                 /* Hack -- Start on equipment if requested */
4773                 if (command_see && (command_wrk == (USE_EQUIP))
4774                         && allow_equip)
4775                 {
4776                         command_wrk = (USE_EQUIP);
4777                 }
4778
4779                 /* Use inventory if allowed */
4780                 else if (allow_inven)
4781                 {
4782                         command_wrk = (USE_INVEN);
4783                 }
4784
4785                 /* Use equipment if allowed */
4786                 else if (allow_equip)
4787                 {
4788                         command_wrk = (USE_EQUIP);
4789                 }
4790
4791                 /* Use floor if allowed */
4792                 else if (allow_floor)
4793                 {
4794                         command_wrk = (USE_FLOOR);
4795                 }
4796         }
4797
4798         /*
4799          * 追加オプション(always_show_list)が設定されている場合は常に一覧を表示する
4800          */
4801         if ((always_show_list == TRUE) || use_menu) command_see = TRUE;
4802
4803         /* Hack -- start out in "display" mode */
4804         if (command_see)
4805         {
4806                 /* Save screen */
4807                 screen_save();
4808         }
4809
4810         /* Repeat until done */
4811         while (!done)
4812         {
4813                 int get_item_label = 0;
4814
4815                 /* Show choices */
4816                 int ni = 0;
4817                 int ne = 0;
4818
4819                 /* Scan windows */
4820                 for (j = 0; j < 8; j++)
4821                 {
4822                         /* Unused */
4823                         if (!angband_term[j]) continue;
4824
4825                         /* Count windows displaying inven */
4826                         if (window_flag[j] & (PW_INVEN)) ni++;
4827
4828                         /* Count windows displaying equip */
4829                         if (window_flag[j] & (PW_EQUIP)) ne++;
4830                 }
4831
4832                 /* Toggle if needed */
4833                 if ((command_wrk == (USE_EQUIP) && ni && !ne) ||
4834                     (command_wrk == (USE_INVEN) && !ni && ne))
4835                 {
4836                         /* Toggle */
4837                         toggle_inven_equip();
4838
4839                         /* Track toggles */
4840                         toggle = !toggle;
4841                 }
4842
4843                 /* Update */
4844                 p_ptr->window |= (PW_INVEN | PW_EQUIP);
4845
4846                 /* Redraw windows */
4847                 window_stuff();
4848
4849                 /* Inventory screen */
4850                 if (command_wrk == (USE_INVEN))
4851                 {
4852                         /* Extract the legal requests */
4853                         n1 = I2A(i1);
4854                         n2 = I2A(i2);
4855
4856                         /* Redraw if needed */
4857                         if (command_see) get_item_label = show_inven(menu_line);
4858                 }
4859
4860                 /* Equipment screen */
4861                 else if (command_wrk == (USE_EQUIP))
4862                 {
4863                         /* Extract the legal requests */
4864                         n1 = I2A(e1 - INVEN_RARM);
4865                         n2 = I2A(e2 - INVEN_RARM);
4866
4867                         /* Redraw if needed */
4868                         if (command_see) get_item_label = show_equip(menu_line);
4869                 }
4870
4871                 /* Floor screen */
4872                 else if (command_wrk == (USE_FLOOR))
4873                 {
4874                         j = floor_top;
4875                         k = MIN(floor_top + 23, floor_num) - 1;
4876
4877                         /* Extract the legal requests */
4878                         n1 = I2A(j - floor_top);
4879                         n2 = I2A(k - floor_top);
4880
4881                         /* Redraw if needed */
4882                         if (command_see) get_item_label = show_floor(menu_line, py, px, &min_width);
4883                 }
4884
4885                 /* Viewing inventory */
4886                 if (command_wrk == (USE_INVEN))
4887                 {
4888                         /* Begin the prompt */
4889 #ifdef JP
4890                         sprintf(out_val, "持ち物:");
4891 #else
4892                         sprintf(out_val, "Inven:");
4893 #endif
4894
4895                         if (!use_menu)
4896                         {
4897                                 /* Build the prompt */
4898 #ifdef JP
4899                                 sprintf(tmp_val, "%c-%c,'(',')',",
4900 #else
4901                                 sprintf(tmp_val, " %c-%c,'(',')',",
4902 #endif
4903                                         index_to_label(i1), index_to_label(i2));
4904
4905                                 /* Append */
4906                                 strcat(out_val, tmp_val);
4907                         }
4908
4909                         /* Indicate ability to "view" */
4910 #ifdef JP
4911                         if (!command_see && !use_menu) strcat(out_val, " '*'一覧,");
4912 #else
4913                         if (!command_see && !use_menu) strcat(out_val, " * to see,");
4914 #endif
4915
4916                         /* Append */
4917                         if (allow_equip)
4918                         {
4919 #ifdef JP
4920                                 if (!use_menu)
4921                                         strcat(out_val, " '/' 装備品,");
4922                                 else if (allow_floor)
4923                                         strcat(out_val, " '6' 装備品,");
4924                                 else
4925                                         strcat(out_val, " '4'or'6' 装備品,");
4926 #else
4927                                 if (!use_menu)
4928                                         strcat(out_val, " / for Equip,");
4929                                 else if (allow_floor)
4930                                         strcat(out_val, " 6 for Equip,");
4931                                 else
4932                                         strcat(out_val, " 4 or 6 for Equip,");
4933 #endif
4934                         }
4935
4936                         /* Append */
4937                         if (allow_floor)
4938                         {
4939 #ifdef JP
4940                                 if (!use_menu)
4941                                         strcat(out_val, " '-'床上,");
4942                                 else if (allow_equip)
4943                                         strcat(out_val, " '4' 床上,");
4944                                 else
4945                                         strcat(out_val, " '4'or'6' 床上,");
4946 #else
4947                                 if (!use_menu)
4948                                         strcat(out_val, " - for floor,");
4949                                 else if (allow_equip)
4950                                         strcat(out_val, " 4 for floor,");
4951                                 else
4952                                         strcat(out_val, " 4 or 6 for floor,");
4953 #endif
4954                         }
4955                 }
4956
4957                 /* Viewing equipment */
4958                 else if (command_wrk == (USE_EQUIP))
4959                 {
4960                         /* Begin the prompt */
4961 #ifdef JP
4962                         sprintf(out_val, "装備品:");
4963 #else
4964                         sprintf(out_val, "Equip:");
4965 #endif
4966
4967                         if (!use_menu)
4968                         {
4969                                 /* Build the prompt */
4970 #ifdef JP
4971                                 sprintf(tmp_val, "%c-%c,'(',')',",
4972 #else
4973                                 sprintf(tmp_val, " %c-%c,'(',')',",
4974 #endif
4975                                         index_to_label(e1), index_to_label(e2));
4976
4977                                 /* Append */
4978                                 strcat(out_val, tmp_val);
4979                         }
4980
4981                         /* Indicate ability to "view" */
4982 #ifdef JP
4983                         if (!command_see && !use_menu) strcat(out_val, " '*'一覧,");
4984 #else
4985                         if (!command_see && !use_menu) strcat(out_val, " * to see,");
4986 #endif
4987
4988                         /* Append */
4989                         if (allow_inven)
4990                         {
4991 #ifdef JP
4992                                 if (!use_menu)
4993                                         strcat(out_val, " '/' 持ち物,");
4994                                 else if (allow_floor)
4995                                         strcat(out_val, " '4' 持ち物,");
4996                                 else
4997                                         strcat(out_val, " '4'or'6' 持ち物,");
4998 #else
4999                                 if (!use_menu)
5000                                         strcat(out_val, " / for Inven,");
5001                                 else if (allow_floor)
5002                                         strcat(out_val, " 4 for Inven,");
5003                                 else
5004                                         strcat(out_val, " 4 or 6 for Inven,");
5005 #endif
5006                         }
5007
5008                         /* Append */
5009                         if (allow_floor)
5010                         {
5011 #ifdef JP
5012                                 if (!use_menu)
5013                                         strcat(out_val, " '-'床上,");
5014                                 else if (allow_inven)
5015                                         strcat(out_val, " '6' 床上,");
5016                                 else
5017                                         strcat(out_val, " '4'or'6' 床上,");
5018 #else
5019                                 if (!use_menu)
5020                                         strcat(out_val, " - for floor,");
5021                                 else if (allow_inven)
5022                                         strcat(out_val, " 6 for floor,");
5023                                 else
5024                                         strcat(out_val, " 4 or 6 for floor,");
5025 #endif
5026                         }
5027                 }
5028
5029                 /* Viewing floor */
5030                 else if (command_wrk == (USE_FLOOR))
5031                 {
5032                         /* Begin the prompt */
5033 #ifdef JP
5034                         sprintf(out_val, "床上:");
5035 #else
5036                         sprintf(out_val, "Floor:");
5037 #endif
5038
5039                         if (!use_menu)
5040                         {
5041                                 /* Build the prompt */
5042 #ifdef JP
5043                                 sprintf(tmp_val, "%c-%c,'(',')',", n1, n2);
5044 #else
5045                                 sprintf(tmp_val, " %c-%c,'(',')',", n1, n2);
5046 #endif
5047
5048                                 /* Append */
5049                                 strcat(out_val, tmp_val);
5050                         }
5051
5052                         /* Indicate ability to "view" */
5053 #ifdef JP
5054                         if (!command_see && !use_menu) strcat(out_val, " '*'一覧,");
5055 #else
5056                         if (!command_see && !use_menu) strcat(out_val, " * to see,");
5057 #endif
5058
5059                         if (use_menu)
5060                         {
5061                                 if (allow_inven && allow_equip)
5062                                 {
5063 #ifdef JP
5064                                         strcat(out_val, " '4' 装備品, '6' 持ち物,");
5065 #else
5066                                         strcat(out_val, " 4 for Equip, 6 for Inven,");
5067 #endif
5068                                 }
5069                                 else if (allow_inven)
5070                                 {
5071 #ifdef JP
5072                                         strcat(out_val, " '4'or'6' 持ち物,");
5073 #else
5074                                         strcat(out_val, " 4 or 6 for Inven,");
5075 #endif
5076                                 }
5077                                 else if (allow_equip)
5078                                 {
5079 #ifdef JP
5080                                         strcat(out_val, " '4'or'6' 装備品,");
5081 #else
5082                                         strcat(out_val, " 4 or 6 for Equip,");
5083 #endif
5084                                 }
5085                         }
5086                         /* Append */
5087                         else if (allow_inven)
5088                         {
5089 #ifdef JP
5090                                 strcat(out_val, " '/' 持ち物,");
5091 #else
5092                                 strcat(out_val, " / for Inven,");
5093 #endif
5094                         }
5095                         else if (allow_equip)
5096                         {
5097 #ifdef JP
5098                                 strcat(out_val, " '/'装備品,");
5099 #else
5100                                 strcat(out_val, " / for Equip,");
5101 #endif
5102                         }
5103
5104                         /* Append */
5105                         if (command_see && !use_menu)
5106                         {
5107 #ifdef JP
5108                                 strcat(out_val, " Enter 次,");
5109 #else
5110                                 strcat(out_val, " Enter for scroll down,");
5111 #endif
5112                         }
5113                 }
5114
5115                 /* Append */
5116 #ifdef JP
5117                 if (select_the_force) strcat(out_val, " 'w'練気術,");
5118 #else
5119                 if (select_the_force) strcat(out_val, " w for the Force,");
5120 #endif
5121
5122                 /* Finish the prompt */
5123                 strcat(out_val, " ESC");
5124
5125                 /* Build the prompt */
5126                 sprintf(tmp_val, "(%s) %s", out_val, pmt);
5127
5128                 /* Show the prompt */
5129                 prt(tmp_val, 0, 0);
5130
5131                 /* Get a key */
5132                 which = inkey();
5133
5134                 if (use_menu)
5135                 {
5136                 int max_line = 1;
5137                 if (command_wrk == USE_INVEN) max_line = max_inven;
5138                 else if (command_wrk == USE_EQUIP) max_line = max_equip;
5139                 else if (command_wrk == USE_FLOOR) max_line = MIN(23, floor_num);
5140                 switch (which)
5141                 {
5142                         case ESCAPE:
5143                         case 'z':
5144                         case 'Z':
5145                         case '0':
5146                         {
5147                                 done = TRUE;
5148                                 break;
5149                         }
5150
5151                         case '8':
5152                         case 'k':
5153                         case 'K':
5154                         {
5155                                 menu_line += (max_line - 1);
5156                                 break;
5157                         }
5158
5159                         case '2':
5160                         case 'j':
5161                         case 'J':
5162                         {
5163                                 menu_line++;
5164                                 break;
5165                         }
5166
5167                         case '4':
5168                         case 'h':
5169                         case 'H':
5170                         {
5171                                 /* Verify legality */
5172                                 if (command_wrk == (USE_INVEN))
5173                                 {
5174                                         if (allow_floor) command_wrk = USE_FLOOR;
5175                                         else if (allow_equip) command_wrk = USE_EQUIP;
5176                                         else
5177                                         {
5178                                                 bell();
5179                                                 break;
5180                                         }
5181                                 }
5182                                 else if (command_wrk == (USE_EQUIP))
5183                                 {
5184                                         if (allow_inven) command_wrk = USE_INVEN;
5185                                         else if (allow_floor) command_wrk = USE_FLOOR;
5186                                         else
5187                                         {
5188                                                 bell();
5189                                                 break;
5190                                         }
5191                                 }
5192                                 else if (command_wrk == (USE_FLOOR))
5193                                 {
5194                                         if (allow_equip) command_wrk = USE_EQUIP;
5195                                         else if (allow_inven) command_wrk = USE_INVEN;
5196                                         else
5197                                         {
5198                                                 bell();
5199                                                 break;
5200                                         }
5201                                 }
5202                                 else
5203                                 {
5204                                         bell();
5205                                         break;
5206                                 }
5207
5208                                 /* Hack -- Fix screen */
5209                                 if (command_see)
5210                                 {
5211                                         /* Load screen */
5212                                         screen_load();
5213
5214                                         /* Save screen */
5215                                         screen_save();
5216                                 }
5217
5218                                 /* Switch inven/equip */
5219                                 if (command_wrk == USE_INVEN) max_line = max_inven;
5220                                 else if (command_wrk == USE_EQUIP) max_line = max_equip;
5221                                 else if (command_wrk == USE_FLOOR) max_line = MIN(23, floor_num);
5222                                 if (menu_line > max_line) menu_line = max_line;
5223
5224                                 /* Need to redraw */
5225                                 break;
5226                         }
5227
5228                         case '6':
5229                         case 'l':
5230                         case 'L':
5231                         {
5232                                 /* Verify legality */
5233                                 if (command_wrk == (USE_INVEN))
5234                                 {
5235                                         if (allow_equip) command_wrk = USE_EQUIP;
5236                                         else if (allow_floor) command_wrk = USE_FLOOR;
5237                                         else
5238                                         {
5239                                                 bell();
5240                                                 break;
5241                                         }
5242                                 }
5243                                 else if (command_wrk == (USE_EQUIP))
5244                                 {
5245                                         if (allow_floor) command_wrk = USE_FLOOR;
5246                                         else if (allow_inven) command_wrk = USE_INVEN;
5247                                         else
5248                                         {
5249                                                 bell();
5250                                                 break;
5251                                         }
5252                                 }
5253                                 else if (command_wrk == (USE_FLOOR))
5254                                 {
5255                                         if (allow_inven) command_wrk = USE_INVEN;
5256                                         else if (allow_equip) command_wrk = USE_EQUIP;
5257                                         else
5258                                         {
5259                                                 bell();
5260                                                 break;
5261                                         }
5262                                 }
5263                                 else
5264                                 {
5265                                         bell();
5266                                         break;
5267                                 }
5268
5269                                 /* Hack -- Fix screen */
5270                                 if (command_see)
5271                                 {
5272                                         /* Load screen */
5273                                         screen_load();
5274
5275                                         /* Save screen */
5276                                         screen_save();
5277                                 }
5278
5279                                 /* Switch inven/equip */
5280                                 if (command_wrk == USE_INVEN) max_line = max_inven;
5281                                 else if (command_wrk == USE_EQUIP) max_line = max_equip;
5282                                 else if (command_wrk == USE_FLOOR) max_line = MIN(23, floor_num);
5283                                 if (menu_line > max_line) menu_line = max_line;
5284
5285                                 /* Need to redraw */
5286                                 break;
5287                         }
5288
5289                         case 'x':
5290                         case 'X':
5291                         case '\r':
5292                         case '\n':
5293                         {
5294                                 if (command_wrk == USE_FLOOR)
5295                                 {
5296                                         /* Special index */
5297                                         (*cp) = -get_item_label;
5298                                 }
5299                                 else
5300                                 {
5301                                         /* Validate the item */
5302                                         if (!get_item_okay(get_item_label))
5303                                         {
5304                                                 bell();
5305                                                 break;
5306                                         }
5307
5308                                         /* Allow player to "refuse" certain actions */
5309                                         if (!get_item_allow(get_item_label))
5310                                         {
5311                                                 done = TRUE;
5312                                                 break;
5313                                         }
5314
5315                                         /* Accept that choice */
5316                                         (*cp) = get_item_label;
5317                                 }
5318
5319                                 item = TRUE;
5320                                 done = TRUE;
5321                                 break;
5322                         }
5323                         case 'w':
5324                         {
5325                                 if (select_the_force) {
5326                                         *cp = INVEN_FORCE;
5327                                         item = TRUE;
5328                                         done = TRUE;
5329                                         break;
5330                                 }
5331                         }
5332                 }
5333                 if (menu_line > max_line) menu_line -= max_line;
5334                 }
5335                 else
5336                 {
5337                 /* Parse it */
5338                 switch (which)
5339                 {
5340                         case ESCAPE:
5341                         {
5342                                 done = TRUE;
5343                                 break;
5344                         }
5345
5346                         case '*':
5347                         case '?':
5348                         case ' ':
5349                         {
5350                                 /* Hide the list */
5351                                 if (command_see)
5352                                 {
5353                                         /* Flip flag */
5354                                         command_see = FALSE;
5355
5356                                         /* Load screen */
5357                                         screen_load();
5358                                 }
5359
5360                                 /* Show the list */
5361                                 else
5362                                 {
5363                                         /* Save screen */
5364                                         screen_save();
5365
5366                                         /* Flip flag */
5367                                         command_see = TRUE;
5368                                 }
5369                                 break;
5370                         }
5371
5372                         case '\n':
5373                         case '\r':
5374                         case '+':
5375                         {
5376                                 int i, o_idx;
5377                                 cave_type *c_ptr = &cave[py][px];
5378
5379                                 if (command_wrk != (USE_FLOOR)) break;
5380
5381                                 /* Get the object being moved. */
5382                                 o_idx = c_ptr->o_idx;
5383
5384                                 /* Only rotate a pile of two or more objects. */
5385                                 if (!(o_idx && o_list[o_idx].next_o_idx)) break;
5386
5387                                 /* Remove the first object from the list. */
5388                                 excise_object_idx(o_idx);
5389
5390                                 /* Find end of the list. */
5391                                 i = c_ptr->o_idx;
5392                                 while (o_list[i].next_o_idx)
5393                                         i = o_list[i].next_o_idx;
5394
5395                                 /* Add after the last object. */
5396                                 o_list[i].next_o_idx = o_idx;
5397
5398                                 /* Re-scan floor list */ 
5399                                 floor_num = scan_floor(floor_list, py, px, 0x03);
5400
5401                                 /* Hack -- Fix screen */
5402                                 if (command_see)
5403                                 {
5404                                         /* Load screen */
5405                                         screen_load();
5406
5407                                         /* Save screen */
5408                                         screen_save();
5409                                 }
5410
5411                                 break;
5412                         }
5413
5414                         case '/':
5415                         {
5416                                 if (command_wrk == (USE_INVEN))
5417                                 {
5418                                         if (!allow_equip)
5419                                         {
5420                                                 bell();
5421                                                 break;
5422                                         }
5423                                         command_wrk = (USE_EQUIP);
5424                                 }
5425                                 else if (command_wrk == (USE_EQUIP))
5426                                 {
5427                                         if (!allow_inven)
5428                                         {
5429                                                 bell();
5430                                                 break;
5431                                         }
5432                                         command_wrk = (USE_INVEN);
5433                                 }
5434                                 else if (command_wrk == (USE_FLOOR))
5435                                 {
5436                                         if (allow_inven)
5437                                         {
5438                                                 command_wrk = (USE_INVEN);
5439                                         }
5440                                         else if (allow_equip)
5441                                         {
5442                                                 command_wrk = (USE_EQUIP);
5443                                         }
5444                                         else
5445                                         {
5446                                                 bell();
5447                                                 break;
5448                                         }
5449                                 }
5450
5451                                 /* Hack -- Fix screen */
5452                                 if (command_see)
5453                                 {
5454                                         /* Load screen */
5455                                         screen_load();
5456
5457                                         /* Save screen */
5458                                         screen_save();
5459                                 }
5460
5461                                 /* Need to redraw */
5462                                 break;
5463                         }
5464
5465                         case '-':
5466                         {
5467                                 if (!allow_floor)
5468                                 {
5469                                         bell();
5470                                         break;
5471                                 }
5472
5473                                 /*
5474                                  * If we are already examining the floor, and there
5475                                  * is only one item, we will always select it.
5476                                  * If we aren't examining the floor and there is only
5477                                  * one item, we will select it if floor_query_flag
5478                                  * is FALSE.
5479                                  */
5480                                 if (floor_num == 1)
5481                                 {
5482                                         if ((command_wrk == (USE_FLOOR)) || (!carry_query_flag))
5483                                         {
5484                                                 /* Special index */
5485                                                 k = 0 - floor_list[0];
5486
5487                                                 /* Allow player to "refuse" certain actions */
5488                                                 if (!get_item_allow(k))
5489                                                 {
5490                                                         done = TRUE;
5491                                                         break;
5492                                                 }
5493
5494                                                 /* Accept that choice */
5495                                                 (*cp) = k;
5496                                                 item = TRUE;
5497                                                 done = TRUE;
5498
5499                                                 break;
5500                                         }
5501                                 }
5502
5503                                 /* Hack -- Fix screen */
5504                                 if (command_see)
5505                                 {
5506                                         /* Load screen */
5507                                         screen_load();
5508
5509                                         /* Save screen */
5510                                         screen_save();
5511                                 }
5512
5513                                 command_wrk = (USE_FLOOR);
5514
5515                                 break;
5516                         }
5517
5518                         case '0':
5519                         case '1': case '2': case '3':
5520                         case '4': case '5': case '6':
5521                         case '7': case '8': case '9':
5522                         {
5523                                 if (command_wrk != USE_FLOOR)
5524                                 {
5525                                         /* Look up the tag */
5526                                         if (!get_tag(&k, which, command_wrk))
5527                                         {
5528                                                 bell();
5529                                                 break;
5530                                         }
5531
5532                                         /* Hack -- Validate the item */
5533                                         if ((k < INVEN_RARM) ? !inven : !equip)
5534                                         {
5535                                                 bell();
5536                                                 break;
5537                                         }
5538
5539                                         /* Validate the item */
5540                                         if (!get_item_okay(k))
5541                                         {
5542                                                 bell();
5543                                                 break;
5544                                         }
5545                                 }
5546                                 else
5547                                 {
5548                                         /* Look up the alphabetical tag */
5549                                         if (get_tag_floor(&k, which, floor_list, floor_num))
5550                                         {
5551                                                 /* Special index */
5552                                                 k = 0 - floor_list[k];
5553                                         }
5554                                         else
5555                                         {
5556                                                 bell();
5557                                                 break;
5558                                         }
5559                                 }
5560
5561                                 /* Allow player to "refuse" certain actions */
5562                                 if (!get_item_allow(k))
5563                                 {
5564                                         done = TRUE;
5565                                         break;
5566                                 }
5567
5568                                 /* Accept that choice */
5569                                 (*cp) = k;
5570                                 item = TRUE;
5571                                 done = TRUE;
5572 #ifdef ALLOW_REPEAT
5573                                 cur_tag = which;
5574 #endif /* ALLOW_REPEAT */
5575                                 break;
5576                         }
5577
5578 #if 0
5579                         case '\n':
5580                         case '\r':
5581                         {
5582                                 /* Choose "default" inventory item */
5583                                 if (command_wrk == (USE_INVEN))
5584                                 {
5585                                         k = ((i1 == i2) ? i1 : -1);
5586                                 }
5587
5588                                 /* Choose "default" equipment item */
5589                                 else if (command_wrk == (USE_EQUIP))
5590                                 {
5591                                         k = ((e1 == e2) ? e1 : -1);
5592                                 }
5593
5594                                 /* Choose "default" floor item */
5595                                 else if (command_wrk == (USE_FLOOR))
5596                                 {
5597                                         if (floor_num == 1)
5598                                         {
5599                                                 /* Special index */
5600                                                 k = 0 - floor_list[0];
5601
5602                                                 /* Allow player to "refuse" certain actions */
5603                                                 if (!get_item_allow(k))
5604                                                 {
5605                                                         done = TRUE;
5606                                                         break;
5607                                                 }
5608
5609                                                 /* Accept that choice */
5610                                                 (*cp) = k;
5611                                                 item = TRUE;
5612                                                 done = TRUE;
5613                                         }
5614                                         break;
5615                                 }
5616
5617                                 /* Validate the item */
5618                                 if (!get_item_okay(k))
5619                                 {
5620                                         bell();
5621                                         break;
5622                                 }
5623
5624                                 /* Allow player to "refuse" certain actions */
5625                                 if (!get_item_allow(k))
5626                                 {
5627                                         done = TRUE;
5628                                         break;
5629                                 }
5630
5631                                 /* Accept that choice */
5632                                 (*cp) = k;
5633                                 item = TRUE;
5634                                 done = TRUE;
5635                                 break;
5636                         }
5637 #endif
5638
5639                         case 'w':
5640                         {
5641                                 if (select_the_force) {
5642                                         *cp = INVEN_FORCE;
5643                                         item = TRUE;
5644                                         done = TRUE;
5645                                         break;
5646                                 }
5647
5648                                 /* Fall through */
5649                         }
5650
5651                         default:
5652                         {
5653                                 int ver;
5654
5655                                 if (command_wrk != USE_FLOOR)
5656                                 {
5657                                         bool not_found = FALSE;
5658
5659                                         /* Look up the alphabetical tag */
5660                                         if (!get_tag(&k, which, command_wrk))
5661                                         {
5662                                                 not_found = TRUE;
5663                                         }
5664
5665                                         /* Hack -- Validate the item */
5666                                         else if ((k < INVEN_RARM) ? !inven : !equip)
5667                                         {
5668                                                 not_found = TRUE;
5669                                         }
5670
5671                                         /* Validate the item */
5672                                         else if (!get_item_okay(k))
5673                                         {
5674                                                 not_found = TRUE;
5675                                         }
5676
5677                                         if (!not_found)
5678                                         {
5679                                                 /* Accept that choice */
5680                                                 (*cp) = k;
5681                                                 item = TRUE;
5682                                                 done = TRUE;
5683 #ifdef ALLOW_REPEAT
5684                                                 cur_tag = which;
5685 #endif /* ALLOW_REPEAT */
5686                                                 break;
5687                                         }
5688                                 }
5689                                 else
5690                                 {
5691                                         /* Look up the alphabetical tag */
5692                                         if (get_tag_floor(&k, which, floor_list, floor_num))
5693                                         {
5694                                                 /* Special index */
5695                                                 k = 0 - floor_list[k];
5696
5697                                                 /* Accept that choice */
5698                                                 (*cp) = k;
5699                                                 item = TRUE;
5700                                                 done = TRUE;
5701 #ifdef ALLOW_REPEAT
5702                                                 cur_tag = which;
5703 #endif /* ALLOW_REPEAT */
5704                                                 break;
5705                                         }
5706                                 }
5707
5708                                 /* Extract "query" setting */
5709                                 ver = isupper(which);
5710                                 which = tolower(which);
5711
5712                                 /* Convert letter to inventory index */
5713                                 if (command_wrk == (USE_INVEN))
5714                                 {
5715                                         if (which == '(') k = i1;
5716                                         else if (which == ')') k = i2;
5717                                         else k = label_to_inven(which);
5718                                 }
5719
5720                                 /* Convert letter to equipment index */
5721                                 else if (command_wrk == (USE_EQUIP))
5722                                 {
5723                                         if (which == '(') k = e1;
5724                                         else if (which == ')') k = e2;
5725                                         else k = label_to_equip(which);
5726                                 }
5727
5728                                 /* Convert letter to floor index */
5729                                 else if (command_wrk == USE_FLOOR)
5730                                 {
5731                                         if (which == '(') k = 0;
5732                                         else if (which == ')') k = floor_num - 1;
5733                                         else k = islower(which) ? A2I(which) : -1;
5734                                         if (k < 0 || k >= floor_num || k >= 23)
5735                                         {
5736                                                 bell();
5737                                                 break;
5738                                         }
5739
5740                                         /* Special index */
5741                                         k = 0 - floor_list[k];
5742                                 }
5743
5744                                 /* Validate the item */
5745                                 if ((command_wrk != USE_FLOOR) && !get_item_okay(k))
5746                                 {
5747                                         bell();
5748                                         break;
5749                                 }
5750
5751                                 /* Verify the item */
5752 #ifdef JP
5753 if (ver && !verify("本当に", k))
5754 #else
5755                                 if (ver && !verify("Try", k))
5756 #endif
5757
5758                                 {
5759                                         done = TRUE;
5760                                         break;
5761                                 }
5762
5763                                 /* Allow player to "refuse" certain actions */
5764                                 if (!get_item_allow(k))
5765                                 {
5766                                         done = TRUE;
5767                                         break;
5768                                 }
5769
5770                                 /* Accept that choice */
5771                                 (*cp) = k;
5772                                 item = TRUE;
5773                                 done = TRUE;
5774                                 break;
5775                         }
5776                 }
5777                 }
5778         }
5779
5780         /* Fix the screen if necessary */
5781         if (command_see)
5782         {
5783                 /* Load screen */
5784                 screen_load();
5785
5786                 /* Hack -- Cancel "display" */
5787                 command_see = FALSE;
5788         }
5789
5790
5791         /* Forget the item_tester_tval restriction */
5792         item_tester_tval = 0;
5793
5794         /* Forget the item_tester_hook restriction */
5795         item_tester_hook = NULL;
5796
5797
5798         /* Clean up  'show choices' */
5799         /* Toggle again if needed */
5800         if (toggle) toggle_inven_equip();
5801
5802         /* Update */
5803         p_ptr->window |= (PW_INVEN | PW_EQUIP);
5804
5805         /* Window stuff */
5806         window_stuff();
5807
5808
5809         /* Clear the prompt line */
5810         prt("", 0, 0);
5811
5812         /* Warning if needed */
5813         if (oops && str) msg_print(str);
5814
5815         if (item)
5816         {
5817 #ifdef ALLOW_REPEAT
5818                 repeat_push(*cp);
5819                 if (command_cmd) prev_tag = cur_tag;
5820 #endif /* ALLOW_REPEAT */
5821
5822                 command_cmd = 0; /* Hack -- command_cmd is no longer effective */
5823         }
5824
5825         /* Result */
5826         return (item);
5827 }
5828
5829 /*!
5830  * @brief 床上のアイテムを拾う選択用サブルーチン 
5831  * @return プレイヤーによりアイテムが選択されたならTRUEを返す。
5832  */
5833 static bool py_pickup_floor_aux(void)
5834 {
5835         s16b this_o_idx;
5836
5837         cptr q, s;
5838
5839         int item;
5840
5841         /* Restrict the choices */
5842         item_tester_hook = inven_carry_okay;
5843
5844         /* Get an object */
5845 #ifdef JP
5846         q = "どれを拾いますか?";
5847         s = "もうザックには床にあるどのアイテムも入らない。";
5848 #else
5849         q = "Get which item? ";
5850         s = "You no longer have any room for the objects on the floor.";
5851 #endif
5852
5853         if (get_item(&item, q, s, (USE_FLOOR)))
5854         {
5855                 this_o_idx = 0 - item;
5856         }
5857         else
5858         {
5859                 return (FALSE);
5860         }
5861
5862         /* Pick up the object */
5863         py_pickup_aux(this_o_idx);
5864
5865         return (TRUE);
5866 }
5867
5868 /*!
5869  * @brief 床上のアイテムを拾うメイン処理
5870  * @param pickup FALSEなら金銭の自動拾いのみを行う/ FALSE then only gold will be picked up
5871  * @return なし
5872  * @details
5873  * This is called by py_pickup() when easy_floor is TRUE.
5874  */
5875 void py_pickup_floor(bool pickup)
5876 {
5877         s16b this_o_idx, next_o_idx = 0;
5878
5879         char o_name[MAX_NLEN];
5880         object_type *o_ptr;
5881
5882         int floor_num = 0, floor_o_idx = 0;
5883
5884         int can_pickup = 0;
5885
5886         /* Scan the pile of objects */
5887         for (this_o_idx = cave[py][px].o_idx; this_o_idx; this_o_idx = next_o_idx)
5888         {
5889                 object_type *o_ptr;
5890
5891                 /* Access the object */
5892                 o_ptr = &o_list[this_o_idx];
5893
5894                 /* Describe the object */
5895                 object_desc(o_name, o_ptr, 0);
5896
5897                 /* Access the next object */
5898                 next_o_idx = o_ptr->next_o_idx;
5899
5900                 /* Hack -- disturb */
5901                 disturb(0, 0);
5902
5903                 /* Pick up gold */
5904                 if (o_ptr->tval == TV_GOLD)
5905                 {
5906                         /* Message */
5907 #ifdef JP
5908                 msg_format(" $%ld の価値がある%sを見つけた。",
5909                            (long)o_ptr->pval, o_name);
5910 #else
5911                         msg_format("You have found %ld gold pieces worth of %s.",
5912                                 (long) o_ptr->pval, o_name);
5913 #endif
5914
5915
5916                         /* Collect the gold */
5917                         p_ptr->au += o_ptr->pval;
5918
5919                         /* Redraw gold */
5920                         p_ptr->redraw |= (PR_GOLD);
5921
5922                         /* Window stuff */
5923                         p_ptr->window |= (PW_PLAYER);
5924
5925                         /* Delete the gold */
5926                         delete_object_idx(this_o_idx);
5927
5928                         /* Check the next object */
5929                         continue;
5930                 }
5931                 else if (o_ptr->marked & OM_NOMSG)
5932                 {
5933                         /* If 0 or 1 non-NOMSG items are in the pile, the NOMSG ones are
5934                          * ignored. Otherwise, they are included in the prompt. */
5935                         o_ptr->marked &= ~(OM_NOMSG);
5936                         continue;
5937                 }
5938
5939                 /* Count non-gold objects that can be picked up. */
5940                 if (inven_carry_okay(o_ptr))
5941                 {
5942                         can_pickup++;
5943                 }
5944
5945                 /* Count non-gold objects */
5946                 floor_num++;
5947
5948                 /* Remember this index */
5949                 floor_o_idx = this_o_idx;
5950         }
5951
5952         /* There are no non-gold objects */
5953         if (!floor_num)
5954                 return;
5955
5956         /* Mention the number of objects */
5957         if (!pickup)
5958         {
5959                 /* One object */
5960                 if (floor_num == 1)
5961                 {
5962                         /* Access the object */
5963                         o_ptr = &o_list[floor_o_idx];
5964
5965 #ifdef ALLOW_EASY_SENSE
5966
5967                         /* Option: Make object sensing easy */
5968                         if (easy_sense)
5969                         {
5970                                 /* Sense the object */
5971                                 (void) sense_object(o_ptr);
5972                         }
5973
5974 #endif /* ALLOW_EASY_SENSE */
5975
5976                         /* Describe the object */
5977                         object_desc(o_name, o_ptr, 0);
5978
5979                         /* Message */
5980 #ifdef JP
5981                                 msg_format("%sがある。", o_name);
5982 #else
5983                         msg_format("You see %s.", o_name);
5984 #endif
5985
5986                 }
5987
5988                 /* Multiple objects */
5989                 else
5990                 {
5991                         /* Message */
5992 #ifdef JP
5993                         msg_format("%d 個のアイテムの山がある。", floor_num);
5994 #else
5995                         msg_format("You see a pile of %d items.", floor_num);
5996 #endif
5997
5998                 }
5999
6000                 /* Done */
6001                 return;
6002         }
6003
6004         /* The player has no room for anything on the floor. */
6005         if (!can_pickup)
6006         {
6007                 /* One object */
6008                 if (floor_num == 1)
6009                 {
6010                         /* Access the object */
6011                         o_ptr = &o_list[floor_o_idx];
6012
6013 #ifdef ALLOW_EASY_SENSE
6014
6015                         /* Option: Make object sensing easy */
6016                         if (easy_sense)
6017                         {
6018                                 /* Sense the object */
6019                                 (void) sense_object(o_ptr);
6020                         }
6021
6022 #endif /* ALLOW_EASY_SENSE */
6023
6024                         /* Describe the object */
6025                         object_desc(o_name, o_ptr, 0);
6026
6027                         /* Message */
6028 #ifdef JP
6029                                 msg_format("ザックには%sを入れる隙間がない。", o_name);
6030 #else
6031                         msg_format("You have no room for %s.", o_name);
6032 #endif
6033
6034                 }
6035
6036                 /* Multiple objects */
6037                 else
6038                 {
6039                         /* Message */
6040 #ifdef JP
6041                         msg_format("ザックには床にあるどのアイテムも入らない。", o_name);
6042 #else
6043                         msg_print("You have no room for any of the objects on the floor.");
6044 #endif
6045
6046                 }
6047
6048                 /* Done */
6049                 return;
6050         }
6051
6052         /* One object */
6053         if (floor_num == 1)
6054         {
6055                 /* Hack -- query every object */
6056                 if (carry_query_flag)
6057                 {
6058                         char out_val[MAX_NLEN+20];
6059
6060                         /* Access the object */
6061                         o_ptr = &o_list[floor_o_idx];
6062
6063 #ifdef ALLOW_EASY_SENSE
6064
6065                         /* Option: Make object sensing easy */
6066                         if (easy_sense)
6067                         {
6068                                 /* Sense the object */
6069                                 (void) sense_object(o_ptr);
6070                         }
6071
6072 #endif /* ALLOW_EASY_SENSE */
6073
6074                         /* Describe the object */
6075                         object_desc(o_name, o_ptr, 0);
6076
6077                         /* Build a prompt */
6078 #ifdef JP
6079                         (void) sprintf(out_val, "%sを拾いますか? ", o_name);
6080 #else
6081                         (void) sprintf(out_val, "Pick up %s? ", o_name);
6082 #endif
6083
6084
6085                         /* Ask the user to confirm */
6086                         if (!get_check(out_val))
6087                         {
6088                                 /* Done */
6089                                 return;
6090                         }
6091                 }
6092
6093                 /* Access the object */
6094                 o_ptr = &o_list[floor_o_idx];
6095
6096 #ifdef ALLOW_EASY_SENSE
6097
6098                 /* Option: Make object sensing easy */
6099                 if (easy_sense)
6100                 {
6101                         /* Sense the object */
6102                         (void) sense_object(o_ptr);
6103                 }
6104
6105 #endif /* ALLOW_EASY_SENSE */
6106
6107                 /* Pick up the object */
6108                 py_pickup_aux(floor_o_idx);
6109         }
6110
6111         /* Allow the user to choose an object */
6112         else
6113         {
6114                 while (can_pickup--)
6115                 {
6116                         if (!py_pickup_floor_aux()) break;
6117                 }
6118         }
6119 }
6120
6121 #endif /* ALLOW_EASY_FLOOR */