Newsgroups: rec.games.roguelike.nethack Cc: nethack-bugs@nethack.org Subject: Re: YAS (and I do mean stupid) D References: From: Roderick Schertler Date: 31 May 2002 12:33:29 -0400 Message-ID: Lines: 354 X-Newsreader: Gnus v5.7/Emacs 20.7 On Wed, 29 May 2002 17:17:05 -0400, Rast 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