From 3f2aa875bb1731e1b78754443df6939e58a8158d Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Tue, 21 Dec 2004 04:27:34 +0000 Subject: [PATCH] fix monster summoning message 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 | 1 + include/extern.h | 2 +- src/mhitu.c | 4 ++-- src/minion.c | 20 +++++++++++--------- src/wizard.c | 17 +++++++++-------- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/doc/fixes34.4 b/doc/fixes34.4 index dacc71c5a..408481e3b 100644 --- a/doc/fixes34.4 +++ b/doc/fixes34.4 @@ -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 diff --git a/include/extern.h b/include/extern.h index fb86d4592..29b673f5b 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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 *)); diff --git a/src/mhitu.c b/src/mhitu.c index c0b3d2025..5791d841a 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -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) { diff --git a/src/minion.c b/src/minion.c index 618c45eb3..20ace2734 100644 --- a/src/minion.c +++ b/src/minion.c @@ -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 diff --git a/src/wizard.c b/src/wizard.c index c9b75fdba..a1f4ee3e9 100644 --- a/src/wizard.c +++ b/src/wizard.c @@ -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; } } } -- 2.40.0