wounded legs fixes
Document 'HWounded_legs' vs 'EWounded_legs'; they aren't used the way other properties use their intrinsic and extrinsic values. And they switch from hero to steed when riding. (Can't start riding when hero's legs are wounded and the steed's legs magically heal when hero dismounts, so existing wounds never transfer from one to the other.) Having one leg become injured when the other already was would cure the other leg but keep the longer of their two timeouts for the new injury. Eliminate that mystery cure. Since their timeouts aren't tracked separately, the best that can be done is to make both legs eventually recover at the same time. Make ^X report which leg is the wounded one when only one of them is. (It already implicitly reports the both-legs case by using plural.) When zapping a wand of probing downward while riding, include wounded leg feedback for the steed. Simplify wounded leg feedback when probing self a little bit. Make drinking blessed potions of full healing cure wounded legs for hero when not mounted or for steed when mounted. (The latter is a bit strange--hero drinks potion, steed gets affected--but it's magic.) Make drinking uncursed potions of full healing or blessed potions of extra healing cure wounded legs for hero (but not steed; the magic either isn't that strong or maybe not that reliable...).
This commit is contained in:
14
src/do.c
14
src/do.c
@@ -2137,20 +2137,24 @@ set_wounded_legs(long side, int timex)
|
||||
* You still call this function, but don't lose hp.
|
||||
* Caller is also responsible for adjusting messages.
|
||||
*/
|
||||
|
||||
g.context.botl = 1;
|
||||
if (!Wounded_legs)
|
||||
ATEMP(A_DEX)--;
|
||||
|
||||
if (!Wounded_legs || (HWounded_legs & TIMEOUT) < timex)
|
||||
if (!Wounded_legs || (HWounded_legs & TIMEOUT) < (long) timex)
|
||||
set_itimeout(&HWounded_legs, (long) timex);
|
||||
EWounded_legs = side;
|
||||
/* the leg being wounded and its timeout might differ from one
|
||||
attack to the next, but we don't track the legs separately;
|
||||
3.7: both legs will ultimately heal together; this used to use
|
||||
direct assignment instead of bitwise-OR so getting wounded in
|
||||
one leg mysteriously healed the other */
|
||||
EWounded_legs |= side;
|
||||
(void) encumber_msg();
|
||||
}
|
||||
|
||||
void
|
||||
heal_legs(int how) /* 0: ordinary, 1: dismounting steed,
|
||||
2: limbs turn to stone */
|
||||
heal_legs(
|
||||
int how) /* 0: ordinary, 1: dismounting steed, 2: limbs turn to stone */
|
||||
{
|
||||
if (Wounded_legs) {
|
||||
g.context.botl = 1;
|
||||
|
||||
@@ -1013,21 +1013,31 @@ status_enlightenment(int mode, int final)
|
||||
}
|
||||
}
|
||||
if (Wounded_legs) {
|
||||
/* EWounded_legs is used to track left/right/both rather than some
|
||||
form of extrinsic impairment; HWounded_legs is used for timeout;
|
||||
both apply to steed instead of hero when mounted */
|
||||
long whichleg = (EWounded_legs & BOTH_SIDES);
|
||||
const char *bp = u.usteed ? mbodypart(u.usteed, LEG) : body_part(LEG),
|
||||
*article = "a ", /* precedes "wounded", so never "an " */
|
||||
*leftright = "";
|
||||
|
||||
if (whichleg == BOTH_SIDES)
|
||||
bp = makeplural(bp), article = "";
|
||||
else
|
||||
leftright = (whichleg == LEFT_SIDE) ? "left " : "right ";
|
||||
Sprintf(buf, "%swounded %s%s", article, leftright, bp);
|
||||
|
||||
/* when mounted, Wounded_legs applies to steed rather than to
|
||||
hero; we only report steed's wounded legs in wizard mode */
|
||||
if (u.usteed) { /* not `Riding' here */
|
||||
if (wizard && steedname) {
|
||||
Strcpy(buf, steedname);
|
||||
*buf = highc(*buf);
|
||||
enl_msg(buf, " has", " had", " wounded legs", "");
|
||||
char steednambuf[BUFSZ];
|
||||
|
||||
Strcpy(steednambuf, steedname);
|
||||
*steednambuf = highc(*steednambuf);
|
||||
enl_msg(steednambuf, " has ", " had ", buf, "");
|
||||
}
|
||||
} else {
|
||||
long wl = (EWounded_legs & BOTH_SIDES);
|
||||
const char *bp = body_part(LEG), *article = "a ";
|
||||
|
||||
if (wl == BOTH_SIDES)
|
||||
bp = makeplural(bp), article = "";
|
||||
Sprintf(buf, "%swounded %s", article, bp);
|
||||
you_have(buf, "");
|
||||
}
|
||||
}
|
||||
@@ -2841,8 +2851,20 @@ mstatusline(struct monst *mtmp)
|
||||
? ", digesting you"
|
||||
: is_animal(u.ustuck->data) ? ", swallowing you"
|
||||
: ", engulfing you");
|
||||
if (mtmp == u.usteed)
|
||||
if (mtmp == u.usteed) {
|
||||
Strcat(info, ", carrying you");
|
||||
if (Wounded_legs) {
|
||||
/* EWounded_legs is used to track left/right/both rather than
|
||||
some form of extrinsic impairment; HWounded_legs is used for
|
||||
timeout; both apply to steed instead of hero when mounted */
|
||||
long legs = (EWounded_legs & BOTH_SIDES);
|
||||
const char *what = mbodypart(mtmp, LEG);
|
||||
|
||||
if (legs == BOTH_SIDES)
|
||||
what = makeplural(what);
|
||||
Sprintf(eos(info), ", injured %s", what);
|
||||
}
|
||||
}
|
||||
|
||||
/* avoid "Status of the invisible newt ..., invisible" */
|
||||
/* and unlike a normal mon_nam, use "saddled" even if it has a name */
|
||||
@@ -2892,12 +2914,17 @@ ustatusline(void)
|
||||
}
|
||||
if (Stunned)
|
||||
Strcat(info, ", stunned");
|
||||
if (!u.usteed && Wounded_legs) {
|
||||
long legs = (EWounded_legs | HWounded_legs);
|
||||
if (Wounded_legs && !u.usteed) {
|
||||
/* EWounded_legs is used to track left/right/both rather than some
|
||||
form of extrinsic impairment; HWounded_legs is used for timeout;
|
||||
both apply to steed instead of hero when mounted */
|
||||
long legs = (EWounded_legs & BOTH_SIDES);
|
||||
const char *what = body_part(LEG);
|
||||
|
||||
if ((legs & BOTH_SIDES) == BOTH_SIDES)
|
||||
if (legs == BOTH_SIDES)
|
||||
what = makeplural(what);
|
||||
/* when it's just one leg, ^X reports which, left or right;
|
||||
ustatusline() doesn't, in order to keep the output a bit shorter */
|
||||
Sprintf(eos(info), ", injured %s", what);
|
||||
}
|
||||
if (Glib)
|
||||
|
||||
@@ -1074,6 +1074,10 @@ peffect_extra_healing(struct obj *otmp)
|
||||
(void) make_hallucinated(0L, TRUE, 0L);
|
||||
exercise(A_CON, TRUE);
|
||||
exercise(A_STR, TRUE);
|
||||
/* blessed potion also heals wounded legs unless riding (where leg
|
||||
wounds apply to the steed rather than to the hero) */
|
||||
if (Wounded_legs && (otmp->blessed && !u.usteed))
|
||||
heal_legs(0);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1091,6 +1095,10 @@ peffect_full_healing(struct obj *otmp)
|
||||
(void) make_hallucinated(0L, TRUE, 0L);
|
||||
exercise(A_STR, TRUE);
|
||||
exercise(A_CON, TRUE);
|
||||
/* blessed potion heals wounded legs even when riding (so heals steed's
|
||||
legs--it's magic); uncursed potion heals hero's legs unless riding */
|
||||
if (Wounded_legs && (otmp->blessed || (!otmp->cursed && !u.usteed)))
|
||||
heal_legs(0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
Reference in New Issue
Block a user