OSDN Git Service

a2cf9d83e4c1aa86fba7cecd9fb731fc8e1c88ff
[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, _("¤½¤ì¤ÏdzÎÁÊäµë¤Ë¤è¤Ã¤ÆÌÀ¤«¤ê(Ⱦ·Â %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_LIFE))
1255         {
1256 #ifdef JP
1257 info[i++] = "¤½¤ì¤ÏÀ¸Ì¿Îϵۼý¤ËÂФ¹¤ëÂÑÀ­¤ò¼ø¤±¤ë¡£";
1258 #else
1259                 info[i++] = "It provides resistance to life 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++] = "¤½¤ì¤ÏºÇÂç¤Ç£³¤Ä¤Þ¤Ç¤ÎÄãµé¤Ê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 tval ¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤Îtval
2288  * @param 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  * Find the "first" inventory object with the given "tag".
2550  *
2551  * A "tag" is a numeral "n" appearing as "@n" anywhere in the
2552  * inscription of an object.  Alphabetical characters don't work as a
2553  * tag in this form.
2554  *
2555  * Also, the tag "@xn" will work as well, where "n" is a any tag-char,
2556  * and "x" is the "current" command_cmd code.
2557  */
2558 static bool get_tag(int *cp, char tag, int mode)
2559 {
2560         int i, start, end;
2561         cptr s;
2562
2563         /* Extract index from mode */
2564         switch (mode)
2565         {
2566         case USE_EQUIP:
2567                 start = INVEN_RARM;
2568                 end = INVEN_TOTAL - 1;
2569                 break;
2570
2571         case USE_INVEN:
2572                 start = 0;
2573                 end = INVEN_PACK - 1;
2574                 break;
2575
2576         default:
2577                 return FALSE;
2578         }
2579
2580         /**** Find a tag in the form of {@x#} (allow alphabet tag) ***/
2581
2582         /* Check every inventory object */
2583         for (i = start; i <= end; i++)
2584         {
2585                 object_type *o_ptr = &inventory[i];
2586
2587                 /* Skip non-objects */
2588                 if (!o_ptr->k_idx) continue;
2589
2590                 /* Skip empty inscriptions */
2591                 if (!o_ptr->inscription) continue;
2592
2593                 /* Skip non-choice */
2594                 if (!item_tester_okay(o_ptr)) continue;
2595
2596                 /* Find a '@' */
2597                 s = my_strchr(quark_str(o_ptr->inscription), '@');
2598
2599                 /* Process all tags */
2600                 while (s)
2601                 {
2602                         /* Check the special tags */
2603                         if ((s[1] == command_cmd) && (s[2] == tag))
2604                         {
2605                                 /* Save the actual inventory ID */
2606                                 *cp = i;
2607
2608                                 /* Success */
2609                                 return (TRUE);
2610                         }
2611
2612                         /* Find another '@' */
2613                         s = my_strchr(s + 1, '@');
2614                 }
2615         }
2616
2617
2618         /**** Find a tag in the form of {@#} (allows only numerals)  ***/
2619
2620         /* Don't allow {@#} with '#' being alphabet */
2621         if (tag < '0' || '9' < tag)
2622         {
2623                 /* No such tag */
2624                 return FALSE;
2625         }
2626
2627         /* Check every object */
2628         for (i = start; i <= end; i++)
2629         {
2630                 object_type *o_ptr = &inventory[i];
2631
2632                 /* Skip non-objects */
2633                 if (!o_ptr->k_idx) continue;
2634
2635                 /* Skip empty inscriptions */
2636                 if (!o_ptr->inscription) continue;
2637
2638                 /* Skip non-choice */
2639                 if (!item_tester_okay(o_ptr)) continue;
2640
2641                 /* Find a '@' */
2642                 s = my_strchr(quark_str(o_ptr->inscription), '@');
2643
2644                 /* Process all tags */
2645                 while (s)
2646                 {
2647                         /* Check the normal tags */
2648                         if (s[1] == tag)
2649                         {
2650                                 /* Save the actual inventory ID */
2651                                 *cp = i;
2652
2653                                 /* Success */
2654                                 return (TRUE);
2655                         }
2656
2657                         /* Find another '@' */
2658                         s = my_strchr(s + 1, '@');
2659                 }
2660         }
2661
2662         /* No such tag */
2663         return (FALSE);
2664 }
2665
2666
2667 /*
2668  * Find the "first" floor object with the given "tag".
2669  *
2670  * A "tag" is a numeral "n" appearing as "@n" anywhere in the
2671  * inscription of an object.  Alphabetical characters don't work as a
2672  * tag in this form.
2673  *
2674  * Also, the tag "@xn" will work as well, where "n" is a any tag-char,
2675  * and "x" is the "current" command_cmd code.
2676  */
2677 static bool get_tag_floor(int *cp, char tag, int floor_list[], int floor_num)
2678 {
2679         int i;
2680         cptr s;
2681
2682         /**** Find a tag in the form of {@x#} (allow alphabet tag) ***/
2683
2684         /* Check every object in the grid */
2685         for (i = 0; i < floor_num && i < 23; i++)
2686         {
2687                 object_type *o_ptr = &o_list[floor_list[i]];
2688
2689                 /* Skip empty inscriptions */
2690                 if (!o_ptr->inscription) continue;
2691
2692                 /* Find a '@' */
2693                 s = my_strchr(quark_str(o_ptr->inscription), '@');
2694
2695                 /* Process all tags */
2696                 while (s)
2697                 {
2698                         /* Check the special tags */
2699                         if ((s[1] == command_cmd) && (s[2] == tag))
2700                         {
2701                                 /* Save the actual floor object ID */
2702                                 *cp = i;
2703
2704                                 /* Success */
2705                                 return (TRUE);
2706                         }
2707
2708                         /* Find another '@' */
2709                         s = my_strchr(s + 1, '@');
2710                 }
2711         }
2712
2713
2714         /**** Find a tag in the form of {@#} (allows only numerals)  ***/
2715
2716         /* Don't allow {@#} with '#' being alphabet */
2717         if (tag < '0' || '9' < tag)
2718         {
2719                 /* No such tag */
2720                 return FALSE;
2721         }
2722
2723         /* Check every object in the grid */
2724         for (i = 0; i < floor_num && i < 23; i++)
2725         {
2726                 object_type *o_ptr = &o_list[floor_list[i]];
2727
2728                 /* Skip empty inscriptions */
2729                 if (!o_ptr->inscription) continue;
2730
2731                 /* Find a '@' */
2732                 s = my_strchr(quark_str(o_ptr->inscription), '@');
2733
2734                 /* Process all tags */
2735                 while (s)
2736                 {
2737                         /* Check the normal tags */
2738                         if (s[1] == tag)
2739                         {
2740                                 /* Save the floor object ID */
2741                                 *cp = i;
2742
2743                                 /* Success */
2744                                 return (TRUE);
2745                         }
2746
2747                         /* Find another '@' */
2748                         s = my_strchr(s + 1, '@');
2749                 }
2750         }
2751
2752         /* No such tag */
2753         return (FALSE);
2754 }
2755
2756
2757 /*
2758  * Move around label characters with correspond tags
2759  */
2760 static void prepare_label_string(char *label, int mode)
2761 {
2762         cptr alphabet_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
2763         int  offset = (mode == USE_EQUIP) ? INVEN_RARM : 0;
2764         int  i;
2765
2766         /* Prepare normal labels */
2767         strcpy(label, alphabet_chars);
2768
2769         /* Move each label */
2770         for (i = 0; i < 52; i++)
2771         {
2772                 int index;
2773                 char c = alphabet_chars[i];
2774
2775                 /* Find a tag with this label */
2776                 if (get_tag(&index, c, mode))
2777                 {
2778                         /* Delete the overwritten label */
2779                         if (label[i] == c) label[i] = ' ';
2780
2781                         /* Move the label to the place of corresponding tag */
2782                         label[index - offset] = c;
2783                 }
2784         }
2785 }
2786
2787
2788 /*
2789  * Move around label characters with correspond tags (floor version)
2790  */
2791 static void prepare_label_string_floor(char *label, int floor_list[], int floor_num)
2792 {
2793         cptr alphabet_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
2794         int  i;
2795
2796         /* Prepare normal labels */
2797         strcpy(label, alphabet_chars);
2798
2799         /* Move each label */
2800         for (i = 0; i < 52; i++)
2801         {
2802                 int index;
2803                 char c = alphabet_chars[i];
2804
2805                 /* Find a tag with this label */
2806                 if (get_tag_floor(&index, c, floor_list, floor_num))
2807                 {
2808                         /* Delete the overwritten label */
2809                         if (label[i] == c) label[i] = ' ';
2810
2811                         /* Move the label to the place of corresponding tag */
2812                         label[index] = c;
2813                 }
2814         }
2815 }
2816
2817
2818 /*
2819  * Display the inventory.
2820  *
2821  * Hack -- do not display "trailing" empty slots
2822  */
2823 int show_inven(int target_item)
2824 {
2825         int             i, j, k, l, z = 0;
2826         int             col, cur_col, len;
2827         object_type     *o_ptr;
2828         char            o_name[MAX_NLEN];
2829         char            tmp_val[80];
2830         int             out_index[23];
2831         byte            out_color[23];
2832         char            out_desc[23][MAX_NLEN];
2833         int             target_item_label = 0;
2834         int             wid, hgt;
2835         char            inven_label[52 + 1];
2836
2837         /* Starting column */
2838         col = command_gap;
2839
2840         /* Get size */
2841         Term_get_size(&wid, &hgt);
2842
2843         /* Default "max-length" */
2844         len = wid - col - 1;
2845
2846
2847         /* Find the "final" slot */
2848         for (i = 0; i < INVEN_PACK; i++)
2849         {
2850                 o_ptr = &inventory[i];
2851
2852                 /* Skip non-objects */
2853                 if (!o_ptr->k_idx) continue;
2854
2855                 /* Track */
2856                 z = i + 1;
2857         }
2858
2859         prepare_label_string(inven_label, USE_INVEN);
2860
2861         /* Display the inventory */
2862         for (k = 0, i = 0; i < z; i++)
2863         {
2864                 o_ptr = &inventory[i];
2865
2866                 /* Is this item acceptable? */
2867                 if (!item_tester_okay(o_ptr)) continue;
2868
2869                 /* Describe the object */
2870                 object_desc(o_name, o_ptr, 0);
2871
2872                 /* Save the object index, color, and description */
2873                 out_index[k] = i;
2874                 out_color[k] = tval_to_attr[o_ptr->tval % 128];
2875
2876                 /* Grey out charging items */
2877                 if (o_ptr->timeout)
2878                 {
2879                         out_color[k] = TERM_L_DARK;
2880                 }
2881
2882                 (void)strcpy(out_desc[k], o_name);
2883
2884                 /* Find the predicted "line length" */
2885                 l = strlen(out_desc[k]) + 5;
2886
2887                 /* Be sure to account for the weight */
2888                 if (show_weights) l += 9;
2889
2890                 /* Account for icon if displayed */
2891                 if (show_item_graph)
2892                 {
2893                         l += 2;
2894                         if (use_bigtile) l++;
2895                 }
2896
2897                 /* Maintain the maximum length */
2898                 if (l > len) len = l;
2899
2900                 /* Advance to next "line" */
2901                 k++;
2902         }
2903
2904         /* Find the column to start in */
2905         col = (len > wid - 4) ? 0 : (wid - len - 1);
2906
2907         /* Output each entry */
2908         for (j = 0; j < k; j++)
2909         {
2910                 /* Get the index */
2911                 i = out_index[j];
2912
2913                 /* Get the item */
2914                 o_ptr = &inventory[i];
2915
2916                 /* Clear the line */
2917                 prt("", j + 1, col ? col - 2 : col);
2918
2919                 if (use_menu && target_item)
2920                 {
2921                         if (j == (target_item-1))
2922                         {
2923 #ifdef JP
2924                                 strcpy(tmp_val, "¡Õ");
2925 #else
2926                                 strcpy(tmp_val, "> ");
2927 #endif
2928                                 target_item_label = i;
2929                         }
2930                         else strcpy(tmp_val, "  ");
2931                 }
2932                 else if (i <= INVEN_PACK)
2933                 {
2934                         /* Prepare an index --(-- */
2935                         sprintf(tmp_val, "%c)", inven_label[i]);
2936                 }
2937                 else
2938                 {
2939                         /* Prepare an index --(-- */
2940                         sprintf(tmp_val, "%c)", index_to_label(i));
2941                 }
2942
2943                 /* Clear the line with the (possibly indented) index */
2944                 put_str(tmp_val, j + 1, col);
2945
2946                 cur_col = col + 3;
2947
2948                 /* Display graphics for object, if desired */
2949                 if (show_item_graph)
2950                 {
2951                         byte  a = object_attr(o_ptr);
2952                         char c = object_char(o_ptr);
2953
2954 #ifdef AMIGA
2955                         if (a & 0x80) a |= 0x40;
2956 #endif
2957
2958                         Term_queue_bigchar(cur_col, j + 1, a, c, 0, 0);
2959                         if (use_bigtile) cur_col++;
2960
2961                         cur_col += 2;
2962                 }
2963
2964
2965                 /* Display the entry itself */
2966                 c_put_str(out_color[j], out_desc[j], j + 1, cur_col);
2967
2968                 /* Display the weight if needed */
2969                 if (show_weights)
2970                 {
2971                         int wgt = o_ptr->weight * o_ptr->number;
2972 #ifdef JP
2973                         (void)sprintf(tmp_val, "%3d.%1d kg", lbtokg1(wgt) , lbtokg2(wgt) );
2974 #else
2975                         (void)sprintf(tmp_val, "%3d.%1d lb", wgt / 10, wgt % 10);
2976 #endif
2977
2978                         prt(tmp_val, j + 1, wid - 9);
2979                 }
2980         }
2981
2982         /* Make a "shadow" below the list (only if needed) */
2983         if (j && (j < 23)) prt("", j + 1, col ? col - 2 : col);
2984
2985         /* Save the new column */
2986         command_gap = col;
2987
2988         return target_item_label;
2989 }
2990
2991
2992
2993 /*
2994  * Display the equipment.
2995  */
2996 int show_equip(int target_item)
2997 {
2998         int             i, j, k, l;
2999         int             col, cur_col, len;
3000         object_type     *o_ptr;
3001         char            tmp_val[80];
3002         char            o_name[MAX_NLEN];
3003         int             out_index[23];
3004         byte            out_color[23];
3005         char            out_desc[23][MAX_NLEN];
3006         int             target_item_label = 0;
3007         int             wid, hgt;
3008         char            equip_label[52 + 1];
3009
3010         /* Starting column */
3011         col = command_gap;
3012
3013         /* Get size */
3014         Term_get_size(&wid, &hgt);
3015
3016         /* Maximal length */
3017         len = wid - col - 1;
3018
3019
3020         /* Scan the equipment list */
3021         for (k = 0, i = INVEN_RARM; i < INVEN_TOTAL; i++)
3022         {
3023                 o_ptr = &inventory[i];
3024
3025                 /* Is this item acceptable? */
3026                 if (!(select_ring_slot ? is_ring_slot(i) : item_tester_okay(o_ptr)) &&
3027                     (!((((i == INVEN_RARM) && p_ptr->hidarite) || ((i == INVEN_LARM) && p_ptr->migite)) && p_ptr->ryoute) ||
3028                      item_tester_no_ryoute)) continue;
3029
3030                 /* Description */
3031                 object_desc(o_name, o_ptr, 0);
3032
3033                 if ((((i == INVEN_RARM) && p_ptr->hidarite) || ((i == INVEN_LARM) && p_ptr->migite)) && p_ptr->ryoute)
3034                 {
3035 #ifdef JP
3036                         (void)strcpy(out_desc[k],"(Éð´ï¤òξ¼ê»ý¤Á)");
3037 #else
3038                         (void)strcpy(out_desc[k],"(wielding with two-hands)");
3039 #endif
3040                         out_color[k] = TERM_WHITE;
3041                 }
3042                 else
3043                 {
3044                         (void)strcpy(out_desc[k], o_name);
3045                         out_color[k] = tval_to_attr[o_ptr->tval % 128];
3046                 }
3047
3048                 out_index[k] = i;
3049                 /* Grey out charging items */
3050                 if (o_ptr->timeout)
3051                 {
3052                         out_color[k] = TERM_L_DARK;
3053                 }
3054
3055                 /* Extract the maximal length (see below) */
3056 #ifdef JP
3057                 l = strlen(out_desc[k]) + (2 + 1);
3058 #else
3059                 l = strlen(out_desc[k]) + (2 + 3);
3060 #endif
3061
3062
3063                 /* Increase length for labels (if needed) */
3064 #ifdef JP
3065                 if (show_labels) l += (7 + 2);
3066 #else
3067                 if (show_labels) l += (14 + 2);
3068 #endif
3069
3070
3071                 /* Increase length for weight (if needed) */
3072                 if (show_weights) l += 9;
3073
3074                 if (show_item_graph) l += 2;
3075
3076                 /* Maintain the max-length */
3077                 if (l > len) len = l;
3078
3079                 /* Advance the entry */
3080                 k++;
3081         }
3082
3083         /* Hack -- Find a column to start in */
3084 #ifdef JP
3085         col = (len > wid - 6) ? 0 : (wid - len - 1);
3086 #else
3087         col = (len > wid - 4) ? 0 : (wid - len - 1);
3088 #endif
3089
3090         prepare_label_string(equip_label, USE_EQUIP);
3091
3092         /* Output each entry */
3093         for (j = 0; j < k; j++)
3094         {
3095                 /* Get the index */
3096                 i = out_index[j];
3097
3098                 /* Get the item */
3099                 o_ptr = &inventory[i];
3100
3101                 /* Clear the line */
3102                 prt("", j + 1, col ? col - 2 : col);
3103
3104                 if (use_menu && target_item)
3105                 {
3106                         if (j == (target_item-1))
3107                         {
3108 #ifdef JP
3109                                 strcpy(tmp_val, "¡Õ");
3110 #else
3111                                 strcpy(tmp_val, "> ");
3112 #endif
3113                                 target_item_label = i;
3114                         }
3115                         else strcpy(tmp_val, "  ");
3116                 }
3117                 else if (i >= INVEN_RARM)
3118                 {
3119                         /* Prepare an index --(-- */
3120                         sprintf(tmp_val, "%c)", equip_label[i - INVEN_RARM]);
3121                 }
3122                 else /* Paranoia */
3123                 {
3124                         /* Prepare an index --(-- */
3125                         sprintf(tmp_val, "%c)", index_to_label(i));
3126                 }
3127
3128                 /* Clear the line with the (possibly indented) index */
3129                 put_str(tmp_val, j+1, col);
3130
3131                 cur_col = col + 3;
3132
3133                 /* Display graphics for object, if desired */
3134                 if (show_item_graph)
3135                 {
3136                         byte a = object_attr(o_ptr);
3137                         char c = object_char(o_ptr);
3138
3139 #ifdef AMIGA
3140                         if (a & 0x80) a |= 0x40;
3141 #endif
3142
3143                         Term_queue_bigchar(cur_col, j + 1, a, c, 0, 0);
3144                         if (use_bigtile) cur_col++;
3145
3146                         cur_col += 2;
3147                 }
3148
3149                 /* Use labels */
3150                 if (show_labels)
3151                 {
3152                         /* Mention the use */
3153 #ifdef JP
3154                         (void)sprintf(tmp_val, "%-7s: ", mention_use(i));
3155 #else
3156                         (void)sprintf(tmp_val, "%-14s: ", mention_use(i));
3157 #endif
3158
3159                         put_str(tmp_val, j+1, cur_col);
3160
3161                         /* Display the entry itself */
3162 #ifdef JP
3163                         c_put_str(out_color[j], out_desc[j], j+1, cur_col + 9);
3164 #else
3165                         c_put_str(out_color[j], out_desc[j], j+1, cur_col + 16);
3166 #endif
3167                 }
3168
3169                 /* No labels */
3170                 else
3171                 {
3172                         /* Display the entry itself */
3173                         c_put_str(out_color[j], out_desc[j], j+1, cur_col);
3174                 }
3175
3176                 /* Display the weight if needed */
3177                 if (show_weights)
3178                 {
3179                         int wgt = o_ptr->weight * o_ptr->number;
3180 #ifdef JP
3181                         (void)sprintf(tmp_val, "%3d.%1d kg", lbtokg1(wgt) , lbtokg2(wgt) );
3182 #else
3183                         (void)sprintf(tmp_val, "%3d.%d lb", wgt / 10, wgt % 10);
3184 #endif
3185
3186                         prt(tmp_val, j + 1, wid - 9);
3187                 }
3188         }
3189
3190         /* Make a "shadow" below the list (only if needed) */
3191         if (j && (j < 23)) prt("", j + 1, col ? col - 2 : col);
3192
3193         /* Save the new column */
3194         command_gap = col;
3195
3196         return target_item_label;
3197 }
3198
3199
3200
3201
3202 /*
3203  * Flip "inven" and "equip" in any sub-windows
3204  */
3205 void toggle_inven_equip(void)
3206 {
3207         int j;
3208
3209         /* Scan windows */
3210         for (j = 0; j < 8; j++)
3211         {
3212                 /* Unused */
3213                 if (!angband_term[j]) continue;
3214
3215                 /* Flip inven to equip */
3216                 if (window_flag[j] & (PW_INVEN))
3217                 {
3218                         /* Flip flags */
3219                         window_flag[j] &= ~(PW_INVEN);
3220                         window_flag[j] |= (PW_EQUIP);
3221
3222                         /* Window stuff */
3223                         p_ptr->window |= (PW_EQUIP);
3224                 }
3225
3226                 /* Flip inven to equip */
3227                 else if (window_flag[j] & (PW_EQUIP))
3228                 {
3229                         /* Flip flags */
3230                         window_flag[j] &= ~(PW_EQUIP);
3231                         window_flag[j] |= (PW_INVEN);
3232
3233                         /* Window stuff */
3234                         p_ptr->window |= (PW_INVEN);
3235                 }
3236         }
3237 }
3238
3239
3240
3241 /*
3242  * Verify the choice of an item.
3243  *
3244  * The item can be negative to mean "item on floor".
3245  */
3246 static bool verify(cptr prompt, int item)
3247 {
3248         char        o_name[MAX_NLEN];
3249         char        out_val[MAX_NLEN+20];
3250         object_type *o_ptr;
3251
3252
3253         /* Inventory */
3254         if (item >= 0)
3255         {
3256                 o_ptr = &inventory[item];
3257         }
3258
3259         /* Floor */
3260         else
3261         {
3262                 o_ptr = &o_list[0 - item];
3263         }
3264
3265         /* Describe */
3266         object_desc(o_name, o_ptr, 0);
3267
3268         /* Prompt */
3269 #ifdef JP
3270 (void)sprintf(out_val, "%s%s¤Ç¤¹¤«? ", prompt, o_name);
3271 #else
3272         (void)sprintf(out_val, "%s %s? ", prompt, o_name);
3273 #endif
3274
3275
3276         /* Query */
3277         return (get_check(out_val));
3278 }
3279
3280
3281 /*
3282  * Hack -- allow user to "prevent" certain choices
3283  *
3284  * The item can be negative to mean "item on floor".
3285  */
3286 static bool get_item_allow(int item)
3287 {
3288         cptr s;
3289
3290         object_type *o_ptr;
3291
3292         if (!command_cmd) return TRUE; /* command_cmd is no longer effective */
3293
3294         /* Inventory */
3295         if (item >= 0)
3296         {
3297                 o_ptr = &inventory[item];
3298         }
3299
3300         /* Floor */
3301         else
3302         {
3303                 o_ptr = &o_list[0 - item];
3304         }
3305
3306         /* No inscription */
3307         if (!o_ptr->inscription) return (TRUE);
3308
3309         /* Find a '!' */
3310         s = my_strchr(quark_str(o_ptr->inscription), '!');
3311
3312         /* Process preventions */
3313         while (s)
3314         {
3315                 /* Check the "restriction" */
3316                 if ((s[1] == command_cmd) || (s[1] == '*'))
3317                 {
3318                         /* Verify the choice */
3319 #ifdef JP
3320 if (!verify("ËÜÅö¤Ë", item)) return (FALSE);
3321 #else
3322                         if (!verify("Really try", item)) return (FALSE);
3323 #endif
3324
3325                 }
3326
3327                 /* Find another '!' */
3328                 s = my_strchr(s + 1, '!');
3329         }
3330
3331         /* Allow it */
3332         return (TRUE);
3333 }
3334
3335
3336
3337 /*
3338  * Auxiliary function for "get_item()" -- test an index
3339  */
3340 static bool get_item_okay(int i)
3341 {
3342         /* Illegal items */
3343         if ((i < 0) || (i >= INVEN_TOTAL)) return (FALSE);
3344
3345         if (select_ring_slot) return is_ring_slot(i);
3346
3347         /* Verify the item */
3348         if (!item_tester_okay(&inventory[i])) return (FALSE);
3349
3350         /* Assume okay */
3351         return (TRUE);
3352 }
3353
3354
3355
3356 /*
3357  * Determine whether get_item() can get some item or not
3358  * assuming mode = (USE_EQUIP | USE_INVEN | USE_FLOOR).
3359  */
3360 bool can_get_item(void)
3361 {
3362         int j, floor_list[23], floor_num = 0;
3363
3364         for (j = 0; j < INVEN_TOTAL; j++)
3365                 if (item_tester_okay(&inventory[j]))
3366                         return TRUE;
3367
3368         floor_num = scan_floor(floor_list, py, px, 0x03);
3369         if (floor_num)
3370                 return TRUE;
3371
3372         return FALSE;
3373 }
3374
3375 /*
3376  * Let the user select an item, save its "index"
3377  *
3378  * Return TRUE only if an acceptable item was chosen by the user.
3379  *
3380  * The selected item must satisfy the "item_tester_hook()" function,
3381  * if that hook is set, and the "item_tester_tval", if that value is set.
3382  *
3383  * All "item_tester" restrictions are cleared before this function returns.
3384  *
3385  * The user is allowed to choose acceptable items from the equipment,
3386  * inventory, or floor, respectively, if the proper flag was given,
3387  * and there are any acceptable items in that location.
3388  *
3389  * The equipment or inventory are displayed (even if no acceptable
3390  * items are in that location) if the proper flag was given.
3391  *
3392  * If there are no acceptable items available anywhere, and "str" is
3393  * not NULL, then it will be used as the text of a warning message
3394  * before the function returns.
3395  *
3396  * Note that the user must press "-" to specify the item on the floor,
3397  * and there is no way to "examine" the item on the floor, while the
3398  * use of "capital" letters will "examine" an inventory/equipment item,
3399  * and prompt for its use.
3400  *
3401  * If a legal item is selected from the inventory, we save it in "cp"
3402  * directly (0 to 35), and return TRUE.
3403  *
3404  * If a legal item is selected from the floor, we save it in "cp" as
3405  * a negative (-1 to -511), and return TRUE.
3406  *
3407  * If no item is available, we do nothing to "cp", and we display a
3408  * warning message, using "str" if available, and return FALSE.
3409  *
3410  * If no item is selected, we do nothing to "cp", and return FALSE.
3411  *
3412  * Global "p_ptr->command_new" is used when viewing the inventory or equipment
3413  * to allow the user to enter a command while viewing those screens, and
3414  * also to induce "auto-enter" of stores, and other such stuff.
3415  *
3416  * Global "p_ptr->command_see" may be set before calling this function to start
3417  * out in "browse" mode.  It is cleared before this function returns.
3418  *
3419  * Global "p_ptr->command_wrk" is used to choose between equip/inven listings.
3420  * If it is TRUE then we are viewing inventory, else equipment.
3421  *
3422  * We always erase the prompt when we are done, leaving a blank line,
3423  * or a warning message, if appropriate, if no items are available.
3424  */
3425 bool get_item(int *cp, cptr pmt, cptr str, int mode)
3426 {
3427         s16b this_o_idx, next_o_idx = 0;
3428
3429         char which = ' ';
3430
3431         int j, k, i1, i2, e1, e2;
3432
3433         bool done, item;
3434
3435         bool oops = FALSE;
3436
3437         bool equip = FALSE;
3438         bool inven = FALSE;
3439         bool floor = FALSE;
3440
3441         bool allow_floor = FALSE;
3442
3443         bool toggle = FALSE;
3444
3445         char tmp_val[160];
3446         char out_val[160];
3447
3448         /* See cmd5.c */
3449         extern bool select_the_force;
3450
3451         int menu_line = (use_menu ? 1 : 0);
3452         int max_inven = 0;
3453         int max_equip = 0;
3454
3455 #ifdef ALLOW_REPEAT
3456
3457         static char prev_tag = '\0';
3458         char cur_tag = '\0';
3459
3460 #endif /* ALLOW_REPEAT */
3461
3462 #ifdef ALLOW_EASY_FLOOR /* TNB */
3463
3464         if (easy_floor || use_menu) return get_item_floor(cp, pmt, str, mode);
3465
3466 #endif /* ALLOW_EASY_FLOOR -- TNB */
3467
3468         /* Extract args */
3469         if (mode & USE_EQUIP) equip = TRUE;
3470         if (mode & USE_INVEN) inven = TRUE;
3471         if (mode & USE_FLOOR) floor = TRUE;
3472
3473 #ifdef ALLOW_REPEAT
3474
3475         /* Get the item index */
3476         if (repeat_pull(cp))
3477         {
3478                 /* the_force */
3479                 if (select_the_force && (*cp == INVEN_FORCE))
3480                 {
3481                         item_tester_tval = 0;
3482                         item_tester_hook = NULL;
3483                         command_cmd = 0; /* Hack -- command_cmd is no longer effective */
3484                         return (TRUE);
3485                 }
3486
3487                 /* Floor item? */
3488                 else if (floor && (*cp < 0))
3489                 {
3490                         object_type *o_ptr;
3491
3492                         /* Special index */
3493                         k = 0 - (*cp);
3494
3495                         /* Acquire object */
3496                         o_ptr = &o_list[k];
3497
3498                         /* Validate the item */
3499                         if (item_tester_okay(o_ptr))
3500                         {
3501                                 /* Forget restrictions */
3502                                 item_tester_tval = 0;
3503                                 item_tester_hook = NULL;
3504                                 command_cmd = 0; /* Hack -- command_cmd is no longer effective */
3505
3506                                 /* Success */
3507                                 return TRUE;
3508                         }
3509                 }
3510
3511                 else if ((inven && (*cp >= 0) && (*cp < INVEN_PACK)) ||
3512                          (equip && (*cp >= INVEN_RARM) && (*cp < INVEN_TOTAL)))
3513                 {
3514                         if (prev_tag && command_cmd)
3515                         {
3516                                 /* Look up the tag and validate the item */
3517                                 if (!get_tag(&k, prev_tag, (*cp >= INVEN_RARM) ? USE_EQUIP : USE_INVEN)) /* Reject */;
3518                                 else if ((k < INVEN_RARM) ? !inven : !equip) /* Reject */;
3519                                 else if (!get_item_okay(k)) /* Reject */;
3520                                 else
3521                                 {
3522                                         /* Accept that choice */
3523                                         (*cp) = k;
3524
3525                                         /* Forget restrictions */
3526                                         item_tester_tval = 0;
3527                                         item_tester_hook = NULL;
3528                                         command_cmd = 0; /* Hack -- command_cmd is no longer effective */
3529
3530                                         /* Success */
3531                                         return TRUE;
3532                                 }
3533
3534                                 prev_tag = '\0'; /* prev_tag is no longer effective */
3535                         }
3536
3537                         /* Verify the item */
3538                         else if (get_item_okay(*cp))
3539                         {
3540                                 /* Forget restrictions */
3541                                 item_tester_tval = 0;
3542                                 item_tester_hook = NULL;
3543                                 command_cmd = 0; /* Hack -- command_cmd is no longer effective */
3544
3545                                 /* Success */
3546                                 return TRUE;
3547                         }
3548                 }
3549         }
3550
3551 #endif /* ALLOW_REPEAT */
3552
3553
3554         /* Paranoia XXX XXX XXX */
3555         msg_print(NULL);
3556
3557
3558         /* Not done */
3559         done = FALSE;
3560
3561         /* No item selected */
3562         item = FALSE;
3563
3564
3565         /* Full inventory */
3566         i1 = 0;
3567         i2 = INVEN_PACK - 1;
3568
3569         /* Forbid inventory */
3570         if (!inven) i2 = -1;
3571         else if (use_menu)
3572         {
3573                 for (j = 0; j < INVEN_PACK; j++)
3574                         if (item_tester_okay(&inventory[j])) max_inven++;
3575         }
3576
3577         /* Restrict inventory indexes */
3578         while ((i1 <= i2) && (!get_item_okay(i1))) i1++;
3579         while ((i1 <= i2) && (!get_item_okay(i2))) i2--;
3580
3581
3582         /* Full equipment */
3583         e1 = INVEN_RARM;
3584         e2 = INVEN_TOTAL - 1;
3585
3586         /* Forbid equipment */
3587         if (!equip) e2 = -1;
3588         else if (use_menu)
3589         {
3590                 for (j = INVEN_RARM; j < INVEN_TOTAL; j++)
3591                         if (select_ring_slot ? is_ring_slot(j) : item_tester_okay(&inventory[j])) max_equip++;
3592                 if (p_ptr->ryoute && !item_tester_no_ryoute) max_equip++;
3593         }
3594
3595         /* Restrict equipment indexes */
3596         while ((e1 <= e2) && (!get_item_okay(e1))) e1++;
3597         while ((e1 <= e2) && (!get_item_okay(e2))) e2--;
3598
3599         if (equip && p_ptr->ryoute && !item_tester_no_ryoute)
3600         {
3601                 if (p_ptr->migite)
3602                 {
3603                         if (e2 < INVEN_LARM) e2 = INVEN_LARM;
3604                 }
3605                 else if (p_ptr->hidarite) e1 = INVEN_RARM;
3606         }
3607
3608
3609         /* Restrict floor usage */
3610         if (floor)
3611         {
3612                 /* Scan all objects in the grid */
3613                 for (this_o_idx = cave[py][px].o_idx; this_o_idx; this_o_idx = next_o_idx)
3614                 {
3615                         object_type *o_ptr;
3616
3617                         /* Acquire object */
3618                         o_ptr = &o_list[this_o_idx];
3619
3620                         /* Acquire next object */
3621                         next_o_idx = o_ptr->next_o_idx;
3622
3623                         /* Accept the item on the floor if legal */
3624                         if (item_tester_okay(o_ptr) && (o_ptr->marked & OM_FOUND)) allow_floor = TRUE;
3625                 }
3626         }
3627
3628         /* Require at least one legal choice */
3629         if (!allow_floor && (i1 > i2) && (e1 > e2))
3630         {
3631                 /* Cancel p_ptr->command_see */
3632                 command_see = FALSE;
3633
3634                 /* Oops */
3635                 oops = TRUE;
3636
3637                 /* Done */
3638                 done = TRUE;
3639
3640                 if (select_the_force) {
3641                     *cp = INVEN_FORCE;
3642                     item = TRUE;
3643                 }
3644         }
3645
3646         /* Analyze choices */
3647         else
3648         {
3649                 /* Hack -- Start on equipment if requested */
3650                 if (command_see && command_wrk && equip)
3651                 {
3652                         command_wrk = TRUE;
3653                 }
3654
3655                 /* Use inventory if allowed */
3656                 else if (inven)
3657                 {
3658                         command_wrk = FALSE;
3659                 }
3660
3661                 /* Use equipment if allowed */
3662                 else if (equip)
3663                 {
3664                         command_wrk = TRUE;
3665                 }
3666
3667                 /* Use inventory for floor */
3668                 else
3669                 {
3670                         command_wrk = FALSE;
3671                 }
3672         }
3673
3674
3675         /*
3676          * Äɲ媥ץ·¥ç¥ó(always_show_list)¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¾ï¤Ë°ìÍ÷¤òɽ¼¨¤¹¤ë
3677          */
3678         if ((always_show_list == TRUE) || use_menu) command_see = TRUE;
3679
3680         /* Hack -- start out in "display" mode */
3681         if (command_see)
3682         {
3683                 /* Save screen */
3684                 screen_save();
3685         }
3686
3687
3688         /* Repeat until done */
3689         while (!done)
3690         {
3691                 int get_item_label = 0;
3692
3693                 /* Show choices */
3694                 int ni = 0;
3695                 int ne = 0;
3696
3697                 /* Scan windows */
3698                 for (j = 0; j < 8; j++)
3699                 {
3700                         /* Unused */
3701                         if (!angband_term[j]) continue;
3702
3703                         /* Count windows displaying inven */
3704                         if (window_flag[j] & (PW_INVEN)) ni++;
3705
3706                         /* Count windows displaying equip */
3707                         if (window_flag[j] & (PW_EQUIP)) ne++;
3708                 }
3709
3710                 /* Toggle if needed */
3711                 if ((command_wrk && ni && !ne) ||
3712                     (!command_wrk && !ni && ne))
3713                 {
3714                         /* Toggle */
3715                         toggle_inven_equip();
3716
3717                         /* Track toggles */
3718                         toggle = !toggle;
3719                 }
3720
3721                 /* Update */
3722                 p_ptr->window |= (PW_INVEN | PW_EQUIP);
3723
3724                 /* Redraw windows */
3725                 window_stuff();
3726
3727
3728                 /* Inventory screen */
3729                 if (!command_wrk)
3730                 {
3731                         /* Redraw if needed */
3732                         if (command_see) get_item_label = show_inven(menu_line);
3733                 }
3734
3735                 /* Equipment screen */
3736                 else
3737                 {
3738                         /* Redraw if needed */
3739                         if (command_see) get_item_label = show_equip(menu_line);
3740                 }
3741
3742                 /* Viewing inventory */
3743                 if (!command_wrk)
3744                 {
3745                         /* Begin the prompt */
3746 #ifdef JP
3747                         sprintf(out_val, "»ý¤Áʪ:");
3748 #else
3749                         sprintf(out_val, "Inven:");
3750 #endif
3751
3752                         /* Some legal items */
3753                         if ((i1 <= i2) && !use_menu)
3754                         {
3755                                 /* Build the prompt */
3756 #ifdef JP
3757                                 sprintf(tmp_val, "%c-%c,'(',')',",
3758 #else
3759                                 sprintf(tmp_val, " %c-%c,'(',')',",
3760 #endif
3761                                         index_to_label(i1), index_to_label(i2));
3762
3763                                 /* Append */
3764                                 strcat(out_val, tmp_val);
3765                         }
3766
3767                         /* Indicate ability to "view" */
3768 #ifdef JP
3769                         if (!command_see && !use_menu) strcat(out_val, " '*'°ìÍ÷,");
3770 #else
3771                         if (!command_see && !use_menu) strcat(out_val, " * to see,");
3772 #endif
3773
3774                         /* Append */
3775 #ifdef JP
3776                         if (equip) strcat(out_val, format(" %s ÁõÈ÷ÉÊ,", use_menu ? "'4'or'6'" : "'/'"));
3777 #else
3778                         if (equip) strcat(out_val, format(" %s for Equip,", use_menu ? "4 or 6" : "/"));
3779 #endif
3780                 }
3781
3782                 /* Viewing equipment */
3783                 else
3784                 {
3785                         /* Begin the prompt */
3786 #ifdef JP
3787                         sprintf(out_val, "ÁõÈ÷ÉÊ:");
3788 #else
3789                         sprintf(out_val, "Equip:");
3790 #endif
3791
3792                         /* Some legal items */
3793                         if ((e1 <= e2) && !use_menu)
3794                         {
3795                                 /* Build the prompt */
3796 #ifdef JP
3797                                 sprintf(tmp_val, "%c-%c,'(',')',",
3798 #else
3799                                 sprintf(tmp_val, " %c-%c,'(',')',",
3800 #endif
3801                                         index_to_label(e1), index_to_label(e2));
3802
3803                                 /* Append */
3804                                 strcat(out_val, tmp_val);
3805                         }
3806
3807                         /* Indicate ability to "view" */
3808 #ifdef JP
3809                         if (!command_see && !use_menu) strcat(out_val, " '*'°ìÍ÷,");
3810 #else
3811                         if (!command_see) strcat(out_val, " * to see,");
3812 #endif
3813
3814                         /* Append */
3815 #ifdef JP
3816                         if (inven) strcat(out_val, format(" %s »ý¤Áʪ,", use_menu ? "'4'or'6'" : "'/'"));
3817 #else
3818                         if (inven) strcat(out_val, format(" %s for Inven,", use_menu ? "4 or 6" : "'/'"));
3819 #endif
3820                 }
3821
3822                 /* Indicate legality of the "floor" item */
3823 #ifdef JP
3824                 if (allow_floor) strcat(out_val, " '-'¾²¾å,");
3825                 if (select_the_force) strcat(out_val, " 'w'Îýµ¤½Ñ,");
3826 #else
3827                 if (allow_floor) strcat(out_val, " - for floor,");
3828                 if (select_the_force) strcat(out_val, " w for the Force,");
3829 #endif
3830
3831                 /* Finish the prompt */
3832                 strcat(out_val, " ESC");
3833
3834                 /* Build the prompt */
3835                 sprintf(tmp_val, "(%s) %s", out_val, pmt);
3836
3837                 /* Show the prompt */
3838                 prt(tmp_val, 0, 0);
3839
3840                 /* Get a key */
3841                 which = inkey();
3842
3843                 if (use_menu)
3844                 {
3845                 int max_line = (command_wrk ? max_equip : max_inven);
3846                 switch (which)
3847                 {
3848                         case ESCAPE:
3849                         case 'z':
3850                         case 'Z':
3851                         case '0':
3852                         {
3853                                 done = TRUE;
3854                                 break;
3855                         }
3856
3857                         case '8':
3858                         case 'k':
3859                         case 'K':
3860                         {
3861                                 menu_line += (max_line - 1);
3862                                 break;
3863                         }
3864
3865                         case '2':
3866                         case 'j':
3867                         case 'J':
3868                         {
3869                                 menu_line++;
3870                                 break;
3871                         }
3872
3873                         case '4':
3874                         case '6':
3875                         case 'h':
3876                         case 'H':
3877                         case 'l':
3878                         case 'L':
3879                         {
3880                                 /* Verify legality */
3881                                 if (!inven || !equip)
3882                                 {
3883                                         bell();
3884                                         break;
3885                                 }
3886
3887                                 /* Hack -- Fix screen */
3888                                 if (command_see)
3889                                 {
3890                                         /* Load screen */
3891                                         screen_load();
3892
3893                                         /* Save screen */
3894                                         screen_save();
3895                                 }
3896
3897                                 /* Switch inven/equip */
3898                                 command_wrk = !command_wrk;
3899                                 max_line = (command_wrk ? max_equip : max_inven);
3900                                 if (menu_line > max_line) menu_line = max_line;
3901
3902                                 /* Need to redraw */
3903                                 break;
3904                         }
3905
3906                         case 'x':
3907                         case 'X':
3908                         case '\r':
3909                         case '\n':
3910                         {
3911                                 if (command_wrk == USE_FLOOR)
3912                                 {
3913                                         /* Special index */
3914                                         (*cp) = -get_item_label;
3915                                 }
3916                                 else
3917                                 {
3918                                         /* Validate the item */
3919                                         if (!get_item_okay(get_item_label))
3920                                         {
3921                                                 bell();
3922                                                 break;
3923                                         }
3924
3925                                         /* Allow player to "refuse" certain actions */
3926                                         if (!get_item_allow(get_item_label))
3927                                         {
3928                                                 done = TRUE;
3929                                                 break;
3930                                         }
3931
3932                                         /* Accept that choice */
3933                                         (*cp) = get_item_label;
3934                                 }
3935
3936                                 item = TRUE;
3937                                 done = TRUE;
3938                                 break;
3939                         }
3940                         case 'w':
3941                         {
3942                                 if (select_the_force) {
3943                                         *cp = INVEN_FORCE;
3944                                         item = TRUE;
3945                                         done = TRUE;
3946                                         break;
3947                                 }
3948                         }
3949                 }
3950                 if (menu_line > max_line) menu_line -= max_line;
3951                 }
3952                 else
3953                 {
3954                 /* Parse it */
3955                 switch (which)
3956                 {
3957                         case ESCAPE:
3958                         {
3959                                 done = TRUE;
3960                                 break;
3961                         }
3962
3963                         case '*':
3964                         case '?':
3965                         case ' ':
3966                         {
3967                                 /* Hide the list */
3968                                 if (command_see)
3969                                 {
3970                                         /* Flip flag */
3971                                         command_see = FALSE;
3972
3973                                         /* Load screen */
3974                                         screen_load();
3975                                 }
3976
3977                                 /* Show the list */
3978                                 else
3979                                 {
3980                                         /* Save screen */
3981                                         screen_save();
3982
3983                                         /* Flip flag */
3984                                         command_see = TRUE;
3985                                 }
3986                                 break;
3987                         }
3988
3989                         case '/':
3990                         {
3991                                 /* Verify legality */
3992                                 if (!inven || !equip)
3993                                 {
3994                                         bell();
3995                                         break;
3996                                 }
3997
3998                                 /* Hack -- Fix screen */
3999                                 if (command_see)
4000                                 {
4001                                         /* Load screen */
4002                                         screen_load();
4003
4004                                         /* Save screen */
4005                                         screen_save();
4006                                 }
4007
4008                                 /* Switch inven/equip */
4009                                 command_wrk = !command_wrk;
4010
4011                                 /* Need to redraw */
4012                                 break;
4013                         }
4014
4015                         case '-':
4016                         {
4017                                 /* Use floor item */
4018                                 if (allow_floor)
4019                                 {
4020                                         /* Scan all objects in the grid */
4021                                         for (this_o_idx = cave[py][px].o_idx; this_o_idx; this_o_idx = next_o_idx)
4022                                         {
4023                                                 object_type *o_ptr;
4024
4025                                                 /* Acquire object */
4026                                                 o_ptr = &o_list[this_o_idx];
4027
4028                                                 /* Acquire next object */
4029                                                 next_o_idx = o_ptr->next_o_idx;
4030
4031                                                 /* Validate the item */
4032                                                 if (!item_tester_okay(o_ptr)) continue;
4033
4034                                                 /* Special index */
4035                                                 k = 0 - this_o_idx;
4036
4037                                                 /* Verify the item (if required) */
4038 #ifdef JP
4039 if (other_query_flag && !verify("ËÜÅö¤Ë", k)) continue;
4040 #else
4041                                                 if (other_query_flag && !verify("Try", k)) continue;
4042 #endif
4043
4044
4045                                                 /* Allow player to "refuse" certain actions */
4046                                                 if (!get_item_allow(k)) continue;
4047
4048                                                 /* Accept that choice */
4049                                                 (*cp) = k;
4050                                                 item = TRUE;
4051                                                 done = TRUE;
4052                                                 break;
4053                                         }
4054
4055                                         /* Outer break */
4056                                         if (done) break;
4057                                 }
4058
4059                                 /* Oops */
4060                                 bell();
4061                                 break;
4062                         }
4063
4064                         case '0':
4065                         case '1': case '2': case '3':
4066                         case '4': case '5': case '6':
4067                         case '7': case '8': case '9':
4068                         {
4069                                 /* Look up the tag */
4070                                 if (!get_tag(&k, which, command_wrk ? USE_EQUIP : USE_INVEN))
4071                                 {
4072                                         bell();
4073                                         break;
4074                                 }
4075
4076                                 /* Hack -- Validate the item */
4077                                 if ((k < INVEN_RARM) ? !inven : !equip)
4078                                 {
4079                                         bell();
4080                                         break;
4081                                 }
4082
4083                                 /* Validate the item */
4084                                 if (!get_item_okay(k))
4085                                 {
4086                                         bell();
4087                                         break;
4088                                 }
4089
4090                                 /* Allow player to "refuse" certain actions */
4091                                 if (!get_item_allow(k))
4092                                 {
4093                                         done = TRUE;
4094                                         break;
4095                                 }
4096
4097                                 /* Accept that choice */
4098                                 (*cp) = k;
4099                                 item = TRUE;
4100                                 done = TRUE;
4101 #ifdef ALLOW_REPEAT
4102                                 cur_tag = which;
4103 #endif /* ALLOW_REPEAT */
4104                                 break;
4105                         }
4106
4107 #if 0
4108                         case '\n':
4109                         case '\r':
4110                         {
4111                                 /* Choose "default" inventory item */
4112                                 if (!command_wrk)
4113                                 {
4114                                         k = ((i1 == i2) ? i1 : -1);
4115                                 }
4116
4117                                 /* Choose "default" equipment item */
4118                                 else
4119                                 {
4120                                         k = ((e1 == e2) ? e1 : -1);
4121                                 }
4122
4123                                 /* Validate the item */
4124                                 if (!get_item_okay(k))
4125                                 {
4126                                         bell();
4127                                         break;
4128                                 }
4129
4130                                 /* Allow player to "refuse" certain actions */
4131                                 if (!get_item_allow(k))
4132                                 {
4133                                         done = TRUE;
4134                                         break;
4135                                 }
4136
4137                                 /* Accept that choice */
4138                                 (*cp) = k;
4139                                 item = TRUE;
4140                                 done = TRUE;
4141                                 break;
4142                         }
4143 #endif
4144
4145                         case 'w':
4146                         {
4147                                 if (select_the_force) {
4148                                         *cp = INVEN_FORCE;
4149                                         item = TRUE;
4150                                         done = TRUE;
4151                                         break;
4152                                 }
4153
4154                                 /* Fall through */
4155                         }
4156
4157                         default:
4158                         {
4159                                 int ver;
4160                                 bool not_found = FALSE;
4161
4162                                 /* Look up the alphabetical tag */
4163                                 if (!get_tag(&k, which, command_wrk ? USE_EQUIP : USE_INVEN))
4164                                 {
4165                                         not_found = TRUE;
4166                                 }
4167
4168                                 /* Hack -- Validate the item */
4169                                 else if ((k < INVEN_RARM) ? !inven : !equip)
4170                                 {
4171                                         not_found = TRUE;
4172                                 }
4173
4174                                 /* Validate the item */
4175                                 else if (!get_item_okay(k))
4176                                 {
4177                                         not_found = TRUE;
4178                                 }
4179
4180                                 if (!not_found)
4181                                 {
4182                                         /* Accept that choice */
4183                                         (*cp) = k;
4184                                         item = TRUE;
4185                                         done = TRUE;
4186 #ifdef ALLOW_REPEAT
4187                                         cur_tag = which;
4188 #endif /* ALLOW_REPEAT */
4189                                         break;
4190                                 }
4191
4192                                 /* Extract "query" setting */
4193                                 ver = isupper(which);
4194                                 which = tolower(which);
4195
4196                                 /* Convert letter to inventory index */
4197                                 if (!command_wrk)
4198                                 {
4199                                         if (which == '(') k = i1;
4200                                         else if (which == ')') k = i2;
4201                                         else k = label_to_inven(which);
4202                                 }
4203
4204                                 /* Convert letter to equipment index */
4205                                 else
4206                                 {
4207                                         if (which == '(') k = e1;
4208                                         else if (which == ')') k = e2;
4209                                         else k = label_to_equip(which);
4210                                 }
4211
4212                                 /* Validate the item */
4213                                 if (!get_item_okay(k))
4214                                 {
4215                                         bell();
4216                                         break;
4217                                 }
4218
4219                                 /* Verify the item */
4220 #ifdef JP
4221 if (ver && !verify("ËÜÅö¤Ë", k))
4222 #else
4223                                 if (ver && !verify("Try", k))
4224 #endif
4225
4226                                 {
4227                                         done = TRUE;
4228                                         break;
4229                                 }
4230
4231                                 /* Allow player to "refuse" certain actions */
4232                                 if (!get_item_allow(k))
4233                                 {
4234                                         done = TRUE;
4235                                         break;
4236                                 }
4237
4238                                 /* Accept that choice */
4239                                 (*cp) = k;
4240                                 item = TRUE;
4241                                 done = TRUE;
4242                                 break;
4243                         }
4244                 }
4245                 }
4246         }
4247
4248
4249         /* Fix the screen if necessary */
4250         if (command_see)
4251         {
4252                 /* Load screen */
4253                 screen_load();
4254
4255                 /* Hack -- Cancel "display" */
4256                 command_see = FALSE;
4257         }
4258
4259
4260         /* Forget the item_tester_tval restriction */
4261         item_tester_tval = 0;
4262
4263         item_tester_no_ryoute = FALSE;
4264
4265         /* Forget the item_tester_hook restriction */
4266         item_tester_hook = NULL;
4267
4268
4269         /* Clean up  'show choices' */
4270         /* Toggle again if needed */
4271         if (toggle) toggle_inven_equip();
4272
4273         /* Update */
4274         p_ptr->window |= (PW_INVEN | PW_EQUIP);
4275
4276         /* Window stuff */
4277         window_stuff();
4278
4279
4280         /* Clear the prompt line */
4281         prt("", 0, 0);
4282
4283         /* Warning if needed */
4284         if (oops && str) msg_print(str);
4285
4286         if (item)
4287         {
4288 #ifdef ALLOW_REPEAT
4289                 repeat_push(*cp);
4290                 if (command_cmd) prev_tag = cur_tag;
4291 #endif /* ALLOW_REPEAT */
4292
4293                 command_cmd = 0; /* Hack -- command_cmd is no longer effective */
4294         }
4295
4296         /* Result */
4297         return (item);
4298 }
4299
4300
4301 #ifdef ALLOW_EASY_FLOOR
4302
4303 /*
4304  * scan_floor --
4305  *
4306  * Return a list of o_list[] indexes of items at the given cave
4307  * location. Valid flags are:
4308  *
4309  *              mode & 0x01 -- Item tester
4310  *              mode & 0x02 -- Marked items only
4311  *              mode & 0x04 -- Stop after first
4312  */
4313 int scan_floor(int *items, int y, int x, int mode)
4314 {
4315         int this_o_idx, next_o_idx;
4316
4317         int num = 0;
4318
4319         /* Sanity */
4320         if (!in_bounds(y, x)) return 0;
4321
4322         /* Scan all objects in the grid */
4323         for (this_o_idx = cave[y][x].o_idx; this_o_idx; this_o_idx = next_o_idx)
4324         {
4325                 object_type *o_ptr;
4326
4327                 /* Acquire object */
4328                 o_ptr = &o_list[this_o_idx];
4329
4330                 /* Acquire next object */
4331                 next_o_idx = o_ptr->next_o_idx;
4332
4333                 /* Item tester */
4334                 if ((mode & 0x01) && !item_tester_okay(o_ptr)) continue;
4335
4336                 /* Marked */
4337                 if ((mode & 0x02) && !(o_ptr->marked & OM_FOUND)) continue;
4338
4339                 /* Accept this item */
4340                 /* XXX Hack -- Enforce limit */
4341                 if (num < 23)
4342                         items[num] = this_o_idx;
4343
4344                 num++;
4345
4346                 /* Only one */
4347                 if (mode & 0x04) break;
4348         }
4349
4350         /* Result */
4351         return num;
4352 }
4353
4354
4355 /*
4356  * Display a list of the items on the floor at the given location.
4357  */
4358 int show_floor(int target_item, int y, int x, int *min_width)
4359 {
4360         int i, j, k, l;
4361         int col, len;
4362
4363         object_type *o_ptr;
4364
4365         char o_name[MAX_NLEN];
4366
4367         char tmp_val[80];
4368
4369         int out_index[23];
4370         byte out_color[23];
4371         char out_desc[23][MAX_NLEN];
4372         int target_item_label = 0;
4373
4374         int floor_list[23], floor_num;
4375         int wid, hgt;
4376         char floor_label[52 + 1];
4377
4378         bool dont_need_to_show_weights = TRUE;
4379
4380         /* Get size */
4381         Term_get_size(&wid, &hgt);
4382
4383         /* Default length */
4384         len = MAX((*min_width), 20);
4385
4386
4387         /* Scan for objects in the grid, using item_tester_okay() */
4388         floor_num = scan_floor(floor_list, y, x, 0x03);
4389
4390         /* Display the floor objects */
4391         for (k = 0, i = 0; i < floor_num && i < 23; i++)
4392         {
4393                 o_ptr = &o_list[floor_list[i]];
4394
4395                 /* Describe the object */
4396                 object_desc(o_name, o_ptr, 0);
4397
4398                 /* Save the index */
4399                 out_index[k] = i;
4400
4401                 /* Acquire inventory color */
4402                 out_color[k] = tval_to_attr[o_ptr->tval & 0x7F];
4403
4404                 /* Save the object description */
4405                 strcpy(out_desc[k], o_name);
4406
4407                 /* Find the predicted "line length" */
4408                 l = strlen(out_desc[k]) + 5;
4409
4410                 /* Be sure to account for the weight */
4411                 if (show_weights) l += 9;
4412
4413                 if (o_ptr->tval != TV_GOLD) dont_need_to_show_weights = FALSE;
4414
4415                 /* Maintain the maximum length */
4416                 if (l > len) len = l;
4417
4418                 /* Advance to next "line" */
4419                 k++;
4420         }
4421
4422         if (show_weights && dont_need_to_show_weights) len -= 9;
4423
4424         /* Save width */
4425         *min_width = len;
4426
4427         /* Find the column to start in */
4428         col = (len > wid - 4) ? 0 : (wid - len - 1);
4429
4430         prepare_label_string_floor(floor_label, floor_list, floor_num);
4431
4432         /* Output each entry */
4433         for (j = 0; j < k; j++)
4434         {
4435                 /* Get the index */
4436                 i = floor_list[out_index[j]];
4437
4438                 /* Get the item */
4439                 o_ptr = &o_list[i];
4440
4441                 /* Clear the line */
4442                 prt("", j + 1, col ? col - 2 : col);
4443
4444                 if (use_menu && target_item)
4445                 {
4446                         if (j == (target_item-1))
4447                         {
4448 #ifdef JP
4449                                 strcpy(tmp_val, "¡Õ");
4450 #else
4451                                 strcpy(tmp_val, "> ");
4452 #endif
4453                                 target_item_label = i;
4454                         }
4455                         else strcpy(tmp_val, "   ");
4456                 }
4457                 else
4458                 {
4459                         /* Prepare an index --(-- */
4460                         sprintf(tmp_val, "%c)", floor_label[j]);
4461                 }
4462
4463                 /* Clear the line with the (possibly indented) index */
4464                 put_str(tmp_val, j + 1, col);
4465
4466                 /* Display the entry itself */
4467                 c_put_str(out_color[j], out_desc[j], j + 1, col + 3);
4468
4469                 /* Display the weight if needed */
4470                 if (show_weights && (o_ptr->tval != TV_GOLD))
4471                 {
4472                         int wgt = o_ptr->weight * o_ptr->number;
4473 #ifdef JP
4474                         sprintf(tmp_val, "%3d.%1d kg", lbtokg1(wgt) , lbtokg2(wgt) );
4475 #else
4476                         sprintf(tmp_val, "%3d.%1d lb", wgt / 10, wgt % 10);
4477 #endif
4478
4479                         prt(tmp_val, j + 1, wid - 9);
4480                 }
4481         }
4482
4483         /* Make a "shadow" below the list (only if needed) */
4484         if (j && (j < 23)) prt("", j + 1, col ? col - 2 : col);
4485
4486         return target_item_label;
4487 }
4488
4489 /*
4490  * This version of get_item() is called by get_item() when
4491  * the easy_floor is on.
4492  */
4493 bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
4494 {
4495         char n1 = ' ', n2 = ' ', which = ' ';
4496
4497         int j, k, i1, i2, e1, e2;
4498
4499         bool done, item;
4500
4501         bool oops = FALSE;
4502
4503         /* Extract args */
4504         bool equip = (mode & USE_EQUIP) ? TRUE : FALSE;
4505         bool inven = (mode & USE_INVEN) ? TRUE : FALSE;
4506         bool floor = (mode & USE_FLOOR) ? TRUE : FALSE;
4507
4508         bool allow_equip = FALSE;
4509         bool allow_inven = FALSE;
4510         bool allow_floor = FALSE;
4511
4512         bool toggle = FALSE;
4513
4514         char tmp_val[160];
4515         char out_val[160];
4516
4517         int floor_num, floor_list[23], floor_top = 0;
4518         int min_width = 0;
4519
4520         extern bool select_the_force;
4521
4522         int menu_line = (use_menu ? 1 : 0);
4523         int max_inven = 0;
4524         int max_equip = 0;
4525
4526 #ifdef ALLOW_REPEAT
4527
4528         static char prev_tag = '\0';
4529         char cur_tag = '\0';
4530
4531         /* Get the item index */
4532         if (repeat_pull(cp))
4533         {
4534                 /* the_force */
4535                 if (select_the_force && (*cp == INVEN_FORCE))
4536                 {
4537                         item_tester_tval = 0;
4538                         item_tester_hook = NULL;
4539                         command_cmd = 0; /* Hack -- command_cmd is no longer effective */
4540                         return (TRUE);
4541                 }
4542
4543                 /* Floor item? */
4544                 else if (floor && (*cp < 0))
4545                 {
4546                         if (prev_tag && command_cmd)
4547                         {
4548                                 /* Scan all objects in the grid */
4549                                 floor_num = scan_floor(floor_list, py, px, 0x03);
4550
4551                                 /* Look up the tag */
4552                                 if (get_tag_floor(&k, prev_tag, floor_list, floor_num))
4553                                 {
4554                                         /* Accept that choice */
4555                                         (*cp) = 0 - floor_list[k];
4556
4557                                         /* Forget restrictions */
4558                                         item_tester_tval = 0;
4559                                         item_tester_hook = NULL;
4560                                         command_cmd = 0; /* Hack -- command_cmd is no longer effective */
4561
4562                                         /* Success */
4563                                         return TRUE;
4564                                 }
4565
4566                                 prev_tag = '\0'; /* prev_tag is no longer effective */
4567                         }
4568
4569                         /* Validate the item */
4570                         else if (item_tester_okay(&o_list[0 - (*cp)]))
4571                         {
4572                                 /* Forget restrictions */
4573                                 item_tester_tval = 0;
4574                                 item_tester_hook = NULL;
4575                                 command_cmd = 0; /* Hack -- command_cmd is no longer effective */
4576
4577                                 /* Success */
4578                                 return TRUE;
4579                         }
4580                 }
4581
4582                 else if ((inven && (*cp >= 0) && (*cp < INVEN_PACK)) ||
4583                          (equip && (*cp >= INVEN_RARM) && (*cp < INVEN_TOTAL)))
4584                 {
4585                         if (prev_tag && command_cmd)
4586                         {
4587                                 /* Look up the tag and validate the item */
4588                                 if (!get_tag(&k, prev_tag, (*cp >= INVEN_RARM) ? USE_EQUIP : USE_INVEN)) /* Reject */;
4589                                 else if ((k < INVEN_RARM) ? !inven : !equip) /* Reject */;
4590                                 else if (!get_item_okay(k)) /* Reject */;
4591                                 else
4592                                 {
4593                                         /* Accept that choice */
4594                                         (*cp) = k;
4595
4596                                         /* Forget restrictions */
4597                                         item_tester_tval = 0;
4598                                         item_tester_hook = NULL;
4599                                         command_cmd = 0; /* Hack -- command_cmd is no longer effective */
4600
4601                                         /* Success */
4602                                         return TRUE;
4603                                 }
4604
4605                                 prev_tag = '\0'; /* prev_tag is no longer effective */
4606                         }
4607
4608                         /* Verify the item */
4609                         else if (get_item_okay(*cp))
4610                         {
4611                                 /* Forget restrictions */
4612                                 item_tester_tval = 0;
4613                                 item_tester_hook = NULL;
4614                                 command_cmd = 0; /* Hack -- command_cmd is no longer effective */
4615
4616                                 /* Success */
4617                                 return TRUE;
4618                         }
4619                 }
4620         }
4621
4622 #endif /* ALLOW_REPEAT */
4623
4624
4625         /* Paranoia XXX XXX XXX */
4626         msg_print(NULL);
4627
4628
4629         /* Not done */
4630         done = FALSE;
4631
4632         /* No item selected */
4633         item = FALSE;
4634
4635
4636         /* Full inventory */
4637         i1 = 0;
4638         i2 = INVEN_PACK - 1;
4639
4640         /* Forbid inventory */
4641         if (!inven) i2 = -1;
4642         else if (use_menu)
4643         {
4644                 for (j = 0; j < INVEN_PACK; j++)
4645                         if (item_tester_okay(&inventory[j])) max_inven++;
4646         }
4647
4648         /* Restrict inventory indexes */
4649         while ((i1 <= i2) && (!get_item_okay(i1))) i1++;
4650         while ((i1 <= i2) && (!get_item_okay(i2))) i2--;
4651
4652
4653         /* Full equipment */
4654         e1 = INVEN_RARM;
4655         e2 = INVEN_TOTAL - 1;
4656
4657         /* Forbid equipment */
4658         if (!equip) e2 = -1;
4659         else if (use_menu)
4660         {
4661                 for (j = INVEN_RARM; j < INVEN_TOTAL; j++)
4662                         if (select_ring_slot ? is_ring_slot(j) : item_tester_okay(&inventory[j])) max_equip++;
4663                 if (p_ptr->ryoute && !item_tester_no_ryoute) max_equip++;
4664         }
4665
4666         /* Restrict equipment indexes */
4667         while ((e1 <= e2) && (!get_item_okay(e1))) e1++;
4668         while ((e1 <= e2) && (!get_item_okay(e2))) e2--;
4669
4670         if (equip && p_ptr->ryoute && !item_tester_no_ryoute)
4671         {
4672                 if (p_ptr->migite)
4673                 {
4674                         if (e2 < INVEN_LARM) e2 = INVEN_LARM;
4675                 }
4676                 else if (p_ptr->hidarite) e1 = INVEN_RARM;
4677         }
4678
4679
4680         /* Count "okay" floor items */
4681         floor_num = 0;
4682
4683         /* Restrict floor usage */
4684         if (floor)
4685         {
4686                 /* Scan all objects in the grid */
4687                 floor_num = scan_floor(floor_list, py, px, 0x03);
4688         }
4689
4690         /* Accept inventory */
4691         if (i1 <= i2) allow_inven = TRUE;
4692
4693         /* Accept equipment */
4694         if (e1 <= e2) allow_equip = TRUE;
4695
4696         /* Accept floor */
4697         if (floor_num) allow_floor = TRUE;
4698
4699         /* Require at least one legal choice */
4700         if (!allow_inven && !allow_equip && !allow_floor)
4701         {
4702                 /* Cancel p_ptr->command_see */
4703                 command_see = FALSE;
4704
4705                 /* Oops */
4706                 oops = TRUE;
4707
4708                 /* Done */
4709                 done = TRUE;
4710
4711                 if (select_the_force) {
4712                     *cp = INVEN_FORCE;
4713                     item = TRUE;
4714                 }
4715         }
4716
4717         /* Analyze choices */
4718         else
4719         {
4720                 /* Hack -- Start on equipment if requested */
4721                 if (command_see && (command_wrk == (USE_EQUIP))
4722                         && allow_equip)
4723                 {
4724                         command_wrk = (USE_EQUIP);
4725                 }
4726
4727                 /* Use inventory if allowed */
4728                 else if (allow_inven)
4729                 {
4730                         command_wrk = (USE_INVEN);
4731                 }
4732
4733                 /* Use equipment if allowed */
4734                 else if (allow_equip)
4735                 {
4736                         command_wrk = (USE_EQUIP);
4737                 }
4738
4739                 /* Use floor if allowed */
4740                 else if (allow_floor)
4741                 {
4742                         command_wrk = (USE_FLOOR);
4743                 }
4744         }
4745
4746         /*
4747          * Äɲ媥ץ·¥ç¥ó(always_show_list)¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¾ï¤Ë°ìÍ÷¤òɽ¼¨¤¹¤ë
4748          */
4749         if ((always_show_list == TRUE) || use_menu) command_see = TRUE;
4750
4751         /* Hack -- start out in "display" mode */
4752         if (command_see)
4753         {
4754                 /* Save screen */
4755                 screen_save();
4756         }
4757
4758         /* Repeat until done */
4759         while (!done)
4760         {
4761                 int get_item_label = 0;
4762
4763                 /* Show choices */
4764                 int ni = 0;
4765                 int ne = 0;
4766
4767                 /* Scan windows */
4768                 for (j = 0; j < 8; j++)
4769                 {
4770                         /* Unused */
4771                         if (!angband_term[j]) continue;
4772
4773                         /* Count windows displaying inven */
4774                         if (window_flag[j] & (PW_INVEN)) ni++;
4775
4776                         /* Count windows displaying equip */
4777                         if (window_flag[j] & (PW_EQUIP)) ne++;
4778                 }
4779
4780                 /* Toggle if needed */
4781                 if ((command_wrk == (USE_EQUIP) && ni && !ne) ||
4782                     (command_wrk == (USE_INVEN) && !ni && ne))
4783                 {
4784                         /* Toggle */
4785                         toggle_inven_equip();
4786
4787                         /* Track toggles */
4788                         toggle = !toggle;
4789                 }
4790
4791                 /* Update */
4792                 p_ptr->window |= (PW_INVEN | PW_EQUIP);
4793
4794                 /* Redraw windows */
4795                 window_stuff();
4796
4797                 /* Inventory screen */
4798                 if (command_wrk == (USE_INVEN))
4799                 {
4800                         /* Extract the legal requests */
4801                         n1 = I2A(i1);
4802                         n2 = I2A(i2);
4803
4804                         /* Redraw if needed */
4805                         if (command_see) get_item_label = show_inven(menu_line);
4806                 }
4807
4808                 /* Equipment screen */
4809                 else if (command_wrk == (USE_EQUIP))
4810                 {
4811                         /* Extract the legal requests */
4812                         n1 = I2A(e1 - INVEN_RARM);
4813                         n2 = I2A(e2 - INVEN_RARM);
4814
4815                         /* Redraw if needed */
4816                         if (command_see) get_item_label = show_equip(menu_line);
4817                 }
4818
4819                 /* Floor screen */
4820                 else if (command_wrk == (USE_FLOOR))
4821                 {
4822                         j = floor_top;
4823                         k = MIN(floor_top + 23, floor_num) - 1;
4824
4825                         /* Extract the legal requests */
4826                         n1 = I2A(j - floor_top);
4827                         n2 = I2A(k - floor_top);
4828
4829                         /* Redraw if needed */
4830                         if (command_see) get_item_label = show_floor(menu_line, py, px, &min_width);
4831                 }
4832
4833                 /* Viewing inventory */
4834                 if (command_wrk == (USE_INVEN))
4835                 {
4836                         /* Begin the prompt */
4837 #ifdef JP
4838                         sprintf(out_val, "»ý¤Áʪ:");
4839 #else
4840                         sprintf(out_val, "Inven:");
4841 #endif
4842
4843                         if (!use_menu)
4844                         {
4845                                 /* Build the prompt */
4846 #ifdef JP
4847                                 sprintf(tmp_val, "%c-%c,'(',')',",
4848 #else
4849                                 sprintf(tmp_val, " %c-%c,'(',')',",
4850 #endif
4851                                         index_to_label(i1), index_to_label(i2));
4852
4853                                 /* Append */
4854                                 strcat(out_val, tmp_val);
4855                         }
4856
4857                         /* Indicate ability to "view" */
4858 #ifdef JP
4859                         if (!command_see && !use_menu) strcat(out_val, " '*'°ìÍ÷,");
4860 #else
4861                         if (!command_see && !use_menu) strcat(out_val, " * to see,");
4862 #endif
4863
4864                         /* Append */
4865                         if (allow_equip)
4866                         {
4867 #ifdef JP
4868                                 if (!use_menu)
4869                                         strcat(out_val, " '/' ÁõÈ÷ÉÊ,");
4870                                 else if (allow_floor)
4871                                         strcat(out_val, " '6' ÁõÈ÷ÉÊ,");
4872                                 else
4873                                         strcat(out_val, " '4'or'6' ÁõÈ÷ÉÊ,");
4874 #else
4875                                 if (!use_menu)
4876                                         strcat(out_val, " / for Equip,");
4877                                 else if (allow_floor)
4878                                         strcat(out_val, " 6 for Equip,");
4879                                 else
4880                                         strcat(out_val, " 4 or 6 for Equip,");
4881 #endif
4882                         }
4883
4884                         /* Append */
4885                         if (allow_floor)
4886                         {
4887 #ifdef JP
4888                                 if (!use_menu)
4889                                         strcat(out_val, " '-'¾²¾å,");
4890                                 else if (allow_equip)
4891                                         strcat(out_val, " '4' ¾²¾å,");
4892                                 else
4893                                         strcat(out_val, " '4'or'6' ¾²¾å,");
4894 #else
4895                                 if (!use_menu)
4896                                         strcat(out_val, " - for floor,");
4897                                 else if (allow_equip)
4898                                         strcat(out_val, " 4 for floor,");
4899                                 else
4900                                         strcat(out_val, " 4 or 6 for floor,");
4901 #endif
4902                         }
4903                 }
4904
4905                 /* Viewing equipment */
4906                 else if (command_wrk == (USE_EQUIP))
4907                 {
4908                         /* Begin the prompt */
4909 #ifdef JP
4910                         sprintf(out_val, "ÁõÈ÷ÉÊ:");
4911 #else
4912                         sprintf(out_val, "Equip:");
4913 #endif
4914
4915                         if (!use_menu)
4916                         {
4917                                 /* Build the prompt */
4918 #ifdef JP
4919                                 sprintf(tmp_val, "%c-%c,'(',')',",
4920 #else
4921                                 sprintf(tmp_val, " %c-%c,'(',')',",
4922 #endif
4923                                         index_to_label(e1), index_to_label(e2));
4924
4925                                 /* Append */
4926                                 strcat(out_val, tmp_val);
4927                         }
4928
4929                         /* Indicate ability to "view" */
4930 #ifdef JP
4931                         if (!command_see && !use_menu) strcat(out_val, " '*'°ìÍ÷,");
4932 #else
4933                         if (!command_see && !use_menu) strcat(out_val, " * to see,");
4934 #endif
4935
4936                         /* Append */
4937                         if (allow_inven)
4938                         {
4939 #ifdef JP
4940                                 if (!use_menu)
4941                                         strcat(out_val, " '/' »ý¤Áʪ,");
4942                                 else if (allow_floor)
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 Inven,");
4949                                 else if (allow_floor)
4950                                         strcat(out_val, " 4 for Inven,");
4951                                 else
4952                                         strcat(out_val, " 4 or 6 for Inven,");
4953 #endif
4954                         }
4955
4956                         /* Append */
4957                         if (allow_floor)
4958                         {
4959 #ifdef JP
4960                                 if (!use_menu)
4961                                         strcat(out_val, " '-'¾²¾å,");
4962                                 else if (allow_inven)
4963                                         strcat(out_val, " '6' ¾²¾å,");
4964                                 else
4965                                         strcat(out_val, " '4'or'6' ¾²¾å,");
4966 #else
4967                                 if (!use_menu)
4968                                         strcat(out_val, " - for floor,");
4969                                 else if (allow_inven)
4970                                         strcat(out_val, " 6 for floor,");
4971                                 else
4972                                         strcat(out_val, " 4 or 6 for floor,");
4973 #endif
4974                         }
4975                 }
4976
4977                 /* Viewing floor */
4978                 else if (command_wrk == (USE_FLOOR))
4979                 {
4980                         /* Begin the prompt */
4981 #ifdef JP
4982                         sprintf(out_val, "¾²¾å:");
4983 #else
4984                         sprintf(out_val, "Floor:");
4985 #endif
4986
4987                         if (!use_menu)
4988                         {
4989                                 /* Build the prompt */
4990 #ifdef JP
4991                                 sprintf(tmp_val, "%c-%c,'(',')',", n1, n2);
4992 #else
4993                                 sprintf(tmp_val, " %c-%c,'(',')',", n1, n2);
4994 #endif
4995
4996                                 /* Append */
4997                                 strcat(out_val, tmp_val);
4998                         }
4999
5000                         /* Indicate ability to "view" */
5001 #ifdef JP
5002                         if (!command_see && !use_menu) strcat(out_val, " '*'°ìÍ÷,");
5003 #else
5004                         if (!command_see && !use_menu) strcat(out_val, " * to see,");
5005 #endif
5006
5007                         if (use_menu)
5008                         {
5009                                 if (allow_inven && allow_equip)
5010                                 {
5011 #ifdef JP
5012                                         strcat(out_val, " '4' ÁõÈ÷ÉÊ, '6' »ý¤Áʪ,");
5013 #else
5014                                         strcat(out_val, " 4 for Equip, 6 for Inven,");
5015 #endif
5016                                 }
5017                                 else if (allow_inven)
5018                                 {
5019 #ifdef JP
5020                                         strcat(out_val, " '4'or'6' »ý¤Áʪ,");
5021 #else
5022                                         strcat(out_val, " 4 or 6 for Inven,");
5023 #endif
5024                                 }
5025                                 else if (allow_equip)
5026                                 {
5027 #ifdef JP
5028                                         strcat(out_val, " '4'or'6' ÁõÈ÷ÉÊ,");
5029 #else
5030                                         strcat(out_val, " 4 or 6 for Equip,");
5031 #endif
5032                                 }
5033                         }
5034                         /* Append */
5035                         else if (allow_inven)
5036                         {
5037 #ifdef JP
5038                                 strcat(out_val, " '/' »ý¤Áʪ,");
5039 #else
5040                                 strcat(out_val, " / for Inven,");
5041 #endif
5042                         }
5043                         else if (allow_equip)
5044                         {
5045 #ifdef JP
5046                                 strcat(out_val, " '/'ÁõÈ÷ÉÊ,");
5047 #else
5048                                 strcat(out_val, " / for Equip,");
5049 #endif
5050                         }
5051
5052                         /* Append */
5053                         if (command_see && !use_menu)
5054                         {
5055 #ifdef JP
5056                                 strcat(out_val, " Enter ¼¡,");
5057 #else
5058                                 strcat(out_val, " Enter for scroll down,");
5059 #endif
5060                         }
5061                 }
5062
5063                 /* Append */
5064 #ifdef JP
5065                 if (select_the_force) strcat(out_val, " 'w'Îýµ¤½Ñ,");
5066 #else
5067                 if (select_the_force) strcat(out_val, " w for the Force,");
5068 #endif
5069
5070                 /* Finish the prompt */
5071                 strcat(out_val, " ESC");
5072
5073                 /* Build the prompt */
5074                 sprintf(tmp_val, "(%s) %s", out_val, pmt);
5075
5076                 /* Show the prompt */
5077                 prt(tmp_val, 0, 0);
5078
5079                 /* Get a key */
5080                 which = inkey();
5081
5082                 if (use_menu)
5083                 {
5084                 int max_line = 1;
5085                 if (command_wrk == USE_INVEN) max_line = max_inven;
5086                 else if (command_wrk == USE_EQUIP) max_line = max_equip;
5087                 else if (command_wrk == USE_FLOOR) max_line = MIN(23, floor_num);
5088                 switch (which)
5089                 {
5090                         case ESCAPE:
5091                         case 'z':
5092                         case 'Z':
5093                         case '0':
5094                         {
5095                                 done = TRUE;
5096                                 break;
5097                         }
5098
5099                         case '8':
5100                         case 'k':
5101                         case 'K':
5102                         {
5103                                 menu_line += (max_line - 1);
5104                                 break;
5105                         }
5106
5107                         case '2':
5108                         case 'j':
5109                         case 'J':
5110                         {
5111                                 menu_line++;
5112                                 break;
5113                         }
5114
5115                         case '4':
5116                         case 'h':
5117                         case 'H':
5118                         {
5119                                 /* Verify legality */
5120                                 if (command_wrk == (USE_INVEN))
5121                                 {
5122                                         if (allow_floor) command_wrk = USE_FLOOR;
5123                                         else if (allow_equip) command_wrk = USE_EQUIP;
5124                                         else
5125                                         {
5126                                                 bell();
5127                                                 break;
5128                                         }
5129                                 }
5130                                 else if (command_wrk == (USE_EQUIP))
5131                                 {
5132                                         if (allow_inven) command_wrk = USE_INVEN;
5133                                         else if (allow_floor) command_wrk = USE_FLOOR;
5134                                         else
5135                                         {
5136                                                 bell();
5137                                                 break;
5138                                         }
5139                                 }
5140                                 else if (command_wrk == (USE_FLOOR))
5141                                 {
5142                                         if (allow_equip) command_wrk = USE_EQUIP;
5143                                         else if (allow_inven) command_wrk = USE_INVEN;
5144                                         else
5145                                         {
5146                                                 bell();
5147                                                 break;
5148                                         }
5149                                 }
5150                                 else
5151                                 {
5152                                         bell();
5153                                         break;
5154                                 }
5155
5156                                 /* Hack -- Fix screen */
5157                                 if (command_see)
5158                                 {
5159                                         /* Load screen */
5160                                         screen_load();
5161
5162                                         /* Save screen */
5163                                         screen_save();
5164                                 }
5165
5166                                 /* Switch inven/equip */
5167                                 if (command_wrk == USE_INVEN) max_line = max_inven;
5168                                 else if (command_wrk == USE_EQUIP) max_line = max_equip;
5169                                 else if (command_wrk == USE_FLOOR) max_line = MIN(23, floor_num);
5170                                 if (menu_line > max_line) menu_line = max_line;
5171
5172                                 /* Need to redraw */
5173                                 break;
5174                         }
5175
5176                         case '6':
5177                         case 'l':
5178                         case 'L':
5179                         {
5180                                 /* Verify legality */
5181                                 if (command_wrk == (USE_INVEN))
5182                                 {
5183                                         if (allow_equip) command_wrk = USE_EQUIP;
5184                                         else if (allow_floor) command_wrk = USE_FLOOR;
5185                                         else
5186                                         {
5187                                                 bell();
5188                                                 break;
5189                                         }
5190                                 }
5191                                 else if (command_wrk == (USE_EQUIP))
5192                                 {
5193                                         if (allow_floor) command_wrk = USE_FLOOR;
5194                                         else if (allow_inven) command_wrk = USE_INVEN;
5195                                         else
5196                                         {
5197                                                 bell();
5198                                                 break;
5199                                         }
5200                                 }
5201                                 else if (command_wrk == (USE_FLOOR))
5202                                 {
5203                                         if (allow_inven) command_wrk = USE_INVEN;
5204                                         else if (allow_equip) command_wrk = USE_EQUIP;
5205                                         else
5206                                         {
5207                                                 bell();
5208                                                 break;
5209                                         }
5210                                 }
5211                                 else
5212                                 {
5213                                         bell();
5214                                         break;
5215                                 }
5216
5217                                 /* Hack -- Fix screen */
5218                                 if (command_see)
5219                                 {
5220                                         /* Load screen */
5221                                         screen_load();
5222
5223                                         /* Save screen */
5224                                         screen_save();
5225                                 }
5226
5227                                 /* Switch inven/equip */
5228                                 if (command_wrk == USE_INVEN) max_line = max_inven;
5229                                 else if (command_wrk == USE_EQUIP) max_line = max_equip;
5230                                 else if (command_wrk == USE_FLOOR) max_line = MIN(23, floor_num);
5231                                 if (menu_line > max_line) menu_line = max_line;
5232
5233                                 /* Need to redraw */
5234                                 break;
5235                         }
5236
5237                         case 'x':
5238                         case 'X':
5239                         case '\r':
5240                         case '\n':
5241                         {
5242                                 if (command_wrk == USE_FLOOR)
5243                                 {
5244                                         /* Special index */
5245                                         (*cp) = -get_item_label;
5246                                 }
5247                                 else
5248                                 {
5249                                         /* Validate the item */
5250                                         if (!get_item_okay(get_item_label))
5251                                         {
5252                                                 bell();
5253                                                 break;
5254                                         }
5255
5256                                         /* Allow player to "refuse" certain actions */
5257                                         if (!get_item_allow(get_item_label))
5258                                         {
5259                                                 done = TRUE;
5260                                                 break;
5261                                         }
5262
5263                                         /* Accept that choice */
5264                                         (*cp) = get_item_label;
5265                                 }
5266
5267                                 item = TRUE;
5268                                 done = TRUE;
5269                                 break;
5270                         }
5271                         case 'w':
5272                         {
5273                                 if (select_the_force) {
5274                                         *cp = INVEN_FORCE;
5275                                         item = TRUE;
5276                                         done = TRUE;
5277                                         break;
5278                                 }
5279                         }
5280                 }
5281                 if (menu_line > max_line) menu_line -= max_line;
5282                 }
5283                 else
5284                 {
5285                 /* Parse it */
5286                 switch (which)
5287                 {
5288                         case ESCAPE:
5289                         {
5290                                 done = TRUE;
5291                                 break;
5292                         }
5293
5294                         case '*':
5295                         case '?':
5296                         case ' ':
5297                         {
5298                                 /* Hide the list */
5299                                 if (command_see)
5300                                 {
5301                                         /* Flip flag */
5302                                         command_see = FALSE;
5303
5304                                         /* Load screen */
5305                                         screen_load();
5306                                 }
5307
5308                                 /* Show the list */
5309                                 else
5310                                 {
5311                                         /* Save screen */
5312                                         screen_save();
5313
5314                                         /* Flip flag */
5315                                         command_see = TRUE;
5316                                 }
5317                                 break;
5318                         }
5319
5320                         case '\n':
5321                         case '\r':
5322                         case '+':
5323                         {
5324                                 int i, o_idx;
5325                                 cave_type *c_ptr = &cave[py][px];
5326
5327                                 if (command_wrk != (USE_FLOOR)) break;
5328
5329                                 /* Get the object being moved. */
5330                                 o_idx = c_ptr->o_idx;
5331
5332                                 /* Only rotate a pile of two or more objects. */
5333                                 if (!(o_idx && o_list[o_idx].next_o_idx)) break;
5334
5335                                 /* Remove the first object from the list. */
5336                                 excise_object_idx(o_idx);
5337
5338                                 /* Find end of the list. */
5339                                 i = c_ptr->o_idx;
5340                                 while (o_list[i].next_o_idx)
5341                                         i = o_list[i].next_o_idx;
5342
5343                                 /* Add after the last object. */
5344                                 o_list[i].next_o_idx = o_idx;
5345
5346                                 /* Re-scan floor list */ 
5347                                 floor_num = scan_floor(floor_list, py, px, 0x03);
5348
5349                                 /* Hack -- Fix screen */
5350                                 if (command_see)
5351                                 {
5352                                         /* Load screen */
5353                                         screen_load();
5354
5355                                         /* Save screen */
5356                                         screen_save();
5357                                 }
5358
5359                                 break;
5360                         }
5361
5362                         case '/':
5363                         {
5364                                 if (command_wrk == (USE_INVEN))
5365                                 {
5366                                         if (!allow_equip)
5367                                         {
5368                                                 bell();
5369                                                 break;
5370                                         }
5371                                         command_wrk = (USE_EQUIP);
5372                                 }
5373                                 else if (command_wrk == (USE_EQUIP))
5374                                 {
5375                                         if (!allow_inven)
5376                                         {
5377                                                 bell();
5378                                                 break;
5379                                         }
5380                                         command_wrk = (USE_INVEN);
5381                                 }
5382                                 else if (command_wrk == (USE_FLOOR))
5383                                 {
5384                                         if (allow_inven)
5385                                         {
5386                                                 command_wrk = (USE_INVEN);
5387                                         }
5388                                         else if (allow_equip)
5389                                         {
5390                                                 command_wrk = (USE_EQUIP);
5391                                         }
5392                                         else
5393                                         {
5394                                                 bell();
5395                                                 break;
5396                                         }
5397                                 }
5398
5399                                 /* Hack -- Fix screen */
5400                                 if (command_see)
5401                                 {
5402                                         /* Load screen */
5403                                         screen_load();
5404
5405                                         /* Save screen */
5406                                         screen_save();
5407                                 }
5408
5409                                 /* Need to redraw */
5410                                 break;
5411                         }
5412
5413                         case '-':
5414                         {
5415                                 if (!allow_floor)
5416                                 {
5417                                         bell();
5418                                         break;
5419                                 }
5420
5421                                 /*
5422                                  * If we are already examining the floor, and there
5423                                  * is only one item, we will always select it.
5424                                  * If we aren't examining the floor and there is only
5425                                  * one item, we will select it if floor_query_flag
5426                                  * is FALSE.
5427                                  */
5428                                 if (floor_num == 1)
5429                                 {
5430                                         if ((command_wrk == (USE_FLOOR)) || (!carry_query_flag))
5431                                         {
5432                                                 /* Special index */
5433                                                 k = 0 - floor_list[0];
5434
5435                                                 /* Allow player to "refuse" certain actions */
5436                                                 if (!get_item_allow(k))
5437                                                 {
5438                                                         done = TRUE;
5439                                                         break;
5440                                                 }
5441
5442                                                 /* Accept that choice */
5443                                                 (*cp) = k;
5444                                                 item = TRUE;
5445                                                 done = TRUE;
5446
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                                 command_wrk = (USE_FLOOR);
5462
5463                                 break;
5464                         }
5465
5466                         case '0':
5467                         case '1': case '2': case '3':
5468                         case '4': case '5': case '6':
5469                         case '7': case '8': case '9':
5470                         {
5471                                 if (command_wrk != USE_FLOOR)
5472                                 {
5473                                         /* Look up the tag */
5474                                         if (!get_tag(&k, which, command_wrk))
5475                                         {
5476                                                 bell();
5477                                                 break;
5478                                         }
5479
5480                                         /* Hack -- Validate the item */
5481                                         if ((k < INVEN_RARM) ? !inven : !equip)
5482                                         {
5483                                                 bell();
5484                                                 break;
5485                                         }
5486
5487                                         /* Validate the item */
5488                                         if (!get_item_okay(k))
5489                                         {
5490                                                 bell();
5491                                                 break;
5492                                         }
5493                                 }
5494                                 else
5495                                 {
5496                                         /* Look up the alphabetical tag */
5497                                         if (get_tag_floor(&k, which, floor_list, floor_num))
5498                                         {
5499                                                 /* Special index */
5500                                                 k = 0 - floor_list[k];
5501                                         }
5502                                         else
5503                                         {
5504                                                 bell();
5505                                                 break;
5506                                         }
5507                                 }
5508
5509                                 /* Allow player to "refuse" certain actions */
5510                                 if (!get_item_allow(k))
5511                                 {
5512                                         done = TRUE;
5513                                         break;
5514                                 }
5515
5516                                 /* Accept that choice */
5517                                 (*cp) = k;
5518                                 item = TRUE;
5519                                 done = TRUE;
5520 #ifdef ALLOW_REPEAT
5521                                 cur_tag = which;
5522 #endif /* ALLOW_REPEAT */
5523                                 break;
5524                         }
5525
5526 #if 0
5527                         case '\n':
5528                         case '\r':
5529                         {
5530                                 /* Choose "default" inventory item */
5531                                 if (command_wrk == (USE_INVEN))
5532                                 {
5533                                         k = ((i1 == i2) ? i1 : -1);
5534                                 }
5535
5536                                 /* Choose "default" equipment item */
5537                                 else if (command_wrk == (USE_EQUIP))
5538                                 {
5539                                         k = ((e1 == e2) ? e1 : -1);
5540                                 }
5541
5542                                 /* Choose "default" floor item */
5543                                 else if (command_wrk == (USE_FLOOR))
5544                                 {
5545                                         if (floor_num == 1)
5546                                         {
5547                                                 /* Special index */
5548                                                 k = 0 - floor_list[0];
5549
5550                                                 /* Allow player to "refuse" certain actions */
5551                                                 if (!get_item_allow(k))
5552                                                 {
5553                                                         done = TRUE;
5554                                                         break;
5555                                                 }
5556
5557                                                 /* Accept that choice */
5558                                                 (*cp) = k;
5559                                                 item = TRUE;
5560                                                 done = TRUE;
5561                                         }
5562                                         break;
5563                                 }
5564
5565                                 /* Validate the item */
5566                                 if (!get_item_okay(k))
5567                                 {
5568                                         bell();
5569                                         break;
5570                                 }
5571
5572                                 /* Allow player to "refuse" certain actions */
5573                                 if (!get_item_allow(k))
5574                                 {
5575                                         done = TRUE;
5576                                         break;
5577                                 }
5578
5579                                 /* Accept that choice */
5580                                 (*cp) = k;
5581                                 item = TRUE;
5582                                 done = TRUE;
5583                                 break;
5584                         }
5585 #endif
5586
5587                         case 'w':
5588                         {
5589                                 if (select_the_force) {
5590                                         *cp = INVEN_FORCE;
5591                                         item = TRUE;
5592                                         done = TRUE;
5593                                         break;
5594                                 }
5595
5596                                 /* Fall through */
5597                         }
5598
5599                         default:
5600                         {
5601                                 int ver;
5602
5603                                 if (command_wrk != USE_FLOOR)
5604                                 {
5605                                         bool not_found = FALSE;
5606
5607                                         /* Look up the alphabetical tag */
5608                                         if (!get_tag(&k, which, command_wrk))
5609                                         {
5610                                                 not_found = TRUE;
5611                                         }
5612
5613                                         /* Hack -- Validate the item */
5614                                         else if ((k < INVEN_RARM) ? !inven : !equip)
5615                                         {
5616                                                 not_found = TRUE;
5617                                         }
5618
5619                                         /* Validate the item */
5620                                         else if (!get_item_okay(k))
5621                                         {
5622                                                 not_found = TRUE;
5623                                         }
5624
5625                                         if (!not_found)
5626                                         {
5627                                                 /* Accept that choice */
5628                                                 (*cp) = k;
5629                                                 item = TRUE;
5630                                                 done = TRUE;
5631 #ifdef ALLOW_REPEAT
5632                                                 cur_tag = which;
5633 #endif /* ALLOW_REPEAT */
5634                                                 break;
5635                                         }
5636                                 }
5637                                 else
5638                                 {
5639                                         /* Look up the alphabetical tag */
5640                                         if (get_tag_floor(&k, which, floor_list, floor_num))
5641                                         {
5642                                                 /* Special index */
5643                                                 k = 0 - floor_list[k];
5644
5645                                                 /* Accept that choice */
5646                                                 (*cp) = k;
5647                                                 item = TRUE;
5648                                                 done = TRUE;
5649 #ifdef ALLOW_REPEAT
5650                                                 cur_tag = which;
5651 #endif /* ALLOW_REPEAT */
5652                                                 break;
5653                                         }
5654                                 }
5655
5656                                 /* Extract "query" setting */
5657                                 ver = isupper(which);
5658                                 which = tolower(which);
5659
5660                                 /* Convert letter to inventory index */
5661                                 if (command_wrk == (USE_INVEN))
5662                                 {
5663                                         if (which == '(') k = i1;
5664                                         else if (which == ')') k = i2;
5665                                         else k = label_to_inven(which);
5666                                 }
5667
5668                                 /* Convert letter to equipment index */
5669                                 else if (command_wrk == (USE_EQUIP))
5670                                 {
5671                                         if (which == '(') k = e1;
5672                                         else if (which == ')') k = e2;
5673                                         else k = label_to_equip(which);
5674                                 }
5675
5676                                 /* Convert letter to floor index */
5677                                 else if (command_wrk == USE_FLOOR)
5678                                 {
5679                                         if (which == '(') k = 0;
5680                                         else if (which == ')') k = floor_num - 1;
5681                                         else k = islower(which) ? A2I(which) : -1;
5682                                         if (k < 0 || k >= floor_num || k >= 23)
5683                                         {
5684                                                 bell();
5685                                                 break;
5686                                         }
5687
5688                                         /* Special index */
5689                                         k = 0 - floor_list[k];
5690                                 }
5691
5692                                 /* Validate the item */
5693                                 if ((command_wrk != USE_FLOOR) && !get_item_okay(k))
5694                                 {
5695                                         bell();
5696                                         break;
5697                                 }
5698
5699                                 /* Verify the item */
5700 #ifdef JP
5701 if (ver && !verify("ËÜÅö¤Ë", k))
5702 #else
5703                                 if (ver && !verify("Try", k))
5704 #endif
5705
5706                                 {
5707                                         done = TRUE;
5708                                         break;
5709                                 }
5710
5711                                 /* Allow player to "refuse" certain actions */
5712                                 if (!get_item_allow(k))
5713                                 {
5714                                         done = TRUE;
5715                                         break;
5716                                 }
5717
5718                                 /* Accept that choice */
5719                                 (*cp) = k;
5720                                 item = TRUE;
5721                                 done = TRUE;
5722                                 break;
5723                         }
5724                 }
5725                 }
5726         }
5727
5728         /* Fix the screen if necessary */
5729         if (command_see)
5730         {
5731                 /* Load screen */
5732                 screen_load();
5733
5734                 /* Hack -- Cancel "display" */
5735                 command_see = FALSE;
5736         }
5737
5738
5739         /* Forget the item_tester_tval restriction */
5740         item_tester_tval = 0;
5741
5742         /* Forget the item_tester_hook restriction */
5743         item_tester_hook = NULL;
5744
5745
5746         /* Clean up  'show choices' */
5747         /* Toggle again if needed */
5748         if (toggle) toggle_inven_equip();
5749
5750         /* Update */
5751         p_ptr->window |= (PW_INVEN | PW_EQUIP);
5752
5753         /* Window stuff */
5754         window_stuff();
5755
5756
5757         /* Clear the prompt line */
5758         prt("", 0, 0);
5759
5760         /* Warning if needed */
5761         if (oops && str) msg_print(str);
5762
5763         if (item)
5764         {
5765 #ifdef ALLOW_REPEAT
5766                 repeat_push(*cp);
5767                 if (command_cmd) prev_tag = cur_tag;
5768 #endif /* ALLOW_REPEAT */
5769
5770                 command_cmd = 0; /* Hack -- command_cmd is no longer effective */
5771         }
5772
5773         /* Result */
5774         return (item);
5775 }
5776
5777
5778 static bool py_pickup_floor_aux(void)
5779 {
5780         s16b this_o_idx;
5781
5782         cptr q, s;
5783
5784         int item;
5785
5786         /* Restrict the choices */
5787         item_tester_hook = inven_carry_okay;
5788
5789         /* Get an object */
5790 #ifdef JP
5791         q = "¤É¤ì¤ò½¦¤¤¤Þ¤¹¤«¡©";
5792         s = "¤â¤¦¥¶¥Ã¥¯¤Ë¤Ï¾²¤Ë¤¢¤ë¤É¤Î¥¢¥¤¥Æ¥à¤âÆþ¤é¤Ê¤¤¡£";
5793 #else
5794         q = "Get which item? ";
5795         s = "You no longer have any room for the objects on the floor.";
5796 #endif
5797
5798         if (get_item(&item, q, s, (USE_FLOOR)))
5799         {
5800                 this_o_idx = 0 - item;
5801         }
5802         else
5803         {
5804                 return (FALSE);
5805         }
5806
5807         /* Pick up the object */
5808         py_pickup_aux(this_o_idx);
5809
5810         return (TRUE);
5811 }
5812
5813
5814 /*
5815  * Make the player carry everything in a grid
5816  *
5817  * If "pickup" is FALSE then only gold will be picked up
5818  *
5819  * This is called by py_pickup() when easy_floor is TRUE.
5820  */
5821 void py_pickup_floor(bool pickup)
5822 {
5823         s16b this_o_idx, next_o_idx = 0;
5824
5825         char o_name[MAX_NLEN];
5826         object_type *o_ptr;
5827
5828         int floor_num = 0, floor_o_idx = 0;
5829
5830         int can_pickup = 0;
5831
5832         /* Scan the pile of objects */
5833         for (this_o_idx = cave[py][px].o_idx; this_o_idx; this_o_idx = next_o_idx)
5834         {
5835                 object_type *o_ptr;
5836
5837                 /* Access the object */
5838                 o_ptr = &o_list[this_o_idx];
5839
5840                 /* Describe the object */
5841                 object_desc(o_name, o_ptr, 0);
5842
5843                 /* Access the next object */
5844                 next_o_idx = o_ptr->next_o_idx;
5845
5846                 /* Hack -- disturb */
5847                 disturb(0, 0);
5848
5849                 /* Pick up gold */
5850                 if (o_ptr->tval == TV_GOLD)
5851                 {
5852                         /* Message */
5853 #ifdef JP
5854                 msg_format(" $%ld ¤Î²ÁÃͤ¬¤¢¤ë%s¤ò¸«¤Ä¤±¤¿¡£",
5855                            (long)o_ptr->pval, o_name);
5856 #else
5857                         msg_format("You have found %ld gold pieces worth of %s.",
5858                                 (long) o_ptr->pval, o_name);
5859 #endif
5860
5861
5862                         /* Collect the gold */
5863                         p_ptr->au += o_ptr->pval;
5864
5865                         /* Redraw gold */
5866                         p_ptr->redraw |= (PR_GOLD);
5867
5868                         /* Window stuff */
5869                         p_ptr->window |= (PW_PLAYER);
5870
5871                         /* Delete the gold */
5872                         delete_object_idx(this_o_idx);
5873
5874                         /* Check the next object */
5875                         continue;
5876                 }
5877                 else if (o_ptr->marked & OM_NOMSG)
5878                 {
5879                         /* If 0 or 1 non-NOMSG items are in the pile, the NOMSG ones are
5880                          * ignored. Otherwise, they are included in the prompt. */
5881                         o_ptr->marked &= ~(OM_NOMSG);
5882                         continue;
5883                 }
5884
5885                 /* Count non-gold objects that can be picked up. */
5886                 if (inven_carry_okay(o_ptr))
5887                 {
5888                         can_pickup++;
5889                 }
5890
5891                 /* Count non-gold objects */
5892                 floor_num++;
5893
5894                 /* Remember this index */
5895                 floor_o_idx = this_o_idx;
5896         }
5897
5898         /* There are no non-gold objects */
5899         if (!floor_num)
5900                 return;
5901
5902         /* Mention the number of objects */
5903         if (!pickup)
5904         {
5905                 /* One object */
5906                 if (floor_num == 1)
5907                 {
5908                         /* Access the object */
5909                         o_ptr = &o_list[floor_o_idx];
5910
5911 #ifdef ALLOW_EASY_SENSE
5912
5913                         /* Option: Make object sensing easy */
5914                         if (easy_sense)
5915                         {
5916                                 /* Sense the object */
5917                                 (void) sense_object(o_ptr);
5918                         }
5919
5920 #endif /* ALLOW_EASY_SENSE */
5921
5922                         /* Describe the object */
5923                         object_desc(o_name, o_ptr, 0);
5924
5925                         /* Message */
5926 #ifdef JP
5927                                 msg_format("%s¤¬¤¢¤ë¡£", o_name);
5928 #else
5929                         msg_format("You see %s.", o_name);
5930 #endif
5931
5932                 }
5933
5934                 /* Multiple objects */
5935                 else
5936                 {
5937                         /* Message */
5938 #ifdef JP
5939                         msg_format("%d ¸Ä¤Î¥¢¥¤¥Æ¥à¤Î»³¤¬¤¢¤ë¡£", floor_num);
5940 #else
5941                         msg_format("You see a pile of %d items.", floor_num);
5942 #endif
5943
5944                 }
5945
5946                 /* Done */
5947                 return;
5948         }
5949
5950         /* The player has no room for anything on the floor. */
5951         if (!can_pickup)
5952         {
5953                 /* One object */
5954                 if (floor_num == 1)
5955                 {
5956                         /* Access the object */
5957                         o_ptr = &o_list[floor_o_idx];
5958
5959 #ifdef ALLOW_EASY_SENSE
5960
5961                         /* Option: Make object sensing easy */
5962                         if (easy_sense)
5963                         {
5964                                 /* Sense the object */
5965                                 (void) sense_object(o_ptr);
5966                         }
5967
5968 #endif /* ALLOW_EASY_SENSE */
5969
5970                         /* Describe the object */
5971                         object_desc(o_name, o_ptr, 0);
5972
5973                         /* Message */
5974 #ifdef JP
5975                                 msg_format("¥¶¥Ã¥¯¤Ë¤Ï%s¤òÆþ¤ì¤ë·ä´Ö¤¬¤Ê¤¤¡£", o_name);
5976 #else
5977                         msg_format("You have no room for %s.", o_name);
5978 #endif
5979
5980                 }
5981
5982                 /* Multiple objects */
5983                 else
5984                 {
5985                         /* Message */
5986 #ifdef JP
5987                         msg_format("¥¶¥Ã¥¯¤Ë¤Ï¾²¤Ë¤¢¤ë¤É¤Î¥¢¥¤¥Æ¥à¤âÆþ¤é¤Ê¤¤¡£", o_name);
5988 #else
5989                         msg_print("You have no room for any of the objects on the floor.");
5990 #endif
5991
5992                 }
5993
5994                 /* Done */
5995                 return;
5996         }
5997
5998         /* One object */
5999         if (floor_num == 1)
6000         {
6001                 /* Hack -- query every object */
6002                 if (carry_query_flag)
6003                 {
6004                         char out_val[MAX_NLEN+20];
6005
6006                         /* Access the object */
6007                         o_ptr = &o_list[floor_o_idx];
6008
6009 #ifdef ALLOW_EASY_SENSE
6010
6011                         /* Option: Make object sensing easy */
6012                         if (easy_sense)
6013                         {
6014                                 /* Sense the object */
6015                                 (void) sense_object(o_ptr);
6016                         }
6017
6018 #endif /* ALLOW_EASY_SENSE */
6019
6020                         /* Describe the object */
6021                         object_desc(o_name, o_ptr, 0);
6022
6023                         /* Build a prompt */
6024 #ifdef JP
6025                         (void) sprintf(out_val, "%s¤ò½¦¤¤¤Þ¤¹¤«? ", o_name);
6026 #else
6027                         (void) sprintf(out_val, "Pick up %s? ", o_name);
6028 #endif
6029
6030
6031                         /* Ask the user to confirm */
6032                         if (!get_check(out_val))
6033                         {
6034                                 /* Done */
6035                                 return;
6036                         }
6037                 }
6038
6039                 /* Access the object */
6040                 o_ptr = &o_list[floor_o_idx];
6041
6042 #ifdef ALLOW_EASY_SENSE
6043
6044                 /* Option: Make object sensing easy */
6045                 if (easy_sense)
6046                 {
6047                         /* Sense the object */
6048                         (void) sense_object(o_ptr);
6049                 }
6050
6051 #endif /* ALLOW_EASY_SENSE */
6052
6053                 /* Pick up the object */
6054                 py_pickup_aux(floor_o_idx);
6055         }
6056
6057         /* Allow the user to choose an object */
6058         else
6059         {
6060                 while (can_pickup--)
6061                 {
6062                         if (!py_pickup_floor_aux()) break;
6063                 }
6064         }
6065 }
6066
6067 #endif /* ALLOW_EASY_FLOOR */