OSDN Git Service

Add new option -- show_ammo_detail / show_ammo_no_crit
[hengband/hengband.git] / src / bldg.c
index 487e4f7..9be4995 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
 
                                }
@@ -284,11 +281,21 @@ msg_print("
 #else
                                        if (get_check("Do you fight? "))
 #endif
-                                       {
-                                               p_ptr->leftbldg = TRUE;
-                                               p_ptr->inside_arena = TRUE;
+                                       {       
+#ifdef JP
+                        msg_print("»à¤Ì¤¬¤è¤¤¡£");
+#else
+                                           msg_print("Die, maggots.");
+#endif
+                                               msg_print(NULL);
+                                       
                                                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 +331,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;
                        }
@@ -1267,9 +1277,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 +1310,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,32 +1334,23 @@ 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);
 
-                       /* Prevent savefile-scumming of the casino */
-/*                     Rand_quick = TRUE; */
-                       Rand_value = time(NULL);
-
                        do
                        {
-#ifdef JP /* Prevent random seed cracking of the casino */
-                               clock_t clk;
-                               clk = clock();
-                               Rand_value *= clk;
-#endif
                                p_ptr->au -= wager;
                                switch (cmd)
                                {
@@ -1603,9 +1604,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);
@@ -1635,9 +1636,6 @@ msg_print("
                                }
                        } while ((again == 'y') || (again == 'Y'));
 
-                       /* Switch back to complex RNG */
-                       Rand_quick = FALSE;
-
                        prt("", 18, 37);
                        if (p_ptr->au >= oldgold)
                        {
@@ -1957,9 +1955,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 +1997,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 +2030,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 +2052,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();
 
@@ -2222,7 +2224,7 @@ static bool kankin(void)
                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
@@ -2231,9 +2233,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);
@@ -2253,7 +2255,7 @@ static bool kankin(void)
                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
@@ -2262,9 +2264,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);
@@ -2284,7 +2286,7 @@ static bool kankin(void)
                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
@@ -2293,9 +2295,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);
@@ -2313,7 +2315,7 @@ static bool kankin(void)
                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
@@ -2322,9 +2324,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);
@@ -2343,7 +2345,7 @@ static bool kankin(void)
                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
@@ -2352,9 +2354,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);
@@ -2375,10 +2377,10 @@ static bool kankin(void)
                        if ((o_ptr->tval == TV_CORPSE) && (o_ptr->pval == kubi_r_idx[j]))
                        {
                                char buf[MAX_NLEN+20];
-                               int num, k;
+                               int num, k, item_new;
                                object_type forge;
 
-                               object_desc(o_name, o_ptr, TRUE, 3);
+                               object_desc(o_name, o_ptr, 0);
 #ifdef JP
                                sprintf(buf, "%s¤òÅϤ·¤Þ¤¹¤«¡©",o_name);
 #else
@@ -2386,7 +2388,7 @@ static bool kankin(void)
 #endif
                                if (!get_check(buf)) continue;
 
-#if 0 /* Obsorated */
+#if 0 /* Obsoleted */
 #ifdef JP
                                msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
 #else
@@ -2401,7 +2403,7 @@ static bool kankin(void)
                                kubi_r_idx[j] += 10000;
 
                                change = TRUE;
-#endif /* Obsorated */
+#endif /* Obsoleted */
 
                                /* Hand it first */
                                inven_item_increase(i, -o_ptr->number);
@@ -2436,16 +2438,22 @@ static bool kankin(void)
                                 * Since a corpse is handed at first,
                                 * there is at least one empty slot.
                                 */
-                               (void)inven_carry(&forge);
+                               item_new = inven_carry(&forge);
 
                                /* Describe the object */
-                               object_desc(o_name, &forge, TRUE, 3);
+                               object_desc(o_name, &forge, 0);
 #ifdef JP
-                               msg_format("%s ¤òÌã¤Ã¤¿¡£",o_name);
+                               msg_format("%s(%c)¤òÌã¤Ã¤¿¡£", o_name, index_to_label(item_new));
 #else
-                               msg_format("You get %s. ",o_name);
+                               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;
                        }
                }
@@ -2767,8 +2775,6 @@ msg_print("
  */
 static bool inn_comm(int cmd)
 {
-       int dawnval;
-
        switch (cmd)
        {
                case BACT_FOOD: /* Buy food & drink */
@@ -2792,132 +2798,122 @@ 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];
-
-#ifdef JP
-                               if (!get_rnd_line_jonly("rumors_j.txt", 0, Rumor, 10))
-#else
-                               if (!get_rnd_line("rumors.txt", 0, Rumor))
-#endif
-
-                                       msg_format("%s", Rumor);
+                               display_rumor(TRUE);
                                break;
                        }
        }
@@ -2927,25 +2923,9 @@ 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)
+static void get_questinfo(int questnum, bool do_init)
 {
        int     i;
        int     old_quest;
@@ -2965,7 +2945,8 @@ static void get_questinfo(int questnum)
        p_ptr->inside_quest = questnum;
 
        /* Get the quest text */
-       init_flags = INIT_SHOW_TEXT | INIT_ASSIGN;
+       init_flags = INIT_SHOW_TEXT;
+       if (do_init) init_flags |= INIT_ASSIGN;
 
        process_dungeon_file("q_info.txt", 0, 0, 0, 0);
 
@@ -3026,14 +3007,14 @@ put_str("
                /* Rewarded quest */
                q_ptr->status = QUEST_STATUS_REWARDED;
 
-               get_questinfo(q_index);
+               get_questinfo(q_index, FALSE);
 
                reinit_wilderness = TRUE;
        }
        /* Failed quest */
        else if (q_ptr->status == QUEST_STATUS_FAILED)
        {
-               get_questinfo(q_index);
+               get_questinfo(q_index, FALSE);
 
                /* Mark quest as done (but failed) */
                q_ptr->status = QUEST_STATUS_FAILED_DONE;
@@ -3106,7 +3087,7 @@ msg_format("
                }
                else
                {
-                       get_questinfo(q_index);
+                       get_questinfo(q_index, TRUE);
                }
        }
 }
@@ -3132,6 +3113,106 @@ static void town_history(void)
        screen_load();
 }
 
+s16b calc_expect_crit_shot(int weight, int plus_ammo, int plus_bow,  int dam)
+{
+       u32b num;
+       int i, k, crit;
+
+       /* Extract "shot" power */
+       i = p_ptr->to_h_b * 4 + plus_ammo + (p_ptr->lev * 2);
+       
+       /* Snipers can shot more critically with crossbows */
+       if (p_ptr->concent) i += ((i * p_ptr->concent) / 5);
+       if ((p_ptr->pclass == CLASS_SNIPER) && (p_ptr->tval_ammo == TV_BOLT)) i *= 2;
+       
+       /* Good bow makes more critical */
+       i += MAX(0, plus_bow - 15) * 4 * (p_ptr->concent ? p_ptr->concent + 5 : 5);
+       
+       if (i < 0) i = 0;
+       
+       k = 0;
+       num = 0;
+       
+       crit = MIN(500, 900/weight);
+       num += dam * 3 /2 * crit;
+       k = crit;
+       
+       crit = MIN(500, 1350/weight);
+       crit -= k;
+       num += dam * 2 * crit;
+       k += crit;
+       
+       if(k < 500)
+       {
+               crit = 500 - k;
+               num += dam * 3 * crit;
+       }
+       
+       num /= 500;
+       
+       num *= i;
+       num += (5000 - i) * dam;
+       num /= 5000;
+       
+       return num;
+}
+
+s16b calc_expect_crit(int weight, int plus, int dam, s16b meichuu, bool dokubari)
+{
+       u32b k, num;
+       int i;
+       
+       if(dokubari) return dam;
+       
+       i = weight + (meichuu * 3 + plus * 5) + (p_ptr->lev * 3);
+       if (i < 0) i = 0;
+       
+       k = weight;
+       num = 0;
+       
+       if (k < 400)                                            num += (2 * dam + 5) * (400 - k);
+       if (k < 700)                                            num += (2 * dam + 10) * (MIN(700, k + 650) - MAX(400, k));
+       if (k > (700 - 650) && k < 900)         num += (3 * dam + 15) * (MIN(900, k + 650) - MAX(700, k));
+       if (k > (900 - 650) && k < 1300)                num += (3 * dam + 20) * (MIN(1300, k + 650) - MAX(900, k));
+       if (k > (1300 - 650))                                   num += (7 * dam / 2 + 25) * MIN(650, k - (1300 - 650));
+       
+       num /= 650;
+       if(p_ptr->pclass == CLASS_NINJA)
+       {
+               num *= i;
+               num += (4444 - i) * dam;
+               num /= 4444;
+       }
+       else
+       {
+               num *= i;
+               num += (5000 - i) * dam;
+               num /= 5000;
+       }
+       
+       return num;
+}
+
+static s16b calc_slaydam(int dam, int mult, int div, bool force)
+{
+       int tmp;
+       if(force)
+       {
+               tmp = dam * 60;
+               tmp *= mult * 3;
+               tmp /= div * 2;
+               tmp += dam * 60 * 2;
+               tmp /= 60;
+       }
+       else
+       {
+               tmp = dam * 60;
+               tmp *= mult; 
+               tmp /= div;
+               tmp /= 60;
+       }
+       return tmp;
+}
 
 /*
  * Display the damage figure of an object
@@ -3140,29 +3221,22 @@ static void town_history(void)
  * Only accurate for the current weapon, because it includes
  * 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,
-                               byte color)
+static void compare_weapon_aux2(int r, int c, int mindam, int maxdam, 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);
 
        /* Calculate the min and max damage figures */
 #ifdef JP
-sprintf(tmp_str, "£±¥¿¡¼¥ó: %d-%d ¥À¥á¡¼¥¸",
+       sprintf(tmp_str, "£±¥¿¡¼¥ó: %d-%d ¥À¥á¡¼¥¸",
 #else
        sprintf(tmp_str, "Attack: %d-%d damage",
 #endif
-
-           (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])));
-
+                       mindam, maxdam);
+       
        /* Print the damage */
        put_str(tmp_str, r, c + 8);
 }
@@ -3176,73 +3250,556 @@ sprintf(tmp_str, "
  */
 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;
+       bool force = FALSE;
+       bool dokubari = FALSE;
+       
+       /* Effective dices */
+       int eff_dd = o_ptr->dd + p_ptr->to_dd[0];
+       int eff_ds = o_ptr->ds + p_ptr->to_ds[0];
+       
+       int mindice = eff_dd;
+       int maxdice = eff_ds * eff_dd;
+       int mindam = 0;
+       int maxdam = 0;
+       int slaydice_min = 0;
+       int slaydice_max = 0;
+       int critdice_min = 0;
+       int critdice_max = 0;
+       int vorpal_mult = 1;
+       int vorpal_div = 1;
+       
 
        /* Get the flags of the weapon */
        object_flags(o_ptr, flgs);
-
+       
+       if((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) dokubari = TRUE;
+       
+       
+       /* Show Critical Damage*/
+       critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, mindice, p_ptr->to_h[0], dokubari);
+       critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, maxdice, p_ptr->to_h[0], dokubari);
+       
+       mindam = blow * (critdice_min+ o_ptr->to_d + p_ptr->to_d[0]);
+       maxdam = blow * (critdice_max+ o_ptr->to_d + p_ptr->to_d[0]);
+       
+#ifdef JP
+       compare_weapon_aux2(r++, col, mindam, maxdam, "²ñ¿´:", TERM_L_RED);
+#else
+       compare_weapon_aux2(r++, col, mindam, maxdam, "Critical:", TERM_L_RED);
+#endif
+       
+       /* Vorpal Hit*/
+       if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)))
+       {
+               if((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
+               {
+                       vorpal_mult = 5;
+                       vorpal_div = 3;
+               }
+               else
+               {
+                       vorpal_mult = 11;
+                       vorpal_div = 9;
+               }
+               
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, mindice, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, maxdice, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               
+               #ifdef JP
+                       compare_weapon_aux2(r++, col, mindam, maxdam, "ÀÚ¤ìÌ£:", TERM_L_RED);
+               #else
+                       compare_weapon_aux2(r++, col, mindam, maxdam, "Vorpal:", TERM_L_RED);
+               #endif
+       }       
+       
        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_force_weapon = TRUE;
+               force = TRUE;
+               
+               slaydice_min = calc_slaydam(mindice, 1, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 1, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               
+               /* Print the relevant lines */
+#ifdef JP
+               compare_weapon_aux2(r++, col, mindam, maxdam, "ÍýÎÏ:", TERM_L_BLUE);
+#else
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Force  :", TERM_L_BLUE);
+#endif         
        }
-
+               
        /* Print the relevant lines */
 #ifdef JP
-       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);
-       else if (have_flag(flgs, TR_SLAY_EVIL))   compare_weapon_aux2(o_ptr, blow, r++, col, 2*mult, "Evil:", TERM_YELLOW);
-       if (have_flag(flgs, TR_KILL_HUMAN))   compare_weapon_aux2(o_ptr, blow, r++, col, 4*mult, "Human:", TERM_YELLOW);
-       else if (have_flag(flgs, TR_SLAY_HUMAN))   compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "Human:", TERM_YELLOW);
-       if (have_flag(flgs, TR_KILL_UNDEAD)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "Undead:", TERM_YELLOW);
-       else if (have_flag(flgs, TR_SLAY_UNDEAD)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "Undead:", TERM_YELLOW);
-       if (have_flag(flgs, TR_KILL_DEMON))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "Demons:", TERM_YELLOW);
-       else if (have_flag(flgs, TR_SLAY_DEMON))  compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "Demons:", TERM_YELLOW);
-       if (have_flag(flgs, TR_KILL_ORC))    compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "Orcs:", TERM_YELLOW);
-       else if (have_flag(flgs, TR_SLAY_ORC))    compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "Orcs:", TERM_YELLOW);
-       if (have_flag(flgs, TR_KILL_TROLL))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "Trolls:", TERM_YELLOW);
-       else if (have_flag(flgs, TR_SLAY_TROLL))  compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "Trolls:", TERM_YELLOW);
-       if (have_flag(flgs, TR_KILL_GIANT))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "Giants:", TERM_YELLOW);
-       else if (have_flag(flgs, TR_SLAY_GIANT))  compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "Giants:", TERM_YELLOW);
-       if (have_flag(flgs, TR_KILL_DRAGON)) compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult, "Dragons:", TERM_YELLOW);
-       else if (have_flag(flgs, TR_SLAY_DRAGON)) compare_weapon_aux2(o_ptr, blow, r++, col, 3*mult, "Dragons:", TERM_YELLOW);
-       if (have_flag(flgs, TR_BRAND_ACID))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "Acid:", TERM_RED);
-       if (have_flag(flgs, TR_BRAND_ELEC))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "Elec:", TERM_RED);
-       if (have_flag(flgs, TR_BRAND_FIRE))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "Fire:", TERM_RED);
-       if (have_flag(flgs, TR_BRAND_COLD))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "Cold:", TERM_RED);
-       if (have_flag(flgs, TR_BRAND_POIS))  compare_weapon_aux2(o_ptr, blow, r++, col, 5*mult/2, "Poison:", TERM_RED);
+       if (have_flag(flgs, TR_KILL_ANIMAL))
+       {
+               slaydice_min = calc_slaydam(mindice, 4, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 4, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "ưʪ:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_ANIMAL)) 
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "ưʪ:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_EVIL))
+       {       
+               slaydice_min = calc_slaydam(mindice, 7, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 7, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "¼Ù°­:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_EVIL))
+       {       
+               slaydice_min = calc_slaydam(mindice, 2, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 2, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "¼Ù°­:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_HUMAN))
+       {       
+               slaydice_min = calc_slaydam(mindice, 4, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 4, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "¿Í´Ö:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_HUMAN))
+       {       
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "¿Í´Ö:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_UNDEAD))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "ÉÔ»à:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_UNDEAD)) 
+       {
+               slaydice_min = calc_slaydam(mindice, 3, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 3, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "ÉÔ»à:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_DEMON))
+       {       
+               slaydice_min = calc_slaydam(mindice, 5, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "°­Ëâ:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_DEMON))
+       {       
+               slaydice_min = calc_slaydam(mindice, 3, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 3, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "°­Ëâ:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_ORC))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "¥ª¡¼¥¯:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_ORC))
+       {
+               slaydice_min = calc_slaydam(mindice, 3, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 3, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "¥ª¡¼¥¯:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_TROLL))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "¥È¥í¥ë:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_TROLL))
+       {
+               slaydice_min = calc_slaydam(mindice, 3, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 3, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "¥È¥í¥ë:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_GIANT))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "µð¿Í:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_GIANT))
+       {
+               slaydice_min = calc_slaydam(mindice, 3, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 3, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "µð¿Í:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_DRAGON))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "ε:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_DRAGON))
+       {
+               slaydice_min = calc_slaydam(mindice, 3, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 3, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "ε:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_BRAND_ACID))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "»À°À­:", TERM_RED);
+       }
+       if (have_flag(flgs, TR_BRAND_ELEC))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "ÅÅ°À­:", TERM_RED);
+       }
+       if (have_flag(flgs, TR_BRAND_FIRE))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "±ê°À­:", TERM_RED);
+       }
+       if (have_flag(flgs, TR_BRAND_COLD))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Îä°À­:", TERM_RED);
+       }
+       if (have_flag(flgs, TR_BRAND_POIS))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "ÆÇ°À­:", TERM_RED);
+       }
+#else
+       if (have_flag(flgs, TR_KILL_ANIMAL))
+       {
+               slaydice_min = calc_slaydam(mindice, 4, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 4, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Animals:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_ANIMAL)) 
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Animals:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_EVIL))
+       {       
+               slaydice_min = calc_slaydam(mindice, 7, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 7, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Evil:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_EVIL))
+       {       
+               slaydice_min = calc_slaydam(mindice, 2, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 2, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Evil:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_HUMAN))
+       {       
+               slaydice_min = calc_slaydam(mindice, 4, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 4, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Human:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_HUMAN))
+       {       
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Human:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_UNDEAD))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Undead:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_UNDEAD)) 
+       {
+               slaydice_min = calc_slaydam(mindice, 3, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 3, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Undead:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_DEMON))
+       {       
+               slaydice_min = calc_slaydam(mindice, 5, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Demons:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_DEMON))
+       {       
+               slaydice_min = calc_slaydam(mindice, 3, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 3, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Demons:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_ORC))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Orcs:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_ORC))
+       {
+               slaydice_min = calc_slaydam(mindice, 3, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 3, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Orcs:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_TROLL))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Trolls:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_TROLL))
+       {
+               slaydice_min = calc_slaydam(mindice, 3, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 3, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Trolls:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_GIANT))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Giants:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_GIANT))
+       {
+               slaydice_min = calc_slaydam(mindice, 3, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 3, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Giants:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_KILL_DRAGON))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Dragons:", TERM_YELLOW);
+       }
+       else if (have_flag(flgs, TR_SLAY_DRAGON))
+       {
+               slaydice_min = calc_slaydam(mindice, 3, 1, force);
+               slaydice_max = calc_slaydam(maxdice, 3, 1, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Dragons:", TERM_YELLOW);
+       }
+       if (have_flag(flgs, TR_BRAND_ACID))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Acid:", TERM_RED);
+       }
+       if (have_flag(flgs, TR_BRAND_ELEC))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Elec:", TERM_RED);
+       }
+       if (have_flag(flgs, TR_BRAND_FIRE))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Fire:", TERM_RED);
+       }
+       if (have_flag(flgs, TR_BRAND_COLD))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Cold:", TERM_RED);
+       }
+       if (have_flag(flgs, TR_BRAND_POIS))
+       {
+               slaydice_min = calc_slaydam(mindice, 5, 2, force);
+               slaydice_max = calc_slaydam(maxdice, 5, 2, force);
+               critdice_min = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_min, p_ptr->to_h[0], dokubari);
+               critdice_max = calc_expect_crit(o_ptr->weight, o_ptr->to_h, slaydice_max, p_ptr->to_h[0], dokubari);
+               mindam = blow * (calc_slaydam(critdice_min, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               maxdam = blow * (calc_slaydam(critdice_max, vorpal_mult, vorpal_div, FALSE) + o_ptr->to_d + p_ptr->to_d[0]);
+               compare_weapon_aux2(r++, col, mindam, maxdam, "Poison:", TERM_RED);
+       }
 #endif
-
+       
 }
 
 static int hit_chance(int to_h, int ac)
@@ -3277,7 +3834,7 @@ static void list_weapon(object_type *o_ptr, int row, int col)
        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 */
@@ -3386,17 +3943,24 @@ static bool item_tester_hook_ammo(object_type *o_ptr)
  * Copies the weapons to compare into the weapon-slot and
  * compares the values for both weapons.
  */
-static bool compare_weapons(void)
+static int compare_weapons(int bcost)
 {
+       int i, n;
        int item, item2;
-       object_type *o1_ptr, *o2_ptr;
+       object_type *o_ptr[2];
        object_type orig_weapon;
        object_type *i_ptr;
        cptr q, s;
        int row = 2;
+       int wid = 38, mgn = 2;
        bool old_character_xtra = character_xtra;
+       char ch;
+       int total = 0;
+       int cost = 0; /* First time no price */
 
+       /* Save the screen */
        screen_save();
+
        /* Clear the screen */
        clear_bldg(0, 22);
 
@@ -3404,115 +3968,107 @@ static bool compare_weapons(void)
        i_ptr = &inventory[INVEN_RARM];
        object_copy(&orig_weapon, i_ptr);
 
-       item_tester_no_ryoute = TRUE;
        /* Only compare melee weapons */
+       item_tester_no_ryoute = TRUE;
        item_tester_hook = item_tester_hook_melee_weapon;
 
        /* Get the first weapon */
-#ifdef JP
-q = "Âè°ì¤ÎÉð´ï¤Ï¡©";
-s = "Èæ¤Ù¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£";
-#else
-       q = "What is your first weapon? ";
-       s = "You have nothing to compare.";
-#endif
+       q = _("Âè°ì¤ÎÉð´ï¤Ï¡©", "What is your first weapon? ");
+       s = _("Èæ¤Ù¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£", "You have nothing to compare.");
 
        if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN)))
        {
                screen_load();
-               return (FALSE);
+               return (0);
        }
 
        /* Get the item (in the pack) */
-       o1_ptr = &inventory[item];
-
-       /* Clear the screen */
-       clear_bldg(0, 22);
-
-       item_tester_no_ryoute = TRUE;
-       /* Only compare melee weapons */
-       item_tester_hook = item_tester_hook_melee_weapon;
-
-       /* Get the second weapon */
-#ifdef JP
-q = "ÂèÆó¤ÎÉð´ï¤Ï¡©";
-s = "Èæ¤Ù¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£";
-#else
-       q = "What is your second weapon? ";
-       s = "You have nothing to compare.";
-#endif
+       o_ptr[0] = &inventory[item];
+       n = 1;
+       total = bcost;
 
-       if (!get_item(&item2, q, s, (USE_EQUIP | USE_INVEN)))
+       while (TRUE)
        {
-               screen_load();
-               return (FALSE);
-       }
-
-       /* Get the item (in the pack) */
-       o2_ptr = &inventory[item2];
+               /* Clear the screen */
+               clear_bldg(0, 22);
 
-       /* Clear the screen */
-       clear_bldg(0, 22);
+               /* Only compare melee weapons */
+               item_tester_no_ryoute = TRUE;
+               item_tester_hook = item_tester_hook_melee_weapon;
 
-       /* Copy first weapon into the weapon slot (if it's not already there) */
-       if (o1_ptr != i_ptr)
-               object_copy(i_ptr, o1_ptr);
+               /* Hack -- prevent "icky" message */
+               character_xtra = TRUE;
 
-       /* Hack -- prevent "icky" message */
-       character_xtra = TRUE;
+               /* Diaplay selected weapon's infomation */
+               for (i = 0; i < n; i++)
+               {
+                       int col = (wid * i + mgn);
 
-       /* Get the new values */
-       calc_bonuses();
+                       /* Copy i-th weapon into the weapon slot (if it's not already there) */
+                       if (o_ptr[i] != i_ptr) object_copy(i_ptr, o_ptr[i]);
 
-       character_xtra = old_character_xtra;
+                       /* Get the new values */
+                       calc_bonuses();
 
-       /* List the new values */
-       list_weapon(o1_ptr, row, 2);
-       compare_weapon_aux1(o1_ptr, 2, row + 8);
+                       /* List the new values */
+                       list_weapon(o_ptr[i], row, col);
+                       compare_weapon_aux1(o_ptr[i], col, row + 8);
 
-       /* Copy second weapon into the weapon slot (if it's not already there) */
-       if (o2_ptr != i_ptr)
-               object_copy(i_ptr, o2_ptr);
-       else
-               object_copy(i_ptr, &orig_weapon);
+                       /* Copy back the original weapon into the weapon slot */
+                       object_copy(i_ptr, &orig_weapon);
+               }
 
-       /* Hack -- prevent "icky" message */
-       character_xtra = TRUE;
+               /* Reset the values for the old weapon */
+               calc_bonuses();
 
-       /* Get the new values */
-       calc_bonuses();
+               character_xtra = old_character_xtra;
 
-       character_xtra = old_character_xtra;
+#ifdef JP
+               put_str(format("[ Èæ³ÓÂоÝ: 's'¤ÇÊѹ¹ ($%d) ]", cost), 1, (wid + mgn));
+               put_str("(°ìÈֹ⤤¥À¥á¡¼¥¸¤¬Å¬ÍѤµ¤ì¤Þ¤¹¡£Ê£¿ô¤ÎÇÜÂǸú²Ì¤Ï­¤·»»¤µ¤ì¤Þ¤»¤ó¡£)", row + 4, 0);
+               prt("¸½ºß¤Îµ»Î̤«¤éȽÃǤ¹¤ë¤È¡¢¤¢¤Ê¤¿¤ÎÉð´ï¤Ï°Ê²¼¤Î¤è¤¦¤Ê°ÒÎϤòȯ´ø¤·¤Þ¤¹:", 0, 0);
+#else
+               put_str(format("[ 's' Select secondary weapon($%d) ]", cost), row + 1, (wid * i + mgn));
+               put_str("(Only highest damage applies per monster. Special damage not cumulative.)", row + 4, 0);
+               prt("Based on your current abilities, here is what your weapons will do", 0, 0);
+#endif
 
-       /* List the new values */
-       list_weapon(o2_ptr, row, 40);
-       compare_weapon_aux1(o2_ptr, 40, row + 8);
+               flush();
+               ch = inkey();
 
-       /* Copy back the original weapon into the weapon slot */
-       object_copy(i_ptr, &orig_weapon);
+               if (ch == 's')
+               {
+                       if (total + cost > p_ptr->au)
+                       {
+                               msg_print(_("¤ª¶â¤¬Â­¤ê¤Þ¤»¤ó¡ª", "You don't have enough money!"));
+                               msg_print(NULL);
+                               continue;
+                       }
 
-       /* Reset the values for the old weapon */
-       calc_bonuses();
+                       q = _("ÂèÆó¤ÎÉð´ï¤Ï¡©", "What is your second weapon? ");
+                       s = _("Èæ¤Ù¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£", "You have nothing to compare.");
 
-#ifdef JP
-put_str("(°ìÈֹ⤤¥À¥á¡¼¥¸¤¬Å¬ÍѤµ¤ì¤Þ¤¹¡£Ê£¿ô¤ÎÇÜÂǸú²Ì¤Ï­¤·»»¤µ¤ì¤Þ¤»¤ó¡£)", row + 4, 0);
-#else
-       put_str("(Only highest damage applies per monster. Special damage not cumulative.)", row + 4, 0);
-#endif
+                       /* Get the second weapon */
+                       if (!get_item(&item2, q, s, (USE_EQUIP | USE_INVEN))) continue;
 
-#ifdef JP
-msg_print("¸½ºß¤Îµ»Î̤«¤éȽÃǤ¹¤ë¤È¡¢¤¢¤Ê¤¿¤ÎÉð´ï¤Ï°Ê²¼¤Î¤è¤¦¤Ê°ÒÎϤòȯ´ø¤·¤Þ¤¹:");
-#else
-       msg_print("Based on your current abilities, here is what your weapons will do");
-#endif
+                       total += cost;
+                       cost = bcost / 2;
 
+                       /* Get the item (in the pack) */
+                       o_ptr[1] = &inventory[item2];
+                       n = 2;
+               }
+               else
+               {
+                       break;
+               }
+       }
 
-       flush();
-       (void)inkey();
+       /* Restore the screen */
        screen_load();
 
        /* Done */
-       return (TRUE);
+       return (total);
 }
 
 
@@ -3620,6 +4176,340 @@ static bool eval_ac(int iAC)
 
 
 /*
+ * Hook to specify "broken weapon"
+ */
+static bool item_tester_hook_broken_weapon(object_type *o_ptr)
+{
+       if (o_ptr->tval != TV_SWORD) return FALSE;
+
+       switch (o_ptr->sval)
+       {
+       case SV_BROKEN_DAGGER:
+       case SV_BROKEN_SWORD:
+               return TRUE;
+       }
+
+       return FALSE;
+}
+
+static void give_one_ability_of_object(object_type *to_ptr, object_type *from_ptr)
+{
+       int i, n = 0;
+       int cand[TR_FLAG_MAX];
+       u32b to_flgs[TR_FLAG_SIZE];
+       u32b from_flgs[TR_FLAG_SIZE];
+
+       object_flags(to_ptr, to_flgs);
+       object_flags(from_ptr, from_flgs);
+
+       for (i = 0; i < TR_FLAG_MAX; i++)
+       {
+               switch (i)
+               {
+               case TR_IGNORE_ACID:
+               case TR_IGNORE_ELEC:
+               case TR_IGNORE_FIRE:
+               case TR_IGNORE_COLD:
+               case TR_ACTIVATE:
+               case TR_RIDING:
+               case TR_THROW:
+               case TR_SHOW_MODS:
+               case TR_HIDE_TYPE:
+               case TR_ES_ATTACK:
+               case TR_ES_AC:
+               case TR_FULL_NAME:
+               case TR_FIXED_FLAVOR:
+                       break;
+               default:
+                       if (have_flag(from_flgs, i) && !have_flag(to_flgs, i))
+                       {
+                               if (!(is_pval_flag(i) && (from_ptr->pval < 1))) cand[n++] = i;
+                       }
+               }
+       }
+
+       if (n > 0)
+       {
+               int bmax;
+               int tr_idx = cand[randint0(n)];
+               add_flag(to_ptr->art_flags, tr_idx);
+               if (is_pval_flag(tr_idx)) to_ptr->pval = MAX(to_ptr->pval, 1);
+               bmax = MIN(3, MAX(1, 40 / (to_ptr->dd * to_ptr->ds)));
+               if (tr_idx == TR_BLOWS) to_ptr->pval = MIN(to_ptr->pval, bmax);
+               if (tr_idx == TR_SPEED) to_ptr->pval = MIN(to_ptr->pval, 4);
+       }
+
+       return;
+}
+
+/*
+ * Repair broken weapon
+ */
+static int repair_broken_weapon_aux(int bcost)
+{
+       s32b cost;
+       int item, mater;
+       object_type *o_ptr, *mo_ptr; /* broken weapon and material weapon */
+       object_kind *k_ptr;
+       int i, k_idx, dd_bonus, ds_bonus;
+       char basenm[MAX_NLEN];
+       cptr q, s; /* For get_item prompt */
+       int row = 7;
+
+       /* Clear screen */
+       clear_bldg(0, 22);
+
+       /* Notice */
+       prt(_("½¤Éü¤Ë¤ÏºàÎÁ¤È¤Ê¤ë¤â¤¦1¤Ä¤ÎÉð´ï¤¬É¬ÍפǤ¹¡£", "Hand one material weapon to repair a broken weapon."), row, 2);
+       prt(_("ºàÎÁ¤Ë»ÈÍѤ·¤¿Éð´ï¤Ï¤Ê¤¯¤Ê¤ê¤Þ¤¹¡ª", "The material weapon will disappear after repairing!!"), row+1, 2);
+
+       /* Get an item */
+       q = _("¤É¤ÎÀޤ줿Éð´ï¤ò½¤Éü¤·¤Þ¤¹¤«¡©", "Repair which broken weapon? ");
+       s = _("½¤Éü¤Ç¤­¤ëÀޤ줿Éð´ï¤¬¤¢¤ê¤Þ¤»¤ó¡£", "You have no broken weapon to repair.");
+
+       /* Only forge broken weapons */
+       item_tester_hook = item_tester_hook_broken_weapon;
+
+       if (!get_item(&item, q, s, (USE_INVEN | USE_EQUIP))) return (0);
+
+       /* Get the item (in the pack) */
+       o_ptr = &inventory[item];
+
+       /* It is worthless */
+       if (!object_is_ego(o_ptr) && !object_is_artifact(o_ptr))
+       {
+               msg_format(_("¤½¤ì¤Ïľ¤·¤Æ¤â¤·¤ç¤¦¤¬¤Ê¤¤¤¼¡£", "It is worthless to repair."));
+               return (0);
+       }
+
+       /* They are too many */
+       if (o_ptr->number > 1)
+       {
+               msg_format(_("°ìÅÙ¤ËÊ£¿ô¤ò½¤Éü¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡ª", "They are too many to repair at once!"));
+               return (0);
+       }
+
+       /* Display item name */
+       object_desc(basenm, o_ptr, OD_NAME_ONLY);
+       prt(format(_("½¤Éü¤¹¤ëÉð´ï¡¡¡§ %s", "Repairing: %s"), basenm), row+3, 2);
+
+       /* Get an item */
+       q = _("ºàÎÁ¤È¤Ê¤ëÉð´ï¤Ï¡©", "Which weapon for material? ");
+       s = _("ºàÎÁ¤È¤Ê¤ëÉð´ï¤¬¤¢¤ê¤Þ¤»¤ó¡£", "You have no material to repair.");
+
+       /* Only forge broken weapons */
+       item_tester_hook = item_tester_hook_melee_weapon;
+
+       if (!get_item(&mater, q, s, (USE_INVEN | USE_EQUIP))) return (0);
+       if (mater == item)
+       {
+               msg_print(_("¥¯¥é¥¤¥ó¤ÎÄÛ¤¸¤ã¤Ê¤¤¡ª", "This is not a klein bottle!"));
+               return (0);
+       }
+
+       /* Get the item (in the pack) */
+       mo_ptr = &inventory[mater];
+
+       /* Display item name */
+       object_desc(basenm, mo_ptr, OD_NAME_ONLY);
+       prt(format(_("ºàÎÁ¤È¤¹¤ëÉð´ï¡§ %s", "Material : %s"), basenm), row+4, 2);
+
+       /* Get the value of one of the items (except curses) */
+       cost = bcost + object_value_real(o_ptr) * 2;
+
+#ifdef JP
+       if (!get_check(format("¡ð%d¤«¤«¤ê¤Þ¤¹¤¬¤è¤í¤·¤¤¤Ç¤¹¤«¡© ", cost))) return (0);
+#else
+       if (!get_check(format("Costs %d gold, okay? ", cost))) return (0);
+#endif
+
+       /* Check if the player has enough money */
+       if (p_ptr->au < cost)
+       {
+               object_desc(basenm, o_ptr, OD_NAME_ONLY);
+               msg_format(_("%s¤ò½¤Éü¤¹¤ë¤À¤±¤Î¥´¡¼¥ë¥É¤¬¤¢¤ê¤Þ¤»¤ó¡ª",
+                       "You do not have the gold to repair %s!"), basenm);
+               msg_print(NULL);
+               return (0);
+       }
+
+       if (o_ptr->sval == SV_BROKEN_DAGGER)
+       {
+               int i, n = 1;
+
+               /* Suppress compiler warning */
+               k_idx = 0;
+
+               for (i = 1; i < max_k_idx; i++)
+               {
+                       object_kind *k_ptr = &k_info[i];
+
+                       if (k_ptr->tval != TV_SWORD) continue;
+                       if ((k_ptr->sval == SV_BROKEN_DAGGER) ||
+                               (k_ptr->sval == SV_BROKEN_SWORD) ||
+                               (k_ptr->sval == SV_DOKUBARI)) continue;
+                       if (k_ptr->weight > 99) continue;
+
+                       if (one_in_(n)) 
+                       {
+                               k_idx = i;
+                               n++;
+                       }
+               }
+       }
+       else /* TV_BROKEN_SWORD */
+       {
+               /* Repair to a sword or sometimes material's type weapon */
+               int tval = (one_in_(5) ? mo_ptr->tval : TV_SWORD);
+
+               while(1)
+               {
+                       object_kind *ck_ptr;
+
+                       k_idx = lookup_kind(tval, SV_ANY);
+                       ck_ptr = &k_info[k_idx];
+
+                       if (tval == TV_SWORD)
+                       {
+                               if ((ck_ptr->sval == SV_BROKEN_DAGGER) ||
+                                       (ck_ptr->sval == SV_BROKEN_SWORD) ||
+                                       (ck_ptr->sval == SV_DIAMOND_EDGE) ||
+                                       (ck_ptr->sval == SV_DOKUBARI)) continue;
+                       }
+                       if (tval == TV_POLEARM)
+                       {
+                               if ((ck_ptr->sval == SV_DEATH_SCYTHE) ||
+                                       (ck_ptr->sval == SV_TSURIZAO)) continue;
+                       }
+                       if (tval == TV_HAFTED)
+                       {
+                               if ((ck_ptr->sval == SV_GROND) ||
+                                       (ck_ptr->sval == SV_WIZSTAFF) ||
+                                       (ck_ptr->sval == SV_NAMAKE_HAMMER)) continue;
+                       }
+
+                       break;
+               }
+       }
+
+       /* Calculate dice bonuses */
+       dd_bonus = o_ptr->dd - k_info[o_ptr->k_idx].dd;
+       ds_bonus = o_ptr->ds - k_info[o_ptr->k_idx].ds;
+       dd_bonus += mo_ptr->dd - k_info[mo_ptr->k_idx].dd;
+       ds_bonus += mo_ptr->ds - k_info[mo_ptr->k_idx].ds;
+
+       /* Change base object */
+       k_ptr = &k_info[k_idx];
+       o_ptr->k_idx = k_idx;
+       o_ptr->weight = k_ptr->weight;
+       o_ptr->tval = k_ptr->tval;
+       o_ptr->sval = k_ptr->sval;
+       o_ptr->dd = k_ptr->dd;
+       o_ptr->ds = k_ptr->ds;
+
+       /* Copy base object's ability */
+       for (i = 0; i < TR_FLAG_SIZE; i++) o_ptr->art_flags[i] |= k_ptr->flags[i];
+       if (k_ptr->pval) o_ptr->pval = MAX(o_ptr->pval, randint1(k_ptr->pval));
+       if (have_flag(k_ptr->flags, TR_ACTIVATE)) o_ptr->xtra2 = k_ptr->act_idx;
+
+       /* Dice up */
+       if (dd_bonus > 0)
+       {
+               o_ptr->dd++;
+               for (i = 0; i < dd_bonus; i++)
+               {
+                       if (one_in_(o_ptr->dd + i)) o_ptr->dd++;
+               }
+       }
+       if (ds_bonus > 0)
+       {
+               o_ptr->ds++;
+               for (i = 0; i < ds_bonus; i++)
+               {
+                       if (one_in_(o_ptr->ds + i)) o_ptr->ds++;
+               }
+       }
+
+       /* */
+       if (have_flag(k_ptr->flags, TR_BLOWS))
+       {
+               int bmax = MIN(3, MAX(1, 40 / (o_ptr->dd * o_ptr->ds)));
+               o_ptr->pval = MIN(o_ptr->pval, bmax);
+       }
+
+       /* Add one random ability from material weapon */
+       give_one_ability_of_object(o_ptr, mo_ptr);
+
+       /* Add to-dam, to-hit and to-ac from material weapon */
+       o_ptr->to_d += MAX(0, (mo_ptr->to_d / 3));
+       o_ptr->to_h += MAX(0, (mo_ptr->to_h / 3));
+       o_ptr->to_a += MAX(0, (mo_ptr->to_a));
+
+       if ((o_ptr->name1 == ART_NARSIL) ||
+               (object_is_random_artifact(o_ptr) && one_in_(1)) ||
+               (object_is_ego(o_ptr) && one_in_(7)))
+       {
+               /* Forge it */
+               if (object_is_ego(o_ptr))
+               {
+                       add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
+                       add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
+               }
+
+               /* Add one random ability from material weapon */
+               give_one_ability_of_object(o_ptr, mo_ptr);
+
+               /* Add one random activation */
+               if (!activation_index(o_ptr)) one_activation(o_ptr);
+
+               /* Narsil */
+               if (o_ptr->name1 == ART_NARSIL)
+               {
+                       one_high_resistance(o_ptr);
+                       one_ability(o_ptr);
+               }
+
+               msg_print(_("¤³¤ì¤Ï¤«¤Ê¤ê¤Î¶Èʪ¤À¤Ã¤¿¤è¤¦¤À¡£", "This blade seems to be exceptionally."));
+       }
+
+       object_desc(basenm, o_ptr, OD_NAME_ONLY);
+#ifdef JP
+       msg_format("¡ð%d¤Ç%s¤Ë½¤Éü¤·¤Þ¤·¤¿¡£", cost, basenm);
+#else
+       msg_format("Repaired into %s for %d gold.", basenm, cost);
+#endif
+       msg_print(NULL);
+
+       /* Remove BROKEN flag */
+       o_ptr->ident &= ~(IDENT_BROKEN);
+
+       /* Add repaired flag */
+       o_ptr->discount = 99;
+
+       /* Decrease material object */
+       inven_item_increase(mater, -1);
+       inven_item_optimize(mater);
+
+       /* Copyback */
+       p_ptr->update |= PU_BONUS;
+       handle_stuff();
+
+       /* Something happened */
+       return (cost);
+}
+
+static int repair_broken_weapon(int bcost)
+{
+       int cost;
+
+       screen_save();
+       cost = repair_broken_weapon_aux(bcost);
+       screen_load();
+       return cost;
+}
+
+
+/*
  * Enchant item
  */
 static bool enchant_item(int cost, int to_hit, int to_dam, int to_ac)
@@ -3631,11 +4521,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);
@@ -3645,8 +4534,8 @@ prt(format(" 
 
        /* Get an item */
 #ifdef JP
-q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©";
-s = "²þÎɤǤ­¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£";
+       q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©";
+       s = "²þÎɤǤ­¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤»¤ó¡£";
 #else
        q = "Improve which item? ";
        s = "You have nothing to improve.";
@@ -3660,9 +4549,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
@@ -3717,21 +4606,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 */
@@ -3810,7 +4698,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("½¼Å¶¤¹¤ëÁ°¤Ë´ÕÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡ª");
@@ -3835,7 +4723,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);
@@ -3843,6 +4731,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();
@@ -3854,7 +4744,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)
@@ -3880,7 +4770,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);
@@ -3888,7 +4778,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);
@@ -3940,7 +4830,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
@@ -3999,7 +4889,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
@@ -4058,10 +4948,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];
 
@@ -4073,7 +4963,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);
@@ -4084,7 +4974,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);
@@ -4133,12 +5023,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)
@@ -4265,7 +5161,7 @@ bool tele_town(void)
                        }
                }
        }
-       p_ptr->leftbldg = TRUE;
+
        p_ptr->leaving = TRUE;
        leave_bldg = TRUE;
        p_ptr->teleport_town = TRUE;
@@ -4439,9 +5335,9 @@ sprintf(buf, "%c - %s", sym, "̵
                                if (isupper(temp2[xx])) temp2[xx] = tolower(temp2[xx]);
 
 #ifdef JP
-                       if (strstr(temp2, temp) || strstr_j(r_name + r_ptr->name, temp))
+                       if (my_strstr(temp2, temp) || my_strstr(r_name + r_ptr->name, temp))
 #else
-                       if (strstr(temp2, temp))
+                       if (my_strstr(temp2, temp))
 #endif
                                who[n++] = i;
                }
@@ -4662,14 +5558,15 @@ msg_print("
                paid = research_mon();
                break;
        case BACT_COMPARE_WEAPONS:
-               paid = compare_weapons();
+               paid = TRUE;
+               bcost = compare_weapons(bcost);
                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:
@@ -4714,21 +5611,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);
@@ -4743,66 +5625,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;
 
@@ -4824,7 +5656,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
@@ -4842,7 +5674,10 @@ msg_print("
                break;
        }
        case BACT_LOSE_MUTATION:
-               if (p_ptr->muta1 || p_ptr->muta2 || p_ptr->muta3)
+               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;
@@ -4905,6 +5740,10 @@ msg_print("
        case BACT_EVAL_AC:
                paid = eval_ac(p_ptr->dis_ac + p_ptr->dis_to_a);
                break;
+       case BACT_BROKEN_WEAPON:
+               paid = TRUE;
+               bcost = repair_broken_weapon(bcost);
+               break;
        }
 
        if (paid)
@@ -4921,7 +5760,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("¤³¤³¤Ë¤Ï¥¯¥¨¥¹¥È¤ÎÆþ¸ý¤Ï¤Ê¤¤¡£");
@@ -4949,9 +5788,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;
        }
 }
@@ -4970,11 +5809,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
@@ -4982,8 +5820,7 @@ 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];
 
@@ -4993,31 +5830,54 @@ msg_print("
        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 && m_cnt > 0)
+               {
 #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
        {
@@ -5086,7 +5946,9 @@ prt("
 
        /* Reinit wilderness to activate quests ... */
        if (reinit_wilderness)
+       {
                p_ptr->leaving = TRUE;
+       }
 
        /* Hack -- Decrease "icky" depth */
        character_icky--;