-/*!\r
- * @file cmd-read.c\r
- * @brief プレイヤーの読むコマンド実装\r
- * @date 2018/09/07\r
- * @details\r
- * cmd6.cより分離。\r
- */\r
-\r
-#include "angband.h"\r
-#include "object-hook.h"\r
-#include "spells-summon.h"\r
-#include "artifact.h"\r
-\r
-/*!\r
- * @brief 巻物を読むコマンドのサブルーチン\r
- * Read a scroll (from the pack or floor).\r
- * @param item 読むオブジェクトの所持品ID\r
- * @param known 判明済ならばTRUE\r
- * @return なし\r
- * @details\r
- * <pre>\r
- * Certain scrolls can be "aborted" without losing the scroll. These\r
- * include scrolls with no effects but recharge or identify, which are\r
- * cancelled before use. XXX Reading them still takes a turn, though.\r
- * </pre>\r
- */\r
-void do_cmd_read_scroll_aux(INVENTORY_IDX item, bool known)\r
-{\r
- int k, used_up, ident, lev;\r
- object_type *o_ptr;\r
-\r
-\r
- /* Get the item (in the pack) */\r
- if (item >= 0)\r
- {\r
- o_ptr = &inventory[item];\r
- }\r
-\r
- /* Get the item (on the floor) */\r
- else\r
- {\r
- o_ptr = &o_list[0 - item];\r
- }\r
-\r
-\r
- p_ptr->energy_use = 100;\r
-\r
- if (world_player)\r
- {\r
- if (flush_failure) flush();\r
- msg_print(_("止まった時の中ではうまく働かないようだ。", "Nothing happen."));\r
- sound(SOUND_FAIL);\r
- return;\r
- }\r
-\r
- if (p_ptr->pclass == CLASS_BERSERKER)\r
- {\r
- msg_print(_("巻物なんて読めない。", "You cannot read."));\r
- return;\r
- }\r
-\r
- if (music_singing_any()) stop_singing();\r
-\r
- /* Hex */\r
- if (hex_spelling_any() && ((p_ptr->lev < 35) || hex_spell_fully())) stop_hex_spell_all();\r
-\r
- /* Not identified yet */\r
- ident = FALSE;\r
-\r
- /* Object level */\r
- lev = k_info[o_ptr->k_idx].level;\r
-\r
- /* Assume the scroll will get used up */\r
- used_up = TRUE;\r
-\r
- if (o_ptr->tval == TV_SCROLL)\r
- {\r
- /* Analyze the scroll */\r
- switch (o_ptr->sval)\r
- {\r
- case SV_SCROLL_DARKNESS:\r
- {\r
- if (!(p_ptr->resist_blind) && !(p_ptr->resist_dark))\r
- {\r
- (void)set_blind(p_ptr->blind + 3 + randint1(5));\r
- }\r
- if (unlite_area(10, 3)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_AGGRAVATE_MONSTER:\r
- {\r
- msg_print(_("カン高くうなる様な音が辺りを覆った。", "There is a high pitched humming noise."));\r
- aggravate_monsters(0);\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_CURSE_ARMOR:\r
- {\r
- if (curse_armor()) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_CURSE_WEAPON:\r
- {\r
- k = 0;\r
- if (buki_motteruka(INVEN_RARM))\r
- {\r
- k = INVEN_RARM;\r
- if (buki_motteruka(INVEN_LARM) && one_in_(2)) k = INVEN_LARM;\r
- }\r
- else if (buki_motteruka(INVEN_LARM)) k = INVEN_LARM;\r
- if (k && curse_weapon(FALSE, k)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_SUMMON_MONSTER:\r
- {\r
- for (k = 0; k < randint1(3); k++)\r
- {\r
- if (summon_specific(0, p_ptr->y, p_ptr->x, dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0'))\r
- {\r
- ident = TRUE;\r
- }\r
- }\r
- break;\r
- }\r
-\r
- case SV_SCROLL_SUMMON_UNDEAD:\r
- {\r
- for (k = 0; k < randint1(3); k++)\r
- {\r
- 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
- {\r
- ident = TRUE;\r
- }\r
- }\r
- break;\r
- }\r
-\r
- case SV_SCROLL_SUMMON_PET:\r
- {\r
- if (summon_specific(-1, p_ptr->y, p_ptr->x, dun_level, 0, (PM_ALLOW_GROUP | PM_FORCE_PET), '\0'))\r
- {\r
- ident = TRUE;\r
- }\r
- break;\r
- }\r
-\r
- case SV_SCROLL_SUMMON_KIN:\r
- {\r
- if (summon_kin_player(p_ptr->lev, p_ptr->y, p_ptr->x, (PM_FORCE_PET | PM_ALLOW_GROUP)))\r
- {\r
- ident = TRUE;\r
- }\r
- break;\r
- }\r
-\r
- case SV_SCROLL_TRAP_CREATION:\r
- {\r
- if (trap_creation(p_ptr->y, p_ptr->x)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_PHASE_DOOR:\r
- {\r
- teleport_player(10, 0L);\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_TELEPORT:\r
- {\r
- teleport_player(100, 0L);\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_TELEPORT_LEVEL:\r
- {\r
- (void)teleport_level(0);\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_WORD_OF_RECALL:\r
- {\r
- if (!recall_player(p_ptr, randint0(21) + 15)) used_up = FALSE;\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_IDENTIFY:\r
- {\r
- if (!ident_spell(FALSE)) used_up = FALSE;\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_STAR_IDENTIFY:\r
- {\r
- if (!identify_fully(FALSE)) used_up = FALSE;\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_REMOVE_CURSE:\r
- {\r
- if (remove_curse())\r
- {\r
- ident = TRUE;\r
- }\r
- break;\r
- }\r
-\r
- case SV_SCROLL_STAR_REMOVE_CURSE:\r
- {\r
- if (remove_all_curse())\r
- {\r
- ident = TRUE;\r
- }\r
- break;\r
- }\r
-\r
- case SV_SCROLL_ENCHANT_ARMOR:\r
- {\r
- ident = TRUE;\r
- if (!enchant_spell(0, 0, 1)) used_up = FALSE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_ENCHANT_WEAPON_TO_HIT:\r
- {\r
- if (!enchant_spell(1, 0, 0)) used_up = FALSE;\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_ENCHANT_WEAPON_TO_DAM:\r
- {\r
- if (!enchant_spell(0, 1, 0)) used_up = FALSE;\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_STAR_ENCHANT_ARMOR:\r
- {\r
- if (!enchant_spell(0, 0, randint1(3) + 2)) used_up = FALSE;\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_STAR_ENCHANT_WEAPON:\r
- {\r
- if (!enchant_spell(randint1(3), randint1(3), 0)) used_up = FALSE;\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_RECHARGING:\r
- {\r
- if (!recharge(130)) used_up = FALSE;\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_MUNDANITY:\r
- {\r
- ident = TRUE;\r
- if (!mundane_spell(FALSE)) used_up = FALSE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_LIGHT:\r
- {\r
- if (lite_area(damroll(2, 8), 2)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_MAPPING:\r
- {\r
- map_area(DETECT_RAD_MAP);\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_DETECT_GOLD:\r
- {\r
- if (detect_treasure(DETECT_RAD_DEFAULT)) ident = TRUE;\r
- if (detect_objects_gold(DETECT_RAD_DEFAULT)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_DETECT_ITEM:\r
- {\r
- if (detect_objects_normal(DETECT_RAD_DEFAULT)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_DETECT_TRAP:\r
- {\r
- if (detect_traps(DETECT_RAD_DEFAULT, known)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_DETECT_DOOR:\r
- {\r
- if (detect_doors(DETECT_RAD_DEFAULT)) ident = TRUE;\r
- if (detect_stairs(DETECT_RAD_DEFAULT)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_DETECT_INVIS:\r
- {\r
- if (detect_monsters_invis(DETECT_RAD_DEFAULT)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_SATISFY_HUNGER:\r
- {\r
- if (set_food(PY_FOOD_MAX - 1)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_BLESSING:\r
- {\r
- if (set_blessed(p_ptr->blessed + randint1(12) + 6, FALSE)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_HOLY_CHANT:\r
- {\r
- if (set_blessed(p_ptr->blessed + randint1(24) + 12, FALSE)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_HOLY_PRAYER:\r
- {\r
- if (set_blessed(p_ptr->blessed + randint1(48) + 24, FALSE)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_MONSTER_CONFUSION:\r
- {\r
- if (!(p_ptr->special_attack & ATTACK_CONFUSE))\r
- {\r
- msg_print(_("手が輝き始めた。", "Your hands begin to glow."));\r
- p_ptr->special_attack |= ATTACK_CONFUSE;\r
- p_ptr->redraw |= (PR_STATUS);\r
- ident = TRUE;\r
- }\r
- break;\r
- }\r
-\r
- case SV_SCROLL_PROTECTION_FROM_EVIL:\r
- {\r
- k = 3 * p_ptr->lev;\r
- if (set_protevil(p_ptr->protevil + randint1(25) + k, FALSE)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_RUNE_OF_PROTECTION:\r
- {\r
- warding_glyph();\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_TRAP_DOOR_DESTRUCTION:\r
- {\r
- if (destroy_doors_touch()) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_STAR_DESTRUCTION:\r
- {\r
- if (destroy_area(p_ptr->y, p_ptr->x, 13 + randint0(5), FALSE))\r
- ident = TRUE;\r
- else\r
- msg_print(_("ダンジョンが揺れた...", "The dungeon trembles..."));\r
-\r
- break;\r
- }\r
-\r
- case SV_SCROLL_DISPEL_UNDEAD:\r
- {\r
- if (dispel_undead(80)) ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_SPELL:\r
- {\r
- if ((p_ptr->pclass == CLASS_WARRIOR) ||\r
- (p_ptr->pclass == CLASS_IMITATOR) ||\r
- (p_ptr->pclass == CLASS_MINDCRAFTER) ||\r
- (p_ptr->pclass == CLASS_SORCERER) ||\r
- (p_ptr->pclass == CLASS_ARCHER) ||\r
- (p_ptr->pclass == CLASS_MAGIC_EATER) ||\r
- (p_ptr->pclass == CLASS_RED_MAGE) ||\r
- (p_ptr->pclass == CLASS_SAMURAI) ||\r
- (p_ptr->pclass == CLASS_BLUE_MAGE) ||\r
- (p_ptr->pclass == CLASS_CAVALRY) ||\r
- (p_ptr->pclass == CLASS_BERSERKER) ||\r
- (p_ptr->pclass == CLASS_SMITH) ||\r
- (p_ptr->pclass == CLASS_MIRROR_MASTER) ||\r
- (p_ptr->pclass == CLASS_NINJA) ||\r
- (p_ptr->pclass == CLASS_SNIPER)) break;\r
- p_ptr->add_spells++;\r
- p_ptr->update |= (PU_SPELLS);\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_GENOCIDE:\r
- {\r
- (void)symbol_genocide(300, TRUE);\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_MASS_GENOCIDE:\r
- {\r
- (void)mass_genocide(300, TRUE);\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_ACQUIREMENT:\r
- {\r
- acquirement(p_ptr->y, p_ptr->x, 1, TRUE, FALSE, FALSE);\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_STAR_ACQUIREMENT:\r
- {\r
- acquirement(p_ptr->y, p_ptr->x, randint1(2) + 1, TRUE, FALSE, FALSE);\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- /* New Hengband scrolls */\r
- case SV_SCROLL_FIRE:\r
- {\r
- fire_ball(GF_FIRE, 0, 666, 4);\r
- /* Note: "Double" damage since it is centered on the player ... */\r
- if (!(IS_OPPOSE_FIRE() || p_ptr->resist_fire || p_ptr->immune_fire))\r
- take_hit(DAMAGE_NOESCAPE, 50+randint1(50), _("炎の巻物", "a Scroll of Fire"), -1);\r
-\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
-\r
- case SV_SCROLL_ICE:\r
- {\r
- fire_ball(GF_ICE, 0, 777, 4);\r
- if (!(IS_OPPOSE_COLD() || p_ptr->resist_cold || p_ptr->immune_cold))\r
- take_hit(DAMAGE_NOESCAPE, 100+randint1(100), _("氷の巻物", "a Scroll of Ice"), -1);\r
-\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_CHAOS:\r
- {\r
- fire_ball(GF_CHAOS, 0, 1000, 4);\r
- if (!p_ptr->resist_chaos)\r
- take_hit(DAMAGE_NOESCAPE, 111+randint1(111), _("ログルスの巻物", "a Scroll of Logrus"), -1);\r
-\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_RUMOR:\r
- {\r
- msg_print(_("巻物にはメッセージが書かれている:", "There is message on the scroll. It says:"));\r
- msg_print(NULL);\r
- display_rumor(TRUE);\r
- msg_print(NULL);\r
- msg_print(_("巻物は煙を立てて消え去った!", "The scroll disappears in a puff of smoke!"));\r
-\r
- ident = TRUE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_ARTIFACT:\r
- {\r
- ident = TRUE;\r
- if (!artifact_scroll()) used_up = FALSE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_RESET_RECALL:\r
- {\r
- ident = TRUE;\r
- if (!reset_recall()) used_up = FALSE;\r
- break;\r
- }\r
-\r
- case SV_SCROLL_AMUSEMENT:\r
- {\r
- ident = TRUE;\r
- amusement(p_ptr->y, p_ptr->x, 1, FALSE);\r
- break;\r
- }\r
-\r
- case SV_SCROLL_STAR_AMUSEMENT:\r
- {\r
- ident = TRUE;\r
- amusement(p_ptr->y, p_ptr->x, randint1(2) + 1, FALSE);\r
- break;\r
- }\r
- }\r
- }\r
- else if (o_ptr->name1 == ART_GHB)\r
- {\r
- msg_print(_("私は苦労して『グレーター・ヘル=ビースト』を倒した。", "I had a very hard time to kill the Greater hell-beast, "));\r
- msg_print(_("しかし手に入ったのはこのきたないTシャツだけだった。", "but all I got was this lousy t-shirt!"));\r
- used_up = FALSE;\r
- }\r
- else if (o_ptr->name1 == ART_POWER)\r
- {\r
- msg_print(_("「一つの指輪は全てを統べ、", "'One Ring to rule them all, "));\r
- msg_print(NULL);\r
- msg_print(_("一つの指輪は全てを見つけ、", "One Ring to find them, "));\r
- msg_print(NULL);\r
- msg_print(_("一つの指輪は全てを捕らえて", "One Ring to bring them all "));\r
- msg_print(NULL);\r
- msg_print(_("暗闇の中に繋ぎとめる。」", "and in the darkness bind them.'"));\r
- used_up = FALSE;\r
- }\r
- else if (o_ptr->tval==TV_PARCHMENT)\r
- {\r
- concptr q;\r
- GAME_TEXT o_name[MAX_NLEN];\r
- char buf[1024];\r
- screen_save();\r
-\r
- q=format("book-%d_jp.txt",o_ptr->sval);\r
-\r
- /* Display object description */\r
- object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
-\r
- /* Build the filename */\r
- path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, q);\r
-\r
- /* Peruse the help file */\r
- (void)show_file(TRUE, buf, o_name, 0, 0);\r
- screen_load();\r
-\r
- used_up=FALSE;\r
- }\r
-\r
-\r
- /* Combine / Reorder the pack (later) */\r
- p_ptr->update |= (PU_COMBINE | PU_REORDER);\r
-\r
- if (!(object_is_aware(o_ptr)))\r
- {\r
- chg_virtue(V_PATIENCE, -1);\r
- chg_virtue(V_CHANCE, 1);\r
- chg_virtue(V_KNOWLEDGE, -1);\r
- }\r
-\r
- /* The item was tried */\r
- object_tried(o_ptr);\r
-\r
- /* An identification was made */\r
- if (ident && !object_is_aware(o_ptr))\r
- {\r
- object_aware(o_ptr);\r
- gain_exp((lev + (p_ptr->lev >> 1)) / p_ptr->lev);\r
- }\r
-\r
- p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);\r
-\r
-\r
- /* Hack -- allow certain scrolls to be "preserved" */\r
- if (!used_up)\r
- {\r
- return;\r
- }\r
-\r
- sound(SOUND_SCROLL);\r
-\r
- /* Destroy a scroll in the pack */\r
- if (item >= 0)\r
- {\r
- inven_item_increase(item, -1);\r
- inven_item_describe(item);\r
- inven_item_optimize(item);\r
- }\r
-\r
- /* Destroy a scroll on the floor */\r
- else\r
- {\r
- floor_item_increase(0 - item, -1);\r
- floor_item_describe(0 - item);\r
- floor_item_optimize(0 - item);\r
- }\r
-}\r
-\r
-/*!\r
- * @brief 読むコマンドのメインルーチン /\r
- * Eat some food (from the pack or floor)\r
- * @return なし\r
- */\r
-void do_cmd_read_scroll(void)\r
-{\r
- object_type *o_ptr;\r
- OBJECT_IDX item;\r
- concptr q, s;\r
-\r
- if (p_ptr->wild_mode)\r
- {\r
- return;\r
- }\r
-\r
- if (p_ptr->inside_arena)\r
- {\r
- msg_print(_("アリーナが魔法を吸収した!", "The arena absorbs all attempted magic!"));\r
- msg_print(NULL);\r
- return;\r
- }\r
-\r
- if (p_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))\r
- {\r
- set_action(ACTION_NONE);\r
- }\r
-\r
- /* Check some conditions */\r
- if (p_ptr->blind)\r
- {\r
- msg_print(_("目が見えない。", "You can't see anything."));\r
- return;\r
- }\r
- if (no_lite())\r
- {\r
- msg_print(_("明かりがないので、暗くて読めない。", "You have no light to read by."));\r
- return;\r
- }\r
- if (p_ptr->confused)\r
- {\r
- msg_print(_("混乱していて読めない。", "You are too confused!"));\r
- return;\r
- }\r
-\r
-\r
- /* Restrict choices to scrolls */\r
- item_tester_hook = item_tester_hook_readable;\r
-\r
- q = _("どの巻物を読みますか? ", "Read which scroll? ");\r
- s = _("読める巻物がない。", "You have no scrolls to read.");\r
-\r
- o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));\r
- if (!o_ptr) return;\r
-\r
- /* Read the scroll */\r
- do_cmd_read_scroll_aux(item, object_is_aware(o_ptr));\r
-}\r
+/*!
+ * @file cmd-read.c
+ * @brief プレイヤーの読むコマンド実装
+ * @date 2018/09/07
+ * @details
+ * cmd6.cより分離。
+ */
+
+#include "angband.h"
+#include "object-hook.h"
+#include "artifact.h"
+#include "avatar.h"
+#include "player-status.h"
+#include "rumor.h"
+#include "realm-hex.h"
+
+#include "spells-object.h"
+#include "spells-floor.h"
+#include "spells-summon.h"
+#include "spells-status.h"
+
+/*!
+ * @brief 巻物を読むコマンドのサブルーチン
+ * Read a scroll (from the pack or floor).
+ * @param item 読むオブジェクトの所持品ID
+ * @param known 判明済ならばTRUE
+ * @return なし
+ * @details
+ * <pre>
+ * Certain scrolls can be "aborted" without losing the scroll. These
+ * include scrolls with no effects but recharge or identify, which are
+ * cancelled before use. XXX Reading them still takes a current_world_ptr->game_turn, though.
+ * </pre>
+ */
+void do_cmd_read_scroll_aux(INVENTORY_IDX item, bool known)
+{
+ int k, used_up, ident, lev;
+ object_type *o_ptr;
+
+
+ /* Get the item (in the pack) */
+ if (item >= 0)
+ {
+ o_ptr = &inventory[item];
+ }
+
+ /* Get the item (on the floor) */
+ else
+ {
+ o_ptr = ¤t_floor_ptr->o_list[0 - item];
+ }
+
+ take_turn(p_ptr, 100);
+ if (cmd_limit_time_walk(p_ptr)) return;
+
+ if (p_ptr->pclass == CLASS_BERSERKER)
+ {
+ msg_print(_("巻物なんて読めない。", "You cannot read."));
+ return;
+ }
+
+ if (music_singing_any()) stop_singing(p_ptr);
+
+ /* Hex */
+ if (hex_spelling_any() && ((p_ptr->lev < 35) || hex_spell_fully())) stop_hex_spell_all();
+
+ /* Not identified yet */
+ ident = FALSE;
+
+ /* Object level */
+ lev = k_info[o_ptr->k_idx].level;
+
+ /* Assume the scroll will get used up */
+ used_up = TRUE;
+
+ if (o_ptr->tval == TV_SCROLL)
+ {
+ /* Analyze the scroll */
+ switch (o_ptr->sval)
+ {
+ case SV_SCROLL_DARKNESS:
+ {
+ if (!(p_ptr->resist_blind) && !(p_ptr->resist_dark))
+ {
+ (void)set_blind(p_ptr->blind + 3 + randint1(5));
+ }
+ if (unlite_area(10, 3)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_AGGRAVATE_MONSTER:
+ {
+ msg_print(_("カン高くうなる様な音が辺りを覆った。", "There is a high pitched humming noise."));
+ aggravate_monsters(0);
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_CURSE_ARMOR:
+ {
+ if (curse_armor()) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_CURSE_WEAPON:
+ {
+ k = 0;
+ if (has_melee_weapon(INVEN_RARM))
+ {
+ k = INVEN_RARM;
+ if (has_melee_weapon(INVEN_LARM) && one_in_(2)) k = INVEN_LARM;
+ }
+ else if (has_melee_weapon(INVEN_LARM)) k = INVEN_LARM;
+ if (k && curse_weapon(FALSE, k)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_SUMMON_MONSTER:
+ {
+ for (k = 0; k < randint1(3); k++)
+ {
+ if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0'))
+ {
+ ident = TRUE;
+ }
+ }
+ break;
+ }
+
+ case SV_SCROLL_SUMMON_UNDEAD:
+ {
+ for (k = 0; k < randint1(3); k++)
+ {
+ if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0'))
+ {
+ ident = TRUE;
+ }
+ }
+ break;
+ }
+
+ case SV_SCROLL_SUMMON_PET:
+ {
+ if (summon_specific(-1, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_FORCE_PET), '\0'))
+ {
+ ident = TRUE;
+ }
+ break;
+ }
+
+ case SV_SCROLL_SUMMON_KIN:
+ {
+ if (summon_kin_player(p_ptr->lev, p_ptr->y, p_ptr->x, (PM_FORCE_PET | PM_ALLOW_GROUP)))
+ {
+ ident = TRUE;
+ }
+ break;
+ }
+
+ case SV_SCROLL_TRAP_CREATION:
+ {
+ if (trap_creation(p_ptr->y, p_ptr->x)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_PHASE_DOOR:
+ {
+ teleport_player(10, 0L);
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_TELEPORT:
+ {
+ teleport_player(100, 0L);
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_TELEPORT_LEVEL:
+ {
+ (void)teleport_level(0);
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_WORD_OF_RECALL:
+ {
+ if (!recall_player(p_ptr, randint0(21) + 15)) used_up = FALSE;
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_IDENTIFY:
+ {
+ if (!ident_spell(FALSE)) used_up = FALSE;
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_STAR_IDENTIFY:
+ {
+ if (!identify_fully(FALSE)) used_up = FALSE;
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_REMOVE_CURSE:
+ {
+ if (remove_curse())
+ {
+ ident = TRUE;
+ }
+ break;
+ }
+
+ case SV_SCROLL_STAR_REMOVE_CURSE:
+ {
+ if (remove_all_curse())
+ {
+ ident = TRUE;
+ }
+ break;
+ }
+
+ case SV_SCROLL_ENCHANT_ARMOR:
+ {
+ ident = TRUE;
+ if (!enchant_spell(0, 0, 1)) used_up = FALSE;
+ break;
+ }
+
+ case SV_SCROLL_ENCHANT_WEAPON_TO_HIT:
+ {
+ if (!enchant_spell(1, 0, 0)) used_up = FALSE;
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_ENCHANT_WEAPON_TO_DAM:
+ {
+ if (!enchant_spell(0, 1, 0)) used_up = FALSE;
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_STAR_ENCHANT_ARMOR:
+ {
+ if (!enchant_spell(0, 0, randint1(3) + 2)) used_up = FALSE;
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_STAR_ENCHANT_WEAPON:
+ {
+ if (!enchant_spell(randint1(3), randint1(3), 0)) used_up = FALSE;
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_RECHARGING:
+ {
+ if (!recharge(130)) used_up = FALSE;
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_MUNDANITY:
+ {
+ ident = TRUE;
+ if (!mundane_spell(FALSE)) used_up = FALSE;
+ break;
+ }
+
+ case SV_SCROLL_LIGHT:
+ {
+ if (lite_area(damroll(2, 8), 2)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_MAPPING:
+ {
+ map_area(DETECT_RAD_MAP);
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_DETECT_GOLD:
+ {
+ if (detect_treasure(DETECT_RAD_DEFAULT)) ident = TRUE;
+ if (detect_objects_gold(DETECT_RAD_DEFAULT)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_DETECT_ITEM:
+ {
+ if (detect_objects_normal(DETECT_RAD_DEFAULT)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_DETECT_TRAP:
+ {
+ if (detect_traps(DETECT_RAD_DEFAULT, known)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_DETECT_DOOR:
+ {
+ if (detect_doors(DETECT_RAD_DEFAULT)) ident = TRUE;
+ if (detect_stairs(DETECT_RAD_DEFAULT)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_DETECT_INVIS:
+ {
+ if (detect_monsters_invis(DETECT_RAD_DEFAULT)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_SATISFY_HUNGER:
+ {
+ if (set_food(PY_FOOD_MAX - 1)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_BLESSING:
+ {
+ if (set_blessed(p_ptr->blessed + randint1(12) + 6, FALSE)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_HOLY_CHANT:
+ {
+ if (set_blessed(p_ptr->blessed + randint1(24) + 12, FALSE)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_HOLY_PRAYER:
+ {
+ if (set_blessed(p_ptr->blessed + randint1(48) + 24, FALSE)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_MONSTER_CONFUSION:
+ {
+ if (!(p_ptr->special_attack & ATTACK_CONFUSE))
+ {
+ msg_print(_("手が輝き始めた。", "Your hands begin to glow."));
+ p_ptr->special_attack |= ATTACK_CONFUSE;
+ p_ptr->redraw |= (PR_STATUS);
+ ident = TRUE;
+ }
+ break;
+ }
+
+ case SV_SCROLL_PROTECTION_FROM_EVIL:
+ {
+ k = 3 * p_ptr->lev;
+ if (set_protevil(p_ptr->protevil + randint1(25) + k, FALSE)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_RUNE_OF_PROTECTION:
+ {
+ warding_glyph();
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_TRAP_DOOR_DESTRUCTION:
+ {
+ if (destroy_doors_touch()) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_STAR_DESTRUCTION:
+ {
+ if (destroy_area(p_ptr->y, p_ptr->x, 13 + randint0(5), FALSE))
+ ident = TRUE;
+ else
+ msg_print(_("ダンジョンが揺れた...", "The dungeon trembles..."));
+
+ break;
+ }
+
+ case SV_SCROLL_DISPEL_UNDEAD:
+ {
+ if (dispel_undead(80)) ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_SPELL:
+ {
+ if ((p_ptr->pclass == CLASS_WARRIOR) ||
+ (p_ptr->pclass == CLASS_IMITATOR) ||
+ (p_ptr->pclass == CLASS_MINDCRAFTER) ||
+ (p_ptr->pclass == CLASS_SORCERER) ||
+ (p_ptr->pclass == CLASS_ARCHER) ||
+ (p_ptr->pclass == CLASS_MAGIC_EATER) ||
+ (p_ptr->pclass == CLASS_RED_MAGE) ||
+ (p_ptr->pclass == CLASS_SAMURAI) ||
+ (p_ptr->pclass == CLASS_BLUE_MAGE) ||
+ (p_ptr->pclass == CLASS_CAVALRY) ||
+ (p_ptr->pclass == CLASS_BERSERKER) ||
+ (p_ptr->pclass == CLASS_SMITH) ||
+ (p_ptr->pclass == CLASS_MIRROR_MASTER) ||
+ (p_ptr->pclass == CLASS_NINJA) ||
+ (p_ptr->pclass == CLASS_SNIPER)) break;
+ p_ptr->add_spells++;
+ p_ptr->update |= (PU_SPELLS);
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_GENOCIDE:
+ {
+ (void)symbol_genocide(300, TRUE);
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_MASS_GENOCIDE:
+ {
+ (void)mass_genocide(300, TRUE);
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_ACQUIREMENT:
+ {
+ acquirement(p_ptr->y, p_ptr->x, 1, TRUE, FALSE, FALSE);
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_STAR_ACQUIREMENT:
+ {
+ acquirement(p_ptr->y, p_ptr->x, randint1(2) + 1, TRUE, FALSE, FALSE);
+ ident = TRUE;
+ break;
+ }
+
+ /* New Hengband scrolls */
+ case SV_SCROLL_FIRE:
+ {
+ fire_ball(GF_FIRE, 0, 666, 4);
+ /* Note: "Double" damage since it is centered on the player ... */
+ if (!(IS_OPPOSE_FIRE() || p_ptr->resist_fire || p_ptr->immune_fire))
+ take_hit(DAMAGE_NOESCAPE, 50+randint1(50), _("炎の巻物", "a Scroll of Fire"), -1);
+
+ ident = TRUE;
+ break;
+ }
+
+
+ case SV_SCROLL_ICE:
+ {
+ fire_ball(GF_ICE, 0, 777, 4);
+ if (!(IS_OPPOSE_COLD() || p_ptr->resist_cold || p_ptr->immune_cold))
+ take_hit(DAMAGE_NOESCAPE, 100+randint1(100), _("氷の巻物", "a Scroll of Ice"), -1);
+
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_CHAOS:
+ {
+ fire_ball(GF_CHAOS, 0, 1000, 4);
+ if (!p_ptr->resist_chaos)
+ take_hit(DAMAGE_NOESCAPE, 111+randint1(111), _("ログルスの巻物", "a Scroll of Logrus"), -1);
+
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_RUMOR:
+ {
+ msg_print(_("巻物にはメッセージが書かれている:", "There is message on the scroll. It says:"));
+ msg_print(NULL);
+ display_rumor(TRUE);
+ msg_print(NULL);
+ msg_print(_("巻物は煙を立てて消え去った!", "The scroll disappears in a puff of smoke!"));
+
+ ident = TRUE;
+ break;
+ }
+
+ case SV_SCROLL_ARTIFACT:
+ {
+ ident = TRUE;
+ if (!artifact_scroll()) used_up = FALSE;
+ break;
+ }
+
+ case SV_SCROLL_RESET_RECALL:
+ {
+ ident = TRUE;
+ if (!reset_recall()) used_up = FALSE;
+ break;
+ }
+
+ case SV_SCROLL_AMUSEMENT:
+ {
+ ident = TRUE;
+ amusement(p_ptr->y, p_ptr->x, 1, FALSE);
+ break;
+ }
+
+ case SV_SCROLL_STAR_AMUSEMENT:
+ {
+ ident = TRUE;
+ amusement(p_ptr->y, p_ptr->x, randint1(2) + 1, FALSE);
+ break;
+ }
+ }
+ }
+ else if (o_ptr->name1 == ART_GHB)
+ {
+ msg_print(_("私は苦労して『グレーター・ヘル=ビースト』を倒した。", "I had a very hard time to kill the Greater hell-beast, "));
+ msg_print(_("しかし手に入ったのはこのきたないTシャツだけだった。", "but all I got was this lousy t-shirt!"));
+ used_up = FALSE;
+ }
+ else if (o_ptr->name1 == ART_POWER)
+ {
+ msg_print(_("「一つの指輪は全てを統べ、", "'One Ring to rule them all, "));
+ msg_print(NULL);
+ msg_print(_("一つの指輪は全てを見つけ、", "One Ring to find them, "));
+ msg_print(NULL);
+ msg_print(_("一つの指輪は全てを捕らえて", "One Ring to bring them all "));
+ msg_print(NULL);
+ msg_print(_("暗闇の中に繋ぎとめる。」", "and in the darkness bind them.'"));
+ used_up = FALSE;
+ }
+ else if (o_ptr->tval==TV_PARCHMENT)
+ {
+ concptr q;
+ GAME_TEXT o_name[MAX_NLEN];
+ char buf[1024];
+ screen_save();
+
+ q=format("book-%d_jp.txt",o_ptr->sval);
+
+ /* Display object description */
+ object_desc(o_name, o_ptr, OD_NAME_ONLY);
+
+ /* Build the filename */
+ path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, q);
+
+ /* Peruse the help file */
+ (void)show_file(TRUE, buf, o_name, 0, 0);
+ screen_load();
+
+ used_up=FALSE;
+ }
+
+ p_ptr->update |= (PU_COMBINE | PU_REORDER);
+
+ if (!(object_is_aware(o_ptr)))
+ {
+ chg_virtue(V_PATIENCE, -1);
+ chg_virtue(V_CHANCE, 1);
+ chg_virtue(V_KNOWLEDGE, -1);
+ }
+
+ /* The item was tried */
+ object_tried(o_ptr);
+
+ /* An identification was made */
+ if (ident && !object_is_aware(o_ptr))
+ {
+ object_aware(o_ptr);
+ gain_exp((lev + (p_ptr->lev >> 1)) / p_ptr->lev);
+ }
+
+ p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
+
+
+ /* Hack -- allow certain scrolls to be "preserved" */
+ if (!used_up)
+ {
+ return;
+ }
+
+ sound(SOUND_SCROLL);
+
+ /* Destroy a scroll in the pack */
+ if (item >= 0)
+ {
+ inven_item_increase(item, -1);
+ inven_item_describe(item);
+ inven_item_optimize(item);
+ }
+
+ /* Destroy a scroll on the floor */
+ else
+ {
+ floor_item_increase(0 - item, -1);
+ floor_item_describe(0 - item);
+ floor_item_optimize(0 - item);
+ }
+}
+
+/*!
+ * @brief 読むコマンドのメインルーチン /
+ * Eat some food (from the pack or floor)
+ * @return なし
+ */
+void do_cmd_read_scroll(void)
+{
+ object_type *o_ptr;
+ OBJECT_IDX item;
+ concptr q, s;
+
+ if (p_ptr->wild_mode)
+ {
+ return;
+ }
+
+ if (cmd_limit_arena(p_ptr)) return;
+
+ if (p_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))
+ {
+ set_action(ACTION_NONE);
+ }
+
+ if (cmd_limit_blind(p_ptr)) return;
+ if (cmd_limit_confused(p_ptr)) return;
+
+ /* Restrict choices to scrolls */
+ item_tester_hook = item_tester_hook_readable;
+
+ q = _("どの巻物を読みますか? ", "Read which scroll? ");
+ s = _("読める巻物がない。", "You have no scrolls to read.");
+
+ o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
+ if (!o_ptr) return;
+
+ /* Read the scroll */
+ do_cmd_read_scroll_aux(item, object_is_aware(o_ptr));
+}