OSDN Git Service

JP explain of Telekinesis must be x10
[hengband/hengband.git] / src / do-spell.c
index a04bdfd..e710de9 100644 (file)
@@ -160,7 +160,7 @@ static cptr info_radius(int rad)
 static cptr info_weight(int weight)
 {
 #ifdef JP
-       return format("ºÇÂç½ÅÎÌ:%d.%dkg", lbtokg1(weight/10), lbtokg2(weight/10));
+       return format("ºÇÂç½ÅÎÌ:%d.%dkg", lbtokg1(weight), lbtokg2(weight));
 #else
        return format("max wgt %d", weight/10);
 #endif
@@ -277,15 +277,15 @@ static void cast_wonder(int dir)
        }
 
        if (die < 8) clone_monster(dir);
-       else if (die < 14) speed_monster(dir);
+       else if (die < 14) speed_monster(dir, plev);
        else if (die < 26) heal_monster(dir, damroll(4, 6));
-       else if (die < 31) poly_monster(dir);
+       else if (die < 31) poly_monster(dir, plev);
        else if (die < 36)
                fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir,
                                  damroll(3 + ((plev - 1) / 5), 4));
        else if (die < 41) confuse_monster(dir, plev);
        else if (die < 46) fire_ball(GF_POIS, dir, 20 + (plev / 2), 3);
-       else if (die < 51) (void)lite_line(dir);
+       else if (die < 51) (void)lite_line(dir, damroll(6, 8));
        else if (die < 56)
                fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir,
                                  damroll(3 + ((plev - 5) / 4), 8));
@@ -320,8 +320,8 @@ static void cast_wonder(int dir)
        else /* RARE */
        {
                dispel_monsters(150);
-               slow_monsters();
-               sleep_monsters();
+               slow_monsters(plev);
+               sleep_monsters(plev);
                hp_player(300);
        }
 }
@@ -396,7 +396,7 @@ static void cast_invoke_spirits(int dir)
        }
        else if (die < 31)
        {
-               poly_monster(dir);
+               poly_monster(dir, plev);
        }
        else if (die < 36)
        {
@@ -413,7 +413,7 @@ static void cast_invoke_spirits(int dir)
        }
        else if (die < 51)
        {
-               (void)lite_line(dir);
+               (void)lite_line(dir, damroll(6, 8));
        }
        else if (die < 56)
        {
@@ -478,8 +478,8 @@ static void cast_invoke_spirits(int dir)
        else
        { /* RARE */
                dispel_monsters(150);
-               slow_monsters();
-               sleep_monsters();
+               slow_monsters(plev);
+               sleep_monsters(plev);
                hp_player(300);
        }
 
@@ -507,16 +507,16 @@ static void wild_magic(int spell)
        case 1:
        case 2:
        case 3:
-               teleport_player(10, TRUE);
+               teleport_player(10, TELEPORT_PASSIVE);
                break;
        case 4:
        case 5:
        case 6:
-               teleport_player(100, TRUE);
+               teleport_player(100, TELEPORT_PASSIVE);
                break;
        case 7:
        case 8:
-               teleport_player(200, TRUE);
+               teleport_player(200, TELEPORT_PASSIVE);
                break;
        case 9:
        case 10:
@@ -722,7 +722,7 @@ static void cast_shuffle(void)
                msg_print("It's a teleport trump card.");
 #endif
 
-               teleport_player(10, TRUE);
+               teleport_player(10, TELEPORT_PASSIVE);
        }
        else if (die < 42)
        {
@@ -742,7 +742,7 @@ static void cast_shuffle(void)
                msg_print("It's a teleport trump card.");
 #endif
 
-               teleport_player(100, TRUE);
+               teleport_player(100, TELEPORT_PASSIVE);
        }
        else if (die < 52)
        {
@@ -752,7 +752,7 @@ static void cast_shuffle(void)
                msg_print("It's a teleport trump card.");
 #endif
 
-               teleport_player(200, TRUE);
+               teleport_player(200, TELEPORT_PASSIVE);
        }
        else if (die < 60)
        {
@@ -931,7 +931,8 @@ static void cast_meteor(int dam, int rad)
 
                        if (d >= 9) continue;
 
-                       if (!in_bounds(y, x) || !projectable(py, px, y, x)) continue;
+                       if (!in_bounds(y, x) || !projectable(py, px, y, x)
+                           || !cave_have_flag_bold(y, x, FF_PROJECT)) continue;
 
                        /* Valid position */
                        break;
@@ -1932,7 +1933,7 @@ static cptr do_sorcery_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               teleport_player(range, 0L);
                        }
                }
                break;
@@ -2022,7 +2023,7 @@ static cptr do_sorcery_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               teleport_player(range, 0L);
                        }
                }
                break;
@@ -2045,7 +2046,7 @@ static cptr do_sorcery_spell(int spell, int mode)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               sleep_monster(dir);
+                               sleep_monster(dir, plev);
                        }
                }
                break;
@@ -2127,7 +2128,7 @@ static cptr do_sorcery_spell(int spell, int mode)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               slow_monster(dir);
+                               slow_monster(dir, plev);
                        }
                }
                break;
@@ -2148,7 +2149,7 @@ static cptr do_sorcery_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               sleep_monsters();
+                               sleep_monsters(plev);
                        }
                }
                break;
@@ -2835,7 +2836,7 @@ static cptr do_nature_spell(int spell, int mode)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               wall_to_mud(dir);
+                               wall_to_mud(dir, 20 + randint1(30));
                        }
                }
                break;
@@ -2936,7 +2937,7 @@ static cptr do_nature_spell(int spell, int mode)
                                msg_print("A line of sunlight appears.");
 #endif
 
-                               lite_line(dir);
+                               lite_line(dir, damroll(6, 8));
                        }
                }
                break;
@@ -2957,7 +2958,7 @@ static cptr do_nature_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               slow_monsters();
+                               slow_monsters(plev);
                        }
                }
                break;
@@ -3597,7 +3598,7 @@ static cptr do_chaos_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               teleport_player(range, 0L);
                        }
                }
                break;
@@ -3809,7 +3810,7 @@ static cptr do_chaos_spell(int spell, int mode)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               poly_monster(dir);
+                               poly_monster(dir, plev);
                        }
                }
                break;
@@ -4332,7 +4333,7 @@ static cptr do_death_spell(int spell, int mode)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               sleep_monster(dir);
+                               sleep_monster(dir, plev);
                        }
                }
                break;
@@ -5049,7 +5050,7 @@ static cptr do_trump_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               teleport_player(range, 0L);
                        }
                }
                break;
@@ -5139,7 +5140,7 @@ static cptr do_trump_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               teleport_player(range, 0L);
                        }
                }
                break;
@@ -5353,7 +5354,7 @@ static cptr do_trump_spell(int spell, int mode)
 
                                if (!result) return NULL;
 
-                               speed_monster(dir);
+                               speed_monster(dir, plev);
                        }
                }
                break;
@@ -6055,7 +6056,7 @@ static cptr do_arcane_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               teleport_player(range, 0L);
                        }
                }
                break;
@@ -6369,7 +6370,7 @@ static cptr do_arcane_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               teleport_player(range, 0L);
                        }
                }
                break;
@@ -6411,7 +6412,7 @@ static cptr do_arcane_spell(int spell, int mode)
                        {
                                if (!get_aim_dir(&dir)) return NULL;
 
-                               wall_to_mud(dir);
+                               wall_to_mud(dir, 20 + randint1(30));
                        }
                }
                break;
@@ -6441,7 +6442,7 @@ static cptr do_arcane_spell(int spell, int mode)
                                msg_print("A line of light appears.");
 #endif
 
-                               lite_line(dir);
+                               lite_line(dir, damroll(6, 8));
                        }
                }
                break;
@@ -8288,7 +8289,7 @@ static cptr do_crusade_spell(int spell, int mode)
 
                        if (cast)
                        {
-                               teleport_player(range, FALSE);
+                               teleport_player(range, 0L);
                        }
                }
                break;
@@ -8887,7 +8888,7 @@ static cptr do_crusade_spell(int spell, int mode)
                        {
                                project(0, 1, py, px, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
                                dispel_monsters(d_dam);
-                               slow_monsters();
+                               slow_monsters(plev);
                                stun_monsters(power);
                                confuse_monsters(power);
                                turn_monsters(power);
@@ -8994,7 +8995,7 @@ static cptr do_music_spell(int spell, int mode)
 
                        if (cont)
                        {
-                               slow_monsters();
+                               slow_monsters(plev);
                        }
                }
                break;
@@ -9567,7 +9568,7 @@ static cptr do_music_spell(int spell, int mode)
                if (desc) return "Êɤò·¡¤ê¿Ê¤à¡£¼«Ê¬¤Î­¸µ¤Î¥¢¥¤¥Æ¥à¤Ï¾øȯ¤¹¤ë¡£";
 #else
                if (name) return "Sound of disintegration";
-               if (desc) return "Turns all rocks in the adjacent squares to mud.";
+               if (desc) return "Makes you be able to burrow into walls. Objects under your feet evaporate.";
 #endif
 
                /* Stop singing before start another */
@@ -9800,8 +9801,8 @@ static cptr do_music_spell(int spell, int mode)
 
                        if (cont)
                        {
-                               slow_monsters();
-                               sleep_monsters();
+                               slow_monsters(plev);
+                               sleep_monsters(plev);
                        }
                }
 
@@ -10279,7 +10280,7 @@ static cptr do_hissatsu_spell(int spell, int mode)
     
                if (cast)
                {
-                       if (!do_cmd_throw_aux(1, TRUE, 0)) return NULL;
+                       if (!do_cmd_throw_aux(1, TRUE, -1)) return NULL;
                }
                break;
 
@@ -11057,7 +11058,11 @@ static cptr do_hissatsu_spell(int spell, int mode)
                                        /* Move the player */
                                        if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
                                }
-       
+                               else
+                               {
+                                       break;
+                               }
+
                                /* -more- */
                                if (i < 2) msg_print(NULL);
                        }
@@ -11131,17 +11136,17 @@ static cptr do_hissatsu_spell(int spell, int mode)
                if (cast)
                {
                        const int mana_cost_per_monster = 8;
-                       bool new = TRUE;
+                       bool is_new = TRUE;
                        bool mdeath;
 
                        do
                        {
                                if (!rush_attack(&mdeath)) break;
-                               if (new)
+                               if (is_new)
                                {
                                        /* Reserve needed mana point */
                                        p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
-                                       new = FALSE;
+                                       is_new = FALSE;
                                }
                                else
                                        p_ptr->csp -= mana_cost_per_monster;
@@ -11154,7 +11159,7 @@ static cptr do_hissatsu_spell(int spell, int mode)
                        }
                        while (p_ptr->csp > mana_cost_per_monster);
 
-                       if (new) return NULL;
+                       if (is_new) return NULL;
        
                        /* Restore reserved mana */
                        p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
@@ -11176,7 +11181,7 @@ static cptr do_hissatsu_spell(int spell, int mode)
 
                        if (!tgt_pt(&x, &y)) return NULL;
 
-                       if (!cave_player_teleportable_bold(y, x, FALSE, FALSE) ||
+                       if (!cave_player_teleportable_bold(y, x, 0L) ||
                            (distance(y, x, py, px) > MAX_SIGHT / 2) ||
                            !projectable(py, px, y, x))
                        {
@@ -11198,7 +11203,7 @@ static cptr do_hissatsu_spell(int spell, int mode)
                                break;
                        }
                        project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
-                       teleport_player_to(y, x, TRUE, FALSE);
+                       teleport_player_to(y, x, 0L);
                }
                break;
 
@@ -11381,14 +11386,1220 @@ static cptr do_hissatsu_spell(int spell, int mode)
                        {
 #ifdef JP
                                msg_print("Éð»ÎÆ»¤È¤Ï¡¢»à¤Ì¤³¤È¤È¸«¤Ä¤±¤¿¤ê¡£");
-                               take_hit(DAMAGE_FORCE, 9999, "ÀÚÊ¢", -1);
 #else
                                msg_print("Meaning of Bushi-do is found in the death.");
+#endif
                                take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
+                       }
+               }
+               break;
+       }
+
+       return "";
+}
+
+
+/* Hex */
+static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
+{
+       switch (o_ptr->tval)
+       {
+               case TV_SWORD:
+               case TV_HAFTED:
+               case TV_POLEARM:
+               case TV_DIGGING:
+               {
+                       return (TRUE);
+               }
+       }
+
+       return (FALSE);
+}
+
+static bool item_tester_hook_cursed(object_type *o_ptr)
+{
+       return (bool)(object_is_cursed(o_ptr));
+}
+
+static cptr do_hex_spell(int spell, int mode)
+{
+       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
+       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
+       bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
+       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
+       bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
+       bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
+
+       bool add = TRUE;
+
+       int plev = p_ptr->lev;
+       int power;
+
+       switch (spell)
+       {
+       /*** 1st book (0-7) ***/
+       case 0:
+#ifdef JP
+               if (name) return "¼Ù¤Ê¤ë½ËÊ¡";
+               if (desc) return "½ËÊ¡¤Ë¤è¤ê¹¶·âÀºÅÙ¤ÈËɸæÎϤ¬¾å¤¬¤ë¡£";
+#else
+               if (name) return "Evily blessing";
+               if (desc) return "Attempts to increase +to_hit of a weapon and AC";
+#endif
+               if (cast)
+               {
+                       if (!p_ptr->blessed)
+                       {
+#ifdef JP
+                               msg_print("¹â·é¤Êµ¤Ê¬¤Ë¤Ê¤Ã¤¿¡ª");
+#else
+                               msg_print("You feel righteous!");
+#endif
+                       }
+               }
+               if (stop)
+               {
+                       if (!p_ptr->blessed)
+                       {
+#ifdef JP
+                               msg_print("¹â·é¤Êµ¤Ê¬¤¬¾Ã¤¨¼º¤»¤¿¡£");
+#else
+                               msg_print("The prayer has expired.");
+#endif
+                       }
+               }
+               break;
+
+       case 1:
+#ifdef JP
+               if (name) return "·Ú½ý¤Î¼£Ìþ";
+               if (desc) return "HP¤ä½ý¤ò¾¯¤·²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Cure light wounds";
+               if (desc) return "Heals cut and HP a little.";
+#endif
+               if (info) return info_heal(1, 10, 0);
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("µ¤Ê¬¤¬Îɤ¯¤Ê¤Ã¤Æ¤¯¤ë¡£");
+#else
+                       msg_print("You feel better and better.");
+#endif
+               }
+               if (cast || cont)
+               {
+                       hp_player(damroll(1, 10));
+                       set_cut(p_ptr->cut - 10);
+               }
+               break;
+
+       case 2:
+#ifdef JP
+               if (name) return "°­Ëâ¤Î¥ª¡¼¥é";
+               if (desc) return "±ê¤Î¥ª¡¼¥é¤ò¿È¤Ë¤Þ¤È¤¤¡¢²óÉü®ÅÙ¤¬Â®¤¯¤Ê¤ë¡£";
+#else
+               if (name) return "Demonic aura";
+               if (desc) return "Gives fire aura and regeneration.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("ÂΤ¬±ê¤Î¥ª¡¼¥é¤Çʤ¤ï¤ì¤¿¡£");
+#else
+                       msg_print("You have enveloped by fiery aura!");
+#endif
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("±ê¤Î¥ª¡¼¥é¤¬¾Ã¤¨µî¤Ã¤¿¡£");
+#else
+                       msg_print("Fiery aura disappeared.");
+#endif
+               }
+               break;
+
+       case 3:
+#ifdef JP
+               if (name) return "°­½­Ì¸";
+               if (desc) return "»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤ËÈù¼åÎ̤ÎÆǤΥÀ¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Stinking mist";
+               if (desc) return "Deals few damages of poison to all monsters in your sight.";
+#endif
+               power = plev / 2 + 5;
+               if (info) return info_damage(1, power, 0);
+               if (cast || cont)
+               {
+                       project_hack(GF_POIS, randint1(power));
+               }
+               break;
+
+       case 4:
+#ifdef JP
+               if (name) return "ÏÓÎ϶¯²½";
+               if (desc) return "½Ñ¼Ô¤ÎÏÓÎϤò¾å¾º¤µ¤»¤ë¡£";
+#else
+               if (name) return "Extra might";
+               if (desc) return "Attempts to increase your strength.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("²¿¤À¤«ÎϤ¬Í¯¤¤¤ÆÍè¤ë¡£");
+#else
+                       msg_print("You feel you get stronger.");
+#endif
+               }
+               break;
+
+       case 5:
+#ifdef JP
+               if (name) return "Éð´ï¼öÇû";
+               if (desc) return "ÁõÈ÷¤·¤Æ¤¤¤ëÉð´ï¤ò¼ö¤¦¡£";
+#else
+               if (name) return "Curse weapon";
+               if (desc) return "Curses your weapon.";
+#endif
+               if (cast)
+               {
+                       int item;
+                       cptr q, s;
+                       char o_name[MAX_NLEN];
+                       object_type *o_ptr;
+                       u32b f[TR_FLAG_SIZE];
+
+                       item_tester_hook = item_tester_hook_weapon_except_bow;
+#ifdef JP
+                       q = "¤É¤ì¤ò¼ö¤¤¤Þ¤¹¤«¡©";
+                       s = "Éð´ï¤òÁõÈ÷¤·¤Æ¤¤¤Ê¤¤¡£";
+#else
+                       q = "Which weapon do you curse?";
+                       s = "You wield no weapons.";
+#endif
+
+                       if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
+
+                       o_ptr = &inventory[item];
+                       object_desc(o_name, o_ptr, OD_NAME_ONLY);
+                       object_flags(o_ptr, f);
+
+#ifdef JP
+                       if (!get_check(format("ËÜÅö¤Ë %s ¤ò¼ö¤¤¤Þ¤¹¤«¡©", o_name))) return FALSE;
+#else
+                       if (!get_check(format("Do you curse %s, really¡©", o_name))) return FALSE;
+#endif
+
+                       if (!one_in_(3) &&
+                               (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
+                       {
+#ifdef JP
+                               msg_format("%s ¤Ï¼ö¤¤¤òÄ·¤ÍÊÖ¤·¤¿¡£", o_name);
+#else
+                               msg_format("%s resists the effect.", o_name);
+#endif
+                               if (one_in_(3))
+                               {
+                                       if (o_ptr->to_d > 0)
+                                       {
+                                               o_ptr->to_d -= randint1(3) % 2;
+                                               if (o_ptr->to_d < 0) o_ptr->to_d = 0;
+                                       }
+                                       if (o_ptr->to_h > 0)
+                                       {
+                                               o_ptr->to_h -= randint1(3) % 2;
+                                               if (o_ptr->to_h < 0) o_ptr->to_h = 0;
+                                       }
+                                       if (o_ptr->to_a > 0)
+                                       {
+                                               o_ptr->to_a -= randint1(3) % 2;
+                                               if (o_ptr->to_a < 0) o_ptr->to_a = 0;
+                                       }
+#ifdef JP
+                                       msg_format("%s ¤ÏÎô²½¤·¤Æ¤·¤Þ¤Ã¤¿¡£", o_name);
+#else
+                                       msg_format("Your %s was disenchanted!", o_name);
+#endif
+                               }
+                       }
+                       else
+                       {
+                               int power = 0;
+#ifdef JP
+                               msg_format("¶²ÉݤΰŹõ¥ª¡¼¥é¤¬¤¢¤Ê¤¿¤Î%s¤òÊñ¤ß¹þ¤ó¤À¡ª", o_name);
+#else
+                               msg_format("A terrible black aura blasts your %s!", o_name);
+#endif
+                               o_ptr->curse_flags |= (TRC_CURSED);
+
+                               if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
+                               {
+
+                                       if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+                                       if (one_in_(666))
+                                       {
+                                               o_ptr->curse_flags |= (TRC_TY_CURSE);
+                                               if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
+
+                                               add_flag(o_ptr->art_flags, TR_AGGRAVATE);
+                                               add_flag(o_ptr->art_flags, TR_VORPAL);
+                                               add_flag(o_ptr->art_flags, TR_VAMPIRIC);
+#ifdef JP
+                                               msg_print("·ì¤À¡ª·ì¤À¡ª·ì¤À¡ª");
+#else
+                                               msg_print("Blood, Blood, Blood!");
+#endif
+                                               power = 2;
+                                       }
+                               }
+
+                               o_ptr->curse_flags |= get_curse(power, o_ptr);
+                       }
+
+                       p_ptr->update |= (PU_BONUS);
+                       add = FALSE;
+               }
+               break;
+
+       case 6:
+#ifdef JP
+               if (name) return "¼Ù°­´¶ÃÎ";
+               if (desc) return "¼þ°Ï¤Î¼Ù°­¤Ê¥â¥ó¥¹¥¿¡¼¤ò´¶ÃΤ¹¤ë¡£";
+#else
+               if (name) return "Evil detection";
+               if (desc) return "Detects evil monsters.";
+#endif
+               if (info) return info_range(MAX_SIGHT);
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¼Ù°­¤ÊÀ¸Êª¤Î¸ºß¤ò´¶¤¸¼è¤í¤¦¤È¤·¤¿¡£");
+#else
+                       msg_print("You attend to the presence of evil creatures.");
+#endif
+               }
+               break;
+
+       case 7:
+#ifdef JP
+               if (name) return "²æËý";
+               if (desc) return "¿ô¥¿¡¼¥ó¹¶·â¤òÂѤ¨¤¿¸å¡¢¼õ¤±¤¿¥À¥á¡¼¥¸¤òÃϹö¤Î¶È²Ð¤È¤·¤Æ¼þ°Ï¤ËÊü½Ð¤¹¤ë¡£";
+#else
+               if (name) return "Patience";
+               if (desc) return "Bursts hell fire strongly after patients any damage while few turns.";
 #endif
+               power = MIN(200, (p_ptr->magic_num1[2] * 2));
+               if (info) return info_damage(0, 0, power);
+               if (cast)
+               {
+                       int a = 3 - (p_ptr->pspeed - 100) / 10;
+                       int r = 3 + randint1(3) + MAX(0, MIN(3, a));
+
+                       if (p_ptr->magic_num2[2] > 0)
+                       {
+#ifdef JP
+                               msg_print("¤¹¤Ç¤Ë²æËý¤ò¤·¤Æ¤¤¤ë¡£");
+#else
+                               msg_print("You are already patienting.");
+#endif
+                               return NULL;
+                       }
+
+                       p_ptr->magic_num2[1] = 1;
+                       p_ptr->magic_num2[2] = r;
+                       p_ptr->magic_num1[2] = 0;
+#ifdef JP
+                       msg_print("¤¸¤Ã¤ÈÂѤ¨¤ë¤³¤È¤Ë¤·¤¿¡£");
+#else
+                       msg_print("You decide to patient all damages.");
+#endif
+                       add = FALSE;
+               }
+               if (cont)
+               {
+                       int rad = 2 + (power / 50);
+
+                       p_ptr->magic_num2[2]--;
+
+                       if ((p_ptr->magic_num2[2] <= 0) || (power >= 200))
+                       {
+#ifdef JP
+                               msg_print("²æËý¤¬²ò¤«¤ì¤¿¡ª");
+#else
+                               msg_print("Time for end of patioence!");
+#endif
+                               if (power)
+                               {
+                                       project(0, rad, py, px, power, GF_HELL_FIRE,
+                                               (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
+                               }
+                               if (p_ptr->wizard)
+                               {
+#ifdef JP
+                                       msg_format("%dÅÀ¤Î¥À¥á¡¼¥¸¤òÊÖ¤·¤¿¡£", power);
+#else
+                                       msg_format("You return %d damages.", power);
+#endif
+                               }
+
+                               /* Reset */
+                               p_ptr->magic_num2[1] = 0;
+                               p_ptr->magic_num2[2] = 0;
+                               p_ptr->magic_num1[2] = 0;
                        }
                }
                break;
+
+       /*** 2nd book (8-15) ***/
+       case 8:
+#ifdef JP
+               if (name) return "ɹ¤Î³»";
+               if (desc) return "ɹ¤Î¥ª¡¼¥é¤ò¿È¤Ë¤Þ¤È¤¤¡¢ËɸæÎϤ¬¾å¾º¤¹¤ë¡£";
+#else
+               if (name) return "Ice armor";
+               if (desc) return "Gives fire aura and bonus to AC.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("ÂΤ¬É¹¤Î³»¤Çʤ¤ï¤ì¤¿¡£");
+#else
+                       msg_print("You have enveloped by ice armor!");
+#endif
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("ɹ¤Î³»¤¬¾Ã¤¨µî¤Ã¤¿¡£");
+#else
+                       msg_print("Ice armor disappeared.");
+#endif
+               }
+               break;
+
+       case 9:
+#ifdef JP
+               if (name) return "½Å½ý¤Î¼£Ìþ";
+               if (desc) return "ÂÎÎϤä½ý¤ò¿¾¯²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Cure serious wounds";
+               if (desc) return "Heals cut and HP more.";
+#endif
+               if (info) return info_heal(2, 10, 0);
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("µ¤Ê¬¤¬Îɤ¯¤Ê¤Ã¤Æ¤¯¤ë¡£");
+#else
+                       msg_print("You feel better and better.");
+#endif
+               }
+               if (cast || cont)
+               {
+                       hp_player(damroll(2, 10));
+                       set_cut((p_ptr->cut / 2) - 10);
+               }
+               break;
+
+       case 10:
+#ifdef JP
+               if (name) return "ÌôÉʵÛÆþ";
+               if (desc) return "¼öʸ±Ó¾§¤òÃæ»ß¤¹¤ë¤³¤È¤Ê¤¯¡¢Ìô¤Î¸ú²Ì¤òÆÀ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£";
+#else
+               if (name) return "Inhail potion";
+               if (desc) return "Quaffs a potion without canceling of casting a spell.";
+#endif
+               if (cast)
+               {
+                       p_ptr->magic_num1[0] |= (1L << HEX_INHAIL);
+                       do_cmd_quaff_potion();
+                       p_ptr->magic_num1[0] &= ~(1L << HEX_INHAIL);
+                       add = FALSE;
+               }
+               break;
+
+       case 11:
+#ifdef JP
+               if (name) return "µÛ·ì̸";
+               if (desc) return "»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤ËÈù¼åÎ̤ÎÀ¸Ì¿Îϵۼý¤Î¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£Í¿¤¨¤¿¥À¥á¡¼¥¸¤Îʬ¡¢ÂÎÎϤ¬²óÉü¤¹¤ë¡£";
+#else
+               if (name) return "Vampiric mist";
+               if (desc) return "Deals few dameges of drain life to all monsters in your sight.";
+#endif
+               power = (plev / 2) + 5;
+               if (info) return info_damage(1, power, 0);
+               if (cast || cont)
+               {
+                       project_hack(GF_OLD_DRAIN, randint1(power));
+               }
+               break;
+
+       case 12:
+#ifdef JP
+               if (name) return "Ëâ·õ²½";
+               if (desc) return "Éð´ï¤Î¹¶·âÎϤò¾å¤²¤ë¡£ÀÚ¤ìÌ£¤òÆÀ¡¢¼ö¤¤¤Ë±þ¤¸¤ÆÍ¿¤¨¤ë¥À¥á¡¼¥¸¤¬¾å¾º¤·¡¢Á±Îɤʥâ¥ó¥¹¥¿¡¼¤ËÂФ¹¤ë¥À¥á¡¼¥¸¤¬2Çܤˤʤ롣";
+#else
+               if (name) return "Swords to runeswords";
+               if (desc) return "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¤¢¤Ê¤¿¤ÎÉð´ï¤¬¹õ¤¯µ±¤¤¤¿¡£");
+#else
+                       if (!empty_hands(FALSE))
+                               msg_print("Your weapons glow bright black.");
+                       else
+                               msg_print("Your weapon glows bright black.");
+#endif
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("Éð´ï¤Îµ±¤­¤¬¾Ã¤¨µî¤Ã¤¿¡£");
+#else
+                       msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
+#endif
+               }
+               break;
+
+       case 13:
+#ifdef JP
+               if (name) return "º®Íð¤Î¼ê";
+               if (desc) return "¹¶·â¤·¤¿ºÝ¥â¥ó¥¹¥¿¡¼¤òº®Í𤵤»¤ë¡£";
+#else
+               if (name) return "Touch of confusion";
+               if (desc) return "Confuses a monster when you attack.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¤¢¤Ê¤¿¤Î¼ê¤¬ÀÖ¤¯µ±¤­»Ï¤á¤¿¡£");
+#else
+                       msg_print("Your hands glow bright red.");
+#endif
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("¼ê¤Îµ±¤­¤¬¤Ê¤¯¤Ê¤Ã¤¿¡£");
+#else
+                       msg_print("Brightness on your hands disappeard.");
+#endif
+               }
+               break;
+
+       case 14:
+#ifdef JP
+               if (name) return "ÆùÂζ¯²½";
+               if (desc) return "½Ñ¼Ô¤ÎÏÓÎÏ¡¢´ïÍѤµ¡¢Âѵ×ÎϤò¾å¾º¤µ¤»¤ë¡£¹¶·â²ó¿ô¤Î¾å¸Â¤ò 1 Áý²Ã¤µ¤»¤ë¡£";
+#else
+               if (name) return "Building up";
+               if (desc) return "Attempts to increases your strength, dexterity and constitusion.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¿ÈÂΤ¬¶¯¤¯¤Ê¤Ã¤¿µ¤¤¬¤·¤¿¡£");
+#else
+                       msg_print("You feel your body is developed more now.");
+#endif
+               }
+               break;
+
+       case 15:
+#ifdef JP
+               if (name) return "È¿¥Æ¥ì¥Ý¡¼¥È·ë³¦";
+               if (desc) return "»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤Î¥Æ¥ì¥Ý¡¼¥È¤òÁ˳²¤¹¤ë¥Ð¥ê¥¢¤òÄ¥¤ë¡£";
+#else
+               if (name) return "Anti teleport barrier";
+               if (desc) return "Obstructs all teleportations by monsters in your sight.";
+#endif
+               power = plev * 3 / 2;
+               if (info) return info_power(power);
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¥Æ¥ì¥Ý¡¼¥È¤òËɤ°¼ö¤¤¤ò¤«¤±¤¿¡£");
+#else
+                       msg_print("You feel anyone can not teleport except you.");
+#endif
+               }
+               break;
+
+       /*** 3rd book (16-23) ***/
+       case 16:
+#ifdef JP
+               if (name) return "¾×·â¤Î¥¯¥í¡¼¥¯";
+               if (desc) return "Åŵ¤¤Î¥ª¡¼¥é¤ò¿È¤Ë¤Þ¤È¤¤¡¢Æ°¤­¤¬Â®¤¯¤Ê¤ë¡£";
+#else
+               if (name) return "Cloak of shock";
+               if (desc) return "Gives lightning aura and a bonus to speed.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("ÂΤ¬°ðºÊ¤Î¥ª¡¼¥é¤Çʤ¤ï¤ì¤¿¡£");
+#else
+                       msg_print("You have enveloped by electrical aura!");
+#endif
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("°ðºÊ¤Î¥ª¡¼¥é¤¬¾Ã¤¨µî¤Ã¤¿¡£");
+#else
+                       msg_print("Electrical aura disappeared.");
+#endif
+               }
+               break;
+
+       case 17:
+#ifdef JP
+               if (name) return "Ã×Ì¿½ý¤Î¼£Ìþ";
+               if (desc) return "ÂÎÎϤä½ý¤ò²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Cure critical wounds";
+               if (desc) return "Heals cut and HP greatry.";
+#endif
+               if (info) return info_heal(4, 10, 0);
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("µ¤Ê¬¤¬Îɤ¯¤Ê¤Ã¤Æ¤¯¤ë¡£");
+#else
+                       msg_print("You feel better and better.");
+#endif
+               }
+               if (cast || cont)
+               {
+                       hp_player(damroll(4, 10));
+                       set_stun(0);
+                       set_cut(0);
+                       set_poisoned(0);
+               }
+               break;
+
+       case 18:
+#ifdef JP
+               if (name) return "¼öÎÏÉõÆþ";
+               if (desc) return "ËâË¡¤ÎÆ»¶ñ¤ËËâÎϤòºÆ½¼Å¶¤¹¤ë¡£";
+#else
+               if (name) return "Recharging";
+               if (desc) return "Recharges a magic device.";
+#endif
+               power = plev * 2;
+               if (info) return info_power(power);
+               if (cast)
+               {
+                       if (!recharge(power)) return NULL;
+                       add = FALSE;
+               }
+               break;
+
+       case 19:
+#ifdef JP
+               if (name) return "»à¼ÔÉü³è";
+               if (desc) return "»àÂΤòÁɤ餻¤Æ¥Ú¥Ã¥È¤Ë¤¹¤ë¡£";
+#else
+               if (name) return "Animate Dead";
+               if (desc) return "Raises corpses and skeletons from dead.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("»à¼Ô¤Ø¤Î¸Æ¤Ó¤«¤±¤ò»Ï¤á¤¿¡£");
+#else
+                       msg_print("You start to call deads.!");
+#endif
+               }
+               if (cast || cont)
+               {
+                       animate_dead(0, py, px);
+               }
+               break;
+
+       case 20:
+#ifdef JP
+               if (name) return "Ëɶñ¼öÇû";
+               if (desc) return "ÁõÈ÷¤·¤Æ¤¤¤ëËɶñ¤Ë¼ö¤¤¤ò¤«¤±¤ë¡£";
+#else
+               if (name) return "Curse armor";
+               if (desc) return "Curse a piece of armour that you wielding.";
+#endif
+               if (cast)
+               {
+                       int item;
+                       cptr q, s;
+                       char o_name[MAX_NLEN];
+                       object_type *o_ptr;
+                       u32b f[TR_FLAG_SIZE];
+
+                       item_tester_hook = object_is_armour;
+#ifdef JP
+                       q = "¤É¤ì¤ò¼ö¤¤¤Þ¤¹¤«¡©";
+                       s = "Ëɶñ¤òÁõÈ÷¤·¤Æ¤¤¤Ê¤¤¡£";
+#else
+                       q = "Which piece of armour do you curse?";
+                       s = "You wield no piece of armours.";
+#endif
+
+                       if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
+
+                       o_ptr = &inventory[item];
+                       object_desc(o_name, o_ptr, OD_NAME_ONLY);
+                       object_flags(o_ptr, f);
+
+#ifdef JP
+                       if (!get_check(format("ËÜÅö¤Ë %s ¤ò¼ö¤¤¤Þ¤¹¤«¡©", o_name))) return FALSE;
+#else
+                       if (!get_check(format("Do you curse %s, really¡©", o_name))) return FALSE;
+#endif
+
+                       if (!one_in_(3) &&
+                               (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
+                       {
+#ifdef JP
+                               msg_format("%s ¤Ï¼ö¤¤¤òÄ·¤ÍÊÖ¤·¤¿¡£", o_name);
+#else
+                               msg_format("%s resists the effect.", o_name);
+#endif
+                               if (one_in_(3))
+                               {
+                                       if (o_ptr->to_d > 0)
+                                       {
+                                               o_ptr->to_d -= randint1(3) % 2;
+                                               if (o_ptr->to_d < 0) o_ptr->to_d = 0;
+                                       }
+                                       if (o_ptr->to_h > 0)
+                                       {
+                                               o_ptr->to_h -= randint1(3) % 2;
+                                               if (o_ptr->to_h < 0) o_ptr->to_h = 0;
+                                       }
+                                       if (o_ptr->to_a > 0)
+                                       {
+                                               o_ptr->to_a -= randint1(3) % 2;
+                                               if (o_ptr->to_a < 0) o_ptr->to_a = 0;
+                                       }
+#ifdef JP
+                                       msg_format("%s ¤ÏÎô²½¤·¤Æ¤·¤Þ¤Ã¤¿¡£", o_name);
+#else
+                                       msg_format("Your %s was disenchanted!", o_name);
+#endif
+                               }
+                       }
+                       else
+                       {
+                               int power = 0;
+#ifdef JP
+                               msg_format("¶²ÉݤΰŹõ¥ª¡¼¥é¤¬¤¢¤Ê¤¿¤Î%s¤òÊñ¤ß¹þ¤ó¤À¡ª", o_name);
+#else
+                               msg_format("A terrible black aura blasts your %s!", o_name);
+#endif
+                               o_ptr->curse_flags |= (TRC_CURSED);
+
+                               if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
+                               {
+
+                                       if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+                                       if (one_in_(666))
+                                       {
+                                               o_ptr->curse_flags |= (TRC_TY_CURSE);
+                                               if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
+
+                                               add_flag(o_ptr->art_flags, TR_AGGRAVATE);
+                                               add_flag(o_ptr->art_flags, TR_RES_POIS);
+                                               add_flag(o_ptr->art_flags, TR_RES_DARK);
+                                               add_flag(o_ptr->art_flags, TR_RES_NETHER);
+#ifdef JP
+                                               msg_print("·ì¤À¡ª·ì¤À¡ª·ì¤À¡ª");
+#else
+                                               msg_print("Blood, Blood, Blood!");
+#endif
+                                               power = 2;
+                                       }
+                               }
+
+                               o_ptr->curse_flags |= get_curse(power, o_ptr);
+                       }
+
+                       p_ptr->update |= (PU_BONUS);
+                       add = FALSE;
+               }
+               break;
+
+       case 21:
+#ifdef JP
+               if (name) return "±Æ¤Î¥¯¥í¡¼¥¯";
+               if (desc) return "±Æ¤Î¥ª¡¼¥é¤ò¿È¤Ë¤Þ¤È¤¤¡¢Å¨¤Ë±Æ¤Î¥À¥á¡¼¥¸¤òÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Cloak of shadow";
+               if (desc) return "Gives aura of shadow.";
+#endif
+               if (cast)
+               {
+                       object_type *o_ptr = &inventory[INVEN_OUTER];
+
+                       if (!o_ptr->k_idx)
+                       {
+#ifdef JP
+                               msg_print("¥¯¥í¡¼¥¯¤ò¿È¤Ë¤Ä¤±¤Æ¤¤¤Ê¤¤¡ª");
+#else
+                               msg_print("You don't ware any cloak.");
+#endif
+                               return NULL;
+                       }
+                       else if (!object_is_cursed(o_ptr))
+                       {
+#ifdef JP
+                               msg_print("¥¯¥í¡¼¥¯¤Ï¼ö¤ï¤ì¤Æ¤¤¤Ê¤¤¡ª");
+#else
+                               msg_print("Your cloak is not cursed.");
+#endif
+                               return NULL;
+                       }
+                       else
+                       {
+#ifdef JP
+                               msg_print("±Æ¤Î¥ª¡¼¥é¤ò¿È¤Ë¤Þ¤È¤Ã¤¿¡£");
+#else
+                               msg_print("You have enveloped by shadow aura!");
+#endif
+                       }
+               }
+               if (cont)
+               {
+                       object_type *o_ptr = &inventory[INVEN_OUTER];
+
+                       if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
+                       {
+                               do_spell(REALM_HEX, spell, SPELL_STOP);
+                               p_ptr->magic_num1[0] &= ~(1L << spell);
+                               p_ptr->magic_num2[0]--;
+                               if (!p_ptr->magic_num2[0]) set_action(ACTION_NONE);
+                       }
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("±Æ¤Î¥ª¡¼¥é¤¬¾Ã¤¨µî¤Ã¤¿¡£");
+#else
+                       msg_print("Shadow aura disappeared.");
+#endif
+               }
+               break;
+
+       case 22:
+#ifdef JP
+               if (name) return "¶ìÄˤòËâÎϤË";
+               if (desc) return "»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤ËÀº¿À¥À¥á¡¼¥¸Í¿¤¨¡¢ËâÎϤòµÛ¤¤¼è¤ë¡£";
+#else
+               if (name) return "Pains to mana";
+               if (desc) return "Deals psychic damages to all monsters in sight, and drains some mana.";
+#endif
+               power = plev * 3 / 2;
+               if (info) return info_damage(1, power, 0);
+               if (cast || cont)
+               {
+                       project_hack(GF_PSI_DRAIN, randint1(power));
+               }
+               break;
+
+       case 23:
+#ifdef JP
+               if (name) return "ÌܤˤÏÌܤò";
+               if (desc) return "ÂÇ·â¤äËâË¡¤Ç¼õ¤±¤¿¥À¥á¡¼¥¸¤ò¡¢¹¶·â¸µ¤Î¥â¥ó¥¹¥¿¡¼¤Ë¤âÍ¿¤¨¤ë¡£";
+#else
+               if (name) return "Eye for an eye";
+               if (desc) return "Returns same damage which you got to the monster which damaged you.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("Éü½²¤·¤¿¤¤Íß˾¤Ë¤«¤é¤ì¤¿¡£");
+#else
+                       msg_print("You wish strongly you want to revenge anything.");
+#endif
+               }
+               break;
+
+       /*** 4th book (24-31) ***/
+       case 24:
+#ifdef JP
+               if (name) return "È¿Áý¿£·ë³¦";
+               if (desc) return "¤½¤Î³¬¤ÎÁý¿£¤¹¤ë¥â¥ó¥¹¥¿¡¼¤ÎÁý¿£¤òÁ˻ߤ¹¤ë¡£";
+#else
+               if (name) return "Anti multiply barrier";
+               if (desc) return "Obstructs all multiplying by monsters in entire floor.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("Áý¿£¤òÁ˻ߤ¹¤ë¼ö¤¤¤ò¤«¤±¤¿¡£");
+#else
+                       msg_print("You feel anyone can not already multiply.");
+#endif
+               }
+               break;
+
+       case 25:
+#ifdef JP
+               if (name) return "À¸Ì¿ÎÏÉü³è";
+               if (desc) return "·Ð¸³Ãͤò½ù¡¹¤ËÉü³è¤·¡¢¸º¾¯¤·¤¿Ç½ÎÏÃͤò²óÉü¤µ¤»¤ë¡£";
+#else
+               if (name) return "Restore life";
+               if (desc) return "Restores life energy and status.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("À¸Ì¿ÎϤ¬Ìá¤ê»Ï¤á¤¿¡£");
+#else
+                       msg_print("You feel your life energy starting to return.");
+#endif
+               }
+               if (cast || cont)
+               {
+                       bool flag = FALSE;
+                       int d = (p_ptr->max_exp - p_ptr->exp);
+                       int r = (p_ptr->exp / 20);
+                       int i;
+
+                       if (d > 0)
+                       {
+                               if (d < r)
+                                       p_ptr->exp = p_ptr->max_exp;
+                               else
+                                       p_ptr->exp += r;
+
+                               /* Check the experience */
+                               check_experience();
+
+                               flag = TRUE;
+                       }
+                       for (i = A_STR; i < 6; i ++)
+                       {
+                               if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
+                               {
+                                       if (p_ptr->stat_cur[i] < 18)
+                                               p_ptr->stat_cur[i]++;
+                                       else
+                                               p_ptr->stat_cur[i] += 10;
+
+                                       if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
+                                               p_ptr->stat_cur[i] = p_ptr->stat_max[i];
+
+                                       /* Recalculate bonuses */
+                                       p_ptr->update |= (PU_BONUS);
+
+                                       flag = TRUE;
+                               }
+                       }
+
+                       if (!flag)
+                       {
+#ifdef JP
+                               msg_format("%s¤Î¼öʸ¤Î±Ó¾§¤ò¤ä¤á¤¿¡£", do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
+#else
+                               msg_format("Finish casting '%^s'.", do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
+#endif
+                               p_ptr->magic_num1[0] &= ~(1L << HEX_RESTORE);
+                               if (cont) p_ptr->magic_num2[0]--;
+                               if (p_ptr->magic_num2) p_ptr->action = ACTION_NONE;
+
+                               /* Redraw status */
+                               p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
+                               p_ptr->redraw |= (PR_EXTRA);
+
+                               return "";
+                       }
+               }
+               break;
+
+       case 26:
+#ifdef JP
+               if (name) return "¼öÎϵۼý";
+               if (desc) return "¼ö¤ï¤ì¤¿Éð´ï¤Î¼ö¤¤¤òµÛ¼ý¤·¤ÆËâÎϤò²óÉü¤¹¤ë¡£";
+#else
+               if (name) return "Drain curse power";
+               if (desc) return "Drains curse on your weapon and heals SP a little.";
+#endif
+               if (cast)
+               {
+                       int item;
+                       cptr s, q;
+                       u32b f[TR_FLAG_SIZE];
+                       object_type *o_ptr;
+
+                       item_tester_hook = item_tester_hook_cursed;
+#ifdef JP
+                       q = "¤É¤ÎÁõÈ÷Éʤ«¤éµÛ¼ý¤·¤Þ¤¹¤«¡©";
+                       s = "¼ö¤ï¤ì¤¿¥¢¥¤¥Æ¥à¤òÁõÈ÷¤·¤Æ¤¤¤Ê¤¤¡£";
+#else
+                       q = "Which cursed equipment do you drain mana from?";
+                       s = "You have no cursed equipment.";
+#endif
+
+                       if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
+
+                       o_ptr = &inventory[item];
+                       object_flags(o_ptr, f);
+
+                       p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
+                       if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
+                       if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
+
+                       if (o_ptr->curse_flags & TRC_PERMA_CURSE)
+                       {
+                               /* Nothing */
+                       }
+                       else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
+                       {
+                               if (one_in_(7))
+                               {
+#ifdef JP
+                                       msg_print("¼ö¤¤¤òÁ´¤ÆµÛ¤¤¼è¤Ã¤¿¡£");
+#else
+                                       msg_print("Heavy curse vanished away.");
+#endif
+                                       o_ptr->curse_flags = 0L;
+                               }
+                       }
+                       else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
+                       {
+#ifdef JP
+                               msg_print("¼ö¤¤¤òÁ´¤ÆµÛ¤¤¼è¤Ã¤¿¡£");
+#else
+                               msg_print("Curse vanished away.");
+#endif
+                               o_ptr->curse_flags = 0L;
+                       }
+
+                       add = FALSE;
+               }
+               break;
+
+       case 27:
+#ifdef JP
+               if (name) return "µÛ·ì¤Î¿Ï";
+               if (desc) return "µÛ·ì°À­¤Ç¹¶·â¤¹¤ë¡£";
+#else
+               if (name) return "Swords to vampires";
+               if (desc) return "Gives vampiric ability to your weapon.";
+#endif
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("¤¢¤Ê¤¿¤ÎÉð´ï¤¬·ì¤òÍߤ·¤Æ¤¤¤ë¡£");
+#else
+                       if (!empty_hands(FALSE))
+                               msg_print("Your weapons want more blood now.");
+                       else
+                               msg_print("Your weapon wants more blood now.");
+#endif
+               }
+               if (stop)
+               {
+#ifdef JP
+                       msg_print("Éð´ï¤Î³é˾¤¬¾Ã¤¨µî¤Ã¤¿¡£");
+#else
+                       msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
+#endif
+               }
+               break;
+
+       case 28:
+#ifdef JP
+               if (name) return "Û¯Û°¤Î¸ÀÍÕ";
+               if (desc) return "»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤òÛ¯Û°¤È¤µ¤»¤ë¡£";
+#else
+               if (name) return "Word of stun";
+               if (desc) return "Stuns all monsters in your sight.";
+#endif
+               power = plev * 4;
+               if (info) return info_power(power);
+               if (cast || cont)
+               {
+                       stun_monsters(power);
+               }
+               break;
+
+       case 29:
+#ifdef JP
+               if (name) return "±Æ°ÜÆ°";
+               if (desc) return "¥â¥ó¥¹¥¿¡¼¤ÎÎ٤Υޥ¹¤Ë½Ö´Ö°ÜÆ°¤¹¤ë¡£";
+#else
+               if (name) return "Moving into shadow";
+               if (desc) return "Teleports you close to a monster.";
+#endif
+               if (cast)
+               {
+                       int i, y, x, dir;
+                       bool flag;
+
+                       for (i = 0; i < 3; i++)
+                       {
+                               if (!tgt_pt(&x, &y)) return FALSE;
+
+                               flag = FALSE;
+
+                               for (dir = 0; dir < 8; dir++)
+                               {
+                                       int dy = y + ddy_ddd[dir];
+                                       int dx = x + ddx_ddd[dir];
+                                       if (dir == 5) continue;
+                                       if(cave[dy][dx].m_idx) flag = TRUE;
+                               }
+
+                               if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
+                                       (distance(y, x, py, px) > plev + 2))
+                               {
+#ifdef JP
+                                       msg_print("¤½¤³¤Ë¤Ï°ÜÆ°¤Ç¤­¤Ê¤¤¡£");
+#else
+                                       msg_print("Can not teleport to there.");
+#endif
+                                       continue;
+                               }
+                               break;
+                       }
+
+                       if (flag && randint0(plev * plev / 2))
+                       {
+                               teleport_player_to(y, x, 0L);
+                       }
+                       else
+                       {
+#ifdef JP
+                               msg_print("¤ª¤Ã¤È¡ª");
+#else
+                               msg_print("Oops!");
+#endif
+                               teleport_player(30, 0L);
+                       }
+
+                       add = FALSE;
+               }
+               break;
+
+       case 30:
+#ifdef JP
+               if (name) return "È¿ËâË¡·ë³¦";
+               if (desc) return "»ë³¦Æâ¤Î¥â¥ó¥¹¥¿¡¼¤ÎËâË¡¤òÁ˳²¤¹¤ë¥Ð¥ê¥¢¤òÄ¥¤ë¡£";
+#else
+               if (name) return "Anti magic barrier";
+               if (desc) return "Obstructs all magic spell of monsters in your sight.";
+#endif
+               power = plev * 3 / 2;
+               if (info) return info_power(power);
+               if (cast)
+               {
+#ifdef JP
+                       msg_print("ËâË¡¤òËɤ°¼ö¤¤¤ò¤«¤±¤¿¡£");
+#else
+                       msg_print("You feel anyone can not cast spells except you.");
+#endif
+               }
+               break;
+
+       case 31:
+#ifdef JP
+               if (name) return "Éü½²¤ÎÀë¹ð";
+               if (desc) return "¿ô¥¿¡¼¥ó¸å¤Ë¤½¤ì¤Þ¤Ç¼õ¤±¤¿¥À¥á¡¼¥¸¤Ë±þ¤¸¤¿°ÒÎϤÎÃϹö¤Î¹å²Ð¤ÎÃƤòÊü¤Ä¡£";
+#else
+               if (name) return "Revenge sentence";
+               if (desc) return "Fires  a ball of hell fire to try revenging after few turns.";
+#endif
+               power = p_ptr->magic_num1[2];
+               if (info) return info_damage(0, 0, power);
+               if (cast)
+               {
+                       int r;
+                       int a = 3 - (p_ptr->pspeed - 100) / 10;
+                       r = 1 + randint1(2) + MAX(0, MIN(3, a));
+
+                       if (p_ptr->magic_num2[2] > 0)
+                       {
+#ifdef JP
+                               msg_print("¤¹¤Ç¤ËÉü½²¤ÏÀë¹ðºÑ¤ß¤À¡£");
+#else
+                               msg_print("You already pronounced your revenge.");
+#endif
+                               return NULL;
+                       }
+
+                       p_ptr->magic_num2[1] = 2;
+                       p_ptr->magic_num2[2] = r;
+#ifdef JP
+                       msg_format("¤¢¤Ê¤¿¤ÏÉü½²¤òÀë¹ð¤·¤¿¡£¤¢¤È %d ¥¿¡¼¥ó¡£", r);
+#else
+                       msg_format("You pronounce your revenge. %d turns left.", r);
+#endif
+                       add = FALSE;
+               }
+               if (cont)
+               {
+                       p_ptr->magic_num2[2]--;
+
+                       if (p_ptr->magic_num2[2] <= 0)
+                       {
+                               int dir;
+
+                               if (power)
+                               {
+                                       command_dir = 0;
+
+                                       do
+                                       {
+#ifdef JP
+                                               msg_print("Éü½²¤Î»þ¤À¡ª");
+#else
+                                               msg_print("Time to revenge!");
+#endif
+                                       }
+                                       while (!get_aim_dir(&dir));
+
+                                       fire_ball(GF_HELL_FIRE, dir, power, 1);
+
+                                       if (p_ptr->wizard)
+                                       {
+#ifdef JP
+                                               msg_format("%dÅÀ¤Î¥À¥á¡¼¥¸¤òÊÖ¤·¤¿¡£", power);
+#else
+                                               msg_format("You return %d damages.", power);
+#endif
+                                       }
+                               }
+                               else
+                               {
+#ifdef JP
+                                       msg_print("Éü½²¤¹¤ëµ¤¤¬¼º¤»¤¿¡£");
+#else
+                                       msg_print("You are not a mood to revenge.");
+#endif
+                               }
+                               p_ptr->magic_num1[2] = 0;
+                       }
+               }
+               break;
+       }
+
+       /* start casting */
+       if ((cast) && (add))
+       {
+               /* add spell */
+               p_ptr->magic_num1[0] |= 1L << (spell);
+               p_ptr->magic_num2[0]++;
+
+               if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
+       }
+
+       /* Redraw status */
+       if (!info)
+       {
+               p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
+               p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
        }
 
        return "";
@@ -11414,6 +12625,7 @@ cptr do_spell(int realm, int spell, int mode)
        case REALM_CRUSADE:  return do_crusade_spell(spell, mode);
        case REALM_MUSIC:    return do_music_spell(spell, mode);
        case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
+       case REALM_HEX:      return do_hex_spell(spell, mode);
        }
 
        return NULL;