OSDN Git Service

[Refactor] #37353 コメント整理。 / Refactor comments.
[hengband/hengband.git] / src / cmd-read.c
1 /*!\r
2  * @file cmd-read.c\r
3  * @brief プレイヤーの読むコマンド実装\r
4  * @date 2018/09/07\r
5  * @details\r
6  * cmd6.cより分離。\r
7  */\r
8 \r
9 #include "angband.h"\r
10 #include "object-hook.h"\r
11 #include "spells-summon.h"\r
12 #include "artifact.h"\r
13 #include "avatar.h"\r
14 #include "player-status.h"\r
15 #include "spells-status.h"\r
16 \r
17 /*!\r
18  * @brief 巻物を読むコマンドのサブルーチン\r
19  * Read a scroll (from the pack or floor).\r
20  * @param item 読むオブジェクトの所持品ID\r
21  * @param known 判明済ならばTRUE\r
22  * @return なし\r
23  * @details\r
24  * <pre>\r
25  * Certain scrolls can be "aborted" without losing the scroll.  These\r
26  * include scrolls with no effects but recharge or identify, which are\r
27  * cancelled before use.  XXX Reading them still takes a turn, though.\r
28  * </pre>\r
29  */\r
30 void do_cmd_read_scroll_aux(INVENTORY_IDX item, bool known)\r
31 {\r
32         int         k, used_up, ident, lev;\r
33         object_type *o_ptr;\r
34 \r
35 \r
36         /* Get the item (in the pack) */\r
37         if (item >= 0)\r
38         {\r
39                 o_ptr = &inventory[item];\r
40         }\r
41 \r
42         /* Get the item (on the floor) */\r
43         else\r
44         {\r
45                 o_ptr = &o_list[0 - item];\r
46         }\r
47 \r
48 \r
49         p_ptr->energy_use = 100;\r
50 \r
51         if (world_player)\r
52         {\r
53                 if (flush_failure) flush();\r
54                 msg_print(_("止まった時の中ではうまく働かないようだ。", "Nothing happen."));\r
55                 sound(SOUND_FAIL);\r
56                 return;\r
57         }\r
58 \r
59         if (p_ptr->pclass == CLASS_BERSERKER)\r
60         {\r
61                 msg_print(_("巻物なんて読めない。", "You cannot read."));\r
62                 return;\r
63         }\r
64 \r
65         if (music_singing_any()) stop_singing();\r
66 \r
67         /* Hex */\r
68         if (hex_spelling_any() && ((p_ptr->lev < 35) || hex_spell_fully())) stop_hex_spell_all();\r
69 \r
70         /* Not identified yet */\r
71         ident = FALSE;\r
72 \r
73         /* Object level */\r
74         lev = k_info[o_ptr->k_idx].level;\r
75 \r
76         /* Assume the scroll will get used up */\r
77         used_up = TRUE;\r
78 \r
79         if (o_ptr->tval == TV_SCROLL)\r
80         {\r
81         /* Analyze the scroll */\r
82         switch (o_ptr->sval)\r
83         {\r
84                 case SV_SCROLL_DARKNESS:\r
85                 {\r
86                         if (!(p_ptr->resist_blind) && !(p_ptr->resist_dark))\r
87                         {\r
88                                 (void)set_blind(p_ptr->blind + 3 + randint1(5));\r
89                         }\r
90                         if (unlite_area(10, 3)) ident = TRUE;\r
91                         break;\r
92                 }\r
93 \r
94                 case SV_SCROLL_AGGRAVATE_MONSTER:\r
95                 {\r
96                         msg_print(_("カン高くうなる様な音が辺りを覆った。", "There is a high pitched humming noise."));\r
97                         aggravate_monsters(0);\r
98                         ident = TRUE;\r
99                         break;\r
100                 }\r
101 \r
102                 case SV_SCROLL_CURSE_ARMOR:\r
103                 {\r
104                         if (curse_armor()) ident = TRUE;\r
105                         break;\r
106                 }\r
107 \r
108                 case SV_SCROLL_CURSE_WEAPON:\r
109                 {\r
110                         k = 0;\r
111                         if (has_melee_weapon(INVEN_RARM))\r
112                         {\r
113                                 k = INVEN_RARM;\r
114                                 if (has_melee_weapon(INVEN_LARM) && one_in_(2)) k = INVEN_LARM;\r
115                         }\r
116                         else if (has_melee_weapon(INVEN_LARM)) k = INVEN_LARM;\r
117                         if (k && curse_weapon(FALSE, k)) ident = TRUE;\r
118                         break;\r
119                 }\r
120 \r
121                 case SV_SCROLL_SUMMON_MONSTER:\r
122                 {\r
123                         for (k = 0; k < randint1(3); k++)\r
124                         {\r
125                                 if (summon_specific(0, p_ptr->y, p_ptr->x, dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0'))\r
126                                 {\r
127                                         ident = TRUE;\r
128                                 }\r
129                         }\r
130                         break;\r
131                 }\r
132 \r
133                 case SV_SCROLL_SUMMON_UNDEAD:\r
134                 {\r
135                         for (k = 0; k < randint1(3); k++)\r
136                         {\r
137                                 if (summon_specific(0, p_ptr->y, p_ptr->x, dun_level, SUMMON_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0'))\r
138                                 {\r
139                                         ident = TRUE;\r
140                                 }\r
141                         }\r
142                         break;\r
143                 }\r
144 \r
145                 case SV_SCROLL_SUMMON_PET:\r
146                 {\r
147                         if (summon_specific(-1, p_ptr->y, p_ptr->x, dun_level, 0, (PM_ALLOW_GROUP | PM_FORCE_PET), '\0'))\r
148                         {\r
149                                 ident = TRUE;\r
150                         }\r
151                         break;\r
152                 }\r
153 \r
154                 case SV_SCROLL_SUMMON_KIN:\r
155                 {\r
156                         if (summon_kin_player(p_ptr->lev, p_ptr->y, p_ptr->x, (PM_FORCE_PET | PM_ALLOW_GROUP)))\r
157                         {\r
158                                 ident = TRUE;\r
159                         }\r
160                         break;\r
161                 }\r
162 \r
163                 case SV_SCROLL_TRAP_CREATION:\r
164                 {\r
165                         if (trap_creation(p_ptr->y, p_ptr->x)) ident = TRUE;\r
166                         break;\r
167                 }\r
168 \r
169                 case SV_SCROLL_PHASE_DOOR:\r
170                 {\r
171                         teleport_player(10, 0L);\r
172                         ident = TRUE;\r
173                         break;\r
174                 }\r
175 \r
176                 case SV_SCROLL_TELEPORT:\r
177                 {\r
178                         teleport_player(100, 0L);\r
179                         ident = TRUE;\r
180                         break;\r
181                 }\r
182 \r
183                 case SV_SCROLL_TELEPORT_LEVEL:\r
184                 {\r
185                         (void)teleport_level(0);\r
186                         ident = TRUE;\r
187                         break;\r
188                 }\r
189 \r
190                 case SV_SCROLL_WORD_OF_RECALL:\r
191                 {\r
192                         if (!recall_player(p_ptr, randint0(21) + 15)) used_up = FALSE;\r
193                         ident = TRUE;\r
194                         break;\r
195                 }\r
196 \r
197                 case SV_SCROLL_IDENTIFY:\r
198                 {\r
199                         if (!ident_spell(FALSE)) used_up = FALSE;\r
200                         ident = TRUE;\r
201                         break;\r
202                 }\r
203 \r
204                 case SV_SCROLL_STAR_IDENTIFY:\r
205                 {\r
206                         if (!identify_fully(FALSE)) used_up = FALSE;\r
207                         ident = TRUE;\r
208                         break;\r
209                 }\r
210 \r
211                 case SV_SCROLL_REMOVE_CURSE:\r
212                 {\r
213                         if (remove_curse())\r
214                         {\r
215                                 ident = TRUE;\r
216                         }\r
217                         break;\r
218                 }\r
219 \r
220                 case SV_SCROLL_STAR_REMOVE_CURSE:\r
221                 {\r
222                         if (remove_all_curse())\r
223                         {\r
224                                 ident = TRUE;\r
225                         }\r
226                         break;\r
227                 }\r
228 \r
229                 case SV_SCROLL_ENCHANT_ARMOR:\r
230                 {\r
231                         ident = TRUE;\r
232                         if (!enchant_spell(0, 0, 1)) used_up = FALSE;\r
233                         break;\r
234                 }\r
235 \r
236                 case SV_SCROLL_ENCHANT_WEAPON_TO_HIT:\r
237                 {\r
238                         if (!enchant_spell(1, 0, 0)) used_up = FALSE;\r
239                         ident = TRUE;\r
240                         break;\r
241                 }\r
242 \r
243                 case SV_SCROLL_ENCHANT_WEAPON_TO_DAM:\r
244                 {\r
245                         if (!enchant_spell(0, 1, 0)) used_up = FALSE;\r
246                         ident = TRUE;\r
247                         break;\r
248                 }\r
249 \r
250                 case SV_SCROLL_STAR_ENCHANT_ARMOR:\r
251                 {\r
252                         if (!enchant_spell(0, 0, randint1(3) + 2)) used_up = FALSE;\r
253                         ident = TRUE;\r
254                         break;\r
255                 }\r
256 \r
257                 case SV_SCROLL_STAR_ENCHANT_WEAPON:\r
258                 {\r
259                         if (!enchant_spell(randint1(3), randint1(3), 0)) used_up = FALSE;\r
260                         ident = TRUE;\r
261                         break;\r
262                 }\r
263 \r
264                 case SV_SCROLL_RECHARGING:\r
265                 {\r
266                         if (!recharge(130)) used_up = FALSE;\r
267                         ident = TRUE;\r
268                         break;\r
269                 }\r
270 \r
271                 case SV_SCROLL_MUNDANITY:\r
272                 {\r
273                         ident = TRUE;\r
274                         if (!mundane_spell(FALSE)) used_up = FALSE;\r
275                         break;\r
276                 }\r
277 \r
278                 case SV_SCROLL_LIGHT:\r
279                 {\r
280                         if (lite_area(damroll(2, 8), 2)) ident = TRUE;\r
281                         break;\r
282                 }\r
283 \r
284                 case SV_SCROLL_MAPPING:\r
285                 {\r
286                         map_area(DETECT_RAD_MAP);\r
287                         ident = TRUE;\r
288                         break;\r
289                 }\r
290 \r
291                 case SV_SCROLL_DETECT_GOLD:\r
292                 {\r
293                         if (detect_treasure(DETECT_RAD_DEFAULT)) ident = TRUE;\r
294                         if (detect_objects_gold(DETECT_RAD_DEFAULT)) ident = TRUE;\r
295                         break;\r
296                 }\r
297 \r
298                 case SV_SCROLL_DETECT_ITEM:\r
299                 {\r
300                         if (detect_objects_normal(DETECT_RAD_DEFAULT)) ident = TRUE;\r
301                         break;\r
302                 }\r
303 \r
304                 case SV_SCROLL_DETECT_TRAP:\r
305                 {\r
306                         if (detect_traps(DETECT_RAD_DEFAULT, known)) ident = TRUE;\r
307                         break;\r
308                 }\r
309 \r
310                 case SV_SCROLL_DETECT_DOOR:\r
311                 {\r
312                         if (detect_doors(DETECT_RAD_DEFAULT)) ident = TRUE;\r
313                         if (detect_stairs(DETECT_RAD_DEFAULT)) ident = TRUE;\r
314                         break;\r
315                 }\r
316 \r
317                 case SV_SCROLL_DETECT_INVIS:\r
318                 {\r
319                         if (detect_monsters_invis(DETECT_RAD_DEFAULT)) ident = TRUE;\r
320                         break;\r
321                 }\r
322 \r
323                 case SV_SCROLL_SATISFY_HUNGER:\r
324                 {\r
325                         if (set_food(PY_FOOD_MAX - 1)) ident = TRUE;\r
326                         break;\r
327                 }\r
328 \r
329                 case SV_SCROLL_BLESSING:\r
330                 {\r
331                         if (set_blessed(p_ptr->blessed + randint1(12) + 6, FALSE)) ident = TRUE;\r
332                         break;\r
333                 }\r
334 \r
335                 case SV_SCROLL_HOLY_CHANT:\r
336                 {\r
337                         if (set_blessed(p_ptr->blessed + randint1(24) + 12, FALSE)) ident = TRUE;\r
338                         break;\r
339                 }\r
340 \r
341                 case SV_SCROLL_HOLY_PRAYER:\r
342                 {\r
343                         if (set_blessed(p_ptr->blessed + randint1(48) + 24, FALSE)) ident = TRUE;\r
344                         break;\r
345                 }\r
346 \r
347                 case SV_SCROLL_MONSTER_CONFUSION:\r
348                 {\r
349                         if (!(p_ptr->special_attack & ATTACK_CONFUSE))\r
350                         {\r
351                                 msg_print(_("手が輝き始めた。", "Your hands begin to glow."));\r
352                                 p_ptr->special_attack |= ATTACK_CONFUSE;\r
353                                 p_ptr->redraw |= (PR_STATUS);\r
354                                 ident = TRUE;\r
355                         }\r
356                         break;\r
357                 }\r
358 \r
359                 case SV_SCROLL_PROTECTION_FROM_EVIL:\r
360                 {\r
361                         k = 3 * p_ptr->lev;\r
362                         if (set_protevil(p_ptr->protevil + randint1(25) + k, FALSE)) ident = TRUE;\r
363                         break;\r
364                 }\r
365 \r
366                 case SV_SCROLL_RUNE_OF_PROTECTION:\r
367                 {\r
368                         warding_glyph();\r
369                         ident = TRUE;\r
370                         break;\r
371                 }\r
372 \r
373                 case SV_SCROLL_TRAP_DOOR_DESTRUCTION:\r
374                 {\r
375                         if (destroy_doors_touch()) ident = TRUE;\r
376                         break;\r
377                 }\r
378 \r
379                 case SV_SCROLL_STAR_DESTRUCTION:\r
380                 {\r
381                         if (destroy_area(p_ptr->y, p_ptr->x, 13 + randint0(5), FALSE))\r
382                                 ident = TRUE;\r
383                         else\r
384                                 msg_print(_("ダンジョンが揺れた...", "The dungeon trembles..."));\r
385 \r
386                         break;\r
387                 }\r
388 \r
389                 case SV_SCROLL_DISPEL_UNDEAD:\r
390                 {\r
391                         if (dispel_undead(80)) ident = TRUE;\r
392                         break;\r
393                 }\r
394 \r
395                 case SV_SCROLL_SPELL:\r
396                 {\r
397                         if ((p_ptr->pclass == CLASS_WARRIOR) ||\r
398                                 (p_ptr->pclass == CLASS_IMITATOR) ||\r
399                                 (p_ptr->pclass == CLASS_MINDCRAFTER) ||\r
400                                 (p_ptr->pclass == CLASS_SORCERER) ||\r
401                                 (p_ptr->pclass == CLASS_ARCHER) ||\r
402                                 (p_ptr->pclass == CLASS_MAGIC_EATER) ||\r
403                                 (p_ptr->pclass == CLASS_RED_MAGE) ||\r
404                                 (p_ptr->pclass == CLASS_SAMURAI) ||\r
405                                 (p_ptr->pclass == CLASS_BLUE_MAGE) ||\r
406                                 (p_ptr->pclass == CLASS_CAVALRY) ||\r
407                                 (p_ptr->pclass == CLASS_BERSERKER) ||\r
408                                 (p_ptr->pclass == CLASS_SMITH) ||\r
409                                 (p_ptr->pclass == CLASS_MIRROR_MASTER) ||\r
410                                 (p_ptr->pclass == CLASS_NINJA) ||\r
411                                 (p_ptr->pclass == CLASS_SNIPER)) break;\r
412                         p_ptr->add_spells++;\r
413                         p_ptr->update |= (PU_SPELLS);\r
414                         ident = TRUE;\r
415                         break;\r
416                 }\r
417 \r
418                 case SV_SCROLL_GENOCIDE:\r
419                 {\r
420                         (void)symbol_genocide(300, TRUE);\r
421                         ident = TRUE;\r
422                         break;\r
423                 }\r
424 \r
425                 case SV_SCROLL_MASS_GENOCIDE:\r
426                 {\r
427                         (void)mass_genocide(300, TRUE);\r
428                         ident = TRUE;\r
429                         break;\r
430                 }\r
431 \r
432                 case SV_SCROLL_ACQUIREMENT:\r
433                 {\r
434                         acquirement(p_ptr->y, p_ptr->x, 1, TRUE, FALSE, FALSE);\r
435                         ident = TRUE;\r
436                         break;\r
437                 }\r
438 \r
439                 case SV_SCROLL_STAR_ACQUIREMENT:\r
440                 {\r
441                         acquirement(p_ptr->y, p_ptr->x, randint1(2) + 1, TRUE, FALSE, FALSE);\r
442                         ident = TRUE;\r
443                         break;\r
444                 }\r
445 \r
446                 /* New Hengband scrolls */\r
447                 case SV_SCROLL_FIRE:\r
448                 {\r
449                         fire_ball(GF_FIRE, 0, 666, 4);\r
450                         /* Note: "Double" damage since it is centered on the player ... */\r
451                         if (!(IS_OPPOSE_FIRE() || p_ptr->resist_fire || p_ptr->immune_fire))\r
452                                 take_hit(DAMAGE_NOESCAPE, 50+randint1(50), _("炎の巻物", "a Scroll of Fire"), -1);\r
453 \r
454                         ident = TRUE;\r
455                         break;\r
456                 }\r
457 \r
458 \r
459                 case SV_SCROLL_ICE:\r
460                 {\r
461                         fire_ball(GF_ICE, 0, 777, 4);\r
462                         if (!(IS_OPPOSE_COLD() || p_ptr->resist_cold || p_ptr->immune_cold))\r
463                                 take_hit(DAMAGE_NOESCAPE, 100+randint1(100), _("氷の巻物", "a Scroll of Ice"), -1);\r
464 \r
465                         ident = TRUE;\r
466                         break;\r
467                 }\r
468 \r
469                 case SV_SCROLL_CHAOS:\r
470                 {\r
471                         fire_ball(GF_CHAOS, 0, 1000, 4);\r
472                         if (!p_ptr->resist_chaos)\r
473                                 take_hit(DAMAGE_NOESCAPE, 111+randint1(111), _("ログルスの巻物", "a Scroll of Logrus"), -1);\r
474 \r
475                         ident = TRUE;\r
476                         break;\r
477                 }\r
478 \r
479                 case SV_SCROLL_RUMOR:\r
480                 {\r
481                         msg_print(_("巻物にはメッセージが書かれている:", "There is message on the scroll. It says:"));\r
482                         msg_print(NULL);\r
483                         display_rumor(TRUE);\r
484                         msg_print(NULL);\r
485                         msg_print(_("巻物は煙を立てて消え去った!", "The scroll disappears in a puff of smoke!"));\r
486 \r
487                         ident = TRUE;\r
488                         break;\r
489                 }\r
490 \r
491                 case SV_SCROLL_ARTIFACT:\r
492                 {\r
493                         ident = TRUE;\r
494                         if (!artifact_scroll()) used_up = FALSE;\r
495                         break;\r
496                 }\r
497 \r
498                 case SV_SCROLL_RESET_RECALL:\r
499                 {\r
500                         ident = TRUE;\r
501                         if (!reset_recall()) used_up = FALSE;\r
502                         break;\r
503                 }\r
504 \r
505                 case SV_SCROLL_AMUSEMENT:\r
506                 {\r
507                         ident = TRUE;\r
508                         amusement(p_ptr->y, p_ptr->x, 1, FALSE);\r
509                         break;\r
510                 }\r
511 \r
512                 case SV_SCROLL_STAR_AMUSEMENT:\r
513                 {\r
514                         ident = TRUE;\r
515                         amusement(p_ptr->y, p_ptr->x,  randint1(2) + 1, FALSE);\r
516                         break;\r
517                 }\r
518         }\r
519         }\r
520         else if (o_ptr->name1 == ART_GHB)\r
521         {\r
522                 msg_print(_("私は苦労して『グレーター・ヘル=ビースト』を倒した。", "I had a very hard time to kill the Greater hell-beast, "));\r
523                 msg_print(_("しかし手に入ったのはこのきたないTシャツだけだった。", "but all I got was this lousy t-shirt!"));\r
524                 used_up = FALSE;\r
525         }\r
526         else if (o_ptr->name1 == ART_POWER)\r
527         {\r
528                 msg_print(_("「一つの指輪は全てを統べ、", "'One Ring to rule them all, "));\r
529                 msg_print(NULL);\r
530                 msg_print(_("一つの指輪は全てを見つけ、", "One Ring to find them, "));\r
531                 msg_print(NULL);\r
532                 msg_print(_("一つの指輪は全てを捕らえて", "One Ring to bring them all "));\r
533                 msg_print(NULL);\r
534                 msg_print(_("暗闇の中に繋ぎとめる。」", "and in the darkness bind them.'"));\r
535                 used_up = FALSE;\r
536         }\r
537         else if (o_ptr->tval==TV_PARCHMENT)\r
538         {\r
539                 concptr q;\r
540                 GAME_TEXT o_name[MAX_NLEN];\r
541                 char buf[1024];\r
542                 screen_save();\r
543 \r
544                 q=format("book-%d_jp.txt",o_ptr->sval);\r
545 \r
546                 /* Display object description */\r
547                 object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
548 \r
549                 /* Build the filename */\r
550                 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, q);\r
551 \r
552                 /* Peruse the help file */\r
553                 (void)show_file(TRUE, buf, o_name, 0, 0);\r
554                 screen_load();\r
555 \r
556                 used_up=FALSE;\r
557         }\r
558 \r
559         p_ptr->update |= (PU_COMBINE | PU_REORDER);\r
560 \r
561         if (!(object_is_aware(o_ptr)))\r
562         {\r
563                 chg_virtue(V_PATIENCE, -1);\r
564                 chg_virtue(V_CHANCE, 1);\r
565                 chg_virtue(V_KNOWLEDGE, -1);\r
566         }\r
567 \r
568         /* The item was tried */\r
569         object_tried(o_ptr);\r
570 \r
571         /* An identification was made */\r
572         if (ident && !object_is_aware(o_ptr))\r
573         {\r
574                 object_aware(o_ptr);\r
575                 gain_exp((lev + (p_ptr->lev >> 1)) / p_ptr->lev);\r
576         }\r
577 \r
578         p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);\r
579 \r
580 \r
581         /* Hack -- allow certain scrolls to be "preserved" */\r
582         if (!used_up)\r
583         {\r
584                 return;\r
585         }\r
586 \r
587         sound(SOUND_SCROLL);\r
588 \r
589         /* Destroy a scroll in the pack */\r
590         if (item >= 0)\r
591         {\r
592                 inven_item_increase(item, -1);\r
593                 inven_item_describe(item);\r
594                 inven_item_optimize(item);\r
595         }\r
596 \r
597         /* Destroy a scroll on the floor */\r
598         else\r
599         {\r
600                 floor_item_increase(0 - item, -1);\r
601                 floor_item_describe(0 - item);\r
602                 floor_item_optimize(0 - item);\r
603         }\r
604 }\r
605 \r
606 /*!\r
607  * @brief 読むコマンドのメインルーチン /\r
608  * Eat some food (from the pack or floor)\r
609  * @return なし\r
610  */\r
611 void do_cmd_read_scroll(void)\r
612 {\r
613         object_type *o_ptr;\r
614         OBJECT_IDX item;\r
615         concptr q, s;\r
616 \r
617         if (p_ptr->wild_mode)\r
618         {\r
619                 return;\r
620         }\r
621 \r
622         if (p_ptr->inside_arena)\r
623         {\r
624                 msg_print(_("アリーナが魔法を吸収した!", "The arena absorbs all attempted magic!"));\r
625                 msg_print(NULL);\r
626                 return;\r
627         }\r
628 \r
629         if (p_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))\r
630         {\r
631                 set_action(ACTION_NONE);\r
632         }\r
633 \r
634         /* Check some conditions */\r
635         if (p_ptr->blind)\r
636         {\r
637                 msg_print(_("目が見えない。", "You can't see anything."));\r
638                 return;\r
639         }\r
640         if (no_lite())\r
641         {\r
642                 msg_print(_("明かりがないので、暗くて読めない。", "You have no light to read by."));\r
643                 return;\r
644         }\r
645         if (p_ptr->confused)\r
646         {\r
647                 msg_print(_("混乱していて読めない。", "You are too confused!"));\r
648                 return;\r
649         }\r
650 \r
651 \r
652         /* Restrict choices to scrolls */\r
653         item_tester_hook = item_tester_hook_readable;\r
654 \r
655         q = _("どの巻物を読みますか? ", "Read which scroll? ");\r
656         s = _("読める巻物がない。", "You have no scrolls to read.");\r
657 \r
658         o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));\r
659         if (!o_ptr) return;\r
660 \r
661         /* Read the scroll */\r
662         do_cmd_read_scroll_aux(item, object_is_aware(o_ptr));\r
663 }\r