conflicting countdowns again
Use the make_foo() intrinsic set/reset routines instead of trying to manipulate the intrinsics directly. Previous patch left Dex down by 1 if stoning caused wounded legs to be fixed, and left delayed killer allocated if stoning cured sliming or vice versa.
This commit is contained in:
@@ -390,7 +390,7 @@ E void FDECL(revive_mon, (ANY_P *, long));
|
||||
E int NDECL(donull);
|
||||
E int NDECL(dowipe);
|
||||
E void FDECL(set_wounded_legs, (long, int));
|
||||
E void NDECL(heal_legs);
|
||||
E void FDECL(heal_legs, (int));
|
||||
|
||||
/* ### do_name.c ### */
|
||||
|
||||
|
||||
13
src/do.c
13
src/do.c
@@ -1882,7 +1882,8 @@ register int timex;
|
||||
}
|
||||
|
||||
void
|
||||
heal_legs()
|
||||
heal_legs(how)
|
||||
int how; /* 0: ordinary, 1: dismounting steed, 2: limbs turn to stone */
|
||||
{
|
||||
if (Wounded_legs) {
|
||||
if (ATEMP(A_DEX) < 0) {
|
||||
@@ -1890,7 +1891,11 @@ heal_legs()
|
||||
context.botl = 1;
|
||||
}
|
||||
|
||||
if (!u.usteed) {
|
||||
/* when mounted, wounded legs applies to the steed;
|
||||
during petrification countdown, "your limbs turn to stone"
|
||||
before the final stages and that calls us (how==2) to cure
|
||||
wounded legs, but we want to suppress the feel better message */
|
||||
if (!u.usteed && how != 2) {
|
||||
const char *legs = body_part(LEG);
|
||||
|
||||
if ((EWounded_legs & BOTH_SIDES) == BOTH_SIDES)
|
||||
@@ -1900,7 +1905,7 @@ heal_legs()
|
||||
Your("%s %s better.", legs, vtense(legs, "feel"));
|
||||
}
|
||||
|
||||
HWounded_legs = EWounded_legs = 0;
|
||||
HWounded_legs = EWounded_legs = 0L;
|
||||
|
||||
/* Wounded_legs reduces carrying capacity, so we want
|
||||
an encumbrance check when they're healed. However,
|
||||
@@ -1912,7 +1917,7 @@ heal_legs()
|
||||
it might be immediately contradicted [able to carry
|
||||
more when steed becomes healthy, then possible floor
|
||||
feedback, then able to carry less when back on foot]. */
|
||||
if (!in_steed_dismounting)
|
||||
if (how == 0)
|
||||
(void) encumber_msg();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2217,7 +2217,7 @@ struct obj *otmp;
|
||||
}
|
||||
}
|
||||
if (!otmp->cursed)
|
||||
heal_legs();
|
||||
heal_legs(0);
|
||||
break;
|
||||
case EGG:
|
||||
if (flesh_petrifies(&mons[otmp->corpsenm])) {
|
||||
|
||||
22
src/potion.c
22
src/potion.c
@@ -106,6 +106,9 @@ boolean talk;
|
||||
set_itimeout(&HStun, xtime);
|
||||
}
|
||||
|
||||
/* Sick is overloaded with both fatal illness and food poisoning (via
|
||||
u.usick_type bit mask), but delayed killer can only support one or
|
||||
the other at a time. They should become separate intrinsics.... */
|
||||
void
|
||||
make_sick(xtime, cause, talk, type)
|
||||
long xtime;
|
||||
@@ -116,7 +119,7 @@ int type;
|
||||
struct kinfo *kptr;
|
||||
long old = Sick;
|
||||
|
||||
#if 0
|
||||
#if 0 /* tell player even if hero is unconscious */
|
||||
if (Unaware)
|
||||
talk = FALSE;
|
||||
#endif
|
||||
@@ -152,7 +155,10 @@ int type;
|
||||
kptr = find_delayed_killer(SICK);
|
||||
if (Sick) {
|
||||
exercise(A_CON, FALSE);
|
||||
if (!old || !kptr) {
|
||||
/* setting delayed_killer used to be unconditional, but that's
|
||||
not right when make_sick(0) is called to cure food poisoning
|
||||
if hero was also fatally ill; this is only approximate */
|
||||
if (xtime || !old || !kptr) {
|
||||
int kpfx = ((cause && !strcmp(cause, "#wizintrinsic"))
|
||||
? KILLED_BY : KILLED_BY_AN);
|
||||
|
||||
@@ -169,7 +175,7 @@ const char *msg;
|
||||
{
|
||||
long old = Slimed;
|
||||
|
||||
#if 0
|
||||
#if 0 /* tell player even if hero is unconscious */
|
||||
if (Unaware)
|
||||
msg = 0;
|
||||
#endif
|
||||
@@ -177,7 +183,7 @@ const char *msg;
|
||||
if ((xtime != 0L) ^ (old != 0L)) {
|
||||
context.botl = TRUE;
|
||||
if (msg)
|
||||
pline1(msg);
|
||||
pline("%s", msg);
|
||||
}
|
||||
if (!Slimed)
|
||||
dealloc_killer(find_delayed_killer(SLIMED));
|
||||
@@ -193,7 +199,7 @@ const char *killername;
|
||||
{
|
||||
long old = Stoned;
|
||||
|
||||
#if 0
|
||||
#if 0 /* tell player even if hero is unconscious */
|
||||
if (Unaware)
|
||||
msg = 0;
|
||||
#endif
|
||||
@@ -201,7 +207,7 @@ const char *killername;
|
||||
if ((xtime != 0L) ^ (old != 0L)) {
|
||||
context.botl = TRUE;
|
||||
if (msg)
|
||||
pline1(msg);
|
||||
pline("%s", msg);
|
||||
}
|
||||
if (!Stoned)
|
||||
dealloc_killer(find_delayed_killer(STONED));
|
||||
@@ -899,9 +905,9 @@ register struct obj *otmp;
|
||||
}
|
||||
break;
|
||||
case POT_SPEED:
|
||||
/* skip when mounted; heal_legs() would heal steeds legs */
|
||||
if (Wounded_legs && !otmp->cursed && !u.usteed) {
|
||||
/* heal_legs() would heal steeds legs */
|
||||
heal_legs();
|
||||
heal_legs(0);
|
||||
unkn++;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -524,7 +524,7 @@ int trouble;
|
||||
break;
|
||||
}
|
||||
case TROUBLE_WOUNDED_LEGS:
|
||||
heal_legs();
|
||||
heal_legs(0);
|
||||
break;
|
||||
case TROUBLE_STUNNED:
|
||||
make_stunned(0L, TRUE);
|
||||
|
||||
@@ -188,7 +188,7 @@ dosit()
|
||||
u.ucreamed = 0;
|
||||
make_blinded(0L, TRUE);
|
||||
make_sick(0L, (char *) 0, FALSE, SICK_ALL);
|
||||
heal_legs();
|
||||
heal_legs(0);
|
||||
context.botl = 1;
|
||||
break;
|
||||
case 5:
|
||||
|
||||
10
src/steed.c
10
src/steed.c
@@ -221,7 +221,7 @@ boolean force; /* Quietly force this animal */
|
||||
if (Wounded_legs) {
|
||||
Your("%s are in no shape for riding.", makeplural(body_part(LEG)));
|
||||
if (force && wizard && yn("Heal your legs?") == 'y')
|
||||
HWounded_legs = EWounded_legs = 0;
|
||||
HWounded_legs = EWounded_legs = 0L;
|
||||
else
|
||||
return (FALSE);
|
||||
}
|
||||
@@ -542,12 +542,8 @@ int reason; /* Player was thrown off etc. */
|
||||
}
|
||||
/* While riding, Wounded_legs refers to the steed's legs;
|
||||
after dismounting, it reverts to the hero's legs. */
|
||||
if (repair_leg_damage) {
|
||||
/* [TODO: make heal_legs() take a parameter to handle this] */
|
||||
in_steed_dismounting = TRUE;
|
||||
heal_legs();
|
||||
in_steed_dismounting = FALSE;
|
||||
}
|
||||
if (repair_leg_damage)
|
||||
heal_legs(1);
|
||||
|
||||
/* Release the steed and saddle */
|
||||
u.usteed = 0;
|
||||
|
||||
@@ -137,17 +137,17 @@ stoned_dialogue()
|
||||
multi_reason = "getting stoned";
|
||||
nomovemsg = You_can_move_again; /* not unconscious */
|
||||
/* "your limbs have turned to stone" so terminate wounded legs */
|
||||
if ((HWounded_legs & TIMEOUT) != 0L && !u.usteed)
|
||||
set_itimeout(&HWounded_legs, 0L);
|
||||
if (Wounded_legs && !u.usteed)
|
||||
heal_legs(2);
|
||||
break;
|
||||
case 2: /* turned to stone */
|
||||
if ((HDeaf & TIMEOUT) > 0L && (HDeaf & TIMEOUT) < 5L)
|
||||
set_itimeout(&HDeaf, 5L); /* avoid Hear_again at tail end */
|
||||
/* if also vomiting or turning into slime, stop those */
|
||||
if ((Vomiting & TIMEOUT) != 0L)
|
||||
set_itimeout(&Vomiting, 0L), context.botl = 1;
|
||||
if ((Slimed & TIMEOUT) != 0L)
|
||||
set_itimeout(&Slimed, 0L), context.botl = 1;
|
||||
/* if also vomiting or turning into slime, stop those (no messages) */
|
||||
if (Vomiting)
|
||||
make_vomiting(0L, FALSE);
|
||||
if (Slimed)
|
||||
make_slimed(0L, (char *) 0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -342,8 +342,8 @@ slime_dialogue()
|
||||
break;
|
||||
case 1L: /* turning into slime */
|
||||
/* if also turning to stone, stop doing that (no message) */
|
||||
if ((Stoned & TIMEOUT) != 0L)
|
||||
set_itimeout(&Stoned, 0L), context.botl = 1;
|
||||
if (Stoned)
|
||||
make_stoned(0L, (char *) 0, KILLED_BY_AN, (char *) 0);
|
||||
break;
|
||||
}
|
||||
exercise(A_DEX, FALSE);
|
||||
@@ -553,7 +553,7 @@ nh_timeout()
|
||||
stop_occupation();
|
||||
break;
|
||||
case WOUNDED_LEGS:
|
||||
heal_legs();
|
||||
heal_legs(0);
|
||||
stop_occupation();
|
||||
break;
|
||||
case HALLUC:
|
||||
|
||||
Reference in New Issue
Block a user