OSDN Git Service

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