3 * @brief プレイヤーの読むコマンド実装
12 #include "object-flavor.h"
13 #include "object-hook.h"
16 #include "player-status.h"
17 #include "player-damage.h"
18 #include "player-class.h"
19 #include "player-effects.h"
20 #include "player-inventory.h"
22 #include "realm-hex.h"
25 #include "spells-object.h"
26 #include "spells-floor.h"
27 #include "spells-summon.h"
28 #include "spells-status.h"
30 #include "cmd-basic.h"
33 #include "objectkind.h"
34 #include "realm-song.h"
35 #include "view-mainwindow.h"
38 * @brief 巻物を読むコマンドのサブルーチン
39 * Read a scroll (from the pack or floor).
40 * @param item 読むオブジェクトの所持品ID
41 * @param known 判明済ならばTRUE
45 * Certain scrolls can be "aborted" without losing the scroll. These
46 * include scrolls with no effects but recharge or identify, which are
47 * cancelled before use. XXX Reading them still takes a turn, though.
50 void exe_read(player_type *creature_ptr, INVENTORY_IDX item, bool known)
52 int k, used_up, ident, lev;
55 o_ptr = REF_ITEM(creature_ptr, creature_ptr->current_floor_ptr, item);
57 take_turn(creature_ptr, 100);
58 if (cmd_limit_time_walk(creature_ptr)) return;
60 if (creature_ptr->pclass == CLASS_BERSERKER)
62 msg_print(_("巻物なんて読めない。", "You cannot read."));
66 if (music_singing_any(creature_ptr)) stop_singing(creature_ptr);
67 if (hex_spelling_any(creature_ptr) && ((creature_ptr->lev < 35) || hex_spell_fully(creature_ptr))) stop_hex_spell_all(creature_ptr);
69 /* Not identified yet */
73 lev = k_info[o_ptr->k_idx].level;
75 /* Assume the scroll will get used up */
78 if (o_ptr->tval == TV_SCROLL)
80 /* Analyze the scroll */
83 case SV_SCROLL_DARKNESS:
85 if (!(creature_ptr->resist_blind) && !(creature_ptr->resist_dark))
87 (void)set_blind(creature_ptr, creature_ptr->blind + 3 + randint1(5));
89 if (unlite_area(10, 3)) ident = TRUE;
93 case SV_SCROLL_AGGRAVATE_MONSTER:
95 msg_print(_("カン高くうなる様な音が辺りを覆った。", "There is a high pitched humming noise."));
96 aggravate_monsters(0);
101 case SV_SCROLL_CURSE_ARMOR:
103 if (curse_armor(creature_ptr)) ident = TRUE;
107 case SV_SCROLL_CURSE_WEAPON:
110 if (has_melee_weapon(creature_ptr, INVEN_RARM))
113 if (has_melee_weapon(creature_ptr, INVEN_LARM) && one_in_(2)) k = INVEN_LARM;
115 else if (has_melee_weapon(creature_ptr, INVEN_LARM)) k = INVEN_LARM;
116 if (k && curse_weapon_object(creature_ptr, FALSE, &creature_ptr->inventory_list[k])) ident = TRUE;
120 case SV_SCROLL_SUMMON_MONSTER:
122 for (k = 0; k < randint1(3); k++)
124 if (summon_specific(0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
132 case SV_SCROLL_SUMMON_UNDEAD:
134 for (k = 0; k < randint1(3); k++)
136 if (summon_specific(0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
144 case SV_SCROLL_SUMMON_PET:
146 if (summon_specific(-1, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_FORCE_PET)))
153 case SV_SCROLL_SUMMON_KIN:
155 if (summon_kin_player(creature_ptr->lev, creature_ptr->y, creature_ptr->x, (PM_FORCE_PET | PM_ALLOW_GROUP)))
162 case SV_SCROLL_TRAP_CREATION:
164 if (trap_creation(creature_ptr->y, creature_ptr->x)) ident = TRUE;
168 case SV_SCROLL_PHASE_DOOR:
170 teleport_player(creature_ptr, 10, 0L);
175 case SV_SCROLL_TELEPORT:
177 teleport_player(creature_ptr, 100, 0L);
182 case SV_SCROLL_TELEPORT_LEVEL:
184 (void)teleport_level(creature_ptr, 0);
189 case SV_SCROLL_WORD_OF_RECALL:
191 if (!recall_player(creature_ptr, randint0(21) + 15)) used_up = FALSE;
196 case SV_SCROLL_IDENTIFY:
198 if (!ident_spell(creature_ptr, FALSE)) used_up = FALSE;
203 case SV_SCROLL_STAR_IDENTIFY:
205 if (!identify_fully(FALSE)) used_up = FALSE;
210 case SV_SCROLL_REMOVE_CURSE:
212 if (remove_curse(creature_ptr))
219 case SV_SCROLL_STAR_REMOVE_CURSE:
221 if (remove_all_curse(creature_ptr))
228 case SV_SCROLL_ENCHANT_ARMOR:
231 if (!enchant_spell(creature_ptr, 0, 0, 1)) used_up = FALSE;
235 case SV_SCROLL_ENCHANT_WEAPON_TO_HIT:
237 if (!enchant_spell(creature_ptr, 1, 0, 0)) used_up = FALSE;
242 case SV_SCROLL_ENCHANT_WEAPON_TO_DAM:
244 if (!enchant_spell(creature_ptr, 0, 1, 0)) used_up = FALSE;
249 case SV_SCROLL_STAR_ENCHANT_ARMOR:
251 if (!enchant_spell(creature_ptr, 0, 0, randint1(3) + 2)) used_up = FALSE;
256 case SV_SCROLL_STAR_ENCHANT_WEAPON:
258 if (!enchant_spell(creature_ptr, randint1(3), randint1(3), 0)) used_up = FALSE;
263 case SV_SCROLL_RECHARGING:
265 if (!recharge(creature_ptr, 130)) used_up = FALSE;
270 case SV_SCROLL_MUNDANITY:
273 if (!mundane_spell(creature_ptr, FALSE)) used_up = FALSE;
277 case SV_SCROLL_LIGHT:
279 if (lite_area(damroll(2, 8), 2)) ident = TRUE;
283 case SV_SCROLL_MAPPING:
285 map_area(creature_ptr, DETECT_RAD_MAP);
290 case SV_SCROLL_DETECT_GOLD:
292 if (detect_treasure(DETECT_RAD_DEFAULT)) ident = TRUE;
293 if (detect_objects_gold(creature_ptr, DETECT_RAD_DEFAULT)) ident = TRUE;
297 case SV_SCROLL_DETECT_ITEM:
299 if (detect_objects_normal(DETECT_RAD_DEFAULT)) ident = TRUE;
303 case SV_SCROLL_DETECT_TRAP:
305 if (detect_traps(DETECT_RAD_DEFAULT, known)) ident = TRUE;
309 case SV_SCROLL_DETECT_DOOR:
311 if (detect_doors(DETECT_RAD_DEFAULT)) ident = TRUE;
312 if (detect_stairs(DETECT_RAD_DEFAULT)) ident = TRUE;
316 case SV_SCROLL_DETECT_INVIS:
318 if (detect_monsters_invis(DETECT_RAD_DEFAULT)) ident = TRUE;
322 case SV_SCROLL_SATISFY_HUNGER:
324 if (set_food(creature_ptr, PY_FOOD_MAX - 1)) ident = TRUE;
328 case SV_SCROLL_BLESSING:
330 if (set_blessed(creature_ptr, creature_ptr->blessed + randint1(12) + 6, FALSE)) ident = TRUE;
334 case SV_SCROLL_HOLY_CHANT:
336 if (set_blessed(creature_ptr, creature_ptr->blessed + randint1(24) + 12, FALSE)) ident = TRUE;
340 case SV_SCROLL_HOLY_PRAYER:
342 if (set_blessed(creature_ptr, creature_ptr->blessed + randint1(48) + 24, FALSE)) ident = TRUE;
346 case SV_SCROLL_MONSTER_CONFUSION:
348 if (!(creature_ptr->special_attack & ATTACK_CONFUSE))
350 msg_print(_("手が輝き始めた。", "Your hands begin to glow."));
351 creature_ptr->special_attack |= ATTACK_CONFUSE;
352 creature_ptr->redraw |= (PR_STATUS);
358 case SV_SCROLL_PROTECTION_FROM_EVIL:
360 k = 3 * creature_ptr->lev;
361 if (set_protevil(creature_ptr, creature_ptr->protevil + randint1(25) + k, FALSE)) ident = TRUE;
365 case SV_SCROLL_RUNE_OF_PROTECTION:
367 warding_glyph(creature_ptr);
372 case SV_SCROLL_TRAP_DOOR_DESTRUCTION:
374 if (destroy_doors_touch()) ident = TRUE;
378 case SV_SCROLL_STAR_DESTRUCTION:
380 if (destroy_area(creature_ptr->current_floor_ptr, creature_ptr->y, creature_ptr->x, 13 + randint0(5), FALSE))
383 msg_print(_("ダンジョンが揺れた...", "The dungeon trembles..."));
388 case SV_SCROLL_DISPEL_UNDEAD:
390 if (dispel_undead(80)) ident = TRUE;
394 case SV_SCROLL_SPELL:
396 if ((creature_ptr->pclass == CLASS_WARRIOR) ||
397 (creature_ptr->pclass == CLASS_IMITATOR) ||
398 (creature_ptr->pclass == CLASS_MINDCRAFTER) ||
399 (creature_ptr->pclass == CLASS_SORCERER) ||
400 (creature_ptr->pclass == CLASS_ARCHER) ||
401 (creature_ptr->pclass == CLASS_MAGIC_EATER) ||
402 (creature_ptr->pclass == CLASS_RED_MAGE) ||
403 (creature_ptr->pclass == CLASS_SAMURAI) ||
404 (creature_ptr->pclass == CLASS_BLUE_MAGE) ||
405 (creature_ptr->pclass == CLASS_CAVALRY) ||
406 (creature_ptr->pclass == CLASS_BERSERKER) ||
407 (creature_ptr->pclass == CLASS_SMITH) ||
408 (creature_ptr->pclass == CLASS_MIRROR_MASTER) ||
409 (creature_ptr->pclass == CLASS_NINJA) ||
410 (creature_ptr->pclass == CLASS_SNIPER)) break;
411 creature_ptr->add_spells++;
412 creature_ptr->update |= (PU_SPELLS);
417 case SV_SCROLL_GENOCIDE:
419 (void)symbol_genocide(creature_ptr, 300, TRUE);
424 case SV_SCROLL_MASS_GENOCIDE:
426 (void)mass_genocide(creature_ptr, 300, TRUE);
431 case SV_SCROLL_ACQUIREMENT:
433 acquirement(creature_ptr->y, creature_ptr->x, 1, TRUE, FALSE, FALSE);
438 case SV_SCROLL_STAR_ACQUIREMENT:
440 acquirement(creature_ptr->y, creature_ptr->x, randint1(2) + 1, TRUE, FALSE, FALSE);
445 /* New Hengband scrolls */
448 fire_ball(creature_ptr, GF_FIRE, 0, 666, 4);
449 /* Note: "Double" damage since it is centered on the player ... */
450 if (!(IS_OPPOSE_FIRE() || creature_ptr->resist_fire || creature_ptr->immune_fire))
451 take_hit(creature_ptr, DAMAGE_NOESCAPE, 50+randint1(50), _("炎の巻物", "a Scroll of Fire"), -1);
460 fire_ball(creature_ptr, GF_ICE, 0, 777, 4);
461 if (!(IS_OPPOSE_COLD() || creature_ptr->resist_cold || creature_ptr->immune_cold))
462 take_hit(creature_ptr, DAMAGE_NOESCAPE, 100+randint1(100), _("氷の巻物", "a Scroll of Ice"), -1);
468 case SV_SCROLL_CHAOS:
470 fire_ball(creature_ptr, GF_CHAOS, 0, 1000, 4);
471 if (!creature_ptr->resist_chaos)
472 take_hit(creature_ptr, DAMAGE_NOESCAPE, 111+randint1(111), _("ログルスの巻物", "a Scroll of Logrus"), -1);
478 case SV_SCROLL_RUMOR:
480 msg_print(_("巻物にはメッセージが書かれている:", "There is message on the scroll. It says:"));
484 msg_print(_("巻物は煙を立てて消え去った!", "The scroll disappears in a puff of smoke!"));
490 case SV_SCROLL_ARTIFACT:
493 if (!artifact_scroll()) used_up = FALSE;
497 case SV_SCROLL_RESET_RECALL:
500 if (!reset_recall()) used_up = FALSE;
504 case SV_SCROLL_AMUSEMENT:
507 amusement(creature_ptr->y, creature_ptr->x, 1, FALSE);
511 case SV_SCROLL_STAR_AMUSEMENT:
514 amusement(creature_ptr->y, creature_ptr->x, randint1(2) + 1, FALSE);
519 else if (o_ptr->name1 == ART_GHB)
521 msg_print(_("私は苦労して『グレーター・ヘル=ビースト』を倒した。", "I had a very hard time to kill the Greater hell-beast, "));
522 msg_print(_("しかし手に入ったのはこのきたないTシャツだけだった。", "but all I got was this lousy t-shirt!"));
525 else if (o_ptr->name1 == ART_POWER)
527 msg_print(_("「一つの指輪は全てを統べ、", "'One Ring to rule them all, "));
529 msg_print(_("一つの指輪は全てを見つけ、", "One Ring to find them, "));
531 msg_print(_("一つの指輪は全てを捕らえて", "One Ring to bring them all "));
533 msg_print(_("暗闇の中に繋ぎとめる。」", "and in the darkness bind them.'"));
536 else if (o_ptr->tval==TV_PARCHMENT)
539 GAME_TEXT o_name[MAX_NLEN];
543 q=format("book-%d_jp.txt",o_ptr->sval);
545 /* Display object description */
546 object_desc(o_name, o_ptr, OD_NAME_ONLY);
547 path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, q);
549 /* Peruse the help file */
550 (void)show_file(TRUE, buf, o_name, 0, 0);
556 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
558 if (!(object_is_aware(o_ptr)))
560 chg_virtue(creature_ptr, V_PATIENCE, -1);
561 chg_virtue(creature_ptr, V_CHANCE, 1);
562 chg_virtue(creature_ptr, V_KNOWLEDGE, -1);
565 /* The item was tried */
568 /* An identification was made */
569 if (ident && !object_is_aware(o_ptr))
572 gain_exp(creature_ptr, (lev + (creature_ptr->lev >> 1)) / creature_ptr->lev);
575 creature_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
578 /* Hack -- allow certain scrolls to be "preserved" */
589 * @brief 読むコマンドのメインルーチン /
590 * Eat some food (from the pack or floor)
593 void do_cmd_read_scroll(player_type *creature_ptr)
599 if (creature_ptr->wild_mode)
604 if (cmd_limit_arena(creature_ptr)) return;
606 if (creature_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))
608 set_action(creature_ptr, ACTION_NONE);
611 if (cmd_limit_blind(creature_ptr)) return;
612 if (cmd_limit_confused(creature_ptr)) return;
614 /* Restrict choices to scrolls */
615 item_tester_hook = item_tester_hook_readable;
617 q = _("どの巻物を読みますか? ", "Read which scroll? ");
618 s = _("読める巻物がない。", "You have no scrolls to read.");
620 o_ptr = choose_object(p_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0);
623 /* Read the scroll */
624 exe_read(creature_ptr, item, object_is_aware(o_ptr));