From dd6ebbaceafaf4efa1c492027bfefc87bcca30ce Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Thu, 19 Mar 2020 19:56:16 +0000 Subject: [PATCH] Correct timing when attaching lit candles to the candelabrum 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 | 3 +++ src/apply.c | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/doc/fixes37.0 b/doc/fixes37.0 index 1a63ba915..fe83d02f6 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -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 diff --git a/src/apply.c b/src/apply.c index e65241a23..43a4b14bb 100644 --- a/src/apply.c +++ b/src/apply.c @@ -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 */ -- 2.50.1