OSDN Git Service

update year to 2023
[jnethack/source.git] / src / wizard.c
index facacc7..1fa3e63 100644 (file)
@@ -1,7 +1,13 @@
-/* NetHack 3.6 wizard.c        $NHDT-Date: 1446078768 2015/10/29 00:32:48 $  $NHDT-Branch: master $:$NHDT-Revision: 1.42 $ */
+/* NetHack 3.6 wizard.c        $NHDT-Date: 1561336025 2019/06/24 00:27:05 $  $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.56 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
+/*-Copyright (c) Robert Patrick Rankin, 2016. */
 /* NetHack may be freely redistributed.  See license for details. */
 
+/* JNetHack Copyright */
+/* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000  */
+/* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2023            */
+/* JNetHack may be freely redistributed.  See license for details. */
+
 /* wizard code - inspired by rogue code from Merlyn Leroy (digi-g!brian) */
 /*             - heavily modified to give the wiz balls.  (genat!mike)   */
 /*             - dewimped and given some maledictions. -3. */
@@ -10,8 +16,6 @@
 #include "hack.h"
 #include "qtext.h"
 
-extern const int monstr[];
-
 STATIC_DCL short FDECL(which_arti, (int));
 STATIC_DCL boolean FDECL(mon_has_arti, (struct monst *, SHORT_P));
 STATIC_DCL struct monst *FDECL(other_mon_has_arti, (struct monst *, SHORT_P));
@@ -20,21 +24,37 @@ STATIC_DCL boolean FDECL(you_have, (int));
 STATIC_DCL unsigned long FDECL(target_on, (int, struct monst *));
 STATIC_DCL unsigned long FDECL(strategy, (struct monst *));
 
+/* adding more neutral creatures will tend to reduce the number of monsters
+   summoned by nasty(); adding more lawful creatures will reduce the number
+   of monsters summoned by lawfuls; adding more chaotic creatures will reduce
+   the number of monsters summoned by chaotics; prior to 3.6.1, there were
+   only four lawful candidates, so lawful summoners tended to summon more
+   (trying to get lawful or neutral but obtaining chaotic instead) than
+   their chaotic counterparts */
 static NEARDATA const int nasties[] = {
-    PM_COCKATRICE, PM_ETTIN, PM_STALKER, PM_MINOTAUR, PM_RED_DRAGON,
-    PM_BLACK_DRAGON, PM_GREEN_DRAGON, PM_OWLBEAR, PM_PURPLE_WORM,
-    PM_ROCK_TROLL, PM_XAN, PM_GREMLIN, PM_UMBER_HULK, PM_VAMPIRE_LORD,
-    PM_XORN, PM_ZRUTY, PM_ELF_LORD, PM_ELVENKING, PM_YELLOW_DRAGON,
-    PM_LEOCROTTA, PM_BALUCHITHERIUM, PM_CARNIVOROUS_APE, PM_FIRE_GIANT,
-    PM_COUATL, PM_CAPTAIN, PM_WINGED_GARGOYLE, PM_MASTER_MIND_FLAYER,
-    PM_FIRE_ELEMENTAL, PM_JABBERWOCK, PM_ARCH_LICH, PM_OGRE_KING, PM_OLOG_HAI,
-    PM_IRON_GOLEM, PM_OCHRE_JELLY, PM_GREEN_SLIME, PM_DISENCHANTER
+    /* neutral */
+    PM_COCKATRICE, PM_ETTIN, PM_STALKER, PM_MINOTAUR,
+    PM_OWLBEAR, PM_PURPLE_WORM, PM_XAN, PM_UMBER_HULK,
+    PM_XORN, PM_ZRUTY, PM_LEOCROTTA, PM_BALUCHITHERIUM,
+    PM_CARNIVOROUS_APE, PM_FIRE_ELEMENTAL, PM_JABBERWOCK,
+    PM_IRON_GOLEM, PM_OCHRE_JELLY, PM_GREEN_SLIME,
+    /* chaotic */
+    PM_BLACK_DRAGON, PM_RED_DRAGON, PM_ARCH_LICH, PM_VAMPIRE_LORD,
+    PM_MASTER_MIND_FLAYER, PM_DISENCHANTER, PM_WINGED_GARGOYLE,
+    PM_STORM_GIANT, PM_OLOG_HAI, PM_ELF_LORD, PM_ELVENKING,
+    PM_OGRE_KING, PM_CAPTAIN, PM_GREMLIN,
+    /* lawful */
+    PM_SILVER_DRAGON, PM_ORANGE_DRAGON, PM_GREEN_DRAGON,
+    PM_YELLOW_DRAGON, PM_GUARDIAN_NAGA, PM_FIRE_GIANT,
+    PM_ALEAX, PM_COUATL, PM_HORNED_DEVIL, PM_BARBED_DEVIL,
+    /* (titans, ki-rin, and golden nagas are suitably nasty, but
+       they're summoners so would aggravate excessive summoning) */
 };
 
 static NEARDATA const unsigned wizapp[] = {
     PM_HUMAN,      PM_WATER_DEMON,  PM_VAMPIRE,       PM_RED_DRAGON,
     PM_TROLL,      PM_UMBER_HULK,   PM_XORN,          PM_XAN,
-    PM_COCKATRICE, PM_FLOATING_EYE, PM_GUARDIAN_NAGA, PM_TRAPPER
+    PM_COCKATRICE, PM_FLOATING_EYE, PM_GUARDIAN_NAGA, PM_TRAPPER,
 };
 
 /* If you've found the Amulet, make the Wizard appear after some time */
@@ -57,11 +77,20 @@ amulet()
             if (ttmp->ttyp == MAGIC_PORTAL) {
                 int du = distu(ttmp->tx, ttmp->ty);
                 if (du <= 9)
+/*JP
                     pline("%s hot!", Tobjnam(amu, "feel"));
+*/
+                    pline("%s\82Í\94M\82­\8a´\82\82½\81I", xname(amu));
                 else if (du <= 64)
+/*JP
                     pline("%s very warm.", Tobjnam(amu, "feel"));
+*/
+                    pline("%s\82Í\82Æ\82Ä\82à\92g\82©\82­\8a´\82\82½\81D", xname(amu));
                 else if (du <= 144)
+/*JP
                     pline("%s warm.", Tobjnam(amu, "feel"));
+*/
+                    pline("%s\82Í\92g\82©\82­\8a´\82\82½\81D", xname(amu));
                 /* else, the amulet feels normal */
                 break;
             }
@@ -78,7 +107,10 @@ amulet()
             mtmp->msleeping = 0;
             if (distu(mtmp->mx, mtmp->my) > 2)
                 You(
+/*JP
       "get the creepy feeling that somebody noticed your taking the Amulet.");
+*/
+      "\82 \82È\82½\82ª\96\82\8f\9c\82¯\82ð\8e\9d\82Á\82Ä\82¢\82é\82±\82Æ\82ª\92N\82©\82É\92m\82ç\82ê\82½\82Æ\8a´\82\82Ä\82¼\82Á\82Æ\82µ\82½\81D");
             return;
         }
     }
@@ -103,7 +135,8 @@ register struct monst *mtmp;
     register struct obj *otmp;
 
     for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj)
-        if (otmp->otyp == AMULET_OF_YENDOR || is_quest_artifact(otmp)
+        if (otmp->otyp == AMULET_OF_YENDOR
+            || any_quest_artifact(otmp)
             || otmp->otyp == BELL_OF_OPENING
             || otmp->otyp == CANDELABRUM_OF_INVOCATION
             || otmp->otyp == SPE_BOOK_OF_THE_DEAD)
@@ -159,7 +192,7 @@ register short otyp;
         if (otyp) {
             if (otmp->otyp == otyp)
                 return 1;
-        } else if (is_quest_artifact(otmp))
+        } else if (any_quest_artifact(otmp))
             return 1;
     }
     return 0;
@@ -191,7 +224,7 @@ register short otyp;
         if (otyp) {
             if (otmp->otyp == otyp)
                 return otmp;
-        } else if (is_quest_artifact(otmp))
+        } else if (any_quest_artifact(otmp))
             return otmp;
     return (struct obj *) 0;
 }
@@ -306,35 +339,79 @@ register struct monst *mtmp;
     return dstrat;
 }
 
+void
+choose_stairs(sx, sy)
+xchar *sx;
+xchar *sy;
+{
+    xchar x = 0, y = 0;
+
+    if (builds_up(&u.uz)) {
+        if (xdnstair) {
+            x = xdnstair;
+            y = ydnstair;
+        } else if (xdnladder) {
+            x = xdnladder;
+            y = ydnladder;
+        }
+    } else {
+        if (xupstair) {
+            x = xupstair;
+            y = yupstair;
+        } else if (xupladder) {
+            x = xupladder;
+            y = yupladder;
+        }
+    }
+
+    if (!x && sstairs.sx) {
+        x = sstairs.sx;
+        y = sstairs.sy;
+    }
+
+    if (x && y) {
+        *sx = x;
+        *sy = y;
+    }
+}
+
 int
 tactics(mtmp)
 register struct monst *mtmp;
 {
     unsigned long strat = strategy(mtmp);
+    xchar sx = 0, sy = 0, mx, my;
 
     mtmp->mstrategy =
         (mtmp->mstrategy & (STRAT_WAITMASK | STRAT_APPEARMSG)) | strat;
 
     switch (strat) {
     case STRAT_HEAL: /* hide and recover */
+        mx = mtmp->mx, my = mtmp->my;
         /* if wounded, hole up on or near the stairs (to block them) */
-        /* unless, of course, there are no stairs (e.g. endlevel) */
+        choose_stairs(&sx, &sy);
         mtmp->mavenge = 1; /* covetous monsters attack while fleeing */
-        if (In_W_tower(mtmp->mx, mtmp->my, &u.uz)
-            || (mtmp->iswiz && !xupstair && !mon_has_amulet(mtmp))) {
+        if (In_W_tower(mx, my, &u.uz)
+            || (mtmp->iswiz && !sx && !mon_has_amulet(mtmp))) {
             if (!rn2(3 + mtmp->mhp / 10))
                 (void) rloc(mtmp, TRUE);
-        } else if (xupstair
-                   && (mtmp->mx != xupstair || mtmp->my != yupstair)) {
-            (void) mnearto(mtmp, xupstair, yupstair, TRUE);
+        } else if (sx && (mx != sx || my != sy)) {
+            if (!mnearto(mtmp, sx, sy, TRUE)) {
+                /* couldn't move to the target spot for some reason,
+                   so stay where we are (don't actually need rloc_to()
+                   because mtmp is still on the map at <mx,my>... */
+                rloc_to(mtmp, mx, my);
+                return 0;
+            }
+            mx = mtmp->mx, my = mtmp->my; /* update cached location */
         }
         /* if you're not around, cast healing spells */
-        if (distu(mtmp->mx, mtmp->my) > (BOLT_LIM * BOLT_LIM))
+        if (distu(mx, my) > (BOLT_LIM * BOLT_LIM))
             if (mtmp->mhp <= mtmp->mhpmax - 8) {
                 mtmp->mhp += rnd(8);
                 return 1;
             }
-    /* fall through :-) */
+        /*FALLTHRU*/
 
     case STRAT_NONE: /* harass */
         if (!rn2(!mtmp->mflee ? 5 : 33))
@@ -363,10 +440,17 @@ register struct monst *mtmp;
 
                 if ((otmp = on_ground(which_arti(targ))) != 0) {
                     if (cansee(mtmp->mx, mtmp->my))
+#if 0 /*JP:T*/
                         pline("%s picks up %s.", Monnam(mtmp),
                               (distu(mtmp->mx, mtmp->my) <= 5)
                                   ? doname(otmp)
                                   : distant_name(otmp, doname));
+#else
+                        pline("%s\82Í%s\82ð\8fE\82Á\82½\81D", Monnam(mtmp),
+                              (distu(mtmp->mx, mtmp->my) <= 5)
+                                  ? doname(otmp)
+                                  : distant_name(otmp, doname));
+#endif
                     obj_extract_self(otmp);
                     (void) mpickobj(mtmp, otmp);
                     return 1;
@@ -379,23 +463,51 @@ register struct monst *mtmp;
                 return 0;
             }
         } else { /* a monster has it - 'port beside it. */
-            (void) mnearto(mtmp, tx, ty, FALSE);
+            mx = mtmp->mx, my = mtmp->my;
+            if (!mnearto(mtmp, tx, ty, FALSE))
+                rloc_to(mtmp, mx, my); /* no room? stay put */
             return 0;
         }
-    }
-    }
+    } /* default case */
+    } /* switch */
     /*NOTREACHED*/
     return 0;
 }
 
+/* are there any monsters mon could aggravate? */
+boolean
+has_aggravatables(mon)
+struct monst *mon;
+{
+    struct monst *mtmp;
+    boolean in_w_tower = In_W_tower(mon->mx, mon->my, &u.uz);
+
+    if (in_w_tower != In_W_tower(u.ux, u.uy, &u.uz))
+        return FALSE;
+
+    for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
+        if (DEADMONSTER(mtmp))
+            continue;
+        if (in_w_tower != In_W_tower(mtmp->mx, mtmp->my, &u.uz))
+            continue;
+        if ((mtmp->mstrategy & STRAT_WAITFORU) != 0
+            || mtmp->msleeping || !mtmp->mcanmove)
+            return TRUE;
+    }
+    return FALSE;
+}
+
 void
 aggravate()
 {
     register struct monst *mtmp;
+    boolean in_w_tower = In_W_tower(u.ux, u.uy, &u.uz);
 
     for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
         if (DEADMONSTER(mtmp))
             continue;
+        if (in_w_tower != In_W_tower(mtmp->mx, mtmp->my, &u.uz))
+            continue;
         mtmp->mstrategy &= ~(STRAT_WAITFORU | STRAT_APPEARMSG);
         mtmp->msleeping = 0;
         if (!mtmp->mcanmove && !rn2(5)) {
@@ -442,57 +554,89 @@ pick_nasty()
     return res;
 }
 
-/* create some nasty monsters, aligned or neutral with the caster */
-/* a null caster defaults to a chaotic caster (e.g. the wizard) */
+/* create some nasty monsters, aligned with the caster or neutral; chaotic
+   and unaligned are treated as equivalent; if summoner is Null, this is
+   for late-game harassment (after the Wizard has been killed at least once
+   or the invocation ritual has been performed), in which case we treat
+   'summoner' as neutral, since that will produce the greatest number of
+   creatures on average (in 3.6.0 and earlier, Null was treated as chaotic);
+   returns the number of monsters created */
 int
-nasty(mcast)
-struct monst *mcast;
+nasty(summoner)
+struct monst *summoner;
 {
     register struct monst *mtmp;
-    register int i, j, tmp;
-    int castalign = (mcast ? sgn(mcast->data->maligntyp) : -1);
+    register int i, j;
+    int castalign = (summoner ? sgn(summoner->data->maligntyp) : 0);
     coord bypos;
-    int count, census;
+    int count, census, tmp, makeindex, s_cls, m_cls;
+
+#define MAXNASTIES 10 /* more than this can be created */
 
     /* some candidates may be created in groups, so simple count
        of non-null makemon() return is inadequate */
     census = monster_census(FALSE);
 
     if (!rn2(10) && Inhell) {
+        /* this might summon a demon prince or lord */
         count = msummon((struct monst *) 0); /* summons like WoY */
     } else {
         count = 0;
-        tmp = (u.ulevel > 3) ? u.ulevel / 3 : 1; /* just in case -- rph */
-        /* if we don't have a casting monster, the nasties appear around you
-         */
+        s_cls = summoner ? summoner->data->mlet : 0;
+        tmp = (u.ulevel > 3) ? u.ulevel / 3 : 1;
+        /* if we don't have a casting monster, nasties appear around hero,
+           otherwise they'll appear around spot summoner thinks she's at */
         bypos.x = u.ux;
         bypos.y = u.uy;
-        for (i = rnd(tmp); i > 0; --i)
+        for (i = rnd(tmp); i > 0 && count < MAXNASTIES; --i)
+            /* Of the 42 nasties[], 10 are lawful, 14 are chaotic,
+             * and 18 are neutral.
+             *
+             * Neutral caster, used for late-game harrassment,
+             * has 18/42 chance to stop the inner loop on each
+             * critter, 24/42 chance for another iteration.
+             * Lawful caster has 28/42 chance to stop unless the
+             * summoner is an angel or demon, in which case the
+             * chance is 26/42.
+             * Chaotic or unaligned caster has 32/42 chance to
+             * stop, so will summon fewer creatures on average.
+             *
+             * The outer loop potentially gives chaotic/unaligned
+             * a chance to even things up since others will hit
+             * MAXNASTIES sooner, but its number of iterations is
+             * randomized so it won't always do so.
+             */
             for (j = 0; j < 20; j++) {
-                int makeindex;
-
                 /* Don't create more spellcasters of the monsters' level or
                  * higher--avoids chain summoners filling up the level.
                  */
                 do {
                     makeindex = pick_nasty();
-                } while (mcast && attacktype(&mons[makeindex], AT_MAGC)
-                         && monstr[makeindex] >= monstr[mcast->mnum]);
+                    m_cls = mons[makeindex].mlet;
+                } while (summoner
+                         && ((attacktype(&mons[makeindex], AT_MAGC)
+                              && mons[makeindex].difficulty
+                                 >= mons[summoner->mnum].difficulty)
+                             || (s_cls == S_DEMON && m_cls == S_ANGEL)
+                             || (s_cls == S_ANGEL && m_cls == S_DEMON)));
                 /* do this after picking the monster to place */
-                if (mcast
-                    && !enexto(&bypos, mcast->mux, mcast->muy,
-                               &mons[makeindex]))
+                if (summoner && !enexto(&bypos, summoner->mux, summoner->muy,
+                                        &mons[makeindex]))
                     continue;
+                /* this honors genocide but overrides extinction; it ignores
+                   inside-hell-only (G_HELL) & outside-hell-only (G_NOHELL) */
                 if ((mtmp = makemon(&mons[makeindex], bypos.x, bypos.y,
                                     NO_MM_FLAGS)) != 0) {
                     mtmp->msleeping = mtmp->mpeaceful = mtmp->mtame = 0;
                     set_malign(mtmp);
-                } else /* GENOD? */
+                } else /* random monster to substitute for geno'd selection */
                     mtmp = makemon((struct permonst *) 0, bypos.x, bypos.y,
                                    NO_MM_FLAGS);
                 if (mtmp) {
-                    count++;
-                    if (mtmp->data->maligntyp == 0
+                    /* delay first use of spell or breath attack */
+                    mtmp->mspec_used = rnd(4);
+                    if (++count >= MAXNASTIES
+                        || mtmp->data->maligntyp == 0
                         || sgn(mtmp->data->maligntyp) == castalign)
                         break;
                 }
@@ -514,14 +658,20 @@ resurrect()
 
     if (!context.no_of_wizards) {
         /* make a new Wizard */
+/*JP
         verb = "kill";
+*/
+        verb = "\82ð\93¢\82Ä\82µ";
         mtmp = makemon(&mons[PM_WIZARD_OF_YENDOR], u.ux, u.uy, MM_NOWAIT);
         /* affects experience; he's not coming back from a corpse
            but is subject to repeated killing like a revived corpse */
         if (mtmp) mtmp->mrevived = 1;
     } else {
         /* look for a migrating Wizard */
+/*JP
         verb = "elude";
+*/
+        verb = "\82æ\82è\93¦\82ê\82ñ";
         mmtmp = &migrating_mons;
         while ((mtmp = *mmtmp) != 0) {
             if (mtmp->iswiz
@@ -552,8 +702,14 @@ resurrect()
         mtmp->mtame = mtmp->mpeaceful = 0; /* paranoia */
         set_malign(mtmp);
         if (!Deaf) {
+/*JP
             pline("A voice booms out...");
+*/
+            pline("\90º\82ª\8d\82\82­\96Â\82è\8b¿\82¢\82½\81D\81D\81D");
+/*JP
             verbalize("So thou thought thou couldst %s me, fool.", verb);
+*/
+            verbalize("\97]%s\82Æ\8ev\82¢\82µ\82©\81C\92s\82ê\8eÒ\82ª\81D", verb);
         }
     }
 }
@@ -568,11 +724,17 @@ intervene()
     switch (which) {
     case 0:
     case 1:
+/*JP
         You_feel("vaguely nervous.");
+*/
+        You("\89½\82Æ\82È\82­\95s\88À\82É\82È\82Á\82½\81D");
         break;
     case 2:
         if (!Blind)
+/*JP
             You("notice a %s glow surrounding you.", hcolor(NH_BLACK));
+*/
+            pline("%s\8cõ\82ª\82 \82È\82½\82ð\82Æ\82è\82Ü\82¢\82Ä\82¢\82é\82Ì\82É\8bC\82ª\82Â\82¢\82½\81D", hcolor(NH_BLACK));
         rndcurse();
         break;
     case 3:
@@ -598,6 +760,7 @@ wizdead()
 }
 
 const char *const random_insult[] = {
+#if 0 /*JP:T*/
     "antic",      "blackguard",   "caitiff",    "chucklehead",
     "coistrel",   "craven",       "cretin",     "cur",
     "dastard",    "demon fodder", "dimwit",     "dolt",
@@ -606,15 +769,39 @@ const char *const random_insult[] = {
     "rattlepate", "reprobate",    "scapegrace", "varlet",
     "villein", /* (sic.) */
     "wittol",     "worm",         "wretch",
+#else
+    "\82Ó\82´\82¯\82½\96ì\98Y", "\88«\93}",       "\82­\82»\82Á\82½\82ê", "\82Ì\82ë\82Ü",
+    "\82 \82ñ\82Û\82ñ\82½\82ñ", "\89°\95a\8eÒ",     "\94\92\92s",       "\82ë\82­\82Å\82È\82µ",
+    "\82¤\82Â\82¯",       "\88«\96\82\82Ì\89a\90H", "\82¤\82·\82Ì\82ë",   "\82Ü\82Ê\82¯",
+    "\94n\8e­",         "\82¨\82¢\82Í\82¬",   "\8bð\82©\8eÒ",     "\82È\82ç\82¸\8eÒ",
+    "\88«\90l",         "\8bÉ\88«\90l",     "\94n\8e­\82½\82ê",   "\94Ú\8b¯\8eÒ",
+    "\95\97\91D\93ª",       "\93¹\8ay\8eÒ",     "\96ï\89î\8eÒ",     "\89º\98Y",
+    "\93z\97ê", /* (sic.) */
+    "\82Ó\82È\82Þ\82µ",     "åv\92\8e",       "\90l\82Å\82È\82µ",
+#endif
 };
 
 const char *const random_malediction[] = {
+#if 0 /*JP:T*/
     "Hell shall soon claim thy remains,", "I chortle at thee, thou pathetic",
     "Prepare to die, thou", "Resistance is useless,",
     "Surrender or die, thou", "There shall be no mercy, thou",
     "Thou shalt repent of thy cunning,", "Thou art as a flea to me,",
     "Thou art doomed,", "Thy fate is sealed,",
     "Verily, thou shalt be one dead"
+#else
+    "\92n\8d\96\82Í\82¢\82Ã\82ê\81C\93ð\82Ì\96S\8a[\82ð\97v\8b\81\82·\82é\82Å\82 \82ë\82¤\81C",
+    "\88£\82ê\82È\82â\82Â\82æ\82Ì\82¤\81D\97]\82Í\96\9e\91«\82\82á",
+    "\93ð\81C\8e\80\82É\94õ\82¦\82æ",
+    "\92ï\8dR\82µ\82Ä\82à\96³\91Ê\82\82á\81C",
+    "\8d~\8eQ\82¹\82æ\81D\82³\82à\82È\82­\82Î\8e\80\82\82á\81D",
+    "\8e\9c\94ß\82Í\96³\82©\82ç\82ñ",
+    "\93ð\81C\82¸\82é\82ð\8cã\89÷\82·\82×\82µ\81C",
+    "\93ð\82Í\97]\82É\82Æ\82Á\82Ä\83m\83~\82Ì\82æ\82¤\82È\82à\82Ì\82\82á\81C",
+    "\93ð\82Í\8eô\82í\82ê\82Ä\82¨\82é\81C",
+    "\93ð\82Ì\89^\96½\82Í\95\95\88ó\82³\82ê\82Ä\82¨\82é\81C",
+    "\82Ü\82±\82Æ\82É\93ð\82Í\8e\80\82É\82½\82é\8eÒ\82È\82è"
+#endif
 };
 
 /* Insult or intimidate the player */
@@ -626,26 +813,51 @@ register struct monst *mtmp;
         return;
     if (mtmp->iswiz) {
         if (!rn2(5)) /* typical bad guy action */
+/*JP
             pline("%s laughs fiendishly.", Monnam(mtmp));
+*/
+            pline("%s\82Í\88«\96\82\82Ì\82æ\82¤\82É\8fÎ\82Á\82½\81D", Monnam(mtmp));
         else if (u.uhave.amulet && !rn2(SIZE(random_insult)))
+/*JP
             verbalize("Relinquish the amulet, %s!",
+*/
+            verbalize("\96\82\82æ\82¯\82ð\8eè\95ú\82¹\81C%s\81I",
                       random_insult[rn2(SIZE(random_insult))]);
         else if (u.uhp < 5 && !rn2(2)) /* Panic */
+#if 0 /*JP:T*/
             verbalize(rn2(2) ? "Even now thy life force ebbs, %s!"
                              : "Savor thy breath, %s, it be thy last!",
                       random_insult[rn2(SIZE(random_insult))]);
+#else
+            verbalize(rn2(2) ? "\8d¡\82Æ\82È\82Á\82Ä\82à\82È\82¨\93ð\82Ì\96½\82Í\82 \82¦\82Ä\90\8a\82¦\82é\82Ì\82¾\81C%s\81I"
+                             : "\96³\91Ê\82È\82±\82Æ\82ð\82·\82é\82È\81C%s\81C\93ð\82Ì\8dÅ\8aú\82Ì\8e\9e\82¾\81I",
+                      random_insult[rn2(SIZE(random_insult))]);
+#endif
         else if (mtmp->mhp < 5 && !rn2(2)) /* Parthian shot */
+/*JP
             verbalize(rn2(2) ? "I shall return." : "I'll be back.");
+*/
+            verbalize(rn2(2) ? "\97]\82Í\95K\82¸\8bA\82Á\82Ä\82­\82é\81D" : "\97]\82Í\96ß\82Á\82Ä\82­\82é\81D");
         else
+#if 0 /*JP:T*/
             verbalize("%s %s!",
                       random_malediction[rn2(SIZE(random_malediction))],
                       random_insult[rn2(SIZE(random_insult))]);
-    } else if (is_lminion(mtmp)) {
+#else
+            verbalize("%s\81C%s\81I",
+                      random_malediction[rn2(SIZE(random_malediction))],
+                      random_insult[rn2(SIZE(random_insult))]);
+#endif
+    } else if (is_lminion(mtmp)
+               && !(mtmp->isminion && EMIN(mtmp)->renegade)) {
         com_pager(rn2(QTN_ANGELIC - 1 + (Hallucination ? 1 : 0))
                   + QT_ANGELIC);
     } else {
-        if (!rn2(5))
+        if (!rn2(is_minion(mtmp->data) ? 100 : 5))
+/*JP
             pline("%s casts aspersions on your ancestry.", Monnam(mtmp));
+*/
+            pline("%s\82Í\82 \82È\82½\82Ì\89Æ\95¿\82ð\92\86\8f\9d\82µ\82½\81D", Monnam(mtmp));
         else
             com_pager(rn2(QTN_DEMONIC) + QT_DEMONIC);
     }