fix github issue #742 - suit of no digestion

Reported by vultur-cadens:  slow digestion from wearing white dragon
scales/mail blocked per-turn hunger and didn't cause any hunger,
unlike ring of slow digestion which blocks per-turn hunger but still
causes some hunger as a worn ring itself.  If no rings or amulet
were worn, wearing the suit prevented the hero from ever burning any
nutrition.

Change to treat wearing the suit to be quite a bit like wearing a
ring, unless hero is also wearing an actual ring of slow digestion
(then the hunger cost of the suit is 'free').

Wearing a ring of slow digestion and another ring consumes two units
of nutrition every 20 turns, no matter what suit.  Wearing white
dragon scales/mail and two non-slow digestion rings now consumes three
units of nutrition every 20 turns.  Using the suit to effectively get
an extra ring finger isn't free.

Fixes #742
This commit is contained in:
PatR
2022-04-22 06:11:12 -07:00
parent e584f718a8
commit e8374b36a1
2 changed files with 21 additions and 0 deletions
+18
View File
@@ -3036,8 +3036,26 @@ gethungry(void)
* +0 ring of protection might do something (enhanced "magical
* cancellation") if hero doesn't have protection from some
* other source (cloak or second ring).
*
* [If wearing duplicate rings whose effects don't stack,
* should they both consume nutrition, or just one of them?
* Two +0 rings of protection are treated as if only one,
* but this could apply to most rings.]
*/
switch (accessorytime) { /* note: use even cases among 0..19 only */
case 0:
/* 3.7: if not wearing a ring of slow digestion, obtaining
that property from worn armor (white dragon scales/mail)
causes the armor to burn nutrition; since it's not
actually a ring, we don't check for it on the ring
turns; because of that, wearing two (non-slow digestion)
rings plus the armor consumes more nutrition that one
non-slow digestion ring plus ring of slow digestion */
if (Slow_digestion
&& (!uright || uright->otyp != RIN_SLOW_DIGESTION)
&& (!uleft || uleft->otyp != RIN_SLOW_DIGESTION))
u.uhunger--;
break;
case 4:
if (uleft && uleft->otyp != MEAT_RING
/* more hungry if +/- is nonzero or +/- doesn't apply or