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 */