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