OSDN Git Service

32bitで足りない場合の演算コードの一般的な関数群 s64b_???()を作った。
[hengband/hengband.git] / src / cmd4.c
index d2d0908..5ef50d4 100644 (file)
@@ -1291,17 +1291,19 @@ void do_cmd_message_one(void)
  */
 void do_cmd_messages(int num_now)
 {
-       int i, j, k, n;
-       uint q;
+       int i, n;
 
        char shower[80];
        char finder[80];
        int wid, hgt;
-
+       int num_lines;
 
        /* Get size */
        Term_get_size(&wid, &hgt);
 
+       /* Number of message lines in a screen */
+       num_lines = hgt - 4;
+
        /* Wipe finder */
        strcpy(finder, "");
 
@@ -1315,28 +1317,25 @@ void do_cmd_messages(int num_now)
        /* Start on first message */
        i = 0;
 
-       /* Start at leftmost edge */
-       q = 0;
-
        /* Save the screen */
        screen_save();
 
+       /* Clear screen */
+       Term_clear();
+
        /* Process requests until done */
        while (1)
        {
-               /* Clear screen */
-               Term_clear();
+               int j;
+               int skey;
 
                /* Dump up to 20 lines of messages */
-               for (j = 0; (j < hgt - 4) && (i + j < n); j++)
+               for (j = 0; (j < num_lines) && (i + j < n); j++)
                {
                        cptr msg = message_str(i+j);
 
-                       /* Apply horizontal scroll */
-                       msg = (strlen(msg) >= q) ? (msg + q) : "";
-
                        /* Dump the messages, bottom to top */
-                       Term_putstr(0, hgt-j-3, -1, (bool)(i+j < num_now ? TERM_WHITE : TERM_SLATE), msg);
+                       c_prt((i+j < num_now ? TERM_WHITE : TERM_SLATE), msg, num_lines + 1 - j, 0);
 
                        /* Hilite "shower" */
                        if (shower[0])
@@ -1344,12 +1343,12 @@ void do_cmd_messages(int num_now)
                                cptr str = msg;
 
                                /* Display matches */
-                               while ((str = strstr(str, shower)) != NULL)
+                               while ((str = my_strstr(str, shower)) != NULL)
                                {
                                        int len = strlen(shower);
 
                                        /* Display the match */
-                                       Term_putstr(str-msg, hgt-j-3, len, TERM_YELLOW, shower);
+                                       Term_putstr(str-msg, num_lines + 1 - j, len, TERM_YELLOW, shower);
 
                                        /* Advance */
                                        str += len;
@@ -1357,14 +1356,20 @@ void do_cmd_messages(int num_now)
                        }
                }
 
+               /* Erase remaining lines */
+               for (; j < num_lines; j++)
+               {
+                       Term_erase(0, num_lines + 1 - j, 255);
+               }
+
                /* Display header XXX XXX XXX */
 #ifdef JP
                /* translation */
-               prt(format("°ÊÁ°¤Î¥á¥Ã¥»¡¼¥¸ %d-%d Á´Éô¤Ç(%d) ¥ª¥Õ¥»¥Ã¥È(%d)",
-                          i, i+j-1, n, q), 0, 0);
+               prt(format("°ÊÁ°¤Î¥á¥Ã¥»¡¼¥¸ %d-%d Á´Éô¤Ç(%d)",
+                          i, i+j-1, n), 0, 0);
 #else
-               prt(format("Message Recall (%d-%d of %d), Offset %d",
-                   i, i+j-1, n, q), 0, 0);
+               prt(format("Message Recall (%d-%d of %d)",
+                          i, i+j-1, n), 0, 0);
 #endif
 
 
@@ -1377,36 +1382,16 @@ void do_cmd_messages(int num_now)
 
 
                /* Get a command */
-               k = inkey();
+               skey = inkey_special(TRUE);
 
                /* Exit on Escape */
-               if (k == ESCAPE) break;
+               if (skey == ESCAPE) break;
 
                /* Hack -- Save the old index */
                j = i;
 
-               /* Horizontal scroll */
-               if (k == '4')
-               {
-                       /* Scroll left */
-                       q = (q >= 40) ? (q - 40) : 0;
-
-                       /* Success */
-                       continue;
-               }
-
-               /* Horizontal scroll */
-               if (k == '6')
-               {
-                       /* Scroll right */
-                       q = q + 40;
-
-                       /* Success */
-                       continue;
-               }
-
                /* Hack -- handle show */
-               if (k == '=')
+               if (skey == '=')
                {
                        /* Prompt */
 #ifdef JP
@@ -1417,14 +1402,14 @@ void do_cmd_messages(int num_now)
 
 
                        /* Get a "shower" string, or continue */
-                       if (!askfor_aux(shower, 80)) continue;
+                       if (!askfor(shower, 80)) continue;
 
                        /* Okay */
                        continue;
                }
 
                /* Hack -- handle find */
-               if (k == '/')
+               if (skey == '/' || skey == KTRL('s'))
                {
                        int z;
 
@@ -1437,7 +1422,7 @@ void do_cmd_messages(int num_now)
 
 
                        /* Get a "finder" string, or continue */
-                       if (!askfor_aux(finder, 80)) continue;
+                       if (!askfor(finder, 80)) continue;
 
                        /* Show it */
                        strcpy(shower, finder);
@@ -1448,7 +1433,7 @@ void do_cmd_messages(int num_now)
                                cptr msg = message_str(z);
 
                                /* Search for it */
-                               if (strstr(msg, finder))
+                               if (my_strstr(msg, finder))
                                {
                                        /* New location */
                                        i = z;
@@ -1460,45 +1445,59 @@ void do_cmd_messages(int num_now)
                }
 
                /* Recall 1 older message */
-               if ((k == '8') || (k == '\n') || (k == '\r'))
+               if (skey == SKEY_TOP)
+               {
+                       /* Go to the oldest line */
+                       i = n - num_lines;
+               }
+
+               /* Recall 1 newer message */
+               if (skey == SKEY_BOTTOM)
+               {
+                       /* Go to the newest line */
+                       i = 0;
+               }
+
+               /* Recall 1 older message */
+               if (skey == '8' || skey == SKEY_UP || skey == '\n' || skey == '\r')
                {
-                       /* Go newer if legal */
-                       if (i + 1 < n) i += 1;
+                       /* Go older if legal */
+                       i = MIN(i + 1, n - num_lines);
                }
 
                /* Recall 10 older messages */
-               if (k == '+')
+               if (skey == '+')
                {
                        /* Go older if legal */
-                       if (i + 10 < n) i += 10;
+                       i = MIN(i + 10, n - num_lines);
                }
 
                /* Recall 20 older messages */
-               if ((k == 'p') || (k == KTRL('P')) || (k == ' '))
+               if (skey == 'p' || skey == KTRL('P') || skey == ' ' || skey == SKEY_PGUP)
                {
                        /* Go older if legal */
-                       if (i + 20 < n) i += 20;
+                       i = MIN(i + num_lines, n - num_lines);
                }
 
                /* Recall 20 newer messages */
-               if ((k == 'n') || (k == KTRL('N')))
+               if (skey == 'n' || skey == KTRL('N') || skey == SKEY_PGDOWN)
                {
                        /* Go newer (if able) */
-                       i = (i >= 20) ? (i - 20) : 0;
+                       i = MAX(0, i - num_lines);
                }
 
                /* Recall 10 newer messages */
-               if (k == '-')
+               if (skey == '-')
                {
                        /* Go newer (if able) */
-                       i = (i >= 20) ? (i - 20) : 0;
+                       i = MAX(0, i - 10);
                }
 
                /* Recall 1 newer messages */
-               if (k == '2')
+               if (skey == '2' || skey == SKEY_DOWN)
                {
                        /* Go newer (if able) */
-                       i = (i >= 1) ? (i - 1) : 0;
+                       i = MAX(0, i - 1);
                }
 
                /* Hack -- Error of some kind */
@@ -1902,8 +1901,6 @@ static void do_cmd_options_autosave(cptr info)
 }
 
 
-#define PAGE_AUTODESTROY 7
-
 /*
  * Interact with some options
  */
@@ -1913,6 +1910,8 @@ void do_cmd_options_aux(int page, cptr info)
        int     i, k = 0, n = 0, l;
        int     opt[24];
        char    buf[80];
+       bool    browse_only = (page == OPT_PAGE_BIRTH) && character_generated &&
+                             (!p_ptr->wizard || !allow_debug_opts);
 
 
        /* Lookup the options */
@@ -1936,9 +1935,9 @@ void do_cmd_options_aux(int page, cptr info)
 
                /* Prompt XXX XXX XXX */
 #ifdef JP
-               sprintf(buf, "%s (¥ê¥¿¡¼¥ó:¼¡, y/n:Êѹ¹, ESC:½ªÎ», ?:¥Ø¥ë¥×) ", info);
+               sprintf(buf, "%s (¥ê¥¿¡¼¥ó:¼¡, %sESC:½ªÎ», ?:¥Ø¥ë¥×) ", info, browse_only ? "" : "y/n:Êѹ¹, ");
 #else
-               sprintf(buf, "%s (RET:next, y/n:change, ESC:accept, ?:help) ", info);
+               sprintf(buf, "%s (RET:next, %s, ?:help) ", info, browse_only ? "ESC:exit" : "y/n:change, ESC:accept");
 #endif
 
                prt(buf, 0, 0);
@@ -1946,9 +1945,9 @@ void do_cmd_options_aux(int page, cptr info)
 
                /* HACK -- description for easy-auto-destroy options */
 #ifdef JP
-               if (page == PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "°Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢´Ê°×¼«Æ°Ç˲õ¤ò»ÈÍѤ¹¤ë¤È¤­¤Î¤ßÍ­¸ú", 6, 6);
+               if (page == OPT_PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "°Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢´Ê°×¼«Æ°Ç˲õ¤ò»ÈÍѤ¹¤ë¤È¤­¤Î¤ßÍ­¸ú", 6, 6);
 #else
-               if (page == PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "Following options will protect items from easy auto-destroyer.", 6, 3);
+               if (page == OPT_PAGE_AUTODESTROY) c_prt(TERM_YELLOW, "Following options will protect items from easy auto-destroyer.", 6, 3);
 #endif
 
                /* Display the options */
@@ -1969,11 +1968,11 @@ void do_cmd_options_aux(int page, cptr info)
 #endif
 
                                option_info[opt[i]].o_text);
-                       if ((page == PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
+                       if ((page == OPT_PAGE_AUTODESTROY) && i > 2) c_prt(a, buf, i + 5, 0);
                        else c_prt(a, buf, i + 2, 0);
                }
 
-               if ((page == PAGE_AUTODESTROY) && (k > 2)) l = 3;
+               if ((page == OPT_PAGE_AUTODESTROY) && (k > 2)) l = 3;
                else l = 0;
 
                /* Hilite current option */
@@ -2018,6 +2017,7 @@ void do_cmd_options_aux(int page, cptr info)
                        case 'Y':
                        case '6':
                        {
+                               if (browse_only) break;
                                (*option_info[opt[k]].o_var) = TRUE;
                                k = (k + 1) % n;
                                break;
@@ -2027,6 +2027,7 @@ void do_cmd_options_aux(int page, cptr info)
                        case 'N':
                        case '4':
                        {
+                               if (browse_only) break;
                                (*option_info[opt[k]].o_var) = FALSE;
                                k = (k + 1) % n;
                                break;
@@ -2035,7 +2036,7 @@ void do_cmd_options_aux(int page, cptr info)
                        case 't':
                        case 'T':
                        {
-                               (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
+                               if (!browse_only) (*option_info[opt[k]].o_var) = !(*option_info[opt[k]].o_var);
                                break;
                        }
 
@@ -2049,7 +2050,7 @@ void do_cmd_options_aux(int page, cptr info)
                                /* Peruse the help file */
                                (void)show_file(TRUE, buf, NULL, 0, 0);
 
-                               Term_clear(); 
+                               Term_clear();
                                break;
                        }
 
@@ -2282,62 +2283,84 @@ void do_cmd_options(void)
 
                /* Why are we here */
 #ifdef JP
-               prt("[ ¥ª¥×¥·¥ç¥ó¤ÎÀßÄê ]", 2, 0);
+               prt("[ ¥ª¥×¥·¥ç¥ó¤ÎÀßÄê ]", 1, 0);
 #else
-               prt("Options", 2, 0);
+               prt("Options", 1, 0);
 #endif
 
 
                /* Give some choices */
 #ifdef JP
-               prt("(1)     ¥­¡¼ÆþÎÏ          ¥ª¥×¥·¥ç¥ó", 4, 5);
-               prt("(2)     ²èÌ̽ÐÎÏ          ¥ª¥×¥·¥ç¥ó", 5, 5);
-               prt("(3)   ¥²¡¼¥à¥×¥ì¥¤        ¥ª¥×¥·¥ç¥ó", 6, 5);
-               prt("(4)   ¹ÔÆ°Ãæ»ß´Ø·¸        ¥ª¥×¥·¥ç¥ó", 7, 5);
-               prt("(5)      ¸úΨ²½           ¥ª¥×¥·¥ç¥ó", 8, 5);
-               prt("(6) ´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ  ¥ª¥×¥·¥ç¥ó", 9, 5);
-               prt("(R)    ¥×¥ì¥¤µ­Ï¿         ¥ª¥×¥·¥ç¥ó", 10, 5);
+               prt("(1)      ¥­¡¼ÆþÎÏ        ¥ª¥×¥·¥ç¥ó", 2, 5);
+               prt("(2)     ¥Þ¥Ã¥×²èÌÌ       ¥ª¥×¥·¥ç¥ó", 3, 5);
+               prt("(3)    ¥Æ¥­¥¹¥Èɽ¼¨      ¥ª¥×¥·¥ç¥ó", 4, 5);
+               prt("(4)    ¥²¡¼¥à¥×¥ì¥¤      ¥ª¥×¥·¥ç¥ó", 5, 5);
+               prt("(5)    ¹ÔÆ°Ãæ»ß´Ø·¸      ¥ª¥×¥·¥ç¥ó", 6, 5);
+               prt("(6)    ´Ê°×¼«Æ°Ç˲õ      ¥ª¥×¥·¥ç¥ó", 7, 5);
+               prt("(R)     ¥×¥ì¥¤µ­Ï¿       ¥ª¥×¥·¥ç¥ó", 8, 5);
+
                /* Special choices */
-               prt("(D)  ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 12, 5);
-               prt("(H) Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 13, 5);
-               prt("(A)    ¼«Æ°¥»¡¼¥Ö         ¥ª¥×¥·¥ç¥ó", 14, 5);
+               prt("(P)  ¼«Æ°½¦¤¤¥¨¥Ç¥£¥¿", 10, 5);
+               prt("(D)   ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 11, 5);
+               prt("(H) Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 12, 5);
+               prt("(M)    ÄãËâÎÏ¿§ïçÃÍ", 13, 5);
+               prt("(A)     ¼«Æ°¥»¡¼¥Ö       ¥ª¥×¥·¥ç¥ó", 14, 5);
                /* Window flags */
-               prt("(W) ¥¦¥¤¥ó¥É¥¦¥Õ¥é¥°", 15, 5);
-#else
-               prt("(1) Input Options", 4, 5);
-               prt("(2) Output Options", 5, 5);
-               prt("(3) Game-Play Options", 6, 5);
-               prt("(4) Disturbance Options", 7, 5);
-               prt("(5) Efficiency Options", 8, 5);
-               prt("(6) Easy Auto-Destroyer Options", 9, 5);
-               prt("(R) Play-record Options", 10, 5);
-
+               prt("(W)  ¥¦¥¤¥ó¥É¥¦¥Õ¥é¥°", 15, 5);
+#else
+               prt("(1) Input Options", 2, 5);
+               prt("(2) Map Screen Options", 3, 5);
+               prt("(3) Text Display Options", 4, 5);
+               prt("(4) Game-Play Options", 5, 5);
+               prt("(5) Disturbance Options", 6, 5);
+               prt("(6) Easy Auto-Destroyer Options", 7, 5);
+               prt("(R) Play-record Options", 8, 5);
                /* Special choices */
-               prt("(D) Base Delay Factor", 12, 5);
-               prt("(H) Hitpoint Warning", 13, 5);
+               prt("(P) Auto-picker/destroyer editor", 10, 5);
+               prt("(D) Base Delay Factor", 11, 5);
+               prt("(H) Hitpoint Warning", 12, 5);
+               prt("(M) Mana Color Threshold", 13, 5);
                prt("(A) Autosave Options", 14, 5);
-
-
                /* Window flags */
                prt("(W) Window Flags", 15, 5);
 #endif
 
+               if (!p_ptr->wizard || !allow_debug_opts)
+               {
+                       /* Birth */
+#ifdef JP
+                       prt("(B)        ½é´ü          ¥ª¥×¥·¥ç¥ó (»²¾È¤Î¤ß)", 16, 5);
+#else
+                       prt("(B) Birth Options (Browse Only)", 16, 5);
+#endif
+               }
+               else
+               {
+                       /* Birth */
+#ifdef JP
+                       prt("(B)        ½é´ü          ¥ª¥×¥·¥ç¥ó", 16, 5);
+#else
+                       prt("(B) Birth Options", 16, 5);
+#endif
+               }
+
+
                if (p_ptr->noscore || allow_debug_opts)
                {
                        /* Cheating */
 #ifdef JP
-                       prt("(C)       º¾µ½            ¥ª¥×¥·¥ç¥ó", 16, 5);
+                       prt("(C)        º¾µ½          ¥ª¥×¥·¥ç¥ó", 17, 5);
 #else
-                       prt("(C) Cheating Options", 16, 5);
+                       prt("(C) Cheating Options", 17, 5);
 #endif
                }
 
 
                /* Prompt */
 #ifdef JP
-               prt("¥³¥Þ¥ó¥É:", 18, 0);
+               prt("¥³¥Þ¥ó¥É:", 19, 0);
 #else
-               prt("Command: ", 18, 0);
+               prt("Command: ", 19, 0);
 #endif
 
 
@@ -2350,79 +2373,73 @@ void do_cmd_options(void)
                /* Analyze */
                switch (k)
                {
-                       /* General Options */
                        case '1':
                        {
                                /* Process the general options */
 #ifdef JP
-                               do_cmd_options_aux(1, "¥­¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó");
+                               do_cmd_options_aux(OPT_PAGE_INPUT, "¥­¡¼ÆþÎÏ¥ª¥×¥·¥ç¥ó");
 #else
-                               do_cmd_options_aux(1, "Input Options");
+                               do_cmd_options_aux(OPT_PAGE_INPUT, "Input Options");
 #endif
 
                                break;
                        }
 
-                       /* General Options */
                        case '2':
                        {
                                /* Process the general options */
 #ifdef JP
-                               do_cmd_options_aux(2, "²èÌ̽ÐÎÏ¥ª¥×¥·¥ç¥ó");
+                               do_cmd_options_aux(OPT_PAGE_MAPSCREEN, "¥Þ¥Ã¥×²èÌÌ¥ª¥×¥·¥ç¥ó");
 #else
-                               do_cmd_options_aux(2, "Output Options");
+                               do_cmd_options_aux(OPT_PAGE_MAPSCREEN, "Map Screen Options");
 #endif
 
                                break;
                        }
 
-                       /* Inventory Options */
                        case '3':
                        {
                                /* Spawn */
 #ifdef JP
-                               do_cmd_options_aux(3, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó");
+                               do_cmd_options_aux(OPT_PAGE_TEXT, "¥Æ¥­¥¹¥Èɽ¼¨¥ª¥×¥·¥ç¥ó");
 #else
-                               do_cmd_options_aux(3, "Game-Play Options");
+                               do_cmd_options_aux(OPT_PAGE_TEXT, "Text Display Options");
 #endif
 
                                break;
                        }
 
-                       /* Disturbance Options */
                        case '4':
                        {
                                /* Spawn */
 #ifdef JP
-                               do_cmd_options_aux(4, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó");
+                               do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "¥²¡¼¥à¥×¥ì¥¤¡¦¥ª¥×¥·¥ç¥ó");
 #else
-                               do_cmd_options_aux(4, "Disturbance Options");
+                               do_cmd_options_aux(OPT_PAGE_GAMEPLAY, "Game-Play Options");
 #endif
 
                                break;
                        }
 
-                       /* Efficiency Options */
                        case '5':
                        {
                                /* Spawn */
 #ifdef JP
-                               do_cmd_options_aux(5, "¸úΨ²½¥ª¥×¥·¥ç¥ó");
+                               do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "¹ÔÆ°Ãæ»ß´Ø·¸¤Î¥ª¥×¥·¥ç¥ó");
 #else
-                               do_cmd_options_aux(5, "Efficiency Options");
+                               do_cmd_options_aux(OPT_PAGE_DISTURBANCE, "Disturbance Options");
 #endif
 
                                break;
                        }
 
-                       /* Object auto-destruction Options */
                        case '6':
                        {
                                /* Spawn */
 #ifdef JP
-                               do_cmd_options_aux(7, "´Ê°×¥¢¥¤¥Æ¥à¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó");
+                               do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "´Ê°×¼«Æ°Ç˲õ¥ª¥×¥·¥ç¥ó");
 #else
-                               do_cmd_options_aux(7, "Easy Auto-Destroyer Options");
+                               do_cmd_options_aux(OPT_PAGE_AUTODESTROY, "Easy Auto-Destroyer Options");
 #endif
                                break;
                        }
@@ -2433,13 +2450,27 @@ void do_cmd_options(void)
                        {
                                /* Spawn */
 #ifdef JP
-                               do_cmd_options_aux(10, "¥×¥ì¥¤µ­Ï¿¥ª¥×¥·¥ç¥ó");
+                               do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "¥×¥ì¥¤µ­Ï¿¥ª¥×¥·¥ç¥ó");
 #else
-                               do_cmd_options_aux(10, "Play-record Option");
+                               do_cmd_options_aux(OPT_PAGE_PLAYRECORD, "Play-record Options");
 #endif
                                break;
                        }
 
+                       /* Birth Options */
+                       case 'B':
+                       case 'b':
+                       {
+                               /* Spawn */
+#ifdef JP
+                               do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "½é´ü¥ª¥×¥·¥ç¥ó(»²¾È¤Î¤ß)" : "½é´ü¥ª¥×¥·¥ç¥ó((*)¤Ï¥¹¥³¥¢¤Ë±Æ¶Á)");
+#else
+                               do_cmd_options_aux(OPT_PAGE_BIRTH, (!p_ptr->wizard || !allow_debug_opts) ? "Birth Options(browse only)" : "Birth Options((*)s effect score)");
+#endif
+
+                               break;
+                       }
+
                        /* Cheating Options */
                        case 'C':
                        {
@@ -2485,15 +2516,23 @@ void do_cmd_options(void)
                                break;
                        }
 
+                       /* Auto-picker/destroyer editor */
+                       case 'P':
+                       case 'p':
+                       {
+                               do_cmd_edit_autopick();
+                               break;
+                       }
+
                        /* Hack -- Delay Speed */
                        case 'D':
                        case 'd':
                        {
                                /* Prompt */
 #ifdef JP
-                               prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 18, 0);
+                               prt("¥³¥Þ¥ó¥É: ´ðËÜ¥¦¥§¥¤¥ÈÎÌ", 19, 0);
 #else
-                               prt("Command: Base Delay Factor", 18, 0);
+                               prt("Command: Base Delay Factor", 19, 0);
 #endif
 
 
@@ -2539,9 +2578,9 @@ void do_cmd_options(void)
                        {
                                /* Prompt */
 #ifdef JP
-                               prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 18, 0);
+                               prt("¥³¥Þ¥ó¥É: Äã¥Ò¥Ã¥È¥Ý¥¤¥ó¥È·Ù¹ð", 19, 0);
 #else
-                               prt("Command: Hitpoint Warning", 18, 0);
+                               prt("Command: Hitpoint Warning", 19, 0);
 #endif
 
 
@@ -2580,6 +2619,53 @@ void do_cmd_options(void)
                                break;
                        }
 
+                       /* Hack -- mana color factor */
+                       case 'M':
+                       case 'm':
+                       {
+                               /* Prompt */
+#ifdef JP
+                               prt("¥³¥Þ¥ó¥É: ÄãËâÎÏ¿§ïçÃÍ", 19, 0);
+#else
+                               prt("Command: Mana Color Threshold", 19, 0);
+#endif
+
+
+                               /* Get a new value */
+                               while (1)
+                               {
+#ifdef JP
+                                       prt(format("¸½ºß¤ÎÄãËâÎÏ¿§ïçÃÍ: %d0%%",
+                                                  mana_warn), 22, 0);
+#else
+                                       prt(format("Current mana color threshold: %d0%%",
+                                                  mana_warn), 22, 0);
+#endif
+
+#ifdef JP
+                                       prt("ÄãËâÎÏïçÃÍ (0-9) ESC¤Ç·èÄê: ", 20, 0);
+#else
+                                       prt("Mana color Threshold (0-9 or ESC to accept): ", 20, 0);
+#endif
+
+                                       k = inkey();
+                                       if (k == ESCAPE) break;
+                                       else if (k == '?')
+                                       {
+#ifdef JP
+                                               (void)show_file(TRUE, "joption.txt#Manapoint", NULL, 0, 0);
+#else
+                                               (void)show_file(TRUE, "option.txt#Manapoint", NULL, 0, 0);
+#endif
+                                               Term_clear(); 
+                                       }
+                                       else if (isdigit(k)) mana_warn = D2I(k);
+                                       else bell();
+                               }
+
+                               break;
+                       }
+
                        case '?':
 #ifdef JP
                                (void)show_file(TRUE, "joption.txt", NULL, 0, 0);
@@ -2636,64 +2722,16 @@ void do_cmd_pref(void)
        (void)process_pref_file_command(buf);
 }
 
-void do_cmd_pickpref(void)
+void do_cmd_reload_autopick(void)
 {
-       char buf[80];
-       errr err;
-
 #ifdef JP
-       if(!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return;
+       if (!get_check("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹¤«? ")) return;
 #else
-       if(!get_check("Reload auto-pick preference file? ")) return;
+       if (!get_check("Reload auto-pick preference file? ")) return;
 #endif
 
-       /* Free old entries */
-       init_autopicker();
-
-       /* ¥­¥ã¥éËè¤ÎÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß */
-#ifdef JP
-       sprintf(buf, "picktype-%s.prf", player_name);
-#else
-       sprintf(buf, "pickpref-%s.prf", player_name);
-#endif
-       err = process_pickpref_file(buf);
-
-       if(err == 0)
-       {
-#ifdef JP
-               msg_format("%s¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", buf);
-#else
-               msg_format("loaded '%s'.", buf);
-#endif
-       }
-
-       /* ¶¦Ä̤ÎÀßÄê¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß */
-
-       /* Process 'pick????.prf' if 'pick????-<name>.prf' doesn't exist */
-       if (0 > err)
-       {
-#ifdef JP
-               err = process_pickpref_file("picktype.prf");
-#else
-               err = process_pickpref_file("pickpref.prf");
-#endif
-
-               if(err == 0)
-               {
-#ifdef JP
-                       msg_print("picktype.prf¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£");
-#else
-                       msg_print("loaded 'pickpref.prf'.");
-#endif
-               }
-       }
-
-
-#ifdef JP
-       if(err) msg_print("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
-#else
-       if(err) msg_print("Failed to reload autopick preference.");
-#endif
+       /* Load the file with messages */
+       autopick_load_pref(TRUE);
 }
 
 #ifdef ALLOW_MACROS
@@ -3054,7 +3092,7 @@ void do_cmd_macros(void)
                        sprintf(tmp, "%s.prf", player_name);
 
                        /* Ask for a file */
-                       if (!askfor_aux(tmp, 80)) continue;
+                       if (!askfor(tmp, 80)) continue;
 
                        /* Process the given filename */
                        err = process_pref_file(tmp);
@@ -3110,7 +3148,7 @@ void do_cmd_macros(void)
                        sprintf(tmp, "%s.prf", player_name);
 
                        /* Ask for a file */
-                       if (!askfor_aux(tmp, 80)) continue;
+                       if (!askfor(tmp, 80)) continue;
 
                        /* Dump the macros */
                        (void)macro_dump(tmp);
@@ -3210,6 +3248,13 @@ void do_cmd_macros(void)
                        /* Clear */
                        clear_from(20);
 
+                       /* Help message */
+#ifdef JP
+                       c_prt(TERM_L_RED, "¥«¡¼¥½¥ë¥­¡¼¤Îº¸±¦¤Ç¥«¡¼¥½¥ë°ÌÃÖ¤ò°ÜÆ°¡£Backspace¤«Delete¤Ç°ìʸ»úºï½ü¡£", 22, 0);
+#else
+                       c_prt(TERM_L_RED, "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char.", 22, 0);
+#endif
+
                        /* Prompt */
 #ifdef JP
                        prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
@@ -3222,7 +3267,7 @@ void do_cmd_macros(void)
                        ascii_to_text(tmp, macro__buf);
 
                        /* Get an encoded action */
-                       if (askfor_aux(tmp, 80))
+                       if (askfor(tmp, 80))
                        {
                                /* Convert to ascii */
                                text_to_ascii(macro__buf, tmp);
@@ -3297,7 +3342,7 @@ void do_cmd_macros(void)
                        sprintf(tmp, "%s.prf", player_name);
 
                        /* Ask for a file */
-                       if (!askfor_aux(tmp, 80)) continue;
+                       if (!askfor(tmp, 80)) continue;
 
                        /* Dump the macros */
                        (void)keymap_dump(tmp);
@@ -3397,6 +3442,13 @@ void do_cmd_macros(void)
                        /* Clear */
                        clear_from(20);
 
+                       /* Help message */
+#ifdef JP
+                       c_prt(TERM_L_RED, "¥«¡¼¥½¥ë¥­¡¼¤Îº¸±¦¤Ç¥«¡¼¥½¥ë°ÌÃÖ¤ò°ÜÆ°¡£Backspace¤«Delete¤Ç°ìʸ»úºï½ü¡£", 22, 0);
+#else
+                       c_prt(TERM_L_RED, "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char.", 22, 0);
+#endif
+
                        /* Prompt */
 #ifdef JP
                        prt("¹ÔÆ°: ", 20, 0);
@@ -3409,7 +3461,7 @@ void do_cmd_macros(void)
                        ascii_to_text(tmp, macro__buf);
 
                        /* Get an encoded action */
-                       if (askfor_aux(tmp, 80))
+                       if (askfor(tmp, 80))
                        {
                                /* Convert to ascii */
                                text_to_ascii(macro__buf, tmp);
@@ -3477,15 +3529,28 @@ void do_cmd_macros(void)
                        prt("Command: Enter a new action", 16, 0);
 #endif
 
+                       /* Clear */
+                       clear_from(20);
 
-                       /* Go to the correct location */
-                       Term_gotoxy(0, 22);
+                       /* Help message */
+#ifdef JP
+                       c_prt(TERM_L_RED, "¥«¡¼¥½¥ë¥­¡¼¤Îº¸±¦¤Ç¥«¡¼¥½¥ë°ÌÃÖ¤ò°ÜÆ°¡£Backspace¤«Delete¤Ç°ìʸ»úºï½ü¡£", 22, 0);
+#else
+                       c_prt(TERM_L_RED, "Press Left/Right arrow keys to move cursor. Backspace/Delete to delete a char.", 22, 0);
+#endif
+
+                       /* Prompt */
+#ifdef JP
+                       prt("¥Þ¥¯¥í¹ÔÆ°: ", 20, 0);
+#else
+                       prt("Action: ", 20, 0);
+#endif
 
                        /* Hack -- limit the value */
                        tmp[80] = '\0';
 
                        /* Get an encoded action */
-                       if (!askfor_aux(buf, 80)) continue;
+                       if (!askfor(buf, 80)) continue;
 
                        /* Extract an action */
                        text_to_ascii(macro__buf, buf);
@@ -3509,6 +3574,22 @@ void do_cmd_macros(void)
 }
 
 
+static cptr lighting_level_str[F_LIT_MAX] =
+{
+#ifdef JP
+       "ɸ½à¿§",
+       "ÌÀ¿§",
+       "°Å¿§",
+       "°Å°Å¿§",
+#else
+       "standard",
+       "brightly lit",
+       "darkened",
+       "darkly darkened",
+#endif
+};
+
+
 static void cmd_visuals_aux(int i, int *num, int max)
 {
        if (iscntrl(i))
@@ -3549,6 +3630,7 @@ void do_cmd_visuals(void)
 
        if (use_bigtile) empty_symbol = "<< ?? >>";
 
+
        /* File type is "TEXT" */
        FILE_TYPE(FILE_TYPE_TEXT);
 
@@ -3609,7 +3691,7 @@ void do_cmd_visuals(void)
 
                /* Prompt */
 #ifdef JP
-               prt("¥³¥Þ¥ó¥É:", 18, 0);
+               prt("¥³¥Þ¥ó¥É:", 15, 0);
 #else
                prt("Command: ", 15, 0);
 #endif
@@ -3634,7 +3716,7 @@ void do_cmd_visuals(void)
 
                        /* Prompt */
 #ifdef JP
-                       prt("¥Õ¥¡¥¤¥ë: ", 18, 0);
+                       prt("¥Õ¥¡¥¤¥ë: ", 17, 0);
 #else
                        prt("File: ", 17, 0);
 #endif
@@ -3644,7 +3726,7 @@ void do_cmd_visuals(void)
                        sprintf(tmp, "%s.prf", player_name);
 
                        /* Query */
-                       if (!askfor_aux(tmp, 70)) continue;
+                       if (!askfor(tmp, 70)) continue;
 
                        /* Process the given filename */
                        (void)process_pref_file(tmp);
@@ -3677,7 +3759,7 @@ void do_cmd_visuals(void)
                        sprintf(tmp, "%s.prf", player_name);
                        
                        /* Get a filename */
-                       if (!askfor_aux(tmp, 70)) continue;
+                       if (!askfor(tmp, 70)) continue;
 
                        /* Build the filename */
                        path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
@@ -3745,7 +3827,7 @@ void do_cmd_visuals(void)
                        sprintf(tmp, "%s.prf", player_name);
 
                        /* Get a filename */
-                       if (!askfor_aux(tmp, 70)) continue;
+                       if (!askfor(tmp, 70)) continue;
 
                        /* Build the filename */
                        path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
@@ -3820,7 +3902,7 @@ void do_cmd_visuals(void)
                        sprintf(tmp, "%s.prf", player_name);
 
                        /* Get a filename */
-                       if (!askfor_aux(tmp, 70)) continue;
+                       if (!askfor(tmp, 70)) continue;
 
                        /* Build the filename */
                        path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
@@ -3850,8 +3932,11 @@ void do_cmd_visuals(void)
                                auto_dump_printf("# %s\n", (f_name + f_ptr->name));
 
                                /* Dump the feature attr/char info */
-                               auto_dump_printf("F:%d:0x%02X/0x%02X\n\n", i,
-                                       (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char));
+                               auto_dump_printf("F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i,
+                                       (byte)(f_ptr->x_attr[F_LIT_STANDARD]), (byte)(f_ptr->x_char[F_LIT_STANDARD]),
+                                       (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
+                                       (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]),
+                                       (byte)(f_ptr->x_attr[F_LIT_DARKDARK]), (byte)(f_ptr->x_char[F_LIT_DARKDARK]));
                        }
 
                        /* Close */
@@ -3883,8 +3968,7 @@ void do_cmd_visuals(void)
                        while (1)
                        {
                                monster_race *r_ptr = &r_info[r];
-                               byte a, a2;
-                               char c, c2;
+                               char c;
                                int t;
 
                                byte da = (r_ptr->d_attr);
@@ -3914,13 +3998,7 @@ void do_cmd_visuals(void)
 #endif
 
                                Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
-
-                               a = da;
-                               c = dc;
-                               if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
-
-                               Term_putch(43, 19, a, c);
-                               if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
+                               Term_queue_bigchar(43, 19, da, dc, 0, 0);
 
                                /* Label the Current values */
 #ifdef JP
@@ -3932,14 +4010,7 @@ void do_cmd_visuals(void)
 #endif
 
                                Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
-
-                               a = ca;
-                               c = cc;
-                               if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
-
-                               Term_putch(43, 20, a, c);
-                               if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
-
+                               Term_queue_bigchar(43, 20, ca, cc, 0, 0);
 
                                /* Prompt */
 #ifdef JP
@@ -3996,8 +4067,7 @@ void do_cmd_visuals(void)
                        while (1)
                        {
                                object_kind *k_ptr = &k_info[k];
-                               byte a, a2;
-                               char c, c2;
+                               char c;
                                int t;
 
                                byte da = (byte)k_ptr->d_attr;
@@ -4027,13 +4097,7 @@ void do_cmd_visuals(void)
 #endif
 
                                Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
-                               a = da;
-                               c = dc;
-                               if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
-
-                               Term_putch(43, 19, a, c);
-                               if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
-
+                               Term_queue_bigchar(43, 19, da, dc, 0, 0);
 
                                /* Label the Current values */
 #ifdef JP
@@ -4045,13 +4109,7 @@ void do_cmd_visuals(void)
 #endif
 
                                Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
-                               a = ca;
-                               c = cc;
-                               if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
-
-                               Term_putch(43, 20, a, c);
-                               if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
-
+                               Term_queue_bigchar(43, 20, ca, cc, 0, 0);
 
                                /* Prompt */
 #ifdef JP
@@ -4095,6 +4153,7 @@ void do_cmd_visuals(void)
                else if (i == '8')
                {
                        static int f = 0;
+                       static int lighting_level = F_LIT_STANDARD;
 
                        /* Prompt */
 #ifdef JP
@@ -4108,24 +4167,24 @@ void do_cmd_visuals(void)
                        while (1)
                        {
                                feature_type *f_ptr = &f_info[f];
-                               byte a, a2;
-                               char c, c2;
+                               char c;
                                int t;
 
-                               byte da = (byte)f_ptr->d_attr;
-                               byte dc = (byte)f_ptr->d_char;
-                               byte ca = (byte)f_ptr->x_attr;
-                               byte cc = (byte)f_ptr->x_char;
+                               byte da = (byte)f_ptr->d_attr[lighting_level];
+                               byte dc = (byte)f_ptr->d_char[lighting_level];
+                               byte ca = (byte)f_ptr->x_attr[lighting_level];
+                               byte cc = (byte)f_ptr->x_char[lighting_level];
 
                                /* Label the object */
+                               prt("", 17, 5);
 #ifdef JP
                                Term_putstr(5, 17, -1, TERM_WHITE,
-                                           format("ÃÏ·Á = %d, Ì¾Á° = %-40.40s",
-                                                  f, (f_name + f_ptr->name)));
+                                           format("ÃÏ·Á = %d, Ì¾Á° = %s, ÌÀÅÙ = %s",
+                                                  f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
 #else
                                Term_putstr(5, 17, -1, TERM_WHITE,
-                                           format("Terrain = %d, Name = %-40.40s",
-                                                  f, (f_name + f_ptr->name)));
+                                           format("Terrain = %d, Name = %s, Lighting = %s",
+                                                  f, (f_name + f_ptr->name), lighting_level_str[lighting_level]));
 #endif
 
 
@@ -4139,12 +4198,8 @@ void do_cmd_visuals(void)
 #endif
 
                                Term_putstr(40, 19, -1, TERM_WHITE, empty_symbol);
-                               a = da;
-                               c = dc;
-                               if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
 
-                               Term_putch(43, 19, a, c);
-                               if (use_bigtile) Term_putch(43 + 1, 19, a2, c2);
+                               Term_queue_bigchar(43, 19, da, dc, 0, 0);
 
 
                                /* Label the Current values */
@@ -4157,21 +4212,15 @@ void do_cmd_visuals(void)
 #endif
 
                                Term_putstr(40, 20, -1, TERM_WHITE, empty_symbol);
-                               a = ca;
-                               c = cc;
-                               if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
-
-                               Term_putch(43, 20, a, c);
-                               if (use_bigtile) Term_putch(43 + 1, 20, a2, c2);
-
+                               Term_queue_bigchar(43, 20, ca, cc, 0, 0);
 
                                /* Prompt */
 #ifdef JP
                                Term_putstr(0, 22, -1, TERM_WHITE,
-                                           "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C): ");
+                                           "¥³¥Þ¥ó¥É (n/N/^N/a/A/^A/c/C/^C/l/L/^L): ");
 #else
                                Term_putstr(0, 22, -1, TERM_WHITE,
-                                           "Command (n/N/^N/a/A/^A/c/C/^C): ");
+                                           "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L): ");
 #endif
 
                                /* Get a command */
@@ -4190,14 +4239,17 @@ void do_cmd_visuals(void)
                                        cmd_visuals_aux(i, &f, max_f_idx);
                                        break;
                                case 'a':
-                                       t = (int)f_info[f].x_attr;
+                                       t = (int)f_info[f].x_attr[lighting_level];
                                        cmd_visuals_aux(i, &t, 256);
-                                       f_info[f].x_attr = (byte)t;
+                                       f_info[f].x_attr[lighting_level] = (byte)t;
                                        break;
                                case 'c':
-                                       t = (int)f_info[f].x_char;
+                                       t = (int)f_info[f].x_char[lighting_level];
                                        cmd_visuals_aux(i, &t, 256);
-                                       f_info[f].x_char = (byte)t;
+                                       f_info[f].x_char[lighting_level] = (byte)t;
+                                       break;
+                               case 'l':
+                                       cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
                                        break;
                                }
                        }
@@ -4325,7 +4377,7 @@ void do_cmd_colors(void)
                        sprintf(tmp, "%s.prf", player_name);
 
                        /* Query */
-                       if (!askfor_aux(tmp, 70)) continue;
+                       if (!askfor(tmp, 70)) continue;
 
                        /* Process the given filename */
                        (void)process_pref_file(tmp);
@@ -4364,7 +4416,7 @@ void do_cmd_colors(void)
                        sprintf(tmp, "%s.prf", player_name);
 
                        /* Get a filename */
-                       if (!askfor_aux(tmp, 70)) continue;
+                       if (!askfor(tmp, 70)) continue;
 
                        /* Build the filename */
                        path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
@@ -4846,6 +4898,7 @@ static cptr monster_group_text[] =
 {
 #ifdef JP
        "¥æ¥Ë¡¼¥¯",     /* "Uniques" */
+       "¾èÇϲÄǽ¤Ê¥â¥ó¥¹¥¿¡¼", /* "Riding" */
        "¥¢¥ê",
        "¥³¥¦¥â¥ê",
        "¥à¥«¥Ç",
@@ -4903,6 +4956,7 @@ static cptr monster_group_text[] =
        "µåÂÎ",
 #else
        "Uniques",
+       "Ridable monsters",
        "Ant",
        "Bat",
        "Centipede",
@@ -4955,7 +5009,7 @@ static cptr monster_group_text[] =
        "Yeti",
        "Zephyr Hound",
        "Mimic",
-       "Wall/Plant/Gus",
+       "Wall/Plant/Gas",
        "Mushroom patch",
        "Ball",
 #endif
@@ -4970,6 +5024,7 @@ static cptr monster_group_text[] =
 static cptr monster_group_char[] = 
 {
        (char *) -1L,
+       (char *) -2L,
        "a",
        "b",
        "c",
@@ -5071,6 +5126,9 @@ static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
        /* XXX Hack -- Check if this is the "Uniques" group */
        bool grp_unique = (monster_group_char[grp_cur] == (char *) -1L);
 
+       /* XXX Hack -- Check if this is the "Riding" group */
+       bool grp_riding = (monster_group_char[grp_cur] == (char *) -2L);
+
        /* Check every race */
        for (i = 0; i < max_r_idx; i++)
        {
@@ -5083,17 +5141,27 @@ static int collect_monsters(int grp_cur, s16b mon_idx[], byte mode)
                /* Require known monsters */
                if (!(mode & 0x02) && !cheat_know && !r_ptr->r_sights ) continue;
 
-               if (grp_unique && !(r_ptr->flags1 & RF1_UNIQUE)) continue;
+               if (grp_unique)
+               {
+                       if (!(r_ptr->flags1 & RF1_UNIQUE)) continue;
+               }
 
-               /* Check for race in the group */
-               if (grp_unique || strchr(group_char, r_ptr->d_char))
+               else if (grp_riding)
                {
-                       /* Add the race */
-                       mon_idx[mon_cnt++] = i;
+                       if (!(r_ptr->flags7 & RF7_RIDING)) continue;
+               }
 
-                       /* XXX Hack -- Just checking for non-empty group */
-                       if (mode & 0x01) break;
+               else
+               {
+                       /* Check for race in the group */
+                       if (!my_strchr(group_char, r_ptr->d_char)) continue;
                }
+
+               /* Add the race */
+               mon_idx[mon_cnt++] = i;
+
+               /* XXX Hack -- Just checking for non-empty group */
+               if (mode & 0x01) break;
        }
 
        /* Terminate the list */
@@ -5170,7 +5238,7 @@ static cptr object_group_text[] =
        "Rods",
        "Cards",
        "Capture Balls",
-       "Parchements",
+       "Parchments",
        "Spikes",
        "Boxs",
        "Figurines",
@@ -5219,7 +5287,7 @@ static byte object_group_tval[] =
        TV_ROD,
        TV_CARD,
        TV_CAPTURE,
-       TV_PARCHEMENT,
+       TV_PARCHMENT,
        TV_SPIKE,
        TV_CHEST,
        TV_FIGURINE,
@@ -5396,79 +5464,6 @@ static int collect_artifacts(int grp_cur, int object_idx[])
 static char hack[17] = "dwsorgbuDWvyRGBU";
 
 
-static errr photo_fgets(FILE *fff, char *buf, huge n)
-{
-       huge i = 0;
-
-       char *s;
-
-       char tmp[1024];
-
-       /* Read a line */
-       if (fgets(tmp, 1024, fff))
-       {
-               /* Convert weirdness */
-               for (s = tmp; *s; s++)
-               {
-                       /* Handle newline */
-                       if (*s == '\n')
-                       {
-                               /* Terminate */
-                               buf[i] = '\0';
-
-                               /* Success */
-                               return (0);
-                       }
-
-                       /* Handle tabs */
-                       else if (*s == '\t')
-                       {
-                               /* Hack -- require room */
-                               if (i + 8 >= n) break;
-
-                               /* Append a space */
-                               buf[i++] = ' ';
-
-                               /* Append some more spaces */
-                               while (!(i % 8)) buf[i++] = ' ';
-                       }
-
-#ifdef JP
-                       else if (iskanji(*s))
-                       {
-                               if (!s[1]) break;
-                               buf[i++] = *s++;
-                               buf[i++] = *s;
-                       }
-# ifndef EUC
-       /* È¾³Ñ¤«¤Ê¤ËÂбþ */
-                       else if ((((int)*s & 0xff) > 0xa1) && (((int)*s & 0xff ) < 0xdf))
-                       {
-                               buf[i++] = *s;
-                               if (i >= n) break;
-                       }
-# endif
-#endif
-                       /* Handle printables */
-                       else
-                       {
-                               /* Copy */
-                               buf[i++] = *s;
-
-                               /* Check length */
-                               if (i >= n) break;
-                       }
-               }
-       }
-
-       /* Nothing */
-       buf[0] = '\0';
-
-       /* Failure */
-       return (1);
-}
-
-
 /*
  * Hack -- load a screen dump from a file
  */
@@ -5515,32 +5510,46 @@ void do_cmd_load_screen(void)
 
 
        /* Load the screen */
-       for (y = 0; okay && (y < hgt); y++)
+       for (y = 0; okay; y++)
        {
-               /* Get a line of data */
-               if (photo_fgets(fff, buf, 1024)) okay = FALSE;
+               /* Get a line of data including control code */
+               if (!fgets(buf, 1024, fff)) okay = FALSE;
+
+               /* Get the blank line */
+               if (buf[0] == '\n' || buf[0] == '\0') break;
+
+               /* Ignore too large screen image */
+               if (y >= hgt) continue;
 
                /* Show each row */
                for (x = 0; x < wid - 1; x++)
                {
+                       /* End of line */
+                       if (buf[x] == '\n' || buf[x] == '\0') break;
+
                        /* Put the attr/char */
                        Term_draw(x, y, TERM_WHITE, buf[x]);
                }
        }
 
-       /* Get the blank line */
-       if (my_fgets(fff, buf, sizeof(buf))) okay = FALSE;
-
-
        /* Dump the screen */
-       for (y = 0; okay && (y < hgt); y++)
+       for (y = 0; okay; y++)
        {
-               /* Get a line of data */
-               if (photo_fgets(fff, buf, 1024)) okay = FALSE;
+               /* Get a line of data including control code */
+               if (!fgets(buf, 1024, fff)) okay = FALSE;
+
+               /* Get the blank line */
+               if (buf[0] == '\n' || buf[0] == '\0') break;
+
+               /* Ignore too large screen image */
+               if (y >= hgt) continue;
 
                /* Dump each row */
                for (x = 0; x < wid - 1; x++)
                {
+                       /* End of line */
+                       if (buf[x] == '\n' || buf[x] == '\0') break;
+
                        /* Get the attr/char */
                        (void)(Term_what(x, y, &a, &c));
 
@@ -5557,10 +5566,6 @@ void do_cmd_load_screen(void)
        }
 
 
-       /* Get the blank line */
-       if (my_fgets(fff, buf, sizeof(buf))) okay = FALSE;
-
-
        /* Close it */
        my_fclose(fff);
 
@@ -5590,215 +5595,124 @@ cptr inven_res_label =
  "                               AcElFiCoPoLiDkShSoNtNxCaDi BlFeCfFaSeHlEpSdRgLv";
 #endif
 
-/* XTRA HACK RESLIST */
-static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, 
-                                      int *j, byte tval, char *where)
-{
-  char o_name[MAX_NLEN];
-  u32b flgs[TR_FLAG_SIZE];
-
-  if (!o_ptr->k_idx)return;
-  if (o_ptr->tval != tval)return;
-
-       /* 
-       * HACK:Ring of Lordly protection and Dragon shield/helm
-       * have random resistances.
-       */
-  if ( ((o_ptr->tval >= TV_BOW && o_ptr->tval<= TV_DRAG_ARMOR && o_ptr->name2)
-       || (o_ptr->tval == TV_RING && o_ptr->sval == SV_RING_LORDLY) 
-       || (o_ptr->tval == TV_SHIELD && o_ptr->sval == SV_DRAGON_SHIELD) 
-       || (o_ptr->tval == TV_HELM && o_ptr->sval == SV_DRAGON_HELM) 
-       || (o_ptr->tval == TV_GLOVES && o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) 
-       || (o_ptr->tval == TV_BOOTS && o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) 
-       || o_ptr->art_name || o_ptr->name1) && object_known_p(o_ptr))
-    {
-      int i = 0;
-      object_desc(o_name, o_ptr, TRUE, 0);
 
-      while ( o_name[i] && i < 26 ){
 #ifdef JP
-       if (iskanji(o_name[i])) i++;
-#endif
-       i++;
-      }
-      if(i<28) while(i<28){o_name[i]=' ';i++;}
-      o_name[i]=0;
-      
-      fprintf(fff,"%s %s", where, o_name);
-
-      if (!(o_ptr->ident & (IDENT_MENTAL))) 
-       {
-#ifdef JP
-         fprintf(fff, "-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n");
+#define IM_FLAG_STR  "¡ö"
+#define HAS_FLAG_STR "¡Ü"
+#define NO_FLAG_STR  "¡¦"
 #else
-         fprintf(fff, "-------unknown------------ -------unknown------\n");
+#define IM_FLAG_STR  "* "
+#define HAS_FLAG_STR "+ "
+#define NO_FLAG_STR  ". "
 #endif
-       }
-      else {
-       object_flags_known(o_ptr, flgs);
-      
-#ifdef JP
-       if (have_flag(flgs, TR_IM_ACID)) fprintf(fff,"¡ö");
-       else if (have_flag(flgs, TR_RES_ACID)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
 
-       if (have_flag(flgs, TR_IM_ELEC)) fprintf(fff,"¡ö");
-       else if (have_flag(flgs, TR_RES_ELEC)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
+#define print_im_or_res_flag(IM, RES) \
+{ \
+       fputs(have_flag(flgs, (IM)) ? IM_FLAG_STR : \
+             (have_flag(flgs, (RES)) ? HAS_FLAG_STR : NO_FLAG_STR), fff); \
+}
 
-       if (have_flag(flgs, TR_IM_FIRE)) fprintf(fff,"¡ö");
-       else if (have_flag(flgs, TR_RES_FIRE)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
+#define print_flag(TR) \
+{ \
+       fputs(have_flag(flgs, (TR)) ? HAS_FLAG_STR : NO_FLAG_STR, fff); \
+}
 
-       if (have_flag(flgs, TR_IM_COLD)) fprintf(fff,"¡ö");
-       else if (have_flag(flgs, TR_RES_COLD)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_RES_POIS)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_RES_LITE)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_RES_DARK)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_RES_SHARDS)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_RES_SOUND)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_RES_NETHER)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_RES_NEXUS)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_RES_CHAOS)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_RES_DISEN)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       fprintf(fff," ");
-       
-       if (have_flag(flgs, TR_RES_BLIND)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_RES_FEAR)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_RES_CONF)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_FREE_ACT)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_SEE_INVIS)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
-       
-       if (have_flag(flgs, TR_HOLD_LIFE)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
 
-       if (have_flag(flgs, TR_TELEPATHY)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
+/* XTRA HACK RESLIST */
+static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr, int *j, byte tval, char *where)
+{
+       char o_name[MAX_NLEN];
+       u32b flgs[TR_FLAG_SIZE];
+
+       if (!o_ptr->k_idx) return;
+       if (o_ptr->tval != tval) return;
+
+       /* Identified items only */
+       if (!object_known_p(o_ptr)) return;
+
+       /*
+        * HACK:Ring of Lordly protection and Dragon equipment
+        * have random resistances.
+        */
+       if (((TV_WEARABLE_BEGIN <= tval) && (tval <= TV_WEARABLE_END) && o_ptr->name2)
+           || ((tval == TV_AMULET) && (o_ptr->sval == SV_AMULET_RESISTANCE))
+           || ((tval == TV_RING) && (o_ptr->sval == SV_RING_LORDLY))
+           || ((tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD))
+           || ((tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM))
+           || ((tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES))
+           || ((tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE))
+           || o_ptr->art_name || o_ptr->name1)
+       {
+               int i = 0;
+               object_desc(o_name, o_ptr, OD_NAME_ONLY);
 
-       if (have_flag(flgs, TR_SLOW_DIGEST)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
+               while (o_name[i] && (i < 26))
+               {
+#ifdef JP
+                       if (iskanji(o_name[i])) i++;
+#endif
+                       i++;
+               }
 
+               if (i < 28)
+               {
+                       while (i < 28)
+                       {
+                               o_name[i] = ' '; i++;
+                       }
+               }
+               o_name[i] = '\0';
 
-       if (have_flag(flgs, TR_REGEN)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
+               fprintf(fff, "%s %s", where, o_name);
 
-       if (have_flag(flgs, TR_FEATHER)) fprintf(fff,"¡Ü");
-       else fprintf(fff,"¡¦");
+               if (!(o_ptr->ident & (IDENT_MENTAL)))
+               {
+#ifdef JP
+                       fputs("-------ÉÔÌÀ--------------- -------ÉÔÌÀ---------\n", fff);
 #else
-       if (have_flag(flgs, TR_IM_ACID)) fprintf(fff,"* ");
-       else if (have_flag(flgs, TR_RES_ACID)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-
-       if (have_flag(flgs, TR_IM_ELEC)) fprintf(fff,"* ");
-       else if (have_flag(flgs, TR_RES_ELEC)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-
-       if (have_flag(flgs, TR_IM_FIRE)) fprintf(fff,"* ");
-       else if (have_flag(flgs, TR_RES_FIRE)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-
-       if (have_flag(flgs, TR_IM_COLD)) fprintf(fff,"* ");
-       else if (have_flag(flgs, TR_RES_COLD)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_RES_POIS)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_RES_LITE)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_RES_DARK)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_RES_SHARDS)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_RES_SOUND)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_RES_NETHER)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_RES_NEXUS)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_RES_CHAOS)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_RES_DISEN)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       fprintf(fff," ");
-       
-       if (have_flag(flgs, TR_RES_BLIND)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_RES_FEAR)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_RES_CONF)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_FREE_ACT)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_SEE_INVIS)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-       
-       if (have_flag(flgs, TR_HOLD_LIFE)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-
-       if (have_flag(flgs, TR_TELEPATHY)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
+                       fputs("-------unknown------------ -------unknown------\n", fff);
+#endif
+               }
+               else
+               {
+                       object_flags_known(o_ptr, flgs);
 
-       if (have_flag(flgs, TR_SLOW_DIGEST)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
+                       print_im_or_res_flag(TR_IM_ACID, TR_RES_ACID);
+                       print_im_or_res_flag(TR_IM_ELEC, TR_RES_ELEC);
+                       print_im_or_res_flag(TR_IM_FIRE, TR_RES_FIRE);
+                       print_im_or_res_flag(TR_IM_COLD, TR_RES_COLD);
+                       print_flag(TR_RES_POIS);
+                       print_flag(TR_RES_LITE);
+                       print_flag(TR_RES_DARK);
+                       print_flag(TR_RES_SHARDS);
+                       print_flag(TR_RES_SOUND);
+                       print_flag(TR_RES_NETHER);
+                       print_flag(TR_RES_NEXUS);
+                       print_flag(TR_RES_CHAOS);
+                       print_flag(TR_RES_DISEN);
 
+                       fputs(" ", fff);
 
-       if (have_flag(flgs, TR_REGEN)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
+                       print_flag(TR_RES_BLIND);
+                       print_flag(TR_RES_FEAR);
+                       print_flag(TR_RES_CONF);
+                       print_flag(TR_FREE_ACT);
+                       print_flag(TR_SEE_INVIS);
+                       print_flag(TR_HOLD_LIFE);
+                       print_flag(TR_TELEPATHY);
+                       print_flag(TR_SLOW_DIGEST);
+                       print_flag(TR_REGEN);
+                       print_flag(TR_FEATHER);
 
-       if (have_flag(flgs, TR_FEATHER)) fprintf(fff,"+ ");
-       else fprintf(fff,". ");
-#endif 
-       fprintf(fff,"\n");
-      }
-      (*j)++;
-      if(*j==9)
-       { 
-         *j=0;
-         fprintf(fff,"%s\n", inven_res_label);
+                       fputc('\n', fff);
+               }
+               (*j)++;
+               if (*j == 9)
+               {
+                       *j = 0;
+                       fprintf(fff, "%s\n", inven_res_label);
+               }
        }
-    }
 }
 
 /*
@@ -5806,23 +5720,22 @@ static void do_cmd_knowledge_inven_aux(FILE *fff, object_type *o_ptr,
  */
 static void do_cmd_knowledge_inven(void)
 {
-
        FILE *fff;
 
        char file_name[1024];
+
        store_type  *st_ptr;
-       object_type *o_ptr;
 
        byte tval;
-       int i=0;
-       int j=0;
+       int i = 0;
+       int j = 0;
 
        char  where[32];
 
        /* Open a new file */
        fff = my_fopen_temp(file_name, 1024);
-       if (!fff) {
+       if (!fff)
+       {
 #ifdef JP
            msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name);
 #else
@@ -5831,55 +5744,50 @@ static void do_cmd_knowledge_inven(void)
            msg_print(NULL);
            return;
        }
-       fprintf(fff,"%s\n",inven_res_label);
+       fprintf(fff, "%s\n", inven_res_label);
 
-       for (tval=TV_BOW; tval <= TV_RING; tval++){
+       for (tval = TV_WEARABLE_BEGIN; tval <= TV_WEARABLE_END; tval++)
+       {
+               if (j != 0)
+               {
+                       for (; j < 9; j++) fputc('\n', fff);
+                       j = 0;
+                       fprintf(fff, "%s\n", inven_res_label);
+               }
 
-         if (j!=0) {
-             for (;j<9;j++) fprintf(fff, "\n");
-             j=0;
-             fprintf(fff,"%s\n",inven_res_label);              
-         }
-         
 #ifdef JP
-         strcpy(where, "Áõ");
+               strcpy(where, "Áõ");
 #else
-         strcpy(where, "E ");
+               strcpy(where, "E ");
 #endif
-         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
-           {
-             o_ptr = &inventory[i];
-             do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
-           }
-         
+               for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
+               {
+                       do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
+               }
+
 #ifdef JP
-         strcpy(where, "»ý");
+               strcpy(where, "»ý");
 #else
-         strcpy(where, "I ");
+               strcpy(where, "I ");
 #endif
-         for (i = 0; i < INVEN_PACK; i++)
-           {
-             o_ptr = &inventory[i];
-             do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
-           }
-         
-         
-         /* Print all homes in the different towns */
-         st_ptr = &town[1].store[STORE_HOME];
+               for (i = 0; i < INVEN_PACK; i++)
+               {
+                       do_cmd_knowledge_inven_aux(fff, &inventory[i], &j, tval, where);
+               }
+
+               st_ptr = &town[1].store[STORE_HOME];
 #ifdef JP
-         strcpy(where, "²È");
+               strcpy(where, "²È");
 #else
-         strcpy(where, "H ");
+               strcpy(where, "H ");
 #endif
-             
-         /* Dump all available items */
-         for (i = 0; i < st_ptr->stock_num; i++)
-           {
-             o_ptr = &st_ptr->stock[i];
-             do_cmd_knowledge_inven_aux(fff, o_ptr, &j, tval, where);
-           }
+
+               for (i = 0; i < st_ptr->stock_num; i++)
+               {
+                       do_cmd_knowledge_inven_aux(fff, &st_ptr->stock[i], &j, tval, where);
+               }
        }
-         
+
        /* Close the file */
        my_fclose(fff);
 
@@ -6492,8 +6400,11 @@ static void do_cmd_knowledge_artifacts(void)
                        /* Make it an artifact */
                        q_ptr->name1 = (byte)who[k];
 
+                       /* Display as if known */
+                       q_ptr->ident |= IDENT_STORE;
+
                        /* Describe the artifact */
-                       object_desc_store(base_name, q_ptr, FALSE, 0);
+                       object_desc(base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
                }
 
                /* Hack -- Build the artifact name */
@@ -6851,25 +6762,25 @@ void plural_aux(char *Name)
 {
        int NameLen = strlen(Name);
 
-       if (strstr(Name, "Disembodied hand"))
+       if (my_strstr(Name, "Disembodied hand"))
        {
                strcpy(Name, "Disembodied hands that strangled people");
        }
-       else if (strstr(Name, "Colour out of space"))
+       else if (my_strstr(Name, "Colour out of space"))
        {
                strcpy(Name, "Colours out of space");
        }
-       else if (strstr(Name, "stairway to hell"))
+       else if (my_strstr(Name, "stairway to hell"))
        {
                strcpy(Name, "stairways to hell");
        }
-       else if (strstr(Name, "Dweller on the threshold"))
+       else if (my_strstr(Name, "Dweller on the threshold"))
        {
                strcpy(Name, "Dwellers on the threshold");
        }
-       else if (strstr(Name, " of "))
+       else if (my_strstr(Name, " of "))
        {
-               cptr aider = strstr(Name, " of ");
+               cptr aider = my_strstr(Name, " of ");
                char dummy[80];
                int i = 0;
                cptr ctr = Name;
@@ -6893,7 +6804,7 @@ void plural_aux(char *Name)
                strcpy(&(dummy[i+1]), aider);
                strcpy(Name, dummy);
        }
-       else if (strstr(Name, "coins"))
+       else if (my_strstr(Name, "coins"))
        {
                char dummy[80];
                strcpy(dummy, "piles of ");
@@ -6901,7 +6812,7 @@ void plural_aux(char *Name)
                strcpy(Name, dummy);
                return;
        }
-       else if (strstr(Name, "Manes"))
+       else if (my_strstr(Name, "Manes"))
        {
                return;
        }
@@ -6975,6 +6886,7 @@ static void do_cmd_knowledge_pets(void)
        int             i;
        FILE            *fff;
        monster_type    *m_ptr;
+       char            pet_name[80];
        int             t_friends = 0;
        int             show_upkeep = 0;
        char            file_name[1024];
@@ -7004,17 +6916,9 @@ static void do_cmd_knowledge_pets(void)
                /* Calculate "upkeep" for pets */
                if (is_pet(m_ptr))
                {
-                       char pet_name[80];
                        t_friends++;
-                       monster_desc(pet_name, m_ptr, 0x88);
-                       fprintf(fff, "%s (%s)", pet_name, look_mon_desc(i, 0x00));
-                       if (p_ptr->riding == i)
-#ifdef JP
-                               fprintf(fff, " ¾èÇÏÃæ");
-#else
-                               fprintf(fff, " Riding");
-#endif
-                       fprintf(fff, "\n");
+                       monster_desc(pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
+                       fprintf(fff, "%s (%s)\n", pet_name, look_mon_desc(m_ptr, 0x00));
                }
        }
 
@@ -7176,14 +7080,14 @@ static void do_cmd_knowledge_kill_count(void)
                        {
 #ifdef JP
                                /* p,t¤Ï¿Í¤È¿ô¤¨¤ë by ita*/
-                               if(strchr("pt",r_ptr->d_char))
+                               if(my_strchr("pt",r_ptr->d_char))
                                        fprintf(fff, "     %3d ¿Í¤Î %s\n", This, r_name + r_ptr->name);
                                else
                                        fprintf(fff, "     %3d É¤¤Î %s\n", This, r_name + r_ptr->name);
 #else
                                if (This < 2)
                                {
-                                       if (strstr(r_name + r_ptr->name, "coins"))
+                                       if (my_strstr(r_name + r_ptr->name, "coins"))
                                        {
                                                fprintf(fff, "     1 pile of %s\n", (r_name + r_ptr->name));
                                        }
@@ -7395,8 +7299,8 @@ static void display_visual_list(int col, int row, int height, int width, byte at
                /* Display columns until done */
                for (j = 0; j < width; j++)
                {
-                       byte a, a2;
-                       char c, c2;
+                       byte a;
+                       char c;
                        int x = col + j;
                        int y = row + i;
                        int ia, ic;
@@ -7418,13 +7322,8 @@ static void display_visual_list(int col, int row, int height, int width, byte at
                        /* Force correct code for both ASCII character and tile */
                        if (c & 0x80) a |= 0x80;
 
-                       if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
-
                        /* Display symbol */
-                       Term_putch(x, y, a, c);
-
-                       /* Second byte */
-                       if (use_bigtile) Term_putch(x + 1, y, a2, c2);
+                       Term_queue_bigchar(x, y, a, c, 0, 0);
                }
        }
 }
@@ -7455,13 +7354,17 @@ static void place_visual_list_cursor(int col, int row, byte a, byte c, byte attr
 static byte attr_idx = 0;
 static byte char_idx = 0;
 
+/* Hack -- for feature lighting */
+static byte attr_idx_feat[F_LIT_MAX] = {0, 0, 0, 0};
+static byte char_idx_feat[F_LIT_MAX] = {0, 0, 0, 0};
+
 /*
  *  Do visual mode command -- Change symbols
  */
 static bool visual_mode_command(char ch, bool *visual_list_ptr, 
-                               int height, int width, 
-                               byte *attr_top_ptr, byte *char_left_ptr, 
-                               byte *cur_attr_ptr, byte *cur_char_ptr)
+                               int height, int width,
+                               byte *attr_top_ptr, byte *char_left_ptr,
+                               byte *cur_attr_ptr, byte *cur_char_ptr, bool *need_redraw)
 {
        static byte attr_old = 0, char_old = 0;
 
@@ -7486,6 +7389,7 @@ static bool visual_mode_command(char ch, bool *visual_list_ptr,
                {
                        /* Accept change */
                        *visual_list_ptr = FALSE;
+                       *need_redraw = TRUE;
 
                        return TRUE;
                }
@@ -7509,19 +7413,30 @@ static bool visual_mode_command(char ch, bool *visual_list_ptr,
 
        case 'C':
        case 'c':
-               /* Set the visual */
-               attr_idx = *cur_attr_ptr;
-               char_idx = *cur_char_ptr;
+               {
+                       int i;
 
+                       /* Set the visual */
+                       attr_idx = *cur_attr_ptr;
+                       char_idx = *cur_char_ptr;
+
+                       /* Hack -- for feature lighting */
+                       for (i = 0; i < F_LIT_MAX; i++)
+                       {
+                               attr_idx_feat[i] = 0;
+                               char_idx_feat[i] = 0;
+                       }
+               }
                return TRUE;
 
        case 'P':
        case 'p':
-               if (attr_idx)
+               if (attr_idx || (!(char_idx & 0x80) && char_idx)) /* Allow ATTR_DARK text */
                {
                        /* Set the char */
                        *cur_attr_ptr = attr_idx;
                        *attr_top_ptr = MAX(0, (*cur_attr_ptr & 0x7f) - 5);
+                       if (!*visual_list_ptr) *need_redraw = TRUE;
                }
 
                if (char_idx)
@@ -7529,6 +7444,7 @@ static bool visual_mode_command(char ch, bool *visual_list_ptr,
                        /* Set the char */
                        *cur_char_ptr = char_idx;
                        *char_left_ptr = MAX(0, *cur_char_ptr - 10);
+                       if (!*visual_list_ptr) *need_redraw = TRUE;
                }
 
                return TRUE;
@@ -7543,7 +7459,7 @@ static bool visual_mode_command(char ch, bool *visual_list_ptr,
 
                        if (use_bigtile) eff_width = width / 2;
                        else eff_width = width;
-                                       
+
                        /* Restrict direction */
                        if ((a == 0) && (ddy[d] < 0)) d = 0;
                        if ((c == 0) && (ddx[d] < 0)) d = 0;
@@ -7589,8 +7505,6 @@ static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
        for (i = 0; i < per_page && mon_idx[mon_top + i]; i++)
        {
                byte attr;
-               byte a, a2;
-               char c, c2;
 
                /* Get the race index */
                int r_idx = mon_idx[mon_top + i] ;
@@ -7615,15 +7529,9 @@ static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
                        c_prt(attr, format("%d", r_idx), row + i, 60);
                }
 
-               a = r_ptr->x_attr;
-               c = r_ptr->x_char;
-               if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
-
                /* Display symbol */
-               Term_putch(70, row + i, a, c);
+               Term_queue_bigchar(70, row + i, r_ptr->x_attr, r_ptr->x_char, 0, 0);
 
-               /* Second byte */
-               if (use_bigtile) Term_putch(70 + 1, row + i, a2, c2);
 
                /* Display kills */
                if (!(r_ptr->flags1 & RF1_UNIQUE)) put_str(format("%5d", r_ptr->r_pkills), row + i, 73);
@@ -7646,7 +7554,7 @@ static void display_monster_list(int col, int row, int per_page, s16b mon_idx[],
 /*
  * Display known monsters.
  */
-static void do_cmd_knowledge_monsters(void)
+static void do_cmd_knowledge_monsters(bool *need_redraw)
 {
        int i, len, max;
        int grp_cur, grp_top, old_grp_cur;
@@ -7654,7 +7562,7 @@ static void do_cmd_knowledge_monsters(void)
        int grp_cnt, grp_idx[100];
        int mon_cnt;
        s16b *mon_idx;
-       
+
        int column = 0;
        bool flag;
        bool redraw;
@@ -7805,11 +7713,11 @@ static void do_cmd_knowledge_monsters(void)
                {
                        Term_gotoxy(max + 3, 6 + (mon_cur - mon_top));
                }
-       
+
                ch = inkey();
 
                /* Do visual mode command if needed */
-               if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &r_ptr->x_attr, &r_ptr->x_char)) continue;
+               if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &r_ptr->x_attr, &r_ptr->x_char, need_redraw)) continue;
 
                switch (ch)
                {
@@ -7861,8 +7769,7 @@ static void display_object_list(int col, int row, int per_page, int object_idx[]
        for (i = 0; i < per_page && object_idx[object_top + i]; i++)
        {
                char o_name[80];
-               byte a, a2;
-               char c, c2;
+               byte a, c;
 
                /* Get the object index */
                int k_idx = object_idx[object_top + i];
@@ -7902,13 +7809,8 @@ static void display_object_list(int col, int row, int per_page, int object_idx[]
                        a = TERM_DARK;
                }
 
-               if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
-
                /* Display symbol */
-               Term_putch(76, row + i, a, c);
-
-               /* Second byte */
-               if (use_bigtile) Term_putch(76 + 1, row + i, a2, c2);
+               Term_queue_bigchar(76, row + i, a, c, 0, 0);
        }
 
        /* Clear remaining lines */
@@ -7963,7 +7865,7 @@ static void desc_obj_fake(int k_idx)
 /*
  * Display known objects
  */
-static void do_cmd_knowledge_objects(void)
+static void do_cmd_knowledge_objects(bool *need_redraw)
 {
        int i, len, max;
        int grp_cur, grp_top, old_grp_cur;
@@ -8103,7 +8005,7 @@ static void do_cmd_knowledge_objects(void)
 
                /* Prompt */
 #ifdef JP
-               prt(format("<Êý¸þ>, 'r'¤Ç»×¤¤½Ð¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
+               prt(format("<Êý¸þ>, 'r'¤Ç¾ÜºÙ¤ò¸«¤ë%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
 #else
                prt(format("<dir>, 'r' to recall%s%s, ESC", k_ptr->flavor ? "" : visual_list ? ", ENTER to accept" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0);
 #endif
@@ -8130,12 +8032,12 @@ static void do_cmd_knowledge_objects(void)
                {
                        Term_gotoxy(max + 3, 6 + (object_cur - object_top));
                }
-       
+
                ch = inkey();
 
                /* Do visual mode command if needed */
                /* Symbol of objects with flavor cannot be changed */
-               if (!k_ptr->flavor && visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &k_ptr->x_attr, &k_ptr->x_char)) continue;
+               if (!k_ptr->flavor && visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &k_ptr->x_attr, &k_ptr->x_char, need_redraw)) continue;
 
                switch (ch)
                {
@@ -8170,20 +8072,26 @@ static void do_cmd_knowledge_objects(void)
 }
 
 
-
 /*
  * Display the features in a group.
  */
 static void display_feature_list(int col, int row, int per_page, int *feat_idx,
-       int feat_cur, int feat_top)
+       int feat_cur, int feat_top, int lighting_level)
 {
        int i;
+       int col2 = 67;
+       int col3 = 69;
+       int col4 = 71;
+
+       /* Correct columns 1 and 4 */
+       if (use_bigtile)
+       {
+               col2++; col3 += 2; col4 += 3;
+       }
 
        /* Display lines until done */
        for (i = 0; i < per_page && feat_idx[feat_top + i]; i++)
        {
-               byte a, a2;
-               char c, c2;
                byte attr;
 
                /* Get the index */
@@ -8201,19 +8109,30 @@ static void display_feature_list(int col, int row, int per_page, int *feat_idx,
                /* Hack -- visual_list mode */
                if (per_page == 1)
                {
-                       c_prt(attr, format("%02x/%02x", f_ptr->x_attr, f_ptr->x_char), row + i, 60);
+                       /* Display lighting level */
+                       c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row + i, col + 1 + strlen(f_name + f_ptr->name));
+
+                       c_prt(attr, format("%02x/%02x", f_ptr->x_attr[lighting_level], f_ptr->x_char[lighting_level]), row + i, 56);
                }
 
-               a = f_ptr->x_attr;
-               c = f_ptr->x_char;
+               /* Display symbol */
+               Term_queue_bigchar(65, row + i, f_ptr->x_attr[F_LIT_STANDARD], f_ptr->x_char[F_LIT_STANDARD], 0, 0);
 
-               if (use_bigtile) bigtile_attr(&c, &a, &c2, &a2);
+               Term_putch(col2, row + i, TERM_SLATE, '(');
+               Term_putch(col3, row + i, TERM_SLATE, '/');
+               Term_putch(col4, row + i, TERM_SLATE, '/');
+               Term_putch(col4 + (use_bigtile ? 3 : 2), row + i, TERM_SLATE, ')');
 
-               /* Display symbol */
-               Term_putch(68, row + i, a, c);
+               /* Mega-hack */
+
+               /* Use lightened colour */
+               Term_queue_bigchar(col2 + 1, row + i, f_ptr->x_attr[F_LIT_LITE], f_ptr->x_char[F_LIT_LITE], 0, 0);
+
+               /* Use darkened colour */
+               Term_queue_bigchar(col3 + 1, row + i, f_ptr->x_attr[F_LIT_DARK], f_ptr->x_char[F_LIT_DARK], 0, 0);
 
-               /* Second byte */
-               if (use_bigtile) Term_putch(68 + 1, row + i, a2, c2);
+               /* Use darkly darkened colour */
+               Term_queue_bigchar(col4 + 1, row + i, f_ptr->x_attr[F_LIT_DARKDARK], f_ptr->x_char[F_LIT_DARKDARK], 0, 0);
        }
 
        /* Clear remaining lines */
@@ -8227,7 +8146,7 @@ static void display_feature_list(int col, int row, int per_page, int *feat_idx,
 /*
  * Interact with feature visuals.
  */
-static void do_cmd_knowledge_features(void)
+static void do_cmd_knowledge_features(bool *need_redraw)
 {
        int i, len, max;
        int grp_cur, grp_top, old_grp_cur;
@@ -8235,7 +8154,7 @@ static void do_cmd_knowledge_features(void)
        int grp_cnt, grp_idx[100];
        int feat_cnt;
        int *feat_idx;
-       
+
        int column = 0;
        bool flag;
        bool redraw;
@@ -8246,6 +8165,11 @@ static void do_cmd_knowledge_features(void)
        int browser_rows;
        int wid, hgt;
 
+       byte attr_old[F_LIT_MAX] = {0, 0, 0, 0};
+       byte char_old[F_LIT_MAX] = {0, 0, 0, 0};
+       byte *cur_attr_ptr, *cur_char_ptr;
+       int lighting_level = F_LIT_STANDARD;
+
        /* Get size */
        Term_get_size(&wid, &hgt);
 
@@ -8293,11 +8217,20 @@ static void do_cmd_knowledge_features(void)
                if (redraw)
                {
                        clear_from(0);
-               
+
+#ifdef JP
+                       prt("ɽ¼¨ - ÃÏ·Á", 2, 0);
+                       prt("¥°¥ë¡¼¥×", 4, 0);
+                       prt("̾Á°", 4, max + 3);
+                       if (use_bigtile) prt("ʸ»ú ( l/ d/ D)", 4, 63);
+                       else prt("ʸ»ú (l/d/D)", 4, 62);
+#else
                        prt("Visuals - features", 2, 0);
                        prt("Group", 4, 0);
                        prt("Name", 4, max + 3);
-                       prt("Sym", 4, 67);
+                       if (use_bigtile) prt("Sym ( l/ d/ D)", 4, 64);
+                       else prt("Sym (l/d/D)", 4, 63);
+#endif
 
                        for (i = 0; i < 78; i++)
                        {
@@ -8336,14 +8269,14 @@ static void do_cmd_knowledge_features(void)
                if (!visual_list)
                {
                        /* Display a list of features in the current group */
-                       display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top);
+                       display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, F_LIT_STANDARD);
                }
                else
                {
                        feat_top = feat_cur;
 
                        /* Display a list of features in the current group */
-                       display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top);
+                       display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, lighting_level);
 
                        /* Display visual list below first object */
                        display_visual_list(max + 3, 7, browser_rows-1, wid - (max + 3), attr_top, char_left);
@@ -8351,17 +8284,19 @@ static void do_cmd_knowledge_features(void)
 
                /* Prompt */
 #ifdef JP
-               prt(format("<Êý¸þ>%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
+               prt(format("<Êý¸þ>%s%s, ESC", visual_list ? ", ENTER¤Ç·èÄê, 'a'¤ÇÂоÝÌÀÅÙÊѹ¹" : ", 'v'¤Ç¥·¥ó¥Ü¥ëÊѹ¹", (attr_idx||char_idx) ? ", 'c', 'p'¤Ç¥Ú¡¼¥¹¥È" : ", 'c'¤Ç¥³¥Ô¡¼"), hgt - 1, 0);
 #else
-               prt(format("<dir>%s%s, ESC", visual_list ? ", ENTER to accept" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0);
+               prt(format("<dir>%s%s, ESC", visual_list ? ", ENTER to accept, 'a' for lighting level" : ", 'v' for visuals", (attr_idx||char_idx) ? ", 'c', 'p' to paste" : ", 'c' to copy"), hgt - 1, 0);
 #endif
 
                /* Get the current feature */
                f_ptr = &f_info[feat_idx[feat_cur]];
+               cur_attr_ptr = &f_ptr->x_attr[lighting_level];
+               cur_char_ptr = &f_ptr->x_char[lighting_level];
 
                if (visual_list)
                {
-                       place_visual_list_cursor(max + 3, 7, f_ptr->x_attr, f_ptr->x_char, attr_top, char_left);
+                       place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
                }
                else if (!column)
                {
@@ -8371,11 +8306,85 @@ static void do_cmd_knowledge_features(void)
                {
                        Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
                }
-       
+
                ch = inkey();
 
+               if ((ch == 'A') && visual_list)
+               {
+                       if (lighting_level <= F_LIT_STANDARD) lighting_level = F_LIT_DARKDARK;
+                       else lighting_level--;
+                       attr_top = MAX(0, (f_ptr->x_attr[lighting_level] & 0x7f) - 5);
+                       char_left = MAX(0, f_ptr->x_char[lighting_level] - 10);
+                       continue;
+               }
+
+               else if ((ch == 'a') && visual_list)
+               {
+                       if (lighting_level >= F_LIT_DARKDARK) lighting_level = F_LIT_STANDARD;
+                       else lighting_level++;
+                       attr_top = MAX(0, (f_ptr->x_attr[lighting_level] & 0x7f) - 5);
+                       char_left = MAX(0, f_ptr->x_char[lighting_level] - 10);
+                       continue;
+               }
+
                /* Do visual mode command if needed */
-               if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, &f_ptr->x_attr, &f_ptr->x_char)) continue;
+               else if (visual_mode_command(ch, &visual_list, browser_rows-1, wid - (max + 3), &attr_top, &char_left, cur_attr_ptr, cur_char_ptr, need_redraw))
+               {
+                       switch (ch)
+                       {
+                       /* Restore previous visual settings */
+                       case ESCAPE:
+                               for (i = 0; i < F_LIT_MAX; i++)
+                               {
+                                       f_ptr->x_attr[i] = attr_old[i];
+                                       f_ptr->x_char[i] = char_old[i];
+                               }
+
+                               /* Fall through */
+
+                       case '\n':
+                       case '\r':
+                               lighting_level = F_LIT_STANDARD;
+                               break;
+
+                       /* Preserve current visual settings */
+                       case 'V':
+                       case 'v':
+                               for (i = 0; i < F_LIT_MAX; i++)
+                               {
+                                       attr_old[i] = f_ptr->x_attr[i];
+                                       char_old[i] = f_ptr->x_char[i];
+                               }
+                               lighting_level = F_LIT_STANDARD;
+                               break;
+
+                       case 'C':
+                       case 'c':
+                               if (!visual_list)
+                               {
+                                       for (i = 0; i < F_LIT_MAX; i++)
+                                       {
+                                               attr_idx_feat[i] = f_ptr->x_attr[i];
+                                               char_idx_feat[i] = f_ptr->x_char[i];
+                                       }
+                               }
+                               break;
+
+                       case 'P':
+                       case 'p':
+                               if (!visual_list)
+                               {
+                                       /* Allow ATTR_DARK text */
+                                       for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
+                                       {
+                                               if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
+                                               if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
+                                       }
+                               }
+                               break;
+                       }
+                       continue;
+               }
 
                switch (ch)
                {
@@ -8427,6 +8436,8 @@ static void do_cmd_knowledge_kubi(void)
        
        if (fff)
        {
+               bool listed = FALSE;
+
 #ifdef JP
                fprintf(fff, "º£Æü¤Î¥¿¡¼¥²¥Ã¥È : %s\n", (p_ptr->today_mon ? r_name + r_info[p_ptr->today_mon].name : "ÉÔÌÀ"));
                fprintf(fff, "\n");
@@ -8436,17 +8447,25 @@ static void do_cmd_knowledge_kubi(void)
                fprintf(fff, "\n");
                fprintf(fff, "List of wanted monsters\n");
 #endif
+               fprintf(fff, "----------------------------------------------\n");
+
                for (i = 0; i < MAX_KUBI; i++)
                {
-                       fprintf(fff,"%-40s ---- ",r_name + r_info[(kubi_r_idx[i] > 10000 ? kubi_r_idx[i] - 10000 : kubi_r_idx[i])].name);
-                       if (kubi_r_idx[i] > 10000)
+                       if (kubi_r_idx[i] <= 10000)
+                       {
+                               fprintf(fff,"%s\n", r_name + r_info[kubi_r_idx[i]].name);
+
+                               listed = TRUE;
+                       }
+               }
+
+               if (!listed)
+               {
 #ifdef JP
-                               fprintf(fff, "ºÑ\n");
+                       fprintf(fff,"\n%s\n", "¾Þ¶â¼ó¤Ï¤â¤¦»Ä¤Ã¤Æ¤¤¤Þ¤»¤ó¡£");
 #else
-                               fprintf(fff, "done\n");
+                       fprintf(fff,"\n%s\n", "There is no more wanted monster.");
 #endif
-                       else
-                               fprintf(fff, "$%d\n", 300 * (r_info[kubi_r_idx[i]].level + 1));
                }
        }
        
@@ -8880,9 +8899,9 @@ void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
                                {
                                        sprintf(tmp_str,
 #ifdef JP
-                                               "  %-40s (%2d³¬)            -   ÉÔÀᄀ\n",
+                                               "  %-40s (%3d³¬)            -   ÉÔÀᄀ\n",
 #else
-                                               "  %-40s (Dungeon level: %2d) - (Cancelled)\n",
+                                               "  %-40s (Dungeon level: %3d) - (Cancelled)\n",
 #endif
                                                r_name+r_info[quest[q_idx].r_idx].name,
                                                quest[q_idx].level);
@@ -8891,9 +8910,9 @@ void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
                                {
                                        sprintf(tmp_str,
 #ifdef JP
-                                               "  %-40s (%2d³¬)            - ¥ì¥Ù¥ë%2d\n",
+                                               "  %-40s (%3d³¬)            - ¥ì¥Ù¥ë%2d\n",
 #else
-                                               "  %-40s (Dungeon level: %2d) - level %2d\n",
+                                               "  %-40s (Dungeon level: %3d) - level %2d\n",
 #endif
                                                r_name+r_info[quest[q_idx].r_idx].name,
                                                quest[q_idx].level,
@@ -8904,10 +8923,10 @@ void do_cmd_knowledge_quests_completed(FILE *fff, int quest_num[])
                        {
                                /* Print the quest info */
 #ifdef JP
-                               sprintf(tmp_str, "  %-40s (´í¸±ÅÙ:%2d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
+                               sprintf(tmp_str, "  %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
                                        quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
 #else
-                               sprintf(tmp_str, "  %-40s (Danger level: %2d)  - level %2d\n",
+                               sprintf(tmp_str, "  %-40s (Danger  level: %3d) - level %2d\n",
                                        quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
 #endif
                        }
@@ -8968,10 +8987,10 @@ void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
                        {
                                /* Print the quest info */
 #ifdef JP
-                               sprintf(tmp_str, "  %-40s (%2d³¬)            - ¥ì¥Ù¥ë%2d\n",
+                               sprintf(tmp_str, "  %-40s (%3d³¬)            - ¥ì¥Ù¥ë%2d\n",
                                        r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
 #else
-                               sprintf(tmp_str, "  %-40s (Dungeon level: %2d) - level %2d\n",
+                               sprintf(tmp_str, "  %-40s (Dungeon level: %3d) - level %2d\n",
                                        r_name+r_info[quest[q_idx].r_idx].name, quest[q_idx].level, quest[q_idx].complev);
 #endif
                        }
@@ -8979,10 +8998,10 @@ void do_cmd_knowledge_quests_failed(FILE *fff, int quest_num[])
                        {
                                /* Print the quest info */
 #ifdef JP
-                               sprintf(tmp_str, "  %-40s (´í¸±ÅÙ:%2d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
+                               sprintf(tmp_str, "  %-40s (´í¸±ÅÙ:%3d³¬ÁêÅö) - ¥ì¥Ù¥ë%2d\n",
                                        quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
 #else
-                               sprintf(tmp_str, "  %-40s (Danger level: %2d)  - level %2d\n",
+                               sprintf(tmp_str, "  %-40s (Danger  level: %3d) - level %2d\n",
                                        quest[q_idx].name, quest[q_idx].level, quest[q_idx].complev);
 #endif
                        }
@@ -9179,7 +9198,7 @@ static void do_cmd_knowledge_home(void)
                        {
 #ifdef JP
                                if ((i % 12) == 0) fprintf(fff, "\n ( %d ¥Ú¡¼¥¸ )\n", x++);
-                               object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
+                               object_desc(o_name, &st_ptr->stock[i], 0);
                                if (strlen(o_name) <= 80-3)
                                {
                                        fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
@@ -9196,7 +9215,7 @@ static void do_cmd_knowledge_home(void)
                                        fprintf(fff, "   %.77s\n", o_name+n);
                                }
 #else
-                               object_desc(o_name, &st_ptr->stock[i], TRUE, 3);
+                               object_desc(o_name, &st_ptr->stock[i], 0);
                                fprintf(fff, "%c%s %s\n", I2A(i%12), paren, o_name);
 #endif
 
@@ -9329,16 +9348,21 @@ static void do_cmd_knowledge_autopick(void)
  */
 void do_cmd_knowledge(void)
 {
-       int i,p=0;
+       int i, p = 0;
+       bool need_redraw = FALSE;
+
        /* File type is "TEXT" */
        FILE_TYPE(FILE_TYPE_TEXT);
+
        /* Save the screen */
        screen_save();
+
        /* Interact until done */
        while (1)
        {
                /* Clear screen */
                Term_clear();
+
                /* Ask for a choice */
 #ifdef JP
                prt(format("%d/2 ¥Ú¡¼¥¸", (p+1)), 2, 65);
@@ -9350,18 +9374,21 @@ void do_cmd_knowledge(void)
 
                /* Give some choices */
 #ifdef JP
-               if (p == 0) {
+               if (p == 0)
+               {
                        prt("(1) ´ûÃΤÎÅÁÀâ¤Î¥¢¥¤¥Æ¥à                 ¤Î°ìÍ÷", 6, 5);
                        prt("(2) ´ûÃΤΥ¢¥¤¥Æ¥à                       ¤Î°ìÍ÷", 7, 5);
                        prt("(3) ´ûÃΤÎÀ¸¤­¤Æ¤¤¤ë¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼ ¤Î°ìÍ÷", 8, 5);
                        prt("(4) ´ûÃΤΥâ¥ó¥¹¥¿¡¼                     ¤Î°ìÍ÷", 9, 5);
                        prt("(5) Åݤ·¤¿Å¨¤Î¿ô                         ¤Î°ìÍ÷", 10, 5);
-                       prt("(6) ¾Þ¶â¼ó                               ¤Î°ìÍ÷", 11, 5);
+                       if (!vanilla_town) prt("(6) ¾Þ¶â¼ó                               ¤Î°ìÍ÷", 11, 5);
                        prt("(7) ¸½ºß¤Î¥Ú¥Ã¥È                         ¤Î°ìÍ÷", 12, 5);
                        prt("(8) ²æ¤¬²È¤Î¥¢¥¤¥Æ¥à                     ¤Î°ìÍ÷", 13, 5);
                        prt("(9) *´ÕÄê*ºÑ¤ßÁõÈ÷¤ÎÂÑÀ­                 ¤Î°ìÍ÷", 14, 5);
                        prt("(0) ÃÏ·Á¤Îɽ¼¨Ê¸»ú/¥¿¥¤¥ë                ¤Î°ìÍ÷", 15, 5);
-               } else {
+               }
+               else
+               {
                        prt("(a) ¼«Ê¬¤Ë´Ø¤¹¤ë¾ðÊó                     ¤Î°ìÍ÷", 6, 5);
                        prt("(b) ÆÍÁ³ÊÑ°Û                             ¤Î°ìÍ÷", 7, 5);
                        prt("(c) Éð´ï¤Î·Ð¸³ÃÍ                         ¤Î°ìÍ÷", 8, 5);
@@ -9373,18 +9400,21 @@ void do_cmd_knowledge(void)
                        prt("(i) ¸½ºß¤Î¼«Æ°½¦¤¤/Ç˲õÀßÄê              ¤Î°ìÍ÷", 14, 5);
                }
 #else
-               if (p == 0) {
+               if (p == 0)
+               {
                        prt("(1) Display known artifacts", 6, 5);
                        prt("(2) Display known objects", 7, 5);
                        prt("(3) Display remaining uniques", 8, 5);
                        prt("(4) Display known monster", 9, 5);
                        prt("(5) Display kill count", 10, 5);
-                       prt("(6) Display wanted monsters", 11, 5);
+                       if (!vanilla_town) prt("(6) Display wanted monsters", 11, 5);
                        prt("(7) Display current pets", 12, 5);
                        prt("(8) Display home inventory", 13, 5);
                        prt("(9) Display *identified* equip.", 14, 5);
                        prt("(0) Display terrain symbols.", 15, 5);
-               } else {
+               }
+               else
+               {
                        prt("(a) Display about yourself", 6, 5);
                        prt("(b) Display mutations", 7, 5);
                        prt("(c) Display weapon proficiency", 8, 5);
@@ -9413,6 +9443,7 @@ void do_cmd_knowledge(void)
 
                /* Prompt */
                i = inkey();
+
                /* Done */
                if (i == ESCAPE) break;
                switch (i)
@@ -9425,19 +9456,19 @@ void do_cmd_knowledge(void)
                        do_cmd_knowledge_artifacts();
                        break;
                case '2': /* Objects */
-                       do_cmd_knowledge_objects();
+                       do_cmd_knowledge_objects(&need_redraw);
                        break;
                case '3': /* Uniques */
                        do_cmd_knowledge_uniques();
                        break;
                case '4': /* Monsters */
-                       do_cmd_knowledge_monsters();
+                       do_cmd_knowledge_monsters(&need_redraw);
                        break;
                case '5': /* Kill count  */
                        do_cmd_knowledge_kill_count();
                        break;
                case '6': /* wanted */
-                       do_cmd_knowledge_kubi();
+                       if (!vanilla_town) do_cmd_knowledge_kubi();
                        break;
                case '7': /* Pets */
                        do_cmd_knowledge_pets();
@@ -9449,7 +9480,7 @@ void do_cmd_knowledge(void)
                        do_cmd_knowledge_inven();
                        break;
                case '0': /* Feature list */
-                       do_cmd_knowledge_features();
+                       do_cmd_knowledge_features(&need_redraw);
                        break;
                /* Next page */
                case 'a': /* Max stat */
@@ -9482,11 +9513,15 @@ void do_cmd_knowledge(void)
                default: /* Unknown option */
                        bell();
                }
+
                /* Flush messages */
                msg_print(NULL);
        }
+
        /* Restore the screen */
        screen_load();
+
+       if (need_redraw) do_cmd_redraw();
 }