OSDN Git Service

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