OSDN Git Service

ガンダルフの杖, 帯魔力ペンダントの発動の仕様変更.
[hengbandforosx/hengbandosx.git] / src / cmd6.c
index 5e07f6e..7cd731c 100644 (file)
@@ -1,15 +1,15 @@
 /* File: cmd6.c */
 
-/* Purpose: Object commands */
-
 /*
- * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
+ * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
  *
- * This software may be copied and distributed for educational, research, and
- * not for profit purposes provided that this copyright and statement are
- * included in all such copies.
+ * This software may be copied and distributed for educational, research,
+ * and not for profit purposes provided that this copyright and statement
+ * are included in all such copies.  Other copyrights may also apply.
  */
 
+/* Purpose: Object commands */
+
 #include "angband.h"
 
 
@@ -90,7 +90,7 @@ static void do_cmd_eat_food_aux(int item)
                {
                        case SV_FOOD_POISON:
                        {
-                               if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
+                               if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
                                {
                                        if (set_poisoned(p_ptr->poisoned + randint0(10) + 10))
                                        {
@@ -418,55 +418,10 @@ msg_print("
 #endif
 
        }
-       else if (p_ptr->prace == RACE_SKELETON)
-       {
-#if 0
-               if (o_ptr->tval == TV_SKELETON ||
-                   (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_SKELETON))
-               {
-#ifdef JP
-                       msg_print("¤¢¤Ê¤¿¤Ï¹ü¤Ç¼«Ê¬¤ÎÂΤòÊä¤Ã¤¿¡£");
-#else
-                       msg_print("Your body absorbs the bone.");
-#endif
-                       set_food(p_ptr->food + 5000);
-               }
-               else 
-#endif
-
-               if (!((o_ptr->sval == SV_FOOD_WAYBREAD) ||
-                     (o_ptr->sval < SV_FOOD_BISCUIT)))
-               {
-                       object_type forge;
-                       object_type *q_ptr = &forge;
-
-#ifdef JP
-msg_print("¿©¤Ùʪ¤¬¥¢¥´¤òÁÇÄ̤ꤷ¤ÆÍî¤Á¤¿¡ª");
-#else
-                       msg_print("The food falls through your jaws!");
-#endif
-
-
-                       /* Create the item */
-                       object_prep(q_ptr, lookup_kind(o_ptr->tval, o_ptr->sval));
-
-                       /* Drop the object from heaven */
-                       (void)drop_near(q_ptr, -1, py, px);
-               }
-               else
-               {
-#ifdef JP
-msg_print("¿©¤Ùʪ¤¬¥¢¥´¤òÁÇÄ̤ꤷ¤ÆÍî¤Á¡¢¾Ã¤¨¤¿¡ª");
-#else
-                       msg_print("The food falls through your jaws and vanishes!");
-#endif
-
-               }
-       }
-       else if ((p_ptr->prace == RACE_SKELETON ||
-                 p_ptr->prace == RACE_GOLEM ||
-                 p_ptr->prace == RACE_ZOMBIE ||
-                 p_ptr->prace == RACE_SPECTRE) &&
+       else if ((prace_is_(RACE_SKELETON) ||
+                 prace_is_(RACE_GOLEM) ||
+                 prace_is_(RACE_ZOMBIE) ||
+                 prace_is_(RACE_SPECTRE)) &&
                 (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND))
        {
                cptr staff;
@@ -496,6 +451,13 @@ msg_print("
 #else
                        msg_format("The %s has no charges left.", staff);
 #endif
+
+                       o_ptr->ident |= (IDENT_EMPTY);
+
+                       /* Combine / Reorder the pack (later) */
+                       p_ptr->notice |= (PN_COMBINE | PN_REORDER);
+                       p_ptr->window |= (PW_INVEN);
+
                        return;
                }
 
@@ -558,7 +520,7 @@ msg_print("
                /* Don't eat a staff/wand itself */
                return;
        }
-       else if ((p_ptr->prace == RACE_DEMON ||
+       else if ((prace_is_(RACE_DEMON) ||
                 (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON)) &&
                 (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_CORPSE &&
                  strchr("pht", r_info[o_ptr->pval].d_char)))
@@ -571,16 +533,61 @@ msg_print("
 #ifdef JP
                msg_format("%s¤Ïdz¤¨¾å¤ê³¥¤Ë¤Ê¤Ã¤¿¡£ÀºÎϤòµÛ¼ý¤·¤¿µ¤¤¬¤¹¤ë¡£", o_name);
 #else
-               msg_format("%^s is burnt to ashes.  You absorb its vitality!");
+               msg_format("%^s is burnt to ashes.  You absorb its vitality!", o_name);
 #endif
                (void)set_food(PY_FOOD_MAX - 1);
        }
-       else if ((p_ptr->prace == RACE_GOLEM) ||
-                (p_ptr->prace == RACE_ZOMBIE) ||
-                (p_ptr->prace == RACE_ENT) ||
-                (p_ptr->prace == RACE_DEMON) ||
-                (p_ptr->prace == RACE_ANDROID) ||
-                (p_ptr->prace == RACE_SPECTRE) ||
+       else if (prace_is_(RACE_SKELETON))
+       {
+#if 0
+               if (o_ptr->tval == TV_SKELETON ||
+                   (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_SKELETON))
+               {
+#ifdef JP
+                       msg_print("¤¢¤Ê¤¿¤Ï¹ü¤Ç¼«Ê¬¤ÎÂΤòÊä¤Ã¤¿¡£");
+#else
+                       msg_print("Your body absorbs the bone.");
+#endif
+                       set_food(p_ptr->food + 5000);
+               }
+               else 
+#endif
+
+               if (!((o_ptr->sval == SV_FOOD_WAYBREAD) ||
+                     (o_ptr->sval < SV_FOOD_BISCUIT)))
+               {
+                       object_type forge;
+                       object_type *q_ptr = &forge;
+
+#ifdef JP
+msg_print("¿©¤Ùʪ¤¬¥¢¥´¤òÁÇÄ̤ꤷ¤ÆÍî¤Á¤¿¡ª");
+#else
+                       msg_print("The food falls through your jaws!");
+#endif
+
+
+                       /* Create the item */
+                       object_prep(q_ptr, lookup_kind(o_ptr->tval, o_ptr->sval));
+
+                       /* Drop the object from heaven */
+                       (void)drop_near(q_ptr, -1, py, px);
+               }
+               else
+               {
+#ifdef JP
+msg_print("¿©¤Ùʪ¤¬¥¢¥´¤òÁÇÄ̤ꤷ¤ÆÍî¤Á¡¢¾Ã¤¨¤¿¡ª");
+#else
+                       msg_print("The food falls through your jaws and vanishes!");
+#endif
+
+               }
+       }
+       else if (prace_is_(RACE_GOLEM) ||
+                prace_is_(RACE_ZOMBIE) ||
+                prace_is_(RACE_ENT) ||
+                prace_is_(RACE_DEMON) ||
+                prace_is_(RACE_ANDROID) ||
+                prace_is_(RACE_SPECTRE) ||
                 (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING))
        {
 #ifdef JP
@@ -591,8 +598,14 @@ msg_print("
 
                set_food(p_ptr->food + ((o_ptr->pval) / 20));
        }
+       else if (o_ptr->tval == TV_FOOD && o_ptr->sval == SV_FOOD_WAYBREAD)
+       {
+               /* Waybread is always fully satisfying. */
+               set_food(MAX(p_ptr->food, PY_FOOD_MAX - 1));
+       }
        else
        {
+               /* Food can feed the player */
                (void)set_food(p_ptr->food + o_ptr->pval);
        }
 
@@ -622,7 +635,7 @@ static bool item_tester_hook_eatable(object_type *o_ptr)
        if (o_ptr->tval==TV_FOOD) return TRUE;
 
 #if 0
-       if (p_ptr->prace == RACE_SKELETON)
+       if (prace_is_(RACE_SKELETON))
        {
                if (o_ptr->tval == TV_SKELETON ||
                    (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_SKELETON))
@@ -631,15 +644,15 @@ static bool item_tester_hook_eatable(object_type *o_ptr)
        else 
 #endif
 
-       if (p_ptr->prace == RACE_SKELETON ||
-           p_ptr->prace == RACE_GOLEM ||
-           p_ptr->prace == RACE_ZOMBIE ||
-           p_ptr->prace == RACE_SPECTRE)
+       if (prace_is_(RACE_SKELETON) ||
+           prace_is_(RACE_GOLEM) ||
+           prace_is_(RACE_ZOMBIE) ||
+           prace_is_(RACE_SPECTRE))
        {
                if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)
                        return TRUE;
        }
-       else if ((p_ptr->prace == RACE_DEMON) ||
+       else if (prace_is_(RACE_DEMON) ||
                 (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON))
        {
                if (o_ptr->tval == TV_CORPSE &&
@@ -810,14 +823,24 @@ static void do_cmd_quaff_potion_aux(int item)
                        msg_print("The potion makes you vomit!");
 #endif
 
-                       (void)set_food(PY_FOOD_STARVE - 1);
+                       if (!(prace_is_(RACE_GOLEM) ||
+                             prace_is_(RACE_ZOMBIE) ||
+                             prace_is_(RACE_DEMON) ||
+                             prace_is_(RACE_ANDROID) ||
+                             prace_is_(RACE_SPECTRE) ||
+                             (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)))
+                       {
+                               /* Only living creatures get thirsty */
+                               (void)set_food(PY_FOOD_STARVE - 1);
+                       }
+
                        (void)set_poisoned(0);
                        (void)set_paralyzed(p_ptr->paralyzed + 4);
                        ident = TRUE;
                        break;
 
                case SV_POTION_POISON:
-                       if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
+                       if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
                        {
                                if (set_poisoned(p_ptr->poisoned + randint0(15) + 10))
                                {
@@ -1242,7 +1265,7 @@ msg_print("
 
                        chg_virtue(V_KNOWLEDGE, 1);
                        chg_virtue(V_ENLIGHTEN, 1);
-                       wiz_lite(FALSE, FALSE);
+                       wiz_lite(FALSE);
                        ident = TRUE;
                        break;
 
@@ -1256,7 +1279,7 @@ msg_print("
                        chg_virtue(V_KNOWLEDGE, 1);
                        chg_virtue(V_ENLIGHTEN, 2);
                        msg_print(NULL);
-                       wiz_lite(TRUE, FALSE);
+                       wiz_lite(FALSE);
                        (void)do_inc_stat(A_INT);
                        (void)do_inc_stat(A_WIS);
                        (void)detect_traps(DETECT_RAD_DEFAULT, TRUE);
@@ -1396,7 +1419,7 @@ msg_print("
                }
        }
 
-       if (p_ptr->prace == RACE_SKELETON)
+       if (prace_is_(RACE_SKELETON))
        {
 #ifdef JP
 msg_print("±ÕÂΤΰìÉô¤Ï¤¢¤Ê¤¿¤Î¥¢¥´¤òÁÇÄ̤ꤷ¤ÆÍî¤Á¤¿¡ª");
@@ -1469,7 +1492,7 @@ msg_print("
 #else
                                msg_print("You are moistened.");
 #endif
-                               set_food(MIN(p_ptr->food + o_ptr->pval + 1000, PY_FOOD_MAX - 1));
+                               set_food(MIN(p_ptr->food + o_ptr->pval + MAX(0, o_ptr->pval * 10) + 2000, PY_FOOD_MAX - 1));
                                break;
                        default:
                                (void)set_food(p_ptr->food + o_ptr->pval);
@@ -1497,7 +1520,7 @@ static bool item_tester_hook_quaff(object_type *o_ptr)
 {
        if (o_ptr->tval == TV_POTION) return TRUE;
 
-       if (p_ptr->prace == RACE_ANDROID)
+       if (prace_is_(RACE_ANDROID))
        {
                if (o_ptr->tval == TV_FLASK && o_ptr->sval == SV_FLASK_OIL)
                        return TRUE;
@@ -1710,7 +1733,7 @@ static void do_cmd_read_scroll_aux(int item, bool known)
 
                case SV_SCROLL_TELEPORT_LEVEL:
                {
-                       (void)teleport_player_level();
+                       (void)teleport_level(0);
                        ident = TRUE;
                        break;
                }
@@ -1922,7 +1945,7 @@ static void do_cmd_read_scroll_aux(int item, bool known)
 
                case SV_SCROLL_STAR_DESTRUCTION:
                {
-                       if (destroy_area(py, px, 13+randint0(5), TRUE))
+                       if (destroy_area(py, px, 13 + randint0(5), FALSE))
                                ident = TRUE;
                        else
 #ifdef JP
@@ -1983,7 +2006,7 @@ msg_print("
                {
                        fire_ball(GF_FIRE, 0, 666, 4);
                        /* Note: "Double" damage since it is centered on the player ... */
-                       if (!(p_ptr->oppose_fire || p_ptr->resist_fire || p_ptr->immune_fire))
+                       if (!(IS_OPPOSE_FIRE() || p_ptr->resist_fire || p_ptr->immune_fire))
 #ifdef JP
 take_hit(DAMAGE_NOESCAPE, 50+randint1(50), "±ê¤Î´¬Êª", -1);
 #else
@@ -1998,7 +2021,7 @@ take_hit(DAMAGE_NOESCAPE, 50+randint1(50), "
                case SV_SCROLL_ICE:
                {
                        fire_ball(GF_ICE, 0, 777, 4);
-                       if (!(p_ptr->oppose_cold || p_ptr->resist_cold || p_ptr->immune_cold))
+                       if (!(IS_OPPOSE_COLD() || p_ptr->resist_cold || p_ptr->immune_cold))
 #ifdef JP
 take_hit(DAMAGE_NOESCAPE, 100+randint1(100), "ɹ¤Î´¬Êª", -1);
 #else
@@ -2402,15 +2425,15 @@ static int staff_effect(int sval, bool *use_charge, bool magic, bool known)
                        }
                        for (k = 0; k < num; k++)
                        {
-               attempts = 1000;
+                               attempts = 1000;
 
-                               while(attempts--)
+                               while (attempts--)
                                {
                                        scatter(&y, &x, py, px, 4, 0);
 
                                        if (!cave_floor_bold(y, x)) continue;
 
-                                       if ((y != py) || (x != px)) break;
+                                       if (!player_bold(y, x)) break;
                                }
 
                                project(0, 0, y, x, damroll(6 + p_ptr->lev / 8, 10), GF_LITE_WEAK,
@@ -2595,7 +2618,7 @@ msg_print("
 
                case SV_STAFF_DESTRUCTION:
                {
-                       if (destroy_area(py, px, 13+randint0(5), TRUE))
+                       if (destroy_area(py, px, 13 + randint0(5), FALSE))
                                ident = TRUE;
 
                        break;
@@ -2630,6 +2653,23 @@ msg_print("
 
                        break;
                }
+
+               case SV_STAFF_NOTHING:
+               {
+#ifdef JP
+                       msg_print("²¿¤âµ¯¤é¤Ê¤«¤Ã¤¿¡£");
+#else
+                       msg_print("Nothing happen.");
+#endif
+                       if (prace_is_(RACE_SKELETON) || prace_is_(RACE_GOLEM) ||
+                               prace_is_(RACE_ZOMBIE) || prace_is_(RACE_SPECTRE))
+#ifdef JP
+                               msg_print("¤â¤Ã¤¿¤¤¤Ê¤¤»ö¤ò¤·¤¿¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£¿©¤Ùʪ¤ÏÂçÀڤˤ·¤Ê¤¯¤Æ¤Ï¡£");
+#else
+                               msg_print("What a waste.  It's your food!");
+#endif
+                       break;
+               }
        }
        return ident;
 }
@@ -3358,12 +3398,15 @@ static int rod_effect(int sval, int dir, bool *use_charge, bool magic)
 {
        int ident = FALSE;
 
+       /* Unused */
+       (void)magic;
+
        /* Analyze the rod */
        switch (sval)
        {
                case SV_ROD_DETECT_TRAP:
                {
-                       if (detect_traps(DETECT_RAD_DEFAULT, dir ? FALSE : TRUE)) ident = TRUE;
+                       if (detect_traps(DETECT_RAD_DEFAULT, (bool)(dir ? FALSE : TRUE))) ident = TRUE;
                        break;
                }
 
@@ -3900,6 +3943,9 @@ static bool ang_sort_comp_pet(vptr u, vptr v, int a, int b)
        monster_race *r_ptr1 = &r_info[m_ptr1->r_idx];
        monster_race *r_ptr2 = &r_info[m_ptr2->r_idx];
 
+       /* Unused */
+       (void)v;
+
        if (m_ptr1->nickname && !m_ptr2->nickname) return TRUE;
        if (m_ptr2->nickname && !m_ptr1->nickname) return FALSE;
 
@@ -4182,7 +4228,7 @@ msg_print("
 
                                chg_virtue(V_KNOWLEDGE, 1);
                                chg_virtue(V_ENLIGHTEN, 1);
-                               wiz_lite(FALSE, FALSE);
+                               wiz_lite(FALSE);
 #ifdef JP
 msg_print("¤½¤ÎÊõÀФϤ¢¤Ê¤¿¤ÎÂÎÎϤòÃ¥¤Ã¤¿...");
 take_hit(DAMAGE_LOSELIFE, damroll(3,8), "¿³È½¤ÎÊõÀÐ", -1);
@@ -4349,15 +4395,15 @@ msg_print("
 
                                for (k = 0; k < num; k++)
                                {
-               attempts = 1000;
+                                       attempts = 1000;
 
-                                       while(attempts--)
+                                       while (attempts--)
                                        {
                                                scatter(&y, &x, py, px, 4, 0);
 
                                                if (!cave_floor_bold(y, x)) continue;
 
-                                               if ((y != py) || (x != px)) break;
+                                               if (!player_bold(y, x)) break;
                                        }
 
                                        project(0, 3, y, x, 150, GF_ELEC,
@@ -5058,7 +5104,7 @@ msg_print("
                                detect_all(DETECT_RAD_DEFAULT);
                                probing();
                                identify_fully(FALSE);
-                               o_ptr->timeout = 1000;
+                               o_ptr->timeout = 100;
                                break;
                        }
 
@@ -5683,6 +5729,81 @@ msg_print("
                                o_ptr->timeout = randint0(150) + 150;
                                break;
                        }
+                       case ART_HELL:
+                       {
+#ifdef JP
+                               msg_print("¼óÎؤ¬¿¼¤¤°Ç¤Ëʤ¤ï¤ì¤¿...");
+#else
+                               msg_print("Your collar harness is coverd in pitch-darkness...");
+#endif
+                               if (!get_aim_dir(&dir)) return;
+                               fire_ball(GF_DARK, dir, 250, 4);
+                               o_ptr->timeout = randint0(150) + 150;
+                               break;
+                       }
+                       case ART_SACRED_KNIGHTS:
+                       {
+#ifdef JP
+                               msg_print("¼ó¾þ¤ê¤¬¿¿¼Â¤ò¾È¤é¤·½Ð¤¹...");
+#else
+                               msg_print("Your amulet exhibits the truth...");
+#endif
+                               if (remove_all_curse())
+                               {
+#ifdef JP
+                                       msg_print("狼¤Ë¸«¼é¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤¹¤ë¡£");
+#else
+                                       msg_print("You feel as if someone is watching over you.");
+#endif
+                               }
+                               (void)probing();
+                               break;
+                       }
+                       case ART_CHARMED:
+                       {
+#ifdef JP
+                               msg_print("¥Ú¥ó¥À¥ó¥È¤¬ÀÄÇò¤¯¸÷¤Ã¤¿¡¥¡¥¡¥");
+#else
+                               msg_print("Your pendant glows pale...");
+#endif
+                               if (p_ptr->pclass == CLASS_MAGIC_EATER)
+                               {
+                                       int i;
+                                       for (i = 0; i < EATER_EXT*2; i++)
+                                       {
+                                               p_ptr->magic_num1[i] += (p_ptr->magic_num2[i] < 10) ? EATER_CHARGE * 3 : p_ptr->magic_num2[i]*EATER_CHARGE/3;
+                                               if (p_ptr->magic_num1[i] > p_ptr->magic_num2[i]*EATER_CHARGE) p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*EATER_CHARGE;
+                                       }
+                                       for (; i < EATER_EXT*3; i++)
+                                       {
+                                               int k_idx = lookup_kind(TV_ROD, i-EATER_EXT*2);
+                                               p_ptr->magic_num1[i] -= ((p_ptr->magic_num2[i] < 10) ? EATER_ROD_CHARGE*3 : p_ptr->magic_num2[i]*EATER_ROD_CHARGE/3)*k_info[k_idx].pval;
+                                               if (p_ptr->magic_num1[i] < 0) p_ptr->magic_num1[i] = 0;
+                                       }
+#ifdef JP
+                                       msg_print("Ƭ¤¬¥Ï¥Ã¥­¥ê¤È¤·¤¿¡£");
+#else
+                                       msg_print("Your feel your head clear.");
+#endif
+                                       p_ptr->window |= (PW_PLAYER);
+                               }
+                               else if (p_ptr->csp < p_ptr->msp)
+                               {
+                                       p_ptr->csp = p_ptr->msp;
+                                       p_ptr->csp_frac = 0;
+#ifdef JP
+                                       msg_print("Ƭ¤¬¥Ï¥Ã¥­¥ê¤È¤·¤¿¡£");
+#else
+                                       msg_print("Your feel your head clear.");
+#endif
+
+                                       p_ptr->redraw |= (PR_MANA);
+                                       p_ptr->window |= (PW_PLAYER);
+                                       p_ptr->window |= (PW_SPELL);
+                               }
+                               o_ptr->timeout = 777;
+                               break;
+                       }
                }
 
                /* Window stuff */
@@ -5692,7 +5813,7 @@ msg_print("
                return;
        }
 
-       else if ((o_ptr->tval > TV_CAPTURE) && (o_ptr->xtra3))
+       if (item_tester_hook_smith(o_ptr))
        {
                switch (o_ptr->xtra3-1)
                {
@@ -5729,7 +5850,7 @@ msg_print("
        }
 
 
-       else if (o_ptr->name2 == EGO_TRUMP)
+       if (o_ptr->name2 == EGO_TRUMP)
        {
                teleport_player(100);
                o_ptr->timeout = 50 + randint1(50);
@@ -5742,7 +5863,7 @@ msg_print("
        }
 
 
-       else if (o_ptr->name2 == EGO_LITE_ILLUMINATION)
+       if (o_ptr->name2 == EGO_LITE_ILLUMINATION)
        {
                if (!o_ptr->xtra4 && ((o_ptr->sval == SV_LITE_TORCH) || (o_ptr->sval == SV_LITE_LANTERN)))
                {
@@ -5764,7 +5885,7 @@ msg_print("
        }
 
 
-       else if (o_ptr->name2 == EGO_EARTHQUAKES)
+       if (o_ptr->name2 == EGO_EARTHQUAKES)
        {
                earthquake(py, px, 5);
                o_ptr->timeout = 100 + randint1(100);
@@ -5777,7 +5898,7 @@ msg_print("
        }
 
 
-       else if (o_ptr->name2 == EGO_JUMP)
+       if (o_ptr->name2 == EGO_JUMP)
        {
                teleport_player(10);
                o_ptr->timeout = 10 + randint1(10);
@@ -5791,7 +5912,7 @@ msg_print("
 
 
        /* Hack -- Dragon Scale Mail can be activated as well */
-       else if (o_ptr->tval == TV_DRAG_ARMOR)
+       if (o_ptr->tval == TV_DRAG_ARMOR)
        {
                /* Get a direction for breathing (or abort) */
                if (!get_aim_dir(&dir)) return;
@@ -6277,7 +6398,7 @@ msg_print("
                        for (i = 0; i < max_pet; i++)
                        {
                                pet_ctr = who[i];
-                               teleport_to_player(pet_ctr, 100);
+                               teleport_monster_to(pet_ctr, py, px, 100);
                        }
 
                        /* Free the "who" array */
@@ -6662,11 +6783,11 @@ msg_print("
        }
 }
 
-static bool select_magic_eater(bool only_browse)
+static int select_magic_eater(bool only_browse)
 {
        int ext=0;
        char choice;
-       bool flag, redraw, request_list;
+       bool flag, request_list;
        int tval = 0;
        int             ask = TRUE, i = 0;
        char            out_val[160];
@@ -6801,9 +6922,6 @@ static bool select_magic_eater(bool only_browse)
        /* Nothing chosen yet */
        flag = FALSE;
 
-       /* No redraw yet */
-       redraw = FALSE;
-
        /* Build a prompt */
 #ifdef JP
 (void) strnfmt(out_val, 78, "('*'¤Ç°ìÍ÷, ESC¤ÇÃæÃÇ) ¤É¤ÎËâÎϤò»È¤¤¤Þ¤¹¤«¡©");
@@ -6926,17 +7044,16 @@ static bool select_magic_eater(bool only_browse)
                        }
                }
 
-               if(!get_com(out_val, &choice, FALSE)) break; 
+               if (!get_com(out_val, &choice, FALSE)) break;
 
                if (use_menu && choice != ' ')
                {
-                       switch(choice)
+                       switch (choice)
                        {
                                case '0':
                                {
                                        screen_load();
-                                       return (FALSE);
-                                       break;
+                                       return 0;
                                }
 
                                case '8':
@@ -7115,7 +7232,7 @@ static bool select_magic_eater(bool only_browse)
                        Term_erase(7, 21, 255);
                        Term_erase(7, 20, 255);
 
-                       roff_to_buf(k_text + k_info[lookup_kind(tval, i)].text, 62, temp);
+                       roff_to_buf(k_text + k_info[lookup_kind(tval, i)].text, 62, temp, sizeof(temp));
                        for (j = 0, line = 21; temp[j]; j += 1 + strlen(&temp[j]))
                        {
                                prt(&temp[j], line, 10);