OSDN Git Service

キャラクター生成中やオプション設定中に'?'を押すとヘルプファイルの中の
[hengband/hengband.git] / src / files.c
index 7d26369..d1a8092 100644 (file)
@@ -327,6 +327,10 @@ static named_num gf_desc[] =
        {"GF_SEEKER",                   GF_SEEKER                       },
        {"GF_SUPER_RAY",                GF_SUPER_RAY                    },
        {"GF_STAR_HEAL",                GF_STAR_HEAL                    },
+       {"GF_WATER_FLOW",               GF_WATER_FLOW                   },
+       {"GF_CRUSADE",          GF_CRUSADE                      },
+       {"GF_STASIS_EVIL",                      GF_STASIS_EVIL          },
+       {"GF_WOUNDS",                   GF_WOUNDS               },
        {NULL,                                          0                                               }
 };
 
@@ -583,10 +587,20 @@ errr process_pref_file_command(char *buf)
                        int ob = option_info[i].o_bit;
 
                        if (option_info[i].o_var &&
-                                option_info[i].o_text &&
-                                streq(option_info[i].o_text, buf + 2) &&
-                               (!alive || option_info[i].o_page !=6))
+                           option_info[i].o_text &&
+                           streq(option_info[i].o_text, buf + 2))
                        {
+                               if (p_ptr->playing && 6 == option_info[i].o_page && !p_ptr->wizard)
+                               {
+#ifdef JP
+                                       msg_format("½é´ü¥ª¥×¥·¥ç¥ó¤ÏÊѹ¹¤Ç¤­¤Þ¤»¤ó! '%s'", buf);        
+#else
+                                       msg_format("Startup options can not changed! '%s'", buf);       
+#endif
+                                       msg_print(NULL);
+                                       return 0;
+                               }
+
                                /* Clear */
                                option_flag[os] &= ~(1L << ob);
                                (*option_info[i].o_var) = FALSE;
@@ -595,7 +609,11 @@ errr process_pref_file_command(char *buf)
                }
 
                /* don't know that option. ignore it.*/
-               msg_format("Ignored wrong option %s.", buf+2);
+#ifdef JP
+               msg_format("¥ª¥×¥·¥ç¥ó¤Î̾Á°¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡§ %s", buf);
+#else
+               msg_format("Ignored invalid option: %s", buf);
+#endif
                msg_print(NULL);
                return 0;
        }
@@ -609,10 +627,20 @@ errr process_pref_file_command(char *buf)
                        int ob = option_info[i].o_bit;
 
                        if (option_info[i].o_var &&
-                                option_info[i].o_text &&
-                                streq(option_info[i].o_text, buf + 2) &&
-                               (!alive || option_info[i].o_page !=6))
+                           option_info[i].o_text &&
+                           streq(option_info[i].o_text, buf + 2))
                        {
+                               if (p_ptr->playing && 6 == option_info[i].o_page && !p_ptr->wizard)
+                               {
+#ifdef JP
+                                       msg_format("½é´ü¥ª¥×¥·¥ç¥ó¤ÏÊѹ¹¤Ç¤­¤Þ¤»¤ó! '%s'", buf);        
+#else
+                                       msg_format("Startup options can not changed! '%s'", buf);       
+#endif
+                                       msg_print(NULL);
+                                       return 0;
+                               }
+
                                /* Set */
                                option_flag[os] |= (1L << ob);
                                (*option_info[i].o_var) = TRUE;
@@ -621,7 +649,11 @@ errr process_pref_file_command(char *buf)
                }
 
                /* don't know that option. ignore it.*/
-               msg_format("Ignored wrong option %s.", buf+2);
+#ifdef JP
+               msg_format("¥ª¥×¥·¥ç¥ó¤Î̾Á°¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡§ %s", buf);
+#else
+               msg_format("Ignored invalid option: %s", buf);
+#endif
                msg_print(NULL);
                return 0;
        }
@@ -1008,100 +1040,6 @@ static cptr process_pref_file_expr(char **sp, char *fp)
 
 
 /*
- *  Process line for auto picker/destroyer.
- */
-static errr process_pickpref_file_line(char *buf)
-{
-       char *s, *s2;
-       int i;
-       byte act = 0;
-
-       /* Nuke illegal char */
-       for(i = 0; buf[i]; i++)
-       {
-#ifdef JP
-               if (iskanji(buf[i]))
-               {
-                       i++;
-                       continue;
-               }
-#endif
-               if (isspace(buf[i]) && buf[i] != ' ')
-                       break;
-       }
-       buf[i] = 0;
-       
-       s = buf;
-
-       act = DO_AUTOPICK | DO_DISPLAY;
-       while (1)
-       {
-               if (*s == '!')
-               {
-                       act &= ~DO_AUTOPICK;
-                       act |= DO_AUTODESTROY;
-                       s++;
-               }
-               else if (*s == '~')
-               {
-                       act &= ~DO_AUTOPICK;
-                       act |= DONT_AUTOPICK;
-                       s++;
-               }
-               else if (*s == '(')
-               {
-                       act &= ~DO_DISPLAY;
-                       s++;
-               }
-               else
-                       break;
-       }
-
-       /* don't mind upper or lower case */
-       s2 = NULL;
-       for (i = 0; s[i]; i++)
-       {
-#ifdef JP
-               if (iskanji(s[i]))
-               {
-                       i++;
-                       continue;
-               }
-#endif
-               if (isupper(s[i]))
-                       s[i] = tolower(s[i]);
-
-               /* Auto-inscription? */
-               if (s[i] == '#')
-               {
-                       s[i] = '\0';
-                       s2 = s + i + 1;
-                       break;
-               }
-       }
-       
-       /* Skip empty line */
-       if (*s == 0)
-               return 0;
-       if (max_autopick == MAX_AUTOPICK)
-               return 1;
-       
-       /* Already has the same entry? */ 
-       for(i = 0; i < max_autopick; i++)
-               if(!strcmp(s, autopick_name[i]))
-                       return 0;
-
-       autopick_name[max_autopick] = string_make(s);
-       autopick_action[max_autopick] = act;
-
-       autopick_insc[max_autopick] = string_make(s2);
-       max_autopick++;
-       return 0;
-}
-
-
-
-/*
  * Open the "user pref file" and parse it.
  */
 static errr process_pref_file_aux(cptr name, bool read_pickpref)
@@ -1126,7 +1064,7 @@ static errr process_pref_file_aux(cptr name, bool read_pickpref)
        if (!fp) return (-1);
 
        /* Process the file */
-       while (0 == my_fgets(fp, buf, 1024))
+       while (0 == my_fgets(fp, buf, sizeof(buf)))
        {
                /* Count lines */
                line++;
@@ -1235,26 +1173,37 @@ errr process_pref_file(cptr name)
 {
        char buf[1024];
 
-       errr err = 0;
+       errr err1, err2;
 
        /* Build the filename */
-       path_build(buf, 1024, ANGBAND_DIR_PREF, name);
+       path_build(buf, sizeof(buf), ANGBAND_DIR_PREF, name);
 
-       /* Process the pref file */
-       err = process_pref_file_aux(buf, FALSE);
+       /* Process the system pref file */
+       err1 = process_pref_file_aux(buf, FALSE);
 
        /* Stop at parser errors, but not at non-existing file */
-       if (err < 1)
-       {
-               /* Build the filename */
-               path_build(buf, 1024, ANGBAND_DIR_USER, name);
+       if (err1 > 0) return err1;
 
-               /* Process the pref file */
-               err = process_pref_file_aux(buf, FALSE);
-       }
 
-       /* Result */
-       return (err);
+       /* Drop priv's */
+       safe_setuid_drop();
+       
+       /* Build the filename */
+       path_build(buf, sizeof(buf), ANGBAND_DIR_USER, name);
+       
+       /* Process the user pref file */
+       err2 = process_pref_file_aux(buf, FALSE);
+
+       /* Grab priv's */
+       safe_setuid_grab();
+
+
+       /* User file does not exist, but read system pref file */
+       if (err2 < 0 && !err1)
+               return -2;
+
+       /* Result of user file processing */
+       return err2;
 }
 
 
@@ -1326,7 +1275,7 @@ errr check_time_init(void)
 
 
        /* Build the filename */
-       path_build(buf, 1024, ANGBAND_DIR_FILE, "time.txt");
+       path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "time.txt");
 
        /* Open the file */
        fp = my_fopen(buf, "r");
@@ -1338,7 +1287,7 @@ errr check_time_init(void)
        check_time_flag = TRUE;
 
        /* Parse the file */
-       while (0 == my_fgets(fp, buf, 80))
+       while (0 == my_fgets(fp, buf, sizeof(buf)))
        {
                /* Skip comments and blank lines */
                if (!buf[0] || (buf[0] == '#')) continue;
@@ -1450,7 +1399,7 @@ errr check_load_init(void)
 
 
        /* Build the filename */
-       path_build(buf, 1024, ANGBAND_DIR_FILE, "load.txt");
+       path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "load.txt");
 
        /* Open the "load" file */
        fp = my_fopen(buf, "r");
@@ -1465,7 +1414,7 @@ errr check_load_init(void)
        (void)gethostname(thishost, (sizeof thishost) - 1);
 
        /* Parse it */
-       while (0 == my_fgets(fp, buf, 1024))
+       while (0 == my_fgets(fp, buf, sizeof(buf)))
        {
                int value;
 
@@ -1496,64 +1445,6 @@ errr check_load_init(void)
 }
 
 
-/*
- * Print long number with header at given row, column
- * Use the color for the number, not the header
- */
-static void prt_lnum(cptr header, s32b num, int row, int col, byte color)
-{
-       int len = strlen(header);
-       char out_val[32];
-       put_str(header, row, col);
-       (void)sprintf(out_val, "%9ld", (long)num);
-       c_put_str(color, out_val, row, col + len);
-}
-
-
-/*
- * Print number with header at given row, column
- */
-static void prt_num(cptr header, int num, int row, int col, byte color)
-{
-       int len = strlen(header);
-       char out_val[32];
-       put_str(header, row, col);
-       put_str("   ", row, col + len);
-       (void)sprintf(out_val, "%6ld", (long)num);
-       c_put_str(color, out_val, row, col + len + 3);
-}
-
-
-#ifdef JP
-/*    ÆüËܸìÈdzÈÄ¥
- *         £È£Ð / ºÇÂ砤Τ褦¤Êɽ¼¨
- *        xxxxx / yyyyy
- */
-static void prt_num_max( int num, int max , int row, int col, byte color1, byte color2 )
-{
-       char out_val[32];
-       (void)sprintf(out_val, "%5ld", (long)num);
-       c_put_str(color1, out_val, row, col );
-       put_str("/",row, col+6);
-       (void)sprintf(out_val, "%5ld", (long)max);
-       c_put_str(color2, out_val, row, col+8 );
-}
-
-/*    ÆüËܸìÈdzÈÄ¥
- *    xx ºÐ  ¤È¤« xx kg ¤Ê¤É¤Îɽ¼¨ÍÑ cptr tailer ¤Ëñ°Ì¤¬Æþ¤ë¡£
- */
-static void prt_num2(cptr header, cptr tailer, int num, int row, int col, byte color)
-{
-       int len = strlen(header);
-       char out_val[32];
-       put_str(header, row, col);
-       put_str("   ", row, col + len);
-       (void)sprintf(out_val, "%6ld", (long)num);
-       c_put_str(color, out_val, row, col + len + 3);
-       put_str(tailer, row, col + len + 3+6);
-}
-#endif
-
 #define ENTRY_BARE_HAND 0
 #define ENTRY_TWO_HANDS 1
 #define ENTRY_RIGHT_HAND1 2
@@ -1599,6 +1490,8 @@ static void prt_num2(cptr header, cptr tailer, int num, int row, int col, byte c
 #define ENTRY_SOCIAL 41
 #define ENTRY_ALIGN 42
 
+#define ENTRY_EXP_ANDR 43
+
 
 static struct
 {
@@ -1652,6 +1545,7 @@ static struct
        {29,  5, 21, "ÂνÅ"},
        {29,  6, 21, "¼Ò²ñŪÃÏ°Ì"},
        {29,  7, 21, "°À­"},
+       {29, 14, 21, "¶¯²½ÅÙ"},
 };
 #else
 = {
@@ -1698,6 +1592,7 @@ static struct
        {29,  5, 21, "Weight"},
        {29,  6, 21, "Social Class"},
        {29,  7, 21, "Align"},
+       {29, 14, 21, "Construction"},
 };
 #endif
 
@@ -1734,9 +1629,6 @@ static void display_player_one_line(int entry, cptr val, byte attr)
 
 /*
  * Prints the following information on the screen.
- *
- * For this to look right, the following should be spaced the
- * same as in the prt_lnum code... -CFT
  */
 static void display_player_middle(void)
 {
@@ -1744,6 +1636,7 @@ static void display_player_middle(void)
        int show_tohit, show_todam;
        object_type *o_ptr;
        int tmul = 0;
+        int e;
 
        if(p_ptr->migite)
        {
@@ -1825,7 +1718,10 @@ static void display_player_middle(void)
        if (object_known_p(o_ptr)) show_tohit += o_ptr->to_h;
        if (object_known_p(o_ptr)) show_todam += o_ptr->to_d;
 
-       show_tohit += (weapon_exp[0][o_ptr->sval]-4000)/200;
+       if ((o_ptr->sval == SV_LIGHT_XBOW) || (o_ptr->sval == SV_HEAVY_XBOW))
+               show_tohit += (p_ptr->weapon_exp[0][o_ptr->sval])/400;
+       else
+               show_tohit += (p_ptr->weapon_exp[0][o_ptr->sval]-4000)/200;
 
        /* Range attacks */
        display_player_one_line(ENTRY_SHOOT_HIT_DAM, format("(%+d,%+d)", show_tohit, show_todam), TERM_L_BLUE);
@@ -1859,19 +1755,50 @@ static void display_player_middle(void)
                if (p_ptr->action == ACTION_SEARCH) i += 10;
 
                if (i > 0)
-                       attr = TERM_L_GREEN;
+               {
+                       if (!p_ptr->riding)
+                               attr = TERM_L_GREEN;
+                       else
+                               attr = TERM_GREEN;
+               }
                else if (i == 0)
-                       attr = TERM_L_BLUE;
+               {
+                       if (!p_ptr->riding)
+                               attr = TERM_L_BLUE;
+                       else
+                               attr = TERM_GREEN;
+               }
                else
-                       attr = TERM_L_UMBER;
+               {
+                       if (!p_ptr->riding)
+                               attr = TERM_L_UMBER;
+                       else
+                               attr = TERM_RED;
+               }
 
-               if (is_fast) tmp_speed += 10;
-               if (p_ptr->slow) tmp_speed -= 10;
-               if (p_ptr->lightspeed) tmp_speed = 99;
+               if (!p_ptr->riding)
+               {
+                       if (is_fast) tmp_speed += 10;
+                       if (p_ptr->slow) tmp_speed -= 10;
+                       if (p_ptr->lightspeed) tmp_speed = 99;
+               }
+               else
+               {
+                       if (m_list[p_ptr->riding].fast) tmp_speed += 10;
+                       if (m_list[p_ptr->riding].slow) tmp_speed -= 10;
+               }
 
                if (tmp_speed)
                {
-                       sprintf(buf, "(%+d%+d)", i-tmp_speed, tmp_speed);
+                       if (!p_ptr->riding)
+                               sprintf(buf, "(%+d%+d)", i-tmp_speed, tmp_speed);
+                       else
+#ifdef JP
+                               sprintf(buf, "¾èÇÏÃæ (%+d%+d)", i-tmp_speed, tmp_speed);
+#else
+                               sprintf(buf, "Riding (%+d%+d)", i-tmp_speed, tmp_speed);
+#endif
+
                        if (tmp_speed > 0)
                                attr = TERM_YELLOW;
                        else
@@ -1879,7 +1806,14 @@ static void display_player_middle(void)
                }
                else
                {
-                       sprintf(buf, "(%+d)", i);
+                       if (!p_ptr->riding)
+                               sprintf(buf, "(%+d)", i);
+                       else
+#ifdef JP
+                               sprintf(buf, "¾èÇÏÃæ (%+d)", i);
+#else
+                               sprintf(buf, "Riding (%+d)", i);
+#endif
                }
        
                display_player_one_line(ENTRY_SPEED, buf, attr);
@@ -1889,22 +1823,25 @@ static void display_player_middle(void)
        display_player_one_line(ENTRY_LEVEL, format("%d", p_ptr->lev), TERM_L_GREEN);
 
        /* Dump experience */
-       if (p_ptr->prace == RACE_ANDROID)
-               display_player_one_line(ENTRY_CUR_EXP, "*****", TERM_L_GREEN);
-       else if (p_ptr->exp >= p_ptr->max_exp)
-               display_player_one_line(ENTRY_CUR_EXP, format("%ld", p_ptr->exp), TERM_L_GREEN);
+       if (p_ptr->prace == RACE_ANDROID) e = ENTRY_EXP_ANDR;
+        else e = ENTRY_CUR_EXP;
+
+       if (p_ptr->exp >= p_ptr->max_exp)
+               display_player_one_line(e, format("%ld", p_ptr->exp), TERM_L_GREEN);
        else
-               display_player_one_line(ENTRY_CUR_EXP, format("%ld", p_ptr->exp), TERM_YELLOW);
+               display_player_one_line(e, format("%ld", p_ptr->exp), TERM_YELLOW);
 
        /* Dump max experience */
        if (p_ptr->prace == RACE_ANDROID)
-               display_player_one_line(ENTRY_MAX_EXP, "*****", TERM_L_GREEN);
+               /* Nothing */;
        else
                display_player_one_line(ENTRY_MAX_EXP, format("%ld", p_ptr->max_exp), TERM_L_GREEN);
 
        /* Dump exp to advance */
-       if ((p_ptr->lev >= PY_MAX_LEVEL) || (p_ptr->prace == RACE_ANDROID))
+       if (p_ptr->lev >= PY_MAX_LEVEL)
                display_player_one_line(ENTRY_EXP_TO_ADV, "*****", TERM_L_GREEN);
+        else if (p_ptr->prace == RACE_ANDROID)
+               display_player_one_line(ENTRY_EXP_TO_ADV, format("%ld", (s32b)(player_exp_a[p_ptr->lev - 1] * p_ptr->expfact / 100L)), TERM_L_GREEN);
        else
                display_player_one_line(ENTRY_EXP_TO_ADV, format("%ld", (s32b)(player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L)), TERM_L_GREEN);
 
@@ -1913,23 +1850,16 @@ static void display_player_middle(void)
 
        /* Dump Day */
        {
-               s32b len = 20L * TOWN_DAWN;
-               s32b tick = turn % len + len / 4;
+               int day, hour, min;
+               extract_day_hour_min(&day, &hour, &min);
 
                sprintf(buf, 
 #ifdef JP
-                       "%2dÆüÌÜ  %d:%02d", 
+                       "%dÆüÌÜ %2d:%02d", 
 #else
-                       "Day %d  %d:%02d", 
+                       "Day %d %2d:%02d", 
 #endif
-                       ((p_ptr->prace == RACE_VAMPIRE) ||
-                        (p_ptr->prace == RACE_SKELETON) ||
-                        (p_ptr->prace == RACE_ZOMBIE) ||
-                        (p_ptr->prace == RACE_SPECTRE))
-                       ? (turn - (15L * TOWN_DAWN)) / len + 1
-                       : (turn + (5L * TOWN_DAWN))/ len + 1,
-                       (24 * tick / len) % 24,
-                       (1440 * tick / len) % 60);
+                       day, hour, min);
        }
        display_player_one_line(ENTRY_DAY, buf, TERM_L_GREEN);
 
@@ -2102,7 +2032,7 @@ static void display_player_various(void)
        int                     xdis, xdev, xsav, xstl;
        cptr            desc;
        int         muta_att = 0;
-       u32b        f1, f2, f3;
+       u32b flgs[TR_FLAG_SIZE];
        int             shots, shot_frac;
 
        object_type             *o_ptr;
@@ -2177,20 +2107,20 @@ static void display_player_various(void)
                        o_ptr = &inventory[INVEN_RARM+i];
                        if (object_known_p(o_ptr)) damage[i] += o_ptr->to_d*100;
                        basedam = (o_ptr->dd * (o_ptr->ds + 1))*50;
-                       object_flags(o_ptr, &f1, &f2, &f3);
-                       if ((o_ptr->ident & IDENT_MENTAL) && (o_ptr->name1 == ART_VORPAL_BLADE))
+                       object_flags(o_ptr, flgs);
+                       if ((o_ptr->ident & IDENT_MENTAL) && ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)))
                        {
                                /* vorpal blade */
                                basedam *= 5;
                                basedam /= 3;
                        }
-                       else if (object_known_p(o_ptr) && (f1 & TR1_VORPAL))
+                       else if (object_known_p(o_ptr) && (have_flag(flgs, TR_VORPAL)))
                        {
                                /* vorpal flag only */
                                basedam *= 11;
                                basedam /= 9;
                        }
-                       if (object_known_p(o_ptr) && (p_ptr->pclass != CLASS_SAMURAI) && (f1 & TR1_FORCE_WEPON) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
+                       if (object_known_p(o_ptr) && (p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
                                basedam = basedam * 7 / 2;
                        if (p_ptr->riding && (o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE)))
                                basedam = basedam*(o_ptr->dd+2)/o_ptr->dd;
@@ -2259,78 +2189,81 @@ static void display_player_various(void)
 /*
  * Obtain the "flags" for the player as if he was an item
  */
-static void player_flags(u32b *f1, u32b *f2, u32b *f3)
+static void player_flags(u32b flgs[TR_FLAG_SIZE])
 {
+       int i;
+
        /* Clear */
-       (*f1) = (*f2) = (*f3) = 0L;
+       for (i = 0; i < TR_FLAG_SIZE; i++)
+               flgs[i] = 0L;
 
        /* Classes */
        switch (p_ptr->pclass)
        {
        case CLASS_WARRIOR:
                if (p_ptr->lev > 44)
-                       (*f3) |= (TR3_REGEN);
+                       add_flag(flgs, TR_REGEN);
        case CLASS_SAMURAI:
                if (p_ptr->lev > 29)
-                       (*f2) |= (TR2_RES_FEAR);
+                       add_flag(flgs, TR_RES_FEAR);
                break;
        case CLASS_PALADIN:
                if (p_ptr->lev > 39)
-                       (*f2) |= (TR2_RES_FEAR);
+                       add_flag(flgs, TR_RES_FEAR);
                break;
        case CLASS_CHAOS_WARRIOR:
                if (p_ptr->lev > 29)
-                       (*f2) |= (TR2_RES_CHAOS);
+                       add_flag(flgs, TR_RES_CHAOS);
                if (p_ptr->lev > 39)
-                       (*f2) |= (TR2_RES_FEAR);
+                       add_flag(flgs, TR_RES_FEAR);
                break;
        case CLASS_MONK:
        case CLASS_FORCETRAINER:
                if ((p_ptr->lev > 9) && !heavy_armor())
-                       (*f1) |= TR1_SPEED;
+                       add_flag(flgs, TR_SPEED);
                if ((p_ptr->lev>24) && !heavy_armor())
-                       (*f2) |= (TR2_FREE_ACT);
+                       add_flag(flgs, TR_FREE_ACT);
                break;
        case CLASS_NINJA:
                if (heavy_armor())
-                       (*f1) |= TR1_SPEED;
+                       add_flag(flgs, TR_SPEED);
                else
                {
                        if (!inventory[INVEN_LARM].tval || p_ptr->hidarite)
-                               (*f1) |= TR1_SPEED;
+                               add_flag(flgs, TR_SPEED);
                        if (p_ptr->lev>24)
-                               (*f2) |= (TR2_FREE_ACT);
+                               add_flag(flgs, TR_FREE_ACT);
                }
-               (*f3) |= TR3_SLOW_DIGEST;
-               (*f2) |= TR2_RES_FEAR;
-               if (p_ptr->lev > 19) (*f2) |= TR2_RES_POIS;
-               if (p_ptr->lev > 24) (*f2) |= TR2_SUST_DEX;
-               if (p_ptr->lev > 29) (*f3) |= TR3_SEE_INVIS;
+               add_flag(flgs, TR_SLOW_DIGEST);
+               add_flag(flgs, TR_RES_FEAR);
+               if (p_ptr->lev > 19) add_flag(flgs, TR_RES_POIS);
+               if (p_ptr->lev > 24) add_flag(flgs, TR_SUST_DEX);
+               if (p_ptr->lev > 29) add_flag(flgs, TR_SEE_INVIS);
                break;
        case CLASS_MINDCRAFTER:
                if (p_ptr->lev > 9)
-                       (*f2) |= (TR2_RES_FEAR);
+                       add_flag(flgs, TR_RES_FEAR);
                if (p_ptr->lev > 19)
-                       (*f2) |= (TR2_SUST_WIS);
+                       add_flag(flgs, TR_SUST_WIS);
                if (p_ptr->lev > 29)
-                       (*f2) |= (TR2_RES_CONF);
+                       add_flag(flgs, TR_RES_CONF);
                if (p_ptr->lev > 39)
-                       (*f3) |= (TR3_TELEPATHY);
+                       add_flag(flgs, TR_TELEPATHY);
                break;
        case CLASS_BARD:
-               (*f2) |= (TR2_RES_SOUND);
+               add_flag(flgs, TR_RES_SOUND);
                break;
        case CLASS_BERSERKER:
-               (*f2) |= (TR2_SUST_STR);
-               (*f2) |= (TR2_SUST_DEX);
-               (*f2) |= (TR2_SUST_CON);
-               (*f3) |= (TR3_REGEN);
-               (*f2) |= (TR2_FREE_ACT);
-               (*f1) |= (TR1_SPEED);
-               if (p_ptr->lev > 39) (*f2) |= (TR2_REFLECT);
+               add_flag(flgs, TR_SUST_STR);
+               add_flag(flgs, TR_SUST_DEX);
+               add_flag(flgs, TR_SUST_CON);
+               add_flag(flgs, TR_REGEN);
+               add_flag(flgs, TR_FREE_ACT);
+               add_flag(flgs, TR_SPEED);
+               if (p_ptr->lev > 39) add_flag(flgs, TR_REFLECT);
                break;
        case CLASS_MIRROR_MASTER:
-               if(p_ptr->lev > 39)(*f2) |= (TR2_REFLECT);
+               if(p_ptr->lev > 39)add_flag(flgs, TR_REFLECT);
                break;
        default:
                break; /* Do nothing */
@@ -2342,42 +2275,42 @@ static void player_flags(u32b *f1, u32b *f2, u32b *f3)
                switch(p_ptr->mimic_form)
                {
                case MIMIC_DEMON:
-                       (*f2) |= (TR2_HOLD_LIFE);
-                       (*f2) |= (TR2_RES_CHAOS);
-                       (*f2) |= (TR2_RES_NETHER);
-                       (*f2) |= (TR2_RES_FIRE);
-                       (*f3) |= (TR3_SEE_INVIS);
-                       (*f1) |= (TR1_SPEED);
+                       add_flag(flgs, TR_HOLD_LIFE);
+                       add_flag(flgs, TR_RES_CHAOS);
+                       add_flag(flgs, TR_RES_NETHER);
+                       add_flag(flgs, TR_RES_FIRE);
+                       add_flag(flgs, TR_SEE_INVIS);
+                       add_flag(flgs, TR_SPEED);
                        break;
                case MIMIC_DEMON_LORD:
-                       (*f2) |= (TR2_HOLD_LIFE);
-                       (*f2) |= (TR2_RES_CHAOS);
-                       (*f2) |= (TR2_RES_NETHER);
-                       (*f2) |= (TR2_RES_FIRE);
-                       (*f2) |= (TR2_RES_COLD);
-                       (*f2) |= (TR2_RES_ELEC);
-                       (*f2) |= (TR2_RES_ACID);
-                       (*f2) |= (TR2_RES_POIS);
-                       (*f2) |= (TR2_RES_CONF);
-                       (*f2) |= (TR2_RES_DISEN);
-                       (*f2) |= (TR2_RES_NEXUS);
-                       (*f2) |= (TR2_RES_FEAR);
-                       (*f2) |= (TR2_IM_FIRE);
-                       (*f3) |= (TR3_SH_FIRE);
-                       (*f3) |= (TR3_SEE_INVIS);
-                       (*f3) |= (TR3_TELEPATHY);
-                       (*f3) |= (TR3_FEATHER);
-                       (*f1) |= (TR1_SPEED);
+                       add_flag(flgs, TR_HOLD_LIFE);
+                       add_flag(flgs, TR_RES_CHAOS);
+                       add_flag(flgs, TR_RES_NETHER);
+                       add_flag(flgs, TR_RES_FIRE);
+                       add_flag(flgs, TR_RES_COLD);
+                       add_flag(flgs, TR_RES_ELEC);
+                       add_flag(flgs, TR_RES_ACID);
+                       add_flag(flgs, TR_RES_POIS);
+                       add_flag(flgs, TR_RES_CONF);
+                       add_flag(flgs, TR_RES_DISEN);
+                       add_flag(flgs, TR_RES_NEXUS);
+                       add_flag(flgs, TR_RES_FEAR);
+                       add_flag(flgs, TR_IM_FIRE);
+                       add_flag(flgs, TR_SH_FIRE);
+                       add_flag(flgs, TR_SEE_INVIS);
+                       add_flag(flgs, TR_TELEPATHY);
+                       add_flag(flgs, TR_FEATHER);
+                       add_flag(flgs, TR_SPEED);
                        break;
                case MIMIC_VAMPIRE:
-                       (*f2) |= (TR2_HOLD_LIFE);
-                       (*f2) |= (TR2_RES_DARK);
-                       (*f2) |= (TR2_RES_NETHER);
-                       if (p_ptr->pclass != CLASS_NINJA) (*f3) |= (TR3_LITE);
-                       (*f2) |= (TR2_RES_POIS);
-                       (*f2) |= (TR2_RES_COLD);
-                       (*f3) |= (TR3_SEE_INVIS);
-                       (*f1) |= (TR1_SPEED);
+                       add_flag(flgs, TR_HOLD_LIFE);
+                       add_flag(flgs, TR_RES_DARK);
+                       add_flag(flgs, TR_RES_NETHER);
+                       if (p_ptr->pclass != CLASS_NINJA) add_flag(flgs, TR_LITE);
+                       add_flag(flgs, TR_RES_POIS);
+                       add_flag(flgs, TR_RES_COLD);
+                       add_flag(flgs, TR_SEE_INVIS);
+                       add_flag(flgs, TR_SPEED);
                        break;
                }
        }
@@ -2386,28 +2319,28 @@ static void player_flags(u32b *f1, u32b *f2, u32b *f3)
        switch (p_ptr->prace)
        {
        case RACE_ELF:
-               (*f2) |= (TR2_RES_LITE);
+               add_flag(flgs, TR_RES_LITE);
                break;
        case RACE_HOBBIT:
-               (*f2) |= (TR2_SUST_DEX);
+               add_flag(flgs, TR_SUST_DEX);
                break;
        case RACE_GNOME:
-               (*f2) |= (TR2_FREE_ACT);
+               add_flag(flgs, TR_FREE_ACT);
                break;
        case RACE_DWARF:
-               (*f2) |= (TR2_RES_BLIND);
+               add_flag(flgs, TR_RES_BLIND);
                break;
        case RACE_HALF_ORC:
-               (*f2) |= (TR2_RES_DARK);
+               add_flag(flgs, TR_RES_DARK);
                break;
        case RACE_HALF_TROLL:
-               (*f2) |= (TR2_SUST_STR);
+               add_flag(flgs, TR_SUST_STR);
                if (p_ptr->lev > 14)
                {
-                       (*f3) |= (TR3_REGEN);
+                       add_flag(flgs, TR_REGEN);
                        if (p_ptr->pclass == CLASS_WARRIOR)
                        {
-                               (*f3) |= (TR3_SLOW_DIGEST);
+                               add_flag(flgs, TR_SLOW_DIGEST);
                                /*
                                 * Let's not make Regeneration a disadvantage
                                 * for the poor warriors who can never learn
@@ -2419,160 +2352,160 @@ static void player_flags(u32b *f1, u32b *f2, u32b *f3)
                }
                break;
        case RACE_AMBERITE:
-               (*f2) |= (TR2_SUST_CON);
-               (*f3) |= (TR3_REGEN); /* Amberites heal fast */
+               add_flag(flgs, TR_SUST_CON);
+               add_flag(flgs, TR_REGEN); /* Amberites heal fast */
                break;
        case RACE_HIGH_ELF:
-               (*f2) |= (TR2_RES_LITE);
-               (*f3) |= (TR3_SEE_INVIS);
+               add_flag(flgs, TR_RES_LITE);
+               add_flag(flgs, TR_SEE_INVIS);
                break;
        case RACE_BARBARIAN:
-               (*f2) |= (TR2_RES_FEAR);
+               add_flag(flgs, TR_RES_FEAR);
                break;
        case RACE_HALF_OGRE:
-               (*f2) |= (TR2_SUST_STR);
-               (*f2) |= (TR2_RES_DARK);
+               add_flag(flgs, TR_SUST_STR);
+               add_flag(flgs, TR_RES_DARK);
                break;
        case RACE_HALF_GIANT:
-               (*f2) |= (TR2_RES_SHARDS);
-               (*f2) |= (TR2_SUST_STR);
+               add_flag(flgs, TR_RES_SHARDS);
+               add_flag(flgs, TR_SUST_STR);
                break;
        case RACE_HALF_TITAN:
-               (*f2) |= (TR2_RES_CHAOS);
+               add_flag(flgs, TR_RES_CHAOS);
                break;
        case RACE_CYCLOPS:
-               (*f2) |= (TR2_RES_SOUND);
+               add_flag(flgs, TR_RES_SOUND);
                break;
        case RACE_YEEK:
-               (*f2) |= (TR2_RES_ACID);
+               add_flag(flgs, TR_RES_ACID);
                if (p_ptr->lev > 19)
-                       (*f2) |= (TR2_IM_ACID);
+                       add_flag(flgs, TR_IM_ACID);
                break;
        case RACE_KLACKON:
-               (*f2) |= (TR2_RES_CONF);
-               (*f2) |= (TR2_RES_ACID);
+               add_flag(flgs, TR_RES_CONF);
+               add_flag(flgs, TR_RES_ACID);
                if (p_ptr->lev > 9)
-                       (*f1) |= TR1_SPEED;
+                       add_flag(flgs, TR_SPEED);
                break;
        case RACE_KOBOLD:
-               (*f2) |= (TR2_RES_POIS);
+               add_flag(flgs, TR_RES_POIS);
                break;
        case RACE_NIBELUNG:
-               (*f2) |= (TR2_RES_DISEN);
-               (*f2) |= (TR2_RES_DARK);
+               add_flag(flgs, TR_RES_DISEN);
+               add_flag(flgs, TR_RES_DARK);
                break;
        case RACE_DARK_ELF:
-               (*f2) |= (TR2_RES_DARK);
+               add_flag(flgs, TR_RES_DARK);
                if (p_ptr->lev > 19)
-                       (*f3) |= (TR3_SEE_INVIS);
+                       add_flag(flgs, TR_SEE_INVIS);
                break;
        case RACE_DRACONIAN:
-               (*f3) |= TR3_FEATHER;
+               add_flag(flgs, TR_FEATHER);
                if (p_ptr->lev > 4)
-                       (*f2) |= (TR2_RES_FIRE);
+                       add_flag(flgs, TR_RES_FIRE);
                if (p_ptr->lev > 9)
-                       (*f2) |= (TR2_RES_COLD);
+                       add_flag(flgs, TR_RES_COLD);
                if (p_ptr->lev > 14)
-                       (*f2) |= (TR2_RES_ACID);
+                       add_flag(flgs, TR_RES_ACID);
                if (p_ptr->lev > 19)
-                       (*f2) |= (TR2_RES_ELEC);
+                       add_flag(flgs, TR_RES_ELEC);
                if (p_ptr->lev > 34)
-                       (*f2) |= (TR2_RES_POIS);
+                       add_flag(flgs, TR_RES_POIS);
                break;
        case RACE_MIND_FLAYER:
-               (*f2) |= (TR2_SUST_INT);
-               (*f2) |= (TR2_SUST_WIS);
+               add_flag(flgs, TR_SUST_INT);
+               add_flag(flgs, TR_SUST_WIS);
                if (p_ptr->lev > 14)
-                       (*f3) |= (TR3_SEE_INVIS);
+                       add_flag(flgs, TR_SEE_INVIS);
                if (p_ptr->lev > 29)
-                       (*f3) |= (TR3_TELEPATHY);
+                       add_flag(flgs, TR_TELEPATHY);
                break;
        case RACE_IMP:
-               (*f2) |= (TR2_RES_FIRE);
+               add_flag(flgs, TR_RES_FIRE);
                if (p_ptr->lev > 9)
-                       (*f3) |= (TR3_SEE_INVIS);
+                       add_flag(flgs, TR_SEE_INVIS);
                break;
        case RACE_GOLEM:
-               (*f3) |= (TR3_SEE_INVIS);
-               (*f2) |= (TR2_FREE_ACT);
-               (*f2) |= (TR2_RES_POIS);
-               (*f3) |= (TR3_SLOW_DIGEST);
+               add_flag(flgs, TR_SEE_INVIS);
+               add_flag(flgs, TR_FREE_ACT);
+               add_flag(flgs, TR_RES_POIS);
+               add_flag(flgs, TR_SLOW_DIGEST);
                if (p_ptr->lev > 34)
-                       (*f2) |= (TR2_HOLD_LIFE);
+                       add_flag(flgs, TR_HOLD_LIFE);
                break;
        case RACE_SKELETON:
-               (*f3) |= (TR3_SEE_INVIS);
-               (*f2) |= (TR2_RES_SHARDS);
-               (*f2) |= (TR2_HOLD_LIFE);
-               (*f2) |= (TR2_RES_POIS);
+               add_flag(flgs, TR_SEE_INVIS);
+               add_flag(flgs, TR_RES_SHARDS);
+               add_flag(flgs, TR_HOLD_LIFE);
+               add_flag(flgs, TR_RES_POIS);
                if (p_ptr->lev > 9)
-                       (*f2) |= (TR2_RES_COLD);
+                       add_flag(flgs, TR_RES_COLD);
                break;
        case RACE_ZOMBIE:
-               (*f3) |= (TR3_SEE_INVIS);
-               (*f2) |= (TR2_HOLD_LIFE);
-               (*f2) |= (TR2_RES_NETHER);
-               (*f2) |= (TR2_RES_POIS);
-               (*f3) |= (TR3_SLOW_DIGEST);
+               add_flag(flgs, TR_SEE_INVIS);
+               add_flag(flgs, TR_HOLD_LIFE);
+               add_flag(flgs, TR_RES_NETHER);
+               add_flag(flgs, TR_RES_POIS);
+               add_flag(flgs, TR_SLOW_DIGEST);
                if (p_ptr->lev > 4)
-                       (*f2) |= (TR2_RES_COLD);
+                       add_flag(flgs, TR_RES_COLD);
                break;
        case RACE_VAMPIRE:
-               (*f2) |= (TR2_HOLD_LIFE);
-               (*f2) |= (TR2_RES_DARK);
-               (*f2) |= (TR2_RES_NETHER);
-               if (p_ptr->pclass != CLASS_NINJA) (*f3) |= (TR3_LITE);
-               (*f2) |= (TR2_RES_POIS);
-               (*f2) |= (TR2_RES_COLD);
+               add_flag(flgs, TR_HOLD_LIFE);
+               add_flag(flgs, TR_RES_DARK);
+               add_flag(flgs, TR_RES_NETHER);
+               if (p_ptr->pclass != CLASS_NINJA) add_flag(flgs, TR_LITE);
+               add_flag(flgs, TR_RES_POIS);
+               add_flag(flgs, TR_RES_COLD);
                break;
        case RACE_SPECTRE:
-               (*f3) |= (TR3_FEATHER);
-               (*f2) |= (TR2_FREE_ACT);
-               (*f2) |= (TR2_RES_COLD);
-               (*f3) |= (TR3_SEE_INVIS);
-               (*f2) |= (TR2_HOLD_LIFE);
-               (*f2) |= (TR2_RES_NETHER);
-               (*f2) |= (TR2_RES_POIS);
-               (*f3) |= (TR3_SLOW_DIGEST);
+               add_flag(flgs, TR_FEATHER);
+               add_flag(flgs, TR_FREE_ACT);
+               add_flag(flgs, TR_RES_COLD);
+               add_flag(flgs, TR_SEE_INVIS);
+               add_flag(flgs, TR_HOLD_LIFE);
+               add_flag(flgs, TR_RES_NETHER);
+               add_flag(flgs, TR_RES_POIS);
+               add_flag(flgs, TR_SLOW_DIGEST);
                /* XXX pass_wall */
                if (p_ptr->lev > 34)
-                       (*f3) |= TR3_TELEPATHY;
+                       add_flag(flgs, TR_TELEPATHY);
                break;
        case RACE_SPRITE:
-               (*f2) |= (TR2_RES_LITE);
-               (*f3) |= (TR3_FEATHER);
+               add_flag(flgs, TR_RES_LITE);
+               add_flag(flgs, TR_FEATHER);
                if (p_ptr->lev > 9)
-                       (*f1) |= (TR1_SPEED);
+                       add_flag(flgs, TR_SPEED);
                break;
        case RACE_BEASTMAN:
-               (*f2) |= (TR2_RES_SOUND);
-               (*f2) |= (TR2_RES_CONF);
+               add_flag(flgs, TR_RES_SOUND);
+               add_flag(flgs, TR_RES_CONF);
                break;
        case RACE_ANGEL:
-               (*f3) |= (TR3_FEATHER);
-               (*f3) |= (TR3_SEE_INVIS);
+               add_flag(flgs, TR_FEATHER);
+               add_flag(flgs, TR_SEE_INVIS);
                break;
        case RACE_DEMON:
-               (*f2) |= (TR2_RES_FIRE);
-               (*f2) |= (TR2_RES_NETHER);
-               (*f2) |= (TR2_HOLD_LIFE);
+               add_flag(flgs, TR_RES_FIRE);
+               add_flag(flgs, TR_RES_NETHER);
+               add_flag(flgs, TR_HOLD_LIFE);
                if (p_ptr->lev > 9)
-                       (*f3) |= (TR3_SEE_INVIS);
+                       add_flag(flgs, TR_SEE_INVIS);
                break;
        case RACE_DUNADAN:
-               (*f2) |= (TR2_SUST_CON);
+               add_flag(flgs, TR_SUST_CON);
                break;
        case RACE_S_FAIRY:
-               (*f3) |= (TR3_FEATHER);
+               add_flag(flgs, TR_FEATHER);
                break;
        case RACE_KUTA:
-               (*f2) |= (TR2_RES_CONF);
+               add_flag(flgs, TR_RES_CONF);
                break;
        case RACE_ANDROID:
-               (*f2) |= (TR2_FREE_ACT);
-               (*f2) |= (TR2_RES_POIS);
-               (*f3) |= (TR3_SLOW_DIGEST);
-               (*f2) |= (TR2_HOLD_LIFE);
+               add_flag(flgs, TR_FREE_ACT);
+               add_flag(flgs, TR_RES_POIS);
+               add_flag(flgs, TR_SLOW_DIGEST);
+               add_flag(flgs, TR_HOLD_LIFE);
                break;
        default:
                ; /* Do nothing */
@@ -2584,255 +2517,267 @@ static void player_flags(u32b *f1, u32b *f2, u32b *f3)
        {
                if (p_ptr->muta3 & MUT3_FLESH_ROT)
                {
-                       (*f3) &= ~(TR3_REGEN);
+                       remove_flag(flgs, TR_REGEN);
                }
 
                if ((p_ptr->muta3 & MUT3_XTRA_FAT) ||
                        (p_ptr->muta3 & MUT3_XTRA_LEGS) ||
                        (p_ptr->muta3 & MUT3_SHORT_LEG))
                {
-                       (*f1) |= TR1_SPEED;
+                       add_flag(flgs, TR_SPEED);
                }
 
                if (p_ptr->muta3  & MUT3_ELEC_TOUC)
                {
-                       (*f3) |= TR3_SH_ELEC;
+                       add_flag(flgs, TR_SH_ELEC);
                }
 
                if (p_ptr->muta3 & MUT3_FIRE_BODY)
                {
-                       (*f3) |= TR3_SH_FIRE;
-                       (*f3) |= TR3_LITE;
+                       add_flag(flgs, TR_SH_FIRE);
+                       add_flag(flgs, TR_LITE);
                }
 
                if (p_ptr->muta3 & MUT3_WINGS)
                {
-                       (*f3) |= TR3_FEATHER;
+                       add_flag(flgs, TR_FEATHER);
                }
 
                if (p_ptr->muta3 & MUT3_FEARLESS)
                {
-                       (*f2) |= (TR2_RES_FEAR);
+                       add_flag(flgs, TR_RES_FEAR);
                }
 
                if (p_ptr->muta3 & MUT3_REGEN)
                {
-                       (*f3) |= TR3_REGEN;
+                       add_flag(flgs, TR_REGEN);
                }
 
                if (p_ptr->muta3 & MUT3_ESP)
                {
-                       (*f3) |= TR3_TELEPATHY;
+                       add_flag(flgs, TR_TELEPATHY);
                }
 
                if (p_ptr->muta3 & MUT3_MOTION)
                {
-                       (*f2) |= TR2_FREE_ACT;
+                       add_flag(flgs, TR_FREE_ACT);
                }
        }
 
        if (p_ptr->pseikaku == SEIKAKU_SEXY)
-               (*f3) |= TR3_AGGRAVATE;
+               add_flag(flgs, TR_AGGRAVATE);
        if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)
        {
-               (*f2) |= (TR2_RES_BLIND);
-               (*f2) |= (TR2_RES_CONF);
-               (*f2) |= (TR2_HOLD_LIFE);
-               (*f3) |= (TR3_LITE);
+               add_flag(flgs, TR_RES_BLIND);
+               add_flag(flgs, TR_RES_CONF);
+               add_flag(flgs, TR_HOLD_LIFE);
+               add_flag(flgs, TR_LITE);
                if (p_ptr->lev > 9)
-                       (*f1) |= (TR1_SPEED);
+                       add_flag(flgs, TR_SPEED);
        }
        if (p_ptr->special_defense & KATA_FUUJIN)
-               (*f2) |= TR2_REFLECT;
+               add_flag(flgs, TR_REFLECT);
        if (p_ptr->special_defense & KAMAE_GENBU)
-               (*f2) |= TR2_REFLECT;
+               add_flag(flgs, TR_REFLECT);
        if (p_ptr->special_defense & KAMAE_SUZAKU)
-               (*f3) |= TR3_FEATHER;
+               add_flag(flgs, TR_FEATHER);
        if (p_ptr->special_defense & KAMAE_SEIRYU)
        {
-               (*f2) |= (TR2_RES_FIRE);
-               (*f2) |= (TR2_RES_COLD);
-               (*f2) |= (TR2_RES_ACID);
-               (*f2) |= (TR2_RES_ELEC);
-               (*f2) |= (TR2_RES_POIS);
-               (*f3) |= (TR3_FEATHER);
-               (*f3) |= (TR3_SH_FIRE);
-               (*f3) |= (TR3_SH_ELEC);
-               (*f3) |= (TR3_SH_COLD);
+               add_flag(flgs, TR_RES_FIRE);
+               add_flag(flgs, TR_RES_COLD);
+               add_flag(flgs, TR_RES_ACID);
+               add_flag(flgs, TR_RES_ELEC);
+               add_flag(flgs, TR_RES_POIS);
+               add_flag(flgs, TR_FEATHER);
+               add_flag(flgs, TR_SH_FIRE);
+               add_flag(flgs, TR_SH_ELEC);
+               add_flag(flgs, TR_SH_COLD);
        }
        if (p_ptr->special_defense & KATA_MUSOU)
        {
-               (*f2) |= TR2_RES_FEAR;
-               (*f2) |= TR2_RES_LITE;
-               (*f2) |= TR2_RES_DARK;
-               (*f2) |= TR2_RES_BLIND;
-               (*f2) |= TR2_RES_CONF;
-               (*f2) |= TR2_RES_SOUND;
-               (*f2) |= TR2_RES_SHARDS;
-               (*f2) |= TR2_RES_NETHER;
-               (*f2) |= TR2_RES_NEXUS;
-               (*f2) |= TR2_RES_CHAOS;
-               (*f2) |= TR2_RES_DISEN;
-               (*f2) |= TR2_REFLECT;
-               (*f2) |= TR2_HOLD_LIFE;
-               (*f2) |= TR2_FREE_ACT;
-               (*f3) |= TR3_SH_FIRE;
-               (*f3) |= TR3_SH_ELEC;
-               (*f3) |= TR3_SH_COLD;
-               (*f3) |= TR3_FEATHER;
-               (*f3) |= TR3_LITE;
-               (*f3) |= TR3_SEE_INVIS;
-               (*f3) |= TR3_TELEPATHY;
-               (*f3) |= TR3_SLOW_DIGEST;
-               (*f3) |= TR3_REGEN;
-               (*f2) |= (TR2_SUST_STR);
-               (*f2) |= (TR2_SUST_INT);
-               (*f2) |= (TR2_SUST_WIS);
-               (*f2) |= (TR2_SUST_DEX);
-               (*f2) |= (TR2_SUST_CON);
-               (*f2) |= (TR2_SUST_CHR);
+               add_flag(flgs, TR_RES_FEAR);
+               add_flag(flgs, TR_RES_LITE);
+               add_flag(flgs, TR_RES_DARK);
+               add_flag(flgs, TR_RES_BLIND);
+               add_flag(flgs, TR_RES_CONF);
+               add_flag(flgs, TR_RES_SOUND);
+               add_flag(flgs, TR_RES_SHARDS);
+               add_flag(flgs, TR_RES_NETHER);
+               add_flag(flgs, TR_RES_NEXUS);
+               add_flag(flgs, TR_RES_CHAOS);
+               add_flag(flgs, TR_RES_DISEN);
+               add_flag(flgs, TR_REFLECT);
+               add_flag(flgs, TR_HOLD_LIFE);
+               add_flag(flgs, TR_FREE_ACT);
+               add_flag(flgs, TR_SH_FIRE);
+               add_flag(flgs, TR_SH_ELEC);
+               add_flag(flgs, TR_SH_COLD);
+               add_flag(flgs, TR_FEATHER);
+               add_flag(flgs, TR_LITE);
+               add_flag(flgs, TR_SEE_INVIS);
+               add_flag(flgs, TR_TELEPATHY);
+               add_flag(flgs, TR_SLOW_DIGEST);
+               add_flag(flgs, TR_REGEN);
+               add_flag(flgs, TR_SUST_STR);
+               add_flag(flgs, TR_SUST_INT);
+               add_flag(flgs, TR_SUST_WIS);
+               add_flag(flgs, TR_SUST_DEX);
+               add_flag(flgs, TR_SUST_CON);
+               add_flag(flgs, TR_SUST_CHR);
        }
 }
 
 
-static void tim_player_flags(u32b *f1, u32b *f2, u32b *f3, bool im_and_res)
+static void tim_player_flags(u32b flgs[TR_FLAG_SIZE], bool im_and_res)
 {
+       int i;
+
        /* Clear */
-       (*f1) = (*f2) = (*f3) = 0L;
+       for (i = 0; i < TR_FLAG_SIZE; i++)
+               flgs[i] = 0L;
 
        if (p_ptr->hero || p_ptr->shero || music_singing(MUSIC_HERO) || music_singing(MUSIC_SHERO))
-               (*f2) |= TR2_RES_FEAR;
+               add_flag(flgs, TR_RES_FEAR);
        if (p_ptr->tim_invis)
-               (*f3) |= TR3_SEE_INVIS;
+               add_flag(flgs, TR_SEE_INVIS);
        if (p_ptr->tim_regen)
-               (*f3) |= TR3_REGEN;
+               add_flag(flgs, TR_REGEN);
        if (p_ptr->tim_esp || music_singing(MUSIC_MIND))
-               (*f3) |= TR3_TELEPATHY;
+               add_flag(flgs, TR_TELEPATHY);
        if (p_ptr->fast || p_ptr->slow || music_singing(MUSIC_SPEED) || music_singing(MUSIC_SHERO))
-               (*f1) |= TR1_SPEED;
+               add_flag(flgs, TR_SPEED);
        if  ((p_ptr->special_defense & KATA_MUSOU) || music_singing(MUSIC_RESIST))
        {
-               (*f2) |= (TR2_RES_FIRE);
-               (*f2) |= (TR2_RES_COLD);
-               (*f2) |= (TR2_RES_ACID);
-               (*f2) |= (TR2_RES_ELEC);
-               (*f2) |= (TR2_RES_POIS);
+               add_flag(flgs, TR_RES_FIRE);
+               add_flag(flgs, TR_RES_COLD);
+               add_flag(flgs, TR_RES_ACID);
+               add_flag(flgs, TR_RES_ELEC);
+               add_flag(flgs, TR_RES_POIS);
        }
        if (im_and_res)
        {
                if (p_ptr->oppose_acid && !(p_ptr->special_defense & DEFENSE_ACID) && !((prace_is_(RACE_YEEK)) && (p_ptr->lev > 19)))
-                       (*f2) |= TR2_RES_ACID;
+                       add_flag(flgs, TR_RES_ACID);
                if (p_ptr->oppose_elec && !(p_ptr->special_defense & DEFENSE_ELEC))
-                       (*f2) |= TR2_RES_ELEC;
+                       add_flag(flgs, TR_RES_ELEC);
                if (p_ptr->oppose_fire && !(p_ptr->special_defense & DEFENSE_FIRE))
-                       (*f2) |= TR2_RES_FIRE;
+                       add_flag(flgs, TR_RES_FIRE);
                if (p_ptr->oppose_cold && !(p_ptr->special_defense & DEFENSE_COLD))
-                       (*f2) |= TR2_RES_COLD;
+                       add_flag(flgs, TR_RES_COLD);
        }
        else
        {
                if (p_ptr->oppose_acid)
-                       (*f2) |= TR2_RES_ACID;
+                       add_flag(flgs, TR_RES_ACID);
                if (p_ptr->oppose_elec)
-                       (*f2) |= TR2_RES_ELEC;
+                       add_flag(flgs, TR_RES_ELEC);
                if (p_ptr->oppose_fire)
-                       (*f2) |= TR2_RES_FIRE;
+                       add_flag(flgs, TR_RES_FIRE);
                if (p_ptr->oppose_cold)
-                       (*f2) |= TR2_RES_COLD;
+                       add_flag(flgs, TR_RES_COLD);
        }
        if (p_ptr->oppose_pois)
-               (*f2) |= TR2_RES_POIS;
+               add_flag(flgs, TR_RES_POIS);
        if (p_ptr->special_attack & ATTACK_ACID)
-               (*f1) |= TR1_BRAND_ACID;
+               add_flag(flgs, TR_BRAND_ACID);
        if (p_ptr->special_attack & ATTACK_ELEC)
-               (*f1) |= TR1_BRAND_ELEC;
+               add_flag(flgs, TR_BRAND_ELEC);
        if (p_ptr->special_attack & ATTACK_FIRE)
-               (*f1) |= TR1_BRAND_FIRE;
+               add_flag(flgs, TR_BRAND_FIRE);
        if (p_ptr->special_attack & ATTACK_COLD)
-               (*f1) |= TR1_BRAND_COLD;
+               add_flag(flgs, TR_BRAND_COLD);
        if (p_ptr->special_attack & ATTACK_POIS)
-               (*f1) |= TR1_BRAND_POIS;
+               add_flag(flgs, TR_BRAND_POIS);
        if (p_ptr->special_defense & DEFENSE_ACID)
-               (*f2) |= TR2_IM_ACID;
+               add_flag(flgs, TR_IM_ACID);
        if (p_ptr->special_defense & DEFENSE_ELEC)
-               (*f2) |= TR2_IM_ELEC;
+               add_flag(flgs, TR_IM_ELEC);
        if (p_ptr->special_defense & DEFENSE_FIRE)
-               (*f2) |= TR2_IM_FIRE;
+               add_flag(flgs, TR_IM_FIRE);
        if (p_ptr->special_defense & DEFENSE_COLD)
-               (*f2) |= TR2_IM_COLD;
+               add_flag(flgs, TR_IM_COLD);
        if (p_ptr->wraith_form)
-               (*f2) |= TR2_REFLECT;
+               add_flag(flgs, TR_REFLECT);
        /* by henkma */
        if (p_ptr->tim_reflect){
-               (*f2) |= TR2_REFLECT;
+               add_flag(flgs, TR_REFLECT);
        }
 
        if (p_ptr->magicdef)
        {
-               (*f2) |= TR2_RES_BLIND;
-               (*f2) |= TR2_RES_CONF;
-               (*f2) |= TR2_REFLECT;
-               (*f2) |= TR2_FREE_ACT;
-               (*f3) |= TR3_FEATHER;
+               add_flag(flgs, TR_RES_BLIND);
+               add_flag(flgs, TR_RES_CONF);
+               add_flag(flgs, TR_REFLECT);
+               add_flag(flgs, TR_FREE_ACT);
+               add_flag(flgs, TR_FEATHER);
        }
        if (p_ptr->tim_res_nether)
        {
-               (*f2) |= TR2_RES_NETHER;
+               add_flag(flgs, TR_RES_NETHER);
        }
        if (p_ptr->tim_sh_fire)
        {
-               (*f3) |= TR3_SH_FIRE;
+               add_flag(flgs, TR_SH_FIRE);
        }
        if (p_ptr->ult_res)
        {
-               (*f2) |= TR2_RES_FEAR;
-               (*f2) |= TR2_RES_LITE;
-               (*f2) |= TR2_RES_DARK;
-               (*f2) |= TR2_RES_BLIND;
-               (*f2) |= TR2_RES_CONF;
-               (*f2) |= TR2_RES_SOUND;
-               (*f2) |= TR2_RES_SHARDS;
-               (*f2) |= TR2_RES_NETHER;
-               (*f2) |= TR2_RES_NEXUS;
-               (*f2) |= TR2_RES_CHAOS;
-               (*f2) |= TR2_RES_DISEN;
-               (*f2) |= TR2_REFLECT;
-               (*f2) |= TR2_HOLD_LIFE;
-               (*f2) |= TR2_FREE_ACT;
-               (*f3) |= TR3_SH_FIRE;
-               (*f3) |= TR3_SH_ELEC;
-               (*f3) |= TR3_SH_COLD;
-               (*f3) |= TR3_FEATHER;
-               (*f3) |= TR3_LITE;
-               (*f3) |= TR3_SEE_INVIS;
-               (*f3) |= TR3_TELEPATHY;
-               (*f3) |= TR3_SLOW_DIGEST;
-               (*f3) |= TR3_REGEN;
-               (*f2) |= (TR2_SUST_STR);
-               (*f2) |= (TR2_SUST_INT);
-               (*f2) |= (TR2_SUST_WIS);
-               (*f2) |= (TR2_SUST_DEX);
-               (*f2) |= (TR2_SUST_CON);
-               (*f2) |= (TR2_SUST_CHR);
+               add_flag(flgs, TR_RES_FEAR);
+               add_flag(flgs, TR_RES_LITE);
+               add_flag(flgs, TR_RES_DARK);
+               add_flag(flgs, TR_RES_BLIND);
+               add_flag(flgs, TR_RES_CONF);
+               add_flag(flgs, TR_RES_SOUND);
+               add_flag(flgs, TR_RES_SHARDS);
+               add_flag(flgs, TR_RES_NETHER);
+               add_flag(flgs, TR_RES_NEXUS);
+               add_flag(flgs, TR_RES_CHAOS);
+               add_flag(flgs, TR_RES_DISEN);
+               add_flag(flgs, TR_REFLECT);
+               add_flag(flgs, TR_HOLD_LIFE);
+               add_flag(flgs, TR_FREE_ACT);
+               add_flag(flgs, TR_SH_FIRE);
+               add_flag(flgs, TR_SH_ELEC);
+               add_flag(flgs, TR_SH_COLD);
+               add_flag(flgs, TR_FEATHER);
+               add_flag(flgs, TR_LITE);
+               add_flag(flgs, TR_SEE_INVIS);
+               add_flag(flgs, TR_TELEPATHY);
+               add_flag(flgs, TR_SLOW_DIGEST);
+               add_flag(flgs, TR_REGEN);
+               add_flag(flgs, TR_SUST_STR);
+               add_flag(flgs, TR_SUST_INT);
+               add_flag(flgs, TR_SUST_WIS);
+               add_flag(flgs, TR_SUST_DEX);
+               add_flag(flgs, TR_SUST_CON);
+               add_flag(flgs, TR_SUST_CHR);
        }
 }
 
 
+/* Mode flags for displaying player flags */
+#define DP_CURSE   0x01
+#define DP_IMM     0x02
+#define DP_WP      0x08
+
+
 /*
  * Equippy chars
  */
-static void display_player_equippy(int y, int x)
+static void display_player_equippy(int y, int x, u16b mode)
 {
-       int i;
+       int i, max_i;
 
        byte a;
        char c;
 
        object_type *o_ptr;
 
+        /* Weapon flags need only two column */
+        if (mode & DP_WP) max_i = INVEN_LARM + 1;
+        else max_i = INVEN_TOTAL;
 
        /* Dump equippy chars */
-       for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
+       for (i = INVEN_RARM; i < max_i; i++)
        {
                /* Object */
                o_ptr = &inventory[i];
@@ -2855,24 +2800,25 @@ static void display_player_equippy(int y, int x)
 
 void print_equippy(void)
 {
-       display_player_equippy(ROW_EQUIPPY, COL_EQUIPPY);
+       display_player_equippy(ROW_EQUIPPY, COL_EQUIPPY, 0);
 }
 
 /*
  *
  */
 
-static void known_obj_immunity(u32b *f1, u32b *f2, u32b *f3)
+static void known_obj_immunity(u32b flgs[TR_FLAG_SIZE])
 {
        int i;
 
        /* Clear */
-       (*f1) = (*f2) = (*f3) = 0L;
+       for (i = 0; i < TR_FLAG_SIZE; i++)
+               flgs[i] = 0L;
 
        /* Check equipment */
        for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
        {
-               u32b    o_f1, o_f2, o_f3;
+               u32b o_flgs[TR_FLAG_SIZE];
 
                object_type *o_ptr;
 
@@ -2882,129 +2828,167 @@ static void known_obj_immunity(u32b *f1, u32b *f2, u32b *f3)
                if (!o_ptr->k_idx) continue;
 
                /* Known flags */
-               object_flags_known(o_ptr, &o_f1, &o_f2, &o_f3);
+               object_flags_known(o_ptr, o_flgs);
 
-               if (o_f2 & TR2_IM_ACID) (*f2) |= TR2_RES_ACID;
-               if (o_f2 & TR2_IM_ELEC) (*f2) |= TR2_RES_ELEC;
-               if (o_f2 & TR2_IM_FIRE) (*f2) |= TR2_RES_FIRE;
-               if (o_f2 & TR2_IM_COLD) (*f2) |= TR2_RES_COLD;
+               if (have_flag(flgs, TR_IM_ACID)) add_flag(flgs, TR_RES_ACID);
+               if (have_flag(flgs, TR_IM_ELEC)) add_flag(flgs, TR_RES_ELEC);
+               if (have_flag(flgs, TR_IM_FIRE)) add_flag(flgs, TR_RES_FIRE);
+               if (have_flag(flgs, TR_IM_COLD)) add_flag(flgs, TR_RES_COLD);
        }
 }
 
-static void player_immunity(u32b *f1, u32b *f2, u32b *f3)
+static void player_immunity(u32b flgs[TR_FLAG_SIZE])
 {
+       int i;
+
        /* Clear */
-       (*f1) = (*f2) = (*f3) = 0L;
+       for (i = 0; i < TR_FLAG_SIZE; i++)
+               flgs[i] = 0L;
 
        if (prace_is_(RACE_SPECTRE))
-               (*f2) |= TR2_RES_NETHER;
+               add_flag(flgs, TR_RES_NETHER);
        if (p_ptr->mimic_form == MIMIC_VAMPIRE || prace_is_(RACE_VAMPIRE))
-               (*f2) |= TR2_RES_DARK;
+               add_flag(flgs, TR_RES_DARK);
        if (p_ptr->mimic_form == MIMIC_DEMON_LORD)
-               (*f2) |= TR2_RES_FIRE;
+               add_flag(flgs, TR_RES_FIRE);
        else if (prace_is_(RACE_YEEK) && p_ptr->lev > 19)
-               (*f2) |= TR2_RES_ACID;
+               add_flag(flgs, TR_RES_ACID);
 }
 
-static void tim_player_immunity(u32b *f1, u32b *f2, u32b *f3)
+static void tim_player_immunity(u32b flgs[TR_FLAG_SIZE])
 {
+       int i;
+
        /* Clear */
-       (*f1) = (*f2) = (*f3) = 0L;
+       for (i = 0; i < TR_FLAG_SIZE; i++)
+               flgs[i] = 0L;
 
        if (p_ptr->special_defense & DEFENSE_ACID)
-               (*f2) |= TR2_RES_ACID;
+               add_flag(flgs, TR_RES_ACID);
        if (p_ptr->special_defense & DEFENSE_ELEC)
-               (*f2) |= TR2_RES_ELEC;
+               add_flag(flgs, TR_RES_ELEC);
        if (p_ptr->special_defense & DEFENSE_FIRE)
-               (*f2) |= TR2_RES_FIRE;
+               add_flag(flgs, TR_RES_FIRE);
        if (p_ptr->special_defense & DEFENSE_COLD)
-               (*f2) |= TR2_RES_COLD;
+               add_flag(flgs, TR_RES_COLD);
        if (p_ptr->wraith_form)
-               (*f2) |= TR2_RES_DARK;
+               add_flag(flgs, TR_RES_DARK);
 }
 
-static void player_vuln_flags(u32b *f1, u32b *f2, u32b *f3)
+static void player_vuln_flags(u32b flgs[TR_FLAG_SIZE])
 {
+       int i;
+
        /* Clear */
-       (*f1) = (*f2) = (*f3) = 0L;
+       for (i = 0; i < TR_FLAG_SIZE; i++)
+               flgs[i] = 0L;
 
        if ((p_ptr->muta3 & MUT3_VULN_ELEM) || (p_ptr->special_defense & KATA_KOUKIJIN))
        {
-               (*f2) |= TR2_RES_ACID;
-               (*f2) |= TR2_RES_ELEC;
-               (*f2) |= TR2_RES_FIRE;
-               (*f2) |= TR2_RES_COLD;
+               add_flag(flgs, TR_RES_ACID);
+               add_flag(flgs, TR_RES_ELEC);
+               add_flag(flgs, TR_RES_FIRE);
+               add_flag(flgs, TR_RES_COLD);
        }
        if (prace_is_(RACE_ANDROID))
-               (*f2) |= TR2_RES_ELEC;
+               add_flag(flgs, TR_RES_ELEC);
        if (prace_is_(RACE_ENT))
-               (*f2) |= TR2_RES_FIRE;
+               add_flag(flgs, TR_RES_FIRE);
        if (prace_is_(RACE_VAMPIRE) || prace_is_(RACE_S_FAIRY) ||
            (p_ptr->mimic_form == MIMIC_VAMPIRE))
-               (*f2) |= TR2_RES_LITE;
+               add_flag(flgs, TR_RES_LITE);
 }
 
+
+/*
+ * A struct for storing misc. flags
+ */
+typedef struct {
+        u32b player_flags[TR_FLAG_SIZE];
+        u32b tim_player_flags[TR_FLAG_SIZE];
+        u32b player_imm[TR_FLAG_SIZE];
+        u32b tim_player_imm[TR_FLAG_SIZE];
+        u32b player_vuln[TR_FLAG_SIZE];
+        u32b known_obj_imm[TR_FLAG_SIZE];
+} all_player_flags;
+
+
 /*
  * Helper function, see below
  */
-static void display_player_flag_aux(int row, int col, char *header,
-                                   int n, u32b flag1, u32b flag2,
-                                   u32b im_f[], u32b vul_f)
+static void display_flag_aux(int row, int col, cptr header,
+                                   int flag1, all_player_flags *f, u16b mode)
 {
        int     i;
-       u32b    f[3];
        bool    vuln = FALSE;
+        int max_i;
 
-       if ((vul_f & flag1) && !((im_f[0] | im_f[1] | im_f[2]) & flag1))
+       if (have_flag(f->player_vuln, flag1) &&
+            !(have_flag(f->known_obj_imm, flag1) ||
+              have_flag(f->player_imm, flag1) ||
+              have_flag(f->tim_player_imm, flag1)))
                vuln = TRUE;
 
        /* Header */
-       c_put_str(TERM_WHITE, header, row, col);
+       if (!(mode & DP_IMM)) c_put_str(TERM_WHITE, header, row, col);
 
        /* Advance */
        col += strlen(header) + 1;
 
+        /* Weapon flags need only two column */
+        if (mode & DP_WP) max_i = INVEN_LARM + 1;
+        else max_i = INVEN_TOTAL;
+
        /* Check equipment */
-       for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
+       for (i = INVEN_RARM; i < max_i; i++)
        {
+                u32b flgs[TR_FLAG_SIZE];
                object_type *o_ptr;
-               f[0] = f[1] = f[2] = 0L;
 
                /* Object */
                o_ptr = &inventory[i];
 
                /* Known flags */
-               object_flags_known(o_ptr, &f[0], &f[1], &f[2]);
+               object_flags_known(o_ptr, flgs);
 
                /* Default */
-               c_put_str((byte)(vuln ? TERM_RED : TERM_SLATE), ".", row, col);
+                if (!(mode & DP_IMM))
+                        c_put_str((byte)(vuln ? TERM_RED : TERM_SLATE), ".", row, col);
 
                /* Check flags */
-               if (f[n - 1] & flag1) c_put_str((byte)(vuln ? TERM_L_RED : TERM_WHITE), "+", row, col);
-               if (f[n - 1] & flag2) c_put_str(TERM_WHITE, "*", row, col);
+                if (mode & DP_CURSE)
+                {
+                        if ((mode & DP_CURSE) && (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE)))
+                                c_put_str(TERM_WHITE, "+", row, col);
+                        if ((mode & DP_CURSE) && (o_ptr->curse_flags & TRC_PERMA_CURSE))
+                                c_put_str(TERM_WHITE, "*", row, col);
+                }
+                else
+                {
+                        if (have_flag(flgs, flag1))
+                                c_put_str((byte)(vuln ? TERM_L_RED : TERM_WHITE),
+                                          (mode & DP_IMM) ? "*" : "+", row, col);
+                }
 
                /* Advance */
                col++;
        }
 
-       /* Player flags */
-       player_flags(&f[0], &f[1], &f[2]);
+        /* Assume that player flag is already written */
+        if (mode & DP_IMM) return;
 
        /* Default */
        c_put_str((byte)(vuln ? TERM_RED : TERM_SLATE), ".", row, col);
 
-       /* Check flags */
-       if (f[n-1] & flag1) c_put_str((byte)(vuln ? TERM_L_RED : TERM_WHITE), "+", row, col);
+       /* Player flags */
+       if (have_flag(f->player_flags, flag1)) c_put_str((byte)(vuln ? TERM_L_RED : TERM_WHITE), "+", row, col);
 
        /* Timed player flags */
-       tim_player_flags(&f[0], &f[1], &f[2], TRUE);
-
-       /* Check flags */
-       if (f[n-1] & flag1) c_put_str((byte)(vuln ? TERM_ORANGE : TERM_YELLOW), "#", row, col);
+       if (have_flag(f->tim_player_flags, flag1)) c_put_str((byte)(vuln ? TERM_ORANGE : TERM_YELLOW), "#", row, col);
 
        /* Immunity */
-       if (im_f[2] & flag1) c_put_str(TERM_YELLOW, "*", row, col);
-       if (im_f[1] & flag1) c_put_str(TERM_WHITE, "*", row, col);
+       if (have_flag(f->tim_player_imm, flag1)) c_put_str(TERM_YELLOW, "*", row, col);
+       if (have_flag(f->player_imm, flag1)) c_put_str(TERM_WHITE, "*", row, col);
 
        /* Vulnerability */
        if (vuln) c_put_str(TERM_RED, "v", row, col + 1);
@@ -3019,44 +3003,54 @@ static void display_player_flag_info(void)
        int row;
        int col;
 
-       u32b im_f[3][3], vul_f[3];
-
-       known_obj_immunity(&im_f[0][0], &im_f[1][0], &im_f[2][0]);
-       player_immunity(&im_f[0][1], &im_f[1][1], &im_f[2][1]);
-       tim_player_immunity(&im_f[0][2], &im_f[1][2], &im_f[2][2]);
+        all_player_flags f;
 
-       player_vuln_flags(&vul_f[0], &vul_f[1], &vul_f[2]);
+        /* Extract flags and store */
+       player_flags(f.player_flags);
+       tim_player_flags(f.tim_player_flags, TRUE);
+       player_immunity(f.player_imm);
+       tim_player_immunity(f.tim_player_imm);
+       known_obj_immunity(f.known_obj_imm);
+       player_vuln_flags(f.player_vuln);
 
        /*** Set 1 ***/
 
        row = 12;
        col = 1;
 
-       display_player_equippy(row-2, col+8);
+       display_player_equippy(row-2, col+8, 0);
        c_put_str(TERM_WHITE, "abcdefghijkl@", row-1, col+8);
 
 #ifdef JP
-display_player_flag_aux(row+0, col, "ÂÑ»À  :", 2, TR2_RES_ACID, TR2_IM_ACID, im_f[1], vul_f[1]);
-display_player_flag_aux(row+1, col, "ÂÑÅÅ·â:", 2, TR2_RES_ELEC, TR2_IM_ELEC, im_f[1], vul_f[1]);
-display_player_flag_aux(row+2, col, "ÂѲбê:", 2, TR2_RES_FIRE, TR2_IM_FIRE, im_f[1], vul_f[1]);
-display_player_flag_aux(row+3, col, "ÂÑÎ䵤:", 2, TR2_RES_COLD, TR2_IM_COLD, im_f[1], vul_f[1]);
-display_player_flag_aux(row+4, col, "ÂÑÆÇ  :", 2, TR2_RES_POIS, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+5, col, "ÂÑÁ®¸÷:", 2, TR2_RES_LITE, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+6, col, "ÂѰŹõ:", 2, TR2_RES_DARK, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+7, col, "ÂÑÇËÊÒ:", 2, TR2_RES_SHARDS, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+8, col, "ÂÑÌÕÌÜ:", 2, TR2_RES_BLIND, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+9, col, "ÂѺ®Íð:", 2, TR2_RES_CONF, 0, im_f[1], vul_f[1]);
-#else
-       display_player_flag_aux(row+0, col, "Acid  :", 2, TR2_RES_ACID, TR2_IM_ACID, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+1, col, "Elec  :", 2, TR2_RES_ELEC, TR2_IM_ELEC, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+2, col, "Fire  :", 2, TR2_RES_FIRE, TR2_IM_FIRE, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+3, col, "Cold  :", 2, TR2_RES_COLD, TR2_IM_COLD, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+4, col, "Poison:", 2, TR2_RES_POIS, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+5, col, "Light :", 2, TR2_RES_LITE, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+6, col, "Dark  :", 2, TR2_RES_DARK, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+7, col, "Shard :", 2, TR2_RES_SHARDS, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+8, col, "Blind :", 2, TR2_RES_BLIND, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+9, col, "Conf  :", 2, TR2_RES_CONF, 0, im_f[1], vul_f[1]);
+display_flag_aux(row+0, col, "ÂÑ»À  :", TR_RES_ACID, &f, 0);
+display_flag_aux(row+0, col, "ÂÑ»À  :", TR_IM_ACID, &f, DP_IMM);
+display_flag_aux(row+1, col, "ÂÑÅÅ·â:", TR_RES_ELEC, &f, 0);
+display_flag_aux(row+1, col, "ÂÑÅÅ·â:", TR_IM_ELEC, &f, DP_IMM);
+display_flag_aux(row+2, col, "ÂѲбê:", TR_RES_FIRE, &f, 0);
+display_flag_aux(row+2, col, "ÂѲбê:", TR_IM_FIRE, &f, DP_IMM);
+display_flag_aux(row+3, col, "ÂÑÎ䵤:", TR_RES_COLD, &f, 0);
+display_flag_aux(row+3, col, "ÂÑÎ䵤:", TR_IM_COLD, &f, DP_IMM);
+display_flag_aux(row+4, col, "ÂÑÆÇ  :", TR_RES_POIS, &f, 0);
+display_flag_aux(row+5, col, "ÂÑÁ®¸÷:", TR_RES_LITE, &f, 0);
+display_flag_aux(row+6, col, "ÂѰŹõ:", TR_RES_DARK, &f, 0);
+display_flag_aux(row+7, col, "ÂÑÇËÊÒ:", TR_RES_SHARDS, &f, 0);
+display_flag_aux(row+8, col, "ÂÑÌÕÌÜ:", TR_RES_BLIND, &f, 0);
+display_flag_aux(row+9, col, "ÂѺ®Íð:", TR_RES_CONF, &f, 0);
+#else
+       display_flag_aux(row+0, col, "Acid  :", TR_RES_ACID, &f, 0);
+       display_flag_aux(row+0, col, "Acid  :", TR_IM_ACID, &f, DP_IMM);
+       display_flag_aux(row+1, col, "Elec  :", TR_RES_ELEC, &f, 0);
+       display_flag_aux(row+1, col, "Elec  :", TR_IM_ELEC, &f, DP_IMM);
+       display_flag_aux(row+2, col, "Fire  :", TR_RES_FIRE, &f, 0);
+       display_flag_aux(row+2, col, "Fire  :", TR_IM_FIRE, &f, DP_IMM);
+       display_flag_aux(row+3, col, "Cold  :", TR_RES_COLD, &f, 0);
+       display_flag_aux(row+3, col, "Cold  :", TR_IM_COLD, &f, DP_IMM);
+       display_flag_aux(row+4, col, "Poison:", TR_RES_POIS, &f, 0);
+       display_flag_aux(row+5, col, "Light :", TR_RES_LITE, &f, 0);
+       display_flag_aux(row+6, col, "Dark  :", TR_RES_DARK, &f, 0);
+       display_flag_aux(row+7, col, "Shard :", TR_RES_SHARDS, &f, 0);
+       display_flag_aux(row+8, col, "Blind :", TR_RES_BLIND, &f, 0);
+       display_flag_aux(row+9, col, "Conf  :", TR_RES_CONF, &f, 0);
 #endif
 
 
@@ -3065,32 +3059,32 @@ display_player_flag_aux(row+9, col, "
        row = 12;
        col = 26;
 
-       display_player_equippy(row-2, col+8);
+       display_player_equippy(row-2, col+8, 0);
 
        c_put_str(TERM_WHITE, "abcdefghijkl@", row-1, col+8);
 
 #ifdef JP
-display_player_flag_aux(row+0, col, "Âѹ첻:", 2, TR2_RES_SOUND, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+1, col, "ÂÑÃϹö:", 2, TR2_RES_NETHER, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+2, col, "ÂÑ°øº®:", 2, TR2_RES_NEXUS, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+3, col, "ÂÑ¥«¥ª:", 2, TR2_RES_CHAOS, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+4, col, "ÂÑÎô²½:", 2, TR2_RES_DISEN, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+5, col, "ÂѶ²ÉÝ:", 2, TR2_RES_FEAR, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+6, col, "È¿¼Í  :", 2, TR2_REFLECT, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+7, col, "²Ð±ê¥ª:", 3, TR3_SH_FIRE, 0, im_f[2], vul_f[2]);
-display_player_flag_aux(row+8, col, "Åŵ¤¥ª:", 3, TR3_SH_ELEC, 0, im_f[2], vul_f[2]);
-display_player_flag_aux(row+9, col, "Î䵤¥ª:", 3, TR3_SH_COLD, 0, im_f[2], vul_f[2]);
+display_flag_aux(row+0, col, "Âѹ첻:", TR_RES_SOUND, &f, 0);
+display_flag_aux(row+1, col, "ÂÑÃϹö:", TR_RES_NETHER, &f, 0);
+display_flag_aux(row+2, col, "ÂÑ°øº®:", TR_RES_NEXUS, &f, 0);
+display_flag_aux(row+3, col, "ÂÑ¥«¥ª:", TR_RES_CHAOS, &f, 0);
+display_flag_aux(row+4, col, "ÂÑÎô²½:", TR_RES_DISEN, &f, 0);
+display_flag_aux(row+5, col, "ÂѶ²ÉÝ:", TR_RES_FEAR, &f, 0);
+display_flag_aux(row+6, col, "È¿¼Í  :", TR_REFLECT, &f, 0);
+display_flag_aux(row+7, col, "²Ð±ê¥ª:", TR_SH_FIRE, &f, 0);
+display_flag_aux(row+8, col, "Åŵ¤¥ª:", TR_SH_ELEC, &f, 0);
+display_flag_aux(row+9, col, "Î䵤¥ª:", TR_SH_COLD, &f, 0);
 #else
-       display_player_flag_aux(row+0, col, "Sound :", 2, TR2_RES_SOUND, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+1, col, "Nether:", 2, TR2_RES_NETHER, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+2, col, "Nexus :", 2, TR2_RES_NEXUS, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+3, col, "Chaos :", 2, TR2_RES_CHAOS, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+4, col, "Disnch:", 2, TR2_RES_DISEN, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+5, col, "Fear  :", 2, TR2_RES_FEAR, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+6, col, "Reflct:", 2, TR2_REFLECT, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+7, col, "AuFire:", 3, TR3_SH_FIRE, 0, im_f[2], vul_f[2]);
-       display_player_flag_aux(row+8, col, "AuElec:", 3, TR3_SH_ELEC, 0, im_f[2], vul_f[2]);
-       display_player_flag_aux(row+9, col, "AuCold:", 3, TR3_SH_COLD, 0, im_f[2], vul_f[2]);
+       display_flag_aux(row+0, col, "Sound :", TR_RES_SOUND, &f, 0);
+       display_flag_aux(row+1, col, "Nether:", TR_RES_NETHER, &f, 0);
+       display_flag_aux(row+2, col, "Nexus :", TR_RES_NEXUS, &f, 0);
+       display_flag_aux(row+3, col, "Chaos :", TR_RES_CHAOS, &f, 0);
+       display_flag_aux(row+4, col, "Disnch:", TR_RES_DISEN, &f, 0);
+       display_flag_aux(row+5, col, "Fear  :", TR_RES_FEAR, &f, 0);
+       display_flag_aux(row+6, col, "Reflct:", TR_REFLECT, &f, 0);
+       display_flag_aux(row+7, col, "AuFire:", TR_SH_FIRE, &f, 0);
+       display_flag_aux(row+8, col, "AuElec:", TR_SH_ELEC, &f, 0);
+       display_flag_aux(row+9, col, "AuCold:", TR_SH_COLD, &f, 0);
 #endif
 
 
@@ -3099,32 +3093,223 @@ display_player_flag_aux(row+9, col, "
        row = 12;
        col = 51;
 
-       display_player_equippy(row-2, col+12);
+       display_player_equippy(row-2, col+12, 0);
 
        c_put_str(TERM_WHITE, "abcdefghijkl@", row-1, col+12);
 
 #ifdef JP
-display_player_flag_aux(row+0, col, "²Ã®      :", 1, TR1_SPEED, 0, im_f[0], vul_f[0]);
-display_player_flag_aux(row+1, col, "ÂÑËãáã    :", 2, TR2_FREE_ACT, 0, im_f[1], vul_f[1]);
-display_player_flag_aux(row+2, col, "Æ©ÌÀÂλëǧ:", 3, TR3_SEE_INVIS, 0, im_f[2], vul_f[2]);
-display_player_flag_aux(row+3, col, "·Ð¸³ÃÍÊÝ»ý:", 2, TR2_HOLD_LIFE, 0, im_f[2], vul_f[1]);
-display_player_flag_aux(row+4, col, "¥Æ¥ì¥Ñ¥·¡¼:", 3, TR3_TELEPATHY, 0, im_f[2], vul_f[2]);
-display_player_flag_aux(row+5, col, "Ãپò½    :", 3, TR3_SLOW_DIGEST, 0, im_f[2], vul_f[2]);
-display_player_flag_aux(row+6, col, "µÞ²óÉü    :", 3, TR3_REGEN, 0, im_f[2], vul_f[2]);
-display_player_flag_aux(row+7, col, "ÉâÍ·      :", 3, TR3_FEATHER, 0, im_f[2], vul_f[2]);
-display_player_flag_aux(row+8, col, "±Ê±ó¸÷¸»  :", 3, TR3_LITE, 0, im_f[2], vul_f[2]);
-display_player_flag_aux(row+9, col, "¼ö¤¤      :", 3, (TR3_CURSED | TR3_HEAVY_CURSE), TR3_PERMA_CURSE, im_f[2], vul_f[2]);
-#else
-       display_player_flag_aux(row+0, col, "Speed     :", 1, TR1_SPEED, 0, im_f[0], vul_f[0]);
-       display_player_flag_aux(row+1, col, "FreeAction:", 2, TR2_FREE_ACT, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+2, col, "SeeInvisi.:", 3, TR3_SEE_INVIS, 0, im_f[2], vul_f[2]);
-       display_player_flag_aux(row+3, col, "Hold Life :", 2, TR2_HOLD_LIFE, 0, im_f[1], vul_f[1]);
-       display_player_flag_aux(row+4, col, "Telepathy :", 3, TR3_TELEPATHY, 0, im_f[2], vul_f[2]);
-       display_player_flag_aux(row+5, col, "SlowDigest:", 3, TR3_SLOW_DIGEST, 0, im_f[2], vul_f[2]);
-       display_player_flag_aux(row+6, col, "Regene.   :", 3, TR3_REGEN, 0, im_f[2], vul_f[2]);
-       display_player_flag_aux(row+7, col, "Levitation:", 3, TR3_FEATHER, 0, im_f[2], vul_f[2]);
-       display_player_flag_aux(row+8, col, "Perm Lite :", 3, TR3_LITE, 0, im_f[2], vul_f[2]);
-       display_player_flag_aux(row+9, col, "Cursed    :", 3, (TR3_CURSED | TR3_HEAVY_CURSE), TR3_PERMA_CURSE, im_f[2], vul_f[2]);
+display_flag_aux(row+0, col, "²Ã®      :", TR_SPEED, &f, 0);
+display_flag_aux(row+1, col, "ÂÑËãáã    :", TR_FREE_ACT, &f, 0);
+display_flag_aux(row+2, col, "Æ©ÌÀÂλëǧ:", TR_SEE_INVIS, &f, 0);
+display_flag_aux(row+3, col, "·Ð¸³ÃÍÊÝ»ý:", TR_HOLD_LIFE, &f, 0);
+display_flag_aux(row+4, col, "·Ù¹ð      :", TR_WARNING, &f, 0);
+display_flag_aux(row+5, col, "Ãپò½    :", TR_SLOW_DIGEST, &f, 0);
+display_flag_aux(row+6, col, "µÞ²óÉü    :", TR_REGEN, &f, 0);
+display_flag_aux(row+7, col, "ÉâÍ·      :", TR_FEATHER, &f, 0);
+display_flag_aux(row+8, col, "±Ê±ó¸÷¸»  :", TR_LITE, &f, 0);
+display_flag_aux(row+9, col, "¼ö¤¤      :", 0, &f, DP_CURSE);
+#else
+       display_flag_aux(row+0, col, "Speed     :", TR_SPEED, &f, 0);
+       display_flag_aux(row+1, col, "FreeAction:", TR_FREE_ACT, &f, 0);
+       display_flag_aux(row+2, col, "SeeInvisi.:", TR_SEE_INVIS, &f, 0);
+       display_flag_aux(row+3, col, "Hold Life :", TR_HOLD_LIFE, &f, 0);
+       display_flag_aux(row+4, col, "Warning   :", TR_WARNING, &f, 0);
+       display_flag_aux(row+5, col, "SlowDigest:", TR_SLOW_DIGEST, &f, 0);
+       display_flag_aux(row+6, col, "Regene.   :", TR_REGEN, &f, 0);
+       display_flag_aux(row+7, col, "Levitation:", TR_FEATHER, &f, 0);
+       display_flag_aux(row+8, col, "Perm Lite :", TR_LITE, &f, 0);
+       display_flag_aux(row+9, col, "Cursed    :", 0, &f, DP_CURSE);
+#endif
+
+}
+
+
+/*
+ * Special display, part 2
+ */
+static void display_player_other_flag_info(void)
+{
+       int row;
+       int col;
+
+        all_player_flags f;
+
+        /* Extract flags and store */
+       player_flags(f.player_flags);
+       tim_player_flags(f.tim_player_flags, TRUE);
+       player_immunity(f.player_imm);
+       tim_player_immunity(f.tim_player_imm);
+       known_obj_immunity(f.known_obj_imm);
+       player_vuln_flags(f.player_vuln);
+
+       /*** Set 1 ***/
+
+       row = 3;
+       col = 1;
+
+       display_player_equippy(row-2, col+12, DP_WP);
+
+       c_put_str(TERM_WHITE, "ab@", row-1, col+12);
+
+#ifdef JP
+        display_flag_aux(row+ 0, col, "¼Ù°­ ÇÜÂÇ :", TR_SLAY_EVIL, &f, DP_WP);
+        display_flag_aux(row+ 0, col, "¼Ù°­ ÇÜÂÇ :", TR_KILL_EVIL, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 1, col, "ÉÔ»à ÇÜÂÇ :", TR_SLAY_UNDEAD, &f, DP_WP);
+        display_flag_aux(row+ 1, col, "ÉÔ»à ÇÜÂÇ :", TR_KILL_UNDEAD, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 2, col, "°­Ëâ ÇÜÂÇ :", TR_SLAY_DEMON, &f, DP_WP);
+        display_flag_aux(row+ 2, col, "°­Ëâ ÇÜÂÇ :", TR_KILL_DEMON, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 3, col, "ζ ÇÜÂÇ   :", TR_SLAY_DRAGON, &f, DP_WP);
+        display_flag_aux(row+ 3, col, "ζ ÇÜÂÇ   :", TR_KILL_DRAGON, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 4, col, "¿Í´Ö ÇÜÂÇ :", TR_SLAY_HUMAN, &f, DP_WP);
+        display_flag_aux(row+ 4, col, "¿Í´Ö ÇÜÂÇ :", TR_KILL_HUMAN, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 5, col, "ưʪ ÇÜÂÇ :", TR_SLAY_ANIMAL, &f, DP_WP);
+        display_flag_aux(row+ 5, col, "ưʪ ÇÜÂÇ :", TR_KILL_ANIMAL, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 6, col, "¥ª¡¼¥¯ÇÜÂÇ:", TR_SLAY_ORC, &f, DP_WP);
+        display_flag_aux(row+ 6, col, "¥ª¡¼¥¯ÇÜÂÇ:", TR_KILL_ORC, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 7, col, "¥È¥í¥ëÇÜÂÇ:", TR_SLAY_TROLL, &f, DP_WP);
+        display_flag_aux(row+ 7, col, "¥È¥í¥ëÇÜÂÇ:", TR_KILL_TROLL, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 8, col, "µð¿Í ÇÜÂÇ :", TR_SLAY_GIANT, &f, DP_WP);
+        display_flag_aux(row+ 8, col, "µð¿Í ÇÜÂÇ :", TR_KILL_GIANT, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 9, col, "Íϲò      :", TR_BRAND_ACID, &f, DP_WP);
+        display_flag_aux(row+10, col, "ÅÅ·â      :", TR_BRAND_ELEC, &f, DP_WP);
+        display_flag_aux(row+11, col, "¾Æ´þ      :", TR_BRAND_FIRE, &f, DP_WP);
+        display_flag_aux(row+12, col, "Åà·ë      :", TR_BRAND_COLD, &f, DP_WP);
+        display_flag_aux(row+13, col, "ÆÇ»¦      :", TR_BRAND_POIS, &f, DP_WP);
+        display_flag_aux(row+14, col, "ÀÚ¤ìÌ£    :", TR_VORPAL, &f, DP_WP);
+        display_flag_aux(row+15, col, "ÃÏ¿Ì      :", TR_IMPACT, &f, DP_WP);
+        display_flag_aux(row+16, col, "µÛ·ì      :", TR_VAMPIRIC, &f, DP_WP);
+        display_flag_aux(row+17, col, "¥«¥ª¥¹¸ú²Ì:", TR_CHAOTIC, &f, DP_WP);
+        display_flag_aux(row+18, col, "ÍýÎÏ      :", TR_FORCE_WEAPON, &f, DP_WP);
+#else
+        display_flag_aux(row+ 0, col, "Slay Evil :", TR_SLAY_EVIL, &f, DP_WP);
+        display_flag_aux(row+ 0, col, "Slay Evil :", TR_KILL_EVIL, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 1, col, "Slay Und. :", TR_SLAY_UNDEAD, &f, DP_WP);
+        display_flag_aux(row+ 1, col, "Slay Und. :", TR_KILL_UNDEAD, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 2, col, "Slay Demon:", TR_SLAY_DEMON, &f, DP_WP);
+        display_flag_aux(row+ 2, col, "Slay Demon:", TR_KILL_DEMON, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 3, col, "Slay Drag.:", TR_SLAY_DRAGON, &f, DP_WP);
+        display_flag_aux(row+ 3, col, "Slay Drag.:", TR_KILL_DRAGON, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 4, col, "Slay Human:", TR_SLAY_HUMAN, &f, DP_WP);
+        display_flag_aux(row+ 4, col, "Slay Human:", TR_KILL_HUMAN, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 5, col, "Slay Anim.:", TR_SLAY_ANIMAL, &f, DP_WP);
+        display_flag_aux(row+ 5, col, "Slay Anim.:", TR_KILL_ANIMAL, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 6, col, "Slay Orc  :", TR_SLAY_ORC, &f, DP_WP);
+        display_flag_aux(row+ 6, col, "Slay Orc  :", TR_KILL_ORC, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 7, col, "Slay Troll:", TR_SLAY_TROLL, &f, DP_WP);
+        display_flag_aux(row+ 7, col, "Slay Troll:", TR_KILL_TROLL, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 8, col, "Slay Giant:", TR_SLAY_GIANT, &f, DP_WP);
+        display_flag_aux(row+ 8, col, "Slay Giant:", TR_KILL_GIANT, &f, (DP_WP|DP_IMM));
+        display_flag_aux(row+ 9, col, "Acid Brand:", TR_BRAND_ACID, &f, DP_WP);
+        display_flag_aux(row+10, col, "Elec Brand:", TR_BRAND_ELEC, &f, DP_WP);
+        display_flag_aux(row+11, col, "Fire Brand:", TR_BRAND_FIRE, &f, DP_WP);
+        display_flag_aux(row+12, col, "Cold Brand:", TR_BRAND_COLD, &f, DP_WP);
+        display_flag_aux(row+13, col, "Poison Brd:", TR_BRAND_POIS, &f, DP_WP);
+        display_flag_aux(row+14, col, "Sharpness :", TR_VORPAL, &f, DP_WP);
+        display_flag_aux(row+15, col, "Quake     :", TR_IMPACT, &f, DP_WP);
+        display_flag_aux(row+16, col, "Vampicic  :", TR_VAMPIRIC, &f, DP_WP);
+        display_flag_aux(row+17, col, "Chatic    :", TR_CHAOTIC, &f, DP_WP);
+        display_flag_aux(row+18, col, "Force Wep.:", TR_FORCE_WEAPON, &f, DP_WP);
+#endif
+
+
+       /*** Set 2 ***/
+
+       row = 3;
+       col = col + 12 + 7;
+
+       display_player_equippy(row-2, col+12, 0);
+       c_put_str(TERM_WHITE, "abcdefghijkl@", row-1, col+12);
+
+#ifdef JP
+        display_flag_aux(row+ 0, col, "¥Æ¥ì¥Ñ¥·¡¼:", TR_TELEPATHY, &f, 0);
+        display_flag_aux(row+ 1, col, "¼Ù°­ESP   :", TR_ESP_EVIL, &f, 0);
+        display_flag_aux(row+ 2, col, "̵À¸ÊªESP :", TR_ESP_NONLIVING, &f, 0);
+        display_flag_aux(row+ 3, col, "Á±ÎÉESP   :", TR_ESP_GOOD, &f, 0);
+        display_flag_aux(row+ 4, col, "ÉÔ»àESP   :", TR_ESP_UNDEAD, &f, 0);
+        display_flag_aux(row+ 5, col, "°­ËâESP   :", TR_ESP_DEMON, &f, 0);
+        display_flag_aux(row+ 6, col, "ζESP     :", TR_ESP_DRAGON, &f, 0);
+        display_flag_aux(row+ 7, col, "¿Í´ÖESP   :", TR_ESP_HUMAN, &f, 0);
+        display_flag_aux(row+ 8, col, "ưʪESP   :", TR_ESP_ANIMAL, &f, 0);
+        display_flag_aux(row+ 9, col, "¥ª¡¼¥¯ESP :", TR_ESP_ORC, &f, 0);
+        display_flag_aux(row+10, col, "¥È¥í¥ëESP :", TR_ESP_TROLL, &f, 0);
+        display_flag_aux(row+11, col, "µð¿ÍESP   :", TR_ESP_GIANT, &f, 0);
+
+        display_flag_aux(row+13, col, "ÏÓÎÏ°Ý»ý  :", TR_SUST_STR, &f, 0);
+        display_flag_aux(row+14, col, "ÃÎÎÏ°Ý»ý  :", TR_SUST_INT, &f, 0);
+        display_flag_aux(row+15, col, "¸­¤µ°Ý»ý  :", TR_SUST_WIS, &f, 0);
+        display_flag_aux(row+16, col, "´ïÍÑ°Ý»ý  :", TR_SUST_DEX, &f, 0);
+        display_flag_aux(row+17, col, "Âѵװݻý  :", TR_SUST_CON, &f, 0);
+        display_flag_aux(row+18, col, "Ì¥ÎÏ°Ý»ý  :", TR_SUST_CHR, &f, 0);
+#else
+        display_flag_aux(row+ 0, col, "Telepathy :", TR_TELEPATHY, &f, 0);
+        display_flag_aux(row+ 1, col, "ESP Evil  :", TR_ESP_EVIL, &f, 0);
+        display_flag_aux(row+ 2, col, "ESP Noliv.:", TR_ESP_NONLIVING, &f, 0);
+        display_flag_aux(row+ 3, col, "ESP Good  :", TR_ESP_GOOD, &f, 0);
+        display_flag_aux(row+ 4, col, "ESP Undead:", TR_ESP_UNDEAD, &f, 0);
+        display_flag_aux(row+ 5, col, "ESP Demon :", TR_ESP_DEMON, &f, 0);
+        display_flag_aux(row+ 6, col, "ESP Dragon:", TR_ESP_DRAGON, &f, 0);
+        display_flag_aux(row+ 7, col, "ESP Human :", TR_ESP_HUMAN, &f, 0);
+        display_flag_aux(row+ 8, col, "ESP Animal:", TR_ESP_ANIMAL, &f, 0);
+        display_flag_aux(row+ 9, col, "ESP Orc   :", TR_ESP_ORC, &f, 0);
+        display_flag_aux(row+10, col, "ESP Troll :", TR_ESP_TROLL, &f, 0);
+        display_flag_aux(row+11, col, "ESP Giant :", TR_ESP_GIANT, &f, 0);
+
+        display_flag_aux(row+13, col, "Sust Str  :", TR_SUST_STR, &f, 0);
+        display_flag_aux(row+14, col, "Sust Int  :", TR_SUST_INT, &f, 0);
+        display_flag_aux(row+15, col, "Sust Wis  :", TR_SUST_WIS, &f, 0);
+        display_flag_aux(row+16, col, "Sust Dex  :", TR_SUST_DEX, &f, 0);
+        display_flag_aux(row+17, col, "Sust Con  :", TR_SUST_CON, &f, 0);
+        display_flag_aux(row+18, col, "Sust Chr  :", TR_SUST_CHR, &f, 0);
+#endif
+
+
+       /*** Set 3 ***/
+
+       row = 3;
+       col = col + 12 + 17;
+
+       display_player_equippy(row-2, col+14, 0);
+
+       c_put_str(TERM_WHITE, "abcdefghijkl@", row-1, col+14);
+
+#ifdef JP
+        display_flag_aux(row+ 0, col, "Äɲù¶·â    :", TR_BLOWS, &f, 0);
+        display_flag_aux(row+ 1, col, "ºÎ·¡        :", TR_TUNNEL, &f, 0);
+        display_flag_aux(row+ 2, col, "ÀÖ³°Àþ»ëÎÏ  :", TR_INFRA, &f, 0);
+        display_flag_aux(row+ 3, col, "ËâË¡Æ»¶ñ»ÙÇÛ:", TR_MAGIC_MASTERY, &f, 0);
+        display_flag_aux(row+ 4, col, "±£Ì©        :", TR_STEALTH, &f, 0);
+        display_flag_aux(row+ 5, col, "õº÷        :", TR_SEARCH, &f, 0);
+
+        display_flag_aux(row+ 7, col, "¾èÇÏ        :", TR_RIDING, &f, 0);
+        display_flag_aux(row+ 8, col, "ÅêÚ³        :", TR_THROW, &f, 0);
+        display_flag_aux(row+ 9, col, "½ËÊ¡        :", TR_BLESSED, &f, 0);
+        display_flag_aux(row+10, col, "È¿¥Æ¥ì¥Ý¡¼¥È:", TR_NO_TELE, &f, 0);
+        display_flag_aux(row+11, col, "È¿ËâË¡      :", TR_NO_MAGIC, &f, 0);
+        display_flag_aux(row+12, col, "¾ÃÈñËâÎϸº¾¯:", TR_DEC_MANA, &f, 0);
+
+        display_flag_aux(row+14, col, "·Ð¸³Ã͸º¾¯  :", TR_DRAIN_EXP, &f, 0);
+        display_flag_aux(row+15, col, "Íð¥Æ¥ì¥Ý¡¼¥È:", TR_TELEPORT, &f, 0);
+        display_flag_aux(row+16, col, "È¿´¶        :", TR_AGGRAVATE, &f, 0);
+        display_flag_aux(row+17, col, "ÂÀ¸Å¤Î±åÇ°  :", TR_TY_CURSE, &f, 0);
+#else
+        display_flag_aux(row+ 0, col, "Add Blows   :", TR_BLOWS, &f, 0);
+        display_flag_aux(row+ 1, col, "Add Tunnel  :", TR_TUNNEL, &f, 0);
+        display_flag_aux(row+ 2, col, "Add Infra   :", TR_INFRA, &f, 0);
+        display_flag_aux(row+ 3, col, "Add Device  :", TR_MAGIC_MASTERY, &f, 0);
+        display_flag_aux(row+ 4, col, "Add Stealth :", TR_STEALTH, &f, 0);
+        display_flag_aux(row+ 5, col, "Add Search  :", TR_SEARCH, &f, 0);
+
+        display_flag_aux(row+ 7, col, "Riding      :", TR_RIDING, &f, 0);
+        display_flag_aux(row+ 8, col, "Throw       :", TR_THROW, &f, 0);
+        display_flag_aux(row+ 9, col, "Blessed     :", TR_BLESSED, &f, 0);
+        display_flag_aux(row+10, col, "No Teleport :", TR_NO_TELE, &f, 0);
+        display_flag_aux(row+11, col, "Anti Magic  :", TR_NO_MAGIC, &f, 0);
+        display_flag_aux(row+12, col, "Econom. Mana:", TR_DEC_MANA, &f, 0);
+
+        display_flag_aux(row+14, col, "Drain Exp   :", TR_DRAIN_EXP, &f, 0);
+        display_flag_aux(row+15, col, "Rnd.Teleport:", TR_TELEPORT, &f, 0);
+        display_flag_aux(row+16, col, "Aggravate   :", TR_AGGRAVATE, &f, 0);
+        display_flag_aux(row+17, col, "TY Curse    :", TR_TY_CURSE, &f, 0);
 #endif
 
 }
@@ -3204,7 +3389,7 @@ static void display_player_stat_info(void)
        int row, col;
 
        object_type *o_ptr;
-       u32b f1, f2, f3;
+       u32b flgs[TR_FLAG_SIZE];
        s16b k_idx;
 
        byte a;
@@ -3225,7 +3410,7 @@ c_put_str(TERM_WHITE, "ǽ
 c_put_str(TERM_BLUE, "  ´ðËÜ", row, stat_col+7);
 c_put_str(TERM_L_BLUE, " ¼ï ¿¦ À­ Áõ ", row, stat_col+13);
 c_put_str(TERM_L_GREEN, "¹ç·×", row, stat_col+28);
-c_put_str(TERM_YELLOW, "¸½ºß", row, stat_col+33);
+c_put_str(TERM_YELLOW, "¸½ºß", row, stat_col+35);
 #else
        c_put_str(TERM_WHITE, "Stat", row, stat_col+1);
        c_put_str(TERM_BLUE, "  Base", row, stat_col+7);
@@ -3279,12 +3464,11 @@ c_put_str(TERM_YELLOW, "
                e_adj -= cp_ptr->c_adj[i];
                e_adj -= ap_ptr->a_adj[i];
 
-               /* Reduced name of stat */
-#ifdef JP
-               c_put_str(TERM_WHITE, stat_names[i], row + i+1, stat_col+1);
-#else
-               c_put_str(TERM_WHITE, stat_names_reduced[i], row + i+1, stat_col+1);
-#endif
+               if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
+                       /* Reduced name of stat */
+                       c_put_str(TERM_WHITE, stat_names_reduced[i], row + i+1, stat_col+1);
+               else
+                       c_put_str(TERM_WHITE, stat_names[i], row + i+1, stat_col+1);
 
 
                /* Internal "natural" max value.  Maxes at 18/100 */
@@ -3292,7 +3476,11 @@ c_put_str(TERM_YELLOW, "
                cnv_stat(p_ptr->stat_max[i], buf);
                if (p_ptr->stat_max[i] == p_ptr->stat_max_max[i])
                {
+#ifdef JP
                        c_put_str(TERM_WHITE, "!", row + i+1, stat_col + 6);
+#else
+                       c_put_str(TERM_WHITE, "!", row + i+1, stat_col + 4);
+#endif
                }
                c_put_str(TERM_BLUE, buf, row + i+1, stat_col + 13 - strlen(buf));
 
@@ -3340,7 +3528,7 @@ c_put_str(TERM_L_GREEN, "ǽ
                k_idx = o_ptr->k_idx;
 
                /* Acquire "known" flags */
-               object_flags_known(o_ptr, &f1, &f2, &f3);
+               object_flags_known(o_ptr, flgs);
 
                /* Initialize color based of sign of pval. */
                for (stat = 0; stat < 6; stat++)
@@ -3350,7 +3538,7 @@ c_put_str(TERM_L_GREEN, "ǽ
                        c = '.';
 
                        /* Boost */
-                       if (f1 & 1 << stat)
+                       if (have_flag(flgs, stat))
                        {
                                /* Default */
                                c = '*';
@@ -3365,7 +3553,7 @@ c_put_str(TERM_L_GREEN, "ǽ
                                        if (o_ptr->pval < 10) c = '0' + o_ptr->pval;
                                }
 
-                               if (f2 & 1 << stat)
+                               if (have_flag(flgs, stat + TR_SUST_STR))
                                {
                                        /* Dark green for sustained stats */
                                        a = TERM_GREEN;
@@ -3378,12 +3566,12 @@ c_put_str(TERM_L_GREEN, "ǽ
                                        a = TERM_RED;
 
                                        /* Label boost */
-                                       if (o_ptr->pval 10) c = '0' - o_ptr->pval;
+                                       if (o_ptr->pval > -10) c = '0' - o_ptr->pval;
                                }
                        }
 
                        /* Sustain */
-                       else if (f2 & 1 << stat)
+                       else if (have_flag(flgs, stat + TR_SUST_STR))
                        {
                                /* Dark green "s" */
                                a = TERM_GREEN;
@@ -3399,7 +3587,7 @@ c_put_str(TERM_L_GREEN, "ǽ
        }
 
        /* Player flags */
-       player_flags(&f1, &f2, &f3);
+       player_flags(flgs);
 
        /* Check stats */
        for (stat = 0; stat < 6; stat++)
@@ -3471,14 +3659,14 @@ c_put_str(TERM_L_GREEN, "ǽ
                                        a = TERM_RED;
 
                                        /* Label boost */
-                                       if (dummy 10) c = '0' - dummy;
+                                       if (dummy > -10) c = '0' - dummy;
                                }
                        }
                }
 
 
                /* Sustain */
-               if (f2 & 1<<stat)
+               if (have_flag(flgs, stat + TR_SUST_STR))
                {
                        /* Dark green "s" */
                        a = TERM_GREEN;
@@ -3487,491 +3675,7 @@ c_put_str(TERM_L_GREEN, "ǽ
 
 
                /* Dump */
-               Term_putch(col, row + stat+1, a, c);
-       }
-}
-
-
-/*
- * Object flag names
- */
-static cptr object_flag_names[96] =
-{
-#ifdef JP
-"+ÏÓÎÏ",
-"+ÃÎǽ",
-"+¸­¤µ",
-"+´ïÍÑ",
-"+Âѵ×",
-"+Ì¥ÎÏ",
-#else
-       "Add Str",
-       "Add Int",
-       "Add Wis",
-       "Add Dex",
-       "Add Con",
-       "Add Chr",
-#endif
-
-#ifdef JP
-       "ËâÆ»¶ñ",
-
-       "ÍýÎÏ",
-#else
-       "M.Item-Mas",
-
-       "Force wep.",
-#endif
-
-#ifdef JP
-"+±£Ì©¹ÔÆ°",
-"+õº÷",
-"+ÀÖ³°Àþ»ë",
-"+·¡ºï",
-"+¥¹¥Ô¡¼¥É",
-"+ÂÇ·â²ó¿ô",
-"¥«¥ª¥¹¸ú²Ì",
-"µÛ·ì",
-"ưʪ ÇÜÂÇ",
-"¼Ù°­ ÇÜÂÇ",
-"ÉÔ»à ÇÜÂÇ",
-"°­Ëâ ÇÜÂÇ",
-"¥ª¡¼¥¯ÇÜÂÇ",
-"¥È¥í¥ëÇÜÂÇ",
-"µð¿Í ÇÜÂÇ",
-"ζ ÇÜÂÇ",
-"ζ ÇÜÇÜÂÇ",
-"±Ô¿Ï",
-"ÃÏ¿ÌȯÀ¸",
-"ÆÇ°À­¹¶·â",
-"»À°À­¹¶·â",
-"ÅÅ°À­¹¶·â",
-"²Ð°À­¹¶·â",
-"Îä°À­¹¶·â",
-#else
-       "Add Stea.",
-       "Add Sear.",
-       "Add Infra",
-       "Add Tun..",
-       "Add Speed",
-       "Add Blows",
-       "Chaotic",
-       "Vampiric",
-       "Slay Anim.",
-       "Slay Evil",
-       "Slay Und.",
-       "Slay Demon",
-       "Slay Orc",
-       "Slay Troll",
-       "Slay Giant",
-       "Slay Drag.",
-       "Kill Drag.",
-       "Sharpness",
-       "Impact",
-       "Poison Brd",
-       "Acid Brand",
-       "Elec Brand",
-       "Fire Brand",
-       "Cold Brand",
-#endif
-
-
-#ifdef JP
-"ÏÓÎÏ ÊÝ»ý",
-"ÃÎǽ ÊÝ»ý",
-"¸­¤µ ÊÝ»ý",
-"´ïÍÑ ÊÝ»ý",
-"ÂѵנÊÝ»ý",
-"Ì¥ÎÏ ÊÝ»ý",
-#else
-       "Sust Str",
-       "Sust Int",
-       "Sust Wis",
-       "Sust Dex",
-       "Sust Con",
-       "Sust Chr",
-#endif
-
-       NULL,
-       NULL,
-#ifdef JP
-"ĶÂÑ»À  ",
-"ĶÂÑÅÅ·â",
-"ĶÂѲбê",
-"ĶÂÑÎ䵤",
-#else
-       "Imm Acid",
-       "Imm Elec",
-       "Imm Fire",
-       "Imm Cold",
-#endif
-
-       NULL,
-#ifdef JP
-"È¿¼Í",
-"ÂÑËãáã",
-"·Ð¸³ÃÍÊÝ»ý",
-#else
-       "Reflect",
-       "Free Act",
-       "Hold Life",
-#endif
-
-#ifdef JP
-"ÂÑ»À  ",
-"ÂÑÅÅ·â",
-"ÂѲбê",
-"ÂÑÎ䵤",
-"ÂÑÆÇ  ",
-"ÂѶ²ÉÝ",
-"ÂÑÁ®¸÷",
-"ÂѰŹõ",
-"ÂÑÌÕÌÜ",
-"ÂѺ®Íð",
-"Âѹ첻",
-"ÂÑÇËÊÒ",
-"ÂÑÃϹö",
-"ÂÑ°øº®",
-"ÂÑ¥«¥ª",
-"ÂÑÎô²½",
-#else
-       "Res Acid",
-       "Res Elec",
-       "Res Fire",
-       "Res Cold",
-       "Res Pois",
-       "Res Fear",
-       "Res Lite",
-       "Res Dark",
-       "Res Blind",
-       "Res Conf",
-       "Res Sound",
-       "Res Shard",
-       "Res Neth",
-       "Res Nexus",
-       "Res Chaos",
-       "Res Disen",
-#endif
-
-
-
-
-#ifdef JP
-       "²Ð±ê¥ª¡¼¥é",
-
-       "Åŵ¤¥ª¡¼¥é",
-#else
-       "Aura Fire",
-
-       "Aura Elec",
-#endif
-
-       NULL,
-#ifdef JP
-       "Î䵤¥ª¡¼¥é",
-#else
-       "Aura Cold",
-#endif
-#ifdef JP
-"Ëɥƥì¥Ý",
-"È¿ËâË¡",
-"¸º¾ÃÈñËâÎÏ",
-"¼Ù°­¤Ê±åÇ°",
-NULL,
-"Hide Type",
-"Show Mods",
-"¾ï»þÅÁÀâʪ",
-"ÉâÍ·",
-"¸÷¸»",
-"Æ©ÌÀ»ëǧ",
-"¥Æ¥ì¥Ñ¥·¡¼",
-"Ãپò½",
-"µÞ²óÉü",
-"¶¯Îϼͷâ",
-"¹â®¼Í·â",
-"̵½ý »À",
-"̵½ý ÅÅ",
-"̵½ý ²Ð",
-"̵½ý Îä",
-"»ÏÆ°",
-"·Ð¸³µÛ¼ý",
-"¥Æ¥ì¥Ý¡¼¥È",
-"È¿´¶",
-"½ËÊ¡",
-"¼ö¤¤",
-"½Å¤¤¼ö¤¤",
-"±Ê±ó¤Î¼ö¤¤"
-#else
-       "NoTeleport",
-       "AntiMagic",
-       "DecMana",
-       "EvilCurse",
-       NULL,
-       "Hide Type",
-       "Show Mods",
-       "Insta Art",
-       "Levitate",
-       "Lite",
-       "See Invis",
-       "Telepathy",
-       "Digestion",
-       "Regen",
-       "Xtra Might",
-       "Xtra Shots",
-       "Ign Acid",
-       "Ign Elec",
-       "Ign Fire",
-       "Ign Cold",
-       "Activate",
-       "Drain Exp",
-       "Teleport",
-       "Aggravate",
-       "Blessed",
-       "Cursed",
-       "Hvy Curse",
-       "Prm Curse"
-#endif
-
-};
-
-
-/*
- * Summarize resistances
- */
-static void display_player_ben(void)
-{
-       int i, x, y;
-
-       object_type *o_ptr;
-
-       u32b f1, f2, f3;
-
-       u16b b[6];
-       u16b color[6];
-
-
-       /* Reset */
-       for (i = 0; i < 6; i++) b[i] = 0;
-
-
-       /* Scan equipment */
-       for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
-       {
-               /* Object */
-               o_ptr = &inventory[i];
-
-               /* Known object flags */
-               object_flags_known(o_ptr, &f1, &f2, &f3);
-
-
-               if ((prace_is_(RACE_S_FAIRY)) && (f3 & TR3_AGGRAVATE))
-               {
-                       f3 &= ~(TR3_AGGRAVATE);
-                       f1 |= TR1_STEALTH;
-               }
-
-               /* Incorporate */
-               b[0] |= (f1 & 0xFFFF);
-               b[1] |= (f1 >> 16);
-               b[2] |= (f2 & 0xFFFF);
-               b[3] |= (f2 >> 16);
-               b[4] |= (f3 & 0xFFFF);
-               b[5] |= (f3 >> 16);
-       }
-
-
-       /* Player flags */
-       player_flags(&f1, &f2, &f3);
-
-       /* Incorporate */
-       b[0] |= (f1 & 0xFFFF);
-       b[1] |= (f1 >> 16);
-       b[2] |= (f2 & 0xFFFF);
-       b[3] |= (f2 >> 16);
-       b[4] |= (f3 & 0xFFFF);
-       b[5] |= (f3 >> 16);
-
-       /* Player flags */
-       tim_player_flags(&f1, &f2, &f3, FALSE);
-
-       /* Incorporate */
-       b[0] |= (f1 & 0xFFFF);
-       b[1] |= (f1 >> 16);
-       b[2] |= (f2 & 0xFFFF);
-       b[3] |= (f2 >> 16);
-       b[4] |= (f3 & 0xFFFF);
-       b[5] |= (f3 >> 16);
-       color[0] = (u16b)(f1 & 0xFFFF);
-       color[1] = (u16b)(f1 >> 16);
-       color[2] = (u16b)(f2 & 0xFFFF);
-       color[3] = (u16b)(f2 >> 16);
-       color[4] = (u16b)(f3 & 0xFFFF);
-       color[5] = (u16b)(f3 >> 16);
-
-       /* Scan cols */
-       for (x = 0; x < 6; x++)
-       {
-               /* Scan rows */
-               for (y = 0; y < 16; y++)
-               {
-                       byte a = TERM_SLATE;
-                       char c = '.';
-
-                       cptr name = object_flag_names[16*x+y];
-
-                       /* No name */
-                       if (!name) continue;
-
-                       /* Dump name */
-                       Term_putstr(x * 13, y + 4, -1, TERM_WHITE, name);
-
-                       /* Dump colon */
-                       Term_putch(x * 13 + 10, y + 4, TERM_WHITE, ':');
-
-                       /* Check flag */
-                       if (b[x] & (1<<y))
-                       {
-                               if (color[x] & (1<<y))
-                               {
-                                       a = TERM_YELLOW;
-                                       c = '#';
-                               }
-                               else
-                               {
-                                       a = TERM_WHITE;
-                                       c = '+';
-                               }
-                       }
-
-                       /* Dump flag */
-                       Term_putch(x * 13 + 11, y + 4, a, c);
-               }
-       }
-}
-
-
-/*
- * Summarize resistances
- */
-static void display_player_ben_one(int mode)
-{
-       int i, n, x, y;
-
-       object_type *o_ptr;
-
-       u32b f1, f2, f3;
-
-       u16b b[13][6];
-       u16b color[6];
-
-
-       /* Scan equipment */
-       for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
-       {
-               /* Index */
-               n = (i - INVEN_RARM);
-
-               /* Object */
-               o_ptr = &inventory[i];
-
-               object_flags_known(o_ptr, &f1, &f2, &f3);
-
-               if ((prace_is_(RACE_S_FAIRY)) && (f3 & TR3_AGGRAVATE))
-               {
-                       f3 &= ~(TR3_AGGRAVATE);
-                       f1 |= TR1_STEALTH;
-               }
-
-               /* Incorporate */
-               b[n][0] = (u16b)(f1 & 0xFFFF);
-               b[n][1] = (u16b)(f1 >> 16);
-               b[n][2] = (u16b)(f2 & 0xFFFF);
-               b[n][3] = (u16b)(f2 >> 16);
-               b[n][4] = (u16b)(f3 & 0xFFFF);
-               b[n][5] = (u16b)(f3 >> 16);
-       }
-
-
-       /* Index */
-       n = 12;
-
-       /* Player flags */
-       player_flags(&f1, &f2, &f3);
-
-       /* Incorporate */
-       b[n][0] = (u16b)(f1 & 0xFFFF);
-       b[n][1] = (u16b)(f1 >> 16);
-       b[n][2] = (u16b)(f2 & 0xFFFF);
-       b[n][3] = (u16b)(f2 >> 16);
-       b[n][4] = (u16b)(f3 & 0xFFFF);
-       b[n][5] = (u16b)(f3 >> 16);
-
-       /* Player flags */
-       tim_player_flags(&f1, &f2, &f3, FALSE);
-
-       /* Incorporate */
-       b[n][0] |= (f1 & 0xFFFF);
-       b[n][1] |= (f1 >> 16);
-       b[n][2] |= (f2 & 0xFFFF);
-       b[n][3] |= (f2 >> 16);
-       b[n][4] |= (f3 & 0xFFFF);
-       b[n][5] |= (f3 >> 16);
-       color[0] = (u16b)(f1 & 0xFFFF);
-       color[1] = (u16b)(f1 >> 16);
-       color[2] = (u16b)(f2 & 0xFFFF);
-       color[3] = (u16b)(f2 >> 16);
-       color[4] = (u16b)(f3 & 0xFFFF);
-       color[5] = (u16b)(f3 >> 16);
-
-
-       /* Scan cols */
-       for (x = 0; x < 3; x++)
-       {
-               /* Equippy */
-               display_player_equippy(2, x * 26 + 11);
-
-               /* Label */
-               Term_putstr(x * 26 + 11, 3, -1, TERM_WHITE, "abcdefghijkl@");
-
-               /* Scan rows */
-               for (y = 0; y < 16; y++)
-               {
-                       cptr name = object_flag_names[48*mode+16*x+y];
-
-                       /* No name */
-                       if (!name) continue;
-
-                       /* Dump name */
-                       Term_putstr(x * 26, y + 4, -1, TERM_WHITE, name);
-
-                       /* Dump colon */
-                       Term_putch(x * 26 + 10, y + 4, TERM_WHITE, ':');
-
-                       /* Check flags */
-                       for (n = 0; n < 13; n++)
-                       {
-                               byte a = TERM_SLATE;
-                               char c = '.';
-
-                               /* Check flag */
-                               if (b[n][3*mode+x] & (1<<y))
-                               {
-                                       if ((n == 12) && (color[3*mode+x] & (1<<y)))
-                                       {
-                                               a = TERM_YELLOW;
-                                               c = '#';
-                                       }
-                                       else
-                                       {
-                                               a = TERM_WHITE;
-                                               c = '+';
-                                       }
-                               }
-
-                               /* Dump flag */
-                               Term_putch(x * 26 + 11 + n, y + 4, a, c);
-                       }
-               }
+               Term_putch(col, row + stat+1, a, c);
        }
 }
 
@@ -3979,15 +3683,13 @@ static void display_player_ben_one(int mode)
 /*
  * Display the character on the screen (various modes)
  *
- * The top two and bottom two lines are left blank.
+ * The top one and bottom two lines are left blank.
  *
  * Mode 0 = standard display with skills
  * Mode 1 = standard display with history
  * Mode 2 = summary of various things
- * Mode 3 = current flags (combined)
- * Mode 4 = current flags (part 1)
- * Mode 5 = current flags (part 2)
- * Mode 6 = mutations
+ * Mode 3 = summary of various things (part 2)
+ * Mode 4 = mutations
  */
 void display_player(int mode)
 {
@@ -3998,10 +3700,10 @@ void display_player(int mode)
 
 
        /* XXX XXX XXX */
-       if ((p_ptr->muta1 || p_ptr->muta2 || p_ptr->muta3) && skip_mutations)
-               mode = (mode % 7);
+       if ((p_ptr->muta1 || p_ptr->muta2 || p_ptr->muta3) && display_mutations)
+               mode = (mode % 5);
        else
-               mode = (mode % 6);
+               mode = (mode % 4);
 
        /* Erase screen */
        clear_from(0);
@@ -4030,7 +3732,7 @@ void display_player(int mode)
                        display_player_one_line(ENTRY_REALM, tmp, TERM_L_BLUE);
                }
 
-               if (p_ptr->pclass == CLASS_CHAOS_WARRIOR)
+               if ((p_ptr->pclass == CLASS_CHAOS_WARRIOR) || (p_ptr->muta2 & MUT2_CHAOS_GIFT))
                        display_player_one_line(ENTRY_PATRON, chaos_patrons[p_ptr->chaos_patron], TERM_L_BLUE);
 
                /* Age, Height, Weight, Social */
@@ -4094,13 +3796,19 @@ void display_player(int mode)
 
                        if (p_ptr->stat_max[i] == p_ptr->stat_max_max[i])
                        {
-                               c_put_str(TERM_WHITE, "!", 2+i, 64);
+#ifdef JP
+                               c_put_str(TERM_WHITE, "!", 3+i, 59);
+#else
+                               c_put_str(TERM_WHITE, "!", 3+i, 59-2);
+#endif
                        }
                }
 
                /* Display "history" info */
                if (mode == 1)
                {
+                       char statmsg[1000];
+
 #ifdef JP
                        put_str("(¥­¥ã¥é¥¯¥¿¡¼¤ÎÀ¸¤¤Î©¤Á)", 11, 25);
 #else
@@ -4109,40 +3817,103 @@ void display_player(int mode)
 
                        for (i = 0; i < 4; i++)
                        {
-                               put_str(history[i], i + 12, 10);
+                               put_str(p_ptr->history[i], i + 12, 10);
                        }
 
+                       *statmsg = '\0';
 
-                       if (death)
+                       if (p_ptr->is_dead && p_ptr->total_winner)
+                       {
+#ifdef JP
+                               strcpy(statmsg, "¡Ä¤¢¤Ê¤¿¤Ï¾¡Íø¤Î¸å°úÂष¤¿¡£");
+#else
+                               strcpy(statmsg, "...You retired from the adventure after the winning.");
+#endif
+                       }
+                       else if (p_ptr->is_dead)
                        {
                                if (dun_level)
+                               {
+                                       if (p_ptr->inside_quest && (p_ptr->inside_quest < MIN_RANDOM_QUEST))
+                                       {
+                                               /* Get the quest text */
+                                               init_flags = INIT_ASSIGN;
+
+                                               process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
+
+#ifdef JP
+                                               sprintf(statmsg, "¡Ä¤¢¤Ê¤¿¤Ï¡¢¥¯¥¨¥¹¥È¡Ö%s¡×¤Ç%s¤Ë»¦¤µ¤ì¤¿¡£", quest[p_ptr->inside_quest].name, p_ptr->died_from);
+#else
+                                               sprintf(statmsg, "...You were killed by %s in the quest '%s'.", p_ptr->died_from, quest[p_ptr->inside_quest].name);
+#endif
+                                       }
+                                       else
+                                       {                                       
 #ifdef JP
-                                       put_str(format("¡Ä¤¢¤Ê¤¿¤Ï %s ¤Î %d ³¬¤Ç»à¤ó¤À¡£", map_name(), dun_level), 5 + 12, 10);
+                                               sprintf(statmsg, "¡Ä¤¢¤Ê¤¿¤Ï¡¢%s¤Î%d³¬¤Ç%s¤Ë»¦¤µ¤ì¤¿¡£", map_name(), dun_level, p_ptr->died_from);
 #else
-                                       put_str(format("...You were dead at level %d of %s.", dun_level, map_name()), 5 + 12, 10);
+                                               sprintf(statmsg, "...You were killed by %s on level %d of %s.", p_ptr->died_from, dun_level, map_name());
 #endif
+                                       }
+                               }
                                else
 #ifdef JP
-                                       put_str(format("¡Ä¤¢¤Ê¤¿¤Ï %s ¤Ç»à¤ó¤À¡£", map_name()), 5 + 12, 10);
+                                       sprintf(statmsg, "¡Ä¤¢¤Ê¤¿¤Ï%s¤Ç%s¤Ë»¦¤µ¤ì¤¿¡£", map_name(), p_ptr->died_from);
 #else
-                                       put_str(format("...You were dead at %s.", map_name()), 5 + 12, 10);
+                                       sprintf(statmsg, "...You were killed by %s in %s.", p_ptr->died_from, map_name());
 #endif
                        }
-                       else
+                       else if (character_dungeon)
                        {
                                if (dun_level)
+                               {
+                                       if (p_ptr->inside_quest && (p_ptr->inside_quest < MIN_RANDOM_QUEST))
+                                       {
+                                               /* Get the quest text */
+                                               init_flags = INIT_ASSIGN;
+
+                                               process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
+
+#ifdef JP
+                                               sprintf(statmsg, "¡Ä¤¢¤Ê¤¿¤Ï¸½ºß¡¢ ¥¯¥¨¥¹¥È¡Ö%s¡×¤ò¿ë¹ÔÃæ¤À¡£", quest[p_ptr->inside_quest].name);
+#else
+                                               sprintf(statmsg, "...Now, you are in the quest '%s'.", quest[p_ptr->inside_quest].name);
+#endif
+                                       }                                                       
+                                       else
+                                       {
 #ifdef JP
-                                       put_str(format("¡Ä¤¢¤Ê¤¿¤Ï¸½ºß¡¢ %s ¤Î %d ³¬¤Çõº÷¤·¤Æ¤¤¤ë¡£", map_name(), dun_level), 5 + 12, 10);
+                                               sprintf(statmsg, "¡Ä¤¢¤Ê¤¿¤Ï¸½ºß¡¢ %s ¤Î %d ³¬¤Çõº÷¤·¤Æ¤¤¤ë¡£", map_name(), dun_level);
 #else
-                                       put_str(format("...Now, you are exploring at level %d of %s.", dun_level, map_name()), 5 + 12, 10);
+                                               sprintf(statmsg, "...Now, you are exploring level %d of %s.", dun_level, map_name());
 #endif
+                                       }
+                               }
                                else
 #ifdef JP
-                                       put_str(format("¡Ä¤¢¤Ê¤¿¤Ï¸½ºß¡¢ %s ¤Ë¤¤¤ë¡£", map_name()), 5 + 12, 10);
+                                       sprintf(statmsg, "¡Ä¤¢¤Ê¤¿¤Ï¸½ºß¡¢ %s ¤Ë¤¤¤ë¡£", map_name());
 #else
-                                       put_str(format("...Now, you are in %s.", map_name()), 5 + 12, 10);
+                                       sprintf(statmsg, "...Now, you are in %s.", map_name());
 #endif
                        }
+
+                       if (*statmsg)
+                       {
+                               char temp[64*2], *t;
+                               roff_to_buf(statmsg, 60, temp);
+                               t = temp;
+                               for(i=0 ; i<2 ; i++)
+                               {
+                                       if(t[0]==0)
+                                               break; 
+                                       else
+                                       {
+                                               put_str(t, i + 5 + 12, 10);
+                                               t += strlen(t)+1;
+                                       }
+                               }
+                       }
+
                }
 
                /* Display "various" info */
@@ -4167,19 +3938,35 @@ void display_player(int mode)
        /* Special */
        else if (mode == 3)
        {
-               display_player_ben();
+                display_player_other_flag_info();
        }
 
-       else if (mode == 6)
+       else if (mode == 4)
        {
                do_cmd_knowledge_mutations();
        }
+}
 
-       /* Special */
-       else
-       {
-               display_player_ben_one(mode % 2);
-       }
+static bool ang_sort_comp_quest_num(vptr u, vptr v, int a, int b)
+{
+       int *q_num = (int *)u;
+        quest_type *qa = &quest[q_num[a]];
+        quest_type *qb = &quest[q_num[b]];
+
+       if (qa->complev < qb->complev) return TRUE;
+       if (qa->complev > qb->complev) return FALSE;
+       if (qa->level <= qb->level) return TRUE;
+        return FALSE;
+}
+
+static void ang_sort_swap_quest_num(vptr u, vptr v, int a, int b)
+{
+       int *q_num = (int *)u;
+       int tmp;
+
+       tmp = q_num[a];
+       q_num[a] = q_num[b];
+       q_num[b] = tmp;
 }
 
 errr make_character_dump(FILE *fff)
@@ -4191,13 +3978,10 @@ errr make_character_dump(FILE *fff)
        store_type  *st_ptr;
        char            o_name[MAX_NLEN];
        char            buf[1024];
+       int             total;
+       int             *quest_num;
+       int             dummy;
 
-
-#ifndef FAKE_VERSION
-       /* Begin dump */
-       fprintf(fff, "  [Angband %d.%d.%d Character Dump]\n\n",
-               VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
-#else
 #ifdef JP
        fprintf(fff, "  [ÊѶòÈÚÅÜ %d.%d.%d ¥­¥ã¥é¥¯¥¿¾ðÊó]\n\n",
                FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
@@ -4206,8 +3990,6 @@ errr make_character_dump(FILE *fff)
                FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH);
 #endif
 
-#endif
-
        update_playtime();
 
        /* Display player */
@@ -4245,7 +4027,7 @@ errr make_character_dump(FILE *fff)
        display_player(1);
 
        /* Dump part of the screen */
-       for (y = 11; y < 18; y++)
+       for (y = 10; y < 19; y++)
        {
                /* Dump each row */
                for (x = 0; x < 79; x++)
@@ -4268,7 +4050,8 @@ errr make_character_dump(FILE *fff)
        }
 
        fprintf(fff, "\n");
-       /* Display history */
+
+       /* Display flags (part 1) */
        display_player(2);
 
        /* Dump part of the screen */
@@ -4297,11 +4080,43 @@ errr make_character_dump(FILE *fff)
                fprintf(fff, "%s\n", buf);
        }
 
-       for (i = 0; i < p_ptr->count / 80; i++)
+       fprintf(fff, "\n");
+
+       /* Display flags (part 2) */
+       display_player(3);
+
+       /* Dump part of the screen */
+       for (y = 1; y < 22; y++)
+       {
+               /* Dump each row */
+               for (x = 0; x < 79; x++)
+               {
+                       /* Get the attr/char */
+                       (void)(Term_what(x, y, &a, &c));
+
+                       /* Dump it (Ignore equippy tile graphic) */
+                       if (a < 128)
+                               buf[x] = c;
+                       else
+                               buf[x] = ' ';
+               }
+
+               /* End the string */
+               buf[x] = '\0';
+
+               /* Kill trailing spaces */
+               while ((x > 0) && (buf[x-1] == ' ')) buf[--x] = '\0';
+
+               /* End the row */
+               fprintf(fff, "%s\n", buf);
+       }
+
+       for (i = 0; (unsigned int) i < (p_ptr->count / 80); i++)
                fprintf(fff, " ");
        fprintf(fff, "\n");
-       for (i = 0; i < p_ptr->count % 80; i++)
+       for (i = 0; (unsigned int) i < (p_ptr->count % 80); i++)
                fprintf(fff, " ");
+
        {
                bool pet = FALSE;
 
@@ -4328,21 +4143,191 @@ errr make_character_dump(FILE *fff)
 #ifdef JP
                                fprintf(fff, " ¾èÇÏÃæ");
 #else
-                               fprintf(fff, " riding");
+                               fprintf(fff, " (riding)");
 #endif
                        fprintf(fff, "\n");
                }
                if (pet) fprintf(fff, "\n");
        }
 
-       if (death && !total_winner)
+#ifdef JP
+       fprintf(fff, "\n  [¥¯¥¨¥¹¥È¾ðÊó]\n");
+#else
+       fprintf(fff, "\n  [Quest information]\n");
+#endif
+
+#ifdef JP
+       fprintf(fff, "\n¡ÔãÀ®¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
+#else
+       fprintf(fff, "\n< Completed Quest >\n");
+#endif
+
+       /* Allocate Memory */
+       C_MAKE(quest_num, max_quests, int);
+
+       /* Sort by compete level */
+       for (i = 1; i < max_quests; i++)
+       {
+               quest_num[i] = i;
+       }
+       ang_sort_comp = ang_sort_comp_quest_num;
+       ang_sort_swap = ang_sort_swap_quest_num;
+       ang_sort(quest_num, &dummy, max_quests);
+
+       /* Dump Quest Information */
+       total = 0;
+       for (i = 1; i < max_quests; i++)
+       {
+               int num = quest_num[i];
+
+               /* No info from "silent" quests */
+               if (quest[num].flags & QUEST_FLAG_SILENT) continue;
+
+               if (quest[num].status == QUEST_STATUS_FINISHED)
+               {
+                       int old_quest;
+
+                       total++;
+
+                       if (num < MIN_RANDOM_QUEST)
+                       {
+                               /* Set the quest number temporary */
+                               old_quest = p_ptr->inside_quest;
+                               p_ptr->inside_quest = num;
+
+                               /* Get the quest */
+                               init_flags = INIT_ASSIGN;
+
+                               process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
+
+                               /* Reset the old quest number */
+                               p_ptr->inside_quest = old_quest;
+                       }
+
+                       if ((num >= MIN_RANDOM_QUEST) && quest[num].r_idx)
+                       {
+                               /* Print the quest info */
+
+                                if (quest[num].complev == 0)
+                                {
+                                        fprintf(fff, 
+#ifdef JP
+                                                "  %s (%d³¬) - ÉÔÀᄀ\n",
+#else
+                                                "  %s (Dungeon level: %d) - (Cancelled)\n",
+#endif
+                                                r_name+r_info[quest[num].r_idx].name,
+                                                quest[num].level);
+                                }
+                                else
+                                {
+                                        fprintf(fff, 
+#ifdef JP
+                                                "  %s (%d³¬) - ¥ì¥Ù¥ë%d\n",
+#else
+                                                "  %s (Dungeon level: %d) - level %d\n",
+#endif
+                                                r_name+r_info[quest[num].r_idx].name,
+                                                quest[num].level,
+                                                quest[num].complev);
+                                }
+                       }
+                       else
+                       {
+                               /* Print the quest info */
+#ifdef JP
+                               fprintf(fff, "  %s (´í¸±ÅÙ:%d³¬ÁêÅö) - ¥ì¥Ù¥ë%d\n",
+#else
+                               fprintf(fff, "  %s (Danger level: %d) - level %d\n",
+#endif
+
+                                       quest[num].name, quest[num].level, quest[num].complev);
+                       }
+               }
+       }
+#ifdef JP
+       if (!total) fprintf(fff, "  ¤Ê¤·\n");
+#else
+       if (!total) fprintf(fff, "  Nothing.\n");
+#endif
+
+#ifdef JP
+       fprintf(fff, "\n¡Ô¼ºÇÔ¤·¤¿¥¯¥¨¥¹¥È¡Õ\n");
+#else
+       fprintf(fff, "\n< Failed Quest >\n");
+#endif
+       total = 0;
+       for (i = 1; i < max_quests; i++)
+       {
+               int num = quest_num[i];
+
+               /* No info from "silent" quests */
+               if (quest[num].flags & QUEST_FLAG_SILENT) continue;
+
+               if ((quest[num].status == QUEST_STATUS_FAILED_DONE) || (quest[num].status == QUEST_STATUS_FAILED))
+               {
+                       int old_quest;
+
+                       total++;
+
+                       if (num < MIN_RANDOM_QUEST)
+                       {
+                               /* Set the quest number temporary */
+                               old_quest = p_ptr->inside_quest;
+                               p_ptr->inside_quest = num;
+
+                               /* Get the quest text */
+                               init_flags = INIT_ASSIGN;
+
+                               process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
+
+                               /* Reset the old quest number */
+                               p_ptr->inside_quest = old_quest;
+                       }
+
+                       if ((num >= MIN_RANDOM_QUEST) && quest[num].r_idx)
+                       {
+                               /* Print the quest info */
+#ifdef JP
+                               fprintf(fff, "  %s (%d³¬) - ¥ì¥Ù¥ë%d\n",
+#else
+                               fprintf(fff, "  %s (Dungeon level: %d) - level %d\n",
+#endif
+
+                                       r_name+r_info[quest[num].r_idx].name, quest[num].level, quest[num].complev);
+                       }
+                       else
+                       {
+                               /* Print the quest info */
+#ifdef JP
+                               fprintf(fff, "  %s (´í¸±ÅÙ:%d³¬ÁêÅö) - ¥ì¥Ù¥ë%d\n",
+#else
+                               fprintf(fff, "  %s (Danger level: %d) - level %d\n",
+#endif
+
+                                       quest[num].name, quest[num].level, quest[num].complev);
+                       }
+               }
+       }
+
+#ifdef JP
+       if (!total) fprintf(fff, "  ¤Ê¤·\n");
+#else
+       if (!total) fprintf(fff, "  Nothing.\n");
+#endif
+       fprintf(fff, "\n");
+
+       /* Free Memory */
+       C_KILL(quest_num, max_quests, int);
+
+       if (p_ptr->is_dead && !p_ptr->total_winner)
        {
 #ifdef JP
                fprintf(fff, "\n  [»à¤ÌľÁ°¤Î¥á¥Ã¥»¡¼¥¸]\n\n");
 #else
                fprintf(fff, "\n  [Last messages]\n\n");
 #endif
-               for (i = MIN(message_num(), 15); i >= 0; i--)
+               for (i = MIN(message_num(), 30); i >= 0; i--)
                {
                        fprintf(fff,"> %s\n",message_str((s16b)i));
                }
@@ -4350,7 +4335,7 @@ errr make_character_dump(FILE *fff)
        }
 
 #ifdef JP
-       fprintf(fff, "\n  [¤½¤Î¾¤Î¾ðÊó]        \n");
+       fprintf(fff, "\n  [¤½¤Î¾¤Î¾ðÊó]\n");
 #else
        fprintf(fff, "\n  [Miscellaneous information]\n");
 #endif
@@ -4553,7 +4538,7 @@ errr make_character_dump(FILE *fff)
 #endif
        }
 
-       if (noscore)
+       if (p_ptr->noscore)
 #ifdef JP
 fprintf(fff, "\n ²¿¤«ÉÔÀµ¤Ê¤³¤È¤ò¤·¤Æ¤·¤Þ¤Ã¤Æ¤Þ¤¹¡£");
 #else
@@ -4809,6 +4794,12 @@ fprintf(fff, "  [ 
                fprintf(fff, "\n\n");
        }
 
+#ifdef JP
+        fprintf(fff, "  [¥Á¥§¥Ã¥¯¥µ¥à: \"%s\"]\n\n", get_check_sum());
+#else
+        fprintf(fff, "  [Check Sum: \"%s\"]\n\n", get_check_sum());
+#endif
+
        return 0;
 }
 
@@ -4828,7 +4819,7 @@ errr file_character(cptr name, bool full)
        safe_setuid_drop();
 
        /* Build the filename */
-       path_build(buf, 1024, ANGBAND_DIR_USER, name);
+       path_build(buf, sizeof(buf), ANGBAND_DIR_USER, name);
 
        /* File type is "TEXT" */
        FILE_TYPE(FILE_TYPE_TEXT);
@@ -4846,34 +4837,30 @@ errr file_character(cptr name, bool full)
 
                /* Build query */
 #ifdef JP
-(void)sprintf(out_val, "¸½Â¸¤¹¤ë¥Õ¥¡¥¤¥ë %s ¤Ë¾å½ñ¤­¤·¤Þ¤¹¤«? ", buf);
+                (void)sprintf(out_val, "¸½Â¸¤¹¤ë¥Õ¥¡¥¤¥ë %s ¤Ë¾å½ñ¤­¤·¤Þ¤¹¤«? ", buf);
 #else
                (void)sprintf(out_val, "Replace existing file %s? ", buf);
 #endif
 
 
                /* Ask */
-               if (get_check(out_val)) fd = -1;
+               if (get_check_strict(out_val, CHECK_NO_HISTORY)) fd = -1;
        }
 
        /* Open the non-existing file */
        if (fd < 0) fff = my_fopen(buf, "w");
 
-       /* Grab priv's */
-       safe_setuid_grab();
-
-
        /* Invalid file */
        if (!fff)
        {
                /* Message */
 #ifdef JP
-msg_format("¥­¥ã¥é¥¯¥¿¾ðÊó¤Î¥Õ¥¡¥¤¥ë¤Ø¤Î½ñ¤­½Ð¤·¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡ª");
+                prt("¥­¥ã¥é¥¯¥¿¾ðÊó¤Î¥Õ¥¡¥¤¥ë¤Ø¤Î½ñ¤­½Ð¤·¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡ª", 0, 0);
 #else
-               msg_format("Character dump failed!");
+               prt("Character dump failed!", 0, 0);
 #endif
 
-               msg_print(NULL);
+                (void)inkey();
 
                /* Error */
                return (-1);
@@ -4884,6 +4871,8 @@ msg_format("
        /* Close it */
        my_fclose(fff);
 
+       /* Grab priv's */
+       safe_setuid_grab();
 
        /* Message */
 #ifdef JP
@@ -4924,6 +4913,9 @@ bool show_file(bool show_version, cptr name, cptr what, int line, int mode)
        /* Backup value for "line" */
        int back = 0;
 
+       /* Color of the next line */
+       byte color = TERM_WHITE;
+
        /* Loop counter */
        int cnt;
 
@@ -4966,11 +4958,13 @@ bool show_file(bool show_version, cptr name, cptr what, int line, int mode)
        /* Sub-menu information */
        char hook[68][32];
 
-       /* Tags for in-file references */
-       int tags[68];
-
        bool reverse = (line < 0);
 
+       int wid, hgt, rows;
+
+       Term_get_size(&wid, &hgt);
+       rows = hgt - 4;
+
        /* Wipe finder */
        strcpy(finder, "");
 
@@ -5030,7 +5024,7 @@ sprintf(caption, "
 
 
                /* Build the filename */
-               path_build(path, 1024, ANGBAND_DIR_HELP, name);
+               path_build(path, sizeof(path), ANGBAND_DIR_HELP, name);
 
                /* Open the file */
                fff = my_fopen(path, "r");
@@ -5048,7 +5042,7 @@ sprintf(caption, "
 
 
                /* Build the filename */
-               path_build(path, 1024, ANGBAND_DIR_INFO, name);
+               path_build(path, sizeof(path), ANGBAND_DIR_INFO, name);
 
                /* Open the file */
                fff = my_fopen(path, "r");
@@ -5058,7 +5052,7 @@ sprintf(caption, "
        if (!fff)
        {
                /* Build the filename */
-               path_build(path, 1024, ANGBAND_DIR, name);
+               path_build(path, sizeof(path), ANGBAND_DIR, name);
 
                for (i = 0; path[i]; i++)
                        if ('\\' == path[i])
@@ -5095,36 +5089,41 @@ msg_format("'%s'
        /* Pre-Parse the file */
        while (TRUE)
        {
+               char *str;
+
                /* Read a line or stop */
-               if (my_fgets(fff, buf, 1024)) break;
+               if (my_fgets(fff, buf, sizeof(buf))) break;
+
+               /* Get a color */
+               if (prefix(buf, "#####")) str = &buf[6];
+               else str = buf;
 
                /* XXX Parse "menu" items */
-               if (prefix(buf, "***** "))
+               if (prefix(str, "***** "))
                {
                        /* Notice "menu" requests */
-                       if ((buf[6] == '[') && (isdigit(buf[7]) || isalpha(buf[7])))
+                       if ((str[6] == '[') && isalpha(str[7]))
                        {
                                /* This is a menu file */
                                menu = TRUE;
 
                                /* Extract the menu item */
-                               k = isdigit(buf[7]) ? D2I(buf[7]) : buf[7] - 'A' + 10;
+                               k = str[7] - 'A';
 
-                               if ((buf[8] == ']') && (buf[9] == ' '))
+                               if ((str[8] == ']') && (str[9] == ' '))
                                {
                                        /* Extract the menu item */
-                                       strcpy(hook[k], buf + 10);
+                                       strncpy(hook[k], str + 10, 31);
+
+                                       /* Make sure it's null-terminated */
+                                       hook[k][31] = '\0';
                                }
                        }
                        /* Notice "tag" requests */
-                       else if ((buf[6] == '<') && (isdigit(buf[7]) || isalpha(buf[7])) &&
-                           (buf[8] == '>'))
+                       else if (str[6] == '<')
                        {
-                               /* Extract the menu item */
-                               k = isdigit(buf[7]) ? D2I(buf[7]) : buf[7] - 'A' + 10;
-
-                               /* Extract the menu item */
-                               tags[k] = next;
+                               str[strlen(str) - 1] = '\0';
+                                if (tag && streq(str + 7, tag)) line = next;
                        }
 
                        /* Skip this */
@@ -5138,11 +5137,8 @@ msg_format("'%s'
        /* Save the number of "real" lines */
        size = next;
 
-       if (line == -1) line = ((size-1)/20)*20;
-
-       /* Go to the tagged line */
-       if (tag)
-               line = tags[isdigit(tag[0]) ? D2I(tag[0]) : tag[0] - 'A' + 10];
+       /* start from bottom when reverse mode */
+       if (line == -1) line = ((size-1)/rows)*rows;
 
        /* Display the file */
        while (TRUE)
@@ -5151,8 +5147,8 @@ msg_format("'%s'
                Term_clear();
 
                /* Restart when necessary */
-               if (line >= size) line = 0;
-
+               if (line >= size - rows) line = size - rows;
+               if (line < 0) line = 0;
 
                /* Re-open the file if needed */
                if (next > line)
@@ -5174,7 +5170,7 @@ msg_format("'%s'
                while (next < line)
                {
                        /* Get a line */
-                       if (my_fgets(fff, buf, 1024)) break;
+                       if (my_fgets(fff, buf, sizeof(buf))) break;
 
                        /* Skip tags/links */
                        if (prefix(buf, "***** ")) continue;
@@ -5183,23 +5179,38 @@ msg_format("'%s'
                        next++;
                }
 
-               /* Dump the next 20 lines of the file */
-               for (i = 0; i < 20; )
+               /* Dump the next 20, or rows, lines of the file */
+               for (i = 0; i < rows; )
                {
+                       int print_x, x;
+                       cptr str;
+
                        /* Hack -- track the "first" line */
                        if (!i) line = next;
 
                        /* Get a line of the file or stop */
-                       if (my_fgets(fff, buf, 1024)) break;
+                       if (my_fgets(fff, buf, sizeof(buf))) break;
 
                        /* Hack -- skip "special" lines */
                        if (prefix(buf, "***** ")) continue;
 
+                       /* Get a color */
+                       if (prefix(buf, "#####"))
+                       {
+                               color = color_char_to_attr(buf[5]);
+                               str = &buf[6];
+                       }
+                       else
+                       {
+                               color = TERM_WHITE;
+                               str = buf;
+                       }
+
                        /* Count the "real" lines */
                        next++;
 
-                       /* Make a lower case version of buf for searching */
-                       strcpy(lc_buf, buf);
+                       /* Make a lower case version of str for searching */
+                       strcpy(lc_buf, str);
 
                        for (lc_buf_ptr = lc_buf; *lc_buf_ptr != 0; lc_buf_ptr++)
                        {
@@ -5218,23 +5229,48 @@ msg_format("'%s'
                        find = NULL;
 
                        /* Dump the line */
-                       Term_putstr(0, i+2, -1, TERM_WHITE, buf);
+                       x = 0;
+                       print_x = 0;
+                       while (str[x])
+                       {
+                               /* Color ? */
+                               if (prefix(str + x, "[[[[["))
+                               {
+                                       byte c = color_char_to_attr(str[x + 5]);
+                                       x += 6;
+
+                                       /* Ok print the link name */
+                                       while (str[x] != ']')
+                                       {
+                                               Term_putch(print_x, i + 2, c, str[x]);
+                                               x++;
+                                               print_x++;
+                                       }
+                               }
+                               else
+                               {
+                                       Term_putch(print_x, i + 2, color, str[x]);
+                                       print_x++;
+                               }
+
+                               x++;
+                       }
 
                        /* Hilite "shower" */
                        if (shower[0])
                        {
-                               cptr str = lc_buf;
+                               cptr s2 = lc_buf;
 
                                /* Display matches */
-                               while ((str = strstr(str, shower)) != NULL)
+                               while ((s2 = strstr(s2, shower)) != NULL)
                                {
                                        int len = strlen(shower);
 
                                        /* Display the match */
-                                       Term_putstr(str-lc_buf, i+2, len, TERM_YELLOW, &buf[str-lc_buf]);
+                                       Term_putstr(s2-lc_buf, i+2, len, TERM_YELLOW, &str[s2-lc_buf]);
 
                                        /* Advance */
-                                       str += len;
+                                       s2 += len;
                                }
                        }
 
@@ -5255,10 +5291,11 @@ msg_format("'%s'
                /* Show a general "title" */
                if (show_version)
                {
+                       prt(format(
 #ifdef JP
-prt(format("[ÊѶòÈÚÅÜ %d.%d.%d, %s, %d/%d]",
+                               "[ÊѶòÈÚÅÜ %d.%d.%d, %s, %d/%d]",
 #else
-               prt(format("[Hengband %d.%d.%d, %s, Line %d/%d]",
+                               "[Hengband %d.%d.%d, %s, Line %d/%d]",
 #endif
 
                           FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH,
@@ -5266,34 +5303,23 @@ prt(format("[
                }
                else
                {
+                       prt(format(
 #ifdef JP
-prt(format("[%s, %d/%d]",
-#else
-                       prt(format("[%s, Line %d/%d]",
-#endif
-                                  caption, line, size), 0, 0);
-               }
-
-               /* Prompt -- menu screen */
-               if (menu)
-               {
-                       /* Wait for it */
-#ifdef JP
-prt("[ ÈÖ¹æ¤òÆþÎϤ·¤Æ²¼¤µ¤¤( ESC¤Ç½ªÎ» ) ]", 23, 0);
+                               "[%s, %d/%d]",
 #else
-                       prt("[Press a Number, or ESC to exit.]", 23, 0);
+                               "[%s, Line %d/%d]",
 #endif
-
+                               caption, line, size), 0, 0);
                }
 
                /* Prompt -- small files */
-               else if (size <= 20)
+               if (size <= rows)
                {
                        /* Wait for it */
 #ifdef JP
-prt("[¥­¡¼:(?)¥Ø¥ë¥× (ESC)½ªÎ»]", 23, 0);
+prt("[¥­¡¼:(?)¥Ø¥ë¥× (ESC)½ªÎ»]", hgt - 1, 0);
 #else
-                       prt("[Press ESC to exit.]", 23, 0);
+                       prt("[Press ESC to exit.]", hgt - 1, 0);
 #endif
 
                }
@@ -5303,11 +5329,11 @@ prt("[
                {
 #ifdef JP
                        if(reverse)
-                               prt("[¥­¡¼:(RET/¥¹¥Ú¡¼¥¹)¢¬ (-)¢­ (?)¥Ø¥ë¥× (ESC)½ªÎ»]", 23, 0);
+                               prt("[¥­¡¼:(RET/¥¹¥Ú¡¼¥¹)¢¬ (-)¢­ (?)¥Ø¥ë¥× (ESC)½ªÎ»]", hgt - 1, 0);
                        else
-                               prt("[¥­¡¼:(RET/¥¹¥Ú¡¼¥¹)¢­ (-)¢¬ (?)¥Ø¥ë¥× (ESC)½ªÎ»]", 23, 0);
+                               prt("[¥­¡¼:(RET/¥¹¥Ú¡¼¥¹)¢­ (-)¢¬ (?)¥Ø¥ë¥× (ESC)½ªÎ»]", hgt - 1, 0);
 #else
-                       prt("[Press Return, Space, -, =, /, |, or ESC to exit.]", 23, 0);
+                       prt("[Press Return, Space, -, =, /, |, or ESC to exit.]", hgt - 1, 0);
 #endif
                }
 
@@ -5335,9 +5361,9 @@ prt("[
                {
                        /* Get "shower" */
 #ifdef JP
-prt("¶¯Ä´: ", 23, 0);
+prt("¶¯Ä´: ", hgt - 1, 0);
 #else
-                       prt("Show: ", 23, 0);
+                       prt("Show: ", hgt - 1, 0);
 #endif
 
                        (void)askfor_aux(shower, 80);
@@ -5348,9 +5374,9 @@ prt("
                {
                        /* Get "finder" */
 #ifdef JP
-prt("¸¡º÷: ", 23, 0);
+prt("¸¡º÷: ", hgt - 1, 0);
 #else
-                       prt("Find: ", 23, 0);
+                       prt("Find: ", hgt - 1, 0);
 #endif
 
 
@@ -5382,9 +5408,9 @@ prt("
                {
                        char tmp[81];
 #ifdef JP
-prt("¹Ô: ", 23, 0);
+prt("¹Ô: ", hgt - 1, 0);
 #else
-                       prt("Goto Line: ", 23, 0);
+                       prt("Goto Line: ", hgt - 1, 0);
 #endif
 
                        strcpy(tmp, "0");
@@ -5400,10 +5426,10 @@ prt("
                {
                        char tmp[81];
 #ifdef JP
-prt("¥Õ¥¡¥¤¥ë¡¦¥Í¡¼¥à: ", 23, 0);
+prt("¥Õ¥¡¥¤¥ë¡¦¥Í¡¼¥à: ", hgt - 1, 0);
 strcpy(tmp, "jhelp.hlp");
 #else
-                       prt("Goto File: ", 23, 0);
+                       prt("Goto File: ", hgt - 1, 0);
                        strcpy(tmp, "help.hlp");
 #endif
 
@@ -5414,60 +5440,44 @@ strcpy(tmp, "jhelp.hlp");
                        }
                }
 
-               /* Hack -- Allow backing up */
+               /* Allow backing up */
                if (k == '-')
                {
-                       line = line + (reverse ? 20 : -20);
-                       if (line < 0) line = ((size-1)/20)*20;
+                       line = line + (reverse ? rows : -rows);
+                       if (line < 0) line = 0;
                }
 
-               /* Hack -- Advance a single line */
+               /* Advance a single line */
                if ((k == '\n') || (k == '\r'))
                {
                        line = line + (reverse ? -1 : 1);
-                       if (line < 0) line = ((size-1)/20)*20;
+                       if (line < 0) line = 0;
                }
 
-               /* Advance one page */
-               if (k == ' ')
+
+               /* Move up / down */
+               if (k == '8')
                {
-                       line = line + (reverse ? -20 : 20);
-                       if (line < 0) line = ((size-1)/20)*20;
+                       line--;
+                       if (line < 0) line = 0;
                }
 
-#ifdef JP_FALSE
-               /* ÆüËܸìÈǤÇÄɲ䵤줿¥Ø¥ë¥×¤Îɽ¼¨ */
-               /* ¤¢¤Þ¤ê¤è¤¤½èÍý¤Î»ÅÊý¤È¤Ï»×¤¨¤Ê¤¤¡¦¡¦¡¦¤¹¤Þ¤ó */
+               if (k == '2') line++;
 
-               /* ´Ê°×¥³¥Þ¥ó¥É°ìÍ÷ */
-               if (menu && (k == 'c' || k == 'C'))
+               /* Advance one page */
+               if (k == ' ')
                {
-                       char tmp[80];
-                       switch (rogue_like_commands)
-                       {
-                               case TRUE:
-                               {
-                                       strcpy(tmp, "j_com_r.txt");
-                                       if(!show_file(TRUE, tmp, NULL, 0, mode)) k = 'q';
-                                       break;
-                               }
-                               case FALSE:
-                               {
-                                       strcpy(tmp, "j_com_o.txt");
-                                       if(!show_file(TRUE, tmp, NULL, 0, mode)) k = 'q';
-                                       break;
-                               }
-                       }
+                       line = line + (reverse ? -rows : rows);
+                       if (line < 0) line = ((size-1)/rows)*rows;
                }
 
-#endif
                /* Recurse on numbers */
                if (menu)
                {
                        int key = -1;
 
-                       if (isdigit(k)) key = D2I(k);
-                       else if (isalpha(k)) key = k - 'A' + 10;
+                       if (isalpha(k))
+                               key = k - 'A';
 
                        if ((key > -1) && hook[key][0])
                        {
@@ -5487,27 +5497,23 @@ strcpy(tmp, "jhelp.hlp");
                        strcpy (xtmp, "");
 
 #ifdef JP
-if (get_string("¥Õ¥¡¥¤¥ë̾: ", xtmp, 80))
+                       if (!get_string("¥Õ¥¡¥¤¥ë̾: ", xtmp, 80))
 #else
-                       if (get_string("File name: ", xtmp, 80))
+                       if (!get_string("File name: ", xtmp, 80))
 #endif
-
-                       {
-                               if (xtmp[0] && (xtmp[0] != ' '))
-                               {
-                               }
-                       }
-                       else
                        {
                                continue;
                        }
-
-                       /* Build the filename */
-                       path_build(buff, 1024, ANGBAND_DIR_USER, xtmp);
-
                        /* Close it */
                        my_fclose(fff);
 
+                        /* Drop priv's */
+                       safe_setuid_drop();
+
+                       /* Build the filename */
+                       path_build(buff, sizeof(buff), ANGBAND_DIR_USER, xtmp);
+
                        /* Hack -- Re-Open the file */
                        fff = my_fopen(path, "r");
 
@@ -5517,7 +5523,7 @@ if (get_string("
                        if (!(fff && ffp))
                        {
 #ifdef JP
-msg_print("¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¡£");
+msg_print("¥Õ¥¡¥¤¥ë¤¬³«¤±¤Þ¤»¤ó¡£");
 #else
                                msg_print("Failed to open file.");
 #endif
@@ -5530,13 +5536,16 @@ msg_print("
                        my_fputs(ffp, xtmp, 80);
                        my_fputs(ffp, "\n", 80);
 
-                       while (!my_fgets(fff, buff, 80))
+                       while (!my_fgets(fff, buff, sizeof(buff)))
                                my_fputs(ffp, buff, 80);
 
                        /* Close it */
                        my_fclose(fff);
                        my_fclose(ffp);
 
+                       /* Grab priv's */
+                       safe_setuid_grab();
+
                        /* Hack -- Re-Open the file */
                        fff = my_fopen(path, "r");
                }
@@ -5687,7 +5696,7 @@ quit_fmt("'%s' 
 #endif
 
 
-#if defined(WINDOWS) || defined(MSDOS)
+#if defined(MSDOS)
 
        /* Hack -- max length */
        if (k > 8) k = 8;
@@ -5746,7 +5755,7 @@ quit_fmt("'%s' 
 #endif /* VM */
 
                /* Build the filename */
-               path_build(savefile, 1024, ANGBAND_DIR_SAVE, temp);
+               path_build(savefile, sizeof(savefile), ANGBAND_DIR_SAVE, temp);
        }
 }
 
@@ -5797,6 +5806,7 @@ void get_name(void)
        strcat(tmp,player_name);
 
        /* Re-Draw the name (in light blue) */
+       Term_erase(34, 1, 255);
        c_put_str(TERM_L_BLUE, tmp, 1, 34);
 
        /* Erase the prompt, etc */
@@ -5816,13 +5826,13 @@ void do_cmd_suicide(void)
        flush();
 
        /* Verify Retirement */
-       if (total_winner)
+       if (p_ptr->total_winner)
        {
                /* Verify */
 #ifdef JP
-if (!get_check("°úÂष¤Þ¤¹¤«? ")) return;
+if (!get_check_strict("°úÂष¤Þ¤¹¤«? ", CHECK_NO_HISTORY)) return;
 #else
-               if (!get_check("Do you want to retire? ")) return;
+               if (!get_check_strict("Do you want to retire? ", CHECK_NO_HISTORY)) return;
 #endif
 
        }
@@ -5839,7 +5849,7 @@ if (!get_check("
        }
 
 
-       if (!noscore)
+       if (!p_ptr->noscore)
        {
                /* Special Verification for suicide */
 #ifdef JP
@@ -5855,15 +5865,15 @@ prt("
        }
 
        /* Stop playing */
-       alive = FALSE;
+       p_ptr->playing = FALSE;
 
        /* Kill the player */
-       death = TRUE;
+       p_ptr->is_dead = TRUE;
 
        /* Leaving */
        p_ptr->leaving = TRUE;
 
-       if (!total_winner)
+       if (!p_ptr->total_winner)
        {
 #ifdef JP
                do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "¥À¥ó¥¸¥ç¥ó¤Îõº÷¤ËÀä˾¤·¤Æ¼«»¦¤·¤¿¡£");
@@ -5877,9 +5887,9 @@ prt("
 
        /* Cause of death */
 #ifdef JP
-(void)strcpy(died_from, "ÅÓÃ潪λ");
+(void)strcpy(p_ptr->died_from, "ÅÓÃ潪λ");
 #else
-       (void)strcpy(died_from, "Quitting");
+       (void)strcpy(p_ptr->died_from, "Quitting");
 #endif
 
 }
@@ -5926,9 +5936,9 @@ prt("
 
        /* The player is not dead */
 #ifdef JP
-(void)strcpy(died_from, "(¥»¡¼¥Ö)");
+(void)strcpy(p_ptr->died_from, "(¥»¡¼¥Ö)");
 #else
-       (void)strcpy(died_from, "(saved)");
+       (void)strcpy(p_ptr->died_from, "(saved)");
 #endif
 
 
@@ -5965,9 +5975,9 @@ prt("
 
        /* Note that the player is not dead */
 #ifdef JP
-(void)strcpy(died_from, "(¸µµ¤¤ËÀ¸¤­¤Æ¤¤¤ë)");
+(void)strcpy(p_ptr->died_from, "(¸µµ¤¤ËÀ¸¤­¤Æ¤¤¤ë)");
 #else
-       (void)strcpy(died_from, "(alive and well)");
+       (void)strcpy(p_ptr->died_from, "(alive and well)");
 #endif
 
 }
@@ -5978,7 +5988,7 @@ prt("
  */
 void do_cmd_save_and_exit(void)
 {
-       alive = FALSE;
+       p_ptr->playing = FALSE;
 
        /* Leaving */
        p_ptr->leaving = TRUE;
@@ -6045,7 +6055,7 @@ long total_points(void)
        if ((p_ptr->pseikaku == SEIKAKU_MUNCHKIN) && point)
        {
                point = 1;
-               if (total_winner) point = 2;
+               if (p_ptr->total_winner) point = 2;
        }
        if (easy_band) point = (0 - point);
 
@@ -6089,7 +6099,7 @@ static void make_bones(void)
 
 
        /* Ignore wizards and borgs */
-       if (!(noscore & 0x00FF))
+       if (!(p_ptr->noscore & 0x00FF))
        {
                /* Ignore people who die in town */
                if (dun_level)
@@ -6100,7 +6110,7 @@ static void make_bones(void)
                        sprintf(tmp, "bone.%03d", dun_level);
 
                        /* Build the filename */
-                       path_build(str, 1024, ANGBAND_DIR_BONE, tmp);
+                       path_build(str, sizeof(str), ANGBAND_DIR_BONE, tmp);
 
                        /* Attempt to open the bones file */
                        fp = my_fopen(str, "r");
@@ -6176,9 +6186,9 @@ static void print_tomb(void)
 
                /* Build the filename */
 #ifdef JP
-               path_build(buf, 1024, ANGBAND_DIR_FILE, "dead_j.txt");
+               path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "dead_j.txt");
 #else
-               path_build(buf, 1024, ANGBAND_DIR_FILE, "dead.txt");
+               path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "dead.txt");
 #endif
 
 
@@ -6191,7 +6201,7 @@ static void print_tomb(void)
                        int i = 0;
 
                        /* Dump the file to the screen */
-                       while (0 == my_fgets(fp, buf, 1024))
+                       while (0 == my_fgets(fp, buf, sizeof(buf)))
                        {
                                /* Display and advance */
                                put_str(buf, i++, 0);
@@ -6203,7 +6213,7 @@ static void print_tomb(void)
 
 
                /* King or Queen */
-               if (total_winner || (p_ptr->lev > PY_MAX_LEVEL))
+               if (p_ptr->total_winner || (p_ptr->lev > PY_MAX_LEVEL))
                {
 #ifdef JP
                 /* ±ÑÆüÀÚ¤êÂؤ¨ */
@@ -6265,34 +6275,34 @@ static void print_tomb(void)
 
 #ifdef JP
         /* Êè¤Ë¹ï¤à¸ÀÍÕ¤ò¥ª¥ê¥¸¥Ê¥ë¤è¤êºÙ¤«¤¯É½¼¨ */
-        if (streq(died_from, "ÅÓÃ潪λ"))
+        if (streq(p_ptr->died_from, "ÅÓÃ潪λ"))
         {
                 strcpy(tmp, "<¼«»¦>");
         }
         else
         {
-                if (streq(died_from, "ripe"))
+                if (streq(p_ptr->died_from, "ripe"))
                 {
                         strcpy(tmp, "°úÂà¸å¤ËÅ·¼÷¤òÁ´¤¦");
                 }
-                else if (streq(died_from, "Seppuku"))
+                else if (streq(p_ptr->died_from, "Seppuku"))
                 {
                         strcpy(tmp, "¾¡Íø¤Î¸å¡¢ÀÚÊ¢");
                 }
                 else
                 {
-                        strcpy(tmp, died_from);
+                        strcpy(tmp, p_ptr->died_from);
                 }
         }
         center_string(buf, tmp);
         put_str(buf, 14, 11);
 
-        if(!streq(died_from, "ripe") && !streq(died_from, "Seppuku"))
+        if(!streq(p_ptr->died_from, "ripe") && !streq(p_ptr->died_from, "Seppuku"))
         {
                 if( dun_level == 0 )
                 {
                        cptr town = (p_ptr->town_num ? "³¹" : "¹ÓÌî");
-                        if(streq(died_from, "ÅÓÃ潪λ"))
+                        if(streq(p_ptr->died_from, "ÅÓÃ潪λ"))
                         {
                                 sprintf(tmp, "%s¤Ç»à¤ó¤À", town);
                         }
@@ -6303,7 +6313,7 @@ static void print_tomb(void)
                 }
                 else
                 {
-                        if(streq(died_from, "ÅÓÃ潪λ"))
+                        if(streq(p_ptr->died_from, "ÅÓÃ潪λ"))
                         {
                                 sprintf(tmp, "Ãϲ¼ %d ³¬¤Ç»à¤ó¤À", dun_level);
                         }
@@ -6321,14 +6331,14 @@ static void print_tomb(void)
                put_str(buf, 14, 11);
 
 
-               if (strlen(died_from) > 24)
+               if (strlen(p_ptr->died_from) > 24)
                {
-                       strncpy(dummy, died_from, 24);
+                       strncpy(dummy, p_ptr->died_from, 24);
                        dummy[24] = '\0';
                        (void)sprintf(tmp, "by %s.", dummy);
                }
                else
-                       (void)sprintf(tmp, "by %s.", died_from);
+                       (void)sprintf(tmp, "by %s.", p_ptr->died_from);
 
                center_string(buf, tmp);
                put_str(buf, 15, 11);
@@ -6562,7 +6572,7 @@ msg_print("
 
 #ifndef SCORE_WIZARDS
        /* Wizard-mode pre-empts scoring */
-       if (noscore & 0x000F)
+       if (p_ptr->noscore & 0x000F)
        {
 #ifdef JP
 msg_print("¥¦¥£¥¶¡¼¥É¡¦¥â¡¼¥É¤Ç¤Ï¥¹¥³¥¢¤¬µ­Ï¿¤µ¤ì¤Þ¤»¤ó¡£");
@@ -6577,7 +6587,7 @@ msg_print("
 
 #ifndef SCORE_BORGS
        /* Borg-mode pre-empts scoring */
-       if (noscore & 0x00F0)
+       if (p_ptr->noscore & 0x00F0)
        {
 #ifdef JP
 msg_print("¥Ü¡¼¥°¡¦¥â¡¼¥É¤Ç¤Ï¥¹¥³¥¢¤¬µ­Ï¿¤µ¤ì¤Þ¤»¤ó¡£");
@@ -6592,7 +6602,7 @@ msg_print("
 
 #ifndef SCORE_CHEATERS
        /* Cheaters are not scored */
-       if (noscore & 0xFF00)
+       if (p_ptr->noscore & 0xFF00)
        {
 #ifdef JP
 msg_print("º¾µ½¤ò¤ä¤Ã¤¿¿Í¤Ï¥¹¥³¥¢¤¬µ­Ï¿¤µ¤ì¤Þ¤»¤ó¡£");
@@ -6607,9 +6617,9 @@ msg_print("
 
        /* Interupted */
 #ifdef JP
-if (!total_winner && streq(died_from, "¶¯À©½ªÎ»"))
+if (!p_ptr->total_winner && streq(p_ptr->died_from, "¶¯À©½ªÎ»"))
 #else
-       if (!total_winner && streq(died_from, "Interrupting"))
+       if (!p_ptr->total_winner && streq(p_ptr->died_from, "Interrupting"))
 #endif
 
        {
@@ -6625,9 +6635,9 @@ msg_print("
 
        /* Quitter */
 #ifdef JP
-if (!total_winner && streq(died_from, "ÅÓÃ潪λ"))
+if (!p_ptr->total_winner && streq(p_ptr->died_from, "ÅÓÃ潪λ"))
 #else
-       if (!total_winner && streq(died_from, "Quitting"))
+       if (!p_ptr->total_winner && streq(p_ptr->died_from, "Quitting"))
 #endif
 
        {
@@ -6674,17 +6684,17 @@ void close_game(void)
 
 
        /* Build the filename */
-       path_build(buf, 1024, ANGBAND_DIR_APEX, "scores.raw");
+       path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
 
        /* Open the high score file, for reading/writing */
        highscore_fd = fd_open(buf, O_RDWR);
 
 
        /* Handle death */
-       if (death)
+       if (p_ptr->is_dead)
        {
                /* Handle retirement */
-               if (total_winner) kingly();
+               if (p_ptr->total_winner) kingly();
 
                /* Save memories */
 #ifdef JP
@@ -6718,13 +6728,13 @@ if (!save_player()) msg_print("
                        if ((!send_world_score(do_send)))
                        {
 #ifdef JP
-                               if (get_check("¸å¤Ç¥¹¥³¥¢¤òÅÐÏ¿¤¹¤ë¤¿¤á¤ËÂÔµ¡¤·¤Þ¤¹¤«¡©"))
+                               if (get_check_strict("¸å¤Ç¥¹¥³¥¢¤òÅÐÏ¿¤¹¤ë¤¿¤á¤ËÂÔµ¡¤·¤Þ¤¹¤«¡©", (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
 #else
-                               if (get_check("Stand by for later score registration? "))
+                               if (get_check_strict("Stand by for later score registration? ", (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
 #endif
                                {
-                                       wait_report_score = TRUE;
-                                       death = FALSE;
+                                       p_ptr->wait_report_score = TRUE;
+                                       p_ptr->is_dead = FALSE;
 #ifdef JP
                                        if (!save_player()) msg_print("¥»¡¼¥Ö¼ºÇÔ¡ª");
 #else
@@ -6732,7 +6742,7 @@ if (!save_player()) msg_print("
 #endif
                                }
                        }
-                       if (!wait_report_score)
+                       if (!p_ptr->wait_report_score)
                                (void)top_twenty();
                }
                else if (highscore_fd >= 0)
@@ -6805,19 +6815,19 @@ if (!character_generated || character_saved) quit("
        disturb(1, 0);
 
        /* Mega-Hack -- Delay death */
-       if (p_ptr->chp < 0) death = FALSE;
+       if (p_ptr->chp < 0) p_ptr->is_dead = FALSE;
 
        /* Hardcode panic save */
-       panic_save = 1;
+       p_ptr->panic_save = 1;
 
        /* Forbid suspend */
        signals_ignore_tstp();
 
        /* Indicate panic save */
 #ifdef JP
-(void)strcpy(died_from, "(¶ÛµÞ¥»¡¼¥Ö)");
+(void)strcpy(p_ptr->died_from, "(¶ÛµÞ¥»¡¼¥Ö)");
 #else
-       (void)strcpy(died_from, "(panic save)");
+       (void)strcpy(p_ptr->died_from, "(panic save)");
 #endif
 
 
@@ -6853,7 +6863,7 @@ errr get_rnd_line(cptr file_name, int entry, char *output)
 
 
        /* Build the filename */
-       path_build(buf, 1024, ANGBAND_DIR_FILE, file_name);
+       path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, file_name);
 
        /* Open the file */
        fp = my_fopen(buf, "r");
@@ -6865,7 +6875,7 @@ errr get_rnd_line(cptr file_name, int entry, char *output)
        while (TRUE)
        {
                /* Get a line from the file */
-               if (my_fgets(fp, buf, 1024) == 0)
+               if (my_fgets(fp, buf, sizeof(buf)) == 0)
                {
                        /* Count the lines */
                        line_num++;
@@ -6929,7 +6939,7 @@ errr get_rnd_line(cptr file_name, int entry, char *output)
        while (TRUE)
        {
                /* Get the line */
-               if (my_fgets(fp, buf, 1024) == 0)
+               if (my_fgets(fp, buf, sizeof(buf)) == 0)
                {
                        /* Count the lines */
                        line_num++;
@@ -6959,7 +6969,7 @@ errr get_rnd_line(cptr file_name, int entry, char *output)
        if (numentries > 0)
        {
                /* Grab an appropriate line number */
-               line = rand_int(numentries);
+               line = randint0(numentries);
 
                /* Get the random line */
                for (counter = 0; counter <= line; counter++)
@@ -6969,7 +6979,7 @@ errr get_rnd_line(cptr file_name, int entry, char *output)
 
                        while(TRUE)
                        {
-                               test = my_fgets(fp, buf, 1024);
+                               test = my_fgets(fp, buf, sizeof(buf));
                                if(test || buf[0] != '#')
                                        break;
                        }
@@ -7031,11 +7041,17 @@ errr process_pickpref_file(cptr name)
 
        errr err = 0;
 
+       /* Drop priv's */
+       safe_setuid_drop();
+
        /* Build the filename */
-       path_build(buf, 1024, ANGBAND_DIR_USER, name);
+       path_build(buf, sizeof(buf), ANGBAND_DIR_USER, name);
 
        err = process_pref_file_aux(buf, TRUE);
 
+       /* Grab priv's */
+       safe_setuid_grab();
+
        /* Result */
        return (err);
 }
@@ -7087,9 +7103,9 @@ u32b counts_read(int where)
        char buf[1024];
 
 #ifdef JP
-       path_build(buf, 1024, ANGBAND_DIR_DATA, "z_info_j.raw");
+       path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, "z_info_j.raw");
 #else
-       path_build(buf, 1024, ANGBAND_DIR_DATA, "z_info.raw");
+       path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, "z_info.raw");
 #endif
        fd = fd_open(buf, O_RDONLY);
 
@@ -7108,9 +7124,9 @@ errr counts_write(int where, u32b count)
        char buf[1024];
 
 #ifdef JP
-       path_build(buf, 1024, ANGBAND_DIR_DATA, "z_info_j.raw");
+       path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, "z_info_j.raw");
 #else
-       path_build(buf, 1024, ANGBAND_DIR_DATA, "z_info.raw");
+       path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, "z_info.raw");
 #endif
        fd = fd_open(buf, O_RDWR);
        if (fd < 0)
@@ -7207,13 +7223,13 @@ static void handle_signal_simple(int sig)
 
 
        /* Terminate dead characters */
-       if (death)
+       if (p_ptr->is_dead)
        {
                /* Mark the savefile */
 #ifdef JP
-(void)strcpy(died_from, "¶¯À©½ªÎ»");
+(void)strcpy(p_ptr->died_from, "¶¯À©½ªÎ»");
 #else
-               (void)strcpy(died_from, "Abortion");
+               (void)strcpy(p_ptr->died_from, "Abortion");
 #endif
 
                forget_lite();
@@ -7237,9 +7253,9 @@ quit("
        {
                /* Cause of "death" */
 #ifdef JP
-(void)strcpy(died_from, "¶¯À©½ªÎ»Ãæ");
+(void)strcpy(p_ptr->died_from, "¶¯À©½ªÎ»Ãæ");
 #else
-               (void)strcpy(died_from, "Interrupting");
+               (void)strcpy(p_ptr->died_from, "Interrupting");
 #endif
 
 
@@ -7248,10 +7264,10 @@ quit("
                clear_mon_lite();
 
                /* Stop playing */
-               alive = FALSE;
+               p_ptr->playing = FALSE;
 
                /* Suicide */
-               death = TRUE;
+               p_ptr->is_dead = TRUE;
 
                /* Leaving */
                p_ptr->leaving = TRUE;
@@ -7306,6 +7322,11 @@ Term_putstr(0, 0, -1, TERM_WHITE, "
  */
 static void handle_signal_abort(int sig)
 {
+       int wid, hgt, rows;
+
+       Term_get_size(&wid, &hgt);
+       rows = hgt - 4;
+
        /* Disable handler */
        (void)signal(sig, SIG_IGN);
 
@@ -7319,10 +7340,10 @@ static void handle_signal_abort(int sig)
        clear_mon_lite();
 
        /* Clear the bottom line */
-       Term_erase(0, 23, 255);
+       Term_erase(0, hgt - 1, 255);
 
        /* Give a warning */
-       Term_putstr(0, 23, -1, TERM_RED,
+       Term_putstr(0, hgt - 1, -1, TERM_RED,
 #ifdef JP
 "¶²¤í¤·¤¤¥½¥Õ¥È¤Î¥Ð¥°¤¬Èô¤Ó¤«¤«¤Ã¤Æ¤­¤¿¡ª");
 #else
@@ -7332,9 +7353,9 @@ static void handle_signal_abort(int sig)
 
        /* Message */
 #ifdef JP
-Term_putstr(45, 23, -1, TERM_RED, "¶ÛµÞ¥»¡¼¥Ö...");
+Term_putstr(45, hgt - 1, -1, TERM_RED, "¶ÛµÞ¥»¡¼¥Ö...");
 #else
-       Term_putstr(45, 23, -1, TERM_RED, "Panic save...");
+       Term_putstr(45, hgt - 1, -1, TERM_RED, "Panic save...");
 #endif
 
 
@@ -7342,13 +7363,13 @@ Term_putstr(45, 23, -1, TERM_RED, "
        Term_fresh();
 
        /* Panic Save */
-       panic_save = 1;
+       p_ptr->panic_save = 1;
 
        /* Panic save */
 #ifdef JP
-(void)strcpy(died_from, "(¶ÛµÞ¥»¡¼¥Ö)");
+(void)strcpy(p_ptr->died_from, "(¶ÛµÞ¥»¡¼¥Ö)");
 #else
-       (void)strcpy(died_from, "(panic save)");
+       (void)strcpy(p_ptr->died_from, "(panic save)");
 #endif
 
 
@@ -7359,9 +7380,9 @@ Term_putstr(45, 23, -1, TERM_RED, "
        if (save_player())
        {
 #ifdef JP
-Term_putstr(45, 23, -1, TERM_RED, "¶ÛµÞ¥»¡¼¥ÖÀ®¸ù¡ª");
+Term_putstr(45, hgt - 1, -1, TERM_RED, "¶ÛµÞ¥»¡¼¥ÖÀ®¸ù¡ª");
 #else
-               Term_putstr(45, 23, -1, TERM_RED, "Panic save succeeded!");
+               Term_putstr(45, hgt - 1, -1, TERM_RED, "Panic save succeeded!");
 #endif
 
        }
@@ -7370,9 +7391,9 @@ Term_putstr(45, 23, -1, TERM_RED, "
        else
        {
 #ifdef JP
-Term_putstr(45, 23, -1, TERM_RED, "¶ÛµÞ¥»¡¼¥Ö¼ºÇÔ¡ª");
+Term_putstr(45, hgt - 1, -1, TERM_RED, "¶ÛµÞ¥»¡¼¥Ö¼ºÇÔ¡ª");
 #else
-               Term_putstr(45, 23, -1, TERM_RED, "Panic save failed!");
+               Term_putstr(45, hgt - 1, -1, TERM_RED, "Panic save failed!");
 #endif
 
        }