From f3db525ac4202f0405b6203a7b55fc361dcf449d Mon Sep 17 00:00:00 2001 From: arromdee Date: Tue, 9 Jul 2002 07:10:21 +0000 Subject: [PATCH] chain summoning This adds a further throttle to chain summoning. Monsters can only summon spellcasting nasties if the nasties are lower level than the summoner, which makes infinite chains impossible (as long as the player figures out which monster to kill first). --- doc/fixes34.1 | 2 +- src/wizard.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/doc/fixes34.1 b/doc/fixes34.1 index fbdb029d3..c1629c293 100644 --- a/doc/fixes34.1 +++ b/doc/fixes34.1 @@ -54,7 +54,7 @@ avoid dmonsfree impossible message due to migrating a dead monster via avoid temporary disappearing Burdened message due to updating status line midway thru in_container don't credit player's wisdom when makelevel creates random Elbereth engravings -reduce insect/monster creation from monster spells +reduce insect/monster creation from monster spells and limit chain summons avoid "couldn't place lregion type 5" warning when arriving at Plane of Fire avoid crash due to delayed poly or were change no longer being valid ensure that Priest's ability to recognize B/U/C is considered in B/U/C menus diff --git a/src/wizard.c b/src/wizard.c index 01d5941ac..e35723415 100644 --- a/src/wizard.c +++ b/src/wizard.c @@ -10,6 +10,8 @@ #include "hack.h" #include "qtext.h" +extern const int monstr[]; + #ifdef OVLB STATIC_DCL short FDECL(which_arti, (int)); @@ -435,10 +437,19 @@ nasty(mcast) bypos.y = u.uy; for(i = rnd(tmp); i > 0; --i) for(j=0; j<20; j++) { + int makeindex; + if (mcast && !enexto(&bypos, mcast->mux, mcast->muy, mcast->data)) continue; - if ((mtmp = makemon(&mons[pick_nasty()], + /* 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]); + if ((mtmp = makemon(&mons[makeindex], bypos.x, bypos.y, NO_MM_FLAGS)) != 0) { mtmp->msleeping = mtmp->mpeaceful = mtmp->mtame = 0; set_malign(mtmp);