Unify ad_drin

This commit is contained in:
Pasi Kallinen
2020-12-04 09:30:17 +02:00
parent 1ca0165bb9
commit b4ed25da46
4 changed files with 115 additions and 85 deletions
+2
View File
@@ -1290,6 +1290,7 @@ E void FDECL(expels, (struct monst *, struct permonst *, BOOLEAN_P));
E struct attack *FDECL(getmattk, (struct monst *, struct monst *, E struct attack *FDECL(getmattk, (struct monst *, struct monst *,
int, int *, struct attack *)); int, int *, struct attack *));
E int FDECL(mattacku, (struct monst *)); E int FDECL(mattacku, (struct monst *));
boolean FDECL(u_slip_free, (struct monst *, struct attack *));
E int FDECL(magic_negation, (struct monst *)); E int FDECL(magic_negation, (struct monst *));
E boolean NDECL(gulp_blnd_check); E boolean NDECL(gulp_blnd_check);
E int FDECL(gazemu, (struct monst *, struct attack *)); E int FDECL(gazemu, (struct monst *, struct attack *));
@@ -2769,6 +2770,7 @@ E void FDECL(mhitm_ad_tlpt, (struct monst *, struct attack *, struct monst *, st
E void FDECL(mhitm_ad_blnd, (struct monst *, struct attack *, struct monst *, struct mhitm_data *)); E void FDECL(mhitm_ad_blnd, (struct monst *, struct attack *, struct monst *, struct mhitm_data *));
E void FDECL(mhitm_ad_curs, (struct monst *, struct attack *, struct monst *, struct mhitm_data *)); E void FDECL(mhitm_ad_curs, (struct monst *, struct attack *, struct monst *, struct mhitm_data *));
E void FDECL(mhitm_ad_drst, (struct monst *, struct attack *, struct monst *, struct mhitm_data *)); E void FDECL(mhitm_ad_drst, (struct monst *, struct attack *, struct monst *, struct mhitm_data *));
E void FDECL(mhitm_ad_drin, (struct monst *, struct attack *, struct monst *, struct mhitm_data *));
E int FDECL(damageum, (struct monst *, struct attack *, int)); E int FDECL(damageum, (struct monst *, struct attack *, int));
E void FDECL(missum, (struct monst *, struct attack *, BOOLEAN_P)); E void FDECL(missum, (struct monst *, struct attack *, BOOLEAN_P));
E int FDECL(passive, (struct monst *, struct obj *, BOOLEAN_P, int, E int FDECL(passive, (struct monst *, struct obj *, BOOLEAN_P, int,
+3 -19
View File
@@ -1221,25 +1221,9 @@ int dieroll;
return mhm.hitflags; return mhm.hitflags;
break; break;
case AD_DRIN: case AD_DRIN:
if (g.notonhead || !has_head(pd)) { mhitm_ad_drin(magr, mattk, mdef, &mhm);
if (g.vis && canspotmon(mdef)) if (mhm.done)
pline("%s doesn't seem harmed.", Monnam(mdef)); return mhm.hitflags;
/* Not clear what to do for green slimes */
mhm.damage = 0;
/* don't bother with additional DRIN attacks since they wouldn't
be able to hit target on head either */
g.skipdrin = TRUE; /* affects mattackm()'s attack loop */
break;
}
if ((mdef->misc_worn_check & W_ARMH) && rn2(8)) {
if (g.vis && canspotmon(magr) && canseemon(mdef)) {
Strcpy(buf, s_suffix(Monnam(mdef)));
pline("%s helmet blocks %s attack to %s head.", buf,
s_suffix(mon_nam(magr)), mhis(mdef));
}
break;
}
mhm.hitflags = eat_brains(magr, mdef, g.vis, &mhm.damage);
break; break;
case AD_SLIM: case AD_SLIM:
if (cancelled) if (cancelled)
+4 -36
View File
@@ -13,7 +13,6 @@ static void FDECL(mswings, (struct monst *, struct obj *));
static void FDECL(wildmiss, (struct monst *, struct attack *)); static void FDECL(wildmiss, (struct monst *, struct attack *));
static void FDECL(summonmu, (struct monst *, BOOLEAN_P)); static void FDECL(summonmu, (struct monst *, BOOLEAN_P));
static boolean FDECL(diseasemu, (struct permonst *)); static boolean FDECL(diseasemu, (struct permonst *));
static boolean FDECL(u_slip_free, (struct monst *, struct attack *));
static int FDECL(hitmu, (struct monst *, struct attack *)); static int FDECL(hitmu, (struct monst *, struct attack *));
static int FDECL(gulpmu, (struct monst *, struct attack *)); static int FDECL(gulpmu, (struct monst *, struct attack *));
static int FDECL(explmu, (struct monst *, struct attack *, BOOLEAN_P)); static int FDECL(explmu, (struct monst *, struct attack *, BOOLEAN_P));
@@ -869,7 +868,7 @@ struct permonst *mdat;
} }
/* check whether slippery clothing protects from hug or wrap attack */ /* check whether slippery clothing protects from hug or wrap attack */
static boolean boolean
u_slip_free(mtmp, mattk) u_slip_free(mtmp, mattk)
struct monst *mtmp; struct monst *mtmp;
struct attack *mattk; struct attack *mattk;
@@ -1137,40 +1136,9 @@ register struct attack *mattk;
return mhm.hitflags; return mhm.hitflags;
break; break;
case AD_DRIN: case AD_DRIN:
hitmsg(mtmp, mattk); mhitm_ad_drin(mtmp, mattk, &g.youmonst, &mhm);
if (defends(AD_DRIN, uwep) || !has_head(g.youmonst.data)) { if (mhm.done)
You("don't seem harmed."); return mhm.hitflags;
/* attacker should skip remaining AT_TENT+AD_DRIN attacks */
g.skipdrin = TRUE;
/* Not clear what to do for green slimes */
break;
}
if (u_slip_free(mtmp, mattk))
break;
if (uarmh && rn2(8)) {
/* not body_part(HEAD) */
Your("%s blocks the attack to your head.",
helm_simple_name(uarmh));
break;
}
/* negative armor class doesn't reduce this damage */
if (Half_physical_damage)
mhm.damage = (mhm.damage + 1) / 2;
mdamageu(mtmp, mhm.damage);
mhm.damage = 0; /* don't inflict a second dose below */
if (!uarmh || uarmh->otyp != DUNCE_CAP) {
/* eat_brains() will miss if target is mindless (won't
happen here; hero is considered to retain his mind
regardless of current shape) or is noncorporeal
(can't happen here; no one can poly into a ghost
or shade) so this check for missing is academic */
if (eat_brains(mtmp, &g.youmonst, TRUE, (int *) 0) == MM_MISS)
break;
}
/* adjattrib gives dunce cap message when appropriate */
(void) adjattrib(A_INT, -rnd(2), FALSE);
break; break;
case AD_PLYS: case AD_PLYS:
hitmsg(mtmp, mattk); hitmsg(mtmp, mattk);
+106 -30
View File
@@ -2638,6 +2638,108 @@ struct mhitm_data *mhm;
} }
} }
void
mhitm_ad_drin(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 */
struct obj *helmet;
if (g.notonhead || !has_head(pd)) {
pline("%s doesn't seem harmed.", Monnam(mdef));
/* hero should skip remaining AT_TENT+AD_DRIN attacks
because they'll be just as harmless as this one (and also
to reduce verbosity) */
g.skipdrin = TRUE;
mhm->damage = 0;
if (!Unchanging && pd == &mons[PM_GREEN_SLIME]) {
if (!Slimed) {
You("suck in some slime and don't feel very well.");
make_slimed(10L, (char *) 0);
}
}
return;
}
if (m_slips_free(mdef, mattk))
return;
if ((helmet = which_armor(mdef, W_ARMH)) != 0 && rn2(8)) {
pline("%s %s blocks your attack to %s head.",
s_suffix(Monnam(mdef)), helm_simple_name(helmet),
mhis(mdef));
return;
}
(void) eat_brains(&g.youmonst, mdef, TRUE, &mhm->damage);
} else if (mdef == &g.youmonst) {
/* mhitu */
hitmsg(magr, mattk);
if (defends(AD_DRIN, uwep) || !has_head(pd)) {
You("don't seem harmed.");
/* attacker should skip remaining AT_TENT+AD_DRIN attacks */
g.skipdrin = TRUE;
/* Not clear what to do for green slimes */
return;
}
if (u_slip_free(magr, mattk))
return;
if (uarmh && rn2(8)) {
/* not body_part(HEAD) */
Your("%s blocks the attack to your head.",
helm_simple_name(uarmh));
return;
}
/* negative armor class doesn't reduce this damage */
if (Half_physical_damage)
mhm->damage = (mhm->damage + 1) / 2;
mdamageu(magr, mhm->damage);
mhm->damage = 0; /* don't inflict a second dose below */
if (!uarmh || uarmh->otyp != DUNCE_CAP) {
/* eat_brains() will miss if target is mindless (won't
happen here; hero is considered to retain his mind
regardless of current shape) or is noncorporeal
(can't happen here; no one can poly into a ghost
or shade) so this check for missing is academic */
if (eat_brains(magr, mdef, TRUE, (int *) 0) == MM_MISS)
return;
}
/* adjattrib gives dunce cap message when appropriate */
(void) adjattrib(A_INT, -rnd(2), FALSE);
} else {
/* mhitm */
char buf[BUFSZ];
if (g.notonhead || !has_head(pd)) {
if (g.vis && canspotmon(mdef))
pline("%s doesn't seem harmed.", Monnam(mdef));
/* Not clear what to do for green slimes */
mhm->damage = 0;
/* don't bother with additional DRIN attacks since they wouldn't
be able to hit target on head either */
g.skipdrin = TRUE; /* affects mattackm()'s attack loop */
return;
}
if ((mdef->misc_worn_check & W_ARMH) && rn2(8)) {
if (g.vis && canspotmon(magr) && canseemon(mdef)) {
Strcpy(buf, s_suffix(Monnam(mdef)));
pline("%s helmet blocks %s attack to %s head.", buf,
s_suffix(mon_nam(magr)), mhis(mdef));
}
return;
}
mhm->hitflags = eat_brains(magr, mdef, g.vis, &mhm->damage);
}
}
/* Template for monster hits monster for AD_FOO. /* Template for monster hits monster for AD_FOO.
- replace "break" with return - replace "break" with return
- replace "return" with mhm->done = TRUE - replace "return" with mhm->done = TRUE
@@ -2819,37 +2921,11 @@ int specialdmg; /* blessed and/or silver bonus against various things */
if (mhm.done) if (mhm.done)
return mhm.hitflags; return mhm.hitflags;
break; break;
case AD_DRIN: { case AD_DRIN:
struct obj *helmet; mhitm_ad_drin(&g.youmonst, mattk, mdef, &mhm);
if (mhm.done)
if (g.notonhead || !has_head(pd)) { return mhm.hitflags;
pline("%s doesn't seem harmed.", Monnam(mdef));
/* hero should skip remaining AT_TENT+AD_DRIN attacks
because they'll be just as harmless as this one (and also
to reduce verbosity) */
g.skipdrin = TRUE;
mhm.damage = 0;
if (!Unchanging && pd == &mons[PM_GREEN_SLIME]) {
if (!Slimed) {
You("suck in some slime and don't feel very well.");
make_slimed(10L, (char *) 0);
}
}
break;
}
if (m_slips_free(mdef, mattk))
break;
if ((helmet = which_armor(mdef, W_ARMH)) != 0 && rn2(8)) {
pline("%s %s blocks your attack to %s head.",
s_suffix(Monnam(mdef)), helm_simple_name(helmet),
mhis(mdef));
break;
}
(void) eat_brains(&g.youmonst, mdef, TRUE, &mhm.damage);
break; break;
}
case AD_STCK: case AD_STCK:
if (!negated && !sticks(pd) && distu(mdef->mx, mdef->my) <= 2) if (!negated && !sticks(pd) && distu(mdef->mx, mdef->my) <= 2)
u.ustuck = mdef; /* it's now stuck to you */ u.ustuck = mdef; /* it's now stuck to you */