-/* NetHack 3.7 mon.c $NHDT-Date: 1646171625 2022/03/01 21:53:45 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.410 $ */
+/* NetHack 3.7 mon.c $NHDT-Date: 1646182267 2022/03/02 00:51:07 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.411 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Derek S. Ray, 2015. */
/* NetHack may be freely redistributed. See license for details. */
|| is_reviver((mon)->data) \
/* normally quest leader will be unique, */ \
/* but he or she might have been polymorphed */ \
- || (mon)->m_id == g.quest_status.leader_m_id \
+ || (mon)->m_id == g.quest_status.leader_m_id \
/* special cancellation handling for these */ \
|| (dmgtype((mon)->data, AD_SEDU) || dmgtype((mon)->data, AD_SSEX)))
{
struct permonst *mptr;
boolean be_sad;
- int tmp;
+ int mndx;
/* potential pet message; always clear global flag */
be_sad = iflags.sad_feeling;
return;
if (is_vampshifter(mtmp)) {
- int mndx = mtmp->cham;
- int x = mtmp->mx, y = mtmp->my;
-
/* this only happens if shapeshifted */
+ mndx = mtmp->cham;
if (mndx >= LOW_PM && mndx != monsndx(mtmp->data)
&& !(g.mvitals[mndx].mvflags & G_GENOD)) {
+ coord new_xy;
char buf[BUFSZ];
boolean in_door = (amorphous(mtmp->data)
&& closed_door(mtmp->mx, mtmp->my)),
spec_death = (g.disintegested /* disintegrated or digested */
|| noncorporeal(mtmp->data)
|| amorphous(mtmp->data));
+ int x = mtmp->mx, y = mtmp->my;
/* construct a format string before transformation;
will be capitalized when used, expects one %s arg */
uunstick();
}
if (in_door) {
- coord new_xy;
-
- if (enexto(&new_xy, mtmp->mx, mtmp->my, &mons[mndx])) {
+ if (enexto(&new_xy, mtmp->mx, mtmp->my, &mons[mndx]))
rloc_to(mtmp, new_xy.x, new_xy.y);
- }
}
newcham(mtmp, &mons[mndx], FALSE, FALSE);
if (mtmp->data == &mons[mndx])
* based on only player kills probably opens more avenues of abuse
* for rings of conflict and such.
*/
- tmp = monsndx(mtmp->data);
- if (g.mvitals[tmp].died < 255)
- g.mvitals[tmp].died++;
+ mndx = monsndx(mtmp->data);
+ if (g.mvitals[mndx].died < 255)
+ g.mvitals[mndx].died++;
/* if it's a (possibly polymorphed) quest leader, mark him as dead */
if (mtmp->m_id == g.quest_status.leader_m_id)
g.quest_status.leader_is_dead = TRUE;
#ifdef MAIL_STRUCTURES
/* if the mail daemon dies, no more mail delivery. -3. */
- if (tmp == PM_MAIL_DAEMON)
- g.mvitals[tmp].mvflags |= G_GENOD;
+ if (mndx == PM_MAIL_DAEMON)
+ g.mvitals[mndx].mvflags |= G_GENOD;
#endif
if (mtmp->data->mlet == S_KOP) {
if (mtmp->data->msound == MS_NEMESIS)
nemdead();
#endif
- if (mtmp->data == &mons[PM_MEDUSA])
- record_achievement(ACH_MEDU);
- else if (unique_corpstat(mtmp->data)) {
- switch (g.mvitals[tmp].died) {
- case 1:
- livelog_printf(LL_UMONST, "%s %s",
- nonliving(mtmp->data) ? "destroyed" : "killed",
- livelog_mon_nam(mtmp));
- break;
- case 5:
- case 10:
- case 50:
- case 100:
- case 150:
- case 200:
- case 250:
- livelog_printf(LL_UMONST, "%s %s (%d times)",
- nonliving(mtmp->data) ? "destroyed" : "killed",
- livelog_mon_nam(mtmp), g.mvitals[tmp].died);
- break;
- default:
- /* don't spam the log every time */
- break;
+
+ if (mndx == PM_MEDUSA && g.mvitals[mndx].died == 1) {
+ record_achievement(ACH_MEDU); /* also generates a livelog event */
+ } else if (unique_corpstat(mtmp->data)) {
+ /*
+ * livelog event; unique_corpstat() includes the Wizard and
+ * any High Priest even though they aren't actually unique.
+ *
+ * It would be nice to include shopkeepers. Their names are
+ * unique within each game but unfortunately for this potential
+ * usage their kill count is lumped together in a group total.
+ */
+ int howmany = g.mvitals[mndx].died;
+
+ /* killing a unique more than once doesn't get logged every time;
+ the Wizard and the Riders can be killed more than once
+ "naturally", others require deliberate player action such as
+ use of undead turning to revive a corpse or petrification plus
+ stone-to-flesh to create and revive a statue */
+ if (howmany <= 3 || howmany == 5 || howmany == 10 || howmany == 25
+ || (howmany % 50) == 0) {
+ char xtra[40];
+
+ xtra[0] = '\0';
+ if (howmany > 1) /* "(2nd time)" or "(50th time)" */
+ Sprintf(xtra, " (%d%s time)", howmany, ordin(howmany));
+
+ livelog_printf(LL_UMONST | ((howmany == 1) ? LL_ACHIEVE : 0),
+ "%s %s%s",
+ nonliving(mtmp->data) ? "destroyed" : "killed",
+ livelog_mon_nam(mtmp), xtra);
}
}
if (glyph_is_invisible(levl[mtmp->mx][mtmp->my].glyph))
unmap_object(mtmp->mx, mtmp->my);
m_detach(mtmp, mptr);
+ return;
}
RESTORE_WARNING_FORMAT_NONLITERAL