3 * @brief プレイヤーの読むコマンド実装
\r
10 #include "object-hook.h"
\r
13 * @brief 巻物を読むコマンドのサブルーチン
\r
14 * Read a scroll (from the pack or floor).
\r
15 * @param item 読むオブジェクトの所持品ID
\r
16 * @param known 判明済ならばTRUE
\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
25 void do_cmd_read_scroll_aux(INVENTORY_IDX item, bool known)
\r
27 int k, used_up, ident, lev;
\r
31 /* Get the item (in the pack) */
\r
34 o_ptr = &inventory[item];
\r
37 /* Get the item (on the floor) */
\r
40 o_ptr = &o_list[0 - item];
\r
44 p_ptr->energy_use = 100;
\r
48 if (flush_failure) flush();
\r
49 msg_print(_("止まった時の中ではうまく働かないようだ。", "Nothing happen."));
\r
54 if (p_ptr->pclass == CLASS_BERSERKER)
\r
56 msg_print(_("巻物なんて読めない。", "You cannot read."));
\r
60 if (music_singing_any()) stop_singing();
\r
63 if (hex_spelling_any() && ((p_ptr->lev < 35) || hex_spell_fully())) stop_hex_spell_all();
\r
65 /* Not identified yet */
\r
69 lev = k_info[o_ptr->k_idx].level;
\r
71 /* Assume the scroll will get used up */
\r
74 if (o_ptr->tval == TV_SCROLL)
\r
76 /* Analyze the scroll */
\r
77 switch (o_ptr->sval)
\r
79 case SV_SCROLL_DARKNESS:
\r
81 if (!(p_ptr->resist_blind) && !(p_ptr->resist_dark))
\r
83 (void)set_blind(p_ptr->blind + 3 + randint1(5));
\r
85 if (unlite_area(10, 3)) ident = TRUE;
\r
89 case SV_SCROLL_AGGRAVATE_MONSTER:
\r
91 msg_print(_("カン高くうなる様な音が辺りを覆った。", "There is a high pitched humming noise."));
\r
92 aggravate_monsters(0);
\r
97 case SV_SCROLL_CURSE_ARMOR:
\r
99 if (curse_armor()) ident = TRUE;
\r
103 case SV_SCROLL_CURSE_WEAPON:
\r
106 if (buki_motteruka(INVEN_RARM))
\r
109 if (buki_motteruka(INVEN_LARM) && one_in_(2)) k = INVEN_LARM;
\r
111 else if (buki_motteruka(INVEN_LARM)) k = INVEN_LARM;
\r
112 if (k && curse_weapon(FALSE, k)) ident = TRUE;
\r
116 case SV_SCROLL_SUMMON_MONSTER:
\r
118 for (k = 0; k < randint1(3); k++)
\r
120 if (summon_specific(0, p_ptr->y, p_ptr->x, dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
\r
128 case SV_SCROLL_SUMMON_UNDEAD:
\r
130 for (k = 0; k < randint1(3); k++)
\r
132 if (summon_specific(0, p_ptr->y, p_ptr->x, dun_level, SUMMON_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
\r
140 case SV_SCROLL_SUMMON_PET:
\r
142 if (summon_specific(-1, p_ptr->y, p_ptr->x, dun_level, 0, (PM_ALLOW_GROUP | PM_FORCE_PET)))
\r
149 case SV_SCROLL_SUMMON_KIN:
\r
151 if (summon_kin_player(p_ptr->lev, p_ptr->y, p_ptr->x, (PM_FORCE_PET | PM_ALLOW_GROUP)))
\r
158 case SV_SCROLL_TRAP_CREATION:
\r
160 if (trap_creation(p_ptr->y, p_ptr->x)) ident = TRUE;
\r
164 case SV_SCROLL_PHASE_DOOR:
\r
166 teleport_player(10, 0L);
\r
171 case SV_SCROLL_TELEPORT:
\r
173 teleport_player(100, 0L);
\r
178 case SV_SCROLL_TELEPORT_LEVEL:
\r
180 (void)teleport_level(0);
\r
185 case SV_SCROLL_WORD_OF_RECALL:
\r
187 if (!word_of_recall()) used_up = FALSE;
\r
192 case SV_SCROLL_IDENTIFY:
\r
194 if (!ident_spell(FALSE)) used_up = FALSE;
\r
199 case SV_SCROLL_STAR_IDENTIFY:
\r
201 if (!identify_fully(FALSE)) used_up = FALSE;
\r
206 case SV_SCROLL_REMOVE_CURSE:
\r
208 if (remove_curse())
\r
215 case SV_SCROLL_STAR_REMOVE_CURSE:
\r
217 if (remove_all_curse())
\r
224 case SV_SCROLL_ENCHANT_ARMOR:
\r
227 if (!enchant_spell(0, 0, 1)) used_up = FALSE;
\r
231 case SV_SCROLL_ENCHANT_WEAPON_TO_HIT:
\r
233 if (!enchant_spell(1, 0, 0)) used_up = FALSE;
\r
238 case SV_SCROLL_ENCHANT_WEAPON_TO_DAM:
\r
240 if (!enchant_spell(0, 1, 0)) used_up = FALSE;
\r
245 case SV_SCROLL_STAR_ENCHANT_ARMOR:
\r
247 if (!enchant_spell(0, 0, randint1(3) + 2)) used_up = FALSE;
\r
252 case SV_SCROLL_STAR_ENCHANT_WEAPON:
\r
254 if (!enchant_spell(randint1(3), randint1(3), 0)) used_up = FALSE;
\r
259 case SV_SCROLL_RECHARGING:
\r
261 if (!recharge(130)) used_up = FALSE;
\r
266 case SV_SCROLL_MUNDANITY:
\r
269 if (!mundane_spell(FALSE)) used_up = FALSE;
\r
273 case SV_SCROLL_LIGHT:
\r
275 if (lite_area(damroll(2, 8), 2)) ident = TRUE;
\r
279 case SV_SCROLL_MAPPING:
\r
281 map_area(DETECT_RAD_MAP);
\r
286 case SV_SCROLL_DETECT_GOLD:
\r
288 if (detect_treasure(DETECT_RAD_DEFAULT)) ident = TRUE;
\r
289 if (detect_objects_gold(DETECT_RAD_DEFAULT)) ident = TRUE;
\r
293 case SV_SCROLL_DETECT_ITEM:
\r
295 if (detect_objects_normal(DETECT_RAD_DEFAULT)) ident = TRUE;
\r
299 case SV_SCROLL_DETECT_TRAP:
\r
301 if (detect_traps(DETECT_RAD_DEFAULT, known)) ident = TRUE;
\r
305 case SV_SCROLL_DETECT_DOOR:
\r
307 if (detect_doors(DETECT_RAD_DEFAULT)) ident = TRUE;
\r
308 if (detect_stairs(DETECT_RAD_DEFAULT)) ident = TRUE;
\r
312 case SV_SCROLL_DETECT_INVIS:
\r
314 if (detect_monsters_invis(DETECT_RAD_DEFAULT)) ident = TRUE;
\r
318 case SV_SCROLL_SATISFY_HUNGER:
\r
320 if (set_food(PY_FOOD_MAX - 1)) ident = TRUE;
\r
324 case SV_SCROLL_BLESSING:
\r
326 if (set_blessed(p_ptr->blessed + randint1(12) + 6, FALSE)) ident = TRUE;
\r
330 case SV_SCROLL_HOLY_CHANT:
\r
332 if (set_blessed(p_ptr->blessed + randint1(24) + 12, FALSE)) ident = TRUE;
\r
336 case SV_SCROLL_HOLY_PRAYER:
\r
338 if (set_blessed(p_ptr->blessed + randint1(48) + 24, FALSE)) ident = TRUE;
\r
342 case SV_SCROLL_MONSTER_CONFUSION:
\r
344 if (!(p_ptr->special_attack & ATTACK_CONFUSE))
\r
346 msg_print(_("手が輝き始めた。", "Your hands begin to glow."));
\r
347 p_ptr->special_attack |= ATTACK_CONFUSE;
\r
348 p_ptr->redraw |= (PR_STATUS);
\r
354 case SV_SCROLL_PROTECTION_FROM_EVIL:
\r
356 k = 3 * p_ptr->lev;
\r
357 if (set_protevil(p_ptr->protevil + randint1(25) + k, FALSE)) ident = TRUE;
\r
361 case SV_SCROLL_RUNE_OF_PROTECTION:
\r
368 case SV_SCROLL_TRAP_DOOR_DESTRUCTION:
\r
370 if (destroy_doors_touch()) ident = TRUE;
\r
374 case SV_SCROLL_STAR_DESTRUCTION:
\r
376 if (destroy_area(p_ptr->y, p_ptr->x, 13 + randint0(5), FALSE))
\r
379 msg_print(_("ダンジョンが揺れた...", "The dungeon trembles..."));
\r
384 case SV_SCROLL_DISPEL_UNDEAD:
\r
386 if (dispel_undead(80)) ident = TRUE;
\r
390 case SV_SCROLL_SPELL:
\r
392 if ((p_ptr->pclass == CLASS_WARRIOR) ||
\r
393 (p_ptr->pclass == CLASS_IMITATOR) ||
\r
394 (p_ptr->pclass == CLASS_MINDCRAFTER) ||
\r
395 (p_ptr->pclass == CLASS_SORCERER) ||
\r
396 (p_ptr->pclass == CLASS_ARCHER) ||
\r
397 (p_ptr->pclass == CLASS_MAGIC_EATER) ||
\r
398 (p_ptr->pclass == CLASS_RED_MAGE) ||
\r
399 (p_ptr->pclass == CLASS_SAMURAI) ||
\r
400 (p_ptr->pclass == CLASS_BLUE_MAGE) ||
\r
401 (p_ptr->pclass == CLASS_CAVALRY) ||
\r
402 (p_ptr->pclass == CLASS_BERSERKER) ||
\r
403 (p_ptr->pclass == CLASS_SMITH) ||
\r
404 (p_ptr->pclass == CLASS_MIRROR_MASTER) ||
\r
405 (p_ptr->pclass == CLASS_NINJA) ||
\r
406 (p_ptr->pclass == CLASS_SNIPER)) break;
\r
407 p_ptr->add_spells++;
\r
408 p_ptr->update |= (PU_SPELLS);
\r
413 case SV_SCROLL_GENOCIDE:
\r
415 (void)symbol_genocide(300, TRUE);
\r
420 case SV_SCROLL_MASS_GENOCIDE:
\r
422 (void)mass_genocide(300, TRUE);
\r
427 case SV_SCROLL_ACQUIREMENT:
\r
429 acquirement(p_ptr->y, p_ptr->x, 1, TRUE, FALSE, FALSE);
\r
434 case SV_SCROLL_STAR_ACQUIREMENT:
\r
436 acquirement(p_ptr->y, p_ptr->x, randint1(2) + 1, TRUE, FALSE, FALSE);
\r
441 /* New Hengband scrolls */
\r
442 case SV_SCROLL_FIRE:
\r
444 fire_ball(GF_FIRE, 0, 666, 4);
\r
445 /* Note: "Double" damage since it is centered on the player ... */
\r
446 if (!(IS_OPPOSE_FIRE() || p_ptr->resist_fire || p_ptr->immune_fire))
\r
447 take_hit(DAMAGE_NOESCAPE, 50+randint1(50), _("炎の巻物", "a Scroll of Fire"), -1);
\r
454 case SV_SCROLL_ICE:
\r
456 fire_ball(GF_ICE, 0, 777, 4);
\r
457 if (!(IS_OPPOSE_COLD() || p_ptr->resist_cold || p_ptr->immune_cold))
\r
458 take_hit(DAMAGE_NOESCAPE, 100+randint1(100), _("氷の巻物", "a Scroll of Ice"), -1);
\r
464 case SV_SCROLL_CHAOS:
\r
466 fire_ball(GF_CHAOS, 0, 1000, 4);
\r
467 if (!p_ptr->resist_chaos)
\r
468 take_hit(DAMAGE_NOESCAPE, 111+randint1(111), _("ログルスの巻物", "a Scroll of Logrus"), -1);
\r
474 case SV_SCROLL_RUMOR:
\r
476 msg_print(_("巻物にはメッセージが書かれている:", "There is message on the scroll. It says:"));
\r
478 display_rumor(TRUE);
\r
480 msg_print(_("巻物は煙を立てて消え去った!", "The scroll disappears in a puff of smoke!"));
\r
486 case SV_SCROLL_ARTIFACT:
\r
489 if (!artifact_scroll()) used_up = FALSE;
\r
493 case SV_SCROLL_RESET_RECALL:
\r
496 if (!reset_recall()) used_up = FALSE;
\r
500 case SV_SCROLL_AMUSEMENT:
\r
503 amusement(p_ptr->y, p_ptr->x, 1, FALSE);
\r
507 case SV_SCROLL_STAR_AMUSEMENT:
\r
510 amusement(p_ptr->y, p_ptr->x, randint1(2) + 1, FALSE);
\r
515 else if (o_ptr->name1 == ART_GHB)
\r
517 msg_print(_("私は苦労して『グレーター・ヘル=ビースト』を倒した。", "I had a very hard time to kill the Greater hell-beast, "));
\r
518 msg_print(_("しかし手に入ったのはこのきたないTシャツだけだった。", "but all I got was this lousy t-shirt!"));
\r
521 else if (o_ptr->name1 == ART_POWER)
\r
523 msg_print(_("「一つの指輪は全てを統べ、", "'One Ring to rule them all, "));
\r
525 msg_print(_("一つの指輪は全てを見つけ、", "One Ring to find them, "));
\r
527 msg_print(_("一つの指輪は全てを捕らえて", "One Ring to bring them all "));
\r
529 msg_print(_("暗闇の中に繋ぎとめる。」", "and in the darkness bind them.'"));
\r
532 else if (o_ptr->tval==TV_PARCHMENT)
\r
535 char o_name[MAX_NLEN];
\r
539 q=format("book-%d_jp.txt",o_ptr->sval);
\r
541 /* Display object description */
\r
542 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
544 /* Build the filename */
\r
545 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, q);
\r
547 /* Peruse the help file */
\r
548 (void)show_file(TRUE, buf, o_name, 0, 0);
\r
555 /* Combine / Reorder the pack (later) */
\r
556 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
\r
558 if (!(object_is_aware(o_ptr)))
\r
560 chg_virtue(V_PATIENCE, -1);
\r
561 chg_virtue(V_CHANCE, 1);
\r
562 chg_virtue(V_KNOWLEDGE, -1);
\r
565 /* The item was tried */
\r
566 object_tried(o_ptr);
\r
568 /* An identification was made */
\r
569 if (ident && !object_is_aware(o_ptr))
\r
571 object_aware(o_ptr);
\r
572 gain_exp((lev + (p_ptr->lev >> 1)) / p_ptr->lev);
\r
575 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
\r
578 /* Hack -- allow certain scrolls to be "preserved" */
\r
584 sound(SOUND_SCROLL);
\r
586 /* Destroy a scroll in the pack */
\r
589 inven_item_increase(item, -1);
\r
590 inven_item_describe(item);
\r
591 inven_item_optimize(item);
\r
594 /* Destroy a scroll on the floor */
\r
597 floor_item_increase(0 - item, -1);
\r
598 floor_item_describe(0 - item);
\r
599 floor_item_optimize(0 - item);
\r
604 * @brief 読むコマンドのメインルーチン /
\r
605 * Eat some food (from the pack or floor)
\r
608 void do_cmd_read_scroll(void)
\r
610 object_type *o_ptr;
\r
614 if (p_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))
\r
616 set_action(ACTION_NONE);
\r
619 /* Check some conditions */
\r
622 msg_print(_("目が見えない。", "You can't see anything."));
\r
627 msg_print(_("明かりがないので、暗くて読めない。", "You have no light to read by."));
\r
630 if (p_ptr->confused)
\r
632 msg_print(_("混乱していて読めない。", "You are too confused!"));
\r
637 /* Restrict choices to scrolls */
\r
638 item_tester_hook = item_tester_hook_readable;
\r
640 q = _("どの巻物を読みますか? ", "Read which scroll? ");
\r
641 s = _("読める巻物がない。", "You have no scrolls to read.");
\r
643 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
\r
645 /* Get the item (in the pack) */
\r
648 o_ptr = &inventory[item];
\r
651 /* Get the item (on the floor) */
\r
654 o_ptr = &o_list[0 - item];
\r
657 /* Read the scroll */
\r
658 do_cmd_read_scroll_aux(item, object_is_aware(o_ptr));
\r