OSDN Git Service

upgrade to 3.6.2
[jnethack/source.git] / src / were.c
index 26bcff4..7702ea9 100644 (file)
@@ -1,10 +1,11 @@
-/* NetHack 3.6 were.c  $NHDT-Date: 1432512763 2015/05/25 00:12:43 $  $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */
+/* NetHack 3.6 were.c  $NHDT-Date: 1550524568 2019/02/18 21:16:08 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.23 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
+/*-Copyright (c) Robert Patrick Rankin, 2011. */
 /* 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-2016            */
+/* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2019            */
 /* JNetHack may be freely redistributed.  See license for details. */
 
 #include "hack.h"
@@ -66,6 +67,8 @@ register struct monst *mon;
     } else if (!rn2(30) || Protection_from_shape_changers) {
         new_were(mon); /* change back into human form */
     }
+    /* update innate intrinsics (mainly Drain_resistance) */
+    set_uasmon(); /* new_were() doesn't do this */
 }
 
 int
@@ -74,17 +77,17 @@ int pm;
 {
     switch (pm) {
     case PM_WEREWOLF:
-        return (PM_HUMAN_WEREWOLF);
+        return PM_HUMAN_WEREWOLF;
     case PM_HUMAN_WEREWOLF:
-        return (PM_WEREWOLF);
+        return PM_WEREWOLF;
     case PM_WEREJACKAL:
-        return (PM_HUMAN_WEREJACKAL);
+        return PM_HUMAN_WEREJACKAL;
     case PM_HUMAN_WEREJACKAL:
-        return (PM_WEREJACKAL);
+        return PM_WEREJACKAL;
     case PM_WERERAT:
-        return (PM_HUMAN_WERERAT);
+        return PM_HUMAN_WERERAT;
     case PM_HUMAN_WERERAT:
-        return (PM_WERERAT);
+        return PM_WERERAT;
     default:
         return NON_PM;
     }
@@ -138,7 +141,7 @@ register struct monst *mon;
               is_human(&mons[pm]) ? "\90l\8aÔ" : beastname(mons[pm].mname));
 #endif
 
-    set_mon_data(mon, &mons[pm], 0);
+    set_mon_data(mon, &mons[pm]);
     if (mon->msleeping || !mon->mcanmove) {
         /* transformation wakens and/or revitalizes */
         mon->msleeping = 0;
@@ -152,15 +155,16 @@ register struct monst *mon;
     possibly_unwield(mon, FALSE);
 }
 
-int were_summon(ptr, yours, visible,
-                genbuf) /* were-creature (even you) summons a horde */
-register struct permonst *ptr;
-register boolean yours;
+/* were-creature (even you) summons a horde */
+int
+were_summon(ptr, yours, visible, genbuf)
+struct permonst *ptr;
+boolean yours;
 int *visible; /* number of visible helpers created */
 char *genbuf;
 {
-    register int i, typ, pm = monsndx(ptr);
-    register struct monst *mtmp;
+    int i, typ, pm = monsndx(ptr);
+    struct monst *mtmp;
     int total = 0;
 
     *visible = 0;
@@ -170,8 +174,8 @@ char *genbuf;
         switch (pm) {
         case PM_WERERAT:
         case PM_HUMAN_WERERAT:
-            typ =
-                rn2(3) ? PM_SEWER_RAT : rn2(3) ? PM_GIANT_RAT : PM_RABID_RAT;
+            typ = rn2(3) ? PM_SEWER_RAT
+                         : rn2(3) ? PM_GIANT_RAT : PM_RABID_RAT;
             if (genbuf)
 /*JP
                 Strcpy(genbuf, "rat");
@@ -180,7 +184,7 @@ char *genbuf;
             break;
         case PM_WEREJACKAL:
         case PM_HUMAN_WEREJACKAL:
-            typ = PM_JACKAL;
+            typ = rn2(7) ? PM_JACKAL : rn2(3) ? PM_COYOTE : PM_FOX;
             if (genbuf)
 /*JP
                 Strcpy(genbuf, "jackal");
@@ -189,7 +193,7 @@ char *genbuf;
             break;
         case PM_WEREWOLF:
         case PM_HUMAN_WEREWOLF:
-            typ = rn2(5) ? PM_WOLF : PM_WINTER_WOLF;
+            typ = rn2(5) ? PM_WOLF : rn2(2) ? PM_WARG : PM_WINTER_WOLF;
             if (genbuf)
 /*JP
                 Strcpy(genbuf, "wolf");
@@ -217,18 +221,18 @@ you_were()
     char qbuf[QBUFSZ];
     boolean controllable_poly = Polymorph_control && !(Stunned || Unaware);
 
-    if (Unchanging || (u.umonnum == u.ulycn))
+    if (Unchanging || u.umonnum == u.ulycn)
         return;
     if (controllable_poly) {
 #if 0 /*JP*/
         /* `+4' => skip "were" prefix to get name of beast */
         Sprintf(qbuf, "Do you want to change into %s?",
                 an(mons[u.ulycn].mname + 4));
-#else
+#else /* \93ú\96{\8cê\82Å\82Í\90ê\97p\8aÖ\90\94\82ð\8eg\82¤ */
         Sprintf(qbuf, "%s\82É\95Ï\89»\82µ\82Ü\82·\82©\81H",
                 beastname(mons[u.ulycn].mname));
 #endif
-        if (yn(qbuf) == 'n')
+        if (!paranoid_query(ParanoidWerechange, qbuf))
             return;
     }
     (void) polymon(u.ulycn);
@@ -245,14 +249,27 @@ boolean purify;
         You_feel("purified.");
 */
         You("\8fò\82ß\82ç\82ê\82½\82æ\82¤\82È\8bC\82ª\82µ\82½\81D");
-        u.ulycn = NON_PM; /* cure lycanthropy */
+        set_ulycn(NON_PM); /* cure lycanthropy */
     }
     if (!Unchanging && is_were(youmonst.data)
+        && (!controllable_poly
 /*JP
-        && (!controllable_poly || yn("Remain in beast form?") == 'n'))
+            || !paranoid_query(ParanoidWerechange, "Remain in beast form?")))
 */
-        && (!controllable_poly || yn("\8fb\82Ì\8ep\82Ì\82Ü\82Ü\82Å\82¢\82é\81H") == 'n'))
+            || !paranoid_query(ParanoidWerechange, "\8fb\82Ì\8ep\82Ì\82Ü\82Ü\82Å\82¢\82é\81H")))
         rehumanize();
+    else if (is_were(youmonst.data) && !u.mtimedone)
+        u.mtimedone = rn1(200, 200); /* 40% of initial were change */
+}
+
+/* lycanthropy is being caught or cured, but no shape change is involved */
+void
+set_ulycn(which)
+int which;
+{
+    u.ulycn = which;
+    /* add or remove lycanthrope's innate intrinsics (Drain_resistance) */
+    set_uasmon();
 }
 
 /*were.c*/