]> granicus.if.org Git - nethack/commitdiff
fix monster summoning message
authornethack.rankin <nethack.rankin>
Tue, 21 Dec 2004 04:27:34 +0000 (04:27 +0000)
committernethack.rankin <nethack.rankin>
Tue, 21 Dec 2004 04:27:34 +0000 (04:27 +0000)
     From a bug report:
> If the Summon Nasties monster spell gates in two minions instead of one,
> the message still says "A monster appears from nowhere!"

The code wasn't counting any summoned monsters who had an opposite alignment
to the summoner.  It also assumed that the 10% chance for demon summoning
in Gehennom always yielded exactly one monster even though that can produce
zero or more than one.

doc/fixes34.4
include/extern.h
src/mhitu.c
src/minion.c
src/wizard.c

index dacc71c5ad4584cc769bb9f9f95bbe75f574ea67..408481e3be55f9c332a13b541a32888e8d85b88c 100644 (file)
@@ -78,6 +78,7 @@ co-aligned unicorns in bones could be hostile
 finding "something" posing as a statue while Blind should map_invisible()
 adding more candles than required to total 7 to a candelabrum which 
        already had between 1 and 6 gave an ungrammatical message
+give correct message when a spellcasting monster summons other monsters
 
 
 Platform- and/or Interface-Specific Fixes
index fb86d4592ac21f37ce262dc3abf333ff7af3f0a3..29b673f5be2b84257100e2a84c9a0abda2d12074 100644 (file)
@@ -1019,7 +1019,7 @@ E int FDECL(doseduce, (struct monst *));
 
 /* ### minion.c ### */
 
-E void FDECL(msummon, (struct monst *));
+E int FDECL(msummon, (struct monst *));
 E void FDECL(summon_minion, (ALIGNTYP_P,BOOLEAN_P));
 E int FDECL(demon_talk, (struct monst *));
 E long FDECL(bribe, (struct monst *));
index c0b3d2025c855a96c4bfb9046a436a2540b1f3d4..5791d841afe3fed2d87e11f7ab91ad39b0e96409 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)mhitu.c    3.4     2004/11/11      */
+/*     SCCS Id: @(#)mhitu.c    3.4     2004/12/20      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -471,7 +471,7 @@ mattacku(mtmp)
           && mtmp->data != &mons[PM_BALROG]
           && mtmp->data != &mons[PM_SUCCUBUS]
           && mtmp->data != &mons[PM_INCUBUS])
-           if(!mtmp->mcan && !rn2(13)) msummon(mtmp);
+           if (!mtmp->mcan && !rn2(13)) (void)msummon(mtmp);
 
 /*     Special lycanthrope handling code */
        if((mtmp->cham == CHAM_ORDINARY) && is_were(mdat) && !range2) {
index 618c45eb3cfe0f8afca0203f8cdaa08639861bd0..20ace27340c72c6e861bad396e4e74d03d24ceea 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)minion.c   3.4     2003/01/09      */
+/*     SCCS Id: @(#)minion.c   3.4     2004/12/20      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -6,12 +6,12 @@
 #include "emin.h"
 #include "epri.h"
 
-void
+int
 msummon(mon)           /* mon summons a monster */
 struct monst *mon;
 {
-       register struct permonst *ptr;
-       register int dtype = NON_PM, cnt = 0;
+       struct permonst *ptr;
+       int dtype = NON_PM, cnt = 0, result = 0;
        aligntyp atyp;
        struct monst *mtmp;
 
@@ -60,7 +60,7 @@ struct monst *mon;
            cnt = (!rn2(4) && !is_lord(&mons[dtype])) ? 2 : 1;
        }
 
-       if (dtype == NON_PM) return;
+       if (dtype == NON_PM) return 0;
 
        /* sanity checks */
        if (cnt > 1 && (mons[dtype].geno & G_UNIQ)) cnt = 1;
@@ -70,17 +70,19 @@ struct monst *mon;
         */
        if (mvitals[dtype].mvflags & G_GONE) {
            dtype = ndemon(atyp);
-           if (dtype == NON_PM) return;
+           if (dtype == NON_PM) return 0;
        }
 
        while (cnt > 0) {
            mtmp = makemon(&mons[dtype], u.ux, u.uy, NO_MM_FLAGS);
-           if (mtmp && (dtype == PM_ANGEL)) {
-               /* alignment should match the summoner */
-               EPRI(mtmp)->shralign = atyp;
+           if (mtmp) {
+               result++;
+               /* an angel's alignment should match the summoner */
+               if (dtype == PM_ANGEL) EPRI(mtmp)->shralign = atyp;
            }
            cnt--;
        }
+       return result;
 }
 
 void
index c9b75fdba7d48215072619d47a40a516654362bb..a1f4ee3e9b1dd5645280bdcb3fab221018c9d6f4 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)wizard.c   3.4     2003/02/18      */
+/*     SCCS Id: @(#)wizard.c   3.4     2004/12/20      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -416,14 +416,14 @@ nasty(mcast)
 {
     register struct monst      *mtmp;
     register int       i, j, tmp;
-    int castalign = (mcast ? mcast->data->maligntyp : -1);
+    int castalign = (mcast ? sgn(mcast->data->maligntyp) : -1);
     coord bypos;
-    int count=0;
+    int count;
 
     if(!rn2(10) && Inhell) {
-       msummon((struct monst *) 0);    /* summons like WoY */
-       count++;
+       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 */
        bypos.x = u.ux;
@@ -450,10 +450,11 @@ nasty(mcast)
                } else /* GENOD? */
                    mtmp = makemon((struct permonst *)0,
                                        bypos.x, bypos.y, NO_MM_FLAGS);
-               if(mtmp && (mtmp->data->maligntyp == 0 ||
-                           sgn(mtmp->data->maligntyp) == sgn(castalign)) ) {
+               if (mtmp) {
                    count++;
-                   break;
+                   if (mtmp->data->maligntyp == 0 ||
+                           sgn(mtmp->data->maligntyp) == castalign)
+                       break;
                }
            }
     }