diff --git a/doc/fixes36.3 b/doc/fixes36.3 index daedd86ec..bbc324668 100644 --- a/doc/fixes36.3 +++ b/doc/fixes36.3 @@ -1,4 +1,4 @@ -$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.62 $ $NHDT-Date: 1561081353 2019/06/21 01:42:33 $ +$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.64 $ $NHDT-Date: 1561233801 2019/06/22 20:03:21 $ This fixes36.3 file is here to capture information about updates in the 3.6.x lineage following the release of 3.6.2 in May 2019. Please note, however, @@ -80,6 +80,10 @@ add Space, Return, and Escape to '? k' (help for menu control keys) hero can no longer negotiate a bribe with a demon lord when deaf wishing for "foo amulet" now yields an "amulet of foo" rather than random one code in parse_conf_file() to trim trailing blanks/cr was skipping over them +partly eaten food with one bite left had message anomalies when eaten; the + usual "you resume your meal" case lacked the "you're finished" message + when done; eating something else in between to clobber meal context + resulted in no messages at all when restarting and finishing last bite Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository diff --git a/src/eat.c b/src/eat.c index de0563310..efc04cdfb 100644 --- a/src/eat.c +++ b/src/eat.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 eat.c $NHDT-Date: 1559670604 2019/06/04 17:50:04 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.202 $ */ +/* NetHack 3.6 eat.c $NHDT-Date: 1561233801 2019/06/22 20:03:21 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.203 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -25,7 +25,7 @@ STATIC_DCL void FDECL(cpostfx, (int)); STATIC_DCL void FDECL(consume_tin, (const char *)); STATIC_DCL void FDECL(start_tin, (struct obj *)); STATIC_DCL int FDECL(eatcorpse, (struct obj *)); -STATIC_DCL void FDECL(start_eating, (struct obj *)); +STATIC_DCL void FDECL(start_eating, (struct obj *, BOOLEAN_P)); STATIC_DCL void FDECL(fprefx, (struct obj *)); STATIC_DCL void FDECL(fpostfx, (struct obj *)); STATIC_DCL int NDECL(bite); @@ -1419,15 +1419,12 @@ const char *mesg; gainstr(tin, 0, FALSE); tin = costly_tin(COST_OPEN); - - lesshungry(tin->blessed - ? 600 /* blessed */ - : !tin->cursed - ? (400 + rnd(200)) /* uncursed */ - : (200 + rnd(400))); /* cursed */ + lesshungry(tin->blessed ? 600 /* blessed */ + : !tin->cursed ? (400 + rnd(200)) /* uncursed */ + : (200 + rnd(400))); /* cursed */ } -use_up_tin: + use_up_tin: if (carried(tin)) useup(tin); else @@ -1505,7 +1502,7 @@ struct obj *otmp; } pline("Using %s you try to open the tin.", yobjnam(uwep, (char *) 0)); } else { - no_opener: + no_opener: pline("It is not so easy to open this tin."); if (Glib) { pline_The("tin slips from your %s.", @@ -1729,8 +1726,9 @@ struct obj *otmp; /* called as you start to eat */ STATIC_OVL void -start_eating(otmp) +start_eating(otmp, already_partly_eaten) struct obj *otmp; +boolean already_partly_eaten; { const char *old_nomovemsg, *save_nomovemsg; @@ -1774,7 +1772,8 @@ struct obj *otmp; if (++context.victual.usedtime >= context.victual.reqtime) { /* print "finish eating" message if they just resumed -dlc */ - done_eating(context.victual.reqtime > 1 ? TRUE : FALSE); + done_eating((context.victual.reqtime > 1 + || already_partly_eaten) ? TRUE : FALSE); return; } @@ -1783,28 +1782,35 @@ struct obj *otmp; } /* - * called on "first bite" of (non-corpse) food. - * used for non-rotten non-tin non-corpse food + * Called on "first bite" of (non-corpse) food, after touchfood() has + * marked it 'partly eaten'. Used for non-rotten non-tin non-corpse food. + * Messages should use present tense since multi-turn food won't be + * finishing at the time they're issued. */ STATIC_OVL void fprefx(otmp) struct obj *otmp; { switch (otmp->otyp) { - case FOOD_RATION: + case FOOD_RATION: /* nutrition 800 */ + /* 200+800 remains below 1000+1, the satiation threshold */ if (u.uhunger <= 200) - pline(Hallucination ? "Oh wow, like, superior, man!" - : "That food really hit the spot!"); - else if (u.uhunger <= 700) - pline("That satiated your %s!", body_part(STOMACH)); + pline("%s!", Hallucination ? "Oh wow, like, superior, man" + : "This food really hits the spot"); + + /* 700-1+800 remains below 1500, the choking threshold which + triggers "you're having a hard time getting it down" feedback */ + else if (u.uhunger < 700) + pline("This satiates your %s!", body_part(STOMACH)); + /* [satiation message may be inaccurate if eating gets interrupted] */ break; case TRIPE_RATION: - if (carnivorous(youmonst.data) && !humanoid(youmonst.data)) - pline("That tripe ration was surprisingly good!"); - else if (maybe_polyd(is_orc(youmonst.data), Race_if(PM_ORC))) + if (carnivorous(youmonst.data) && !humanoid(youmonst.data)) { + pline("This tripe ration is surprisingly good!"); + } else if (maybe_polyd(is_orc(youmonst.data), Race_if(PM_ORC))) { pline(Hallucination ? "Tastes great! Less filling!" : "Mmm, tripe... not bad!"); - else { + } else { pline("Yak - dog food!"); more_experienced(1, 0); newexplevel(); @@ -1837,7 +1843,7 @@ struct obj *otmp; default: if (otmp->otyp == SLIME_MOLD && !otmp->cursed && otmp->spe == context.current_fruit) { - pline("My, that was a %s %s!", + pline("My, this is a %s %s!", Hallucination ? "primo" : "yummy", singular(otmp, xname)); } else if (otmp->otyp == APPLE && otmp->cursed && !Sleep_resistance) { @@ -1856,9 +1862,7 @@ struct obj *otmp; if (!Hallucination) { pline("Core dumped."); } else { - /* This is based on an old Usenet joke, a fake a.out manual - * page - */ + /* based on an old Usenet joke, a fake a.out manual page */ int x = rnd(100); pline("%s -- core dumped.", @@ -1876,7 +1880,7 @@ struct obj *otmp; will be abused more times before illness completes */ make_vomiting((Vomiting & TIMEOUT) + (long) d(10, 4), TRUE); } else { - give_feedback: + give_feedback: pline("This %s is %s", singular(otmp, xname), otmp->cursed ? (Hallucination ? "grody!" : "terrible!") @@ -2443,7 +2447,8 @@ doeat() { struct obj *otmp; int basenutrit; /* nutrition of full item */ - boolean dont_start = FALSE, nodelicious = FALSE; + boolean dont_start = FALSE, nodelicious = FALSE, + already_partly_eaten; if (Strangled) { pline("If you can't breathe air, how can you consume solids?"); @@ -2605,8 +2610,10 @@ doeat() context.victual.piece = touchfood(otmp); if (context.victual.piece) context.victual.o_id = context.victual.piece->o_id; - You("resume your meal."); - start_eating(context.victual.piece); + You("resume %syour meal.", + (context.victual.usedtime + 1 >= context.victual.reqtime) + ? "the last bite of " : ""); + start_eating(context.victual.piece, FALSE); return 1; } @@ -2621,6 +2628,7 @@ doeat() /* KMH, conduct */ u.uconduct.food++; + already_partly_eaten = otmp->oeaten ? TRUE : FALSE; context.victual.o_id = 0; context.victual.piece = otmp = touchfood(otmp); if (context.victual.piece) @@ -2674,8 +2682,13 @@ doeat() dont_start = TRUE; } consume_oeaten(otmp, 1); /* oeaten >>= 1 */ - } else + } else if (!already_partly_eaten) { fprefx(otmp); + } else { + You("%s %s.", + (context.victual.reqtime == 1) ? "eat" : "begin eating", + doname(otmp)); + } } /* re-calc the nutrition */ @@ -2707,7 +2720,7 @@ doeat() context.victual.canchoke = (u.uhs == SATIATED); if (!dont_start) - start_eating(otmp); + start_eating(otmp, already_partly_eaten); return 1; } @@ -3164,7 +3177,7 @@ int corpsecheck; /* 0, no check, 1, corpses, 2, tinnable corpses */ } } -skipfloor: + skipfloor: /* We cannot use ALL_CLASSES since that causes getobj() to skip its * "ugly checks" and we need to check for inedible items. */