fix #H4153 - killed by kicking something weird

Steps to make sure 'kickedobj' didn't end up as a stale pointer
prevented it from being around to format the reason for death when
a kicking attempt was fatal.
This commit is contained in:
PatR
2016-01-03 00:36:31 -08:00
parent cb574aadcc
commit f279a9ec0d
2 changed files with 15 additions and 9 deletions

View File

@@ -79,6 +79,7 @@ when a pet moves reluctantly, name the top item of the pile it is reluctant
to step on if the hero sees or remembers any object(s) at that spot
ensure sufficient messages are given to clarify the transition from detected
vampire bats to fog clouds in Vlad's tower
fix "killing by kicking something weird" when kicking an object causes death
Platform- and/or Interface-Specific Fixes

View File

@@ -20,9 +20,9 @@ STATIC_DCL void FDECL(kickdmg, (struct monst *, BOOLEAN_P));
STATIC_DCL boolean FDECL(maybe_kick_monster, (struct monst *,
XCHAR_P, XCHAR_P));
STATIC_DCL void FDECL(kick_monster, (struct monst *, XCHAR_P, XCHAR_P));
STATIC_DCL int FDECL(kick_object, (XCHAR_P, XCHAR_P));
STATIC_DCL int FDECL(kick_object, (XCHAR_P, XCHAR_P, char *));
STATIC_DCL int FDECL(really_kick_object, (XCHAR_P, XCHAR_P));
STATIC_DCL char *FDECL(kickstr, (char *));
STATIC_DCL char *FDECL(kickstr, (char *, const char *));
STATIC_DCL void FDECL(otransit_msg, (struct obj *, BOOLEAN_P, long));
STATIC_DCL void FDECL(drop_to, (coord *, SCHAR_P));
@@ -463,15 +463,18 @@ xchar x, y; /* coordinates where object was before the impact, not after */
/* jacket around really_kick_object */
STATIC_OVL int
kick_object(x, y)
kick_object(x, y, kickobjnam)
xchar x, y;
char *kickobjnam;
{
int res = 0;
*kickobjnam = '\0';
/* if a pile, the "top" object gets kicked */
kickedobj = level.objects[x][y];
if (kickedobj) {
/* kick object; if doing is fatal, done() will clean up kickedobj */
Strcpy(kickobjnam, killer_xname(kickedobj)); /* matters iff res==0 */
res = really_kick_object(x, y);
kickedobj = (struct obj *) 0;
}
@@ -707,13 +710,14 @@ xchar x, y;
/* cause of death if kicking kills kicker */
STATIC_OVL char *
kickstr(buf)
kickstr(buf, kickobjnam)
char *buf;
const char *kickobjnam;
{
const char *what;
if (kickedobj)
what = killer_xname(kickedobj);
if (*kickobjnam)
what = kickobjnam;
else if (maploc == &nowhere)
what = "nothing";
else if (IS_DOOR(maploc->typ))
@@ -755,8 +759,9 @@ dokick()
int dmg = 0, glyph, oldglyph = -1;
register struct monst *mtmp;
boolean no_kick = FALSE;
char buf[BUFSZ];
char buf[BUFSZ], kickobjnam[BUFSZ];
kickobjnam[0] = '\0';
if (nolimbs(youmonst.data) || slithy(youmonst.data)) {
You("have no legs to kick with.");
no_kick = TRUE;
@@ -948,7 +953,7 @@ dokick()
if (OBJ_AT(x, y) && (!Levitation || Is_airlevel(&u.uz)
|| Is_waterlevel(&u.uz) || sobj_at(BOULDER, x, y))) {
if (kick_object(x, y)) {
if (kick_object(x, y, kickobjnam)) {
if (Is_airlevel(&u.uz))
hurtle(-u.dx, -u.dy, 1, TRUE); /* assume it's light */
return 1;
@@ -1211,7 +1216,7 @@ dokick()
if (!rn2(3))
set_wounded_legs(RIGHT_SIDE, 5 + rnd(5));
dmg = rnd(ACURR(A_CON) > 15 ? 3 : 5);
losehp(Maybe_Half_Phys(dmg), kickstr(buf), KILLED_BY);
losehp(Maybe_Half_Phys(dmg), kickstr(buf, kickobjnam), KILLED_BY);
if (Is_airlevel(&u.uz) || Levitation)
hurtle(-u.dx, -u.dy, rn1(2, 4), TRUE); /* assume it's heavy */
return 1;