OSDN Git Service

#37287 #37353 (2.2.0.89) 型の置換を継続中。 / Ongoing type replacement.
[hengband/hengband.git] / src / util.c
index d1107f6..8270bad 100644 (file)
@@ -1,4 +1,4 @@
-/* File: util.c */
+/* File: util.c */
 
 /*
  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
@@ -72,13 +72,7 @@ int usleep(huge usecs)
 
 
        /* Paranoia -- No excessive sleeping */
-#ifdef JP
-       if (usecs > 4000000L) core("ÉÔÅö¤Ê usleep() ¸Æ¤Ó½Ð¤·");
-#else
-       if (usecs > 4000000L) core("Illegal usleep() call");
-#endif
-
-
+       if (usecs > 4000000L) core(_("不当な usleep() 呼び出し", "Illegal usleep() call"));
 
        /* Wait for it */
        Timer.tv_sec = (usecs / 1000000L);
@@ -215,7 +209,7 @@ errr path_parse(char *buf, int max, cptr file)
        u = file+1;
 
        /* Look for non-user portion of the file */
-       s = strstr(u, PATH_SEP);
+       s = my_strstr(u, PATH_SEP);
 
        /* Hack -- no long user names */
        if (s && (s >= u + sizeof(user))) return (1);
@@ -293,7 +287,11 @@ static errr path_temp(char *buf, int max)
        if (!s) return (-1);
 
        /* Format to length */
+#if !defined(WIN32) || (defined(_MSC_VER) && (_MSC_VER >= 1900))
        (void)strnfmt(buf, max, "%s", s);
+#else
+       (void)strnfmt(buf, max, ".%s", s);
+#endif
 
        /* Success */
        return (0);
@@ -356,19 +354,19 @@ FILE *my_fopen(cptr file, cptr mode)
 {
        char buf[1024];
 
-#if defined(MACINTOSH) && defined(MAC_MPW)
+#if defined(MAC_MPW) || defined(MACH_O_CARBON)
        FILE *tempfff;
 #endif
 
        /* Hack -- Try to parse the path */
        if (path_parse(buf, 1024, file)) return (NULL);
 
-#if defined(MACINTOSH) && defined(MAC_MPW)
-       if (strchr(mode, 'w'))
+#if defined(MAC_MPW) || defined(MACH_O_CARBON)
+       if (my_strchr(mode, 'w'))
        {
                /* setting file type/creator */
                tempfff = fopen(buf, mode);
-               fsetfileinfo(file, _fcreator, _ftype);
+               fsetfileinfo(buf, _fcreator, _ftype);
                fclose(tempfff);
        }
 #endif
@@ -448,6 +446,10 @@ errr my_fgets(FILE *fff, char *buf, huge n)
        /* Read a line */
        if (fgets(tmp, 1024, fff))
        {
+#ifdef JP
+               guess_convert_to_system_encoding(tmp, sizeof(tmp));
+#endif
+
                /* Convert weirdness */
                for (s = tmp; *s; s++)
                {
@@ -493,7 +495,7 @@ errr my_fgets(FILE *fff, char *buf, huge n)
                                buf[i++] = *s;
                        }
 
-                       /* È¾³Ñ¤«¤Ê¤ËÂбþ */
+                       /* 半角かなに対応 */
                        else if (iskana(*s))
                        {
                                buf[i++] = *s;
@@ -501,7 +503,7 @@ errr my_fgets(FILE *fff, char *buf, huge n)
                        }
 #endif
                        /* Handle printables */
-                       else if (isprint(*s))
+                       else if (isprint((unsigned char)*s))
                        {
                                /* Copy */
                                buf[i++] = *s;
@@ -657,7 +659,19 @@ errr fd_copy(cptr file, cptr what)
        /* Copy */
        while ((read_num = read(src_fd, buf, 1024)) > 0)
        {
-               write(dst_fd, buf, read_num);
+               int write_num = 0;
+               while (write_num < read_num)
+               {
+                       int ret = write(dst_fd, buf + write_num, read_num - write_num);
+                       if (ret < 0) {
+                               /* Close files */
+                               fd_close(src_fd);
+                               fd_close(dst_fd);
+
+                               return ret;
+                       }
+                       write_num += ret;
+               }
        }
 
        /* Close files */
@@ -682,7 +696,7 @@ errr fd_copy(cptr file, cptr what)
  * of "O_RDONLY", "O_WRONLY", and "O_RDWR" in "A-win-h", and then
  * we must simulate the effect of the proper "open()" call below.
  */
-int fd_make(cptr file, int mode)
+int fd_make(cptr file, BIT_FLAGS mode)
 {
        char buf[1024];
 
@@ -702,16 +716,16 @@ int fd_make(cptr file, int mode)
 
 #else /* BEN_HACK */
 
-# if defined(MACINTOSH) && defined(MAC_MPW)
-
-       /* setting file type and creator -- AR */
+#if defined(MAC_MPW) || defined(MACH_O_CARBON)
        {
-               errr errr_tmp;
-               errr_tmp = open(buf, O_CREAT | O_EXCL | O_WRONLY | O_BINARY, mode);
-               fsetfileinfo(file, _fcreator, _ftype);
-               return(errr_tmp);
+               int fdes;
+               /* Create the file, fail if exists, write-only, binary */
+               fdes = open(buf, O_CREAT | O_EXCL | O_WRONLY | O_BINARY, mode);
+               /* Set creator and type if the file is successfully opened */
+               if (fdes >= 0) fsetfileinfo(buf, _fcreator, _ftype);
+               /* Return the descriptor */
+               return (fdes);
        }
-
 # else
        /* Create the file, fail if exists, write-only, binary */
        return (open(buf, O_CREAT | O_EXCL | O_WRONLY | O_BINARY, mode));
@@ -835,7 +849,7 @@ errr fd_chop(int fd, huge n)
        /* Verify the fd */
        if (fd < 0) return (-1);
 
-#if defined(SUNOS) || defined(ULTRIX) || defined(NeXT)
+#if defined(ULTRIX) || defined(NeXT)
        /* Truncate */
        ftruncate(fd, n);
 #endif
@@ -1106,7 +1120,7 @@ static void trigger_text_to_ascii(char **bufptr, cptr *strptr)
        /* Invalid trigger name? */
        if (i == max_macrotrigger)
        {
-               str = strchr(str, ']');
+               str = my_strchr(str, ']');
                if (str)
                {
                        *s++ = (char)31;
@@ -1183,8 +1197,8 @@ void text_to_ascii(char *buf, cptr str)
                        /* Hex-mode XXX */
                        if (*str == 'x')
                        {
-                               *s = 16 * dehex(*++str);
-                               *s++ += dehex(*++str);
+                               *s = 16 * (char)dehex(*++str);
+                               *s++ += (char)dehex(*++str);
                        }
 
                        /* Hack -- simple way to specify "backslash" */
@@ -1238,29 +1252,29 @@ void text_to_ascii(char *buf, cptr str)
                        /* Octal-mode */
                        else if (*str == '0')
                        {
-                               *s = 8 * deoct(*++str);
-                               *s++ += deoct(*++str);
+                               *s = 8 * (char)deoct(*++str);
+                               *s++ += (char)deoct(*++str);
                        }
 
                        /* Octal-mode */
                        else if (*str == '1')
                        {
-                               *s = 64 + 8 * deoct(*++str);
-                               *s++ += deoct(*++str);
+                               *s = 64 + 8 * (char)deoct(*++str);
+                               *s++ += (char)deoct(*++str);
                        }
 
                        /* Octal-mode */
                        else if (*str == '2')
                        {
-                               *s = 64 * 2 + 8 * deoct(*++str);
-                               *s++ += deoct(*++str);
+                               *s = 64 * 2 + 8 * (char)deoct(*++str);
+                               *s++ += (char)deoct(*++str);
                        }
 
                        /* Octal-mode */
                        else if (*str == '3')
                        {
-                               *s = 64 * 3 + 8 * deoct(*++str);
-                               *s++ += deoct(*++str);
+                               *s = 64 * 3 + 8 * (char)deoct(*++str);
+                               *s++ += (char)deoct(*++str);
                        }
 
                        /* Skip the final char */
@@ -1308,7 +1322,7 @@ static bool trigger_ascii_to_text(char **bufptr, cptr *strptr)
                switch(ch)
                {
                case '&':
-                       while ((tmp = strchr(macro_modifier_chr, *str)))
+                       while ((tmp = my_strchr(macro_modifier_chr, *str)) != 0)
                        {
                                j = (int)(tmp - macro_modifier_chr);
                                tmp = macro_modifier_name[j];
@@ -1692,6 +1706,109 @@ void sound(int val)
        Term_xtra(TERM_XTRA_SOUND, val);
 }
 
+/*
+ * Hack -- Play a music
+ */
+errr play_music(int type, int val)
+{
+       /* No sound */
+       if (!use_music) return 1;
+
+       /* Make a sound (if allowed) */
+       return Term_xtra(type, val);
+}
+
+/*
+ * Hack -- Select floor music.
+ */
+void select_floor_music(void)
+{
+       int i;
+       /* No sound */
+       if (!use_music) return;
+
+       if(ambush_flag)
+       {
+               play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_AMBUSH);
+               return;
+       }
+
+       if(p_ptr->wild_mode)
+       {
+               play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_WILD);
+               return;
+       }
+
+       if(p_ptr->inside_arena)
+       {
+               play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_ARENA);
+               return;
+       }
+
+       if(p_ptr->inside_battle)
+       {
+               play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_BATTLE);
+               return;
+       }
+
+       if(p_ptr->inside_quest)
+       {
+               if(play_music(TERM_XTRA_MUSIC_QUEST, p_ptr->inside_quest))
+               {
+                       play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST);
+               }
+               return;
+       }
+
+       for(i = 0; i < max_quests; i++)
+       { // TODO マクロで類似条件を統合すること
+               if(quest[i].status == QUEST_STATUS_TAKEN &&
+                       (quest[i].type == QUEST_TYPE_KILL_LEVEL || quest[i].type == QUEST_TYPE_RANDOM) &&
+                        quest[i].level == dun_level && dungeon_type == quest[i].dungeon)
+               {
+                       if(play_music(TERM_XTRA_MUSIC_QUEST, i)) 
+                       {
+                               play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST);
+                       }
+                       return;
+               }
+       }
+
+       if(dungeon_type)
+       {
+               if(p_ptr->feeling == 2) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL2);
+               else if(p_ptr->feeling >= 3 && p_ptr->feeling <= 5) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL1);
+               else
+               {
+                       if(play_music(TERM_XTRA_MUSIC_DUNGEON, dungeon_type))
+                       {
+                               if(dun_level < 40) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_LOW);
+                               else if(dun_level < 80) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_MED);
+                               else play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_HIGH);
+                       }
+               }
+               return;
+       }
+
+       if(p_ptr->town_num)
+       {
+               if(play_music(TERM_XTRA_MUSIC_TOWN, p_ptr->town_num))
+               {
+                       play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_TOWN);
+               }
+               return;
+       }
+
+       if(!dun_level)
+       {
+               if(p_ptr->lev >= 45) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD3);
+               else if(p_ptr->lev >= 25) play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD2);
+               else play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD1);
+               return;
+       }
+       
+}
+
 
 
 /*
@@ -1721,7 +1838,7 @@ static char inkey_aux(void)
 
        char *buf = inkey_macro_trigger_string;
 
-       /* Hack : ¥­¡¼ÆþÎÏÂÔ¤Á¤Ç»ß¤Þ¤Ã¤Æ¤¤¤ë¤Î¤Ç¡¢Î®¤ì¤¿¹Ô¤Îµ­²±¤ÏÉÔÍס£ */
+       /* Hack : キー入力待ちで止まっているので、流れた行の記憶は不要。 */
        num_more = 0;
 
        if (parse_macro)
@@ -1788,10 +1905,10 @@ static char inkey_aux(void)
                else
                {
                        /* Increase "wait" */
-                       w += 10;
+                       w += 1;
 
                        /* Excessive delay */
-                       if (w >= 100) break;
+                       if (w >= 10) break;
 
                        /* Delay */
                        Term_xtra(TERM_XTRA_DELAY, w);
@@ -1861,6 +1978,33 @@ static char inkey_aux(void)
 
 
 /*
+ * Cancel macro action on the queue
+ */
+static void forget_macro_action(void)
+{
+       if (!parse_macro) return;
+
+       /* Drop following macro action string */
+       while (TRUE)
+       {
+               char ch;
+
+               /* End loop if no key ready */
+               if (Term_inkey(&ch, FALSE, TRUE)) break;
+
+               /* End loop if no key ready */
+               if (ch == 0) break;
+
+               /* End of "macro action" */
+               if (ch == 30) break;
+       }
+
+       /* No longer inside "macro action" */
+       parse_macro = FALSE;
+}
+
+
+/*
  * Mega-Hack -- special "inkey_next" pointer.  XXX XXX XXX
  *
  * This special pointer allows a sequence of keys to be "inserted" into
@@ -2189,11 +2333,27 @@ char inkey(void)
  */
 
 /*
+ * Initialize the quark array
+ */
+void quark_init(void)
+{
+       /* Quark variables */
+       C_MAKE(quark__str, QUARK_MAX, cptr);
+
+       /* Prepare first quark, which is used when quark_add() is failed */
+       quark__str[1] = string_make("");
+
+       /* There is one quark (+ NULL) */
+       quark__num = 2;
+}
+
+
+/*
  * Add a new "quark" to the set of quarks.
  */
-s16b quark_add(cptr str)
+u16b quark_add(cptr str)
 {
-       int i;
+       u16b i;
 
        /* Look for an existing quark */
        for (i = 1; i < quark__num; i++)
@@ -2202,8 +2362,8 @@ s16b quark_add(cptr str)
                if (streq(quark__str[i], str)) return (i);
        }
 
-       /* Paranoia -- Require room */
-       if (quark__num == QUARK_MAX) return (0);
+       /* Return "" when no room is available */
+       if (quark__num == QUARK_MAX) return 1;
 
        /* New maximal quark */
        quark__num = i + 1;
@@ -2219,12 +2379,12 @@ s16b quark_add(cptr str)
 /*
  * This function looks up a quark
  */
-cptr quark_str(s16b i)
+cptr quark_str(STR_OFFSET i)
 {
        cptr q;
 
-       /* Verify */
-       if ((i < 0) || (i >= quark__num)) i = 0;
+       /* Return NULL for an invalid index */
+       if ((i < 1) || (i >= quark__num)) return NULL;
 
        /* Access the quark */
        q = quark__str[i];
@@ -2259,10 +2419,11 @@ cptr quark_str(s16b i)
 
 
 
-/*
- * How many messages are "available"?
+/*!
+ * @brief 保存中の過去ゲームメッセージの数を返す。 / How many messages are "available"?
+ * @return 残っているメッセージの数
  */
-s16b message_num(void)
+s32b message_num(void)
 {
        int last, next, n;
 
@@ -2281,14 +2442,15 @@ s16b message_num(void)
 }
 
 
-
-/*
- * Recall the "text" of a saved message
+/*!
+ * @brief 過去のゲームメッセージを返す。 / Recall the "text" of a saved message
+ * @params age メッセージの世代
+ * @return メッセージの文字列ポインタ
  */
 cptr message_str(int age)
 {
-       s16b x;
-       s16b o;
+       s32b x;
+       s32b o;
        cptr s;
 
        /* Forgotten messages have no text */
@@ -2308,15 +2470,17 @@ cptr message_str(int age)
 }
 
 
-
-/*
- * Add a new message, with great efficiency
+/*!
+ * @brief ゲームメッセージをログに追加する。 / Add a new message, with great efficiency
+ * @params str 保存したいメッセージ
+ * @return なし
  */
 void message_add(cptr str)
 {
-       int i, k, x, m, n;
+       u32b i, n;
+       int k, x, m;
 
-       char u[1024];
+       char u[4096];
        char splitted1[81];
        cptr splitted2;
 
@@ -2331,39 +2495,37 @@ void message_add(cptr str)
        /* Important Hack -- Ignore "long" messages */
        if (n >= MESSAGE_BUF / 4) return;
 
-       /* extra step -- split the message if n>80.   (added by Mogami) */
+       /* extra step -- split the message if n>80.(added by Mogami) */
        if (n > 80) {
 #ifdef JP
-         cptr t = str;
-
-         for (n = 0; n < 80; n++, t++)
-           if(iskanji(*t)) {
-             t++;
-             n++;
-           }
-         if (n == 81) n = 79; /* ºÇ¸å¤Îʸ»ú¤¬´Á»úȾʬ */
+               cptr t = str;
+
+               for (n = 0; n < 80; n++, t++)
+               {
+                       if(iskanji(*t)) {
+                               t++;
+                               n++;
+                       }
+               }
+               if (n == 81) n = 79; /* 最後の文字が漢字半分 */
 #else
-         for (n = 80; n > 60; n--)
-                 if (str[n] == ' ') break;
-         if (n == 60)
-                 n = 80;
+               for (n = 80; n > 60; n--)
+                       if (str[n] == ' ') break;
+               if (n == 60) n = 80;
 #endif
-         splitted2 = str + n;
-         strncpy(splitted1, str ,n);
-         splitted1[n] = '\0';
-         str = splitted1;
+               splitted2 = str + n;
+               strncpy(splitted1, str ,n);
+               splitted1[n] = '\0';
+               str = splitted1;
        } else {
-         splitted2 = NULL;
+               splitted2 = NULL;
        }
 
-       /*** Step 2 -- Attempt to optimize ***/
+       /*** Step 2 -- 最適化の試行 / Attempt to optimize ***/
 
        /* Limit number of messages to check */
        m = message_num();
-
        k = m / 4;
-
-       /* Limit number of messages to check */
        if (k > MESSAGE_MAX / 32) k = MESSAGE_MAX / 32;
 
        /* Check previous message */
@@ -2389,8 +2551,8 @@ void message_add(cptr str)
 
                /* Find multiple */
 #ifdef JP
- for (t = buf; *t && (*t != '<' || (*(t+1) != 'x' )); t++) 
-     if( iskanji(*t))t++;
              for (t = buf; *t && (*t != '<' || (*(t+1) != 'x' )); t++) 
+                       if(iskanji(*t))t++;
 #else
                for (t = buf; *t && (*t != '<'); t++);
 #endif
@@ -2408,7 +2570,7 @@ void message_add(cptr str)
                }
 
                /* Limit the multiplier to 1000 */
-               if (buf && streq(buf, str) && (j < 1000))
+               if (streq(buf, str) && (j < 1000))
                {
                        j++;
 
@@ -2427,7 +2589,7 @@ void message_add(cptr str)
                }
                else
                {
-                       num_more++;/*ή¤ì¤¿¹Ô¤Î¿ô¤ò¿ô¤¨¤Æ¤ª¤¯ */
+                       num_more++;/*流れた行の数を数えておく */
                        now_message++;
                }
 
@@ -2438,8 +2600,7 @@ void message_add(cptr str)
        /* Check the last few messages (if any to count) */
        for (i = message__next; k; k--)
        {
-               u16b q;
-
+               int q;
                cptr old;
 
                /* Back up and wrap if needed */
@@ -2578,7 +2739,7 @@ void message_add(cptr str)
        message__head += n + 1;
 
        /* recursively add splitted message (added by Mogami) */
- end_of_message_add:
+end_of_message_add:
        if (splitted2 != NULL)
          message_add(splitted2);
 }
@@ -2613,25 +2774,20 @@ static void msg_flush(int x)
        if (!p_ptr->playing || !nagasu)
        {
                /* Pause for response */
-#ifdef JP
-               Term_putstr(x, 0, -1, a, "-³¤¯-");
-#else
-               Term_putstr(x, 0, -1, a, "-more-");
-#endif
-
+               Term_putstr(x, 0, -1, a, _("-続く-", "-more-"));
 
                /* Get an acceptable keypress */
                while (1)
                {
                        int cmd = inkey();
                        if (cmd == ESCAPE) {
-                           num_more = -9999; /*auto_more¤Î¤È¤­¡¢Á´¤Æή¤¹¡£ */
+                           num_more = -9999; /*auto_moreのとき、全て流す。 */
                            break;
                        } else if (cmd == ' ') {
-                           num_more = 0; /*£±²èÌ̤À¤±Î®¤¹¡£ */
+                           num_more = 0; /*1画面だけ流す。 */
                            break;
                        } else if ((cmd == '\n') || (cmd == '\r')) {
-                           num_more--; /*£±¹Ô¤À¤±Î®¤¹¡£ */
+                           num_more--; /*1行だけ流す。 */
                            break;
                        }
                        if (quick_messages) break;
@@ -2672,11 +2828,8 @@ static void msg_flush(int x)
 void msg_print(cptr msg)
 {
        static int p = 0;
-
        int n;
-
        char *t;
-
        char buf[1024];
 
        if (world_monster) return;
@@ -2688,7 +2841,7 @@ void msg_print(cptr msg)
                p = 0;
        }
 
-       /* Message Length */
+       /* Original Message Length */
        n = (msg ? strlen(msg) : 0);
 
        /* Hack -- flush when requested or needed */
@@ -2704,20 +2857,27 @@ void msg_print(cptr msg)
                p = 0;
        }
 
-
        /* No message */
        if (!msg) return;
 
        /* Paranoia */
        if (n > 1000) return;
 
+       /* Copy it */
+       if (!cheat_turn)
+       {
+               strcpy(buf, msg);
+       }
+       else
+       {
+               sprintf(buf, ("T:%d - %s"), (int)turn, msg);
+       }
 
-       /* Memorize the message */
-       if (character_generated) message_add(msg);
-
+       /* New Message Length */
+       n = (buf ? strlen(buf) : 0);
 
-       /* Copy it */
-       strcpy(buf, msg);
+       /* Memorize the message */
+       if (character_generated) message_add(buf);
 
        /* Analyze the buffer */
        t = buf;
@@ -2793,7 +2953,6 @@ void msg_print(cptr msg)
                t += split; n -= split;
        }
 
-
        /* Display the tail of the message */
        Term_putstr(p, 0, n, TERM_WHITE, t);
 
@@ -2814,11 +2973,28 @@ void msg_print(cptr msg)
        p += n + 1;
 #endif
 
-
        /* Optional refresh */
        if (fresh_message) Term_fresh();
 }
 
+void msg_print_wizard(int cheat_type, cptr msg)
+{
+       if (!cheat_room && cheat_type == CHEAT_DUNGEON) return;
+       if (!cheat_peek && cheat_type == CHEAT_OBJECT) return;
+       if (!cheat_hear && cheat_type == CHEAT_MONSTER) return;
+       if (!cheat_xtra && cheat_type == CHEAT_MISC) return;
+
+       cptr cheat_mes[] = {"ITEM", "MONS", "DUNG", "MISC"};
+       char buf[1024];
+       sprintf(buf, "WIZ-%s:%s", cheat_mes[cheat_type], msg);
+       msg_print(buf);
+
+       if (cheat_diary_output)
+       {
+               do_cmd_write_nikki(NIKKI_WIZARD_LOG, 0, buf);
+       }
+
+}
 
 /*
  * Hack -- prevent "accidents" in "screen_save()" or "screen_load()"
@@ -2884,6 +3060,32 @@ void msg_format(cptr fmt, ...)
        msg_print(buf);
 }
 
+/*
+ * Display a formatted message, using "vstrnfmt()" and "msg_print()".
+ */
+void msg_format_wizard(int cheat_type, cptr fmt, ...)
+{
+       if(!cheat_room && cheat_type == CHEAT_DUNGEON) return;
+       if(!cheat_peek && cheat_type == CHEAT_OBJECT) return;
+       if(!cheat_hear && cheat_type == CHEAT_MONSTER) return;
+       if(!cheat_xtra && cheat_type == CHEAT_MISC) return;
+
+       va_list vp;
+       char buf[1024];
+
+       /* Begin the Varargs Stuff */
+       va_start(vp, fmt);
+
+       /* Format the args, save the length */
+       (void)vstrnfmt(buf, 1024, fmt, vp);
+
+       /* End the Varargs Stuff */
+       va_end(vp);
+
+       /* Display */
+       msg_print_wizard(cheat_type, buf);
+}
+
 
 
 /*
@@ -2991,7 +3193,7 @@ void c_roff(byte a, cptr str)
 
                /* Clean up the char */
 #ifdef JP
-               ch = ((isprint(*s) || k_flag) ? *s : ' ');
+               ch = ((k_flag || isprint(*s)) ? *s : ' ');
 #else
                ch = (isprint(*s) ? *s : ' ');
 #endif
@@ -3014,7 +3216,7 @@ void c_roff(byte a, cptr str)
                        if (x < w)
 #ifdef JP
                        {
-                       /* ¸½ºß¤¬È¾³Ñʸ»ú¤Î¾ì¹ç */
+                       /* 現在が半角文字の場合 */
                        if( !k_flag )
 #endif
                        {
@@ -3038,11 +3240,11 @@ void c_roff(byte a, cptr str)
 #ifdef JP
                        else
                        {
-                               /* ¸½ºß¤¬Á´³Ñʸ»ú¤Î¤È¤­ */
-                               /* Ê¸Æ¬¤¬¡Ö¡£¡×¡Ö¡¢¡×Åù¤Ë¤Ê¤ë¤È¤­¤Ï¡¢¤½¤Î£±¤ÄÁ°¤Î¸ì¤Ç²þ¹Ô */
-                               if (strncmp(s, "¡£", 2) == 0 || strncmp(s, "¡¢", 2) == 0
-#if 0                   /* °ìÈÌŪ¤Ë¤Ï¡Ö¥£¡×¡Ö¡¼¡×¤Ï¶Ø§¤ÎÂоݳ° */
-                                       || strncmp(s, "¥£", 2) == 0 || strncmp(s, "¡¼", 2) == 0
+                               /* 現在が全角文字のとき */
+                               /* 文頭が「。」「、」等になるときは、その1つ前の語で改行 */
+                               if (strncmp(s, "。", 2) == 0 || strncmp(s, "、", 2) == 0
+#if 0                   /* 一般的には「ィ」「ー」は禁則の対象外 */
+                                       || strncmp(s, "ã\82£", 2) == 0 || strncmp(s, "ã\83¼", 2) == 0
 #endif
                               ){
                                        Term_what(x  , y, &av[x  ], &cv[x  ]);
@@ -3153,7 +3355,7 @@ void clear_from(int row)
  * ESCAPE clears the buffer and the window and returns FALSE.
  * RETURN accepts the current buffer contents and returns TRUE.
  */
-bool askfor_aux(char *buf, int len)
+bool askfor_aux(char *buf, int len, bool numpad_cursor)
 {
        int y, x;
        int pos = 0;
@@ -3194,7 +3396,7 @@ bool askfor_aux(char *buf, int len)
                Term_gotoxy(x + pos, y);
 
                /* Get a special key code */
-               skey = inkey_special(FALSE);
+               skey = inkey_special(numpad_cursor);
 
                /* Analyze the key */
                switch (skey)
@@ -3207,7 +3409,7 @@ bool askfor_aux(char *buf, int len)
                        /* Now on insert mode */
                        color = TERM_WHITE;
 
-                       /* No move at biggining of line */
+                       /* No move at beginning of line */
                        if (0 == pos) break;
 
                        while (TRUE)
@@ -3267,7 +3469,7 @@ bool askfor_aux(char *buf, int len)
                        /* Now on insert mode */
                        color = TERM_WHITE;
 
-                       /* No move at biggining of line */
+                       /* No move at beginning of line */
                        if (0 == pos) break;
 
                        while (TRUE)
@@ -3300,6 +3502,9 @@ bool askfor_aux(char *buf, int len)
                        /* Now on insert mode */
                        color = TERM_WHITE;
 
+                       /* No move at end of line */
+                       if ('\0' == buf[pos]) break;
+
                        /* Position of next character */
                        src = pos + 1;
 
@@ -3393,6 +3598,17 @@ bool askfor_aux(char *buf, int len)
 
 
 /*
+ * Get some string input at the cursor location.
+ *
+ * Allow to use numpad keys as cursor keys.
+ */
+bool askfor(char *buf, int len)
+{
+       return askfor_aux(buf, len, TRUE);
+}
+
+
+/*
  * Get a string from the user
  *
  * The "prompt" should take the form "Prompt: "
@@ -3413,7 +3629,7 @@ bool get_string(cptr prompt, char *buf, int len)
        prt(prompt, 0, 0);
 
        /* Ask the user for a string */
-       res = askfor_aux(buf, len);
+       res = askfor(buf, len);
 
        /* Clear prompt */
        prt("", 0, 0);
@@ -3443,7 +3659,7 @@ bool get_check(cptr prompt)
  * mode & CHECK_NO_HISTORY  : no message_add
  * mode & CHECK_DEFAULT_Y   : accept any key as y, except n and Esc.
  */
-bool get_check_strict(cptr prompt, int mode)
+bool get_check_strict(cptr prompt, BIT_FLAGS mode)
 {
        int i;
        char buf[80];
@@ -3565,7 +3781,10 @@ bool get_com(cptr prompt, char *command, bool z_escape)
        prt(prompt, 0, 0);
 
        /* Get a key */
-       *command = inkey();
+       if (get_com_no_macros)
+               *command = inkey_special(FALSE);
+       else
+               *command = inkey();
 
        /* Clear the prompt */
        prt("", 0, 0);
@@ -3584,13 +3803,13 @@ bool get_com(cptr prompt, char *command, bool z_escape)
  *
  * Hack -- allow "command_arg" to specify a quantity
  */
-s16b get_quantity(cptr prompt, int max)
+QUANTITY get_quantity(cptr prompt, QUANTITY max)
 {
-       int amt;
-
+       bool res, result;
+       QUANTITY amt;
        char tmp[80];
-
        char buf[80];
+       COMMAND_CODE code;
 
 
        /* Use "command_arg" */
@@ -3612,7 +3831,9 @@ s16b get_quantity(cptr prompt, int max)
 #ifdef ALLOW_REPEAT /* TNB */
 
        /* Get the item index */
-       if ((max != 1) && repeat_pull(&amt))
+       result = repeat_pull(&code);
+       amt = (QUANTITY)code;
+       if ((max != 1) && result)
        {
                /* Enforce the maximum */
                if (amt > max) amt = max;
@@ -3630,17 +3851,17 @@ s16b get_quantity(cptr prompt, int max)
        if (!prompt)
        {
                /* Build a prompt */
-#ifdef JP
-                       sprintf(tmp, "¤¤¤¯¤Ä¤Ç¤¹¤« (1-%d): ", max);
-#else
-               sprintf(tmp, "Quantity (1-%d): ", max);
-#endif
-
+               sprintf(tmp, _("いくつですか (1-%d): ", "Quantity (1-%d): "), max);
 
                /* Use that prompt */
                prompt = tmp;
        }
 
+       /* Paranoia XXX XXX XXX */
+       msg_print(NULL);
+
+       /* Display prompt */
+       prt(prompt, 0, 0);
 
        /* Default to one */
        amt = 1;
@@ -3648,11 +3869,20 @@ s16b get_quantity(cptr prompt, int max)
        /* Build the default */
        sprintf(buf, "%d", amt);
 
-       /* Ask for a quantity */
-       if (!get_string(prompt, buf, 6)) return (0);
+       /*
+        * Ask for a quantity
+        * Don't allow to use numpad as cursor key.
+        */
+       res = askfor_aux(buf, 6, FALSE);
+
+       /* Clear prompt */
+       prt("", 0, 0);
+
+       /* Cancelled */
+       if (!res) return 0;
 
        /* Extract a number */
-       amt = atoi(buf);
+       amt = (COMMAND_CODE)atoi(buf);
 
        /* A letter means "all" */
        if (isalpha(buf[0])) amt = max;
@@ -3665,7 +3895,7 @@ s16b get_quantity(cptr prompt, int max)
 
 #ifdef ALLOW_REPEAT /* TNB */
 
-       if (amt) repeat_push(amt);
+       if (amt) repeat_push((COMMAND_CODE)amt);
 
 #endif /* ALLOW_REPEAT -- TNB */
 
@@ -3680,11 +3910,7 @@ s16b get_quantity(cptr prompt, int max)
 void pause_line(int row)
 {
        prt("", row, 0);
-#ifdef JP
-       put_str("[ ²¿¤«¥­¡¼¤ò²¡¤·¤Æ²¼¤µ¤¤ ]", row, 26);
-#else
-       put_str("[Press any key to continue]", row, 23);
-#endif
+       put_str(_("[ 何かキーを押して下さい ]", "[Press any key to continue]"), row, _(26, 23));
 
        (void)inkey();
        prt("", row, 0);
@@ -3709,23 +3935,23 @@ typedef struct
 menu_naiyou menu_info[10][10] =
 {
        {
-               {"ËâË¡/ÆüìǽÎÏ", 1, FALSE},
-               {"¹ÔÆ°", 2, FALSE},
-               {"Æ»¶ñ(»ÈÍÑ)", 3, FALSE},
-               {"Æ»¶ñ(¤½¤Î¾)", 4, FALSE},
-               {"ÁõÈ÷", 5, FALSE},
-               {"Èâ/È¢", 6, FALSE},
-               {"¾ðÊó", 7, FALSE},
-               {"ÀßÄê", 8, FALSE},
-               {"¤½¤Î¾", 9, FALSE},
+               {"魔法/特殊能力", 1, FALSE},
+               {"行動", 2, FALSE},
+               {"道具(使用)", 3, FALSE},
+               {"道具(その他)", 4, FALSE},
+               {"装備", 5, FALSE},
+               {"扉/箱", 6, FALSE},
+               {"情報", 7, FALSE},
+               {"設定", 8, FALSE},
+               {"その他", 9, FALSE},
                {"", 0, FALSE},
        },
 
        {
-               {"»È¤¦(m)", 'm', TRUE},
-               {"Ä´¤Ù¤ë(b/P)", 'b', TRUE},
-               {"³Ð¤¨¤ë(G)", 'G', TRUE},
-               {"ÆüìǽÎϤò»È¤¦(U/O)", 'U', TRUE},
+               {"使う(m)", 'm', TRUE},
+               {"調べる(b/P)", 'b', TRUE},
+               {"覚える(G)", 'G', TRUE},
+               {"特殊能力を使う(U/O)", 'U', TRUE},
                {"", 0, FALSE},
                {"", 0, FALSE},
                {"", 0, FALSE},
@@ -3735,49 +3961,49 @@ menu_naiyou menu_info[10][10] =
        },
 
        {
-               {"µÙ©¤¹¤ë(R)", 'R', TRUE},
-               {"¥È¥é¥Ã¥×²ò½ü(D)", 'D', TRUE},
-               {"õ¤¹(s)", 's', TRUE},
-               {"¼þ¤ê¤òÄ´¤Ù¤ë(l/x)", 'l', TRUE},
-               {"¥¿¡¼¥²¥Ã¥È»ØÄê(*)", '*', TRUE},
-               {"·ê¤ò·¡¤ë(T/^t)", 'T', TRUE},
-               {"³¬Ãʤò¾å¤ë(<)", '<', TRUE},
-               {"³¬Ãʤò²¼¤ê¤ë(>)", '>', TRUE},
-               {"¥Ú¥Ã¥È¤ËÌ¿Î᤹¤ë(p)", 'p', TRUE},
-               {"õº÷¥â¡¼¥É¤ÎON/OFF(S/#)", 'S', TRUE}
+               {"休息する(R)", 'R', TRUE},
+               {"トラップ解除(D)", 'D', TRUE},
+               {"探す(s)", 's', TRUE},
+               {"周りを調べる(l/x)", 'l', TRUE},
+               {"ターゲット指定(*)", '*', TRUE},
+               {"穴を掘る(T/^t)", 'T', TRUE},
+               {"階段を上る(<)", '<', TRUE},
+               {"階段を下りる(>)", '>', TRUE},
+               {"ペットに命令する(p)", 'p', TRUE},
+               {"探索モードのON/OFF(S/#)", 'S', TRUE}
        },
 
        {
-               {"Æɤà(r)", 'r', TRUE},
-               {"°û¤à(q)", 'q', TRUE},
-               {"¾ó¤ò»È¤¦(u/Z)", 'u', TRUE},
-               {"ËâË¡ËÀ¤ÇÁÀ¤¦(a/z)", 'a', TRUE},
-               {"¥í¥Ã¥É¤ò¿¶¤ë(z/a)", 'z', TRUE},
-               {"»ÏÆ°¤¹¤ë(A)", 'A', TRUE},
-               {"¿©¤Ù¤ë(E)", 'E', TRUE},
-               {"Èô¤ÓÆ»¶ñ¤Ç·â¤Ä(f/t)", 'f', TRUE},
-               {"Åꤲ¤ë(v)", 'v', TRUE},
+               {"読む(r)", 'r', TRUE},
+               {"飲む(q)", 'q', TRUE},
+               {"杖を使う(u/Z)", 'u', TRUE},
+               {"魔法棒で狙う(a/z)", 'a', TRUE},
+               {"ロッドを振る(z/a)", 'z', TRUE},
+               {"始動する(A)", 'A', TRUE},
+               {"食べる(E)", 'E', TRUE},
+               {"飛び道具で撃つ(f/t)", 'f', TRUE},
+               {"投げる(v)", 'v', TRUE},
                {"", 0, FALSE}
        },
 
        {
-               {"½¦¤¦(g)", 'g', TRUE},
-               {"Íî¤È¤¹(d)", 'd', TRUE},
-               {"²õ¤¹(k/^d)", 'k', TRUE},
-               {"Ìäò¹ï¤à({)", '{', TRUE},
-               {"Ìäò¾Ã¤¹(})", '}', TRUE},
-               {"Ä´ºº(I)", 'I', TRUE},
-               {"¥¢¥¤¥Æ¥à°ìÍ÷(i)", 'i', TRUE},
+               {"拾う(g)", 'g', TRUE},
+               {"落とす(d)", 'd', TRUE},
+               {"壊す(k/^d)", 'k', TRUE},
+               {"銘を刻む({)", '{', TRUE},
+               {"銘を消す(})", '}', TRUE},
+               {"調査(I)", 'I', TRUE},
+               {"アイテム一覧(i)", 'i', TRUE},
                {"", 0, FALSE},
                {"", 0, FALSE},
                {"", 0, FALSE}
        },
 
        {
-               {"ÁõÈ÷¤¹¤ë(w)", 'w', TRUE},
-               {"ÁõÈ÷¤ò³°¤¹(t/T)", 't', TRUE},
-               {"dzÎÁ¤òÊäµë(F)", 'F', TRUE},
-               {"ÁõÈ÷°ìÍ÷(e)", 'e', TRUE},
+               {"装備する(w)", 'w', TRUE},
+               {"装備を外す(t/T)", 't', TRUE},
+               {"燃料を補給(F)", 'F', TRUE},
+               {"装備一覧(e)", 'e', TRUE},
                {"", 0, FALSE},
                {"", 0, FALSE},
                {"", 0, FALSE},
@@ -3787,10 +4013,10 @@ menu_naiyou menu_info[10][10] =
        },
 
        {
-               {"³«¤±¤ë(o)", 'o', TRUE},
-               {"ÊĤ¸¤ë(c)", 'c', TRUE},
-               {"ÂÎÅö¤¿¤ê¤¹¤ë(B/f)", 'B', TRUE},
-               {"¤¯¤µ¤Ó¤òÂǤÄ(j/S)", 'j', TRUE},
+               {"開ける(o)", 'o', TRUE},
+               {"閉じる(c)", 'c', TRUE},
+               {"体当たりする(B/f)", 'B', TRUE},
+               {"くさびを打つ(j/S)", 'j', TRUE},
                {"", 0, FALSE},
                {"", 0, FALSE},
                {"", 0, FALSE},
@@ -3800,41 +4026,41 @@ menu_naiyou menu_info[10][10] =
        },
 
        {
-               {"¥À¥ó¥¸¥ç¥ó¤ÎÁ´ÂοÞ(M)", 'M', TRUE},
-               {"°ÌÃÖ¤ò³Îǧ(L/W)", 'L', TRUE},
-               {"³¬¤ÎÊ·°Ïµ¤(^f)", KTRL('F'), TRUE},
-               {"¥¹¥Æ¡¼¥¿¥¹(C)", 'C', TRUE},
-               {"ʸ»ú¤ÎÀâÌÀ(/)", '/', TRUE},
-               {"¥á¥Ã¥»¡¼¥¸ÍúÎò(^p)", KTRL('P'), TRUE},
-               {"¸½ºß¤Î»þ¹ï(^t/')", KTRL('T'), TRUE},
-               {"¸½ºß¤ÎÃμ±(~)", '~', TRUE},
-               {"¥×¥ì¥¤µ­Ï¿(|)", '|', TRUE},
+               {"ダンジョンの全体図(M)", 'M', TRUE},
+               {"位置を確認(L/W)", 'L', TRUE},
+               {"階の雰囲気(^f)", KTRL('F'), TRUE},
+               {"ã\82¹ã\83\86ã\83¼ã\82¿ã\82¹(C)", 'C', TRUE},
+               {"文字の説明(/)", '/', TRUE},
+               {"メッセージ履歴(^p)", KTRL('P'), TRUE},
+               {"現在の時刻(^t/')", KTRL('T'), TRUE},
+               {"現在の知識(~)", '~', TRUE},
+               {"プレイ記録(|)", '|', TRUE},
                {"", 0, FALSE}
        },
 
        {
-               {"¥ª¥×¥·¥ç¥ó(=)", '=', TRUE},
-               {"¥Þ¥¯¥í(@)", '@', TRUE},
-               {"²èÌÌɽ¼¨(%)", '%', TRUE},
-               {"¥«¥é¡¼(&)", '&', TRUE},
-               {"ÀßÄêÊѹ¹¥³¥Þ¥ó¥É(\")", '\"', TRUE},
-               {"¼«Æ°½¦¤¤¤ò¥í¡¼¥É($)", '$', TRUE},
-               {"¥·¥¹¥Æ¥à(!)", '!', TRUE},
+               {"オプション(=)", '=', TRUE},
+               {"マクロ(@)", '@', TRUE},
+               {"画面表示(%)", '%', TRUE},
+               {"ã\82«ã\83©ã\83¼(&)", '&', TRUE},
+               {"設定変更コマンド(\")", '\"', TRUE},
+               {"自動拾いをロード($)", '$', TRUE},
+               {"システム(!)", '!', TRUE},
                {"", 0, FALSE},
                {"", 0, FALSE},
                {"", 0, FALSE}
        },
 
        {
-               {"¥»¡¼¥Ö&ÃæÃÇ(^x)", KTRL('X'), TRUE},
-               {"¥»¡¼¥Ö(^s)", KTRL('S'), TRUE},
-               {"¥Ø¥ë¥×(?)", '?', TRUE},
-               {"ºÆÉÁ²è(^r)", KTRL('R'), TRUE},
-               {"¥á¥â(:)", ':', TRUE},
-               {"µ­Ç°»£±Æ())", ')', TRUE},
-               {"µ­Ç°»£±Æ¤Îɽ¼¨(()", '(', TRUE},
-               {"¥Ð¡¼¥¸¥ç¥ó¾ðÊó(V)", 'V', TRUE},
-               {"°úÂह¤ë(Q)", 'Q', TRUE},
+               {"セーブ&中断(^x)", KTRL('X'), TRUE},
+               {"セーブ(^s)", KTRL('S'), TRUE},
+               {"ヘルプ(?)", '?', TRUE},
+               {"再描画(^r)", KTRL('R'), TRUE},
+               {"メモ(:)", ':', TRUE},
+               {"記念撮影())", ')', TRUE},
+               {"記念撮影の表示(()", '(', TRUE},
+               {"バージョン情報(V)", 'V', TRUE},
+               {"引退する(Q)", 'Q', TRUE},
                {"", 0, FALSE}
        },
 };
@@ -3848,7 +4074,7 @@ menu_naiyou menu_info[10][10] =
                {"Items(other)", 4, FALSE},
                {"Equip", 5, FALSE},
                {"Door/Box", 6, FALSE},
-               {"Infomations", 7, FALSE},
+               {"Informations", 7, FALSE},
                {"Options", 8, FALSE},
                {"Other commands", 9, FALSE},
                {"", 0, FALSE},
@@ -3875,7 +4101,7 @@ menu_naiyou menu_info[10][10] =
                {"Target(*)", '*', TRUE},
                {"Dig(T/^t)", 'T', TRUE},
                {"Go up stairs(<)", '<', TRUE},
-               {"Go down staies(>)", '>', TRUE},
+               {"Go down stairs(>)", '>', TRUE},
                {"Command pets(p)", 'p', TRUE},
                {"Search mode ON/OFF(S/#)", 'S', TRUE}
        },
@@ -3940,7 +4166,7 @@ menu_naiyou menu_info[10][10] =
                {"Identify symbol(/)", '/', TRUE},
                {"Show prev messages(^p)", KTRL('P'), TRUE},
                {"Current time(^t/')", KTRL('T'), TRUE},
-               {"Various infomations(~)", '~', TRUE},
+               {"Various informations(~)", '~', TRUE},
                {"Play record menu(|)", '|', TRUE},
                {"", 0, FALSE}
        },
@@ -3988,13 +4214,17 @@ typedef struct
 #ifdef JP
 special_menu_naiyou special_menu_info[] =
 {
-       {"ĶǽÎÏ/ÆüìǽÎÏ", 0, 0, MENU_CLASS, CLASS_MINDCRAFTER},
-       {"¤â¤Î¤Þ¤Í/ÆüìǽÎÏ", 0, 0, MENU_CLASS, CLASS_IMITATOR},
-       {"ɬ»¦µ»/ÆüìǽÎÏ", 0, 0, MENU_CLASS, CLASS_SAMURAI},
-       {"Îýµ¤½Ñ/ËâË¡/ÆüìǽÎÏ", 0, 0, MENU_CLASS, CLASS_FORCETRAINER},
-       {"¶ÀËâË¡/ÆüìǽÎÏ", 0, 0, MENU_CLASS, CLASS_MIRROR_MASTER},
-       {"¹­°è¥Þ¥Ã¥×(<)", 2, 6, MENU_WILD, FALSE},
-       {"Ä̾ï¥Þ¥Ã¥×(>)", 2, 7, MENU_WILD, TRUE},
+       {"超能力/特殊能力", 0, 0, MENU_CLASS, CLASS_MINDCRAFTER},
+       {"ものまね/特殊能力", 0, 0, MENU_CLASS, CLASS_IMITATOR},
+       {"歌/特殊能力", 0, 0, MENU_CLASS, CLASS_BARD},
+       {"必殺技/特殊能力", 0, 0, MENU_CLASS, CLASS_SAMURAI},
+       {"練気術/魔法/特殊能力", 0, 0, MENU_CLASS, CLASS_FORCETRAINER},
+       {"技/特殊能力", 0, 0, MENU_CLASS, CLASS_BERSERKER},
+       {"技術/特殊能力", 0, 0, MENU_CLASS, CLASS_SMITH},
+       {"鏡魔法/特殊能力", 0, 0, MENU_CLASS, CLASS_MIRROR_MASTER},
+       {"忍術/特殊能力", 0, 0, MENU_CLASS, CLASS_NINJA},
+       {"広域マップ(<)", 2, 6, MENU_WILD, FALSE},
+       {"通常マップ(>)", 2, 7, MENU_WILD, TRUE},
        {"", 0, 0, 0, 0},
 };
 #else
@@ -4002,9 +4232,13 @@ special_menu_naiyou special_menu_info[] =
 {
        {"MindCraft/Special", 0, 0, MENU_CLASS, CLASS_MINDCRAFTER},
        {"Imitation/Special", 0, 0, MENU_CLASS, CLASS_IMITATOR},
+       {"Song/Special", 0, 0, MENU_CLASS, CLASS_BARD},
        {"Technique/Special", 0, 0, MENU_CLASS, CLASS_SAMURAI},
        {"Mind/Magic/Special", 0, 0, MENU_CLASS, CLASS_FORCETRAINER},
+       {"BrutalPower/Special", 0, 0, MENU_CLASS, CLASS_BERSERKER},
+       {"Technique/Special", 0, 0, MENU_CLASS, CLASS_SMITH},
        {"MirrorMagic/Special", 0, 0, MENU_CLASS, CLASS_MIRROR_MASTER},
+       {"Ninjutsu/Special", 0, 0, MENU_CLASS, CLASS_NINJA},
        {"Enter global map(<)", 2, 6, MENU_WILD, FALSE},
        {"Enter local map(>)", 2, 7, MENU_WILD, TRUE},
        {"", 0, 0, 0, 0},
@@ -4019,7 +4253,7 @@ static char inkey_from_menu(void)
        int menu = 0;
        bool kisuu;
 
-       if (py - panel_row_min > 10) basey = 2;
+       if (p_ptr->y - panel_row_min > 10) basey = 2;
        else basey = 13;
        basex = 15;
 
@@ -4070,14 +4304,10 @@ static char inkey_from_menu(void)
                }
                max_num = i;
                kisuu = max_num % 2;
-#ifdef JP
-               put_str("¡Õ",basey + 1 + num / 2, basex + 2 + (num % 2) * 24);
-#else
-               put_str("> ",basey + 1 + num / 2, basex + 2 + (num % 2) * 24);
-#endif
+               put_str(_("》", "> "),basey + 1 + num / 2, basex + 2 + (num % 2) * 24);
 
                /* Place the cursor on the player */
-               move_cursor_relative(py, px);
+               move_cursor_relative(p_ptr->y, p_ptr->x);
 
                /* Get a command */
                sub_cmd = inkey();
@@ -4178,7 +4408,7 @@ void request_command(int shopping)
 {
        int i;
 
-       char cmd;
+       s16b cmd;
        int mode;
 
        cptr act;
@@ -4252,18 +4482,13 @@ void request_command(int shopping)
                /* Command Count */
                if (cmd == '0')
                {
-                       int old_arg = command_arg;
+                       COMMAND_ARG old_arg = command_arg;
 
                        /* Reset */
                        command_arg = 0;
 
                        /* Begin the input */
-#ifdef JP
-                       prt("²ó¿ô: ", 0, 0);
-#else
-                       prt("Count: ", 0, 0);
-#endif
-
+                       prt(_("回数: ", "Count: "), 0, 0);
 
                        /* Get a command count */
                        while (1)
@@ -4278,12 +4503,7 @@ void request_command(int shopping)
                                        command_arg = command_arg / 10;
 
                                        /* Show current count */
-#ifdef JP
-                                       prt(format("²ó¿ô: %d", command_arg), 0, 0);
-#else
-                                       prt(format("Count: %d", command_arg), 0, 0);
-#endif
-
+                                       prt(format(_("回数: %d", "Count: %d"), command_arg), 0, 0);
                                }
 
                                /* Actual numeric data */
@@ -4307,12 +4527,7 @@ void request_command(int shopping)
                                        }
 
                                        /* Show current count */
-#ifdef JP
-                                       prt(format("²ó¿ô: %d", command_arg), 0, 0);
-#else
-                                       prt(format("Count: %d", command_arg), 0, 0);
-#endif
-
+                                       prt(format(_("回数: %d", "Count: %d"), command_arg), 0, 0);
                                }
 
                                /* Exit on "unusable" input */
@@ -4329,12 +4544,7 @@ void request_command(int shopping)
                                command_arg = 99;
 
                                /* Show current count */
-#ifdef JP
-                               prt(format("²ó¿ô: %d", command_arg), 0, 0);
-#else
-                               prt(format("Count: %d", command_arg), 0, 0);
-#endif
-
+                               prt(format(_("回数: %d", "Count: %d"), command_arg), 0, 0);
                        }
 
                        /* Hack -- Handle "old_arg" */
@@ -4344,24 +4554,14 @@ void request_command(int shopping)
                                command_arg = old_arg;
 
                                /* Show current count */
-#ifdef JP
-prt(format("²ó¿ô: %d", command_arg), 0, 0);
-#else
-                               prt(format("Count: %d", command_arg), 0, 0);
-#endif
-
+                               prt(format(_("回数: %d", "Count: %d"), command_arg), 0, 0);
                        }
 
                        /* Hack -- white-space means "enter command now" */
                        if ((cmd == ' ') || (cmd == '\n') || (cmd == '\r'))
                        {
                                /* Get a real command */
-#ifdef JP
-                               if (!get_com("¥³¥Þ¥ó¥É: ", (char *)&cmd, FALSE))
-#else
-                               if (!get_com("Command: ", (char *)&cmd, FALSE))
-#endif
-
+                               if (!get_com(_("コマンド: ", "Command: "), (char *)&cmd, FALSE))
                                {
                                        /* Clear count */
                                        command_arg = 0;
@@ -4377,12 +4577,7 @@ prt(format("
                if (cmd == '\\')
                {
                        /* Get a real command */
-#ifdef JP
-                       (void)get_com("¥³¥Þ¥ó¥É: ", (char *)&cmd, FALSE);
-#else
-                       (void)get_com("Command: ", (char *)&cmd, FALSE);
-#endif
-
+                       (void)get_com(_("コマンド: ", "Command: "), (char *)&cmd, FALSE);
 
                        /* Hack -- bypass keymaps */
                        if (!inkey_next) inkey_next = "";
@@ -4393,12 +4588,7 @@ prt(format("
                if (cmd == '^')
                {
                        /* Get a new command and controlify it */
-#ifdef JP
-                       if (get_com("CTRL: ", (char *)&cmd, FALSE)) cmd = KTRL(cmd);
-#else
-                       if (get_com("Control: ", (char *)&cmd, FALSE)) cmd = KTRL(cmd);
-#endif
-
+                       if (get_com(_("CTRL: ", "Control: "), (char *)&cmd, FALSE)) cmd = KTRL(cmd);
                }
 
 
@@ -4434,7 +4624,7 @@ prt(format("
        if (always_repeat && (command_arg <= 0))
        {
                /* Hack -- auto repeat certain commands */
-               if (strchr("TBDoc+", command_cmd))
+               if (my_strchr("TBDoc+", (char)command_cmd))
                {
                        /* Repeat 99 times */
                        command_arg = 99;
@@ -4475,11 +4665,6 @@ prt(format("
                caretcmd = command_cmd;
 #endif
 
-#ifdef JP
-#undef strchr
-#define strchr strchr_j
-#endif
-
        /* Hack -- Scan equipment */
        for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
        {
@@ -4497,7 +4682,7 @@ prt(format("
                s = quark_str(o_ptr->inscription);
 
                /* Find a '^' */
-               s = strchr(s, '^');
+               s = my_strchr(s, '^');
 
                /* Process preventions */
                while (s)
@@ -4511,12 +4696,7 @@ prt(format("
 
                        {
                                /* Hack -- Verify command */
-#ifdef JP
-                               if (!get_check("ËÜÅö¤Ç¤¹¤«? "))
-#else
-                               if (!get_check("Are you sure? "))
-#endif
-
+                               if (!get_check(_("本当ですか? ", "Are you sure? ")))
                                {
                                        /* Hack -- Use space */
                                        command_cmd = ' ';
@@ -4524,7 +4704,7 @@ prt(format("
                        }
 
                        /* Find another '^' */
-                       s = strchr(s + 1, '^');
+                       s = my_strchr(s + 1, '^');
                }
        }
 
@@ -4576,7 +4756,7 @@ static bool insert_str(char *buf, cptr target, cptr insert)
        int                b_len, t_len, i_len;
 
        /* Attempt to find the target (modify "buf") */
-       buf = strstr(buf, target);
+       buf = my_strstr(buf, target);
 
        /* No target found */
        if (!buf) return (FALSE);
@@ -4637,7 +4817,7 @@ int get_keymap_dir(char ch)
        }
        else
        {
-               int mode;
+               BIT_FLAGS mode;
                cptr act, s;
 
                /* Roguelike */
@@ -4686,10 +4866,10 @@ static int repeat__cnt = 0;
 static int repeat__idx = 0;
 
 /* Saved "stuff" */
-static int repeat__key[REPEAT_MAX];
+static COMMAND_CODE repeat__key[REPEAT_MAX];
 
 
-void repeat_push(int what)
+void repeat_push(COMMAND_CODE what)
 {
        /* Too many keys */
        if (repeat__cnt == REPEAT_MAX) return;
@@ -4702,7 +4882,7 @@ void repeat_push(int what)
 }
 
 
-bool repeat_pull(int *what)
+bool repeat_pull(COMMAND_CODE *what)
 {
        /* All out of keys */
        if (repeat__idx == repeat__cnt) return (FALSE);
@@ -4716,7 +4896,7 @@ bool repeat_pull(int *what)
 
 void repeat_check(void)
 {
-       int             what;
+       COMMAND_CODE what;
 
        /* Ignore some commands */
        if (command_cmd == ESCAPE) return;
@@ -4773,14 +4953,9 @@ static void swap(tag_type *a, tag_type *b)
 {
        tag_type temp;
 
-       temp.tag = a->tag;
-       temp.pointer = a->pointer;
-
-       a->tag = b->tag;
-       a->pointer = b->pointer;
-
-       b->tag = temp.tag;
-       b->pointer = temp.pointer;
+       temp = *a;
+       *a = *b;
+       *b = temp;
 }
 
 
@@ -5055,10 +5230,10 @@ void roff_to_buf(cptr str, int maxlen, char *tbuf, size_t bufsize)
                        ch[1] = str[read_pt+1];
                        ch_len = 2;
 
-                       if (strcmp(ch, "¡£") == 0 ||
-                           strcmp(ch, "¡¢") == 0 ||
-                           strcmp(ch, "¥£") == 0 ||
-                           strcmp(ch, "¡¼") == 0)
+                       if (strcmp(ch, "") == 0 ||
+                           strcmp(ch, "") == 0 ||
+                           strcmp(ch, "ã\82£") == 0 ||
+                           strcmp(ch, "ã\83¼") == 0)
                                kinsoku = TRUE;
                }
                else if (!isprint(ch[0]))
@@ -5141,26 +5316,29 @@ size_t my_strcpy(char *buf, const char *src, size_t bufsize)
        const char *s = src;
        size_t len = 0;
 
-       /* reserve for NUL termination */
-       bufsize--;
+       if (bufsize > 0) {
+               /* reserve for NUL termination */
+               bufsize--;
 
-       /* Copy as many bytes as will fit */
-       while (len < bufsize)
-       {
-               if (iskanji(*s))
-               {
-                       if (len + 1 >= bufsize || !*(s+1)) break;
-                       *d++ = *s++;
-                       *d++ = *s++;
-                       len += 2;
-               }
-               else
+               /* Copy as many bytes as will fit */
+               while (*s && (len < bufsize))
                {
-                       *d++ = *s++;
-                       len++;
+                       if (iskanji(*s))
+                       {
+                               if (len + 1 >= bufsize || !*(s+1)) break;
+                               *d++ = *s++;
+                               *d++ = *s++;
+                               len += 2;
+                       }
+                       else
+                       {
+                               *d++ = *s++;
+                               len++;
+                       }
                }
+               *d = '\0';
        }
-       *d = '\0';
+
        while(*s++) len++;
 
        return len;
@@ -5217,13 +5395,81 @@ size_t my_strcat(char *buf, const char *src, size_t bufsize)
 
 
 /*
+ * A copy of ANSI strstr()
+ *
+ * my_strstr() can handle Kanji strings correctly.
+ */
+char *my_strstr(const char *haystack, const char *needle)
+{
+       int i;
+       int l1 = strlen(haystack);
+       int l2 = strlen(needle);
+
+       if (l1 >= l2)
+       {
+               for(i = 0; i <= l1 - l2; i++)
+               {
+                       if(!strncmp(haystack + i, needle, l2))
+                               return (char *)haystack + i;
+
+#ifdef JP
+                       if (iskanji(*(haystack + i))) i++;
+#endif
+               }
+       }
+
+       return NULL;
+}
+
+
+/*
+ * A copy of ANSI strchr()
+ *
+ * my_strchr() can handle Kanji strings correctly.
+ */
+char *my_strchr(const char *ptr, char ch)
+{
+       for ( ; *ptr != '\0'; ptr++)
+       {
+               if (*ptr == ch) return (char *)ptr;
+
+#ifdef JP
+               if (iskanji(*ptr)) ptr++;
+#endif
+       }
+
+       return NULL;
+}
+
+
+/*
+ * Convert string to lower case
+ */
+void str_tolower(char *str)
+{
+       /* Force to be lower case string */
+       for (; *str; str++)
+       {
+#ifdef JP
+               if (iskanji(*str))
+               {
+                       str++;
+                       continue;
+               }
+#endif
+               *str = (char)tolower(*str);
+       }
+}
+
+
+/*
  * Get a keypress from the user.
  * And interpret special keys as internal code.
  *
  * This function is a Mega-Hack and depend on pref-xxx.prf's.
  * Currently works on Linux(UNIX), Windows, and Macintosh only.
  */
-int inkey_special(bool use_numkey_as_special)
+int inkey_special(bool numpad_cursor)
 {
        static const struct {
                cptr keyname;
@@ -5235,42 +5481,52 @@ int inkey_special(bool use_numkey_as_special)
        };
 
        static const struct {
+               bool numpad;
                cptr keyname;
                int keycode;
        } special_key_list[] = {
-               {"Down]", SKEY_DOWN},
-               {"Left]", SKEY_LEFT},
-               {"Right]", SKEY_RIGHT},
-               {"Up]", SKEY_UP},
-               {"Page_Up]", SKEY_PGUP},
-               {"Page_Down]", SKEY_PGDOWN},
-               {"Home]", SKEY_TOP},
-               {"End]", SKEY_BOTTOM},
-               {"KP_Down]", SKEY_DOWN},
-               {"KP_Left]", SKEY_LEFT},
-               {"KP_Right]", SKEY_RIGHT},
-               {"KP_Up]", SKEY_UP},
-               {"KP_Page_Up]", SKEY_PGUP},
-               {"KP_Page_Down]", SKEY_PGDOWN},
-               {"KP_Home]", SKEY_TOP},
-               {"KP_End]", SKEY_BOTTOM},
-               {NULL, 0},
+               {FALSE, "Down]", SKEY_DOWN},
+               {FALSE, "Left]", SKEY_LEFT},
+               {FALSE, "Right]", SKEY_RIGHT},
+               {FALSE, "Up]", SKEY_UP},
+               {FALSE, "Page_Up]", SKEY_PGUP},
+               {FALSE, "Page_Down]", SKEY_PGDOWN},
+               {FALSE, "Home]", SKEY_TOP},
+               {FALSE, "End]", SKEY_BOTTOM},
+               {TRUE, "KP_Down]", SKEY_DOWN},
+               {TRUE, "KP_Left]", SKEY_LEFT},
+               {TRUE, "KP_Right]", SKEY_RIGHT},
+               {TRUE, "KP_Up]", SKEY_UP},
+               {TRUE, "KP_Page_Up]", SKEY_PGUP},
+               {TRUE, "KP_Page_Down]", SKEY_PGDOWN},
+               {TRUE, "KP_Home]", SKEY_TOP},
+               {TRUE, "KP_End]", SKEY_BOTTOM},
+               {TRUE, "KP_2]", SKEY_DOWN},
+               {TRUE, "KP_4]", SKEY_LEFT},
+               {TRUE, "KP_6]", SKEY_RIGHT},
+               {TRUE, "KP_8]", SKEY_UP},
+               {TRUE, "KP_9]", SKEY_PGUP},
+               {TRUE, "KP_3]", SKEY_PGDOWN},
+               {TRUE, "KP_7]", SKEY_TOP},
+               {TRUE, "KP_1]", SKEY_BOTTOM},
+               {FALSE, NULL, 0},
        };
 
        static const struct {
                cptr keyname;
                int keycode;
-       } numkey_list[] = {
-               {"KP_2]", SKEY_DOWN},
-               {"KP_4]", SKEY_LEFT},
-               {"KP_6]", SKEY_RIGHT},
-               {"KP_8]", SKEY_UP},
-               {"KP_9]", SKEY_PGUP},
-               {"KP_3]", SKEY_PGDOWN},
-               {"KP_7]", SKEY_TOP},
-               {"KP_1]", SKEY_BOTTOM},
+       } gcu_special_key_list[] = {
+               {"A", SKEY_UP},
+               {"B", SKEY_DOWN},
+               {"C", SKEY_RIGHT},
+               {"D", SKEY_LEFT},
+               {"1~", SKEY_TOP},
+               {"4~", SKEY_BOTTOM},
+               {"5~", SKEY_PGUP},
+               {"6~", SKEY_PGDOWN},
                {NULL, 0},
        };
+
        char buf[1024];
        cptr str = buf;
        char key;
@@ -5279,101 +5535,104 @@ int inkey_special(bool use_numkey_as_special)
        int i;
        size_t trig_len;
 
+       /*
+        * Forget macro trigger ----
+        * It's important if we are already expanding macro action
+        */
+       inkey_macro_trigger_string[0] = '\0';
+
        /* Get a keypress */
        key = inkey();
 
        /* Examine trigger string */
        trig_len = strlen(inkey_macro_trigger_string);
 
-       /* No special key */
+       /* Already known that no special key */
        if (!trig_len) return (int)((unsigned char)key);
+
        /*
-        * Mega Hack -- ignore macro defined on ASCII keys
-        *
-        * When this function is used, all ASCII keys are used as
-        * themselfs instead of macro triggers for command macro's.
+        * Hack -- Ignore macro defined on ASCII characters.
         */
-       if (trig_len == 1)
+       if (trig_len == 1 && parse_macro)
        {
-               /* Get original key */
-               key = inkey_macro_trigger_string[0];
+               char c = inkey_macro_trigger_string[0];
 
-#ifdef JP
-               if (!iskanji(key))
-#endif
-               {
-                       /* Kill further macro expansion */
-                       flush();
-               }
+               /* Cancel macro action on the queue */
+               forget_macro_action();
 
                /* Return the originaly pressed key */
-               return (int)((unsigned char)key);
+               return (int)((unsigned char)c);
        }
 
        /* Convert the trigger */
        ascii_to_text(buf, inkey_macro_trigger_string);
 
        /* Check the prefix "\[" */
-       if (!prefix(str, "\\[")) return 0;
-
-       /* Skip "\[" */
-       str += 2;
-
-       /* Examine modifier keys */
-       while (TRUE)
+       if (prefix(str, "\\["))
        {
-               for (i = 0; modifier_key_list[i].keyname; i++)
+               /* Skip "\[" */
+               str += 2;
+
+               /* Examine modifier keys */
+               while (TRUE)
                {
-                       if (prefix(str, modifier_key_list[i].keyname))
+                       for (i = 0; modifier_key_list[i].keyname; i++)
                        {
-                               /* Get modifier key flag */
-                               str += strlen(modifier_key_list[i].keyname);
-                               modifier |= modifier_key_list[i].keyflag;
+                               if (prefix(str, modifier_key_list[i].keyname))
+                               {
+                                       /* Get modifier key flag */
+                                       str += strlen(modifier_key_list[i].keyname);
+                                       modifier |= modifier_key_list[i].keyflag;
+                               }
                        }
+
+                       /* No more modifier key found */
+                       if (!modifier_key_list[i].keyname) break;
                }
 
-               /* No more modifier key found */
-               if (!modifier_key_list[i].keyname) break;
-       }
+               /* numpad_as_cursorkey option force numpad keys to input numbers */
+               if (!numpad_as_cursorkey) numpad_cursor = FALSE;
 
-       /* Get a special key code */
-       for (i = 0; special_key_list[i].keyname; i++)
-       {
-               if (streq(str, special_key_list[i].keyname))
+               /* Get a special key code */
+               for (i = 0; special_key_list[i].keyname; i++)
                {
-                       skey = special_key_list[i].keycode;
-                       break;
+                       if ((!special_key_list[i].numpad || numpad_cursor) &&
+                           streq(str, special_key_list[i].keyname))
+                       {
+                               skey = special_key_list[i].keycode;
+                               break;
+                       }
+               }
+
+               /* A special key found */
+               if (skey)
+               {
+                       /* Cancel macro action on the queue */
+                       forget_macro_action();
+
+                       /* Return special key code and modifier flags */
+                       return (skey | modifier);
                }
        }
 
-       if (!skey && use_numkey_as_special)
+       if (prefix(str, "\\e["))
        {
-               /* Get a numkey code */
-               for (i = 0; numkey_list[i].keyname; i++)
+               str += 3;
+
+               for (i = 0; gcu_special_key_list[i].keyname; i++)
                {
-                       if (streq(str, numkey_list[i].keyname))
+                       if (streq(str, gcu_special_key_list[i].keyname))
                        {
-                               skey = numkey_list[i].keycode;
-                               break;
+                               return gcu_special_key_list[i].keycode;
                        }
                }
        }
 
        /* No special key found? */
-       if (!skey)
-       {
-               /* Don't bother with this trigger no more */
-               inkey_macro_trigger_string[0] = '\0';
-
-               /* Return normal keycode */
-               return (int)((unsigned char)key);
-       }
 
-       /* A special key found */
-
-       /* Kill further macro expansion */
-       flush();
+       /* Don't bother with this trigger no more */
+       inkey_macro_trigger_string[0] = '\0';
 
-       /* Return special key code and modifier flags */
-       return (skey | modifier);
+       /* Return normal keycode */
+       return (int)((unsigned char)key);
 }