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