Unify ad_drin

This commit is contained in:
Pasi Kallinen
2020-11-30 21:50:27 +02:00
parent 1ca0165bb9
commit b4ed25da46
4 changed files with 115 additions and 85 deletions

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 *,
int, int *, struct attack *));
E int FDECL(mattacku, (struct monst *));
boolean FDECL(u_slip_free, (struct monst *, struct attack *));
E int FDECL(magic_negation, (struct monst *));
E boolean NDECL(gulp_blnd_check);
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_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_drin, (struct monst *, struct attack *, struct monst *, struct mhitm_data *));
E int FDECL(damageum, (struct monst *, struct attack *, int));
E void FDECL(missum, (struct monst *, struct attack *, BOOLEAN_P));
E int FDECL(passive, (struct monst *, struct obj *, BOOLEAN_P, int,

View File

@@ -1221,25 +1221,9 @@ int dieroll;
return mhm.hitflags;
break;
case AD_DRIN:
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 */
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);
mhitm_ad_drin(magr, mattk, mdef, &mhm);
if (mhm.done)
return mhm.hitflags;
break;
case AD_SLIM:
if (cancelled)

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(summonmu, (struct monst *, BOOLEAN_P));
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(gulpmu, (struct monst *, struct attack *));
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 */
static boolean
boolean
u_slip_free(mtmp, mattk)
struct monst *mtmp;
struct attack *mattk;
@@ -1137,40 +1136,9 @@ register struct attack *mattk;
return mhm.hitflags;
break;
case AD_DRIN:
hitmsg(mtmp, mattk);
if (defends(AD_DRIN, uwep) || !has_head(g.youmonst.data)) {
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 */
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);
mhitm_ad_drin(mtmp, mattk, &g.youmonst, &mhm);
if (mhm.done)
return mhm.hitflags;
break;
case AD_PLYS:
hitmsg(mtmp, mattk);

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.
- replace "break" with return
- replace "return" with mhm->done = TRUE
@@ -2819,37 +2921,11 @@ int specialdmg; /* blessed and/or silver bonus against various things */
if (mhm.done)
return mhm.hitflags;
break;
case AD_DRIN: {
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);
}
}
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);
case AD_DRIN:
mhitm_ad_drin(&g.youmonst, mattk, mdef, &mhm);
if (mhm.done)
return mhm.hitflags;
break;
}
case AD_STCK:
if (!negated && !sticks(pd) && distu(mdef->mx, mdef->my) <= 2)
u.ustuck = mdef; /* it's now stuck to you */