]> granicus.if.org Git - nethack/commitdiff
fix #H8922 - no "you finish eating" message
authorPatR <rankin@nethack.org>
Sat, 22 Jun 2019 20:03:50 +0000 (13:03 -0700)
committerPatR <rankin@nethack.org>
Sat, 22 Jun 2019 20:03:50 +0000 (13:03 -0700)
after being interrupted and then resuming.  Resuming a multi-turn
food when it only had one bite left was the culprit.

doc/fixes36.3
src/eat.c

index daedd86ecce16811137d1389513f317474f7db53..bbc3246680f62e2e6deb4b76b31d3c77733e7dbb 100644 (file)
@@ -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
index de056331032a5e457157d959dbb4515511e4b756..efc04cdfb2c51cf18034449774e941f351fd0714 100644 (file)
--- 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.
      */