-/* NetHack 3.6 potion.c $NHDT-Date: 1549074254 2019/02/02 02:24:14 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.160 $ */
+/* NetHack 3.6 potion.c $NHDT-Date: 1573848199 2019/11/15 20:03:19 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.167 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2013. */
/* NetHack may be freely redistributed. See license for details. */
/* JNetHack Copyright */
/* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
-/* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2019 */
+/* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2020 */
/* JNetHack may be freely redistributed. See license for details. */
#include "hack.h"
if (msg)
pline("%s", msg);
}
- if (!Slimed)
+ if (!Slimed) {
dealloc_killer(find_delayed_killer(SLIMED));
+ /* fake appearance is set late in turn-to-slime countdown */
+ if (U_AP_TYPE == M_AP_MONSTER
+ && youmonst.mappearance == PM_GREEN_SLIME) {
+ youmonst.m_ap_type = M_AP_NOTHING;
+ youmonst.mappearance = 0;
+ }
+ }
}
/* start or stop petrification */
}
}
+/* set or clear "slippery fingers" */
+void
+make_glib(xtime)
+int xtime;
+{
+ set_itimeout(&Glib, xtime);
+ /* may change "(being worn)" to "(being worn; slippery)" or vice versa */
+ if (uarmg)
+ update_inventory();
+}
+
void
self_invis_message()
{
#endif
iflags.last_msg = PLNMSG_OBJ_GLOWS;
targobj->bknown = !Hallucination;
+ } else {
+ /* didn't see what happened: forget the BUC state if that was
+ known unless the bless/curse state of the water is known;
+ without this, hero would know the new state even without
+ seeing the glow; priest[ess] will immediately relearn it */
+ if (!potion->bknown || !potion->dknown)
+ targobj->bknown = 0;
+ /* [should the bknown+dknown exception require that water
+ be discovered or at least named?] */
}
/* potions of water are the only shop goods whose price depends
on their curse/bless state */
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:
}
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:
}
break;
case POT_FRUIT_JUICE:
- switch (o2->otyp) {
+ switch (o2typ) {
case POT_SICKNESS:
return POT_SICKNESS;
case POT_ENLIGHTENMENT:
}
break;
case POT_ENLIGHTENMENT:
- switch (o2->otyp) {
+ switch (o2typ) {
case POT_LEVITATION:
if (rn2(3))
return POT_GAIN_LEVEL;
to 'amt' because that's not implemented] */
obj->in_use = 1;
/*JP
- pline("BOOM! They explode!");
+ pline("%sThey explode!", !Deaf ? "BOOM! " : "");
*/
- pline("\83o\81[\83\93\81I\94\9a\94\82µ\82½\81I");
+ pline("%s\94\9a\94\82µ\82½\81I", !Deaf ? "\83o\81[\83\93\81I" : "");
wake_nearto(u.ux, u.uy, (BOLT_LIM + 1) * (BOLT_LIM + 1));
exercise(A_STR, FALSE);
if (!breathless(youmonst.data) || haseyes(youmonst.data))
if (mixture != STRANGE_OBJECT) {
obj->otyp = mixture;
} else {
+ struct obj *otmp;
+
switch (obj->odiluted ? 1 : rnd(8)) {
case 1:
obj->otyp = POT_WATER;
case 3:
obj->otyp = POT_SICKNESS;
break;
- case 4: {
- struct obj *otmp = mkobj(POTION_CLASS, FALSE);
-
+ case 4:
+ otmp = mkobj(POTION_CLASS, FALSE);
obj->otyp = otmp->otyp;
obfree(otmp, (struct obj *) 0);
break;
- }
default:
useupall(obj);
- if (!Blind)
-/*JP
- pline_The("mixture glows brightly and evaporates.");
-*/
- pline("\8d¬\82º\82é\82Æ\96ò\82Í\96¾\82é\82\8bP\82«\81C\8fö\94\82µ\82½\81D");
+#if 0 /*JP:T*/
+ pline_The("mixture %sevaporates.",
+ !Blind ? "glows brightly and " : "");
+#else
+ pline_The("\8d¬\82º\82é\82Æ\96ò\82Í%s\8fö\94\82µ\82½\81D",
+ !Blind ? "\96¾\82é\82\8bP\82«\81C" : "");
+#endif
return 1;
}
}
}
if (potion->otyp == POT_ACID && obj->otyp == CORPSE
- && obj->corpsenm == PM_LICHEN && !Blind) {
+ && obj->corpsenm == PM_LICHEN) {
#if 0 /*JP:T*/
pline("%s %s %s around the edges.", The(cxname(obj)),
- otense(obj, "turn"),
- potion->odiluted ? hcolor(NH_ORANGE) : hcolor(NH_RED));
+ otense(obj, "turn"), Blind ? "wrinkled"
+ : potion->odiluted ? hcolor(NH_ORANGE)
+ : hcolor(NH_RED));
#else
pline("%s\82Í\82Ó\82¿\82ª%s\82È\82Á\82½\81D", The(cxname(obj)),
- jconj_adj(potion->odiluted ? hcolor(NH_ORANGE) : hcolor(NH_RED)));
+ Blind ? "\82µ\82í\82µ\82í\82É"
+ : jconj_adj(potion->odiluted ? hcolor(NH_ORANGE)
+ : hcolor(NH_RED)));
#endif
potion->in_use = FALSE; /* didn't go poof */
+ if (potion->dknown
+ && !objects[potion->otyp].oc_name_known
+ && !objects[potion->otyp].oc_uname)
+ docall(potion);
return 1;
}
pline_The("potion spills and covers your %s with oil.",
*/
pline("\96û\82Í\94ò\82Ñ\8eU\82è\82 \82È\82½\82Ì%s\82É\82©\82©\82Á\82½\81D",
- makeplural(body_part(FINGER)));
- incr_itimeout(&Glib, d(2, 10));
+ fingers_or_gloves(TRUE));
+ make_glib((int) (Glib & TIMEOUT) + d(2, 10));
} else if (obj->oclass != WEAPON_CLASS && !is_weptool(obj)) {
/* the following cases apply only to weapons */
goto more_dips;
} else if ((!is_rustprone(obj) && !is_corrodeable(obj))
|| is_ammo(obj) || (!obj->oeroded && !obj->oeroded2)) {
/* uses up potion, doesn't set obj->greased */
+ if (!Blind)
#if 0 /*JP:T*/
- pline("%s %s with an oily sheen.", Yname2(obj),
- otense(obj, "gleam"));
+ pline("%s %s with an oily sheen.", Yname2(obj),
+ otense(obj, "gleam"));
#else
pline("%s\82Í\96û\82Ì\8cõ\91ò\82Å\82«\82ç\82è\82Æ\8cõ\82Á\82½\81D", Yname2(obj));
#endif
+ else /*if (!uarmg)*/
+/*JP
+ pline("%s %s oily.", Yname2(obj), otense(obj, "feel"));
+*/
+ pline("%s\82Í\96û\82Á\82Û\82¢\81D", Yname2(obj));
} else {
#if 0 /*JP:T*/
- pline("%s %s less %s.", Yname2(obj), otense(obj, "are"),
+ pline("%s %s less %s.", Yname2(obj),
+ otense(obj, !Blind ? "are" : "feel"),
(obj->oeroded && obj->oeroded2)
? "corroded and rusty"
: obj->oeroded ? "rusty" : "corroded");
#else
- pline("%s\82Ì%s\82ª\8eæ\82ê\82½\81D", Yname2(obj),
+ pline("%s\82Ì%s\82ª\8eæ\82ê\82½%s\81D", Yname2(obj),
(obj->oeroded && obj->oeroded2)
? "\95\85\90H\82Æ\8eK"
- : obj->oeroded ? "\8eK" : "\95\85\90H");
+ : obj->oeroded ? "\8eK" : "\95\85\90H",
+ !Blind ? "" : "\82æ\82¤\82¾");
#endif
if (obj->oeroded > 0)
obj->oeroded--;
wisx = TRUE;
}
exercise(A_WIS, wisx);
- makeknown(potion->otyp);
+ if (potion->dknown)
+ makeknown(potion->otyp);
useup(potion);
return 1;
}
useup(potion);
exercise(A_WIS, TRUE);
}
- makeknown(POT_OIL);
+ if (potion->dknown)
+ makeknown(POT_OIL);
obj->spe = 1;
update_inventory();
return 1;
singlepotion->dknown = FALSE;
} else {
singlepotion->dknown = !Hallucination;
-#if 0 /*JP*/
+ *newbuf = '\0';
if (mixture == POT_WATER && singlepotion->dknown)
+/*JP
Sprintf(newbuf, "clears");
- else
+*/
+ Sprintf(newbuf, "\93§\96¾");
+ else if (!Blind)
+#if 0 /*JP*/
Sprintf(newbuf, "turns %s",
hcolor(OBJ_DESCR(objects[mixture])));
- pline_The("%spotion%s %s.", oldbuf,
- more_than_one ? " that you dipped into" : "", newbuf);
#else
- if (mixture == POT_WATER && singlepotion->dknown)
- Sprintf(newbuf, "\93§\96¾");
- else
Sprintf(newbuf, "%s\96ò",
hcolor(OBJ_DESCR(objects[mixture])));
- pline_The("%s%s\96ò\82Í%s\82É\82È\82Á\82½\81D.", more_than_one ? "\90Z\82µ\82½" : "",
- oldbuf, newbuf);
#endif
- if (!objects[old_otyp].oc_uname
- && !objects[old_otyp].oc_name_known && old_dknown) {
+ if (*newbuf)
+#if 0 /*JP:T*/
+ pline_The("%spotion%s %s.", oldbuf,
+ more_than_one ? " that you dipped into" : "",
+ newbuf);
+#else
+ pline_The("%s%s\96ò\82Í%s\82É\82È\82Á\82½\81D.",
+ more_than_one ? "\90Z\82µ\82½" : "",
+ oldbuf, newbuf);
+#endif
+ else
+/*JP
+ pline("Something happens.");
+*/
+ pline("\89½\82©\82ª\8bN\82«\82½\81D");
+
+ if (old_dknown
+ && !objects[old_otyp].oc_name_known
+ && !objects[old_otyp].oc_uname) {
struct obj fakeobj;
+
fakeobj = zeroobj;
fakeobj.dknown = 1;
fakeobj.otyp = old_otyp;
return 1;
poof:
- if (!objects[potion->otyp].oc_name_known
+ if (potion->dknown
+ && !objects[potion->otyp].oc_name_known
&& !objects[potion->otyp].oc_uname)
docall(potion);
useup(potion);