more angry god vs pacifist conduct

Do it properly, using the arguments to xkilled() instead of reversing
the conduct counter after the fact.

The xkilled() flag value of '1' has been reversed.  It used to mean
'display message' but now means 'suppress message' since both of the
other flag bits are for suppression.  All callers have been updated
to specify either XKILL_GIVEMSG or XKILL_NOMSG so the underlying
number remains transparent.
This commit is contained in:
PatR
2016-05-10 15:59:22 -07:00
parent 2f7a67483f
commit 74ee31e504
13 changed files with 83 additions and 66 deletions

View File

@@ -737,7 +737,7 @@ register xchar x, y;
that's the result of his actions; gain experience,
lose pacifism, take alignment and luck hit, make
corpse less likely to remain tame after revival */
xkilled(mtmp, 0); /* no "you kill it" message */
xkilled(mtmp, XKILL_NOMSG);
/* life-saving doesn't ordinarily reset this */
if (mtmp->mhp > 0)
u.uconduct.killer = save_pacifism;

View File

@@ -423,9 +423,9 @@ int x, y;
}
STATIC_OVL void
e_died(etmp, dest, how)
e_died(etmp, xkill_flags, how)
struct entity *etmp;
int dest, how;
int xkill_flags, how;
{
if (is_u(etmp)) {
if (how == DROWNING) {
@@ -462,13 +462,14 @@ int dest, how;
killer.name[0] = 0;
/* fake "digested to death" damage-type suppresses corpse */
#define mk_message(dest) ((dest & 1) ? "" : (char *) 0)
#define mk_corpse(dest) ((dest & 2) ? AD_DGST : AD_PHYS)
#define mk_message(dest) (((dest & XKILL_NOMSG) != 0) ? (char *) 0 : "")
#define mk_corpse(dest) (((dest & XKILL_NOCORPSE) != 0) ? AD_DGST : AD_PHYS)
/* if monsters are moving, one of them caused the destruction */
if (context.mon_moving)
monkilled(etmp->emon, mk_message(dest), mk_corpse(dest));
monkilled(etmp->emon,
mk_message(xkill_flags), mk_corpse(xkill_flags));
else /* you caused it */
xkilled(etmp->emon, dest);
xkilled(etmp->emon, xkill_flags);
etmp->edata = (struct permonst *) 0;
/* dead long worm handling */
@@ -605,7 +606,9 @@ struct entity *etmp;
if (crm->typ == DRAWBRIDGE_DOWN) {
pline("%s crushed underneath the drawbridge.",
E_phrase(etmp, "are")); /* no jump */
e_died(etmp, e_inview ? 3 : 2, CRUSHING); /* no corpse */
e_died(etmp,
XKILL_NOCORPSE | (e_inview ? XKILL_GIVEMSG : XKILL_NOMSG),
CRUSHING); /* no corpse */
return; /* Note: Beyond this point, we know we're */
} /* not at an opened drawbridge, since all */
must_jump = TRUE; /* *missable* creatures survive on the */
@@ -621,7 +624,10 @@ struct entity *etmp;
E_phrase(etmp, "are"));
else if (!Deaf)
You_hear("a crushing sound.");
e_died(etmp, e_inview ? 3 : 2, CRUSHING);
e_died(etmp,
XKILL_NOCORPSE | (e_inview ? XKILL_GIVEMSG
: XKILL_NOMSG),
CRUSHING);
/* no corpse */
return;
}
@@ -717,7 +723,7 @@ struct entity *etmp;
if (!e_survives_at(etmp, etmp->ex, etmp->ey)) {
killer.format = KILLED_BY_AN;
Strcpy(killer.name, "closing drawbridge");
e_died(etmp, 0, CRUSHING); /* no message */
e_died(etmp, XKILL_NOMSG, CRUSHING);
return;
}
debugpline1("%s in here", E_phrase(etmp, "survive"));
@@ -748,11 +754,11 @@ struct entity *etmp;
}
killer.format = NO_KILLER_PREFIX;
Strcpy(killer.name, "fell from a drawbridge");
e_died(etmp, e_inview ? 3 : 2, /* CRUSHING is arbitrary */
(is_pool(etmp->ex, etmp->ey))
? DROWNING
: (is_lava(etmp->ex, etmp->ey)) ? BURNING
: CRUSHING); /*no corpse*/
e_died(etmp, /* CRUSHING is arbitrary */
XKILL_NOCORPSE | (e_inview ? XKILL_GIVEMSG : XKILL_NOMSG),
is_pool(etmp->ex, etmp->ey) ? DROWNING
: is_lava(etmp->ex, etmp->ey) ? BURNING
: CRUSHING); /*no corpse*/
return;
}
}
@@ -954,7 +960,9 @@ int x, y;
E_phrase(etmp2, "are"));
killer.format = KILLED_BY_AN;
Strcpy(killer.name, "exploding drawbridge");
e_died(etmp2, e_inview ? 3 : 2, CRUSHING); /*no corpse*/
e_died(etmp2,
XKILL_NOCORPSE | (e_inview ? XKILL_GIVEMSG : XKILL_NOMSG),
CRUSHING); /*no corpse*/
} /* nothing which is vulnerable can survive this */
}
set_entity(x, y, etmp1);
@@ -984,7 +992,9 @@ int x, y;
}
killer.format = KILLED_BY_AN;
Strcpy(killer.name, "collapsing drawbridge");
e_died(etmp1, e_inview ? 3 : 2, CRUSHING); /*no corpse*/
e_died(etmp1,
XKILL_NOCORPSE | (e_inview ? XKILL_GIVEMSG : XKILL_NOMSG),
CRUSHING); /*no corpse*/
if (levl[etmp1->ex][etmp1->ey].typ == MOAT)
do_entity(etmp1);
}

View File

@@ -2664,7 +2664,7 @@ register struct attack *mattk;
}
pline("%s turns to stone!", Monnam(mtmp));
stoned = 1;
xkilled(mtmp, 0);
xkilled(mtmp, XKILL_NOMSG);
if (mtmp->mhp > 0)
return 1;
return 2;
@@ -2773,7 +2773,7 @@ register struct attack *mattk;
assess_dmg:
if ((mtmp->mhp -= tmp) <= 0) {
pline("%s dies!", Monnam(mtmp));
xkilled(mtmp, 0);
xkilled(mtmp, XKILL_NOMSG);
if (mtmp->mhp > 0)
return 1;
return 2;

View File

@@ -2153,26 +2153,29 @@ void
killed(mtmp)
struct monst *mtmp;
{
xkilled(mtmp, 1);
xkilled(mtmp, XKILL_GIVEMSG);
}
/* the player has killed the monster mtmp */
void
xkilled(mtmp, dflags)
xkilled(mtmp, xkill_flags)
struct monst *mtmp;
int dflags; /* disposition flags: 1 => give message, 2 => suppress corpse */
int xkill_flags; /* 1: suppress message, 2: suppress corpse, 4: pacifist */
{
int tmp, mndx, x = mtmp->mx, y = mtmp->my;
struct permonst *mdat;
struct obj *otmp;
struct trap *t;
boolean wasinside = u.uswallow && (u.ustuck == mtmp), burycorpse = FALSE,
givemsg = (dflags & 1) != 0, nocorpse = (dflags & 2) != 0;
boolean wasinside = u.uswallow && (u.ustuck == mtmp),
burycorpse = FALSE,
nomsg = (xkill_flags & XKILL_NOMSG) != 0,
nocorpse = (xkill_flags & XKILL_NOCORPSE) != 0,
noconduct = (xkill_flags & XKILL_NOCONDUCT) != 0;
/* KMH, conduct */
u.uconduct.killer++;
if (!noconduct) /* KMH, conduct */
u.uconduct.killer++;
if (givemsg)
if (!nomsg)
You("%s %s!",
nonliving(mtmp->data) ? "destroy" : "kill",
!(wasinside || canspotmon(mtmp)) ? "it"
@@ -2260,7 +2263,7 @@ int dflags; /* disposition flags: 1 => give message, 2 => suppress corpse */
/* oc_big is also oc_bimanual and oc_bulky */
&& (otmp->owt > 30 || objects[otyp].oc_big)) {
delobj(otmp);
} else if (!flooreffects(otmp, x, y, givemsg ? "fall" : "")) {
} else if (!flooreffects(otmp, x, y, nomsg ? "" : "fall")) {
place_object(otmp, x, y);
stackobj(otmp);
}
@@ -2270,7 +2273,7 @@ int dflags; /* disposition flags: 1 => give message, 2 => suppress corpse */
cadaver = make_corpse(mtmp, burycorpse ? CORPSTAT_BURIED
: CORPSTAT_NONE);
if (burycorpse && cadaver && cansee(x, y) && !mtmp->minvis
&& cadaver->where == OBJ_BURIED && givemsg) {
&& cadaver->where == OBJ_BURIED && !nomsg) {
pline("%s corpse ends up buried.", s_suffix(Monnam(mtmp)));
}
}

View File

@@ -225,7 +225,7 @@ boolean verbose; /* give message(s) even when you can't see what happened */
/* don't blame hero for unknown rolling boulder trap */
if (!context.mon_moving
&& (otmp->otyp != BOULDER || range >= 0 || otmp->otrapped))
xkilled(mtmp, 0);
xkilled(mtmp, XKILL_NOMSG);
else
mondied(mtmp);
}

View File

@@ -2240,7 +2240,7 @@ boolean stoning;
if (mon->mhp <= 0) {
pline("%s dies!", Monnam(mon));
if (by_you)
xkilled(mon, 0);
xkilled(mon, XKILL_NOMSG);
else
mondead(mon);
return;

View File

@@ -360,16 +360,15 @@ int force;
else {
You("destroy %s!",
mtmp->mtame
? x_monnam(
mtmp, ARTICLE_THE,
"poor",
(has_mname(mtmp))
? SUPPRESS_SADDLE
: 0,
FALSE)
: mon_nam(mtmp));
? x_monnam(mtmp, ARTICLE_THE,
"poor",
has_mname(mtmp)
? SUPPRESS_SADDLE
: 0,
FALSE)
: mon_nam(mtmp));
}
xkilled(mtmp, 0);
xkilled(mtmp, XKILL_NOMSG);
}
}
} else if (x == u.ux && y == u.uy) {

View File

@@ -531,8 +531,6 @@ STATIC_OVL void
god_zaps_you(resp_god)
aligntyp resp_god;
{
long oldkillcount = u.uconduct.killer;
if (u.uswallow) {
pline(
"Suddenly a bolt of lightning comes down at you from the heavens!");
@@ -544,8 +542,7 @@ aligntyp resp_god;
* Other credit/blame applies (luck or alignment adjustments),
* but not direct kill count (pacifist conduct).
*/
xkilled(u.ustuck, 0);
u.uconduct.killer = oldkillcount;
xkilled(u.ustuck, XKILL_NOMSG | XKILL_NOCONDUCT);
} else
pline("%s seems unaffected.", Monnam(u.ustuck));
} else {
@@ -569,8 +566,7 @@ aligntyp resp_god;
mon_nam(u.ustuck));
if (!resists_disint(u.ustuck)) {
pline("%s disintegrates into a pile of dust!", Monnam(u.ustuck));
xkilled(u.ustuck, 2); /* no corpse */
u.uconduct.killer = oldkillcount;
xkilled(u.ustuck, XKILL_NOMSG | XKILL_NOCORPSE | XKILL_NOCONDUCT);
} else
pline("%s seems unaffected.", Monnam(u.ustuck));
} else {

View File

@@ -1744,9 +1744,9 @@ boolean confused, byu;
}
mtmp->mhp -= mdmg;
if (mtmp->mhp <= 0) {
if (byu)
xkilled(mtmp, 1);
else {
if (byu) {
killed(mtmp);
} else {
pline("%s is killed.", Monnam(mtmp));
mondied(mtmp);
}

View File

@@ -2679,7 +2679,7 @@ boolean byplayer;
pline("%s turns to stone.", Monnam(mon));
if (byplayer) {
stoned = TRUE;
xkilled(mon, 0);
xkilled(mon, XKILL_NOMSG);
} else
monstone(mon);
}

View File

@@ -1152,7 +1152,7 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */
if (poiskilled) {
pline_The("poison was deadly...");
if (!already_killed)
xkilled(mon, 0);
xkilled(mon, XKILL_NOMSG);
destroyed = TRUE; /* return FALSE; */
} else if (destroyed) {
if (!already_killed)
@@ -1471,7 +1471,7 @@ register struct attack *mattk;
if (pd == &mons[PM_STRAW_GOLEM] || pd == &mons[PM_PAPER_GOLEM]) {
if (!Blind)
pline("%s burns completely!", Monnam(mdef));
xkilled(mdef, 2);
xkilled(mdef, XKILL_NOMSG | XKILL_NOCORPSE);
tmp = 0;
break;
/* Don't return yet; keep hp<1 and tmp=0 for pet msg */
@@ -1589,7 +1589,7 @@ register struct attack *mattk;
if (!Blind)
pline("Some writing vanishes from %s head!",
s_suffix(mon_nam(mdef)));
xkilled(mdef, 0);
xkilled(mdef, XKILL_NOMSG);
/* Don't return yet; keep hp<1 and tmp=0 for pet msg */
} else {
mdef->mcan = 1;
@@ -1601,11 +1601,12 @@ register struct attack *mattk;
case AD_DRLI:
if (!negated && !rn2(3) && !resists_drli(mdef)) {
int xtmp = d(2, 6);
pline("%s suddenly seems weaker!", Monnam(mdef));
mdef->mhpmax -= xtmp;
if ((mdef->mhp -= xtmp) <= 0 || !mdef->m_lev) {
pline("%s dies!", Monnam(mdef));
xkilled(mdef, 0);
xkilled(mdef, XKILL_NOMSG);
} else
mdef->m_lev--;
tmp = 0;
@@ -1614,7 +1615,7 @@ register struct attack *mattk;
case AD_RUST:
if (pd == &mons[PM_IRON_GOLEM]) {
pline("%s falls to pieces!", Monnam(mdef));
xkilled(mdef, 0);
xkilled(mdef, XKILL_NOMSG);
}
erode_armor(mdef, ERODE_RUST);
tmp = 0;
@@ -1626,7 +1627,7 @@ register struct attack *mattk;
case AD_DCAY:
if (pd == &mons[PM_WOOD_GOLEM] || pd == &mons[PM_LEATHER_GOLEM]) {
pline("%s falls to pieces!", Monnam(mdef));
xkilled(mdef, 0);
xkilled(mdef, XKILL_NOMSG);
}
erode_armor(mdef, ERODE_ROT);
tmp = 0;
@@ -1770,11 +1771,11 @@ register struct attack *mattk;
if (mdef->mtame && !cansee(mdef->mx, mdef->my)) {
You_feel("embarrassed for a moment.");
if (tmp)
xkilled(mdef, 0); /* !tmp but hp<1: already killed */
xkilled(mdef, XKILL_NOMSG); /* !tmp but hp<1: already killed */
} else if (!flags.verbose) {
You("destroy it!");
if (tmp)
xkilled(mdef, 0);
xkilled(mdef, XKILL_NOMSG);
} else if (tmp)
killed(mdef);
return 2;
@@ -1933,7 +1934,7 @@ register struct attack *mattk;
m_useup(mdef, otmp);
newuhs(FALSE);
xkilled(mdef, 2);
xkilled(mdef, XKILL_NOMSG | XKILL_NOCORPSE);
if (mdef->mhp > 0) { /* monster lifesaved */
You("hurriedly regurgitate the sizzling in your %s.",
body_part(STOMACH));

View File

@@ -242,7 +242,7 @@ struct obj *otmp;
}
/* context.bypasses = TRUE; ## for make_corpse() */
/* no corpse after system shock */
xkilled(mtmp, 3);
xkilled(mtmp, XKILL_GIVEMSG | XKILL_NOCORPSE);
} else if (newcham(mtmp, (struct permonst *) 0,
polyspot, give_msg) != 0
/* if shapechange failed because there aren't
@@ -401,14 +401,15 @@ struct obj *otmp;
dmg *= 2;
if (otyp == SPE_DRAIN_LIFE)
dmg = spell_damage_bonus(dmg);
if (resists_drli(mtmp))
if (resists_drli(mtmp)) {
shieldeff(mtmp->mx, mtmp->my);
else if (!resist(mtmp, otmp->oclass, dmg, NOTELL) && mtmp->mhp > 0) {
} else if (!resist(mtmp, otmp->oclass, dmg, NOTELL) && mtmp->mhp > 0) {
mtmp->mhp -= dmg;
mtmp->mhpmax -= dmg;
if (mtmp->mhp <= 0 || mtmp->mhpmax <= 0 || mtmp->m_lev < 1)
xkilled(mtmp, 1);
else {
/* die if already level 0, regardless of hit points */
if (mtmp->mhp <= 0 || mtmp->mhpmax <= 0 || mtmp->m_lev < 1) {
killed(mtmp);
} else {
mtmp->m_lev--;
if (canseemon(mtmp))
pline("%s suddenly seems weaker!", Monnam(mtmp));
@@ -3843,7 +3844,7 @@ const char *fltxt;
if (type < 0)
monkilled(mon, (char *) 0, -AD_RBRE);
else
xkilled(mon, 2);
xkilled(mon, XKILL_NOMSG | XKILL_NOCORPSE);
}
/*