]> granicus.if.org Git - nethack/commitdiff
Correct timing when attaching lit candles to the candelabrum
authorAlex Smith <ais523@nethack4.org>
Thu, 19 Mar 2020 19:56:16 +0000 (19:56 +0000)
committerAlex Smith <ais523@nethack4.org>
Thu, 19 Mar 2020 19:56:16 +0000 (19:56 +0000)
Before this commit, attaching a lit candle would reduce the amount
of fuel in the candelabrum to 0, 15 or 75 turns due to a failure to
account for time stored in the candle's burn timer. Fixing this is
very important because a time of 0 turns on the candelabrum is not
supposed to be possible.

doc/fixes37.0
src/apply.c

index 1a63ba915b634826328091410efaf536a0f1f975..fe83d02f645d37778c0152305d3c8c288b934f4a 100644 (file)
@@ -84,6 +84,9 @@ when Punished and carrying the iron ball and levitating, hurtling in the
        opposite direction of a thrown object didn't bring along the chain
 recognize "kirin" as alias for "ki-rin" when asked to create a monster
 make unique swallowing monsters (Juiblex) resist magical digging from inside
+correctly account for fuel remaining when lit candles are attached
+       to candelabrum (the previous code would make the game unwinnable if
+       there were 15 or fewer turns remaining)
 
 
 Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
index e65241a238b87d909391aac49c100f28a2021cce..43a4b14bb138975cd5404d68bbfbae7ccab6f7f5 100644 (file)
@@ -1215,12 +1215,14 @@ struct obj **optr;
     register struct obj *otmp;
     const char *s = (obj->quan != 1) ? "candles" : "candle";
     char qbuf[QBUFSZ], qsfx[QBUFSZ], *q;
+    boolean was_lamplit;
 
     if (u.uswallow) {
         You(no_elbow_room);
         return;
     }
 
+    /* obj is the candle; otmp is the candelabrum */
     otmp = carrying(CANDELABRUM_OF_INVOCATION);
     if (!otmp || otmp->spe == 7) {
         use_lamp(obj);
@@ -1247,14 +1249,23 @@ struct obj **optr;
             s = (obj->quan != 1) ? "candles" : "candle";
         } else
             *optr = 0;
+
+        /* The candle's age field doesn't correctly reflect the amount
+           of fuel in it while it's lit, because the fuel is measured
+           by the timer. So to get accurate age updating, we need to
+           end the burn temporarily while attaching the candle. */
+        was_lamplit = obj->lamplit;
+        if (was_lamplit)
+            end_burn(obj, TRUE);
+
         You("attach %ld%s %s to %s.", obj->quan, !otmp->spe ? "" : " more", s,
             the(xname(otmp)));
         if (!otmp->spe || otmp->age > obj->age)
             otmp->age = obj->age;
         otmp->spe += (int) obj->quan;
-        if (otmp->lamplit && !obj->lamplit)
+        if (otmp->lamplit && !was_lamplit)
             pline_The("new %s magically %s!", s, vtense(s, "ignite"));
-        else if (!otmp->lamplit && obj->lamplit)
+        else if (!otmp->lamplit && was_lamplit)
             pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes");
         if (obj->unpaid)
             verbalize("You %s %s, you bought %s!",
@@ -1268,8 +1279,6 @@ struct obj **optr;
         if (otmp->lamplit)
             obj_merge_light_sources(otmp, otmp);
         /* candles are no longer a separate light source */
-        if (obj->lamplit)
-            end_burn(obj, TRUE);
         /* candles are now gone */
         useupall(obj);
         /* candelabrum's weight is changing */