OSDN Git Service

日替わり賞金首の換金で、集団型の見習いメイジと孤立型の見習いメイジ等を区別しないようにした。
[hengband/hengband.git] / src / bldg.c
index 6b2ef09..184c9ef 100644 (file)
@@ -19,8 +19,6 @@ static bool leave_bldg = FALSE;
 /* remember building location */
 static int building_loc = 0;
 
-static bool reinit_wilderness = FALSE;
-
 static bool is_owner(building_type *bldg)
 {
        if (bldg->member_class[p_ptr->pclass] == BUILDING_OWNER)
@@ -352,7 +350,7 @@ msg_print("
                        }
                        else
                        {
-                               r_ptr = &r_info[arena_monsters[p_ptr->arena_number]];
+                               r_ptr = &r_info[arena_info[p_ptr->arena_number].r_idx];
                                name = (r_name + r_ptr->name);
 #ifdef JP
 msg_format("%s ¤ËÄ©À魯¤ë¤â¤Î¤Ï¤¤¤Ê¤¤¤«¡©", name);
@@ -564,14 +562,14 @@ static void reset_deck(int deck[])
 
        /* shuffle cards */
        for (i = 0; i < 53; i++){
-               int tmp1 = rand_int(53 - i) + i;
+               int tmp1 = randint0(53 - i) + i;
                int tmp2 = deck[i];
                deck[i] = deck[tmp1];
                deck[tmp1] = tmp2;
        }
 }
 
-static bool have_joker()
+static bool have_joker(void)
 {
        int i;
 
@@ -589,7 +587,7 @@ static bool find_card_num(int num)
        return FALSE;
 }
 
-static bool yaku_check_flush()
+static bool yaku_check_flush(void)
 {
        int i, suit;
        bool joker_is_used = FALSE;
@@ -607,7 +605,7 @@ static bool yaku_check_flush()
        return TRUE;
 }
 
-static int yaku_check_straight()
+static int yaku_check_straight(void)
 {
        int i, lowest = 99;
        bool joker_is_used = FALSE;
@@ -646,7 +644,7 @@ static int yaku_check_straight()
        joker_is_used = FALSE;
        for (i = 0; i < 5; i++)
        {
-               if (!find_card_num(lowest + i)){
+               if (!find_card_num(lowest + i)){
                  if( have_joker() && !joker_is_used )
                    joker_is_used = TRUE;
                  else
@@ -663,7 +661,7 @@ static int yaku_check_straight()
 /*
  * 0:nopair 1:1 pair 2:2 pair 3:3 cards 4:full house 6:4cards
  */
-static int yaku_check_pair()
+static int yaku_check_pair(void)
 {
        int i, i2, matching = 0;
 
@@ -714,7 +712,7 @@ static int yaku_check_pair()
 #define ODDS_3C 1
 #define ODDS_2P 1
 
-static int yaku_check()
+static int yaku_check(void)
 {
        prt("                            ", 4, 3);
 
@@ -853,7 +851,7 @@ static void display_kaeruka(int hoge, int kaeruka[])
 }
 
 
-static void display_cards()
+static void display_cards(void)
 {
        int i, j;
        char suitcolor[4] = {TERM_YELLOW, TERM_L_RED, TERM_L_BLUE, TERM_L_GREEN};
@@ -1100,7 +1098,7 @@ static void display_cards()
        }
 }
 
-static int do_poker()
+static int do_poker(void)
 {
        int i, k = 2;
        char cmd;
@@ -1342,7 +1340,7 @@ sprintf(tmp_str, "
                        prt(tmp_str, 21, 2);
 
                        /* Prevent savefile-scumming of the casino */
-//                     Rand_quick = TRUE;
+/*                     Rand_quick = TRUE; */
                        Rand_value = time(NULL);
 
                        do
@@ -1364,9 +1362,9 @@ c_put_str(TERM_GREEN, "
 
                                        odds = 4;
                                        win = FALSE;
-                                       roll1 = randint(10);
-                                       roll2 = randint(10);
-                                       choice = randint(10);
+                                       roll1 = randint1(10);
+                                       roll2 = randint1(10);
+                                       choice = randint1(10);
 #ifdef JP
 sprintf(tmp_str, "¹õ¥À¥¤¥¹: %d        ¹õ¥À¥¤¥¹: %d", roll1, roll2);
 #else
@@ -1394,8 +1392,8 @@ c_put_str(TERM_GREEN, "
 
                                        win = 3;
                                        odds = 2;
-                                       roll1 = randint(6);
-                                       roll2 = randint(6);
+                                       roll1 = randint1(6);
+                                       roll2 = randint1(6);
                                        roll3 = roll1 +  roll2;
                                        choice = roll3;
 #ifdef JP
@@ -1420,8 +1418,8 @@ msg_print("
 #endif
 
                                                        msg_print(NULL);
-                                                       roll1 = randint(6);
-                                                       roll2 = randint(6);
+                                                       roll1 = randint1(6);
+                                                       roll2 = randint1(6);
                                                        roll3 = roll1 +  roll2;
 
 #ifdef JP
@@ -1480,7 +1478,7 @@ msg_print("
                                                choice = 9;
                                        }
                                        msg_print(NULL);
-                                       roll1 = rand_int(10);
+                                       roll1 = randint0(10);
 #ifdef JP
 sprintf(tmp_str, "¥ë¡¼¥ì¥Ã¥È¤Ï²ó¤ê¡¢»ß¤Þ¤Ã¤¿¡£¾¡¼Ô¤Ï %dÈÖ¤À¡£",
 #else
@@ -1510,7 +1508,7 @@ c_put_str(TERM_GREEN, "
 #endif
 
                                        win = FALSE;
-                                       roll1 = randint(21);
+                                       roll1 = randint1(21);
                                        for (i=6;i>0;i--)
                                        {
                                                if ((roll1-i) < 1)
@@ -1520,7 +1518,7 @@ c_put_str(TERM_GREEN, "
                                                }
                                                roll1 -= i;
                                        }
-                                       roll2 = randint(21);
+                                       roll2 = randint1(21);
                                        for (i=6;i>0;i--)
                                        {
                                                if ((roll2-i) < 1)
@@ -1530,7 +1528,7 @@ c_put_str(TERM_GREEN, "
                                                }
                                                roll2 -= i;
                                        }
-                                       choice = randint(21);
+                                       choice = randint1(21);
                                        for (i=6;i>0;i--)
                                        {
                                                if ((choice-i) < 1)
@@ -1674,11 +1672,11 @@ static bool vault_aux_battle(int r_idx)
        monster_race *r_ptr = &r_info[r_idx];
 
        /* Decline town monsters */
-//     if (!monster_dungeon(r_idx)) return FALSE;
+/*     if (!monster_dungeon(r_idx)) return FALSE; */
 
        /* Decline unique monsters */
-//     if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE);
-//     if (r_ptr->flags7 & (RF7_UNIQUE_7)) return (FALSE);
+/*     if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); */
+/*     if (r_ptr->flags7 & (RF7_UNIQUE_7)) return (FALSE); */
 
        if (r_ptr->flags1 & (RF1_NEVER_MOVE)) return (FALSE);
        if (r_ptr->flags2 & (RF2_MULTIPLY)) return (FALSE);
@@ -1709,15 +1707,15 @@ void battle_monsters(void)
        for (i = 0; i < max_d_idx; i++)
                if (max_dl < max_dlv[i]) max_dl = max_dlv[i];
 
-       mon_level = randint(MIN(max_dl, 122))+5;
-       if (rand_int(100) < 60)
+       mon_level = randint1(MIN(max_dl, 122))+5;
+       if (randint0(100) < 60)
        {
-               i = randint(MIN(max_dl, 122))+5;
+               i = randint1(MIN(max_dl, 122))+5;
                mon_level = MAX(i, mon_level);
        }
-       if (rand_int(100) < 30)
+       if (randint0(100) < 30)
        {
-               i = randint(MIN(max_dl, 122))+5;
+               i = randint1(MIN(max_dl, 122))+5;
                mon_level = MAX(i, mon_level);
        }
 
@@ -1754,7 +1752,7 @@ void battle_monsters(void)
                for (i=0;i<4;i++)
                {
                        monster_race *r_ptr = &r_info[battle_mon[i]];
-                       int num_taisei = count_bits(r_ptr->flags3 & (RF3_IM_ACID | RF3_IM_ELEC | RF3_IM_FIRE | RF3_IM_COLD | RF3_IM_POIS));
+                       int num_taisei = count_bits(r_ptr->flagsr & (RFR_IM_ACID | RFR_IM_ELEC | RFR_IM_FIRE | RFR_IM_COLD | RFR_IM_POIS));
 
                        if (r_ptr->flags1 & RF1_FORCE_MAXHP)
                                power[i] = r_ptr->hdice * r_ptr->hside * 2;
@@ -1808,7 +1806,7 @@ void battle_monsters(void)
                                case MON_SHADOWLORD:
                                case MON_ARCHLICH:
                                case MON_BLEYS:
-                               case MON_CAIN:
+                               case MON_CAINE:
                                case MON_JULIAN:
                                case MON_VENOM_WYRM:
                                case MON_MASTER_MYS:
@@ -1836,7 +1834,7 @@ void battle_monsters(void)
                                case MON_BAZOOKER:
                                case MON_GCWADL:
                                case MON_KIRIN:
-                               case MON_HOUOU:
+                               case MON_FENGHUANG:
                                        power[i] = power[i] * 4 / 3;
                                        break;
                                case MON_UMBER_HULK:
@@ -1844,7 +1842,7 @@ void battle_monsters(void)
                                case MON_WATER_VOR:
                                case MON_COLD_VOR:
                                case MON_ENERGY_VOR:
-                               case MON_BARNEY:
+                               case MON_GACHAPIN:
                                case MON_REVENANT:
                                case MON_NEXUS_VOR:
                                case MON_PLASMA_VOR:
@@ -1906,8 +1904,8 @@ void battle_monsters(void)
                {
                        power[i] = total*60/power[i];
                        if (tekitou && ((power[i] < 160) || power[i] > 1500)) break;
-                       if ((power[i] < 160) && rand_int(20)) break;
-                       if (power[i] < 101) power[i] = 100 + randint(5);
+                       if ((power[i] < 160) && randint0(20)) break;
+                       if (power[i] < 101) power[i] = 100 + randint1(5);
                        mon_odds[i] = power[i];
                }
                if (i == 4) break;
@@ -1921,7 +1919,7 @@ static bool kakutoujou(void)
        char out_val[160], tmp_str[80];
        cptr p;
 
-       if ((turn - old_battle) > 5000)
+       if ((turn - old_battle) > TURNS_PER_TICK*250)
        {
                battle_monsters();
                old_battle = turn;
@@ -2129,7 +2127,7 @@ static void shoukinkubi(void)
        clear_bldg(4,18);
 
 #ifdef JP
-       prt("»àÂΤò»ý¤Áµ¢¤ë¤È¾Þ¶â¤òº¹¤·¾å¤²¤Þ¤¹¡£",4 ,10);
+       prt("»àÂΤò»ý¤Áµ¢¤ì¤ÐÊó½·¤òº¹¤·¾å¤²¤Þ¤¹¡£",4 ,10);
 c_put_str(TERM_YELLOW, "¸½ºß¤Î¾Þ¶â¼ó", 6, 10);
 #else
        prt("Offer a prize when you bring a wanted monster's corpse",4 ,10);
@@ -2138,18 +2136,27 @@ c_put_str(TERM_YELLOW, "Wanted monsters", 6, 10);
 
        for (i = 0; i < MAX_KUBI; i++)
        {
-               char buf[160];
+               byte color;
+               cptr done_mark;
                monster_race *r_ptr = &r_info[(kubi_r_idx[i] > 10000 ? kubi_r_idx[i] - 10000 : kubi_r_idx[i])];
 
-               sprintf(buf,"%-40s ---- ",r_name + r_ptr->name);
-               prt(buf, y+7, 10);
                if (kubi_r_idx[i] > 10000)
-                       c_put_str(TERM_RED,"ºÑ", y+7, 56);
+               {
+                       color = TERM_RED;
+#ifdef JP
+                       done_mark = "(ºÑ)";
+#else
+                       done_mark = "(done)";
+#endif
+               }
                else
                {
-                       sprintf(buf,"$%d", 300 * (r_ptr->level + 1));
-                       prt(buf, y+7, 56);
+                       color = TERM_WHITE;
+                       done_mark = "";
                }
+
+               c_prt(color, format("%s %s", r_name + r_ptr->name, done_mark), y+7, 10);
+
                y = (y+1) % 10;
                if (!y && (i < MAX_KUBI -1))
                {
@@ -2165,6 +2172,40 @@ c_put_str(TERM_YELLOW, "Wanted monsters", 6, 10);
        }
 }
 
+
+/* List of prize object */
+static struct {
+       s16b tval;
+       s16b sval;
+} prize_list[MAX_KUBI] = 
+{
+       {TV_POTION, SV_POTION_CURING},
+       {TV_POTION, SV_POTION_SPEED},
+       {TV_POTION, SV_POTION_SPEED},
+       {TV_POTION, SV_POTION_RESISTANCE},
+       {TV_POTION, SV_POTION_ENLIGHTENMENT},
+
+       {TV_POTION, SV_POTION_HEALING},
+       {TV_POTION, SV_POTION_RESTORE_MANA},
+       {TV_SCROLL, SV_SCROLL_STAR_DESTRUCTION},
+       {TV_POTION, SV_POTION_STAR_ENLIGHTENMENT},
+       {TV_SCROLL, SV_SCROLL_SUMMON_PET},
+
+       {TV_SCROLL, SV_SCROLL_GENOCIDE},
+       {TV_POTION, SV_POTION_STAR_HEALING},
+       {TV_POTION, SV_POTION_STAR_HEALING},
+       {TV_POTION, SV_POTION_NEW_LIFE},
+       {TV_SCROLL, SV_SCROLL_MASS_GENOCIDE},
+
+       {TV_POTION, SV_POTION_LIFE},
+       {TV_POTION, SV_POTION_LIFE},
+       {TV_POTION, SV_POTION_AUGMENTATION},
+       {TV_POTION, SV_POTION_INVULNERABILITY},
+       {TV_SCROLL, SV_SCROLL_ARTIFACT},
+};
+
+
+/* Get prize */
 static bool kankin(void)
 {
        int i, j;
@@ -2172,9 +2213,12 @@ static bool kankin(void)
        char o_name[MAX_NLEN];
        object_type *o_ptr;
 
-       for (i = 0;i <= INVEN_LARM; i++)
+       /* Loop for inventory and right/left arm */
+       for (i = 0; i <= INVEN_LARM; i++)
        {
                o_ptr = &inventory[i];
+
+               /* Living Tsuchinoko worthes $1000000 */
                if ((o_ptr->tval == TV_CAPTURE) && (o_ptr->pval == MON_TSUCHINOKO))
                {
                        char buf[MAX_NLEN+20];
@@ -2182,7 +2226,7 @@ static bool kankin(void)
 #ifdef JP
                        sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
 #else
-                       sprintf(buf, "Convert %s into maney? ",o_name);
+                       sprintf(buf, "Convert %s into money? ",o_name);
 #endif
                        if (get_check(buf))
                        {
@@ -2200,9 +2244,12 @@ static bool kankin(void)
                        change = TRUE;
                }
        }
-       for (i = 0;i <= INVEN_LARM; i++)
+
+       for (i = 0; i < INVEN_PACK; i++)
        {
                o_ptr = &inventory[i];
+
+               /* Corpse of Tsuchinoko worthes $200000 */
                if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == MON_TSUCHINOKO))
                {
                        char buf[MAX_NLEN+20];
@@ -2210,7 +2257,7 @@ static bool kankin(void)
 #ifdef JP
                        sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
 #else
-                       sprintf(buf, "Convert %s into maney? ",o_name);
+                       sprintf(buf, "Convert %s into money? ",o_name);
 #endif
                        if (get_check(buf))
                        {
@@ -2228,9 +2275,12 @@ static bool kankin(void)
                        change = TRUE;
                }
        }
-       for (i = 0;i <= INVEN_LARM; i++)
+
+       for (i = 0; i < INVEN_PACK; i++)
        {
                o_ptr = &inventory[i];
+
+               /* Bones of Tsuchinoko worthes $100000 */
                if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (o_ptr->pval == MON_TSUCHINOKO))
                {
                        char buf[MAX_NLEN+20];
@@ -2238,7 +2288,7 @@ static bool kankin(void)
 #ifdef JP
                        sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
 #else
-                       sprintf(buf, "Convert %s into maney? ",o_name);
+                       sprintf(buf, "Convert %s into money? ",o_name);
 #endif
                        if (get_check(buf))
                        {
@@ -2257,17 +2307,17 @@ static bool kankin(void)
                }
        }
 
-       for (i = 0;i <= INVEN_LARM; i++)
+       for (i = 0; i < INVEN_PACK; i++)
        {
                o_ptr = &inventory[i];
-               if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == today_mon))
+               if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name)))
                {
                        char buf[MAX_NLEN+20];
                        object_desc(o_name, o_ptr, TRUE, 3);
 #ifdef JP
                        sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
 #else
-                       sprintf(buf, "Convert %s into maney? ",o_name);
+                       sprintf(buf, "Convert %s into money? ",o_name);
 #endif
                        if (get_check(buf))
                        {
@@ -2285,17 +2335,19 @@ static bool kankin(void)
                        change = TRUE;
                }
        }
-       for (i = 0;i <= INVEN_LARM; i++)
+
+       for (i = 0; i < INVEN_PACK; i++)
        {
                o_ptr = &inventory[i];
-               if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (o_ptr->pval == today_mon))
+
+               if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON) && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name)))
                {
                        char buf[MAX_NLEN+20];
                        object_desc(o_name, o_ptr, TRUE, 3);
 #ifdef JP
                        sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
 #else
-                       sprintf(buf, "Convert %s into maney? ",o_name);
+                       sprintf(buf, "Convert %s into money? ",o_name);
 #endif
                        if (get_check(buf))
                        {
@@ -2316,33 +2368,84 @@ static bool kankin(void)
 
        for (j = 0; j < MAX_KUBI; j++)
        {
-               for (i = 0;i <= INVEN_LARM; i++)
+               /* Need reverse order --- Positions will be changed in the loop */
+               for (i = INVEN_PACK-1; i >= 0; i--)
                {
                        o_ptr = &inventory[i];
-                       if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_CORPSE) && (o_ptr->pval == kubi_r_idx[j]))
+                       if ((o_ptr->tval == TV_CORPSE) && (o_ptr->pval == kubi_r_idx[j]))
                        {
                                char buf[MAX_NLEN+20];
+                               int num, k;
+                               object_type forge;
+
                                object_desc(o_name, o_ptr, TRUE, 3);
 #ifdef JP
-                               sprintf(buf, "%s ¤ò´¹¶â¤·¤Þ¤¹¤«¡©",o_name);
+                               sprintf(buf, "%s¤òÅϤ·¤Þ¤¹¤«¡©",o_name);
 #else
-                               sprintf(buf, "Convert %s into maney? ",o_name);
+                               sprintf(buf, "Hand %s over? ",o_name);
 #endif
-                               if (get_check(buf))
-                               {
+                               if (!get_check(buf)) continue;
+
+#if 0 /* Obsorated */
 #ifdef JP
-                                       msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
+                               msg_format("¾Þ¶â %ld¡ð¤ò¼ê¤ËÆþ¤ì¤¿¡£", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
 #else
-                                       msg_format("You get %ldgp.", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
+                               msg_format("You get %ldgp.", (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
 #endif
-                                       p_ptr->au += (r_info[kubi_r_idx[j]].level+1) * 300 * o_ptr->number;
-                                       p_ptr->redraw |= (PR_GOLD);
-                                       inven_item_increase(i, -o_ptr->number);
-                                       inven_item_describe(i);
-                                       inven_item_optimize(i);
-                                       chg_virtue(V_JUSTICE, 5);
-                                       kubi_r_idx[j] += 10000;
+                               p_ptr->au += (r_info[kubi_r_idx[j]].level+1) * 300 * o_ptr->number;
+                               p_ptr->redraw |= (PR_GOLD);
+                               inven_item_increase(i, -o_ptr->number);
+                               inven_item_describe(i);
+                               inven_item_optimize(i);
+                               chg_virtue(V_JUSTICE, 5);
+                               kubi_r_idx[j] += 10000;
+
+                               change = TRUE;
+#endif /* Obsorated */
+
+                               /* Hand it first */
+                               inven_item_increase(i, -o_ptr->number);
+                               inven_item_describe(i);
+                               inven_item_optimize(i);
+
+                               chg_virtue(V_JUSTICE, 5);
+                               kubi_r_idx[j] += 10000;
+
+                               /* Count number of unique corpses already handed */
+                               for (num = 0, k = 0; k < MAX_KUBI; k++)
+                               {
+                                       if (kubi_r_idx[k] >= 10000) num++;
                                }
+
+#ifdef JP
+                               msg_format("¤³¤ì¤Ç¹ç·× %d ¥Ý¥¤¥ó¥È³ÍÆÀ¤·¤Þ¤·¤¿¡£", num);
+#else
+                               msg_format("You earned %d point%s total.", num, (num > 1 ? "s" : ""));
+#endif
+
+                               /* Prepare to make a prize */
+                               object_prep(&forge, lookup_kind(prize_list[num-1].tval, prize_list[num-1].sval));
+                               apply_magic(&forge, object_level, AM_NO_FIXED_ART);
+
+                               /* Identify it fully */
+                               object_aware(&forge);
+                               object_known(&forge);
+
+                               /*
+                                * Hand it --- Assume there is an empty slot.
+                                * Since a corpse is handed at first,
+                                * there is at least one empty slot.
+                                */
+                               (void)inven_carry(&forge);
+
+                               /* Describe the object */
+                               object_desc(o_name, &forge, TRUE, 3);
+#ifdef JP
+                               msg_format("%s ¤òÌã¤Ã¤¿¡£",o_name);
+#else
+                               msg_format("You get %s. ",o_name);
+#endif
+
                                change = TRUE;
                        }
                }
@@ -2358,7 +2461,6 @@ static bool kankin(void)
                msg_print(NULL);
                return FALSE;
        }
-//     msg_print(NULL);
        return TRUE;
 }
 
@@ -2380,49 +2482,33 @@ bool get_nightmare(int r_idx)
 void have_nightmare(int r_idx)
 {
        bool happened = FALSE;
-
-       int power = 100;
-
        monster_race *r_ptr = &r_info[r_idx];
-
+       int power = r_ptr->level + 10;
        char m_name[80];
        cptr desc = r_name + r_ptr->name;
 
-
-       power = r_ptr->level + 10;
-
-#ifdef JP
-        if (0)
-#else
+       /* Describe it */
+#ifndef JP
        if (!(r_ptr->flags1 & RF1_UNIQUE))
-#endif
-
-       {
-               /* Describe it */
                sprintf(m_name, "%s %s", (is_a_vowel(desc[0]) ? "an" : "a"), desc);
-
-               if (r_ptr->flags1 & RF1_FRIENDS)
-               {
-                       power /= 2;
-               }
-       }
        else
-       {
-               /* Describe it */
+#endif
                sprintf(m_name, "%s", desc);
 
-               power *= 2;
+       if (!(r_ptr->flags1 & RF1_UNIQUE))
+       {
+               if (r_ptr->flags1 & RF1_FRIENDS) power /= 2;
        }
+       else power *= 2;
 
        if (saving_throw(p_ptr->skill_sav * 100 / power))
        {
 #ifdef JP
-       msg_format("Ì´¤ÎÃæ¤Ç%s¤ËÄɤ¤¤«¤±¤é¤ì¤¿¡£", m_name);
+               msg_format("Ì´¤ÎÃæ¤Ç%s¤ËÄɤ¤¤«¤±¤é¤ì¤¿¡£", m_name);
 #else
-       msg_format("%^s chases you through your dreams.", m_name);
+               msg_format("%^s chases you through your dreams.", m_name);
 #endif
 
-
                /* Safe */
                return;
        }
@@ -2431,17 +2517,17 @@ void have_nightmare(int r_idx)
        {
                /* Something silly happens... */
 #ifdef JP
-msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª",
+               msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª",
 #else
                msg_format("You behold the %s visage of %s!",
 #endif
 
-                                         funny_desc[rand_int(MAX_SAN_FUNNY)], m_name);
+                                         funny_desc[randint0(MAX_SAN_FUNNY)], m_name);
 
                if (one_in_(3))
                {
-                       msg_print(funny_comments[rand_int(MAX_SAN_COMMENT)]);
-                       p_ptr->image = p_ptr->image + randint(r_ptr->level);
+                       msg_print(funny_comments[randint0(MAX_SAN_COMMENT)]);
+                       p_ptr->image = p_ptr->image + randint1(r_ptr->level);
                }
 
                /* Never mind; we can't see it clearly enough */
@@ -2450,28 +2536,42 @@ msg_format("%s%s
 
        /* Something frightening happens... */
 #ifdef JP
-msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª",
+       msg_format("%s%s¤Î´é¤ò¸«¤Æ¤·¤Þ¤Ã¤¿¡ª",
 #else
        msg_format("You behold the %s visage of %s!",
 #endif
 
-                                 horror_desc[rand_int(MAX_SAN_HORROR)], desc);
+                                 horror_desc[randint0(MAX_SAN_HORROR)], desc);
 
        r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR;
 
-       switch(p_ptr->prace)
+       if (!p_ptr->mimic_form)
        {
-               /* Imps may make a saving throw */
+               switch (p_ptr->prace)
+               {
+               /* Demons may make a saving throw */
                case RACE_IMP:
                case RACE_DEMON:
-               {
                        if (saving_throw(20 + p_ptr->lev)) return;
-               }
+                       break;
                /* Undead may make a saving throw */
                case RACE_SKELETON:
                case RACE_ZOMBIE:
                case RACE_SPECTRE:
                case RACE_VAMPIRE:
+                       if (saving_throw(10 + p_ptr->lev)) return;
+                       break;
+               }
+       }
+       else
+       {
+               /* Demons may make a saving throw */
+               if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON)
+               {
+                       if (saving_throw(20 + p_ptr->lev)) return;
+               }
+               /* Undead may make a saving throw */
+               else if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_UNDEAD)
                {
                        if (saving_throw(10 + p_ptr->lev)) return;
                }
@@ -2482,11 +2582,11 @@ msg_format("%s%s
        {
                if (!p_ptr->resist_conf)
                {
-                       (void)set_confused(p_ptr->confused + rand_int(4) + 4);
+                       (void)set_confused(p_ptr->confused + randint0(4) + 4);
                }
                if (!p_ptr->resist_chaos && one_in_(3))
                {
-                       (void)set_image(p_ptr->image + rand_int(250) + 150);
+                       (void)set_image(p_ptr->image + randint0(250) + 150);
                }
                return;
        }
@@ -2504,11 +2604,11 @@ msg_format("%s%s
        {
                if (!p_ptr->resist_conf)
                {
-                       (void)set_confused(p_ptr->confused + rand_int(4) + 4);
+                       (void)set_confused(p_ptr->confused + randint0(4) + 4);
                }
                if (!p_ptr->free_act)
                {
-                       (void)set_paralyzed(p_ptr->paralyzed + rand_int(4) + 4);
+                       (void)set_paralyzed(p_ptr->paralyzed + randint0(4) + 4);
                }
                while (!saving_throw(p_ptr->skill_sav))
                {
@@ -2520,7 +2620,7 @@ msg_format("%s%s
                }
                if (!p_ptr->resist_chaos)
                {
-                       (void)set_image(p_ptr->image + rand_int(250) + 150);
+                       (void)set_image(p_ptr->image + randint0(250) + 150);
                }
                return;
        }
@@ -2552,7 +2652,7 @@ msg_print("
 
        while (!happened)
        {
-               switch (randint(4))
+               switch (randint1(4))
                {
                        case 1:
                        {
@@ -2672,19 +2772,28 @@ static bool inn_comm(int cmd)
        switch (cmd)
        {
                case BACT_FOOD: /* Buy food & drink */
+                       if (p_ptr->food >= PY_FOOD_FULL)
+                       {
+#ifdef JP
+                               msg_print("º£¤ÏËþÊ¢¤À¡£");
+#else
+                               msg_print("You are full now.");
+#endif
+                               return FALSE;
+                       }
+
 #ifdef JP
 msg_print("¥Ð¡¼¥Æ¥ó¤Ï¤¤¤¯¤é¤«¤Î¿©¤Ùʪ¤È¥Ó¡¼¥ë¤ò¤¯¤ì¤¿¡£");
 #else
                        msg_print("The barkeep gives you some gruel and a beer.");
 #endif
 
-//                     msg_print(NULL);
                        (void)set_food(PY_FOOD_MAX - 1);
                        break;
 
                case BACT_REST: /* Rest for the night */
-                       dawnval = ((turn % (20L * TOWN_DAWN)));
-                       if (dawnval > 50000)
+                       dawnval = ((turn % (TURNS_PER_TICK * TOWN_DAWN)));
+                       if (dawnval > (TURNS_PER_TICK * TOWN_DAWN)/4)
                        {  /* nighttime */
                                if ((p_ptr->poisoned) || (p_ptr->cut))
                                {
@@ -2701,7 +2810,6 @@ msg_print("
                                        msg_print("Sorry, but don't want anyone dying in here.");
 #endif
 
-//                                     return (FALSE);
                                }
                                else
                                {
@@ -2711,11 +2819,11 @@ msg_print("
 #else
                                        do_cmd_write_nikki(NIKKI_BUNSHOU, 0, "stay over night at the inn");
 #endif
-                                       turn = ((turn / 100000) + 1) * 100000;
-                                       if (((oldturn + 5L * TOWN_DAWN) % (20L * TOWN_DAWN)) > 50000L) do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL);
+                                       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;
 
-                                       dungeon_turn += MIN(turn - oldturn, 5000);
+                                       dungeon_turn += MIN(turn - oldturn, TURNS_PER_TICK*250);
 
                                        if (ironman_nightmare)
                                        {
@@ -2764,7 +2872,7 @@ msg_print("
                                                        int i;
                                                        for (i = 0; i < 72; i++)
                                                        {
-                                                               p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*0x10000;
+                                                               p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*EATER_CHARGE;
                                                        }
                                                        for (; i < 108; i++)
                                                        {
@@ -2785,7 +2893,6 @@ msg_print("
 #endif
                                        }
 
-//                                     msg_print(NULL);
                                        p_ptr->leftbldg = TRUE;
                                }
                        }
@@ -2797,7 +2904,6 @@ msg_print("
                                msg_print("The rooms are available only at night.");
 #endif
 
-//                             msg_print(NULL);
                                return (FALSE);
                        }
                        break;
@@ -2812,7 +2918,6 @@ msg_print("
 #endif
 
                                        msg_format("%s", Rumor);
-//                             msg_print(NULL);
                                break;
                        }
        }
@@ -2833,7 +2938,6 @@ msg_format("
        msg_format("You collect %d gold pieces", i);
 #endif
 
-//     msg_print(NULL);
        p_ptr->au += i;
 }
 
@@ -2863,7 +2967,7 @@ static void get_questinfo(int questnum)
        /* Get the quest text */
        init_flags = INIT_SHOW_TEXT | INIT_ASSIGN;
 
-process_dungeon_file("q_info_j.txt", 0, 0, 0, 0);
+       process_dungeon_file("q_info.txt", 0, 0, 0, 0);
 
        /* Reset the old quest number */
        p_ptr->inside_quest = old_quest;
@@ -2971,24 +3075,24 @@ put_str("
                        if (q_ptr->r_idx == 0)
                        {
                                /* Random monster at least 5 - 10 levels out of deep */
-                               q_ptr->r_idx = get_mon_num(q_ptr->level + 4 + randint(6));
+                               q_ptr->r_idx = get_mon_num(q_ptr->level + 4 + randint1(6));
                        }
 
                        r_ptr = &r_info[q_ptr->r_idx];
 
                        while ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->rarity != 1))
                        {
-                               q_ptr->r_idx = get_mon_num(q_ptr->level) + 4 + randint(6);
+                               q_ptr->r_idx = get_mon_num(q_ptr->level) + 4 + randint1(6);
                                r_ptr = &r_info[q_ptr->r_idx];
                        }
 
                        if (q_ptr->max_num == 0)
                        {
                                /* Random monster number */
-                               if (randint(10) > 7)
+                               if (randint1(10) > 7)
                                        q_ptr->max_num = 1;
                                else
-                                       q_ptr->max_num = randint(3) + 1;
+                                       q_ptr->max_num = randint1(3) + 1;
                        }
 
                        q_ptr->cur_num = 0;
@@ -2999,7 +3103,6 @@ msg_format("
                        msg_format("Your quest: kill %d %s", q_ptr->max_num, name);
 #endif
 
-//                     msg_print(NULL);
                }
                else
                {
@@ -3019,7 +3122,7 @@ static void town_history(void)
 
        /* Peruse the building help file */
 #ifdef JP
-(void)show_file(TRUE, "bldg_j.txt", NULL, 0, 0);
+(void)show_file(TRUE, "jbldg.txt", NULL, 0, 0);
 #else
        (void)show_file(TRUE, "bldg.txt", NULL, 0, 0);
 #endif
@@ -3038,11 +3141,15 @@ static void town_history(void)
  * the current +dam of the player.
  */
 static void compare_weapon_aux2(object_type *o_ptr, int numblows,
-                                int r, int c, int mult, char attr[80],
-                                u32b f1, u32b f2, u32b f3, byte color)
+                               int r, int c, int mult, cptr attr,
+                               byte color)
 {
        char tmp_str[80];
 
+       /* Effective dices */
+       int eff_dd = o_ptr->dd + p_ptr->to_dd[0];
+       int eff_ds = o_ptr->ds + p_ptr->to_ds[0];
+
        /* Print the intro text */
        c_put_str(color, attr, r, c);
 
@@ -3053,8 +3160,8 @@ sprintf(tmp_str, "
        sprintf(tmp_str, "Attack: %d-%d damage",
 #endif
 
-           (numblows * (mult * o_ptr->dd /60 + o_ptr->to_d + p_ptr->to_d[0])),
-           (numblows * (mult * o_ptr->ds * o_ptr->dd /60 + o_ptr->to_d + p_ptr->to_d[0])));
+           (numblows * (mult * eff_dd / 60 + o_ptr->to_d + p_ptr->to_d[0])),
+           (numblows * (mult * eff_ds * eff_dd / 60 + o_ptr->to_d + p_ptr->to_d[0])));
 
        /* Print the damage */
        put_str(tmp_str, r, c + 8);
@@ -3070,51 +3177,70 @@ sprintf(tmp_str, "
 static void compare_weapon_aux1(object_type *o_ptr, int col, int r)
 {
        int mult = 60;
-       u32b f1, f2, f3;
+       u32b flgs[TR_FLAG_SIZE];
+       int blow = p_ptr->num_blow[0];
+       bool print_force_weapon = FALSE;
 
        /* Get the flags of the weapon */
-       object_flags(o_ptr, &f1, &f2, &f3);
+       object_flags(o_ptr, flgs);
 
-       if (p_ptr->riding)
+       if ((p_ptr->pclass != CLASS_SAMURAI) && have_flag(flgs, TR_FORCE_WEAPON) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
        {
-               if ((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE)))
-                       mult = mult * (o_ptr->dd + 2) / o_ptr->dd;
+               mult = mult * 7 / 2;
+               print_force_weapon = TRUE;
        }
-       if ((p_ptr->pclass != CLASS_SAMURAI) && (f1 & TR1_FORCE_WEPON) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5))) mult = mult * 7 / 2;
 
        /* Print the relevant lines */
 #ifdef JP
-if (f1 & TR1_FORCE_WEPON)     compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 1*mult, "ÍýÎÏ:", f1, f2, f3, TERM_L_BLUE);
-if (f1 & TR1_SLAY_ANIMAL) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 2*mult, "ưʪ:", f1, f2, f3, TERM_YELLOW);
-if (f1 & TR1_SLAY_EVIL)   compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 2*mult, "¼Ù°­:", f1, f2, f3, TERM_YELLOW);
-if (f1 & TR1_SLAY_UNDEAD) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "ÉÔ»à:", f1, f2, f3, TERM_YELLOW);
-if (f1 & TR1_SLAY_DEMON)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "°­Ëâ:", f1, f2, f3, TERM_YELLOW);
-if (f1 & TR1_SLAY_ORC)    compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "¥ª¡¼¥¯:", f1, f2, f3, TERM_YELLOW);
-if (f1 & TR1_SLAY_TROLL)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "¥È¥í¥ë:", f1, f2, f3, TERM_YELLOW);
-if (f1 & TR1_SLAY_GIANT)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "µð¿Í:", f1, f2, f3, TERM_YELLOW);
-if (f1 & TR1_KILL_DRAGON) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult, "ε:", f1, f2, f3, TERM_YELLOW);
-else if (f1 & TR1_SLAY_DRAGON) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "ε:", f1, f2, f3, TERM_YELLOW);
-if (f1 & TR1_BRAND_ACID)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult/2, "»À°À­:", f1, f2, f3, TERM_RED);
-if (f1 & TR1_BRAND_ELEC)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult/2, "ÅÅ°À­:", f1, f2, f3, TERM_RED);
-if (f1 & TR1_BRAND_FIRE)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult/2, "±ê°À­:", f1, f2, f3, TERM_RED);
-if (f1 & TR1_BRAND_COLD)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult/2, "Îä°À­:", f1, f2, f3, TERM_RED);
-if (f1 & TR1_BRAND_POIS)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult/2, "ÆÇ°À­:", f1, f2, f3, TERM_RED);
-#else
-       if (f1 & TR1_FORCE_WEPON)     compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 1*mult, "Force  :", f1, f2, f3, TERM_L_BLUE);
-       if (f1 & TR1_SLAY_ANIMAL) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 2*mult, "Animals:", f1, f2, f3, TERM_YELLOW);
-       if (f1 & TR1_SLAY_EVIL)   compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 2*mult, "Evil:", f1, f2, f3, TERM_YELLOW);
-       if (f1 & TR1_SLAY_UNDEAD) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Undead:", f1, f2, f3, TERM_YELLOW);
-       if (f1 & TR1_SLAY_DEMON)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Demons:", f1, f2, f3, TERM_YELLOW);
-       if (f1 & TR1_SLAY_ORC)    compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Orcs:", f1, f2, f3, TERM_YELLOW);
-       if (f1 & TR1_SLAY_TROLL)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Trolls:", f1, f2, f3, TERM_YELLOW);
-       if (f1 & TR1_SLAY_GIANT)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Giants:", f1, f2, f3, TERM_YELLOW);
-       if (f1 & TR1_KILL_DRAGON) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 5*mult, "Dragons:", f1, f2, f3, TERM_YELLOW);
-       else if (f1 & TR1_SLAY_DRAGON) compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Dragons:", f1, f2, f3, TERM_YELLOW);
-       if (f1 & TR1_BRAND_ACID)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Acid:", f1, f2, f3, TERM_RED);
-       if (f1 & TR1_BRAND_ELEC)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Elec:", f1, f2, f3, TERM_RED);
-       if (f1 & TR1_BRAND_FIRE)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Fire:", f1, f2, f3, TERM_RED);
-       if (f1 & TR1_BRAND_COLD)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Cold:", f1, f2, f3, TERM_RED);
-       if (f1 & TR1_BRAND_POIS)  compare_weapon_aux2(o_ptr, p_ptr->num_blow[0], r++, col, 3*mult, "Poison:", f1, f2, f3, TERM_RED);
+       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);
 #endif
 
 }
@@ -3146,6 +3272,10 @@ static void list_weapon(object_type *o_ptr, int row, int col)
        char o_name[MAX_NLEN];
        char tmp_str[80];
 
+       /* Effective dices */
+       int eff_dd = o_ptr->dd + p_ptr->to_dd[0];
+       int eff_ds = o_ptr->ds + p_ptr->to_ds[0];
+
        /* Print the weapon name */
        object_desc(o_name, o_ptr, TRUE, 0);
        c_put_str(TERM_YELLOW, o_name, row, col);
@@ -3191,8 +3321,8 @@ sprintf(tmp_str, "
        sprintf(tmp_str, "One Strike: %d-%d damage",
 #endif
 
-           o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0],
-           o_ptr->ds * o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]);
+           eff_dd + o_ptr->to_d + p_ptr->to_d[0],
+           eff_ds * eff_dd + o_ptr->to_d + p_ptr->to_d[0]);
        put_str(tmp_str, row+6, col+1);
 
        /* Damage for the complete attack (if all blows hit) */
@@ -3202,8 +3332,8 @@ sprintf(tmp_str, "
        sprintf(tmp_str, "One Attack: %d-%d damage",
 #endif
 
-           p_ptr->num_blow[0] * (o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]),
-           p_ptr->num_blow[0] * (o_ptr->ds * o_ptr->dd + o_ptr->to_d + p_ptr->to_d[0]));
+           p_ptr->num_blow[0] * (eff_dd + o_ptr->to_d + p_ptr->to_d[0]),
+           p_ptr->num_blow[0] * (eff_ds * eff_dd + o_ptr->to_d + p_ptr->to_d[0]));
        put_str(tmp_str, row+7, col+1);
 }
 
@@ -3264,6 +3394,7 @@ static bool compare_weapons(void)
        object_type *i_ptr;
        cptr q, s;
        int row = 2;
+       bool old_character_xtra = character_xtra;
 
        screen_save();
        /* Clear the screen */
@@ -3327,9 +3458,14 @@ s = "
        if (o1_ptr != i_ptr)
                object_copy(i_ptr, o1_ptr);
 
+       /* Hack -- prevent "icky" message */
+       character_xtra = TRUE;
+
        /* Get the new values */
        calc_bonuses();
 
+       character_xtra = old_character_xtra;
+
        /* List the new values */
        list_weapon(o1_ptr, row, 2);
        compare_weapon_aux1(o1_ptr, 2, row + 8);
@@ -3340,9 +3476,14 @@ s = "
        else
                object_copy(i_ptr, &orig_weapon);
 
+       /* Hack -- prevent "icky" message */
+       character_xtra = TRUE;
+
        /* Get the new values */
        calc_bonuses();
 
+       character_xtra = old_character_xtra;
+
        /* List the new values */
        list_weapon(o2_ptr, row, 40);
        compare_weapon_aux1(o2_ptr, 40, row + 8);
@@ -3376,6 +3517,109 @@ msg_print("
 
 
 /*
+ * Evaluate AC
+ *
+ * AC¤«¤é²óÈòΨ¡¢¥À¥á¡¼¥¸¸º¾¯Î¨¤ò·×»»¤·É½¼¨¤¹¤ë
+ * Calculate and display the dodge-rate and the protection-rate
+ * based on AC
+ */
+static bool eval_ac(int iAC)
+{
+#ifdef JP
+       const char memo[] =
+               "¥À¥á¡¼¥¸·Ú¸ºÎ¨¤È¤Ï¡¢Å¨¤Î¹¶·â¤¬Åö¤¿¤Ã¤¿»þ¤½¤Î¥À¥á¡¼¥¸¤ò\n"
+               "²¿¥Ñ¡¼¥»¥ó¥È·Ú¸º¤¹¤ë¤«¤ò¼¨¤·¤Þ¤¹¡£\n"
+               "¥À¥á¡¼¥¸·Ú¸º¤ÏÄ̾ï¤ÎľÀܹ¶·â(¼ïÎब¡Ö¹¶·â¤¹¤ë¡×¤È¡ÖÊ´ºÕ¤¹¤ë¡×¤Îʪ)\n"
+               "¤ËÂФ·¤Æ¤Î¤ß¸ú²Ì¤¬¤¢¤ê¤Þ¤¹¡£\n \n"
+               "Ũ¤Î¥ì¥Ù¥ë¤È¤Ï¡¢¤½¤ÎŨ¤¬Ä̾ﲿ³¬¤Ë¸½¤ì¤ë¤«¤ò¼¨¤·¤Þ¤¹¡£\n \n"
+               "²óÈòΨ¤ÏŨ¤ÎľÀܹ¶·â¤ò²¿¥Ñ¡¼¥»¥ó¥È¤Î³ÎΨ¤ÇÈò¤±¤ë¤«¤ò¼¨¤·¡¢\n"
+               "Ũ¤Î¥ì¥Ù¥ë¤È¤¢¤Ê¤¿¤ÎAC¤Ë¤è¤Ã¤Æ·èÄꤵ¤ì¤Þ¤¹¡£\n \n"
+               "¥À¥á¡¼¥¸´üÂÔÃͤȤϡ¢Å¨¤Î£±£°£°¥Ý¥¤¥ó¥È¤ÎÄ̾ﹶ·â¤ËÂФ·¡¢\n"
+               "²óÈòΨ¤È¥À¥á¡¼¥¸·Ú¸ºÎ¨¤ò¹Íθ¤·¤¿¥À¥á¡¼¥¸¤Î´üÂÔÃͤò¼¨¤·¤Þ¤¹¡£\n";
+#else
+       const char memo[] =
+               "'Protection Rate' means how much damage is reduced by your armor.\n"
+               "Note that the Protection rate is effective only against normal "
+               "'attack' and 'shatter' type melee attacks, "
+               "and has no effect against any other types such as 'poison'.\n \n"
+               "'Dodge Rate' indicates the success rate on dodging the "
+               "monster's melee attacks.  "
+               "It is depend on the level of the monster and your AC.\n \n"
+               "'Average Damage' indicates the expected amount of damage "
+               "when you are attacked by normal melee attacks with power=100.";
+#endif
+
+       int protection;
+       int col, row = 2;
+       int lvl;
+       char buf[80*20], *t;
+
+       /* AC lower than zero has no effect */
+       if (iAC < 0) iAC = 0;
+
+       /* ¥À¥á¡¼¥¸·Ú¸ºÎ¨¤ò·×»» */
+       protection = 100 * MIN(iAC, 150) / 250;
+
+       screen_save();
+       clear_bldg(0, 22);
+
+#ifdef JP
+       put_str(format("¤¢¤Ê¤¿¤Î¸½ºß¤ÎAC: %3d", iAC), row++, 0);
+       put_str(format("¥À¥á¡¼¥¸·Ú¸ºÎ¨  : %3d%%", protection), row++, 0);
+       row++;
+
+       put_str("Ũ¤Î¥ì¥Ù¥ë      :", row + 0, 0);
+       put_str("²óÈòΨ          :", row + 1, 0);
+       put_str("¥À¥á¡¼¥¸´üÂÔÃÍ  :", row + 2, 0);
+#else
+       put_str(format("Your current AC : %3d", iAC), row++, 0);
+       put_str(format("Protection rate : %3d%%", protection), row++, 0);
+       row++;
+
+       put_str("Level of Monster:", row + 0, 0);
+       put_str("Dodge Rate      :", row + 1, 0);
+       put_str("Average Damage  :", row + 2, 0);
+#endif
+    
+       for (col = 17 + 1, lvl = 0; lvl <= 100; lvl += 10, col += 5)
+       {
+               int quality = 60 + lvl * 3; /* attack quality with power 60 */
+               int dodge;   /* ²óÈòΨ(%) */
+               int average; /* ¥À¥á¡¼¥¸´üÂÔÃÍ */
+
+               put_str(format("%3d", lvl), row + 0, col);
+
+               /* ²óÈòΨ¤ò·×»» */
+               dodge = 5 + (MIN(100, 100 * (iAC * 3 / 4) / quality) * 9 + 5) / 10;
+               put_str(format("%3d%%", dodge), row + 1, col);
+
+               /* 100ÅÀ¤Î¹¶·â¤ËÂФ·¤Æ¤Î¥À¥á¡¼¥¸´üÂÔÃͤò·×»» */
+               average = (100 - dodge) * (100 - protection) / 100;
+               put_str(format("%3d", average), row + 2, col);
+       }
+
+       /* Display note */
+       roff_to_buf(memo, 70, buf, sizeof(buf));
+       for (t = buf; t[0]; t += strlen(t) + 1)
+               put_str(t, (row++) + 4, 4);
+
+#ifdef JP
+       prt("¸½ºß¤Î¤¢¤Ê¤¿¤ÎÁõÈ÷¤«¤é¤¹¤ë¤È¡¢¤¢¤Ê¤¿¤ÎËɸæÎϤÏ"
+                  "¤³¤ì¤¯¤é¤¤¤Ç¤¹:", 0, 0);
+#else
+       prt("Defense abilities from your current Armor Class are evaluated below.", 0, 0);
+#endif
+  
+       flush();
+       (void)inkey();
+       screen_load();
+
+       /* Done */
+       return (TRUE);
+}
+
+
+/*
  * Enchant item
  */
 static bool enchant_item(int cost, int to_hit, int to_dam, int to_ac)
@@ -3423,7 +3667,6 @@ msg_format("%s
                msg_format("You do not have the gold to improve %s!", tmp_str);
 #endif
 
-//             msg_print(NULL);
                return (FALSE);
        }
 
@@ -3491,8 +3734,6 @@ msg_format("
                msg_format("Improved %s for %d gold.", tmp_str, cost * o_ptr->number);
 #endif
 
-//             msg_print(NULL);
-
                /* Charge the money */
                p_ptr->au -= (cost * o_ptr->number);
 
@@ -3633,7 +3874,6 @@ msg_format("
                        msg_format("That doesn't need to be recharged.");
 #endif
 
-//                     msg_print(NULL);
                        return;
                }
        }
@@ -3674,7 +3914,6 @@ msg_print("
                        msg_print("This wand is already fully charged.");
 #endif
                }
-//             msg_print(NULL);
                return;
        }
        else if (o_ptr->tval == TV_STAFF && o_ptr->pval >= k_ptr->pval)
@@ -3695,7 +3934,6 @@ msg_print("
                        msg_print("This staff is already fully charged.");
 #endif
                }
-//             msg_print(NULL);
                return;
        }
 
@@ -3709,7 +3947,6 @@ msg_format("%s
                msg_format("You need %d gold to recharge %s!", price, tmp_str);
 #endif
 
-//             msg_print(NULL);
                return;
        }
 
@@ -3746,7 +3983,7 @@ charges = get_quantity(format("
                charges = get_quantity(format("Add how many charges for %d gold? ",
 #endif
 
-                             price), MIN(p_ptr->au / price, max_charges));
+                             price), MIN(p_ptr->au / price, max_charges));
 
                /* Do nothing */
                if (charges < 1) return;
@@ -3769,8 +4006,6 @@ msg_format("%s
        msg_format("%^s %s recharged for %d gold.", tmp_str, ((o_ptr->number > 1) ? "were" : "was"), price);
 #endif
 
-//     msg_print(NULL);
-
        /* Combine / Reorder the pack (later) */
        p_ptr->notice |= (PN_COMBINE | PN_REORDER);
 
@@ -3806,7 +4041,7 @@ static void building_recharge_all(void)
 
 
        /* Display some info */
-        msg_flag = FALSE;
+       msg_flag = FALSE;
        clear_bldg(4, 18);
 #ifdef JP
        prt("  ºÆ½¼Å¶¤ÎÈñÍѤϥ¢¥¤¥Æ¥à¤Î¼ïÎà¤Ë¤è¤ê¤Þ¤¹¡£", 6, 0);
@@ -4040,6 +4275,306 @@ bool tele_town(void)
 
 
 /*
+ *  research_mon
+ *  -KMW-
+ */
+static bool research_mon(void)
+{
+       int i, n, r_idx;
+       char sym, query;
+       char buf[128];
+
+       bool notpicked;
+
+       bool recall = FALSE;
+
+       u16b why = 0;
+
+       u16b    *who;
+
+       /* XTRA HACK WHATSEARCH */
+       bool    all = FALSE;
+       bool    uniq = FALSE;
+       bool    norm = FALSE;
+       char temp[80] = "";
+
+       /* XTRA HACK REMEMBER_IDX */
+       static int old_sym = '\0';
+       static int old_i = 0;
+
+
+       /* Save the screen */
+       screen_save();
+
+       /* Get a character, or abort */
+#ifdef JP
+if (!get_com("¥â¥ó¥¹¥¿¡¼¤Îʸ»ú¤òÆþÎϤ·¤Æ²¼¤µ¤¤(µ­¹æ or ^AÁ´,^U¥æ,^NÈó¥æ,^M̾Á°):", &sym, FALSE)) 
+#else
+       if (!get_com("Enter character to be identified(^A:All,^U:Uniqs,^N:Non uniqs,^M:Name): ", &sym, FALSE))
+#endif
+
+       {
+               /* Restore */
+               screen_load();
+
+               return (FALSE);
+       }
+
+       /* Find that character info, and describe it */
+       for (i = 0; ident_info[i]; ++i)
+       {
+               if (sym == ident_info[i][0]) break;
+       }
+
+               /* XTRA HACK WHATSEARCH */
+       if (sym == KTRL('A'))
+       {
+               all = TRUE;
+#ifdef JP
+               strcpy(buf, "Á´¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È");
+#else
+               strcpy(buf, "Full monster list.");
+#endif
+       }
+       else if (sym == KTRL('U'))
+       {
+               all = uniq = TRUE;
+#ifdef JP
+               strcpy(buf, "¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È");
+#else
+               strcpy(buf, "Unique monster list.");
+#endif
+       }
+       else if (sym == KTRL('N'))
+       {
+               all = norm = TRUE;
+#ifdef JP
+               strcpy(buf, "¥æ¥Ë¡¼¥¯³°¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È");
+#else
+               strcpy(buf, "Non-unique monster list.");
+#endif
+       }
+       else if (sym == KTRL('M'))
+       {
+               all = TRUE;
+#ifdef JP
+               if (!get_string("̾Á°(±Ñ¸ì¤Î¾ì¹ç¾®Ê¸»ú¤Ç²Ä)",temp, 70))
+#else
+               if (!get_string("Enter name:",temp, 70))
+#endif
+               {
+                       temp[0]=0;
+
+                       /* Restore */
+                       screen_load();
+
+                       return FALSE;
+               }
+#ifdef JP
+               sprintf(buf, "̾Á°:%s¤Ë¥Þ¥Ã¥Á",temp);
+#else
+               sprintf(buf, "Monsters with a name \"%s\"",temp);
+#endif
+       }
+       else if (ident_info[i])
+       {
+               sprintf(buf, "%c - %s.", sym, ident_info[i] + 2);
+       }
+       else
+       {
+#ifdef JP
+sprintf(buf, "%c - %s", sym, "̵¸ú¤Êʸ»ú");
+#else
+               sprintf(buf, "%c - %s.", sym, "Unknown Symbol");
+#endif
+
+       }
+
+       /* Display the result */
+       prt(buf, 16, 10);
+
+
+       /* Allocate the "who" array */
+       C_MAKE(who, max_r_idx, u16b);
+
+       /* Collect matching monsters */
+       for (n = 0, i = 1; i < max_r_idx; i++)
+       {
+               monster_race *r_ptr = &r_info[i];
+
+               /* Empty monster */
+               if (!r_ptr->name) continue;
+
+               /* XTRA HACK WHATSEARCH */
+               /* Require non-unique monsters if needed */
+               if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue;
+
+               /* Require unique monsters if needed */
+               if (uniq && !(r_ptr->flags1 & (RF1_UNIQUE))) continue;
+
+               /* Ì¾Á°¸¡º÷ */
+               if (temp[0])
+               {
+                       int xx;
+                       char temp2[80];
+
+                       for (xx = 0; temp[xx] && xx < 80; xx++)
+                       {
+#ifdef JP
+                               if (iskanji(temp[xx]))
+                               {
+                                       xx++;
+                                       continue;
+                               }
+#endif
+                               if (isupper(temp[xx])) temp[xx] = tolower(temp[xx]);
+                       }
+  
+#ifdef JP
+                       strcpy(temp2, r_name + r_ptr->E_name);
+#else
+                       strcpy(temp2, r_name + r_ptr->name);
+#endif
+                       for (xx = 0; temp2[xx] && xx < 80; xx++)
+                               if (isupper(temp2[xx])) temp2[xx] = tolower(temp2[xx]);
+
+#ifdef JP
+                       if (strstr(temp2, temp) || strstr_j(r_name + r_ptr->name, temp))
+#else
+                       if (strstr(temp2, temp))
+#endif
+                               who[n++] = i;
+               }
+               else if (all || (r_ptr->d_char == sym)) who[n++] = i;
+       }
+
+       /* Nothing to recall */
+       if (!n)
+       {
+               /* Free the "who" array */
+               C_KILL(who, max_r_idx, u16b);
+
+               /* Restore */
+               screen_load();
+
+               return (FALSE);
+       }
+
+       /* Sort by level */
+       why = 2;
+       query = 'y';
+
+       /* Sort if needed */
+       if (why)
+       {
+               /* Select the sort method */
+               ang_sort_comp = ang_sort_comp_hook;
+               ang_sort_swap = ang_sort_swap_hook;
+
+               /* Sort the array */
+               ang_sort(who, &why, n);
+       }
+
+
+       /* Start at the end */
+       /* XTRA HACK REMEMBER_IDX */
+       if (old_sym == sym && old_i < n) i = old_i;
+       else i = n - 1;
+
+       notpicked = TRUE;
+
+       /* Scan the monster memory */
+       while (notpicked)
+       {
+               /* Extract a race */
+               r_idx = who[i];
+
+               /* Hack -- Begin the prompt */
+               roff_top(r_idx);
+
+               /* Hack -- Complete the prompt */
+#ifdef JP
+Term_addstr(-1, TERM_WHITE, " ['r'»×¤¤½Ð, ' '¤Ç³¹Ô, ESC]");
+#else
+               Term_addstr(-1, TERM_WHITE, " [(r)ecall, ESC, space to continue]");
+#endif
+
+
+               /* Interact */
+               while (1)
+               {
+                       /* Recall */
+                       if (recall)
+                       {
+                               /*** Recall on screen ***/
+
+                               /* Get maximal info about this monster */
+                               lore_do_probe(r_idx);
+
+                               /* Save this monster ID */
+                               monster_race_track(r_idx);
+
+                               /* Hack -- Handle stuff */
+                               handle_stuff();
+
+                               /* know every thing mode */
+                               screen_roff(r_idx, 0x01);
+                               notpicked = FALSE;
+
+                               /* XTRA HACK REMEMBER_IDX */
+                               old_sym = sym;
+                               old_i = i;
+                       }
+
+                       /* Command */
+                       query = inkey();
+
+                       /* Normal commands */
+                       if (query != 'r') break;
+
+                       /* Toggle recall */
+                       recall = !recall;
+               }
+
+               /* Stop scanning */
+               if (query == ESCAPE) break;
+
+               /* Move to "prev" monster */
+               if (query == '-')
+               {
+                       if (++i == n)
+                       {
+                               i = 0;
+                               if (!expand_list) break;
+                       }
+               }
+
+               /* Move to "next" monster */
+               else
+               {
+                       if (i-- == 0)
+                       {
+                               i = n - 1;
+                               if (!expand_list) break;
+                       }
+               }
+       }
+
+
+       /* Re-display the identity */
+       /* prt(buf, 5, 5);*/
+
+       /* Free the "who" array */
+       C_KILL(who, max_r_idx, u16b);
+
+       /* Restore */
+       screen_load();
+
+       return (!notpicked);
+}
+
+
+/*
  * Execute a building command
  */
 static void bldg_process_command(building_type *bldg, int i)
@@ -4047,7 +4582,6 @@ static void bldg_process_command(building_type *bldg, int i)
        int bact = bldg->actions[i];
        int bcost;
        bool paid = FALSE;
-       bool set_reward = FALSE;
        int amt;
 
        /* Flush messages XXX XXX XXX */
@@ -4068,8 +4602,6 @@ msg_print("
 #else
                msg_print("You have no right to choose that!");
 #endif
-
-//             msg_print(NULL);
                return;
        }
 
@@ -4083,302 +4615,296 @@ msg_print("
 #else
                msg_print("You do not have the gold!");
 #endif
-
-//             msg_print(NULL);
                return;
        }
 
-       if (!bcost) set_reward = TRUE;
-
-#ifdef USE_SCRIPT
-
-       if (building_command_callback(cave[py][px].feat - FEAT_BLDG_HEAD, i))
-       {
-               /* Script paid the price */
-               paid = TRUE;
-       }
-       else
-
-#endif /* USE_SCRIPT */
-
+       switch (bact)
        {
-               switch (bact)
-               {
-                       case BACT_NOTHING:
-                               /* Do nothing */
-                               break;
-                       case BACT_RESEARCH_ITEM:
-                               paid = identify_fully(FALSE);
-                               break;
-                       case BACT_TOWN_HISTORY:
-                               town_history();
-                               break;
-                       case BACT_RACE_LEGENDS:
-                               race_legends();
-                               break;
-                       case BACT_QUEST:
-                               castle_quest();
-                               break;
-                       case BACT_KING_LEGENDS:
-                       case BACT_ARENA_LEGENDS:
-                       case BACT_LEGENDS:
-                               show_highclass(building_loc);
-                               break;
-                       case BACT_POSTER:
-                       case BACT_ARENA_RULES:
-                       case BACT_ARENA:
-                               arena_comm(bact);
-                               break;
-                       case BACT_IN_BETWEEN:
-                       case BACT_CRAPS:
-                       case BACT_SPIN_WHEEL:
-                       case BACT_DICE_SLOTS:
-                       case BACT_GAMBLE_RULES:
-                       case BACT_POKER:
-                               gamble_comm(bact);
-                               break;
-                       case BACT_REST:
-                       case BACT_RUMORS:
-                       case BACT_FOOD:
-                               paid = inn_comm(bact);
-                               break;
-                       case BACT_RESEARCH_MONSTER:
-                               paid = research_mon();
-                               break;
-                       case BACT_COMPARE_WEAPONS:
-                               paid = compare_weapons();
-                               break;
-                       case BACT_ENCHANT_WEAPON:
-                               item_tester_hook = item_tester_hook_melee_weapon;
-                               enchant_item(bcost, 1, 1, 0);
-                               break;
-                       case BACT_ENCHANT_ARMOR:
-                               item_tester_hook = item_tester_hook_armour;
-                               enchant_item(bcost, 0, 0, 1);
-                               break;
-                       case BACT_RECHARGE:
-                               building_recharge();
-                               break;
-                       case BACT_RECHARGE_ALL:
-                               building_recharge_all();
-                               break;
-                       case BACT_IDENTS: /* needs work */
+       case BACT_NOTHING:
+               /* Do nothing */
+               break;
+       case BACT_RESEARCH_ITEM:
+               paid = identify_fully(FALSE);
+               break;
+       case BACT_TOWN_HISTORY:
+               town_history();
+               break;
+       case BACT_RACE_LEGENDS:
+               race_legends();
+               break;
+       case BACT_QUEST:
+               castle_quest();
+               break;
+       case BACT_KING_LEGENDS:
+       case BACT_ARENA_LEGENDS:
+       case BACT_LEGENDS:
+               show_highclass();
+               break;
+       case BACT_POSTER:
+       case BACT_ARENA_RULES:
+       case BACT_ARENA:
+               arena_comm(bact);
+               break;
+       case BACT_IN_BETWEEN:
+       case BACT_CRAPS:
+       case BACT_SPIN_WHEEL:
+       case BACT_DICE_SLOTS:
+       case BACT_GAMBLE_RULES:
+       case BACT_POKER:
+               gamble_comm(bact);
+               break;
+       case BACT_REST:
+       case BACT_RUMORS:
+       case BACT_FOOD:
+               paid = inn_comm(bact);
+               break;
+       case BACT_RESEARCH_MONSTER:
+               paid = research_mon();
+               break;
+       case BACT_COMPARE_WEAPONS:
+               paid = compare_weapons();
+               break;
+       case BACT_ENCHANT_WEAPON:
+               item_tester_hook = item_tester_hook_melee_weapon;
+               enchant_item(bcost, 1, 1, 0);
+               break;
+       case BACT_ENCHANT_ARMOR:
+               item_tester_hook = item_tester_hook_armour;
+               enchant_item(bcost, 0, 0, 1);
+               break;
+       case BACT_RECHARGE:
+               building_recharge();
+               break;
+       case BACT_RECHARGE_ALL:
+               building_recharge_all();
+               break;
+       case BACT_IDENTS: /* needs work */
 #ifdef JP
-                               if (!get_check("»ý¤Áʪ¤òÁ´¤Æ´ÕÄꤷ¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©")) break;
-                               identify_pack();
-                               msg_print(" »ý¤ÁʪÁ´¤Æ¤¬´ÕÄꤵ¤ì¤Þ¤·¤¿¡£");
+               if (!get_check("»ý¤Áʪ¤òÁ´¤Æ´ÕÄꤷ¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©")) break;
+               identify_pack();
+               msg_print(" »ý¤ÁʪÁ´¤Æ¤¬´ÕÄꤵ¤ì¤Þ¤·¤¿¡£");
 #else
-                               if (!get_check("Do you pay for identify all your possession? ")) break;
-                               identify_pack();
-                               msg_print("Your possessions have been identified.");
+               if (!get_check("Do you pay for identify all your possession? ")) break;
+               identify_pack();
+               msg_print("Your possessions have been identified.");
 #endif
 
-                               paid = TRUE;
-                               break;
-                       case BACT_IDENT_ONE: /* needs work */
-                               paid = ident_spell(FALSE);
-                               break;
-                       case BACT_LEARN:
-                               do_cmd_study();
-                               break;
-                       case BACT_HEALING: /* needs work */
-                               hp_player(200);
-                               set_poisoned(0);
-                               set_blind(0);
-                               set_confused(0);
-                               set_cut(0);
-                               set_stun(0);
-                               paid = TRUE;
-                               break;
-                       case BACT_RESTORE: /* needs work */
-                               if (do_res_stat(A_STR)) paid = TRUE;
-                               if (do_res_stat(A_INT)) paid = TRUE;
-                               if (do_res_stat(A_WIS)) paid = TRUE;
-                               if (do_res_stat(A_DEX)) paid = TRUE;
-                               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
-                               {
+               paid = TRUE;
+               break;
+       case BACT_IDENT_ONE: /* needs work */
+               paid = ident_spell(FALSE);
+               break;
+       case BACT_LEARN:
+               do_cmd_study();
+               break;
+       case BACT_HEALING: /* needs work */
+               hp_player(200);
+               set_poisoned(0);
+               set_blind(0);
+               set_confused(0);
+               set_cut(0);
+               set_stun(0);
+               paid = TRUE;
+               break;
+       case BACT_RESTORE: /* needs work */
+               if (do_res_stat(A_STR)) paid = TRUE;
+               if (do_res_stat(A_INT)) paid = TRUE;
+               if (do_res_stat(A_WIS)) paid = TRUE;
+               if (do_res_stat(A_DEX)) paid = TRUE;
+               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("º£Æü¤Îʬ¤±Á°¤Ï¤¹¤Ç¤Ë»Ùʧ¤Ã¤¿¤¾¡ª");
+                       msg_print("º£Æü¤Îʬ¤±Á°¤Ï¤¹¤Ç¤Ë»Ùʧ¤Ã¤¿¤¾¡ª");
 #else
-                                       msg_print("You just had your daily allowance!");
+                       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);
+               break;
+       case BACT_ENCHANT_BOW:
+               item_tester_tval = TV_BOW;
+               enchant_item(bcost, 1, 1, 0);
+               break;
+       case BACT_RECALL:
+               if (recall_player(1)) paid = TRUE;
+               break;
+       case BACT_TELEPORT_LEVEL:
+       {
+               int select_dungeon;
+               int i, num = 0;
+               s16b *dun;
+               int max_depth;
 
-//                                     msg_print(NULL);
-                               }
-                               break;
-                       case BACT_ENCHANT_ARROWS:
-                               item_tester_hook = item_tester_hook_ammo;
-                               enchant_item(bcost, 1, 1, 0);
-                               break;
-                       case BACT_ENCHANT_BOW:
-                               item_tester_tval = TV_BOW;
-                               enchant_item(bcost, 1, 1, 0);
-                               break;
-                       case BACT_RECALL:
-                               if (recall_player(1)) paid = TRUE;
-                               break;
-                       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);
+               /* Allocate the "dun" array */
+               C_MAKE(dun, max_d_idx, s16b);
 
-                               screen_save();
-                               clear_bldg(4, 20);
+               screen_save();
+               clear_bldg(4, 20);
 
-                               for(i = 1; i < max_d_idx; i++)
-                               {
-                                       char buf[80];
-                                       bool seiha = FALSE;
+               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;
+                       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]);
+                       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]);
+                       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++;
-                               }
+                       put_str(buf, 4+num, 5);
+                       dun[num] = i;
+                       num++;
+               }
 #ifdef JP
-                               prt("¤É¤Î¥À¥ó¥¸¥ç¥ó¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«:", 0, 0);
+               prt("¤É¤Î¥À¥ó¥¸¥ç¥ó¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«:", 0, 0);
 #else
-                               prt("Which dungeon do you teleport?: ", 0, 0);
+               prt("Which dungeon do you teleport?: ", 0, 0);
 #endif
-                               while(1)
-                               {
-                                       i = inkey();
+               while(1)
+               {
+                       i = inkey();
+
+                       if (i == ESCAPE)
+                       {
+                               /* Free the "dun" array */
+                               C_KILL(dun, max_d_idx, s16b);
 
-                                       if (i == ESCAPE)
-                                       {
-                                               screen_load();
-                                               return;
-                                       }
-                                       if (i >= 'a' && i <('a'+num))
-                                       {
-                                               select_dungeon = dun[i-'a'];
-                                               break;
-                                       }
-                                       else bell();
-                               }
                                screen_load();
+                               return;
+                       }
+                       if (i >= 'a' && i <('a'+num))
+                       {
+                               select_dungeon = dun[i-'a'];
+                               break;
+                       }
+                       else bell();
+               }
+               screen_load();
 
-                               max_depth = d_info[select_dungeon].maxdepth;
+               /* Free the "dun" array */
+               C_KILL(dun, max_d_idx, s16b);
 
-                               /* Limit depth in Angband */
-                               if (select_dungeon == DUNGEON_ANGBAND)
-                               {
-                                       if (quest[QUEST_OBERON].status != QUEST_STATUS_FINISHED) max_depth = 98;
-                                       else if(quest[QUEST_SERPENT].status != QUEST_STATUS_FINISHED) max_depth = 99;
-                               }
+               max_depth = d_info[select_dungeon].maxdepth;
+
+               /* Limit depth in Angband */
+               if (select_dungeon == DUNGEON_ANGBAND)
+               {
+                       if (quest[QUEST_OBERON].status != QUEST_STATUS_FINISHED) max_depth = 98;
+                       else if(quest[QUEST_SERPENT].status != QUEST_STATUS_FINISHED) max_depth = 99;
+               }
 
 #ifdef JP
-amt = get_quantity(format("%s¤Î²¿³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©", d_name + d_info[select_dungeon].name), max_depth);
+               amt = get_quantity(format("%s¤Î²¿³¬¤Ë¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©", d_name + d_info[select_dungeon].name), max_depth);
 #else
-amt = get_quantity(format("Teleport to which level of %s? ", d_name + d_info[select_dungeon].name), max_depth);
+               amt = get_quantity(format("Teleport to which level of %s? ", d_name + d_info[select_dungeon].name), max_depth);
 #endif
 
-                               if (amt > 0)
-                               {
-                                       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 (amt > 0)
+               {
+                       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)
 #ifdef JP
-                                               do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, "¥È¥é¥ó¥×¥¿¥ï¡¼¤Ç");
+                               do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, "¥È¥é¥ó¥×¥¿¥ï¡¼¤Ç");
 #else
-                                               do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, "at Trump Tower");
+                       do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, "at Trump Tower");
 #endif
 #ifdef JP
-msg_print("²ó¤ê¤ÎÂ絤¤¬Ä¥¤ê¤Ä¤á¤Æ¤­¤¿...");
+                       msg_print("²ó¤ê¤ÎÂ絤¤¬Ä¥¤ê¤Ä¤á¤Æ¤­¤¿...");
 #else
-                                       msg_print("The air about you becomes charged...");
+                       msg_print("The air about you becomes charged...");
 #endif
 
-                                       paid = TRUE;
-                                       p_ptr->redraw |= (PR_STATUS);
-                               }
-                               break;
-                       }
-                       case BACT_LOSE_MUTATION:
-                               paid = lose_mutation(0);
-                               /* ToDo: Better message text. */
-                               if (!paid)
+                       paid = TRUE;
+                       p_ptr->redraw |= (PR_STATUS);
+               }
+               break;
+       }
+       case BACT_LOSE_MUTATION:
+               if (p_ptr->muta1 || p_ptr->muta2 || p_ptr->muta3)
+               {
+                       while(!lose_mutation(0));
+                       paid = TRUE;
+               }
+               else
+               {
 #ifdef JP
-msg_print("´ñ̯¤Ê¤¯¤é¤¤ÉáÄ̤ˤʤ俵¤¤¬¤¹¤ë¡£");
+                       msg_print("¼£¤¹¤Ù¤­ÆÍÁ³ÊÑ°Û¤¬Ìµ¤¤¡£");
 #else
-                                       msg_print("You feel oddly normal.");
+                       msg_print("You have no mutations.");
 #endif
-
-
-                               break;
-                       case BACT_BATTLE:
-                               kakutoujou();
-                               break;
-                       case BACT_TSUCHINOKO:
-                               tsuchinoko();
-                               break;
-                       case BACT_KUBI:
-                               shoukinkubi();
-                               break;
-                       case BACT_TARGET:
-                               today_target();
-                               break;
-                       case BACT_KANKIN:
-                               kankin();
-                               break;
-                       case BACT_HEIKOUKA:
-#ifdef JP
-msg_print("Ê¿¹Õ²½¤Îµ·¼°¤ò¹Ô¤Ê¤Ã¤¿¡£");
-#else
- msg_print("You received an equalization ritual.");
-#endif
-                               set_virtue(V_COMPASSION, 0);
-                               set_virtue(V_HONOUR, 0);
-                               set_virtue(V_JUSTICE, 0);
-                               set_virtue(V_SACRIFICE, 0);
-                               set_virtue(V_KNOWLEDGE, 0);
-                               set_virtue(V_FAITH, 0);
-                               set_virtue(V_ENLIGHTEN, 0);
-                               set_virtue(V_ENCHANT, 0);
-                               set_virtue(V_CHANCE, 0);
-                               set_virtue(V_NATURE, 0);
-                               set_virtue(V_HARMONY, 0);
-                               set_virtue(V_VITALITY, 0);
-                               set_virtue(V_UNLIFE, 0);
-                               set_virtue(V_PATIENCE, 0);
-                               set_virtue(V_TEMPERANCE, 0);
-                               set_virtue(V_DILIGENCE, 0);
-                               set_virtue(V_VALOUR, 0);
-                               set_virtue(V_INDIVIDUALISM, 0);
-                               get_virtues();
-                               paid = TRUE;
-                               break;
-                       case BACT_TELE_TOWN:
-                               paid = tele_town();
-                               break;
+                       msg_print(NULL);
                }
+               break;
+       case BACT_BATTLE:
+               kakutoujou();
+               break;
+       case BACT_TSUCHINOKO:
+               tsuchinoko();
+               break;
+       case BACT_KUBI:
+               shoukinkubi();
+               break;
+       case BACT_TARGET:
+               today_target();
+               break;
+       case BACT_KANKIN:
+               kankin();
+               break;
+       case BACT_HEIKOUKA:
+#ifdef JP
+               msg_print("Ê¿¹Õ²½¤Îµ·¼°¤ò¹Ô¤Ê¤Ã¤¿¡£");
+#else
+               msg_print("You received an equalization ritual.");
+#endif
+               set_virtue(V_COMPASSION, 0);
+               set_virtue(V_HONOUR, 0);
+               set_virtue(V_JUSTICE, 0);
+               set_virtue(V_SACRIFICE, 0);
+               set_virtue(V_KNOWLEDGE, 0);
+               set_virtue(V_FAITH, 0);
+               set_virtue(V_ENLIGHTEN, 0);
+               set_virtue(V_ENCHANT, 0);
+               set_virtue(V_CHANCE, 0);
+               set_virtue(V_NATURE, 0);
+               set_virtue(V_HARMONY, 0);
+               set_virtue(V_VITALITY, 0);
+               set_virtue(V_UNLIFE, 0);
+               set_virtue(V_PATIENCE, 0);
+               set_virtue(V_TEMPERANCE, 0);
+               set_virtue(V_DILIGENCE, 0);
+               set_virtue(V_VALOUR, 0);
+               set_virtue(V_INDIVIDUALISM, 0);
+               get_virtues();
+               paid = TRUE;
+               break;
+       case BACT_TELE_TOWN:
+               paid = tele_town();
+               break;
+       case BACT_EVAL_AC:
+               paid = eval_ac(p_ptr->dis_ac + p_ptr->dis_to_a);
+               break;
        }
 
        if (paid)
@@ -4421,23 +4947,7 @@ msg_print("
                p_ptr->oldpy = 0;
                p_ptr->oldpx = 0;
 
-               leaving_quest = p_ptr->inside_quest;
-
-               /* Leaving an 'only once' quest marks it as failed */
-               if (leaving_quest &&
-                       ((quest[leaving_quest].flags & QUEST_FLAG_ONCE) || (quest[leaving_quest].type == QUEST_TYPE_RANDOM)) &&
-                       (quest[leaving_quest].status == QUEST_STATUS_TAKEN))
-               {
-                       quest[leaving_quest].status = QUEST_STATUS_FAILED;
-                       quest[leaving_quest].complev = p_ptr->lev;
-                       if (quest[leaving_quest].type == QUEST_TYPE_RANDOM)
-                       {
-                               r_info[quest[leaving_quest].r_idx].flags1 &= ~(RF1_QUESTOR);
-                               do_cmd_write_nikki(NIKKI_RAND_QUEST_F, leaving_quest, NULL);
-                       }
-                       else if (record_fix_quest)
-                               do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL);
-               }
+               leave_quest_check();
 
                p_ptr->inside_quest = cave[py][px].special;
                if(quest[leaving_quest].type != QUEST_TYPE_RANDOM) dun_level = 1;
@@ -4480,12 +4990,12 @@ msg_print("
        /* Don't re-init the wilderness */
        reinit_wilderness = FALSE;
 
-       if ((which == 2) && (p_ptr->arena_number == 99))
+       if ((which == 2) && (p_ptr->arena_number < 0))
        {
 #ifdef JP
 msg_print("¡ÖÇÔ¼Ô¤ËÍѤϤʤ¤¡£¡×");
 #else
-               msg_print("'There is no place for LOSER.'");
+               msg_print("'There's no place here for a LOSER like you!'");
 #endif
                return;
        }
@@ -4652,12 +5162,27 @@ void quest_discovery(int q_idx)
        if (q_num == 1)
        {
                /* Unique */
+
+               /* Hack -- "unique" monsters must be "unique" */
+               if ((r_ptr->flags1 & RF1_UNIQUE) &&
+                   (0 == r_ptr->max_num))
+               {
 #ifdef JP
-msg_format("Ãí°Õ¤»¤è¡ª¤³¤Î³¬¤Ï%s¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤ë¡ª", name);
+                       msg_print("¤³¤Î³¬¤Ï°ÊÁ°¤Ï狼¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤¿¤è¤¦¤À¡Ä¡£");
 #else
-               msg_format("Beware, this level is protected by %s!", name);
+                       msg_print("It seems that this level was protected by someone before...");
 #endif
-
+                       /* The unique is already dead */
+                       quest[q_idx].status = QUEST_STATUS_FINISHED;
+               }
+               else
+               {
+#ifdef JP
+                       msg_format("Ãí°Õ¤»¤è¡ª¤³¤Î³¬¤Ï%s¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤ë¡ª", name);
+#else
+                       msg_format("Beware, this level is protected by %s!", name);
+#endif
+               }
        }
        else
        {