OSDN Git Service

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