candelabrum weight and burn out

Adjust the Candelabrum of Invocation's weight when it has candles
attached.  This has been a known issue ever since the candelabrum and
candles were introduced.

When the candelabrum burns out, update persistent inventory window to
show that it no longer has candles.
This commit is contained in:
PatR
2017-09-25 13:20:30 -07:00
parent a69e4d4ec4
commit 26dd891038
5 changed files with 31 additions and 10 deletions

View File

@@ -443,11 +443,13 @@ fix buffer overflow in wizard mode for '#' command when 'extmenu' option is on
"you suddenly vomit" was given two turns before actually vomiting, so you
could get that message, move a bit, then get "you can move again"
after the 2 turn freeze applied along with the actual vomit
fix mention_walls reporting secret doors as solid walls
corpses and other flammable items not subject to direct burning or fire-based
erosion which were thrown or dropped into lava remained intact
if a potion on the floor survived a land mine explosion and got propelled at
the hero, it didn't behave like a potion if it hit
adjust candelabrum's weight when candles are attached
when lit candelabrum burned out, persistent inventory window showed that it
was no longer lit but still showed phantom candles attached
Fixes to Post-3.6.0 Problems that Were Exposed Via git Repository
@@ -504,6 +506,7 @@ hero poly'd into vampire could drain monster down to 0 HP without killing it,
triggering impossible "dmonsfree: 1 removed doesn't match 0 pending"
"you observe a fog cloud where a vampire/bat was" if an unseen vampire on the
far side of a closed door shifted shape to pass under that door
fix mention_walls reporting secret doors as solid stone
Platform- and/or Interface-Specific Fixes

View File

@@ -42,6 +42,7 @@ struct obj {
schar spe; /* quality of weapon, weptool, armor or ring (+ or -);
number of charges for wand or charged tool ( >= -1 );
number of candles attached to candelabrum;
marks your eggs, tin variety and spinach tins;
Schroedinger's Box (1) or royal coffers for a court (2);
tells which fruit a fruit is;

View File

@@ -1224,6 +1224,9 @@ struct obj **optr;
end_burn(obj, TRUE);
/* candles are now gone */
useupall(obj);
/* candelabrum's weight is changing */
otmp->owt = weight(otmp);
update_inventory();
}
}

View File

@@ -1339,7 +1339,7 @@ int
weight(obj)
register struct obj *obj;
{
int wt = objects[obj->otyp].oc_weight;
int wt = (int) objects[obj->otyp].oc_weight;
/* glob absorpsion means that merging globs accumulates weight while
quantity stays 1, so update 'wt' to reflect that, unless owt is 0,
@@ -1390,6 +1390,8 @@ register struct obj *obj;
return (int) ((obj->quan + 50L) / 100L);
} else if (obj->otyp == HEAVY_IRON_BALL && obj->owt != 0) {
return (int) obj->owt; /* kludge for "very" heavy iron ball */
} else if (obj->otyp == CANDELABRUM_OF_INVOCATION && obj->spe) {
return wt + obj->spe * (int) objects[TALLOW_CANDLE].oc_weight;
}
return (wt ? wt * (int) obj->quan : ((int) obj->quan + 1) >> 1);
}

View File

@@ -966,7 +966,7 @@ anything *arg;
long timeout;
{
struct obj *obj = arg->a_obj;
boolean canseeit, many, menorah, need_newsym;
boolean canseeit, many, menorah, need_newsym, need_invupdate;
xchar x, y;
char whose[BUFSZ];
@@ -983,6 +983,7 @@ long timeout;
if (menorah) {
obj->spe = 0; /* no more candles */
obj->owt = weight(obj);
} else if (Is_candle(obj) || obj->otyp == POT_OIL) {
/* get rid of candles and burning oil potions;
we know this object isn't carried by hero,
@@ -1007,7 +1008,7 @@ long timeout;
} else {
canseeit = FALSE;
}
need_newsym = FALSE;
need_newsym = need_invupdate = FALSE;
/* obj->age is the age remaining at this point. */
switch (obj->otyp) {
@@ -1016,6 +1017,8 @@ long timeout;
if (canseeit) {
switch (obj->where) {
case OBJ_INVENT:
need_invupdate = TRUE;
/*FALLTHRU*/
case OBJ_MINVENT:
pline("%spotion of oil has burnt away.", whose);
break;
@@ -1077,6 +1080,8 @@ long timeout;
if (canseeit || obj->where == OBJ_INVENT) {
switch (obj->where) {
case OBJ_INVENT:
need_invupdate = TRUE;
/*FALLTHRU*/
case OBJ_MINVENT:
if (obj->otyp == BRASS_LANTERN)
pline("%slantern has run out of power.", whose);
@@ -1154,6 +1159,8 @@ long timeout;
if (menorah) {
switch (obj->where) {
case OBJ_INVENT:
need_invupdate = TRUE;
/*FALLTHRU*/
case OBJ_MINVENT:
pline("%scandelabrum's flame%s.", whose,
many ? "s die" : " dies");
@@ -1166,15 +1173,18 @@ long timeout;
} else {
switch (obj->where) {
case OBJ_INVENT:
/* no need_invupdate for update_inventory() necessary;
useupall() -> freeinv() handles it */
/*FALLTHRU*/
case OBJ_MINVENT:
pline("%s %s consumed!", Yname2(obj),
many ? "are" : "is");
break;
case OBJ_FLOOR:
/*
You see some wax candles consumed!
You see a wax candle consumed!
*/
You see some wax candles consumed!
You see a wax candle consumed!
*/
You_see("%s%s consumed!", many ? "some " : "",
many ? xname(obj) : an(xname(obj)));
need_newsym = TRUE;
@@ -1192,6 +1202,7 @@ long timeout;
if (menorah) {
obj->spe = 0;
obj->owt = weight(obj);
} else {
if (carried(obj)) {
useupall(obj);
@@ -1205,7 +1216,7 @@ long timeout;
}
obj = (struct obj *) 0;
}
break;
break; /* case [age ==] 0 */
default:
/*
@@ -1218,8 +1229,7 @@ long timeout;
if (obj && obj->age)
begin_burn(obj, TRUE);
break;
break; /* case [otyp ==] candelabrum|tallow_candle|wax_candle */
default:
impossible("burn_object: unexpeced obj %s", xname(obj));
@@ -1227,6 +1237,8 @@ long timeout;
}
if (need_newsym)
newsym(x, y);
if (need_invupdate)
update_inventory();
}
/*