* / / /
* x x x
*
+ * 0x8 MM_AGR_DONE
* 0x4 MM_AGR_DIED
* 0x2 MM_DEF_DIED
* 0x1 MM_HIT
case AT_WEAP: /* "hand to hand" attacks */
if (distmin(magr->mx, magr->my, mdef->mx, mdef->my) > 1) {
/* D: Do a ranged attack here! */
- strike = thrwmm(magr, mdef);
+ strike = (thrwmm(magr, mdef) == MM_MISS) ? 0 : 1;
if (strike)
/* don't really know if we hit or not; pretend we did */
res[i] |= MM_HIT;
if (magr->weapon_check == NEED_WEAPON || !MON_WEP(magr)) {
magr->weapon_check = NEED_HTH_WEAPON;
if (mon_wield_item(magr) != 0)
- return 0;
+ return MM_MISS;
}
possibly_unwield(magr, FALSE);
if ((mwep = MON_WEP(magr)) != 0) {
case AT_BREA:
if (!monnear(magr, mdef->mx, mdef->my)) {
- strike = breamm(magr, mattk, mdef);
+ strike = (breamm(magr, mattk, mdef) == MM_MISS) ? 0 : 1;
/* We don't really know if we hit or not; pretend we did. */
if (strike)
case AT_SPIT:
if (!monnear(magr, mdef->mx, mdef->my)) {
- strike = spitmm(magr, mattk, mdef);
+ strike = (spitmm(magr, mattk, mdef) == MM_MISS) ? 0 : 1;
/* We don't really know if we hit or not; pretend we did. */
if (strike)
* handled above. Returns same values as mattackm.
*/
static int
-passivemm(magr, mdef, mhit, mdead, mwep)
+passivemm(magr, mdef, mhitb, mdead, mwep)
register struct monst *magr, *mdef;
-boolean mhit;
+boolean mhitb;
int mdead;
struct obj *mwep;
{
register struct permonst *madat = magr->data;
char buf[BUFSZ];
int i, tmp;
+ int mhit = mhitb ? MM_HIT : MM_MISS;
for (i = 0;; i++) {
if (i >= NATTK)
/* These affect the enemy even if defender killed */
switch (mddat->mattk[i].adtyp) {
case AD_ACID:
- if (mhit && !rn2(2)) {
+ if (mhitb && !rn2(2)) {
Strcpy(buf, Monnam(magr));
if (canseemon(magr))
pline("%s is splashed by %s %s!", buf,
acid_damage(MON_WEP(magr));
goto assess_dmg;
case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */
- if (mhit && !mdef->mcan && mwep) {
+ if (mhitb && !mdef->mcan && mwep) {
(void) drain_item(mwep, FALSE);
/* No message */
}
/* prevent a monster with two consecutive disease or hunger attacks
from hitting with both of them on the same turn; if the first has
already hit, switch to a stun attack for the second */
- if (indx > 0 && prev_result[indx - 1] > 0
+ if (indx > 0 && prev_result[indx - 1] > MM_MISS
&& (attk->adtyp == AD_DISE || attk->adtyp == AD_PEST
|| attk->adtyp == AD_FAMN)
&& attk->adtyp == mptr->mattk[indx - 1].adtyp) {
g.skipdrin = FALSE; /* [see mattackm(mhitm.c)] */
for (i = 0; i < NATTK; i++) {
- sum[i] = 0;
+ sum[i] = MM_MISS;
if (i > 0 && foundyou /* previous attack might have moved hero */
&& (mtmp->mux != u.ux || mtmp->muy != u.uy))
continue; /* fill in sum[] with 'miss' but skip other actions */
if (g.context.botl)
bot();
/* give player a chance of waking up before dying -kaa */
- if (sum[i] == 1) { /* successful attack */
+ if (sum[i] == MM_HIT) { /* successful attack */
if (u.usleep && u.usleep < g.monstermoves && !rn2(10)) {
g.multi = -1;
g.nomovemsg = "The combat suddenly awakens you.";
}
}
- if (sum[i] == 2)
+ if ((sum[i] & MM_AGR_DIED))
return 1; /* attacker dead */
- if (sum[i] == 3)
+ if ((sum[i] & MM_AGR_DONE))
break; /* attacker teleported, no more attacks */
/* sum[i] == 0: unsuccessful attack */
}
/*
* hitmu: monster hits you
- * returns 2 if monster dies (e.g. "yellow light"), 1 otherwise
- * 3 if the monster lives but teleported/paralyzed, so it can't keep
- * attacking you
- */
+ * returns MM_ flags
+*/
static int
hitmu(mtmp, mattk)
register struct monst *mtmp;
if (mhm.damage)
res = passiveum(olduasmon, mtmp, mattk);
else
- res = 1;
+ res = MM_HIT;
stop_occupation();
return res;
}
int omx = mtmp->mx, omy = mtmp->my;
if (!engulf_target(mtmp, &g.youmonst))
- return 0;
+ return MM_MISS;
if ((t && is_pit(t->ttyp)) && sobj_at(BOULDER, u.ux, u.uy))
- return 0;
+ return MM_MISS;
if (Punished)
unplacebc(); /* ball&chain go away */
if (Punished)
placebc();
set_ustuck((struct monst *) 0);
- return (!DEADMONSTER(mtmp)) ? 0 : 2;
+ return (!DEADMONSTER(mtmp)) ? MM_MISS : MM_AGR_DIED;
}
display_nhwindow(WIN_MESSAGE, FALSE);
}
if (mtmp != u.ustuck)
- return 0;
+ return MM_MISS;
if (Punished) {
/* ball&chain are in limbo while swallowed; update their internal
location to be at swallower's spot */
pline("Obviously %s doesn't like your taste.", mon_nam(mtmp));
expels(mtmp, mtmp->data, FALSE);
}
- return 1;
+ return MM_HIT;
}
/* monster explodes in your face */
boolean physical_damage = TRUE, kill_agr = TRUE;
if (mtmp->mcan)
- return 0;
+ return MM_MISS;
if (!ufound) {
pline("%s explodes at a spot in %s!",
if (kill_agr)
mondead(mtmp);
wake_nearto(mtmp->mx, mtmp->my, 7 * 7);
- return (!DEADMONSTER(mtmp)) ? 0 : 2;
+ return (!DEADMONSTER(mtmp)) ? MM_MISS : MM_AGR_DIED;
}
/* monster gazes at you */
if (!DEADMONSTER(mtmp))
break;
- return 2;
+ return MM_AGR_DIED;
}
if (canseemon(mtmp) && couldsee(mtmp->mx, mtmp->my)
&& !Stone_resistance) {
: (!rn2(2) ? "a bit " : "somewhat "),
reactions[react]);
}
- return 0;
+ return MM_MISS;
}
/* mtmp hits you for n points damage */
*/
for (i = 0; !oldu_mattk; i++) {
if (i >= NATTK)
- return 1;
+ return MM_HIT;
if (olduasmon->mattk[i].aatyp == AT_NONE
|| olduasmon->mattk[i].aatyp == AT_BOOM)
oldu_mattk = &olduasmon->mattk[i];
g.stoned = 1;
xkilled(mtmp, XKILL_NOMSG);
if (!DEADMONSTER(mtmp))
- return 1;
- return 2;
+ return MM_HIT;
+ return MM_AGR_DIED;
}
- return 1;
+ return MM_HIT;
}
case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */
if (mon_currwep) {
(void) drain_item(mon_currwep, TRUE);
/* No message */
}
- return 1;
+ return MM_HIT;
default:
break;
}
if (!Upolyd)
- return 1;
+ return MM_HIT;
/* These affect the enemy only if you are still a monster */
if (rn2(3))
return 1;
pline("%s is frozen by your gaze!", Monnam(mtmp));
paralyze_monst(mtmp, tmp);
- return 3;
+ return MM_AGR_DONE;
}
}
} else { /* gelatinous cube */
pline("%s is frozen by you.", Monnam(mtmp));
paralyze_monst(mtmp, tmp);
- return 3;
+ return MM_AGR_DONE;
}
- return 1;
+ return MM_HIT;
case AD_COLD: /* Brown mold or blue jelly */
if (resists_cold(mtmp)) {
shieldeff(mtmp->mx, mtmp->my);
pline("%s dies!", Monnam(mtmp));
xkilled(mtmp, XKILL_NOMSG);
if (!DEADMONSTER(mtmp))
- return 1;
- return 2;
+ return MM_HIT;
+ return MM_AGR_DIED;
}
- return 1;
+ return MM_HIT;
}
struct monst *
: "makes some remarks about how difficult theft is lately");
if (!tele_restrict(magr))
(void) rloc(magr, TRUE);
- mhm->hitflags = MM_HIT | MM_DEF_DIED; /* return 3??? */
+ mhm->hitflags = MM_AGR_DONE; /* return 3??? */
mhm->done = TRUE;
return;
} else if (magr->mcan) {
if (rn2(3)) {
if (!tele_restrict(magr))
(void) rloc(magr, TRUE);
- mhm->hitflags = MM_HIT | MM_DEF_DIED; /* return 3??? */
+ mhm->hitflags = MM_AGR_DONE; /* return 3??? */
mhm->done = TRUE;
return;
}
buf[0] = '\0';
switch (steal(magr, buf)) {
case -1:
- mhm->hitflags = MM_DEF_DIED; /* return 2??? */
+ mhm->hitflags = MM_AGR_DIED; /* return 2??? */
mhm->done = TRUE;
return;
case 0:
locomotion(magr->data, "run"), buf);
}
monflee(magr, 0, FALSE, FALSE);
- mhm->hitflags = MM_HIT | MM_DEF_DIED; /* return 3??? */
+ mhm->hitflags = MM_AGR_DONE; /* return 3??? */
mhm->done = TRUE;
return;
}
if (SYSOPT_SEDUCE) {
if (could_seduce(magr, mdef, mattk) == 1 && !magr->mcan)
if (doseduce(magr)) {
- mhm->hitflags = MM_HIT | MM_DEF_DIED; /* return 3??? */
+ mhm->hitflags = MM_AGR_DONE;
mhm->done = TRUE;
return;
}
}
}
-
-/* Template for monster hits monster for AD_FOO.
- - replace "break" with return
- - replace "return" with mhm->done = TRUE
-*/
-void
-mhitm_ad_FOO(magr, mattk, mdef, mhm)
-struct monst *magr;
-struct attack *mattk;
-struct monst *mdef;
-struct mhitm_data *mhm;
-{
- struct permonst *pd = mdef->data;
-
- if (magr == &g.youmonst) {
- /* uhitm */
- int armpro = magic_negation(mdef);
- /* since hero can't be cancelled, only defender's armor applies */
- boolean negated = !(rn2(10) >= 3 * armpro);
-
- /* TODO */
- } else if (mdef == &g.youmonst) {
- /* mhitu */
- int armpro = magic_negation(mdef);
- boolean uncancelled = !magr->mcan && (rn2(10) >= 3 * armpro);
-
- /* TODO */
- } else {
- /* mhitm */
- int armpro = magic_negation(mdef);
- boolean cancelled = magr->mcan || !(rn2(10) >= 3 * armpro);
-
- /* TODO */
- }
-}
-
void
mhitm_adtyping(magr, mattk, mdef, mhm)
struct monst *magr;
&& u.umonnum != PM_SUCCUBUS && u.umonnum != PM_INCUBUS
&& u.umonnum != PM_BALROG) {
demonpet();
- return 0;
+ return MM_MISS;
}
mhitm_adtyping(&g.youmonst, mattk, mdef, &mhm);
xkilled(mdef, XKILL_NOMSG);
} else if (mhm.damage)
killed(mdef);
- return 2;
+ return MM_DEF_DIED;
}
- return 1;
+ return MM_HIT;
}
static int
mdef->mhp -= tmp;
if (DEADMONSTER(mdef)) {
killed(mdef);
- return 2;
+ return MM_DEF_DIED;
}
} else {
shieldeff(mdef->mx, mdef->my);
default:
break;
}
- return 1;
+ return MM_HIT;
}
static void
*/
if (!engulf_target(&g.youmonst, mdef))
- return 0;
+ return MM_MISS;
if (u.uhunger < 1500 && !u.uswallow) {
for (otmp = mdef->minvent; otmp; otmp = otmp->nobj)
pline("It turns into %s.", a_monnam(mdef));
else
map_invisible(mdef->mx, mdef->my);
- return 1;
+ return MM_HIT;
}
/* engulfing a cockatrice or digesting a Rider or Medusa */
pd->mname);
g.killer.format = NO_KILLER_PREFIX;
done(DIED);
- return 0; /* lifesaved */
+ return MM_MISS; /* lifesaved */
}
if (Slow_digestion) {
exercise(A_CON, TRUE);
}
end_engulf();
- return 2;
+ return MM_DEF_DIED;
case AD_PHYS:
if (g.youmonst.data == &mons[PM_FOG_CLOUD]) {
pline("%s is laden with your moisture.", Monnam(mdef));
if (DEADMONSTER(mdef)) {
killed(mdef);
if (DEADMONSTER(mdef)) /* not lifesaved */
- return 2;
+ return MM_DEF_DIED;
}
You("%s %s!", is_animal(g.youmonst.data) ? "regurgitate" : "expel",
mon_nam(mdef));
}
}
}
- return 0;
+ return MM_MISS;
}
void
struct attack *mattk, alt_attk;
struct obj *weapon, **originalweapon;
boolean altwep = FALSE, weapon_used = FALSE, odd_claw = TRUE;
- int i, tmp, armorpenalty, sum[NATTK], nsum = 0, dhit = 0, attknum = 0;
+ int i, tmp, armorpenalty, sum[NATTK], nsum = MM_MISS, dhit = 0, attknum = 0;
int dieroll, multi_claw = 0;
/* with just one touch/claw/weapon attack, both rings matter;
with more than one, alternate right and left when checking
whether silver ring causes successful hit */
for (i = 0; i < NATTK; i++) {
- sum[i] = 0;
+ sum[i] = MM_MISS;
mattk = getmattk(&g.youmonst, mon, i, sum, &alt_attk);
if (mattk->aatyp == AT_WEAP
|| mattk->aatyp == AT_CLAW || mattk->aatyp == AT_TUCH)
g.skipdrin = FALSE; /* [see mattackm(mhitm.c)] */
for (i = 0; i < NATTK; i++) {
- /* sum[i] = 0; -- now done above */
+ /* sum[i] = MM_MISS; -- now done above */
mattk = getmattk(&g.youmonst, mon, i, sum, &alt_attk);
if (g.skipdrin && mattk->aatyp == AT_TENT && mattk->adtyp == AD_DRIN)
continue;
get to make another weapon attack (note: monsters who
use weapons do not have this restriction, but they also
never have the opportunity to use two weapons) */
- if (weapon_used && sum[i - 1] && uwep && bimanual(uwep))
+ if (weapon_used && (sum[i - 1] > MM_MISS) && uwep && bimanual(uwep))
continue;
/* Certain monsters don't use weapons when encountered as enemies,
* but players who polymorph into them have hands or claws and
if (!known_hitum(mon, weapon, &dhit, tmp,
armorpenalty, mattk, dieroll)) {
/* enemy dead, before any special abilities used */
- sum[i] = 2;
+ sum[i] = MM_DEF_DIED;
break;
} else
- sum[i] = dhit;
+ sum[i] = dhit ? MM_HIT : MM_MISS;
/* originalweapon points to an equipment slot which might
now be empty if the weapon was destroyed during the hit;
passive(,weapon,...) won't call passive_obj() in that case */
if (silverhit && flags.verbose)
silver_sears(&g.youmonst, mon, silverhit);
sum[i] = damageum(mon, mattk, specialdmg);
- } else if (i >= 2 && sum[i - 1] && sum[i - 2]) {
+ } else if (i >= 2 && (sum[i - 1] > MM_MISS) && (sum[i - 2] > MM_MISS)) {
/* in case we're hugging a new target while already
holding something else; yields feedback
"<u.ustuck> is no longer in your clutches" */
Your("attempt to surround %s is harmless.", mon_nam(mon));
else {
sum[i] = gulpum(mon, mattk);
- if (sum[i] == 2 && (mon->data->mlet == S_ZOMBIE
+ if (sum[i] == MM_DEF_DIED && (mon->data->mlet == S_ZOMBIE
|| mon->data->mlet == S_MUMMY)
&& rn2(5) && !Sick_resistance) {
You_feel("%ssick.", (Sick) ? "very " : "");
u.mh = -1; /* dead in the current form */
rehumanize();
}
- if (sum[i] == 2) {
+ if (sum[i] == MM_DEF_DIED) {
/* defender dead */
(void) passive(mon, weapon, 1, 0, mattk->aatyp, FALSE);
- nsum = 0; /* return value below used to be 'nsum > 0' */
+ nsum = MM_MISS; /* return value below used to be 'nsum > 0' */
} else {
- (void) passive(mon, weapon, sum[i], 1, mattk->aatyp, FALSE);
+ (void) passive(mon, weapon, (sum[i] != MM_MISS), 1, mattk->aatyp, FALSE);
nsum |= sum[i];
}
/* Special (passive) attacks on you by monsters done here.
*/
int
-passive(mon, weapon, mhit, malive, aatyp, wep_was_destroyed)
+passive(mon, weapon, mhitb, maliveb, aatyp, wep_was_destroyed)
struct monst *mon;
struct obj *weapon; /* uwep or uswapwep or uarmg or uarmf or Null */
-boolean mhit;
-int malive;
+boolean mhitb;
+boolean maliveb;
uchar aatyp;
boolean wep_was_destroyed;
{
register struct permonst *ptr = mon->data;
register int i, tmp;
+ int mhit = mhitb ? MM_HIT : MM_MISS;
+ int malive = maliveb ? MM_HIT : MM_MISS;
for (i = 0;; i++) {
if (i >= NATTK)
*/
switch (ptr->mattk[i].adtyp) {
case AD_FIRE:
- if (mhit && !mon->mcan && weapon) {
+ if (mhitb && !mon->mcan && weapon) {
if (aatyp == AT_KICK) {
if (uarmf && !rn2(6))
(void) erode_obj(uarmf, xname(uarmf), ERODE_BURN,
}
break;
case AD_ACID:
- if (mhit && rn2(2)) {
+ if (mhitb && rn2(2)) {
if (Blind || !flags.verbose)
You("are splashed!");
else
if (!rn2(30))
erode_armor(&g.youmonst, ERODE_CORRODE);
}
- if (mhit && weapon) {
+ if (mhitb && weapon) {
if (aatyp == AT_KICK) {
if (uarmf && !rn2(6))
(void) erode_obj(uarmf, xname(uarmf), ERODE_CORRODE,
exercise(A_STR, FALSE);
break;
case AD_STON:
- if (mhit) { /* successful attack */
+ if (mhitb) { /* successful attack */
long protector = attk_protection((int) aatyp);
/* hero using monsters' AT_MAGC attack is hitting hand to
&& !(poly_when_stoned(g.youmonst.data)
&& polymon(PM_STONE_GOLEM))) {
done_in_by(mon, STONING); /* "You turn to stone..." */
- return 2;
+ return MM_DEF_DIED;
}
}
}
break;
case AD_RUST:
- if (mhit && !mon->mcan && weapon) {
+ if (mhitb && !mon->mcan && weapon) {
if (aatyp == AT_KICK) {
if (uarmf)
(void) erode_obj(uarmf, xname(uarmf), ERODE_RUST,
}
break;
case AD_CORR:
- if (mhit && !mon->mcan && weapon) {
+ if (mhitb && !mon->mcan && weapon) {
if (aatyp == AT_KICK) {
if (uarmf)
(void) erode_obj(uarmf, xname(uarmf), ERODE_CORRODE,
}
break;
case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */
- if (mhit) {
+ if (mhitb) {
if (aatyp == AT_KICK) {
if (!weapon)
break;