From 1fe4018f3bf3e98f26eb1517b77735a896dcad74 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Thu, 8 Feb 2007 23:33:14 +0000 Subject: [PATCH] fix #Q295 - post-choking food side-effects From a bug report, but just received: if you choked while eating a cockatrice egg and survived, the turn-to-stone sequence wouldn't be initiated. For such eggs, turning to stone starts when the food is finished rather than when it's started, and fpostfx() wasn't called for food that triggered choking so the egg went away without actually being finished. Fortune cookies, lumps of royal jelly, and a few other things suffered from the same situation. --- doc/fixes34.4 | 2 ++ src/eat.c | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/doc/fixes34.4 b/doc/fixes34.4 index c3fd2bc2b..88e7ce4a2 100644 --- a/doc/fixes34.4 +++ b/doc/fixes34.4 @@ -309,6 +309,8 @@ vomiting countdown actually triggered the final vomit code twice rats aren't capable of vomiting fireproof, non-rustable weapon would be revealed as fireproof by hitting a rust-causing target; ditto for fixed crysknife +surviving choking while eating various foods (cockatrice egg, fortune cookie, + wolfsbane, others) didn't carry through to those foods' side-effects Platform- and/or Interface-Specific Fixes diff --git a/src/eat.c b/src/eat.c index 3cef6fc7a..8da84fc2a 100644 --- a/src/eat.c +++ b/src/eat.c @@ -1635,6 +1635,8 @@ STATIC_OVL void start_eating(otmp) /* called as you start to eat */ register struct obj *otmp; { + const char *old_nomovemsg, *save_nomovemsg; + #ifdef DEBUG debugpline("start_eating: %lx (victual = %lx)", otmp, context.victual.piece); debugpline("reqtime = %d", context.victual.reqtime); @@ -1653,7 +1655,20 @@ start_eating(otmp) /* called as you start to eat */ } } - if (bite()) return; + old_nomovemsg = nomovemsg; + if (bite()) { + /* survived choking, finish off food that's nearly done; + need this to handle cockatrice eggs, fortune cookies, etc */ + if (++context.victual.usedtime >= context.victual.reqtime) { + /* don't want done_eating() to issue nomovemsg if it + is due to vomit() called by bite() */ + save_nomovemsg = nomovemsg; + if (!old_nomovemsg) nomovemsg = 0; + done_eating(FALSE); + if (!old_nomovemsg) nomovemsg = save_nomovemsg; + } + return; + } if (++context.victual.usedtime >= context.victual.reqtime) { /* print "finish eating" message if they just resumed -dlc */ -- 2.40.0