OSDN Git Service

[Refactor] #37353 プレイヤーの読むコマンドを cmd-read.c/h に分離。 / Separate player's read command...
[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 \r
10 #include "angband.h"\r
11 \r
12 /*!\r
13  * @brief 巻物を読むコマンドのサブルーチン\r
14  * Read a scroll (from the pack or floor).\r
15  * @param item 読むオブジェクトの所持品ID\r
16  * @param known 判明済ならばTRUE\r
17  * @return なし\r
18  * @details\r
19  * <pre>\r
20  * Certain scrolls can be "aborted" without losing the scroll.  These\r
21  * include scrolls with no effects but recharge or identify, which are\r
22  * cancelled before use.  XXX Reading them still takes a turn, though.\r
23  * </pre>\r
24  */\r
25 void do_cmd_read_scroll_aux(int item, bool known)\r
26 {\r
27         int         k, used_up, ident, lev;\r
28         object_type *o_ptr;\r
29 \r
30 \r
31         /* Get the item (in the pack) */\r
32         if (item >= 0)\r
33         {\r
34                 o_ptr = &inventory[item];\r
35         }\r
36 \r
37         /* Get the item (on the floor) */\r
38         else\r
39         {\r
40                 o_ptr = &o_list[0 - item];\r
41         }\r
42 \r
43 \r
44         /* Take a turn */\r
45         p_ptr->energy_use = 100;\r
46 \r
47         if (world_player)\r
48         {\r
49                 if (flush_failure) flush();\r
50                 msg_print(_("止まった時の中ではうまく働かないようだ。", "Nothing happen."));\r
51                 sound(SOUND_FAIL);\r
52                 return;\r
53         }\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 (buki_motteruka(INVEN_RARM))\r
108                         {\r
109                                 k = INVEN_RARM;\r
110                                 if (buki_motteruka(INVEN_LARM) && one_in_(2)) k = INVEN_LARM;\r
111                         }\r
112                         else if (buki_motteruka(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)))\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)))\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)))\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 (!word_of_recall()) 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                                 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\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                                 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
222                         }\r
223                         ident = TRUE;\r
224                         break;\r
225                 }\r
226 \r
227                 case SV_SCROLL_ENCHANT_ARMOR:\r
228                 {\r
229                         ident = TRUE;\r
230                         if (!enchant_spell(0, 0, 1)) used_up = FALSE;\r
231                         break;\r
232                 }\r
233 \r
234                 case SV_SCROLL_ENCHANT_WEAPON_TO_HIT:\r
235                 {\r
236                         if (!enchant_spell(1, 0, 0)) used_up = FALSE;\r
237                         ident = TRUE;\r
238                         break;\r
239                 }\r
240 \r
241                 case SV_SCROLL_ENCHANT_WEAPON_TO_DAM:\r
242                 {\r
243                         if (!enchant_spell(0, 1, 0)) used_up = FALSE;\r
244                         ident = TRUE;\r
245                         break;\r
246                 }\r
247 \r
248                 case SV_SCROLL_STAR_ENCHANT_ARMOR:\r
249                 {\r
250                         if (!enchant_spell(0, 0, randint1(3) + 2)) used_up = FALSE;\r
251                         ident = TRUE;\r
252                         break;\r
253                 }\r
254 \r
255                 case SV_SCROLL_STAR_ENCHANT_WEAPON:\r
256                 {\r
257                         if (!enchant_spell(randint1(3), randint1(3), 0)) used_up = FALSE;\r
258                         ident = TRUE;\r
259                         break;\r
260                 }\r
261 \r
262                 case SV_SCROLL_RECHARGING:\r
263                 {\r
264                         if (!recharge(130)) used_up = FALSE;\r
265                         ident = TRUE;\r
266                         break;\r
267                 }\r
268 \r
269                 case SV_SCROLL_MUNDANITY:\r
270                 {\r
271                         ident = TRUE;\r
272                         if (!mundane_spell(FALSE)) used_up = FALSE;\r
273                         break;\r
274                 }\r
275 \r
276                 case SV_SCROLL_LIGHT:\r
277                 {\r
278                         if (lite_area(damroll(2, 8), 2)) ident = TRUE;\r
279                         break;\r
280                 }\r
281 \r
282                 case SV_SCROLL_MAPPING:\r
283                 {\r
284                         map_area(DETECT_RAD_MAP);\r
285                         ident = TRUE;\r
286                         break;\r
287                 }\r
288 \r
289                 case SV_SCROLL_DETECT_GOLD:\r
290                 {\r
291                         if (detect_treasure(DETECT_RAD_DEFAULT)) ident = TRUE;\r
292                         if (detect_objects_gold(DETECT_RAD_DEFAULT)) ident = TRUE;\r
293                         break;\r
294                 }\r
295 \r
296                 case SV_SCROLL_DETECT_ITEM:\r
297                 {\r
298                         if (detect_objects_normal(DETECT_RAD_DEFAULT)) ident = TRUE;\r
299                         break;\r
300                 }\r
301 \r
302                 case SV_SCROLL_DETECT_TRAP:\r
303                 {\r
304                         if (detect_traps(DETECT_RAD_DEFAULT, known)) ident = TRUE;\r
305                         break;\r
306                 }\r
307 \r
308                 case SV_SCROLL_DETECT_DOOR:\r
309                 {\r
310                         if (detect_doors(DETECT_RAD_DEFAULT)) ident = TRUE;\r
311                         if (detect_stairs(DETECT_RAD_DEFAULT)) ident = TRUE;\r
312                         break;\r
313                 }\r
314 \r
315                 case SV_SCROLL_DETECT_INVIS:\r
316                 {\r
317                         if (detect_monsters_invis(DETECT_RAD_DEFAULT)) ident = TRUE;\r
318                         break;\r
319                 }\r
320 \r
321                 case SV_SCROLL_SATISFY_HUNGER:\r
322                 {\r
323                         if (set_food(PY_FOOD_MAX - 1)) ident = TRUE;\r
324                         break;\r
325                 }\r
326 \r
327                 case SV_SCROLL_BLESSING:\r
328                 {\r
329                         if (set_blessed(p_ptr->blessed + randint1(12) + 6, FALSE)) ident = TRUE;\r
330                         break;\r
331                 }\r
332 \r
333                 case SV_SCROLL_HOLY_CHANT:\r
334                 {\r
335                         if (set_blessed(p_ptr->blessed + randint1(24) + 12, FALSE)) ident = TRUE;\r
336                         break;\r
337                 }\r
338 \r
339                 case SV_SCROLL_HOLY_PRAYER:\r
340                 {\r
341                         if (set_blessed(p_ptr->blessed + randint1(48) + 24, FALSE)) ident = TRUE;\r
342                         break;\r
343                 }\r
344 \r
345                 case SV_SCROLL_MONSTER_CONFUSION:\r
346                 {\r
347                         if (!(p_ptr->special_attack & ATTACK_CONFUSE))\r
348                         {\r
349                                 msg_print(_("手が輝き始めた。", "Your hands begin to glow."));\r
350                                 p_ptr->special_attack |= ATTACK_CONFUSE;\r
351                                 p_ptr->redraw |= (PR_STATUS);\r
352                                 ident = TRUE;\r
353                         }\r
354                         break;\r
355                 }\r
356 \r
357                 case SV_SCROLL_PROTECTION_FROM_EVIL:\r
358                 {\r
359                         k = 3 * p_ptr->lev;\r
360                         if (set_protevil(p_ptr->protevil + randint1(25) + k, FALSE)) ident = TRUE;\r
361                         break;\r
362                 }\r
363 \r
364                 case SV_SCROLL_RUNE_OF_PROTECTION:\r
365                 {\r
366                         warding_glyph();\r
367                         ident = TRUE;\r
368                         break;\r
369                 }\r
370 \r
371                 case SV_SCROLL_TRAP_DOOR_DESTRUCTION:\r
372                 {\r
373                         if (destroy_doors_touch()) ident = TRUE;\r
374                         break;\r
375                 }\r
376 \r
377                 case SV_SCROLL_STAR_DESTRUCTION:\r
378                 {\r
379                         if (destroy_area(p_ptr->y, p_ptr->x, 13 + randint0(5), FALSE))\r
380                                 ident = TRUE;\r
381                         else\r
382                                 msg_print(_("ダンジョンが揺れた...", "The dungeon trembles..."));\r
383 \r
384                         break;\r
385                 }\r
386 \r
387                 case SV_SCROLL_DISPEL_UNDEAD:\r
388                 {\r
389                         if (dispel_undead(80)) ident = TRUE;\r
390                         break;\r
391                 }\r
392 \r
393                 case SV_SCROLL_SPELL:\r
394                 {\r
395                         if ((p_ptr->pclass == CLASS_WARRIOR) ||\r
396                                 (p_ptr->pclass == CLASS_IMITATOR) ||\r
397                                 (p_ptr->pclass == CLASS_MINDCRAFTER) ||\r
398                                 (p_ptr->pclass == CLASS_SORCERER) ||\r
399                                 (p_ptr->pclass == CLASS_ARCHER) ||\r
400                                 (p_ptr->pclass == CLASS_MAGIC_EATER) ||\r
401                                 (p_ptr->pclass == CLASS_RED_MAGE) ||\r
402                                 (p_ptr->pclass == CLASS_SAMURAI) ||\r
403                                 (p_ptr->pclass == CLASS_BLUE_MAGE) ||\r
404                                 (p_ptr->pclass == CLASS_CAVALRY) ||\r
405                                 (p_ptr->pclass == CLASS_BERSERKER) ||\r
406                                 (p_ptr->pclass == CLASS_SMITH) ||\r
407                                 (p_ptr->pclass == CLASS_MIRROR_MASTER) ||\r
408                                 (p_ptr->pclass == CLASS_NINJA) ||\r
409                                 (p_ptr->pclass == CLASS_SNIPER)) break;\r
410                         p_ptr->add_spells++;\r
411                         p_ptr->update |= (PU_SPELLS);\r
412                         ident = TRUE;\r
413                         break;\r
414                 }\r
415 \r
416                 case SV_SCROLL_GENOCIDE:\r
417                 {\r
418                         (void)symbol_genocide(300, TRUE);\r
419                         ident = TRUE;\r
420                         break;\r
421                 }\r
422 \r
423                 case SV_SCROLL_MASS_GENOCIDE:\r
424                 {\r
425                         (void)mass_genocide(300, TRUE);\r
426                         ident = TRUE;\r
427                         break;\r
428                 }\r
429 \r
430                 case SV_SCROLL_ACQUIREMENT:\r
431                 {\r
432                         acquirement(p_ptr->y, p_ptr->x, 1, TRUE, FALSE, FALSE);\r
433                         ident = TRUE;\r
434                         break;\r
435                 }\r
436 \r
437                 case SV_SCROLL_STAR_ACQUIREMENT:\r
438                 {\r
439                         acquirement(p_ptr->y, p_ptr->x, randint1(2) + 1, TRUE, FALSE, FALSE);\r
440                         ident = TRUE;\r
441                         break;\r
442                 }\r
443 \r
444                 /* New Hengband scrolls */\r
445                 case SV_SCROLL_FIRE:\r
446                 {\r
447                         fire_ball(GF_FIRE, 0, 666, 4);\r
448                         /* Note: "Double" damage since it is centered on the player ... */\r
449                         if (!(IS_OPPOSE_FIRE() || p_ptr->resist_fire || p_ptr->immune_fire))\r
450                                 take_hit(DAMAGE_NOESCAPE, 50+randint1(50), _("炎の巻物", "a Scroll of Fire"), -1);\r
451 \r
452                         ident = TRUE;\r
453                         break;\r
454                 }\r
455 \r
456 \r
457                 case SV_SCROLL_ICE:\r
458                 {\r
459                         fire_ball(GF_ICE, 0, 777, 4);\r
460                         if (!(IS_OPPOSE_COLD() || p_ptr->resist_cold || p_ptr->immune_cold))\r
461                                 take_hit(DAMAGE_NOESCAPE, 100+randint1(100), _("氷の巻物", "a Scroll of Ice"), -1);\r
462 \r
463                         ident = TRUE;\r
464                         break;\r
465                 }\r
466 \r
467                 case SV_SCROLL_CHAOS:\r
468                 {\r
469                         fire_ball(GF_CHAOS, 0, 1000, 4);\r
470                         if (!p_ptr->resist_chaos)\r
471                                 take_hit(DAMAGE_NOESCAPE, 111+randint1(111), _("ログルスの巻物", "a Scroll of Logrus"), -1);\r
472 \r
473                         ident = TRUE;\r
474                         break;\r
475                 }\r
476 \r
477                 case SV_SCROLL_RUMOR:\r
478                 {\r
479                         msg_print(_("巻物にはメッセージが書かれている:", "There is message on the scroll. It says:"));\r
480                         msg_print(NULL);\r
481                         display_rumor(TRUE);\r
482                         msg_print(NULL);\r
483                         msg_print(_("巻物は煙を立てて消え去った!", "The scroll disappears in a puff of smoke!"));\r
484 \r
485                         ident = TRUE;\r
486                         break;\r
487                 }\r
488 \r
489                 case SV_SCROLL_ARTIFACT:\r
490                 {\r
491                         ident = TRUE;\r
492                         if (!artifact_scroll()) used_up = FALSE;\r
493                         break;\r
494                 }\r
495 \r
496                 case SV_SCROLL_RESET_RECALL:\r
497                 {\r
498                         ident = TRUE;\r
499                         if (!reset_recall()) used_up = FALSE;\r
500                         break;\r
501                 }\r
502 \r
503                 case SV_SCROLL_AMUSEMENT:\r
504                 {\r
505                         ident = TRUE;\r
506                         amusement(p_ptr->y, p_ptr->x, 1, FALSE);\r
507                         break;\r
508                 }\r
509 \r
510                 case SV_SCROLL_STAR_AMUSEMENT:\r
511                 {\r
512                         ident = TRUE;\r
513                         amusement(p_ptr->y, p_ptr->x,  randint1(2) + 1, FALSE);\r
514                         break;\r
515                 }\r
516         }\r
517         }\r
518         else if (o_ptr->name1 == ART_GHB)\r
519         {\r
520                 msg_print(_("私は苦労して『グレーター・ヘル=ビースト』を倒した。", "I had a very hard time to kill the Greater hell-beast, "));\r
521                 msg_print(_("しかし手に入ったのはこのきたないTシャツだけだった。", "but all I got was this lousy t-shirt!"));\r
522                 used_up = FALSE;\r
523         }\r
524         else if (o_ptr->name1 == ART_POWER)\r
525         {\r
526                 msg_print(_("「一つの指輪は全てを統べ、", "'One Ring to rule them all, "));\r
527                 msg_print(NULL);\r
528                 msg_print(_("一つの指輪は全てを見つけ、", "One Ring to find them, "));\r
529                 msg_print(NULL);\r
530                 msg_print(_("一つの指輪は全てを捕らえて", "One Ring to bring them all "));\r
531                 msg_print(NULL);\r
532                 msg_print(_("暗闇の中に繋ぎとめる。」", "and in the darkness bind them.'"));\r
533                 used_up = FALSE;\r
534         }\r
535         else if (o_ptr->tval==TV_PARCHMENT)\r
536         {\r
537                 cptr q;\r
538                 char o_name[MAX_NLEN];\r
539                 char buf[1024];\r
540 \r
541                 /* Save screen */\r
542                 screen_save();\r
543 \r
544                 q=format("book-%d_jp.txt",o_ptr->sval);\r
545 \r
546                 /* Display object description */\r
547                 object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
548 \r
549                 /* Build the filename */\r
550                 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, q);\r
551 \r
552                 /* Peruse the help file */\r
553                 (void)show_file(TRUE, buf, o_name, 0, 0);\r
554 \r
555                 /* Load screen */\r
556                 screen_load();\r
557 \r
558                 used_up=FALSE;\r
559         }\r
560 \r
561 \r
562         /* Combine / Reorder the pack (later) */\r
563         p_ptr->notice |= (PN_COMBINE | PN_REORDER);\r
564 \r
565         if (!(object_is_aware(o_ptr)))\r
566         {\r
567                 chg_virtue(V_PATIENCE, -1);\r
568                 chg_virtue(V_CHANCE, 1);\r
569                 chg_virtue(V_KNOWLEDGE, -1);\r
570         }\r
571 \r
572         /* The item was tried */\r
573         object_tried(o_ptr);\r
574 \r
575         /* An identification was made */\r
576         if (ident && !object_is_aware(o_ptr))\r
577         {\r
578                 object_aware(o_ptr);\r
579                 gain_exp((lev + (p_ptr->lev >> 1)) / p_ptr->lev);\r
580         }\r
581 \r
582         /* Window stuff */\r
583         p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);\r
584 \r
585 \r
586         /* Hack -- allow certain scrolls to be "preserved" */\r
587         if (!used_up)\r
588         {\r
589                 return;\r
590         }\r
591 \r
592         sound(SOUND_SCROLL);\r
593 \r
594         /* Destroy a scroll in the pack */\r
595         if (item >= 0)\r
596         {\r
597                 inven_item_increase(item, -1);\r
598                 inven_item_describe(item);\r
599                 inven_item_optimize(item);\r
600         }\r
601 \r
602         /* Destroy a scroll on the floor */\r
603         else\r
604         {\r
605                 floor_item_increase(0 - item, -1);\r
606                 floor_item_describe(0 - item);\r
607                 floor_item_optimize(0 - item);\r
608         }\r
609 }\r
610 \r
611 /*!\r
612  * @brief オブジェクトをプレイヤーが読むことができるかを判定する /\r
613  * Hook to determine if an object is readable\r
614  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ\r
615  * @return 読むことが可能ならばTRUEを返す\r
616  */\r
617 static bool item_tester_hook_readable(object_type *o_ptr)\r
618 {\r
619         if ((o_ptr->tval==TV_SCROLL) || (o_ptr->tval==TV_PARCHMENT) || (o_ptr->name1 == ART_GHB) || (o_ptr->name1 == ART_POWER)) return (TRUE);\r
620 \r
621         /* Assume not */\r
622         return (FALSE);\r
623 }\r
624 \r
625 /*!\r
626  * @brief 読むコマンドのメインルーチン /\r
627  * Eat some food (from the pack or floor)\r
628  * @return なし\r
629  */\r
630 void do_cmd_read_scroll(void)\r
631 {\r
632         object_type *o_ptr;\r
633         OBJECT_IDX item;\r
634         cptr q, s;\r
635 \r
636         if (p_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))\r
637         {\r
638                 set_action(ACTION_NONE);\r
639         }\r
640 \r
641         /* Check some conditions */\r
642         if (p_ptr->blind)\r
643         {\r
644                 msg_print(_("目が見えない。", "You can't see anything."));\r
645                 return;\r
646         }\r
647         if (no_lite())\r
648         {\r
649                 msg_print(_("明かりがないので、暗くて読めない。", "You have no light to read by."));\r
650                 return;\r
651         }\r
652         if (p_ptr->confused)\r
653         {\r
654                 msg_print(_("混乱していて読めない。", "You are too confused!"));\r
655                 return;\r
656         }\r
657 \r
658 \r
659         /* Restrict choices to scrolls */\r
660         item_tester_hook = item_tester_hook_readable;\r
661 \r
662         /* Get an item */\r
663         q = _("どの巻物を読みますか? ", "Read which scroll? ");\r
664         s = _("読める巻物がない。", "You have no scrolls to read.");\r
665 \r
666         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;\r
667 \r
668         /* Get the item (in the pack) */\r
669         if (item >= 0)\r
670         {\r
671                 o_ptr = &inventory[item];\r
672         }\r
673 \r
674         /* Get the item (on the floor) */\r
675         else\r
676         {\r
677                 o_ptr = &o_list[0 - item];\r
678         }\r
679 \r
680         /* Read the scroll */\r
681         do_cmd_read_scroll_aux(item, object_is_aware(o_ptr));\r
682 }\r