OSDN Git Service

Extend features of tiling. (separation of Cell size and Tile size / add offset position.)
[hengband/hengband.git] / src / cmd5.c
index f2c5c02..193fd6f 100644 (file)
@@ -1,6 +1,8 @@
-/* File: cmd5.c */
-
-/*
+/*!
+ *  @file cmd5.c
+ *  @brief ¥×¥ì¥¤¥ä¡¼¤ÎËâË¡¤Ë´Ø¤¹¤ë¥³¥Þ¥ó¥É¤Î¼ÂÁõ / Spell/Prayer commands
+ *  @date 2014/01/02
+ *  @author
  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
  *
  * This software may be copied and distributed for educational, research,
  * are included in all such copies.  Other copyrights may also apply.
  */
 
-/* Purpose: Spell/Prayer commands */
 
 #include "angband.h"
 
+/*!
+ * @brief ÎΰèËâË¡¤Ë±þ¤¸¤Æµ»Ç½¤Î̾¾Î¤òÊÖ¤¹¡£
+ * @param tval ËâË¡½ñ¤Îtval
+ * @return ÎΰèËâË¡¤Îµ»Ç½Ì¾¾Î¤òÊݴɤ·¤¿Ê¸»úÎó¥Ý¥¤¥ó¥¿
+ */
 cptr spell_category_name(int tval)
 {
        switch (tval)
@@ -38,19 +44,26 @@ cptr spell_category_name(int tval)
        }
 }
 
-/*
+
+bool select_the_force = FALSE;
+
+/*!
+ * @brief ÎΰèËâË¡¤Î±ÜÍ÷¡¢³Ø½¬¡¢»ÈÍÑÁªÂò¤¹¤ë¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹½èÍý
  * Allow user to choose a spell/prayer from the given book.
- *
+ * @param sn ÁªÂò¤·¤¿ËâË¡ID¤òÊÖ¤¹»²¾È¥Ý¥¤¥ó¥¿
+ * @param prompt ËâË¡¤òÍøÍѤ¹¤ëºÝ¤ÎÆ°»ìɽµ­
+ * @param sval ËâÆ»½ñ¤Îsval
+ * @param learned ±ÜÍ÷/»ÈÍÑÁªÂò¤Ê¤é¤ÐTRUE¡¢³Ø½¬½èÍý¤Ê¤éFALSE
+ * @param use_realm ËâË¡ÎΰèID
+ * @return
+ * <pre>
  * If a valid spell is chosen, saves it in '*sn' and returns TRUE
  * If the user hits escape, returns FALSE, and set '*sn' to -1
  * If there are no legal choices, returns FALSE, and sets '*sn' to -2
- *
  * The "prompt" should be "cast", "recite", or "study"
  * The "known" should be TRUE for cast/pray, FALSE for study
+ * </pre>
  */
-
-bool select_the_force = FALSE;
-
 static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm)
 {
        int         i;
@@ -61,7 +74,7 @@ static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm
        byte        spells[64];
        bool        flag, redraw, okay;
        char        choice;
-       magic_type  *s_ptr;
+       const magic_type  *s_ptr;
        char        out_val[160];
        cptr        p;
 #ifdef JP
@@ -333,7 +346,11 @@ static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm
        return TRUE;
 }
 
-
+/*!
+ * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤¬¥×¥ì¥¤¥ä¡¼¤¬»ÈÍѲÄǽ¤ÊËâÆ»½ñ¤«¤É¤¦¤«¤òȽÄꤹ¤ë
+ * @param o_ptr È½Äꤷ¤¿¤¤¥ª¥Ö²ñ¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
+ * @return ³Ø½¬¤Ç¤­¤ëËâÆ»½ñ¤Ê¤é¤ÐTRUE¤òÊÖ¤¹
+ */
 static bool item_tester_learn_spell(object_type *o_ptr)
 {
        s32b choices = realm_choices2[p_ptr->pclass];
@@ -358,7 +375,10 @@ static bool item_tester_learn_spell(object_type *o_ptr)
        return (FALSE);
 }
 
-
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤¬ËâÆ»½ñ¤ò°ìºý¤â»ý¤Ã¤Æ¤¤¤Ê¤¤¤«¤òȽÄꤹ¤ë
+ * @return ËâÆ»½ñ¤ò°ìºý¤â»ý¤Ã¤Æ¤¤¤Ê¤¤¤Ê¤éTRUE¤òÊÖ¤¹
+ */
 static bool player_has_no_spellbooks(void)
 {
        int         i;
@@ -379,7 +399,11 @@ static bool player_has_no_spellbooks(void)
        return TRUE;
 }
 
-
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤Î¿¦¶È¤¬Îýµ¤½Ñ»Õ¤Î»þ¡¢ÎΰèËâË¡¤ÈÎýµ¤½Ñ¤òÀڤ괹¤¨¤ë½èÍý¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹
+ * @param browse_only ËâË¡¤Èµ»Ç½¤Î±ÜÍ÷¤ò¹Ô¤¦¤Ê¤é¤ÐTRUE
+ * @return ËâÆ»½ñ¤ò°ìºý¤â»ý¤Ã¤Æ¤¤¤Ê¤¤¤Ê¤éTRUE¤òÊÖ¤¹
+ */
 static void confirm_use_force(bool browse_only)
 {
        int  item;
@@ -432,13 +456,17 @@ static void confirm_use_force(bool browse_only)
 }
 
 
-/*
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤ÎËâË¡¤Èµ»Ç½¤ò±ÜÍ÷¤¹¤ë¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó /
  * Peruse the spells/prayers in a book
- *
+ * @return ¤Ê¤·
+ * @details
+ * <pre>
  * Note that *all* spells in the book are listed
  *
  * Note that browsing is allowed while confused or blind,
  * and in the dark, primarily to allow browsing in stores.
+ * </pre>
  */
 void do_cmd_browse(void)
 {
@@ -609,7 +637,11 @@ void do_cmd_browse(void)
        screen_load();
 }
 
-
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤ÎÂèÆóËâË¡Îΰè¤òÊѹ¹¤¹¤ë /
+ * @param next_realm Êѹ¹Àè¤ÎËâË¡ÎΰèID
+ * @return ¤Ê¤·
+ */
 static void change_realm2(int next_realm)
 {
        int i, j = 0;
@@ -649,8 +681,10 @@ static void change_realm2(int next_realm)
 }
 
 
-/*
+/*!
+ * @brief ËâË¡¤ò³Ø½¬¤¹¤ë¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó /
  * Study a book to gain a new spell/prayer
+ * @return ¤Ê¤·
  */
 void do_cmd_study(void)
 {
@@ -984,7 +1018,11 @@ msg_format("
        p_ptr->window |= (PW_OBJECT);
 }
 
-
+/*!
+ * @brief ±¿Ì¿¤ÎÎØ¡¢Ê¤Ӥ˥«¥ª¥¹Åª¤Ê¸ú²Ì¤Îȯư
+ * @param spell ¥é¥ó¥À¥à¤Ê¸ú²Ì¤òÁªÂò¤¹¤ë¤¿¤á¤Î´ð½àID
+ * @return ¤Ê¤·
+ */
 static void wild_magic(int spell)
 {
        int counter = 0;
@@ -1086,8 +1124,10 @@ static void wild_magic(int spell)
 }
 
 
-/*
+/*!
+ * @brief ËâË¡¤ò±Ó¾§¤¹¤ë¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó /
  * Cast a spell
+ * @return ¤Ê¤·
  */
 void do_cmd_cast(void)
 {
@@ -1101,10 +1141,12 @@ void do_cmd_cast(void)
 
        object_type     *o_ptr;
 
-       magic_type      *s_ptr;
+       const magic_type *s_ptr;
 
        cptr q, s;
 
+       bool over_exerted = FALSE;
+
        /* Require spell ability */
        if (!p_ptr->realm1 && (p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE))
        {
@@ -1145,6 +1187,23 @@ void do_cmd_cast(void)
                return;
        }
 
+       /* Hex */
+       if (p_ptr->realm1 == REALM_HEX)
+       {
+               if (hex_spell_fully())
+               {
+                       bool flag = FALSE;
+#ifdef JP
+                       msg_print("¤³¤ì°Ê¾å¿·¤·¤¤¼öʸ¤ò±Ó¾§¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡£");
+#else
+                       msg_print("Can not spell new spells more.");
+#endif
+                       flush();
+                       if (p_ptr->lev >= 35) flag = stop_hex_spell();
+                       if (!flag) return;
+               }
+       }
+
        if (p_ptr->pclass == CLASS_FORCETRAINER)
        {
                if (player_has_no_spellbooks())
@@ -1237,6 +1296,20 @@ void do_cmd_cast(void)
 
        use_realm = tval2realm(o_ptr->tval);
 
+       /* Hex */
+       if (use_realm == REALM_HEX)
+       {
+               if (hex_spelling(spell))
+               {
+#ifdef JP
+                       msg_print("¤½¤Î¼öʸ¤Ï¤¹¤Ç¤Ë±Ó¾§Ãæ¤À¡£");
+#else
+                       msg_print("You are already casting it.");
+#endif
+                       return;
+               }
+       }
+
        if (!is_magic(use_realm))
        {
                s_ptr = &technic_info[use_realm - MIN_TECHNIC][spell];
@@ -1276,10 +1349,20 @@ msg_format("
 
        }
 
-
        /* Spell failure chance */
        chance = spell_chance(spell, use_realm);
 
+       /* Sufficient mana */
+       if (need_mana <= p_ptr->csp)
+       {
+               /* Use some mana */
+               p_ptr->csp -= need_mana;
+       }
+       else over_exerted = TRUE;
+
+       /* Redraw mana */
+       p_ptr->redraw |= (PR_MANA);
+
        /* Failed spell */
        if (randint0(100) < chance)
        {
@@ -1310,6 +1393,9 @@ msg_format("%s
                case REALM_CRUSADE:
                        if (randint1(100) < chance) chg_virtue(V_JUSTICE, -1);
                        break;
+               case REALM_HEX:
+                       if (randint1(100) < chance) chg_virtue(V_COMPASSION, -1);
+                       break;
                default:
                        if (randint1(100) < chance) chg_virtue(V_KNOWLEDGE, -1);
                        break;
@@ -1349,7 +1435,7 @@ msg_print("
                                take_hit(DAMAGE_LOSELIFE, damroll(o_ptr->sval + 1, 6), "a miscast Death spell", -1);
 #endif
 
-                               if ((spell > 15) && one_in_(6) && !p_ptr->hold_life)
+                               if ((spell > 15) && one_in_(6) && !p_ptr->hold_exp)
                                        lose_exp(spell * 250);
                        }
                }
@@ -1431,6 +1517,12 @@ msg_print("An infernal sound echoed.");
                                chg_virtue(V_NATURE, 1);
                                chg_virtue(V_HARMONY, 1);
                                break;
+                       case REALM_HEX:
+                               chg_virtue(V_JUSTICE, -1);
+                               chg_virtue(V_FAITH, -1);
+                               chg_virtue(V_HONOUR, -1);
+                               chg_virtue(V_COMPASSION, -1);
+                               break;
                        default:
                                chg_virtue(V_KNOWLEDGE, 1);
                                break;
@@ -1466,6 +1558,12 @@ msg_print("An infernal sound echoed.");
                        if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_NATURE, 1);
                        if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HARMONY, 1);
                        break;
+               case REALM_HEX:
+                       if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_JUSTICE, -1);
+                       if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_FAITH, -1);
+                       if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HONOUR, -1);
+                       if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_COMPASSION, -1);
+                       break;
                }
                if (mp_ptr->spell_xtra & MAGIC_GAIN_EXP)
                {
@@ -1496,15 +1594,9 @@ msg_print("An infernal sound echoed.");
        /* Take a turn */
        energy_use = 100;
 
-       /* Sufficient mana */
-       if (need_mana <= p_ptr->csp)
-       {
-               /* Use some mana */
-               p_ptr->csp -= need_mana;
-       }
 
        /* Over-exert the player */
-       else
+       if(over_exerted)
        {
                int oops = need_mana;
 
@@ -1540,6 +1632,9 @@ msg_print("
                case REALM_CRUSADE:
                        chg_virtue(V_JUSTICE, -10);
                        break;
+               case REALM_HEX:
+                       chg_virtue(V_COMPASSION, 10);
+                       break;
                default:
                        chg_virtue(V_KNOWLEDGE, -10);
                        break;
@@ -1563,15 +1658,19 @@ msg_print("
                }
        }
 
-       /* Redraw mana */
-       p_ptr->redraw |= (PR_MANA);
-
        /* Window stuff */
        p_ptr->window |= (PW_PLAYER);
        p_ptr->window |= (PW_SPELL);
 }
 
-
+/*!
+ * @brief ¥Ú¥Ã¥È¤Ë¤Ê¤Ã¤Æ¤¤¤ë¥â¥ó¥¹¥¿¡¼¤ò¥½¡¼¥È¤¹¤ë¤¿¤á¤ÎÈæ³Ó½èÍý
+ * @param u ¥â¥ó¥¹¥¿¡¼¤Î¹½Â¤ÂÎÇÛÎó
+ * @param v Ì¤»ÈÍÑ
+ * @param a Èæ³ÓÂоݤΥâ¥ó¥¹¥¿¡¼ID1
+ * @param b Èæ³ÓÂоݤΥâ¥ó¥¹¥¿¡¼ID2
+ * @return 2ÈÖÌܤ¬Âç¤Ê¤é¤ÐTRUE¤òÊÖ¤¹
+ */
 static bool ang_sort_comp_pet_dismiss(vptr u, vptr v, int a, int b)
 {
        u16b *who = (u16b*)(u);
@@ -1608,14 +1707,45 @@ static bool ang_sort_comp_pet_dismiss(vptr u, vptr v, int a, int b)
        return w1 <= w2;
 }
 
+/*!
+ * @brief ¥Ú¥Ã¥È¤ÎÁ±°­Â°À­¤Ë±þ¤¸¤¿°Ý»ý¥³¥¹¥È¤ÎÅÓÃæ·×»»½èÍý
+ * @param m_ptr ·×»»´ð½à¤È¤Ê¤ë¥â¥ó¥¹¥¿¡¼¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
+ * @param inc m_ptr¤Ç»ØÄꤷ¤¿¥â¥ó¥¹¥¿¡¼¤ò°Ý»ý¥³¥¹¥È·×»»¤Ë²Ã¤¨¤ë¤Ê¤éTRUE¡¢³°¤¹¤Ê¤éFALSE¤ò»ØÄê
+ * @return ¤Ê¤·
+ */
+void check_pets_num_and_align(monster_type *m_ptr, bool inc)
+{
+       s32b old_friend_align = friend_align;
+       monster_race *r_ptr = &r_info[m_ptr->r_idx];
+
+       if (inc)
+       {
+               total_friends++;
+               if (r_ptr->flags3 & RF3_GOOD) friend_align += r_ptr->level;
+               if (r_ptr->flags3 & RF3_EVIL) friend_align -= r_ptr->level;
+       }
+       else
+       {
+               total_friends--;
+               if (r_ptr->flags3 & RF3_GOOD) friend_align -= r_ptr->level;
+               if (r_ptr->flags3 & RF3_EVIL) friend_align += r_ptr->level;
+       }
+
+       if (old_friend_align != friend_align) p_ptr->update |= (PU_BONUS);
+}
+
+/*!
+ * @brief ¥Ú¥Ã¥È¤Î°Ý»ý¥³¥¹¥È·×»»
+ * @return °Ý»ý¥³¥¹¥È(%)
+ */
 int calculate_upkeep(void)
 {
        s32b old_friend_align = friend_align;
        int m_idx;
        bool have_a_unique = FALSE;
+       s32b total_friend_levels = 0;
 
        total_friends = 0;
-       total_friend_levels = 0;
        friend_align = 0;
 
        for (m_idx = m_max - 1; m_idx >=1; m_idx--)
@@ -1666,6 +1796,10 @@ int calculate_upkeep(void)
                return 0;
 }
 
+/*!
+ * @brief ¥Ú¥Ã¥È¤ò³«Êü¤¹¤ë¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó
+ * @return ¤Ê¤·
+ */
 void do_cmd_pet_dismiss(void)
 {
        monster_type    *m_ptr;
@@ -1704,7 +1838,6 @@ void do_cmd_pet_dismiss(void)
        {
                bool delete_this;
                char friend_name[80];
-               char buf[80];
                bool kakunin;
 
                /* Access the monster */
@@ -1722,14 +1855,9 @@ void do_cmd_pet_dismiss(void)
 
                        /* Hack -- handle stuff */
                        handle_stuff();
-
-#ifdef JP
-                       sprintf(buf, "%s¤òÊü¤·¤Þ¤¹¤«¡© [Yes/No/Unnamed (%dÂÎ)]", friend_name, max_pet - i);
-#else
-                       sprintf(buf, "Dismiss %s? [Yes/No/Unnamed (%d remain)]", friend_name, max_pet - i);
-#endif
-                       prt(buf, 0, 0);
-
+                       
+                       msg_format(_("%s¤òÊü¤·¤Þ¤¹¤«¡© [Yes/No/Unnamed (%dÂÎ)]","Dismiss %s? [Yes/No/Unnamed (%d remain)]"), friend_name, max_pet - i);
+                       
                        if (m_ptr->ml)
                                move_cursor_relative(m_ptr->fy, m_ptr->fx);
 
@@ -1743,12 +1871,9 @@ void do_cmd_pet_dismiss(void)
 
                                        if (kakunin)
                                        {
-#ifdef JP
-                                               sprintf(buf, "ËÜÅö¤Ë¤è¤í¤·¤¤¤Ç¤¹¤«¡© (%s) ", friend_name);
-#else
-                                               sprintf(buf, "Are you sure? (%s) ", friend_name);
-#endif
-                                               if (!get_check(buf))
+                                               msg_format(_("ËÜÅö¤Ë¤è¤í¤·¤¤¤Ç¤¹¤«¡© (%s) ","Are you sure? (%s) "), friend_name);
+                                               ch = inkey();
+                                               if (ch != 'Y' && ch != 'y')
                                                        delete_this = FALSE;
                                        }
                                        break;
@@ -1774,16 +1899,12 @@ void do_cmd_pet_dismiss(void)
                                char m_name[80];
 
                                monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
-                               do_cmd_write_nikki(NIKKI_NAMED_PET, 2, m_name);
+                               do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_DISMISS, m_name);
                        }
 
                        if (pet_ctr == p_ptr->riding)
                        {
-#ifdef JP
-                               msg_format("%s¤«¤é¹ß¤ê¤¿¡£", friend_name);
-#else
-                               msg_format("You have got off %s. ", friend_name);
-#endif
+                               msg_format(_("%s¤«¤é¹ß¤ê¤¿¡£","You have got off %s. "), friend_name);
 
                                p_ptr->riding = 0;
 
@@ -1793,12 +1914,7 @@ void do_cmd_pet_dismiss(void)
                        }
 
                        /* HACK : Add the line to message buffer */
-#ifdef JP
-                       sprintf(buf, "%s ¤òÊü¤·¤¿¡£", friend_name);
-#else
-                       sprintf(buf, "Dismissed %s.", friend_name);
-#endif
-                       message_add(buf);
+                       msg_format(_("%s ¤òÊü¤·¤¿¡£","Dismissed %s."), friend_name);
                        p_ptr->window |= (PW_MESSAGE);
                        window_stuff();
 
@@ -1827,6 +1943,12 @@ void do_cmd_pet_dismiss(void)
 #endif
 }
 
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤Îµ³¾è/²¼ÇϽèÍýȽÄê
+ * @param c_ptr ¥×¥ì¥¤¥ä¡¼¤Î°ÜÆ°Àè¥Þ¥¹¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
+ * @param now_riding TRUE¤Ê¤é²¼ÇϽèÍý¡¢FALSE¤Ê¤é¤Ðµ³¾è½èÍý
+ * @return ²Äǽ¤Ê¤é¤ÐTRUE¤òÊÖ¤¹
+ */
 static bool player_can_ride_aux(cave_type *c_ptr, bool now_riding)
 {
        bool p_can_enter;
@@ -1864,6 +1986,12 @@ static bool player_can_ride_aux(cave_type *c_ptr, bool now_riding)
        return p_can_enter;
 }
 
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤ÎÍîÇÏȽÄê½èÍý
+ * @param dam ÍîÇÏȽÄê¤òȯ¤·¤¿ºÝ¤Ë¼õ¤±¤¿¥À¥á¡¼¥¸ÎÌ
+ * @param force TRUE¤Ê¤é¤Ð¶¯À©Åª¤ËÍîÇϤ¹¤ë
+ * @return ¼ÂºÝ¤ËÍîÇϤ·¤¿¤éTRUE¤òÊÖ¤¹
+ */
 bool rakuba(int dam, bool force)
 {
        int i, y, x, oy, ox;
@@ -2015,6 +2143,11 @@ msg_format("%s
        return fall_dam;
 }
 
+/*!
+ * @brief ¥Ú¥Ã¥È¤«¤éµ³¾è/²¼ÇϤ¹¤ë¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó /
+ * @param force ¶¯À©Åª¤Ëµ³¾è/²¼ÇϤ¹¤ë¤Ê¤é¤ÐTRUE
+ * @return µ³¾è/²¼ÇϤǤ­¤¿¤éTRUE
+ */
 bool do_riding(bool force)
 {
        int x, y, dir = 0;
@@ -2180,6 +2313,10 @@ bool do_riding(bool force)
        return TRUE;
 }
 
+/*!
+ * @brief ¥Ú¥Ã¥È¤Ë̾Á°¤ò¤Ä¤±¤ë¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó
+ * @return ¤Ê¤·
+ */
 static void do_name_pet(void)
 {
        monster_type *m_ptr;
@@ -2258,7 +2395,7 @@ static void do_name_pet(void)
                                        char m_name[80];
 
                                        monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
-                                       do_cmd_write_nikki(NIKKI_NAMED_PET, 0, m_name);
+                                       do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_NAME, m_name);
                                }
                        }
                        else
@@ -2268,7 +2405,7 @@ static void do_name_pet(void)
                                        char m_name[80];
 
                                        monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
-                                       do_cmd_write_nikki(NIKKI_NAMED_PET, 1, m_name);
+                                       do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_UNNAME, m_name);
                                }
                                m_ptr->nickname = 0;
                        }
@@ -2276,8 +2413,11 @@ static void do_name_pet(void)
        }
 }
 
-/*
+
+/*!
+ * @brief ¥Ú¥Ã¥È¤Ë´Ø¤¹¤ë¥³¥Þ¥ó¥É¥ê¥¹¥È¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó /
  * Issue a pet command
+ * @return ¤Ê¤·
  */
 void do_cmd_pet(void)
 {
@@ -2286,7 +2426,6 @@ void do_cmd_pet(void)
        int                     powers[36];
        cptr                    power_desc[36];
        bool                    flag, redraw;
-       int                     ask;
        char                    choice;
        char                    out_val[160];
        int                     pet_ctr;
@@ -2294,11 +2433,11 @@ void do_cmd_pet(void)
 
        int mode = 0;
 
-       byte y = 1, x = 0;
-       int ctr = 0;
        char buf[160];
        char target_buf[160];
 
+       int menu_line = use_menu ? 1 : 0;
+
        num = 0;
 
 #ifdef JP
@@ -2321,7 +2460,7 @@ void do_cmd_pet(void)
        powers[num++] = PET_TARGET;
 
 #ifdef JP
-power_desc[num] = "¶á¤¯¤Ë¤¤¤í";
+       power_desc[num] = "¶á¤¯¤Ë¤¤¤í";
 #else
        power_desc[num] = "stay close";
 #endif
@@ -2339,7 +2478,7 @@ power_desc[num] = "
        powers[num++] = PET_FOLLOW_ME;
 
 #ifdef JP
-power_desc[num] = "Ũ¤ò¸«¤Ä¤±¤ÆÅݤ»";
+       power_desc[num] = "Ũ¤ò¸«¤Ä¤±¤ÆÅݤ»";
 #else
        power_desc[num] = "seek and destroy";
 #endif
@@ -2348,7 +2487,7 @@ power_desc[num] = "Ũ
        powers[num++] = PET_SEEK_AND_DESTROY;
 
 #ifdef JP
-power_desc[num] = "¾¯¤·Î¥¤ì¤Æ¤¤¤í";
+       power_desc[num] = "¾¯¤·Î¥¤ì¤Æ¤¤¤í";
 #else
        power_desc[num] = "give me space";
 #endif
@@ -2357,7 +2496,7 @@ power_desc[num] = "
        powers[num++] = PET_ALLOW_SPACE;
 
 #ifdef JP
-power_desc[num] = "Î¥¤ì¤Æ¤¤¤í";
+       power_desc[num] = "Î¥¤ì¤Æ¤¤¤í";
 #else
        power_desc[num] = "stay away";
 #endif
@@ -2372,7 +2511,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "pets open doors (now On)";
 #endif
-
        }
        else
        {
@@ -2381,7 +2519,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "pets open doors (now Off)";
 #endif
-
        }
        powers[num++] = PET_OPEN_DOORS;
 
@@ -2392,7 +2529,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "pets pick up items (now On)";
 #endif
-
        }
        else
        {
@@ -2401,7 +2537,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "pets pick up items (now Off)";
 #endif
-
        }
        powers[num++] = PET_TAKE_ITEMS;
 
@@ -2412,7 +2547,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "allow teleport (now On)";
 #endif
-
        }
        else
        {
@@ -2421,7 +2555,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "allow teleport (now Off)";
 #endif
-
        }
        powers[num++] = PET_TELEPORT;
 
@@ -2432,7 +2565,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "allow cast attack spell (now On)";
 #endif
-
        }
        else
        {
@@ -2441,7 +2573,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "allow cast attack spell (now Off)";
 #endif
-
        }
        powers[num++] = PET_ATTACK_SPELL;
 
@@ -2452,7 +2583,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "allow cast summon spell (now On)";
 #endif
-
        }
        else
        {
@@ -2461,7 +2591,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "allow cast summon spell (now Off)";
 #endif
-
        }
        powers[num++] = PET_SUMMON_SPELL;
 
@@ -2472,7 +2601,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "allow involve player in area spell (now On)";
 #endif
-
        }
        else
        {
@@ -2481,7 +2609,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "allow involve player in area spell (now Off)";
 #endif
-
        }
        powers[num++] = PET_BALL_SPELL;
 
@@ -2492,7 +2619,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "get off a pet";
 #endif
-
        }
        else
        {
@@ -2501,7 +2627,6 @@ power_desc[num] = "Υ
 #else
                power_desc[num] = "ride a pet";
 #endif
-
        }
        powers[num++] = PET_RIDING;
 
@@ -2593,91 +2718,128 @@ power_desc[num] = "Υ
                }
        }
 
+#ifdef ALLOW_REPEAT
+       if (!(repeat_pull(&i) && (i >= 0) && (i < num)))
+       {
+#endif /* ALLOW_REPEAT */
+
        /* Nothing chosen yet */
        flag = FALSE;
 
-       /* Build a prompt (accept all spells) */
-       if (num <= 26)
+       /* No redraw yet */
+       redraw = FALSE;
+
+       if (use_menu)
        {
-               /* Build a prompt (accept all spells) */
+               /* Save the screen */
+               screen_save();
+
+               /* Build a prompt */
 #ifdef JP
-strnfmt(out_val, 78, "(¥³¥Þ¥ó¥É %c-%c¡¢'*'=°ìÍ÷¡¢ESC=½ªÎ») ¥³¥Þ¥ó¥É¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:",
+               strnfmt(out_val, 78, "(¥³¥Þ¥ó¥É¡¢ESC=½ªÎ») ¥³¥Þ¥ó¥É¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:");
 #else
-               strnfmt(out_val, 78, "(Command %c-%c, *=List, ESC=exit) Select a command: ",
+               strnfmt(out_val, 78, "(Command, ESC=exit) Choose command from menu.");
 #endif
-
-                       I2A(0), I2A(num - 1));
        }
        else
        {
+               /* Build a prompt */
+               strnfmt(out_val, 78,
 #ifdef JP
-strnfmt(out_val, 78, "(¥³¥Þ¥ó¥É %c-%c¡¢'*'=°ìÍ÷¡¢ESC=½ªÎ») ¥³¥Þ¥ó¥É¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:",
+                       "(¥³¥Þ¥ó¥É %c-%c¡¢'*'=°ìÍ÷¡¢ESC=½ªÎ») ¥³¥Þ¥ó¥É¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:",
 #else
-               strnfmt(out_val, 78, "(Command %c-%c, *=List, ESC=exit) Select a command: ",
+                       "(Command %c-%c, *=List, ESC=exit) Select a command: ",
 #endif
-
-                       I2A(0), '0' + num - 27);
+                       I2A(0), I2A(num - 1));
        }
 
-       /* Show list */
-       redraw = TRUE;
+       choice = (always_show_list || use_menu) ? ESCAPE : 1;
 
-       /* Save the screen */
-       Term_save();
+       /* Get a command from the user */
+       while (!flag)
+       {
+               int ask = TRUE;
 
-       prt("", y++, x);
+               if (choice == ESCAPE) choice = ' ';
+               else if (!get_com(out_val, &choice, TRUE)) break;
 
-       while (ctr < num)
-       {
-               prt(format("%s%c) %s", (ctr == mode) ? "*" : " ", I2A(ctr), power_desc[ctr]), y + ctr, x);
-               ctr++;
-       }
+               if (use_menu && (choice != ' '))
+               {
+                       switch (choice)
+                       {
+                       case '0':
+                               screen_load();
+                               return;
+
+                       case '8':
+                       case 'k':
+                       case 'K':
+                               menu_line += (num - 1);
+                               break;
 
-       if (ctr < 17)
-       {
-               prt("", y + ctr, x);
-       }
-       else
-       {
-               prt("", y + 17, x);
-       }
+                       case '2':
+                       case 'j':
+                       case 'J':
+                               menu_line++;
+                               break;
+
+                       case '4':
+                       case 'h':
+                       case 'H':
+                               menu_line = 1;
+                               break;
+
+                       case '6':
+                       case 'l':
+                       case 'L':
+                               menu_line = num;
+                               break;
+
+                       case 'x':
+                       case 'X':
+                       case '\r':
+                       case '\n':
+                               i = menu_line - 1;
+                               ask = FALSE;
+                               break;
+                       }
+                       if (menu_line > num) menu_line -= num;
+               }
 
-       /* Get a command from the user */
-       while (!flag && get_com(out_val, &choice, TRUE))
-       {
                /* Request redraw */
-               if ((choice == ' ') || (choice == '*') || (choice == '?'))
+               if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
                {
                        /* Show the list */
-                       if (!redraw)
+                       if (!redraw || use_menu)
                        {
-                               y = 1;
-                               x = 0;
-                               ctr = 0;
+                               byte y = 1, x = 0;
+                               int ctr = 0;
 
                                /* Show list */
                                redraw = TRUE;
 
                                /* Save the screen */
-                               Term_save();
+                               if (!use_menu) screen_save();
 
                                prt("", y++, x);
 
-                               while (ctr < num)
+                               /* Print list */
+                               for (ctr = 0; ctr < num; ctr++)
                                {
-                                       sprintf(buf, "%s%c) %s", (ctr == mode) ? "*" : " ", I2A(ctr), power_desc[ctr]);
+                                       /* Letter/number for power selection */
+#ifdef JP
+                                       if (use_menu) sprintf(buf, "%c%s ", (ctr == mode) ? '*' : ' ', (ctr == (menu_line - 1)) ? "¡Õ" : "  ");
+#else
+                                       if (use_menu) sprintf(buf, "%c%s ", (ctr == mode) ? '*' : ' ', (ctr == (menu_line - 1)) ? "> " : "  ");
+#endif
+                                       else sprintf(buf, "%c%c) ", (ctr == mode) ? '*' : ' ', I2A(ctr));
+
+                                       strcat(buf, power_desc[ctr]);
+
                                        prt(buf, y + ctr, x);
-                                       ctr++;
                                }
 
-                               if (ctr < 17)
-                               {
-                                       prt("", y + ctr, x);
-                               }
-                               else
-                               {
-                                       prt("", y + 17, x);
-                               }
+                               prt("", y + MIN(ctr, 17), x);
                        }
 
                        /* Hide the list */
@@ -2687,14 +2849,14 @@ strnfmt(out_val, 78, "(
                                redraw = FALSE;
 
                                /* Restore the screen */
-                               Term_load();
+                               screen_load();
                        }
 
                        /* Redo asking */
                        continue;
                }
 
-               if (isalpha(choice))
+               if (!use_menu)
                {
                        /* Note verify */
                        ask = (isupper(choice));
@@ -2705,12 +2867,6 @@ strnfmt(out_val, 78, "(
                        /* Extract request */
                        i = (islower(choice) ? A2I(choice) : -1);
                }
-               else
-               {
-                       ask = FALSE; /* Can't uppercase digits */
-
-                       i = choice - '0' + 26;
-               }
 
                /* Totally Illegal */
                if ((i < 0) || (i >= num))
@@ -2729,7 +2885,6 @@ strnfmt(out_val, 78, "(
                        strnfmt(buf, 78, "Use %s? ", power_desc[i]);
 #endif
 
-
                        /* Belay that order */
                        if (!get_check(buf)) continue;
                }
@@ -2739,7 +2894,7 @@ strnfmt(out_val, 78, "(
        }
 
        /* Restore the screen */
-       if (redraw) Term_load();
+       if (redraw) screen_load();
 
        /* Abort if needed */
        if (!flag)
@@ -2748,6 +2903,11 @@ strnfmt(out_val, 78, "(
                return;
        }
 
+#ifdef ALLOW_REPEAT
+       repeat_push(i);
+       }
+#endif /* ALLOW_REPEAT */
+
        switch (powers[i])
        {
                case PET_DISMISS: /* Dismiss pets */