Skip to content

Commit

Permalink
potion mixing - healing vs "bad" potions
Browse files Browse the repository at this point in the history
Another part of github issue 229, mixtype() didn't have either 'break'
or '/*FALLTHRU*/' separating healing from extra healing, extra healing
from full healing, and full healing from unicorn horn.  So dipping
"bad" potions (sickness, confusion, blindness, hallucination) into
healing/extra healing/full healing or vice versa operated the same as
dipping a unicorn horn into the bad potion (producing fruit juice for
sickness and water for the others).  It wasn't clear from the code
whether or not that was intentional.  It actually seems reasonable
(albeit suboptimal use of {plain, extra, full} healing), so continue
to allow it and make the code clear that it's intentional.
  • Loading branch information
PatR committed Oct 5, 2019
1 parent f11f4de commit c6b7540
Showing 1 changed file with 23 additions and 31 deletions.
54 changes: 23 additions & 31 deletions src/potion.c
@@ -1,4 +1,4 @@
/* NetHack 3.6 potion.c $NHDT-Date: 1560850774 2019/06/18 09:39:34 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.162 $ */
/* NetHack 3.6 potion.c $NHDT-Date: 1570235292 2019/10/05 00:28:12 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.163 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2013. */
/* NetHack may be freely redistributed. See license for details. */
Expand Down Expand Up @@ -1769,41 +1769,33 @@ STATIC_OVL short
mixtype(o1, o2)
register struct obj *o1, *o2;
{
int o1typ = o1->otyp, o2typ = o2->otyp;

/* cut down on the number of cases below */
if (o1->oclass == POTION_CLASS
&& (o2->otyp == POT_GAIN_LEVEL || o2->otyp == POT_GAIN_ENERGY
|| o2->otyp == POT_HEALING || o2->otyp == POT_EXTRA_HEALING
|| o2->otyp == POT_FULL_HEALING || o2->otyp == POT_ENLIGHTENMENT
|| o2->otyp == POT_FRUIT_JUICE)) {
struct obj *swp;

swp = o1;
o1 = o2;
o2 = swp;
&& (o2typ == POT_GAIN_LEVEL || o2typ == POT_GAIN_ENERGY
|| o2typ == POT_HEALING || o2typ == POT_EXTRA_HEALING
|| o2typ == POT_FULL_HEALING || o2typ == POT_ENLIGHTENMENT
|| o2typ == POT_FRUIT_JUICE)) {
/* swap o1 and o2 */
o1typ = o2->otyp;
o2typ = o1->otyp;
}

switch (o1->otyp) {
switch (o1typ) {
case POT_HEALING:
switch (o2->otyp) {
case POT_SPEED:
case POT_GAIN_LEVEL:
case POT_GAIN_ENERGY:
if (o2typ == POT_SPEED)
return POT_EXTRA_HEALING;
}
/*FALLTHRU*/
case POT_EXTRA_HEALING:
switch (o2->otyp) {
case POT_GAIN_LEVEL:
case POT_GAIN_ENERGY:
return POT_FULL_HEALING;
}
case POT_FULL_HEALING:
switch (o2->otyp) {
case POT_GAIN_LEVEL:
case POT_GAIN_ENERGY:
return POT_GAIN_ABILITY;
}
if (o2typ == POT_GAIN_LEVEL || o2typ == POT_GAIN_ENERGY)
return (o1typ == POT_HEALING) ? POT_EXTRA_HEALING
: (o1typ == POT_EXTRA_HEALING) ? POT_FULL_HEALING
: POT_GAIN_ABILITY;
/*FALLTHRU*/
case UNICORN_HORN:
switch (o2->otyp) {
switch (o2typ) {
case POT_SICKNESS:
return POT_FRUIT_JUICE;
case POT_HALLUCINATION:
Expand All @@ -1813,12 +1805,12 @@ register struct obj *o1, *o2;
}
break;
case AMETHYST: /* "a-methyst" == "not intoxicated" */
if (o2->otyp == POT_BOOZE)
if (o2typ == POT_BOOZE)
return POT_FRUIT_JUICE;
break;
case POT_GAIN_LEVEL:
case POT_GAIN_ENERGY:
switch (o2->otyp) {
switch (o2typ) {
case POT_CONFUSION:
return (rn2(3) ? POT_BOOZE : POT_ENLIGHTENMENT);
case POT_HEALING:
Expand All @@ -1834,7 +1826,7 @@ register struct obj *o1, *o2;
}
break;
case POT_FRUIT_JUICE:
switch (o2->otyp) {
switch (o2typ) {
case POT_SICKNESS:
return POT_SICKNESS;
case POT_ENLIGHTENMENT:
Expand All @@ -1846,7 +1838,7 @@ register struct obj *o1, *o2;
}
break;
case POT_ENLIGHTENMENT:
switch (o2->otyp) {
switch (o2typ) {
case POT_LEVITATION:
if (rn2(3))
return POT_GAIN_LEVEL;
Expand Down

0 comments on commit c6b7540

Please sign in to comment.