OSDN Git Service

add type casting for fprintf
[hengband/hengband.git] / src / bldg.c
index c07ef6a..7317586 100644 (file)
@@ -16,9 +16,6 @@
 /* hack as in leave_store in store.c */
 static bool leave_bldg = FALSE;
 
-/* remember building location */
-static int building_loc = 0;
-
 static bool is_owner(building_type *bldg)
 {
        if (bldg->member_class[p_ptr->pclass] == BUILDING_OWNER)
@@ -132,9 +129,9 @@ static void show_building(building_type* bldg)
                                {
                                        action_color = TERM_YELLOW;
 #ifdef JP
-sprintf(buff, "($%ld)", bldg->member_costs[i]);
+sprintf(buff, "($%ld)", (long int)bldg->member_costs[i]);
 #else
-                                       sprintf(buff, "(%ldgp)", bldg->member_costs[i]);
+                                       sprintf(buff, "(%ldgp)", (long int)bldg->member_costs[i]);
 #endif
 
                                }
@@ -142,9 +139,9 @@ sprintf(buff, "($%ld)", bldg->member_costs[i]);
                                {
                                        action_color = TERM_YELLOW;
 #ifdef JP
-sprintf(buff, "($%ld)", bldg->other_costs[i]);
+sprintf(buff, "($%ld)", (long int)bldg->other_costs[i]);
 #else
-                                       sprintf(buff, "(%ldgp)", bldg->other_costs[i]);
+                                       sprintf(buff, "(%ldgp)", (long int)bldg->other_costs[i]);
 #endif
 
                                }
@@ -171,9 +168,9 @@ strcpy(buff, "(
                                {
                                        action_color = TERM_YELLOW;
 #ifdef JP
-sprintf(buff, "($%ld)", bldg->member_costs[i]);
+sprintf(buff, "($%ld)", (long int)bldg->member_costs[i]);
 #else
-                                       sprintf(buff, "(%ldgp)", bldg->member_costs[i]);
+                                       sprintf(buff, "(%ldgp)", (long int)bldg->member_costs[i]);
 #endif
 
                                }
@@ -181,9 +178,9 @@ sprintf(buff, "($%ld)", bldg->member_costs[i]);
                                {
                                        action_color = TERM_YELLOW;
 #ifdef JP
-sprintf(buff, "($%ld)", bldg->other_costs[i]);
+sprintf(buff, "($%ld)", (long int)bldg->other_costs[i]);
 #else
-                                       sprintf(buff, "(%ldgp)", bldg->other_costs[i]);
+                                       sprintf(buff, "(%ldgp)", (long int)bldg->other_costs[i]);
 #endif
 
                                }
@@ -204,9 +201,9 @@ strcpy(buff, "(
                                {
                                        action_color = TERM_YELLOW;
 #ifdef JP
-sprintf(buff, "($%ld)", bldg->member_costs[i]);
+sprintf(buff, "($%ld)", (long int)bldg->member_costs[i]);
 #else
-                                       sprintf(buff, "(%ldgp)", bldg->member_costs[i]);
+                                       sprintf(buff, "(%ldgp)", (long int)bldg->member_costs[i]);
 #endif
 
                                }
@@ -285,10 +282,13 @@ msg_print("
                                        if (get_check("Do you fight? "))
 #endif
                                        {
-                                               p_ptr->leftbldg = TRUE;
-                                               p_ptr->inside_arena = TRUE;
                                                p_ptr->exit_bldg = FALSE;
                                                reset_tim_flags();
+
+                                               /* Save the surface floor as saved floor */
+                                               prepare_change_floor_mode(CFM_SAVE_FLOORS);
+
+                                               p_ptr->inside_arena = TRUE;
                                                p_ptr->leaving = TRUE;
                                                leave_bldg = TRUE;
                                        }
@@ -324,10 +324,13 @@ msg_print("
                        }
                        else
                        {
-                               p_ptr->leftbldg = TRUE;
-                               p_ptr->inside_arena = TRUE;
                                p_ptr->exit_bldg = FALSE;
                                reset_tim_flags();
+
+                               /* Save the surface floor as saved floor */
+                               prepare_change_floor_mode(CFM_SAVE_FLOORS);
+
+                               p_ptr->inside_arena = TRUE;
                                p_ptr->leaving = TRUE;
                                leave_bldg = TRUE;
                        }
@@ -350,7 +353,7 @@ msg_print("
                        }
                        else
                        {
-                               r_ptr = &r_info[arena_monsters[p_ptr->arena_number]];
+                               r_ptr = &r_info[arena_info[p_ptr->arena_number].r_idx];
                                name = (r_name + r_ptr->name);
 #ifdef JP
 msg_format("%s ¤ËÄ©À魯¤ë¤â¤Î¤Ï¤¤¤Ê¤¤¤«¡©", name);
@@ -644,7 +647,7 @@ static int yaku_check_straight(void)
        joker_is_used = FALSE;
        for (i = 0; i < 5; i++)
        {
-               if (!find_card_num(lowest + i)){
+               if (!find_card_num(lowest + i)){
                  if( have_joker() && !joker_is_used )
                    joker_is_used = TRUE;
                  else
@@ -1267,9 +1270,9 @@ static bool gamble_comm(int cmd)
                /* Get the wager */
                strcpy(out_val, "");
 #ifdef JP
-sprintf(tmp_str,"ÅÒ¤±¶â (1-%ld)¡©", maxbet);
+sprintf(tmp_str,"ÅÒ¤±¶â (1-%ld)¡©", (long int)maxbet);
 #else
-               sprintf(tmp_str,"Your wager (1-%ld) ? ", maxbet);
+               sprintf(tmp_str,"Your wager (1-%ld) ? ", (long int)maxbet);
 #endif
 
 
@@ -1300,9 +1303,9 @@ msg_print("
                        else if (wager > maxbet)
                        {
 #ifdef JP
-msg_format("%ld¥´¡¼¥ë¥É¤À¤±¼õ¤±¤è¤¦¡£»Ä¤ê¤Ï¼è¤Ã¤È¤­¤Ê¡£", maxbet);
+msg_format("%ld¥´¡¼¥ë¥É¤À¤±¼õ¤±¤è¤¦¡£»Ä¤ê¤Ï¼è¤Ã¤È¤­¤Ê¡£", (long int)maxbet);
 #else
-                               msg_format("I'll take %ld gold of that. Keep the rest.", maxbet);
+                               msg_format("I'll take %ld gold of that. Keep the rest.", (long int)maxbet);
 #endif
 
                                wager = maxbet;
@@ -1324,17 +1327,17 @@ msg_print("
                        oldgold = p_ptr->au;
 
 #ifdef JP
-sprintf(tmp_str, "¥²¡¼¥àÁ°¤Î½ê»ý¶â: %9ld", oldgold);
+sprintf(tmp_str, "¥²¡¼¥àÁ°¤Î½ê»ý¶â: %9ld", (long int)oldgold);
 #else
-                       sprintf(tmp_str, "Gold before game: %9ld", oldgold);
+                       sprintf(tmp_str, "Gold before game: %9ld", (long int)oldgold);
 #endif
 
                        prt(tmp_str, 20, 2);
 
 #ifdef JP
-sprintf(tmp_str, "¸½ºß¤Î³Ý¤±¶â:     %9ld", wager);
+sprintf(tmp_str, "¸½ºß¤Î³Ý¤±¶â:     %9ld", (long int)wager);
 #else
-                       sprintf(tmp_str, "Current Wager:    %9ld", wager);
+                       sprintf(tmp_str, "Current Wager:    %9ld", (long int)wager);
 #endif
 
                        prt(tmp_str, 21, 2);
@@ -1603,9 +1606,9 @@ prt("
                                        prt("", 17, 37);
                                }
 #ifdef JP
-sprintf(tmp_str, "¸½ºß¤Î½ê»ý¶â:     %9ld", p_ptr->au);
+sprintf(tmp_str, "¸½ºß¤Î½ê»ý¶â:     %9ld", (long int)p_ptr->au);
 #else
-                               sprintf(tmp_str, "Current Gold:     %9ld", p_ptr->au);
+                               sprintf(tmp_str, "Current Gold:     %9ld", (long int)p_ptr->au);
 #endif
 
                                prt(tmp_str, 22, 2);
@@ -1672,11 +1675,11 @@ static bool vault_aux_battle(int r_idx)
        monster_race *r_ptr = &r_info[r_idx];
 
        /* Decline town monsters */
-/*     if (!monster_dungeon(r_idx)) return FALSE; */
+/*     if (!mon_hook_dungeon(r_idx)) return FALSE; */
 
        /* Decline unique monsters */
 /*     if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); */
-/*     if (r_ptr->flags7 & (RF7_UNIQUE_7)) return (FALSE); */
+/*     if (r_ptr->flags7 & (RF7_NAZGUL)) return (FALSE); */
 
        if (r_ptr->flags1 & (RF1_NEVER_MOVE)) return (FALSE);
        if (r_ptr->flags2 & (RF2_MULTIPLY)) return (FALSE);
@@ -1752,7 +1755,7 @@ void battle_monsters(void)
                for (i=0;i<4;i++)
                {
                        monster_race *r_ptr = &r_info[battle_mon[i]];
-                       int num_taisei = count_bits(r_ptr->flags3 & (RF3_IM_ACID | RF3_IM_ELEC | RF3_IM_FIRE | RF3_IM_COLD | RF3_IM_POIS));
+                       int num_taisei = count_bits(r_ptr->flagsr & (RFR_IM_ACID | RFR_IM_ELEC | RFR_IM_FIRE | RFR_IM_COLD | RFR_IM_POIS));
 
                        if (r_ptr->flags1 & RF1_FORCE_MAXHP)
                                power[i] = r_ptr->hdice * r_ptr->hside * 2;
@@ -1806,7 +1809,7 @@ void battle_monsters(void)
                                case MON_SHADOWLORD:
                                case MON_ARCHLICH:
                                case MON_BLEYS:
-                               case MON_CAIN:
+                               case MON_CAINE:
                                case MON_JULIAN:
                                case MON_VENOM_WYRM:
                                case MON_MASTER_MYS:
@@ -1834,7 +1837,7 @@ void battle_monsters(void)
                                case MON_BAZOOKER:
                                case MON_GCWADL:
                                case MON_KIRIN:
-                               case MON_HOUOU:
+                               case MON_FENGHUANG:
                                        power[i] = power[i] * 4 / 3;
                                        break;
                                case MON_UMBER_HULK:
@@ -1842,7 +1845,7 @@ void battle_monsters(void)
                                case MON_WATER_VOR:
                                case MON_COLD_VOR:
                                case MON_ENERGY_VOR:
-                               case MON_BARNEY:
+                               case MON_GACHAPIN:
                                case MON_REVENANT:
                                case MON_NEXUS_VOR:
                                case MON_PLASMA_VOR:
@@ -1957,9 +1960,9 @@ static bool kakutoujou(void)
                        monster_race *r_ptr = &r_info[battle_mon[i]];
 
 #ifdef JP
-                       sprintf(buf,"%d) %-58s  %4ld.%02ldÇÜ", i+1, format("%s%s",r_name + r_ptr->name, (r_ptr->flags1 & RF1_UNIQUE) ? "¤â¤É¤­" : "      "), mon_odds[i]/100, mon_odds[i]%100);
+                       sprintf(buf,"%d) %-58s  %4ld.%02ldÇÜ", i+1, format("%s%s",r_name + r_ptr->name, (r_ptr->flags1 & RF1_UNIQUE) ? "¤â¤É¤­" : "      "), (long int)mon_odds[i]/100, (long int)mon_odds[i]%100);
 #else
-                       sprintf(buf,"%d) %-58s  %4ld.%02ld", i+1, format("%s%s", (r_ptr->flags1 & RF1_UNIQUE) ? "Fake " : "", r_name + r_ptr->name), mon_odds[i]/100, mon_odds[i]%100);
+                       sprintf(buf,"%d) %-58s  %4ld.%02ld", i+1, format("%s%s", (r_ptr->flags1 & RF1_UNIQUE) ? "Fake " : "", r_name + r_ptr->name), (long int)mon_odds[i]/100, (long int)mon_odds[i]%100);
 #endif
                        prt(buf, 5+i, 1);
                }
@@ -1999,9 +2002,9 @@ static bool kakutoujou(void)
                /* Get the wager */
                strcpy(out_val, "");
 #ifdef JP
-sprintf(tmp_str,"ÅÒ¤±¶â (1-%ld)¡©", maxbet);
+sprintf(tmp_str,"ÅÒ¤±¶â (1-%ld)¡©", (long int)maxbet);
 #else
-               sprintf(tmp_str,"Your wager (1-%ld) ? ", maxbet);
+               sprintf(tmp_str,"Your wager (1-%ld) ? ", (long int)maxbet);
 #endif
 
 
@@ -2032,9 +2035,9 @@ msg_print("
                        else if (wager > maxbet)
                        {
 #ifdef JP
-msg_format("%ld¥´¡¼¥ë¥É¤À¤±¼õ¤±¤è¤¦¡£»Ä¤ê¤Ï¼è¤Ã¤È¤­¤Ê¡£", maxbet);
+msg_format("%ld¥´¡¼¥ë¥É¤À¤±¼õ¤±¤è¤¦¡£»Ä¤ê¤Ï¼è¤Ã¤È¤­¤Ê¡£", (long int)maxbet);
 #else
-                               msg_format("I'll take %ld gold of that. Keep the rest.", maxbet);
+                               msg_format("I'll take %ld gold of that. Keep the rest.",(long int) maxbet);
 #endif
 
                                wager = maxbet;
@@ -2054,10 +2057,14 @@ msg_print("
                        battle_odds = MAX(wager+1, wager * battle_odds / 100);
                        kakekin = wager;
                        p_ptr->au -= wager;
-                       p_ptr->leftbldg = TRUE;
-                       p_ptr->inside_battle = TRUE;
                        reset_tim_flags();
+
+                       /* Save the surface floor as saved floor */
+                       prepare_change_floor_mode(CFM_SAVE_FLOORS);
+
+                       p_ptr->inside_battle = TRUE;
                        p_ptr->leaving = TRUE;
+
                        leave_bldg = TRUE;
                        screen_load();
 
@@ -2127,7 +2134,7 @@ static void shoukinkubi(void)
        clear_bldg(4,18);
 
 #ifdef JP
-       prt("»àÂΤò»ý¤Áµ¢¤ë¤È¾Þ¶â¤òº¹¤·¾å¤²¤Þ¤¹¡£",4 ,10);
+       prt("»àÂΤò»ý¤Áµ¢¤ì¤ÐÊó½·¤òº¹¤·¾å¤²¤Þ¤¹¡£",4 ,10);
 c_put_str(TERM_YELLOW, "¸½ºß¤Î¾Þ¶â¼ó", 6, 10);
 #else
        prt("Offer a prize when you bring a wanted monster's corpse",4 ,10);
@@ -2136,22 +2143,27 @@ c_put_str(TERM_YELLOW, "Wanted monsters", 6, 10);
 
        for (i = 0; i < MAX_KUBI; i++)
        {
-               char buf[160];
+               byte color;
+               cptr done_mark;
                monster_race *r_ptr = &r_info[(kubi_r_idx[i] > 10000 ? kubi_r_idx[i] - 10000 : kubi_r_idx[i])];
 
-               sprintf(buf,"%-40s ---- ",r_name + r_ptr->name);
-               prt(buf, y+7, 10);
                if (kubi_r_idx[i] > 10000)
+               {
+                       color = TERM_RED;
 #ifdef JP
-                       c_put_str(TERM_RED,"ºÑ", y+7, 56);
+                       done_mark = "(ºÑ)";
 #else
-                       c_put_str(TERM_RED,"done", y+7, 56);
+                       done_mark = "(done)";
 #endif
+               }
                else
                {
-                       sprintf(buf,"$%d", 300 * (r_ptr->level + 1));
-                       prt(buf, y+7, 56);
+                       color = TERM_WHITE;
+                       done_mark = "";
                }
+
+               c_prt(color, format("%s %s", r_name + r_ptr->name, done_mark), y+7, 10);
+
                y = (y+1) % 10;
                if (!y && (i < MAX_KUBI -1))
                {
@@ -2167,6 +2179,40 @@ c_put_str(TERM_YELLOW, "Wanted monsters", 6, 10);
        }
 }
 
+
+/* List of prize object */
+static struct {
+       s16b tval;
+       s16b sval;
+} prize_list[MAX_KUBI] = 
+{
+       {TV_POTION, SV_POTION_CURING},
+       {TV_POTION, SV_POTION_SPEED},
+       {TV_POTION, SV_POTION_SPEED},
+       {TV_POTION, SV_POTION_RESISTANCE},
+       {TV_POTION, SV_POTION_ENLIGHTENMENT},
+
+       {TV_POTION, SV_POTION_HEALING},
+       {TV_POTION, SV_POTION_RESTORE_MANA},
+       {TV_SCROLL, SV_SCROLL_STAR_DESTRUCTION},
+       {TV_POTION, SV_POTION_STAR_ENLIGHTENMENT},
+       {TV_SCROLL, SV_SCROLL_SUMMON_PET},
+
+       {TV_SCROLL, SV_SCROLL_GENOCIDE},
+       {TV_POTION, SV_POTION_STAR_HEALING},
+       {TV_POTION, SV_POTION_STAR_HEALING},
+       {TV_POTION, SV_POTION_NEW_LIFE},
+       {TV_SCROLL, SV_SCROLL_MASS_GENOCIDE},
+
+       {TV_POTION, SV_POTION_LIFE},
+       {TV_POTION, SV_POTION_LIFE},
+       {TV_POTION, SV_POTION_AUGMENTATION},
+       {TV_POTION, SV_POTION_INVULNERABILITY},
+       {TV_SCROLL, SV_SCROLL_ARTIFACT},
+};
+
+
+/* Get prize */
 static bool kankin(void)
 {
        int i, j;
@@ -2174,13 +2220,16 @@ static bool kankin(void)
        char o_name[MAX_NLEN];
        object_type *o_ptr;
 
-       for (i = 0;i <= INVEN_LARM; i++)
+       /* Loop for inventory and right/left arm */
+       for (i = 0; i <= INVEN_LARM; i++)
        {
                o_ptr = &inventory[i];
+
+               /* Living Tsuchinoko worthes $1000000 */
                if ((o_ptr->tval == TV_CAPTURE) && (o_ptr->pval == MON_TSUCHINOKO))
                {
                        char buf[MAX_NLEN+20];
-                       object_desc(o_name, o_ptr, TRUE, 3);
+                       object_desc(o_name, o_ptr, 0);
 #ifdef JP
                        sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
 #else
@@ -2189,9 +2238,9 @@ static bool kankin(void)
                        if (get_check(buf))
                        {
 #ifdef JP
-                               msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", 1000000L * o_ptr->number);
+                               msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (long int)(1000000L * o_ptr->number));
 #else
-                               msg_format("You get %ldgp.", 1000000L * o_ptr->number);
+                               msg_format("You get %ldgp.", (long int)(1000000L * o_ptr->number));
 #endif
                                p_ptr->au += 1000000L * o_ptr->number;
                                p_ptr->redraw |= (PR_GOLD);
@@ -2202,13 +2251,16 @@ static bool kankin(void)
                        change = TRUE;
                }
        }
-       for (i = 0;i <= INVEN_LARM; i++)
+
+       for (i = 0; i < INVEN_PACK; i++)
        {
                o_ptr = &inventory[i];
+
+               /* Corpse of Tsuchinoko worthes $200000 */
                if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == MON_TSUCHINOKO))
                {
                        char buf[MAX_NLEN+20];
-                       object_desc(o_name, o_ptr, TRUE, 3);
+                       object_desc(o_name, o_ptr, 0);
 #ifdef JP
                        sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
 #else
@@ -2217,9 +2269,9 @@ static bool kankin(void)
                        if (get_check(buf))
                        {
 #ifdef JP
-                               msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", 200000L * o_ptr->number);
+                               msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (long int)(200000L * o_ptr->number));
 #else
-                               msg_format("You get %ldgp.", 200000L * o_ptr->number);
+                               msg_format("You get %ldgp.", (long int)(200000L * o_ptr->number));
 #endif
                                p_ptr->au += 200000L * o_ptr->number;
                                p_ptr->redraw |= (PR_GOLD);
@@ -2230,13 +2282,16 @@ static bool kankin(void)
                        change = TRUE;
                }
        }
-       for (i = 0;i <= INVEN_LARM; i++)
+
+       for (i = 0; i < INVEN_PACK; i++)
        {
                o_ptr = &inventory[i];
+
+               /* Bones of Tsuchinoko worthes $100000 */
                if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (o_ptr->pval == MON_TSUCHINOKO))
                {
                        char buf[MAX_NLEN+20];
-                       object_desc(o_name, o_ptr, TRUE, 3);
+                       object_desc(o_name, o_ptr, 0);
 #ifdef JP
                        sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
 #else
@@ -2245,9 +2300,9 @@ static bool kankin(void)
                        if (get_check(buf))
                        {
 #ifdef JP
-                               msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", 100000L * o_ptr->number);
+                               msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (long int)(100000L * o_ptr->number));
 #else
-                               msg_format("You get %ldgp.", 100000L * o_ptr->number);
+                               msg_format("You get %ldgp.", (long int)(100000L * o_ptr->number));
 #endif
                                p_ptr->au += 100000L * o_ptr->number;
                                p_ptr->redraw |= (PR_GOLD);
@@ -2259,13 +2314,13 @@ static bool kankin(void)
                }
        }
 
-       for (i = 0;i <= INVEN_LARM; i++)
+       for (i = 0; i < INVEN_PACK; i++)
        {
                o_ptr = &inventory[i];
-               if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == today_mon))
+               if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name)))
                {
                        char buf[MAX_NLEN+20];
-                       object_desc(o_name, o_ptr, TRUE, 3);
+                       object_desc(o_name, o_ptr, 0);
 #ifdef JP
                        sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
 #else
@@ -2274,9 +2329,9 @@ static bool kankin(void)
                        if (get_check(buf))
                        {
 #ifdef JP
-                               msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[today_mon].level * 50 + 100) * o_ptr->number);
+                               msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (long int)((r_info[today_mon].level * 50 + 100) * o_ptr->number));
 #else
-                               msg_format("You get %ldgp.", (r_info[today_mon].level * 50 + 100) * o_ptr->number);
+                               msg_format("You get %ldgp.", (long int)((r_info[today_mon].level * 50 + 100) * o_ptr->number));
 #endif
                                p_ptr->au += (r_info[today_mon].level * 50 + 100) * o_ptr->number;
                                p_ptr->redraw |= (PR_GOLD);
@@ -2287,13 +2342,15 @@ static bool kankin(void)
                        change = TRUE;
                }
        }
-       for (i = 0;i <= INVEN_LARM; i++)
+
+       for (i = 0; i < INVEN_PACK; i++)
        {
                o_ptr = &inventory[i];
-               if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (o_ptr->pval == today_mon))
+
+               if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name)))
                {
                        char buf[MAX_NLEN+20];
-                       object_desc(o_name, o_ptr, TRUE, 3);
+                       object_desc(o_name, o_ptr, 0);
 #ifdef JP
                        sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
 #else
@@ -2302,9 +2359,9 @@ static bool kankin(void)
                        if (get_check(buf))
                        {
 #ifdef JP
-                               msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[today_mon].level * 30 + 60) * o_ptr->number);
+                               msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (long int)((r_info[today_mon].level * 30 + 60) * o_ptr->number));
 #else
-                               msg_format("You get %ldgp.", (r_info[today_mon].level * 30 + 60) * o_ptr->number);
+                               msg_format("You get %ldgp.", (long int)((r_info[today_mon].level * 30 + 60) * o_ptr->number));
 #endif
                                p_ptr->au += (r_info[today_mon].level * 30 + 60) * o_ptr->number;
                                p_ptr->redraw |= (PR_GOLD);
@@ -2318,33 +2375,90 @@ static bool kankin(void)
 
        for (j = 0; j < MAX_KUBI; j++)
        {
-               for (i = 0;i <= INVEN_LARM; i++)
+               /* Need reverse order --- Positions will be changed in the loop */
+               for (i = INVEN_PACK-1; i >= 0; i--)
                {
                        o_ptr = &inventory[i];
-                       if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == kubi_r_idx[j]))
+                       if ((o_ptr->tval == TV_CORPSE) && (o_ptr->pval == kubi_r_idx[j]))
                        {
                                char buf[MAX_NLEN+20];
-                               object_desc(o_name, o_ptr, TRUE, 3);
+                               int num, k, item_new;
+                               object_type forge;
+
+                               object_desc(o_name, o_ptr, 0);
 #ifdef JP
-                               sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
+                               sprintf(buf, "%s¤òÅϤ·¤Þ¤¹¤«¡©",o_name);
 #else
-                               sprintf(buf, "Convert %s into money? ",o_name);
+                               sprintf(buf, "Hand %s over? ",o_name);
 #endif
-                               if (get_check(buf))
-                               {
+                               if (!get_check(buf)) continue;
+
+#if 0 /* Obsoleted */
 #ifdef JP
-                                       msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
+                               msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
 #else
-                                       msg_format("You get %ldgp.", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
+                               msg_format("You get %ldgp.", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
 #endif
-                                       p_ptr->au += (r_info[kubi_r_idx[j]].level+1) * 300 * o_ptr->number;
-                                       p_ptr->redraw |= (PR_GOLD);
-                                       inven_item_increase(i, -o_ptr->number);
-                                       inven_item_describe(i);
-                                       inven_item_optimize(i);
-                                       chg_virtue(V_JUSTICE, 5);
-                                       kubi_r_idx[j] += 10000;
+                               p_ptr->au += (r_info[kubi_r_idx[j]].level+1) * 300 * o_ptr->number;
+                               p_ptr->redraw |= (PR_GOLD);
+                               inven_item_increase(i, -o_ptr->number);
+                               inven_item_describe(i);
+                               inven_item_optimize(i);
+                               chg_virtue(V_JUSTICE, 5);
+                               kubi_r_idx[j] += 10000;
+
+                               change = TRUE;
+#endif /* Obsoleted */
+
+                               /* Hand it first */
+                               inven_item_increase(i, -o_ptr->number);
+                               inven_item_describe(i);
+                               inven_item_optimize(i);
+
+                               chg_virtue(V_JUSTICE, 5);
+                               kubi_r_idx[j] += 10000;
+
+                               /* Count number of unique corpses already handed */
+                               for (num = 0, k = 0; k < MAX_KUBI; k++)
+                               {
+                                       if (kubi_r_idx[k] >= 10000) num++;
                                }
+
+#ifdef JP
+                               msg_format("¤³¤ì¤Ç¹ç·× %d ¥Ý¥¤¥ó¥È³ÍÆÀ¤·¤Þ¤·¤¿¡£", num);
+#else
+                               msg_format("You earned %d point%s total.", num, (num > 1 ? "s" : ""));
+#endif
+
+                               /* Prepare to make a prize */
+                               object_prep(&forge, lookup_kind(prize_list[num-1].tval, prize_list[num-1].sval));
+                               apply_magic(&forge, object_level, AM_NO_FIXED_ART);
+
+                               /* Identify it fully */
+                               object_aware(&forge);
+                               object_known(&forge);
+
+                               /*
+                                * Hand it --- Assume there is an empty slot.
+                                * Since a corpse is handed at first,
+                                * there is at least one empty slot.
+                                */
+                               item_new = inven_carry(&forge);
+
+                               /* Describe the object */
+                               object_desc(o_name, &forge, 0);
+#ifdef JP
+                               msg_format("%s(%c)¤òÌã¤Ã¤¿¡£", o_name, index_to_label(item_new));
+#else
+                               msg_format("You get %s (%c). ", o_name, index_to_label(item_new));
+#endif
+
+                               /* Auto-inscription */
+                               autopick_alter_item(item_new, FALSE);
+
+                               /* Handle stuff */
+                               handle_stuff();
+
                                change = TRUE;
                        }
                }
@@ -2381,49 +2495,33 @@ bool get_nightmare(int r_idx)
 void have_nightmare(int r_idx)
 {
        bool happened = FALSE;
-
-       int power = 100;
-
        monster_race *r_ptr = &r_info[r_idx];
-
+       int power = r_ptr->level + 10;
        char m_name[80];
        cptr desc = r_name + r_ptr->name;
 
-
-       power = r_ptr->level + 10;
-
-#ifdef JP
-        if (0)
-#else
+       /* Describe it */
+#ifndef JP
        if (!(r_ptr->flags1 & RF1_UNIQUE))
-#endif
-
-       {
-               /* Describe it */
                sprintf(m_name, "%s %s", (is_a_vowel(desc[0]) ? "an" : "a"), desc);
-
-               if (r_ptr->flags1 & RF1_FRIENDS)
-               {
-                       power /= 2;
-               }
-       }
        else
-       {
-               /* Describe it */
+#endif
                sprintf(m_name, "%s", desc);
 
-               power *= 2;
+       if (!(r_ptr->flags1 & RF1_UNIQUE))
+       {
+               if (r_ptr->flags1 & RF1_FRIENDS) power /= 2;
        }
+       else power *= 2;
 
        if (saving_throw(p_ptr->skill_sav * 100 / power))
        {
 #ifdef JP
-       msg_format("Ì´¤ÎÃæ¤Ç%s¤ËÄɤ¤¤«¤±¤é¤ì¤¿¡£", m_name);
+               msg_format("Ì´¤ÎÃæ¤Ç%s¤ËÄɤ¤¤«¤±¤é¤ì¤¿¡£", m_name);
 #else
-       msg_format("%^s chases you through your dreams.", m_name);
+               msg_format("%^s chases you through your dreams.", m_name);
 #endif
 
-
                /* Safe */
                return;
        }
@@ -2432,7 +2530,7 @@ void have_nightmare(int r_idx)
        {
                /* Something silly happens... */
 #ifdef JP
-msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª",
+               msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª",
 #else
                msg_format("You behold the %s visage of %s!",
 #endif
@@ -2451,7 +2549,7 @@ msg_format("%s%s
 
        /* Something frightening happens... */
 #ifdef JP
-msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª",
+       msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª",
 #else
        msg_format("You behold the %s visage of %s!",
 #endif
@@ -2460,19 +2558,33 @@ msg_format("%s%s
 
        r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR;
 
-       switch(p_ptr->prace)
+       if (!p_ptr->mimic_form)
        {
-               /* Imps may make a saving throw */
+               switch (p_ptr->prace)
+               {
+               /* Demons may make a saving throw */
                case RACE_IMP:
                case RACE_DEMON:
-               {
                        if (saving_throw(20 + p_ptr->lev)) return;
-               }
+                       break;
                /* Undead may make a saving throw */
                case RACE_SKELETON:
                case RACE_ZOMBIE:
                case RACE_SPECTRE:
                case RACE_VAMPIRE:
+                       if (saving_throw(10 + p_ptr->lev)) return;
+                       break;
+               }
+       }
+       else
+       {
+               /* Demons may make a saving throw */
+               if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON)
+               {
+                       if (saving_throw(20 + p_ptr->lev)) return;
+               }
+               /* Undead may make a saving throw */
+               else if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_UNDEAD)
                {
                        if (saving_throw(10 + p_ptr->lev)) return;
                }
@@ -2668,11 +2780,19 @@ msg_print("
  */
 static bool inn_comm(int cmd)
 {
-       int dawnval;
-
        switch (cmd)
        {
                case BACT_FOOD: /* Buy food & drink */
+                       if (p_ptr->food >= PY_FOOD_FULL)
+                       {
+#ifdef JP
+                               msg_print("º£¤ÏËþÊ¢¤À¡£");
+#else
+                               msg_print("You are full now.");
+#endif
+                               return FALSE;
+                       }
+
 #ifdef JP
 msg_print("¥Ð¡¼¥Æ¥ó¤Ï¤¤¤¯¤é¤«¤Î¿©¤Ùʪ¤È¥Ó¡¼¥ë¤ò¤¯¤ì¤¿¡£");
 #else
@@ -2683,121 +2803,119 @@ msg_print("
                        break;
 
                case BACT_REST: /* Rest for the night */
-                       dawnval = ((turn % (TURNS_PER_TICK * TOWN_DAWN)));
-                       if (dawnval > (TURNS_PER_TICK * TOWN_DAWN)/4)
-                       {  /* nighttime */
-                               if ((p_ptr->poisoned) || (p_ptr->cut))
-                               {
+                       if ((p_ptr->poisoned) || (p_ptr->cut))
+                       {
 #ifdef JP
-msg_print("¤¢¤Ê¤¿¤ËɬÍפʤΤÏÉô²°¤Ç¤Ï¤Ê¤¯¡¢¼£ÎżԤǤ¹¡£");
+                               msg_print("¤¢¤Ê¤¿¤ËɬÍפʤΤÏÉô²°¤Ç¤Ï¤Ê¤¯¡¢¼£ÎżԤǤ¹¡£");
 #else
-                                       msg_print("You need a healer, not a room.");
+                               msg_print("You need a healer, not a room.");
 #endif
 
-                                       msg_print(NULL);
+                               msg_print(NULL);
 #ifdef JP
-msg_print("¤¹¤ß¤Þ¤»¤ó¡¢¤Ç¤â¤¦¤Á¤Ç狼¤Ë»à¤Ê¤ì¤Á¤ãº¤¤ê¤Þ¤¹¤ó¤Ç¡£");
+                               msg_print("¤¹¤ß¤Þ¤»¤ó¡¢¤Ç¤â¤¦¤Á¤Ç狼¤Ë»à¤Ê¤ì¤Á¤ãº¤¤ê¤Þ¤¹¤ó¤Ç¡£");
 #else
-                                       msg_print("Sorry, but don't want anyone dying in here.");
+                               msg_print("Sorry, but don't want anyone dying in here.");
 #endif
+                       }
+                       else
+                       {
+                               s32b oldturn = turn;
+                               int prev_day, prev_hour, prev_min;
 
-                               }
-                               else
-                               {
-                                       int oldturn = turn;
+                               extract_day_hour_min(&prev_day, &prev_hour, &prev_min);
 #ifdef JP
-                                       do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "½É²°¤ËÇñ¤Þ¤Ã¤¿¡£");
+                               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "½É²°¤ËÇñ¤Þ¤Ã¤¿¡£");
 #else
-                                       do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "stay over night at the inn");
+                               if ((prev_hour >= 6) && (prev_hour <= 17)) do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "stay over daytime at the inn.");
+                               else do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "stay over night at the inn.");
 #endif
-                                       turn = (turn / (TURNS_PER_TICK*TOWN_DAWN/2) + 1) * (TURNS_PER_TICK*TOWN_DAWN/2);
-                                       if (((oldturn + TURNS_PER_TICK * TOWN_DAWN / 4) % (TURNS_PER_TICK * TOWN_DAWN)) > TURNS_PER_TICK * TOWN_DAWN/4) do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL);
-                                       p_ptr->chp = p_ptr->mhp;
+                               turn = (turn / (TURNS_PER_TICK*TOWN_DAWN/2) + 1) * (TURNS_PER_TICK*TOWN_DAWN/2);
+                               if (dungeon_turn < dungeon_turn_limit)
+                               {
+                                       dungeon_turn += MIN(turn - oldturn, TURNS_PER_TICK * 250);
+                                       if (dungeon_turn > dungeon_turn_limit) dungeon_turn = dungeon_turn_limit;
+                               }
 
-                                       dungeon_turn += MIN(turn - oldturn, TURNS_PER_TICK*250);
+                               prevent_turn_overflow();
 
-                                       if (ironman_nightmare)
-                                       {
+                               if ((prev_hour >= 18) && (prev_hour <= 23)) do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL);
+                               p_ptr->chp = p_ptr->mhp;
+
+                               if (ironman_nightmare)
+                               {
 #ifdef JP
-msg_print("̲¤ê¤Ë½¢¤¯¤È¶²¤í¤·¤¤¸÷·Ê¤¬¿´¤ò¤è¤®¤Ã¤¿¡£");
+                                       msg_print("̲¤ê¤Ë½¢¤¯¤È¶²¤í¤·¤¤¸÷·Ê¤¬¿´¤ò¤è¤®¤Ã¤¿¡£");
 #else
-                                               msg_print("Horrible visions flit through your mind as you sleep.");
+                                       msg_print("Horrible visions flit through your mind as you sleep.");
 #endif
 
+                                       /* Pick a nightmare */
+                                       get_mon_num_prep(get_nightmare, NULL);
 
-                                               /* Pick a nightmare */
-                                               get_mon_num_prep(get_nightmare, NULL);
-
-                                               /* Have some nightmares */
-                                               while(1)
-                                               {
-                                                       have_nightmare(get_mon_num(MAX_DEPTH));
+                                       /* Have some nightmares */
+                                       while(1)
+                                       {
+                                               have_nightmare(get_mon_num(MAX_DEPTH));
 
-                                                       if (!one_in_(3)) break;
-                                               }
+                                               if (!one_in_(3)) break;
+                                       }
 
-                                               /* Remove the monster restriction */
-                                               get_mon_num_prep(NULL, NULL);
+                                       /* Remove the monster restriction */
+                                       get_mon_num_prep(NULL, NULL);
 
 #ifdef JP
-msg_print("¤¢¤Ê¤¿¤ÏÀ䶫¤·¤ÆÌܤò³Ð¤Þ¤·¤¿¡£");
+                                       msg_print("¤¢¤Ê¤¿¤ÏÀ䶫¤·¤ÆÌܤò³Ð¤Þ¤·¤¿¡£");
+                                       do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "°­Ì´¤Ë¤¦¤Ê¤µ¤ì¤Æ¤è¤¯Ì²¤ì¤Ê¤«¤Ã¤¿¡£");
 #else
-                                               msg_print("You awake screaming.");
+                                       msg_print("You awake screaming.");
+                                       do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "be troubled by a nightmare.");
 #endif
+                               }
+                               else
+                               {
+                                       set_blind(0);
+                                       set_confused(0);
+                                       p_ptr->stun = 0;
+                                       p_ptr->chp = p_ptr->mhp;
+                                       p_ptr->csp = p_ptr->msp;
+                                       if (p_ptr->pclass == CLASS_MAGIC_EATER)
+                                       {
+                                               int i;
+                                               for (i = 0; i < 72; i++)
+                                               {
+                                                       p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*EATER_CHARGE;
+                                               }
+                                               for (; i < 108; i++)
+                                               {
+                                                       p_ptr->magic_num1[i] = 0;
+                                               }
+                                       }
 
+                                       if ((prev_hour >= 6) && (prev_hour <= 17))
+                                       {
 #ifdef JP
-                                               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "°­Ì´¤Ë¤¦¤Ê¤µ¤ì¤Æ¤è¤¯Ì²¤ì¤Ê¤«¤Ã¤¿¡£");
+                                               msg_print("¤¢¤Ê¤¿¤Ï¥ê¥Õ¥ì¥Ã¥·¥å¤·¤ÆÌܳФᡢͼÊý¤ò·Þ¤¨¤¿¡£");
+                                               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "ͼÊý¤ò·Þ¤¨¤¿¡£");
 #else
-                                               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "be troubled by a nightmare.");
+                                               msg_print("You awake refreshed for the evening.");
+                                               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "awake refreshed.");
 #endif
                                        }
                                        else
                                        {
-                                               set_blind(0);
-                                               set_confused(0);
-                                               p_ptr->stun = 0;
-                                               p_ptr->chp = p_ptr->mhp;
-                                               p_ptr->csp = p_ptr->msp;
-                                               if (p_ptr->pclass == CLASS_MAGIC_EATER)
-                                               {
-                                                       int i;
-                                                       for (i = 0; i < 72; i++)
-                                                       {
-                                                               p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*EATER_CHARGE;
-                                                       }
-                                                       for (; i < 108; i++)
-                                                       {
-                                                               p_ptr->magic_num1[i] = 0;
-                                                       }
-                                               }
-
 #ifdef JP
-msg_print("¤¢¤Ê¤¿¤Ï¥ê¥Õ¥ì¥Ã¥·¥å¤·¤ÆÌܳФᡢ¿·¤¿¤ÊÆü¤ò·Þ¤¨¤¿¡£");
+                                               msg_print("¤¢¤Ê¤¿¤Ï¥ê¥Õ¥ì¥Ã¥·¥å¤·¤ÆÌܳФᡢ¿·¤¿¤ÊÆü¤ò·Þ¤¨¤¿¡£");
+                                               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "¤¹¤¬¤¹¤¬¤·¤¤Ä«¤ò·Þ¤¨¤¿¡£");
 #else
                                                msg_print("You awake refreshed for the new day.");
-#endif
-
-#ifdef JP
-                                               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "¤¹¤¬¤¹¤¬¤·¤¤Ä«¤ò¤à¤«¤¨¤¿¡£");
-#else
                                                do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "awake refreshed.");
 #endif
                                        }
-
-                                       p_ptr->leftbldg = TRUE;
                                }
                        }
-                       else
-                       {
-#ifdef JP
-msg_print("Éô²°¤ÏÌë¤À¤±»ÈÍѲÄǽ¤Ç¤¹¡£");
-#else
-                               msg_print("The rooms are available only at night.");
-#endif
-
-                               return (FALSE);
-                       }
                        break;
+
                case BACT_RUMORS: /* Listen for rumors */
                        {
                                char Rumor[1024];
@@ -2818,22 +2936,6 @@ msg_print("
 
 
 /*
- * Share gold for thieves
- */
-static void share_gold(void)
-{
-       int i = (p_ptr->lev * 2) * 10;
-#ifdef JP
-msg_format("¡ð%d ¤ò¼ê¤ËÆþ¤ì¤¿¡£", i);
-#else
-       msg_format("You collect %d gold pieces", i);
-#endif
-
-       p_ptr->au += i;
-}
-
-
-/*
  * Display quest information
  */
 static void get_questinfo(int questnum)
@@ -2858,7 +2960,7 @@ static void get_questinfo(int questnum)
        /* Get the quest text */
        init_flags = INIT_SHOW_TEXT | INIT_ASSIGN;
 
-process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
+       process_dungeon_file("q_info.txt", 0, 0, 0, 0);
 
        /* Reset the old quest number */
        p_ptr->inside_quest = old_quest;
@@ -3032,11 +3134,15 @@ static void town_history(void)
  * the current +dam of the player.
  */
 static void compare_weapon_aux2(object_type *o_ptr, int numblows,
-                                int r, int c, int mult, cptr attr,
+                               int r, int c, int mult, cptr attr,
                                byte color)
 {
        char tmp_str[80];
 
+       /* Effective dices */
+       int eff_dd = o_ptr->dd + p_ptr->to_dd[0];
+       int eff_ds = o_ptr->ds + p_ptr->to_ds[0];
+
        /* Print the intro text */
        c_put_str(color, attr, r, c);
 
@@ -3047,8 +3153,8 @@ sprintf(tmp_str, "
        sprintf(tmp_str, "Attack: %d-%d damage",
 #endif
 
-           (numblows * (mult * o_ptr->dd /60 + o_ptr->to_d + p_ptr->to_d[0])),
-           (numblows * (mult * o_ptr->ds * o_ptr->dd /60 + o_ptr->to_d + p_ptr->to_d[0])));
+           (numblows * (mult * eff_dd / 60 + o_ptr->to_d + p_ptr->to_d[0])),
+           (numblows * (mult * eff_ds * eff_dd / 60 + o_ptr->to_d + p_ptr->to_d[0])));
 
        /* Print the damage */
        put_str(tmp_str, r, c + 8);
@@ -3066,45 +3172,45 @@ static void compare_weapon_aux1(object_type *o_ptr, int col, int r)
        int mult = 60;
        u32b flgs[TR_FLAG_SIZE];
        int blow = p_ptr->num_blow[0];
+       bool print_force_weapon = FALSE;
 
        /* Get the flags of the weapon */
        object_flags(o_ptr, flgs);
 
-       if (p_ptr->riding)
+       if ((p_ptr->pclass != CLASS_SAMURAI) && have_flag(flgs, TR_FORCE_WEAPON) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
        {
-               if ((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE)))
-                       mult = mult * (o_ptr->dd + 2) / o_ptr->dd;
+               mult = mult * 7 / 2;
+               print_force_weapon = TRUE;
        }
-       if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5))) mult = mult * 7 / 2;
 
        /* Print the relevant lines */
 #ifdef JP
-if (have_flag(flgs, TR_FORCE_WEAPON))     compare_weapon_aux2(o_ptr, blow, r++, col, 1*mult, "ÍýÎÏ:", TERM_L_BLUE);
-if (have_flag(flgs, TR_KILL_ANIMAL)) compare_weapon_aux2(o_ptr, blow, r++, col, 4*mult, "ưʪ:", TERM_YELLOW);
- else if (have_flag(flgs, TR_SLAY_ANIMAL)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "ưʪ:", TERM_YELLOW);
-if (have_flag(flgs, TR_KILL_EVIL))   compare_weapon_aux2(o_ptr, blow, r++, col, 7*mult/2, "¼Ù°­:", TERM_YELLOW);
- else if (have_flag(flgs, TR_SLAY_EVIL))   compare_weapon_aux2(o_ptr, blow, r++, col, 2*mult, "¼Ù°­:", TERM_YELLOW);
-if (have_flag(flgs, TR_KILL_HUMAN))   compare_weapon_aux2(o_ptr, blow, r++, col, 4*mult, "¿Í´Ö:", TERM_YELLOW);
- else if (have_flag(flgs, TR_SLAY_HUMAN))   compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "¿Í´Ö:", TERM_YELLOW);
-if (have_flag(flgs, TR_KILL_UNDEAD)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "ÉÔ»à:", TERM_YELLOW);
- else if (have_flag(flgs, TR_SLAY_UNDEAD)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "ÉÔ»à:", TERM_YELLOW);
-if (have_flag(flgs, TR_KILL_DEMON))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "°­Ëâ:", TERM_YELLOW);
- else if (have_flag(flgs, TR_SLAY_DEMON))  compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "°­Ëâ:", TERM_YELLOW);
-if (have_flag(flgs, TR_KILL_ORC))    compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "¥ª¡¼¥¯:", TERM_YELLOW);
- else if (have_flag(flgs, TR_SLAY_ORC))    compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "¥ª¡¼¥¯:", TERM_YELLOW);
-if (have_flag(flgs, TR_KILL_TROLL))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "¥È¥í¥ë:", TERM_YELLOW);
- else if (have_flag(flgs, TR_SLAY_TROLL))  compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "¥È¥í¥ë:", TERM_YELLOW);
-if (have_flag(flgs, TR_KILL_GIANT))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "µð¿Í:", TERM_YELLOW);
- else if (have_flag(flgs, TR_SLAY_GIANT))  compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "µð¿Í:", TERM_YELLOW);
-if (have_flag(flgs, TR_KILL_DRAGON)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "ε:", TERM_YELLOW);
-else if (have_flag(flgs, TR_SLAY_DRAGON)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "ε:", TERM_YELLOW);
-if (have_flag(flgs, TR_BRAND_ACID))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "»À°À­:", TERM_RED);
-if (have_flag(flgs, TR_BRAND_ELEC))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "ÅÅ°À­:", TERM_RED);
-if (have_flag(flgs, TR_BRAND_FIRE))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "±ê°À­:", TERM_RED);
-if (have_flag(flgs, TR_BRAND_COLD))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "Îä°À­:", TERM_RED);
-if (have_flag(flgs, TR_BRAND_POIS))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "ÆÇ°À­:", TERM_RED);
-#else
-       if (have_flag(flgs, TR_FORCE_WEAPON))     compare_weapon_aux2(o_ptr, blow, r++, col, 1*mult, "Force  :", TERM_L_BLUE);
+       if (print_force_weapon)     compare_weapon_aux2(o_ptr, blow, r++, col, 1*mult, "ÍýÎÏ:", TERM_L_BLUE);
+       if (have_flag(flgs, TR_KILL_ANIMAL)) compare_weapon_aux2(o_ptr, blow, r++, col, 4*mult, "ưʪ:", TERM_YELLOW);
       else if (have_flag(flgs, TR_SLAY_ANIMAL)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "ưʪ:", TERM_YELLOW);
+       if (have_flag(flgs, TR_KILL_EVIL))   compare_weapon_aux2(o_ptr, blow, r++, col, 7*mult/2, "¼Ù°­:", TERM_YELLOW);
       else if (have_flag(flgs, TR_SLAY_EVIL))   compare_weapon_aux2(o_ptr, blow, r++, col, 2*mult, "¼Ù°­:", TERM_YELLOW);
+       if (have_flag(flgs, TR_KILL_HUMAN))   compare_weapon_aux2(o_ptr, blow, r++, col, 4*mult, "¿Í´Ö:", TERM_YELLOW);
       else if (have_flag(flgs, TR_SLAY_HUMAN))   compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "¿Í´Ö:", TERM_YELLOW);
+       if (have_flag(flgs, TR_KILL_UNDEAD)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "ÉÔ»à:", TERM_YELLOW);
       else if (have_flag(flgs, TR_SLAY_UNDEAD)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "ÉÔ»à:", TERM_YELLOW);
+       if (have_flag(flgs, TR_KILL_DEMON))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "°­Ëâ:", TERM_YELLOW);
       else if (have_flag(flgs, TR_SLAY_DEMON))  compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "°­Ëâ:", TERM_YELLOW);
+       if (have_flag(flgs, TR_KILL_ORC))    compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "¥ª¡¼¥¯:", TERM_YELLOW);
       else if (have_flag(flgs, TR_SLAY_ORC))    compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "¥ª¡¼¥¯:", TERM_YELLOW);
+       if (have_flag(flgs, TR_KILL_TROLL))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "¥È¥í¥ë:", TERM_YELLOW);
       else if (have_flag(flgs, TR_SLAY_TROLL))  compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "¥È¥í¥ë:", TERM_YELLOW);
+       if (have_flag(flgs, TR_KILL_GIANT))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "µð¿Í:", TERM_YELLOW);
       else if (have_flag(flgs, TR_SLAY_GIANT))  compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "µð¿Í:", TERM_YELLOW);
+       if (have_flag(flgs, TR_KILL_DRAGON)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "ε:", TERM_YELLOW);
+       else if (have_flag(flgs, TR_SLAY_DRAGON)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "ε:", TERM_YELLOW);
+       if (have_flag(flgs, TR_BRAND_ACID))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "»À°À­:", TERM_RED);
+       if (have_flag(flgs, TR_BRAND_ELEC))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "ÅÅ°À­:", TERM_RED);
+       if (have_flag(flgs, TR_BRAND_FIRE))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "±ê°À­:", TERM_RED);
+       if (have_flag(flgs, TR_BRAND_COLD))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "Îä°À­:", TERM_RED);
+       if (have_flag(flgs, TR_BRAND_POIS))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "ÆÇ°À­:", TERM_RED);
+#else
+       if (print_force_weapon)     compare_weapon_aux2(o_ptr, blow, r++, col, 1*mult, "Force  :", TERM_L_BLUE);
        if (have_flag(flgs, TR_KILL_ANIMAL)) compare_weapon_aux2(o_ptr, blow, r++, col, 4*mult, "Animals:", TERM_YELLOW);
        else if (have_flag(flgs, TR_SLAY_ANIMAL)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "Animals:", TERM_YELLOW);
        if (have_flag(flgs, TR_KILL_EVIL))   compare_weapon_aux2(o_ptr, blow, r++, col, 7*mult/2, "Evil:", TERM_YELLOW);
@@ -3159,8 +3265,12 @@ static void list_weapon(object_type *o_ptr, int row, int col)
        char o_name[MAX_NLEN];
        char tmp_str[80];
 
+       /* Effective dices */
+       int eff_dd = o_ptr->dd + p_ptr->to_dd[0];
+       int eff_ds = o_ptr->ds + p_ptr->to_ds[0];
+
        /* Print the weapon name */
-       object_desc(o_name, o_ptr, TRUE, 0);
+       object_desc(o_name, o_ptr, OD_NAME_ONLY);
        c_put_str(TERM_YELLOW, o_name, row, col);
 
        /* Print the player's number of blows */
@@ -3204,8 +3314,8 @@ sprintf(tmp_str, "
        sprintf(tmp_str, "One Strike: %d-%d damage",
 #endif
 
-           o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0],
-           o_ptr->ds * o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]);
+           eff_dd + o_ptr->to_d + p_ptr->to_d[0],
+           eff_ds * eff_dd + o_ptr->to_d + p_ptr->to_d[0]);
        put_str(tmp_str, row+6, col+1);
 
        /* Damage for the complete attack (if all blows hit) */
@@ -3215,8 +3325,8 @@ sprintf(tmp_str, "
        sprintf(tmp_str, "One Attack: %d-%d damage",
 #endif
 
-           p_ptr->num_blow[0] * (o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]),
-           p_ptr->num_blow[0] * (o_ptr->ds * o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]));
+           p_ptr->num_blow[0] * (eff_dd + o_ptr->to_d + p_ptr->to_d[0]),
+           p_ptr->num_blow[0] * (eff_ds * eff_dd + o_ptr->to_d + p_ptr->to_d[0]));
        put_str(tmp_str, row+7, col+1);
 }
 
@@ -3277,6 +3387,7 @@ static bool compare_weapons(void)
        object_type *i_ptr;
        cptr q, s;
        int row = 2;
+       bool old_character_xtra = character_xtra;
 
        screen_save();
        /* Clear the screen */
@@ -3340,9 +3451,14 @@ s = "
        if (o1_ptr != i_ptr)
                object_copy(i_ptr, o1_ptr);
 
+       /* Hack -- prevent "icky" message */
+       character_xtra = TRUE;
+
        /* Get the new values */
        calc_bonuses();
 
+       character_xtra = old_character_xtra;
+
        /* List the new values */
        list_weapon(o1_ptr, row, 2);
        compare_weapon_aux1(o1_ptr, 2, row + 8);
@@ -3353,9 +3469,14 @@ s = "
        else
                object_copy(i_ptr, &orig_weapon);
 
+       /* Hack -- prevent "icky" message */
+       character_xtra = TRUE;
+
        /* Get the new values */
        calc_bonuses();
 
+       character_xtra = old_character_xtra;
+
        /* List the new values */
        list_weapon(o2_ptr, row, 40);
        compare_weapon_aux1(o2_ptr, 40, row + 8);
@@ -3389,6 +3510,109 @@ msg_print("
 
 
 /*
+ * Evaluate AC
+ *
+ * AC¤«¤é²óÈòΨ¡¢¥À¥á¡¼¥¸¸º¾¯Î¨¤ò·×»»¤·É½¼¨¤¹¤ë
+ * Calculate and display the dodge-rate and the protection-rate
+ * based on AC
+ */
+static bool eval_ac(int iAC)
+{
+#ifdef JP
+       const char memo[] =
+               "¥À¥á¡¼¥¸·Ú¸ºÎ¨¤È¤Ï¡¢Å¨¤Î¹¶·â¤¬Åö¤¿¤Ã¤¿»þ¤½¤Î¥À¥á¡¼¥¸¤ò\n"
+               "²¿¥Ñ¡¼¥»¥ó¥È·Ú¸º¤¹¤ë¤«¤ò¼¨¤·¤Þ¤¹¡£\n"
+               "¥À¥á¡¼¥¸·Ú¸º¤ÏÄ̾ï¤ÎľÀܹ¶·â(¼ïÎब¡Ö¹¶·â¤¹¤ë¡×¤È¡ÖÊ´ºÕ¤¹¤ë¡×¤Îʪ)\n"
+               "¤ËÂФ·¤Æ¤Î¤ß¸ú²Ì¤¬¤¢¤ê¤Þ¤¹¡£\n \n"
+               "Ũ¤Î¥ì¥Ù¥ë¤È¤Ï¡¢¤½¤ÎŨ¤¬Ä̾ﲿ³¬¤Ë¸½¤ì¤ë¤«¤ò¼¨¤·¤Þ¤¹¡£\n \n"
+               "²óÈòΨ¤ÏŨ¤ÎľÀܹ¶·â¤ò²¿¥Ñ¡¼¥»¥ó¥È¤Î³ÎΨ¤ÇÈò¤±¤ë¤«¤ò¼¨¤·¡¢\n"
+               "Ũ¤Î¥ì¥Ù¥ë¤È¤¢¤Ê¤¿¤ÎAC¤Ë¤è¤Ã¤Æ·èÄꤵ¤ì¤Þ¤¹¡£\n \n"
+               "¥À¥á¡¼¥¸´üÂÔÃͤȤϡ¢Å¨¤Î£±£°£°¥Ý¥¤¥ó¥È¤ÎÄ̾ﹶ·â¤ËÂФ·¡¢\n"
+               "²óÈòΨ¤È¥À¥á¡¼¥¸·Ú¸ºÎ¨¤ò¹Íθ¤·¤¿¥À¥á¡¼¥¸¤Î´üÂÔÃͤò¼¨¤·¤Þ¤¹¡£\n";
+#else
+       const char memo[] =
+               "'Protection Rate' means how much damage is reduced by your armor.\n"
+               "Note that the Protection rate is effective only against normal "
+               "'attack' and 'shatter' type melee attacks, "
+               "and has no effect against any other types such as 'poison'.\n \n"
+               "'Dodge Rate' indicates the success rate on dodging the "
+               "monster's melee attacks.  "
+               "It is depend on the level of the monster and your AC.\n \n"
+               "'Average Damage' indicates the expected amount of damage "
+               "when you are attacked by normal melee attacks with power=100.";
+#endif
+
+       int protection;
+       int col, row = 2;
+       int lvl;
+       char buf[80*20], *t;
+
+       /* AC lower than zero has no effect */
+       if (iAC < 0) iAC = 0;
+
+       /* ¥À¥á¡¼¥¸·Ú¸ºÎ¨¤ò·×»» */
+       protection = 100 * MIN(iAC, 150) / 250;
+
+       screen_save();
+       clear_bldg(0, 22);
+
+#ifdef JP
+       put_str(format("¤¢¤Ê¤¿¤Î¸½ºß¤ÎAC: %3d", iAC), row++, 0);
+       put_str(format("¥À¥á¡¼¥¸·Ú¸ºÎ¨  : %3d%%", protection), row++, 0);
+       row++;
+
+       put_str("Ũ¤Î¥ì¥Ù¥ë      :", row + 0, 0);
+       put_str("²óÈòΨ          :", row + 1, 0);
+       put_str("¥À¥á¡¼¥¸´üÂÔÃÍ  :", row + 2, 0);
+#else
+       put_str(format("Your current AC : %3d", iAC), row++, 0);
+       put_str(format("Protection rate : %3d%%", protection), row++, 0);
+       row++;
+
+       put_str("Level of Monster:", row + 0, 0);
+       put_str("Dodge Rate      :", row + 1, 0);
+       put_str("Average Damage  :", row + 2, 0);
+#endif
+    
+       for (col = 17 + 1, lvl = 0; lvl <= 100; lvl += 10, col += 5)
+       {
+               int quality = 60 + lvl * 3; /* attack quality with power 60 */
+               int dodge;   /* ²óÈòΨ(%) */
+               int average; /* ¥À¥á¡¼¥¸´üÂÔÃÍ */
+
+               put_str(format("%3d", lvl), row + 0, col);
+
+               /* ²óÈòΨ¤ò·×»» */
+               dodge = 5 + (MIN(100, 100 * (iAC * 3 / 4) / quality) * 9 + 5) / 10;
+               put_str(format("%3d%%", dodge), row + 1, col);
+
+               /* 100ÅÀ¤Î¹¶·â¤ËÂФ·¤Æ¤Î¥À¥á¡¼¥¸´üÂÔÃͤò·×»» */
+               average = (100 - dodge) * (100 - protection) / 100;
+               put_str(format("%3d", average), row + 2, col);
+       }
+
+       /* Display note */
+       roff_to_buf(memo, 70, buf, sizeof(buf));
+       for (t = buf; t[0]; t += strlen(t) + 1)
+               put_str(t, (row++) + 4, 4);
+
+#ifdef JP
+       prt("¸½ºß¤Î¤¢¤Ê¤¿¤ÎÁõÈ÷¤«¤é¤¹¤ë¤È¡¢¤¢¤Ê¤¿¤ÎËɸæÎϤÏ"
+                  "¤³¤ì¤¯¤é¤¤¤Ç¤¹:", 0, 0);
+#else
+       prt("Defense abilities from your current Armor Class are evaluated below.", 0, 0);
+#endif
+  
+       flush();
+       (void)inkey();
+       screen_load();
+
+       /* Done */
+       return (TRUE);
+}
+
+
+/*
  * Enchant item
  */
 static bool enchant_item(int cost, int to_hit, int to_dam, int to_ac)
@@ -3400,11 +3624,10 @@ static bool enchant_item(int cost, int to_hit, int to_dam, int to_ac)
        int         maxenchant = (p_ptr->lev / 5);
        char        tmp_str[MAX_NLEN];
 
-
        clear_bldg(4, 18);
 #ifdef JP
-prt(format("¸½ºß¤Î¤¢¤Ê¤¿¤Îµ»Î̤À¤È¡¢+%d ¤Þ¤Ç²þÎɤǤ­¤Þ¤¹¡£", maxenchant), 5, 0);
-prt(format(" ²þÎɤÎÎÁ¶â¤Ï°ì¸Ä¤Ë¤Ä¤­¡ð%d ¤Ç¤¹¡£", cost), 7, 0);
+       prt(format("¸½ºß¤Î¤¢¤Ê¤¿¤Îµ»Î̤À¤È¡¢+%d ¤Þ¤Ç²þÎɤǤ­¤Þ¤¹¡£", maxenchant), 5, 0);
+       prt(format(" ²þÎɤÎÎÁ¶â¤Ï°ì¸Ä¤Ë¤Ä¤­¡ð%d ¤Ç¤¹¡£", cost), 7, 0);
 #else
        prt(format("  Based on your skill, we can improve up to +%d.", maxenchant), 5, 0);
        prt(format("  The price for the service is %d gold per item.", cost), 7, 0);
@@ -3414,8 +3637,8 @@ prt(format(" 
 
        /* Get an item */
 #ifdef JP
-q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©";
-s = "²þÎɤǤ­¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£";
+       q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©";
+       s = "²þÎɤǤ­¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£";
 #else
        q = "Improve which item? ";
        s = "You have nothing to improve.";
@@ -3429,9 +3652,9 @@ s = "
        /* Check if the player has enough money */
        if (p_ptr->au < (cost * o_ptr->number))
        {
-               object_desc(tmp_str, o_ptr, TRUE, 0);
+               object_desc(tmp_str, o_ptr, OD_NAME_ONLY);
 #ifdef JP
-msg_format("%s¤ò²þÎɤ¹¤ë¤À¤±¤Î¥´¡¼¥ë¥É¤¬¤¢¤ê¤Þ¤»¤ó¡ª", tmp_str);
+               msg_format("%s¤ò²þÎɤ¹¤ë¤À¤±¤Î¥´¡¼¥ë¥É¤¬¤¢¤ê¤Þ¤»¤ó¡ª", tmp_str);
 #else
                msg_format("You do not have the gold to improve %s!", tmp_str);
 #endif
@@ -3486,21 +3709,20 @@ msg_format("%s
 
                /* Message */
 #ifdef JP
-msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
+               msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
 #else
                msg_print("The improvement failed.");
 #endif
 
-
                return (FALSE);
        }
        else
        {
-               object_desc(tmp_str, o_ptr, TRUE, 1);
+               object_desc(tmp_str, o_ptr, OD_NAME_AND_ENCHANT);
 #ifdef JP
-msg_format("¡ð%d ¤Ç%s¤ò²þÎɤ·¤Þ¤·¤¿¡£", cost * o_ptr->number, tmp_str );
+               msg_format("¡ð%d¤Ç%s¤Ë²þÎɤ·¤Þ¤·¤¿¡£", cost * o_ptr->number, tmp_str);
 #else
-               msg_format("Improved %s for %d gold.", tmp_str, cost * o_ptr->number);
+               msg_format("Improved into %s for %d gold.", tmp_str, cost * o_ptr->number);
 #endif
 
                /* Charge the money */
@@ -3579,7 +3801,7 @@ s = "
         * the level of the item or the number of charges.
         */
        /* The item must be "known" */
-       if (!object_known_p(o_ptr))
+       if (!object_is_known(o_ptr))
        {
 #ifdef JP
 msg_format("½¼Å¶¤¹¤ëÁ°¤Ë´ÕÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡ª");
@@ -3604,7 +3826,7 @@ get_check("
                        identify_item(o_ptr);
 
                        /* Description */
-                       object_desc(tmp_str, o_ptr, TRUE, 3);
+                       object_desc(tmp_str, o_ptr, 0);
 
 #ifdef JP
 msg_format("%s ¤Ç¤¹¡£", tmp_str);
@@ -3612,6 +3834,8 @@ msg_format("%s 
                        msg_format("You have: %s.", tmp_str);
 #endif
 
+                       /* Auto-inscription */
+                       autopick_alter_item(item, FALSE);
 
                        /* Update the gold display */
                        building_prt_gold();
@@ -3623,7 +3847,7 @@ msg_format("%s 
        }
 
        /* Extract the object "level" */
-       lev = get_object_level(o_ptr);
+       lev = k_info[o_ptr->k_idx].level;
 
        /* Price for a rod */
        if (o_ptr->tval == TV_ROD)
@@ -3649,7 +3873,7 @@ msg_format("
        else if (o_ptr->tval == TV_STAFF)
        {
                /* Price per charge ( = double the price paid by shopkeepers for the charge) */
-               price = (get_object_cost(o_ptr) / 10) * o_ptr->number;
+               price = (k_info[o_ptr->k_idx].cost / 10) * o_ptr->number;
 
                /* Pay at least 10 gold per charge */
                price = MAX(10, price);
@@ -3657,7 +3881,7 @@ msg_format("
        else
        {
                /* Price per charge ( = double the price paid by shopkeepers for the charge) */
-               price = (get_object_cost(o_ptr) / 10);
+               price = (k_info[o_ptr->k_idx].cost / 10);
 
                /* Pay at least 10 gold per charge */
                price = MAX(10, price);
@@ -3709,7 +3933,7 @@ msg_print("
        /* Check if the player has enough money */
        if (p_ptr->au < price)
        {
-               object_desc(tmp_str, o_ptr, TRUE, 0);
+               object_desc(tmp_str, o_ptr, OD_NAME_ONLY);
 #ifdef JP
 msg_format("%s¤òºÆ½¼Å¶¤¹¤ë¤Ë¤Ï¡ð%d É¬ÍפǤ¹¡ª", tmp_str,price );
 #else
@@ -3752,7 +3976,7 @@ charges = get_quantity(format("
                charges = get_quantity(format("Add how many charges for %d gold? ",
 #endif
 
-                             price), MIN(p_ptr->au / price, max_charges));
+                             price), MIN(p_ptr->au / price, max_charges));
 
                /* Do nothing */
                if (charges < 1) return;
@@ -3768,7 +3992,7 @@ charges = get_quantity(format("
        }
 
        /* Give feedback */
-       object_desc(tmp_str, o_ptr, TRUE, 3);
+       object_desc(tmp_str, o_ptr, 0);
 #ifdef JP
 msg_format("%s¤ò¡ð%d ¤ÇºÆ½¼Å¶¤·¤Þ¤·¤¿¡£", tmp_str, price);
 #else
@@ -3810,7 +4034,7 @@ static void building_recharge_all(void)
 
 
        /* Display some info */
-        msg_flag = FALSE;
+       msg_flag = FALSE;
        clear_bldg(4, 18);
 #ifdef JP
        prt("  ºÆ½¼Å¶¤ÎÈñÍѤϥ¢¥¤¥Æ¥à¤Î¼ïÎà¤Ë¤è¤ê¤Þ¤¹¡£", 6, 0);
@@ -3827,10 +4051,10 @@ static void building_recharge_all(void)
                if (o_ptr->tval < TV_STAFF || o_ptr->tval > TV_ROD) continue;
 
                /* need identified */
-               if (!object_known_p(o_ptr)) total_cost += 50;
+               if (!object_is_known(o_ptr)) total_cost += 50;
 
                /* Extract the object "level" */
-               lev = get_object_level(o_ptr);
+               lev = k_info[o_ptr->k_idx].level;
 
                k_ptr = &k_info[o_ptr->k_idx];
 
@@ -3842,7 +4066,7 @@ static void building_recharge_all(void)
 
                case TV_STAFF:
                        /* Price per charge ( = double the price paid by shopkeepers for the charge) */
-                       price = (get_object_cost(o_ptr) / 10) * o_ptr->number;
+                       price = (k_info[o_ptr->k_idx].cost / 10) * o_ptr->number;
 
                        /* Pay at least 10 gold per charge */
                        price = MAX(10, price);
@@ -3853,7 +4077,7 @@ static void building_recharge_all(void)
 
                case TV_WAND:
                        /* Price per charge ( = double the price paid by shopkeepers for the charge) */
-                       price = (get_object_cost(o_ptr) / 10);
+                       price = (k_info[o_ptr->k_idx].cost / 10);
 
                        /* Pay at least 10 gold per charge */
                        price = MAX(10, price);
@@ -3902,12 +4126,18 @@ static void building_recharge_all(void)
        {
                o_ptr = &inventory[i];
                k_ptr = &k_info[o_ptr->k_idx];
-                               
+
                /* skip non magic device */
                if (o_ptr->tval < TV_STAFF || o_ptr->tval > TV_ROD) continue;
 
                /* Identify it */
-               if (!object_known_p(o_ptr)) identify_item(o_ptr);
+               if (!object_is_known(o_ptr))
+               {
+                       identify_item(o_ptr);
+
+                       /* Auto-inscription */
+                       autopick_alter_item(i, FALSE);
+               }
 
                /* Recharge */
                switch (o_ptr->tval)
@@ -4034,7 +4264,7 @@ bool tele_town(void)
                        }
                }
        }
-       p_ptr->leftbldg = TRUE;
+
        p_ptr->leaving = TRUE;
        leave_bldg = TRUE;
        p_ptr->teleport_town = TRUE;
@@ -4044,6 +4274,306 @@ bool tele_town(void)
 
 
 /*
+ *  research_mon
+ *  -KMW-
+ */
+static bool research_mon(void)
+{
+       int i, n, r_idx;
+       char sym, query;
+       char buf[128];
+
+       bool notpicked;
+
+       bool recall = FALSE;
+
+       u16b why = 0;
+
+       u16b    *who;
+
+       /* XTRA HACK WHATSEARCH */
+       bool    all = FALSE;
+       bool    uniq = FALSE;
+       bool    norm = FALSE;
+       char temp[80] = "";
+
+       /* XTRA HACK REMEMBER_IDX */
+       static int old_sym = '\0';
+       static int old_i = 0;
+
+
+       /* Save the screen */
+       screen_save();
+
+       /* Get a character, or abort */
+#ifdef JP
+if (!get_com("¥â¥ó¥¹¥¿¡¼¤Îʸ»ú¤òÆþÎϤ·¤Æ²¼¤µ¤¤(µ­¹æ or ^AÁ´,^U¥æ,^NÈó¥æ,^M̾Á°):", &sym, FALSE)) 
+#else
+       if (!get_com("Enter character to be identified(^A:All,^U:Uniqs,^N:Non uniqs,^M:Name): ", &sym, FALSE))
+#endif
+
+       {
+               /* Restore */
+               screen_load();
+
+               return (FALSE);
+       }
+
+       /* Find that character info, and describe it */
+       for (i = 0; ident_info[i]; ++i)
+       {
+               if (sym == ident_info[i][0]) break;
+       }
+
+               /* XTRA HACK WHATSEARCH */
+       if (sym == KTRL('A'))
+       {
+               all = TRUE;
+#ifdef JP
+               strcpy(buf, "Á´¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È");
+#else
+               strcpy(buf, "Full monster list.");
+#endif
+       }
+       else if (sym == KTRL('U'))
+       {
+               all = uniq = TRUE;
+#ifdef JP
+               strcpy(buf, "¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È");
+#else
+               strcpy(buf, "Unique monster list.");
+#endif
+       }
+       else if (sym == KTRL('N'))
+       {
+               all = norm = TRUE;
+#ifdef JP
+               strcpy(buf, "¥æ¥Ë¡¼¥¯³°¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È");
+#else
+               strcpy(buf, "Non-unique monster list.");
+#endif
+       }
+       else if (sym == KTRL('M'))
+       {
+               all = TRUE;
+#ifdef JP
+               if (!get_string("̾Á°(±Ñ¸ì¤Î¾ì¹ç¾®Ê¸»ú¤Ç²Ä)",temp, 70))
+#else
+               if (!get_string("Enter name:",temp, 70))
+#endif
+               {
+                       temp[0]=0;
+
+                       /* Restore */
+                       screen_load();
+
+                       return FALSE;
+               }
+#ifdef JP
+               sprintf(buf, "̾Á°:%s¤Ë¥Þ¥Ã¥Á",temp);
+#else
+               sprintf(buf, "Monsters with a name \"%s\"",temp);
+#endif
+       }
+       else if (ident_info[i])
+       {
+               sprintf(buf, "%c - %s.", sym, ident_info[i] + 2);
+       }
+       else
+       {
+#ifdef JP
+sprintf(buf, "%c - %s", sym, "̵¸ú¤Êʸ»ú");
+#else
+               sprintf(buf, "%c - %s.", sym, "Unknown Symbol");
+#endif
+
+       }
+
+       /* Display the result */
+       prt(buf, 16, 10);
+
+
+       /* Allocate the "who" array */
+       C_MAKE(who, max_r_idx, u16b);
+
+       /* Collect matching monsters */
+       for (n = 0, i = 1; i < max_r_idx; i++)
+       {
+               monster_race *r_ptr = &r_info[i];
+
+               /* Empty monster */
+               if (!r_ptr->name) continue;
+
+               /* XTRA HACK WHATSEARCH */
+               /* Require non-unique monsters if needed */
+               if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue;
+
+               /* Require unique monsters if needed */
+               if (uniq && !(r_ptr->flags1 & (RF1_UNIQUE))) continue;
+
+               /* Ì¾Á°¸¡º÷ */
+               if (temp[0])
+               {
+                       int xx;
+                       char temp2[80];
+
+                       for (xx = 0; temp[xx] && xx < 80; xx++)
+                       {
+#ifdef JP
+                               if (iskanji(temp[xx]))
+                               {
+                                       xx++;
+                                       continue;
+                               }
+#endif
+                               if (isupper(temp[xx])) temp[xx] = tolower(temp[xx]);
+                       }
+  
+#ifdef JP
+                       strcpy(temp2, r_name + r_ptr->E_name);
+#else
+                       strcpy(temp2, r_name + r_ptr->name);
+#endif
+                       for (xx = 0; temp2[xx] && xx < 80; xx++)
+                               if (isupper(temp2[xx])) temp2[xx] = tolower(temp2[xx]);
+
+#ifdef JP
+                       if (my_strstr(temp2, temp) || my_strstr(r_name + r_ptr->name, temp))
+#else
+                       if (my_strstr(temp2, temp))
+#endif
+                               who[n++] = i;
+               }
+               else if (all || (r_ptr->d_char == sym)) who[n++] = i;
+       }
+
+       /* Nothing to recall */
+       if (!n)
+       {
+               /* Free the "who" array */
+               C_KILL(who, max_r_idx, u16b);
+
+               /* Restore */
+               screen_load();
+
+               return (FALSE);
+       }
+
+       /* Sort by level */
+       why = 2;
+       query = 'y';
+
+       /* Sort if needed */
+       if (why)
+       {
+               /* Select the sort method */
+               ang_sort_comp = ang_sort_comp_hook;
+               ang_sort_swap = ang_sort_swap_hook;
+
+               /* Sort the array */
+               ang_sort(who, &why, n);
+       }
+
+
+       /* Start at the end */
+       /* XTRA HACK REMEMBER_IDX */
+       if (old_sym == sym && old_i < n) i = old_i;
+       else i = n - 1;
+
+       notpicked = TRUE;
+
+       /* Scan the monster memory */
+       while (notpicked)
+       {
+               /* Extract a race */
+               r_idx = who[i];
+
+               /* Hack -- Begin the prompt */
+               roff_top(r_idx);
+
+               /* Hack -- Complete the prompt */
+#ifdef JP
+Term_addstr(-1, TERM_WHITE, " ['r'»×¤¤½Ð, ' '¤Ç³¹Ô, ESC]");
+#else
+               Term_addstr(-1, TERM_WHITE, " [(r)ecall, ESC, space to continue]");
+#endif
+
+
+               /* Interact */
+               while (1)
+               {
+                       /* Recall */
+                       if (recall)
+                       {
+                               /*** Recall on screen ***/
+
+                               /* Get maximal info about this monster */
+                               lore_do_probe(r_idx);
+
+                               /* Save this monster ID */
+                               monster_race_track(r_idx);
+
+                               /* Hack -- Handle stuff */
+                               handle_stuff();
+
+                               /* know every thing mode */
+                               screen_roff(r_idx, 0x01);
+                               notpicked = FALSE;
+
+                               /* XTRA HACK REMEMBER_IDX */
+                               old_sym = sym;
+                               old_i = i;
+                       }
+
+                       /* Command */
+                       query = inkey();
+
+                       /* Normal commands */
+                       if (query != 'r') break;
+
+                       /* Toggle recall */
+                       recall = !recall;
+               }
+
+               /* Stop scanning */
+               if (query == ESCAPE) break;
+
+               /* Move to "prev" monster */
+               if (query == '-')
+               {
+                       if (++i == n)
+                       {
+                               i = 0;
+                               if (!expand_list) break;
+                       }
+               }
+
+               /* Move to "next" monster */
+               else
+               {
+                       if (i-- == 0)
+                       {
+                               i = n - 1;
+                               if (!expand_list) break;
+                       }
+               }
+       }
+
+
+       /* Re-display the identity */
+       /* prt(buf, 5, 5);*/
+
+       /* Free the "who" array */
+       C_KILL(who, max_r_idx, u16b);
+
+       /* Restore */
+       screen_load();
+
+       return (!notpicked);
+}
+
+
+/*
  * Execute a building command
  */
 static void bldg_process_command(building_type *bldg, int i)
@@ -4051,7 +4581,6 @@ static void bldg_process_command(building_type *bldg, int i)
        int bact = bldg->actions[i];
        int bcost;
        bool paid = FALSE;
-       bool set_reward = FALSE;
        int amt;
 
        /* Flush messages XXX XXX XXX */
@@ -4088,12 +4617,10 @@ msg_print("
                return;
        }
 
-       if (!bcost) set_reward = TRUE;
-
        switch (bact)
        {
        case BACT_NOTHING:
-                               /* Do nothing */
+               /* Do nothing */
                break;
        case BACT_RESEARCH_ITEM:
                paid = identify_fully(FALSE);
@@ -4110,7 +4637,7 @@ msg_print("
        case BACT_KING_LEGENDS:
        case BACT_ARENA_LEGENDS:
        case BACT_LEGENDS:
-               show_highclass(building_loc);
+               show_highclass();
                break;
        case BACT_POSTER:
        case BACT_ARENA_RULES:
@@ -4137,11 +4664,11 @@ msg_print("
                paid = compare_weapons();
                break;
        case BACT_ENCHANT_WEAPON:
-               item_tester_hook = item_tester_hook_melee_weapon;
+               item_tester_hook = object_allow_enchant_melee_weapon;
                enchant_item(bcost, 1, 1, 0);
                break;
        case BACT_ENCHANT_ARMOR:
-               item_tester_hook = item_tester_hook_armour;
+               item_tester_hook = object_is_armour;
                enchant_item(bcost, 0, 0, 1);
                break;
        case BACT_RECHARGE:
@@ -4186,21 +4713,6 @@ msg_print("
                if (do_res_stat(A_CON)) paid = TRUE;
                if (do_res_stat(A_CHR)) paid = TRUE;
                break;
-       case BACT_GOLD: /* set timed reward flag */
-               if (!p_ptr->rewards[BACT_GOLD])
-               {
-                       share_gold();
-                       p_ptr->rewards[BACT_GOLD] = TRUE;
-               }
-               else
-               {
-#ifdef JP
-                       msg_print("º£Æü¤Îʬ¤±Á°¤Ï¤¹¤Ç¤Ë»Ùʧ¤Ã¤¿¤¾¡ª");
-#else
-                       msg_print("You just had your daily allowance!");
-#endif
-               }
-               break;
        case BACT_ENCHANT_ARROWS:
                item_tester_hook = item_tester_hook_ammo;
                enchant_item(bcost, 1, 1, 0);
@@ -4215,66 +4727,16 @@ msg_print("
        case BACT_TELEPORT_LEVEL:
        {
                int select_dungeon;
-               int i, num = 0;
-               s16b *dun;
                int max_depth;
 
-               /* Allocate the "dun" array */
-               C_MAKE(dun, max_d_idx, s16b);
-
-               screen_save();
                clear_bldg(4, 20);
-
-               for(i = 1; i < max_d_idx; i++)
-               {
-                       char buf[80];
-                       bool seiha = FALSE;
-
-                       if (!d_info[i].maxdepth) continue;
-                       if (!max_dlv[i]) continue;
-                       if (d_info[i].final_guardian)
-                       {
-                               if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
-                       }
-                       else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
-
-#ifdef JP
-                       sprintf(buf,"%c) %c%-12s : ºÇÂç %d ³¬", 'a'+num, seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
-#else
-                       sprintf(buf,"%c) %c%-12s : Max level %d", 'a'+num, seiha ? '!' : ' ', d_name + d_info[i].name, max_dlv[i]);
-#endif
-                       put_str(buf, 4+num, 5);
-                       dun[num] = i;
-                       num++;
-               }
 #ifdef JP
-               prt("¤É¤Î¥À¥ó¥¸¥ç¥ó¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«:", 0, 0);
+               select_dungeon = choose_dungeon("¤Ë¥Æ¥ì¥Ý¡¼¥È", 4, 0);
 #else
-               prt("Which dungeon do you teleport?: ", 0, 0);
+               select_dungeon = choose_dungeon("teleport", 4, 0);
 #endif
-               while(1)
-               {
-                       i = inkey();
-
-                       if (i == ESCAPE)
-                       {
-                               /* Free the "dun" array */
-                               C_KILL(dun, max_d_idx, s16b);
-
-                               screen_load();
-                               return;
-                       }
-                       if (i >= 'a' && i <('a'+num))
-                       {
-                               select_dungeon = dun[i-'a'];
-                               break;
-                       }
-                       else bell();
-               }
-               screen_load();
-
-               /* Free the "dun" array */
-               C_KILL(dun, max_d_idx, s16b);
+               show_building(bldg);
+               if (!select_dungeon) return;
 
                max_depth = d_info[select_dungeon].maxdepth;
 
@@ -4296,7 +4758,7 @@ msg_print("
                        p_ptr->word_recall = 1;
                        p_ptr->recall_dungeon = select_dungeon;
                        max_dlv[p_ptr->recall_dungeon] = ((amt > d_info[select_dungeon].maxdepth) ? d_info[select_dungeon].maxdepth : ((amt < d_info[select_dungeon].mindepth) ? d_info[select_dungeon].mindepth : amt));
-                       if (record_maxdeapth)
+                       if (record_maxdepth)
 #ifdef JP
                                do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, "¥È¥é¥ó¥×¥¿¥ï¡¼¤Ç");
 #else
@@ -4314,16 +4776,23 @@ msg_print("
                break;
        }
        case BACT_LOSE_MUTATION:
-               paid = lose_mutation(0);
-               /* ToDo: Better message text. */
-               if (!paid)
+               if (p_ptr->muta1 || p_ptr->muta2 ||
+                   (p_ptr->muta3 & ~MUT3_GOOD_LUCK) ||
+                   (p_ptr->pseikaku != SEIKAKU_LUCKY &&
+                    (p_ptr->muta3 & MUT3_GOOD_LUCK)))
+               {
+                       while(!lose_mutation(0));
+                       paid = TRUE;
+               }
+               else
+               {
 #ifdef JP
-                       msg_print("´ñ̯¤Ê¤¯¤é¤¤ÉáÄ̤ˤʤ俵¤¤¬¤¹¤ë¡£");
+                       msg_print("¼£¤¹¤Ù¤­ÆÍÁ³ÊÑ°Û¤¬Ìµ¤¤¡£");
 #else
-               msg_print("You feel oddly normal.");
+                       msg_print("You have no mutations.");
 #endif
-
-
+                       msg_print(NULL);
+               }
                break;
        case BACT_BATTLE:
                kakutoujou();
@@ -4370,6 +4839,9 @@ msg_print("
        case BACT_TELE_TOWN:
                paid = tele_town();
                break;
+       case BACT_EVAL_AC:
+               paid = eval_ac(p_ptr->dis_ac + p_ptr->dis_to_a);
+               break;
        }
 
        if (paid)
@@ -4386,7 +4858,7 @@ void do_cmd_quest(void)
 {
        energy_use = 100;
 
-       if (cave[py][px].feat != FEAT_QUEST_ENTER)
+       if (!cave_have_flag_bold(py, px, FF_QUEST_ENTER))
        {
 #ifdef JP
 msg_print("¤³¤³¤Ë¤Ï¥¯¥¨¥¹¥È¤ÎÆþ¸ý¤Ï¤Ê¤¤¡£");
@@ -4414,9 +4886,9 @@ msg_print("
 
                leave_quest_check();
 
+               if (quest[p_ptr->inside_quest].type != QUEST_TYPE_RANDOM) dun_level = 1;
                p_ptr->inside_quest = cave[py][px].special;
-               if(quest[leaving_quest].type != QUEST_TYPE_RANDOM) dun_level = 1;
-               p_ptr->leftbldg = TRUE;
+
                p_ptr->leaving = TRUE;
        }
 }
@@ -4435,11 +4907,10 @@ void do_cmd_bldg(void)
 
        energy_use = 100;
 
-       if (!((cave[py][px].feat >= FEAT_BLDG_HEAD) &&
-                 (cave[py][px].feat <= FEAT_BLDG_TAIL)))
+       if (!cave_have_flag_bold(py, px, FF_BLDG))
        {
 #ifdef JP
-msg_print("¤³¤³¤Ë¤Ï·úʪ¤Ï¤Ê¤¤¡£");
+               msg_print("¤³¤³¤Ë¤Ï·úʪ¤Ï¤Ê¤¤¡£");
 #else
                msg_print("You see no building here.");
 #endif
@@ -4447,42 +4918,64 @@ msg_print("
                return;
        }
 
-       which = (cave[py][px].feat - FEAT_BLDG_HEAD);
-       building_loc = which;
+       which = f_info[cave[py][px].feat].subtype;
 
        bldg = &building[which];
 
        /* Don't re-init the wilderness */
        reinit_wilderness = FALSE;
 
-       if ((which == 2) && (p_ptr->arena_number == 99))
+       if ((which == 2) && (p_ptr->arena_number < 0))
        {
 #ifdef JP
-msg_print("¡ÖÇÔ¼Ô¤ËÍѤϤʤ¤¡£¡×");
+               msg_print("¡ÖÇÔ¼Ô¤ËÍѤϤʤ¤¡£¡×");
 #else
                msg_print("'There's no place here for a LOSER like you!'");
 #endif
                return;
        }
-       else if ((which == 2) && p_ptr->inside_arena && !p_ptr->exit_bldg)
+       else if ((which == 2) && p_ptr->inside_arena)
        {
+               if (!p_ptr->exit_bldg)
+               {
 #ifdef JP
-prt("¥²¡¼¥È¤ÏÊĤޤäƤ¤¤ë¡£¥â¥ó¥¹¥¿¡¼¤¬¤¢¤Ê¤¿¤òÂԤäƤ¤¤ë¡ª",0,0);
+                       prt("¥²¡¼¥È¤ÏÊĤޤäƤ¤¤ë¡£¥â¥ó¥¹¥¿¡¼¤¬¤¢¤Ê¤¿¤òÂԤäƤ¤¤ë¡ª", 0, 0);
 #else
-               prt("The gates are closed.  The monster awaits!", 0, 0);
+                       prt("The gates are closed.  The monster awaits!", 0, 0);
 #endif
+               }
+               else
+               {
+                       /* Don't save the arena as saved floor */
+                       prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_NO_RETURN);
+
+                       p_ptr->inside_arena = FALSE;
+                       p_ptr->leaving = TRUE;
+
+                       /* Re-enter the arena */
+                       command_new = SPECIAL_KEY_BUILDING;
+
+                       /* No energy needed to re-enter the arena */
+                       energy_use = 0;
+               }
 
                return;
        }
-       else if ((which == 2) && p_ptr->inside_arena)
-       {
-               p_ptr->leaving = TRUE;
-               p_ptr->inside_arena = FALSE;
-       }
        else if (p_ptr->inside_battle)
        {
+               /* Don't save the arena as saved floor */
+               prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_NO_RETURN);
+
                p_ptr->leaving = TRUE;
                p_ptr->inside_battle = FALSE;
+
+               /* Re-enter the monster arena */
+               command_new = SPECIAL_KEY_BUILDING;
+
+               /* No energy needed to re-enter the arena */
+               energy_use = 0;
+
+               return;
        }
        else
        {
@@ -4551,7 +5044,9 @@ prt("
 
        /* Reinit wilderness to activate quests ... */
        if (reinit_wilderness)
+       {
                p_ptr->leaving = TRUE;
+       }
 
        /* Hack -- Decrease "icky" depth */
        character_icky--;
@@ -4628,26 +5123,26 @@ void quest_discovery(int q_idx)
        {
                /* Unique */
 
-                /* Hack -- "unique" monsters must be "unique" */
-                if ((r_ptr->flags1 & RF1_UNIQUE) &&
-                    (0 == r_ptr->max_num))
-                {
+               /* Hack -- "unique" monsters must be "unique" */
+               if ((r_ptr->flags1 & RF1_UNIQUE) &&
+                   (0 == r_ptr->max_num))
+               {
 #ifdef JP
-                        msg_print("¤³¤Î³¬¤Ï°ÊÁ°¤Ï狼¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤¿¤è¤¦¤À¡Ä¡£");
+                       msg_print("¤³¤Î³¬¤Ï°ÊÁ°¤Ï狼¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤¿¤è¤¦¤À¡Ä¡£");
 #else
-                        msg_print("It seems that this level was protected by someone before...");
+                       msg_print("It seems that this level was protected by someone before...");
 #endif
-                        /* The unique is already dead */
-                        quest[q_idx].status = QUEST_STATUS_FINISHED;
-                }
-                else
-                {
+                       /* The unique is already dead */
+                       quest[q_idx].status = QUEST_STATUS_FINISHED;
+               }
+               else
+               {
 #ifdef JP
-                        msg_format("Ãí°Õ¤»¤è¡ª¤³¤Î³¬¤Ï%s¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤ë¡ª", name);
+                       msg_format("Ãí°Õ¤»¤è¡ª¤³¤Î³¬¤Ï%s¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤ë¡ª", name);
 #else
-                        msg_format("Beware, this level is protected by %s!", name);
+                       msg_format("Beware, this level is protected by %s!", name);
 #endif
-                }
+               }
        }
        else
        {