Newsgroups: rec.games.roguelike.nethack
Cc: nethack-bugs@nethack.org
Subject: Re: YAS (and I do mean stupid) D
References: <MPG.175f0f4869e54b17989bfa@pnews.dmv.com>
From: Roderick Schertler <roderick@argon.org>
Date: 31 May 2002 12:33:29 -0400
Message-ID: <pz6614z38m.fsf@eeyore.ibcinc.com>
Lines: 354
X-Newsreader: Gnus v5.7/Emacs 20.7

On Wed, 29 May 2002 17:17:05 -0400, Rast <rast2@hotmail.com> said:
> 
> [While surrounded by couatl, iron golems, and fire elementals] wack
> them, hit Esc to skip messages. Tap, tap tap. Suddenly, the game
> ends. I thought it had crashed, so checked the log file.
> 
> 3.4.0 9440456 0 25 49 1732 1732 2 20020529 20020425 1 Sam Hum Fem Neu 
> Taki,drowned in a pool of water by a couatl (with the Amulet)

Here's a patch which might have saved your life.  It adds a new "Held"
status flag for the bottom line, which kicks in when you get grabbed by
a kraken, owlbear, large mimic, or whatever.  This patch will also
be available at http://www.argon.org/~roderick/.

diff -r -X /home/roderick/.diff-exclude -u nethack.0/include/hack.h nethack/include/hack.h
--- nethack.0/include/hack.h	Wed Mar 20 18:42:47 2002
+++ nethack/include/hack.h	Fri May 31 12:01:48 2002
@@ -272,6 +272,7 @@
 #define makeknown(x)	discover_object((x),TRUE,TRUE)
 #define distu(xx,yy)	dist2((int)(xx),(int)(yy),(int)u.ux,(int)u.uy)
 #define onlineu(xx,yy)	online2((int)(xx),(int)(yy),(int)u.ux,(int)u.uy)
+#define setustuck(v)	(flags.botl = 1, u.ustuck = (v))
 
 #define rn1(x,y)	(rn2(x)+(y))
 
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/apply.c nethack/src/apply.c
--- nethack.0/src/apply.c	Wed Mar 20 18:42:59 2002
+++ nethack/src/apply.c	Fri May 31 11:59:51 2002
@@ -1243,7 +1243,7 @@
 	} else if (u.ustuck) {
 		if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) {
 		    You("pull free from %s.", mon_nam(u.ustuck));
-		    u.ustuck = 0;
+		    setustuck(0);
 		    return 1;
 		}
 		if (magic) {
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/artifact.c nethack/src/artifact.c
--- nethack.0/src/artifact.c	Wed Mar 20 18:43:00 2002
+++ nethack/src/artifact.c	Fri May 31 11:59:53 2002
@@ -830,7 +830,7 @@
 					nomovemsg = "";
 					if (magr && magr == u.ustuck
 						&& sticks(youmonst.data)) {
-					    u.ustuck = (struct monst *)0;
+					    setustuck((struct monst *)0);
 					    You("release %s!", mon_nam(magr));
 					}
 				}
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/botl.c nethack/src/botl.c
--- nethack.0/src/botl.c	Wed Mar 20 18:43:01 2002
+++ nethack/src/botl.c	Fri May 31 12:19:04 2002
@@ -25,11 +25,12 @@
  *
  * longest practical second status line at the moment is
  *	Astral Plane $:12345 HP:700(700) Pw:111(111) AC:-127 Xp:30/123456789
- *	T:123456 Satiated Conf FoodPois Ill Blind Stun Hallu Overloaded
- * -- or somewhat over 130 characters
+ *	T:123456 Satiated Conf FoodPois Ill Blind Stun Hallu Slime
+ *	Held Overloaded
+ * -- or somewhat over 140 characters
  */
-#if COLNO <= 140
-#define MAXCO 160
+#if COLNO <= 150
+#define MAXCO 170
 #else
 #define MAXCO (COLNO+20)
 #endif
@@ -288,6 +289,8 @@
 	if(Stunned)	   Sprintf(nb = eos(nb), " Stun");
 	if(Hallucination)  Sprintf(nb = eos(nb), " Hallu");
 	if(Slimed)         Sprintf(nb = eos(nb), " Slime");
+	if(u.ustuck && !u.uswallow)
+			   Sprintf(nb = eos(nb), " Held");
 	if(cap > UNENCUMBERED)
 		Sprintf(nb = eos(nb), " %s", enc_stat[cap]);
 	curs(WIN_STATUS, 1, 1);
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/do.c nethack/src/do.c
--- nethack.0/src/do.c	Wed Mar 20 18:43:02 2002
+++ nethack/src/do.c	Fri May 31 11:59:57 2002
@@ -981,7 +981,7 @@
 	if (Punished) unplacebc();
 	u.utrap = 0;				/* needed in level_tele */
 	fill_pit(u.ux, u.uy);
-	u.ustuck = 0;				/* idem */
+	setustuck(0);				/* idem */
 	u.uinwater = 0;
 	keepdogs(FALSE);
 	if (u.uswallow)				/* idem */
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/hack.c nethack/src/hack.c
--- nethack.0/src/hack.c	Wed Mar 20 18:43:06 2002
+++ nethack/src/hack.c	Fri May 31 11:59:52 2002
@@ -833,13 +833,13 @@
 		if (u.ustuck && (x != u.ustuck->mx || y != u.ustuck->my)) {
 		    if (distu(u.ustuck->mx, u.ustuck->my) > 2) {
 			/* perhaps it fled (or was teleported or ... ) */
-			u.ustuck = 0;
+			setustuck(0);
 		    } else if (sticks(youmonst.data)) {
 			/* When polymorphed into a sticking monster,
 			 * u.ustuck means it's stuck to you, not you to it.
 			 */
 			You("release %s.", mon_nam(u.ustuck));
-			u.ustuck = 0;
+			setustuck(0);
 		    } else {
 			/* If holder is asleep or paralyzed:
 			 *	37.5% chance of getting away,
@@ -854,7 +854,7 @@
 			case 0: case 1: case 2:
 			pull_free:
 			    You("pull free from %s.", mon_nam(u.ustuck));
-			    u.ustuck = 0;
+			    setustuck(0);
 			    break;
 			case 3:
 			    if (!u.ustuck->mcanmove) {
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/mhitm.c nethack/src/mhitm.c
--- nethack.0/src/mhitm.c	Wed Mar 20 18:43:08 2002
+++ nethack/src/mhitm.c	Fri May 31 11:59:57 2002
@@ -133,7 +133,7 @@
 		    if(!u.uswallow && (mtmp == u.ustuck)) {
 			if(!rn2(4)) {
 			    pline("%s releases you!", Monnam(mtmp));
-			    u.ustuck = 0;
+			    setustuck(0);
 			} else
 			    break;
 		    }
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/mhitu.c nethack/src/mhitu.c
--- nethack.0/src/mhitu.c	Wed Mar 20 18:43:08 2002
+++ nethack/src/mhitu.c	Fri May 31 12:21:41 2002
@@ -429,7 +429,7 @@
 		if (!youseeit) pline("It gets stuck on you.");
 		else pline("Wait, %s!  That's a %s named %s!",
 			   m_monnam(mtmp), youmonst.data->mname, plname);
-		u.ustuck = mtmp;
+		setustuck(mtmp);
 		youmonst.m_ap_type = M_AP_NOTHING;
 		youmonst.mappearance = 0;
 		newsym(u.ux,u.uy);
@@ -858,7 +858,7 @@
 			if (u_slip_free(mtmp, mattk)) {
 			    dmg = 0;
 			} else {
-			    u.ustuck = mtmp;
+			    setustuck(mtmp);
 			    pline("%s grabs you!", Monnam(mtmp));
 			}
 		    } else if(u.ustuck == mtmp) {
@@ -1143,7 +1143,7 @@
 	    case AD_STCK:
 		hitmsg(mtmp, mattk);
 		if (uncancelled && !u.ustuck && !sticks(youmonst.data))
-			u.ustuck = mtmp;
+			setustuck(mtmp);
 		break;
 	    case AD_WRAP:
 		if ((!mtmp->mcan || u.ustuck == mtmp) && !sticks(youmonst.data)) {
@@ -1153,7 +1153,7 @@
 			} else {
 			    pline("%s swings itself around you!",
 				  Monnam(mtmp));
-			    u.ustuck = mtmp;
+			    setustuck(mtmp);
 			}
 		    } else if(u.ustuck == mtmp) {
 			if (is_pool(mtmp->mx,mtmp->my) && !Swimming
@@ -1569,7 +1569,6 @@
 		remove_monster(mtmp->mx, mtmp->my);
 		mtmp->mtrapped = 0;		/* no longer on old trap */
 		place_monster(mtmp, u.ux, u.uy);
-		u.ustuck = mtmp;
 		newsym(mtmp->mx,mtmp->my);
 #ifdef STEED
 		if (is_animal(mtmp->data) && u.usteed) {
@@ -1610,6 +1609,7 @@
 		display_nhwindow(WIN_MESSAGE, FALSE);
 		vision_recalc(2);	/* hero can't see anything */
 		u.uswallow = 1;
+		setustuck(mtmp);
 		/* u.uswldtim always set > 1 */
 		tim_tmp = 25 - (int)mtmp->m_lev;
 		if (tim_tmp > 0) tim_tmp = rnd(tim_tmp) / 2;
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/mon.c nethack/src/mon.c
--- nethack.0/src/mon.c	Wed Mar 20 18:43:10 2002
+++ nethack/src/mon.c	Fri May 31 12:03:53 2002
@@ -1206,7 +1206,7 @@
     }
     mtmp2->nmon = fmon;
     fmon = mtmp2;
-    if (u.ustuck == mtmp) u.ustuck = mtmp2;
+    if (u.ustuck == mtmp) setustuck(mtmp2);
 #ifdef STEED
     if (u.usteed == mtmp) u.usteed = mtmp2;
 #endif
@@ -1613,7 +1613,7 @@
 			vision_full_recalc = 1;
 			docrt();
 		}
-		u.ustuck = 0;
+		setustuck(0);
 	}
 }
 
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/polyself.c nethack/src/polyself.c
--- nethack.0/src/polyself.c	Wed Mar 20 18:43:13 2002
+++ nethack/src/polyself.c	Fri May 31 11:59:52 2002
@@ -462,7 +462,7 @@
 	}
 	newsym(u.ux,u.uy);		/* Change symbol */
 
-	if (!sticky && !u.uswallow && u.ustuck && sticks(youmonst.data)) u.ustuck = 0;
+	if (!sticky && !u.uswallow && u.ustuck && sticks(youmonst.data)) setustuck(0);
 	else if (sticky && !sticks(youmonst.data)) uunstick();
 #ifdef STEED
 	if (u.usteed) {
@@ -1070,7 +1070,7 @@
 uunstick()
 {
 	pline("%s is no longer in your clutches.", Monnam(u.ustuck));
-	u.ustuck = 0;
+	setustuck(0);
 }
 
 void
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/restore.c nethack/src/restore.c
--- nethack.0/src/restore.c	Wed Mar 20 18:43:15 2002
+++ nethack/src/restore.c	Fri May 31 11:59:55 2002
@@ -447,7 +447,7 @@
 		for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
 			if (mtmp->m_id == stuckid) break;
 		if (!mtmp) panic("Cannot find the monster ustuck.");
-		u.ustuck = mtmp;
+		setustuck(mtmp);
 	}
 #ifdef STEED
 	if (steedid) {
@@ -550,7 +550,7 @@
 	 * afterwards, and in the meantime at least u.usteed may mislead
 	 * place_monster() on other levels
 	 */
-	u.ustuck = (struct monst *)0;
+	setustuck((struct monst *)0);
 #ifdef STEED
 	u.usteed = (struct monst *)0;
 #endif
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/save.c nethack/src/save.c
--- nethack.0/src/save.c	Wed Mar 20 18:43:16 2002
+++ nethack/src/save.c	Fri May 31 11:59:54 2002
@@ -220,7 +220,7 @@
 	/* these pointers are no longer valid, and at least u.usteed
 	 * may mislead place_monster() on other levels
 	 */
-	u.ustuck = (struct monst *)0;
+	setustuck((struct monst *)0);
 #ifdef STEED
 	u.usteed = (struct monst *)0;
 #endif
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/teleport.c nethack/src/teleport.c
--- nethack.0/src/teleport.c	Wed Mar 20 18:43:18 2002
+++ nethack/src/teleport.c	Fri May 31 11:59:54 2002
@@ -218,7 +218,7 @@
 		unplacebc();
 	}
 	u.utrap = 0;
-	u.ustuck = 0;
+	setustuck(0);
 	u.ux0 = u.ux;
 	u.uy0 = u.uy;
 	u.ux = nux;
@@ -846,7 +846,7 @@
 			u.ux = x;
 			u.uy = y;
 			docrt();
-		} else	u.ustuck = 0;
+		} else	setustuck(0);
 	}
 
 	newsym(x, y);				/* update new location */
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/u_init.c nethack/src/u_init.c
--- nethack.0/src/u_init.c	Wed Mar 20 18:43:20 2002
+++ nethack/src/u_init.c	Fri May 31 12:03:53 2002
@@ -524,7 +524,7 @@
 	/* zero u, including pointer values --
 	 * necessary when aborting from a failed restore */
 	(void) memset((genericptr_t)&u, 0, sizeof(u));
-	u.ustuck = (struct monst *)0;
+	setustuck((struct monst *)0);
 
 #if 0	/* documentation of more zero values as desirable */
 	u.usick_cause[0] = 0;
diff -r -X /home/roderick/.diff-exclude -u nethack.0/src/uhitm.c nethack/src/uhitm.c
--- nethack.0/src/uhitm.c	Wed Mar 20 18:43:20 2002
+++ nethack/src/uhitm.c	Fri May 31 11:59:54 2002
@@ -135,7 +135,7 @@
 		 */
 		if(mtmp->m_ap_type && !Protection_from_shape_changers) {
 		    if(!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data,AD_STCK))
-			u.ustuck = mtmp;
+			setustuck(mtmp);
 		}
 		wakeup(mtmp); /* always necessary; also un-mimics mimics */
 		return TRUE;
@@ -432,7 +432,7 @@
 		    } else monflee(mon, 0, FALSE, TRUE);
 
 		    if(u.ustuck == mon && !u.uswallow && !sticks(youmonst.data))
-			u.ustuck = 0;
+			setustuck(0);
 		}
 		/* Vorpal Blade hit converted to miss */
 		/* could be headless monster or worm tail */
@@ -1399,7 +1399,7 @@
 		break;
 	    case AD_STCK:
 		if (!sticks(mdef->data))
-		    u.ustuck = mdef; /* it's now stuck to you */
+		    setustuck(mdef); /* it's now stuck to you */
 		break;
 	    case AD_WRAP:
 		if (!sticks(mdef->data)) {
@@ -1409,7 +1409,7 @@
 			} else {
 			    You("swing yourself around %s!",
 				  mon_nam(mdef));
-			    u.ustuck = mdef;
+			    setustuck(mdef);
 			}
 		    } else if(u.ustuck == mdef) {
 			/* Monsters don't wear amulets of magical breathing */
@@ -1852,7 +1852,7 @@
 				sum[i] = damageum(mon, mattk);
 			    } else if(i >= 2 && sum[i-1] && sum[i-2]) {
 				You("grab %s!", mon_nam(mon));
-				u.ustuck = mon;
+				setustuck(mon);
 				sum[i] = damageum(mon, mattk);
 			    }
 			}
@@ -2198,7 +2198,7 @@
 		   *what = 0;
 
 	if(!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data,AD_STCK))
-	    u.ustuck = mtmp;
+	    setustuck(mtmp);
 
 	if (Blind) {
 	    if (!Blind_telepat)

-- 
Roderick Schertler
roderick@argon.org
