From ee7fbc4a61052aecf1d8e23d7c7534e916a2f420 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 14 Jul 2020 05:43:51 -0700 Subject: [PATCH] mind flayer vs headless target When a mind flayer scores a hit against a headless target (or worm's tail), there's a message that says that the attack hits and that the target is unharmed. Since an ordinary mind flayer has 3 such attacks per turn and a master mind flayer has 5, it can become excessively verbose. This doesn't eliminate the attacks until a hit fails to do harm, so ordinary misses still get repeated if they happen first. Once a successful hit doesn't do anything, any remaining AT_TENT+AD_DRIN attacks are silently skipped. That way feedback isn't as verbose and mind flayers don't seem to be quite so stupid about using their tentacles when those won't work. Unfortunately they need to relearn the lesson every turn they attack. --- doc/fixes37.0 | 5 ++++- include/decl.h | 7 ++++--- src/decl.c | 9 +++++---- src/mhitm.c | 17 ++++++++++++++++- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/doc/fixes37.0 b/doc/fixes37.0 index e991745d2..0fa488c33 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -1,4 +1,4 @@ -$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.247 $ $NHDT-Date: 1594727746 2020/07/14 11:55:46 $ +$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.248 $ $NHDT-Date: 1594730609 2020/07/14 12:43:29 $ General Fixes and Modified Features ----------------------------------- @@ -405,6 +405,9 @@ give feedback for '#chat' directed at walls add 'Sokoban' conduct, tracking the number of times the special Sokoban rules which incur luck penalties have been violated; don't report it unless/until Sokoban branch has been entered +reduce verbosity when a mind flayer attacks a headless monster; when a + tentacle-to-head attack hits but fails to accomplish anything skip + remaining attacks (mind flayer has 3, master mind flayer has 5) Platform- and/or Interface-Specific New Features diff --git a/include/decl.h b/include/decl.h index 94e4581d0..a626a76e0 100644 --- a/include/decl.h +++ b/include/decl.h @@ -1,4 +1,4 @@ -/* NetHack 3.6 decl.h $NHDT-Date: 1593953331 2020/07/05 12:48:51 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.238 $ */ +/* NetHack 3.6 decl.h $NHDT-Date: 1594730609 2020/07/14 12:43:29 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.239 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2007. */ /* NetHack may be freely redistributed. See license for details. */ @@ -932,9 +932,10 @@ struct instance_globals { /* makemon.c */ /* mhitm.c */ - boolean vis; - boolean far_noise; long noisetime; + boolean far_noise; + boolean vis; + boolean skipdrin; /* mind flayer against headless target */ /* mhitu.c */ int mhitu_dieroll; diff --git a/src/decl.c b/src/decl.c index d390a2dbd..b57b7ba7f 100644 --- a/src/decl.c +++ b/src/decl.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 decl.c $NHDT-Date: 1593953345 2020/07/05 12:49:05 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.214 $ */ +/* NetHack 3.6 decl.c $NHDT-Date: 1594730611 2020/07/14 12:43:31 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.215 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Michael Allison, 2009. */ /* NetHack may be freely redistributed. See license for details. */ @@ -461,9 +461,10 @@ const struct instance_globals g_init = { /* makemon.c */ /* mhitm.c */ - UNDEFINED_VALUE, /* vis */ - UNDEFINED_VALUE, /* far_noise */ - UNDEFINED_VALUE, /* noisetime */ + 0L, /* noisetime */ + FALSE, /* far_noise */ + FALSE, /* vis */ + FALSE, /* skipdrin */ /* mhitu.c */ UNDEFINED_VALUE, /* mhitu_dieroll */ diff --git a/src/mhitm.c b/src/mhitm.c index 00628cc9a..50db4ba43 100644 --- a/src/mhitm.c +++ b/src/mhitm.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 mhitm.c $NHDT-Date: 1593614973 2020/07/01 14:49:33 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.138 $ */ +/* NetHack 3.6 mhitm.c $NHDT-Date: 1594730614 2020/07/14 12:43:34 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.139 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2011. */ /* NetHack may be freely redistributed. See license for details. */ @@ -345,12 +345,24 @@ register struct monst *magr, *mdef; */ magr->mlstmv = g.monstermoves; + /* controls whether a mind flayer uses all of its tentacle-for-DRIN + attacks; when fighting a headless monster, stop after the first + one because repeating the same failing hit (or even an ordinary + tentacle miss) is very verbose and makes the flayer look stupid */ + g.skipdrin = FALSE; + /* Now perform all attacks for the monster. */ for (i = 0; i < NATTK; i++) { res[i] = MM_MISS; mattk = getmattk(magr, mdef, i, res, &alt_attk); mwep = (struct obj *) 0; attk = 1; + /* reduce verbosity for mind flayer attacking creature without a + head (or worm's tail); this is similar to monster with multiple + attacks after a wildmiss against displaced or invisible hero */ + if (g.skipdrin && mattk->aatyp == AT_TENT && mattk->adtyp == AD_DRIN) + continue; + switch (mattk->aatyp) { case AT_WEAP: /* "hand to hand" attacks */ if (distmin(magr->mx, magr->my, mdef->mx, mdef->my) > 1) { @@ -1404,6 +1416,9 @@ int dieroll; pline("%s doesn't seem harmed.", Monnam(mdef)); /* Not clear what to do for green slimes */ tmp = 0; + /* don't bother with additional DRIN attacks since they wouldn't + be able to hit target on head either */ + g.skipdrin = TRUE; /* affects mattackm()'s attack loop */ break; } if ((mdef->misc_worn_check & W_ARMH) && rn2(8)) {