]> granicus.if.org Git - nethack/commitdiff
Unify the ad type switches
authorPasi Kallinen <paxed@alt.org>
Tue, 1 Dec 2020 14:28:28 +0000 (16:28 +0200)
committerPasi Kallinen <paxed@alt.org>
Fri, 4 Dec 2020 07:30:21 +0000 (09:30 +0200)
include/extern.h
src/mhitm.c
src/mhitu.c
src/uhitm.c

index 8b4bd149c29d309e19fbbedef77c5841a58112a2..fb348d6da23d38dc6a8729c220a880b85db1e4de 100644 (file)
@@ -2796,6 +2796,7 @@ E void FDECL(mhitm_ad_samu, (struct monst *, struct attack *, struct monst *, st
 E void FDECL(mhitm_ad_dise, (struct monst *, struct attack *, struct monst *, struct mhitm_data *));
 E void FDECL(mhitm_ad_sedu, (struct monst *, struct attack *, struct monst *, struct mhitm_data *));
 E void FDECL(mhitm_ad_ssex, (struct monst *, struct attack *, struct monst *, struct mhitm_data *));
+E void FDECL(mhitm_adtyping, (struct monst *, struct attack *, struct monst *, struct mhitm_data *));
 E boolean FDECL(do_stone_u, (struct monst *));
 E void FDECL(do_stone_mon, (struct monst *, struct attack *, struct monst *, struct mhitm_data *));
 E int FDECL(damageum, (struct monst *, struct attack *, int));
index 0cb8138035dec1c2475ccd13fdd370bfbdd9c8ba..7c0b2c913cf988e6d2ebe3f9e34628b80efcca3e 100644 (file)
@@ -898,184 +898,10 @@ int dieroll;
     armpro = magic_negation(mdef);
     cancelled = magr->mcan || !(rn2(10) >= 3 * armpro);
 
-    switch (mattk->adtyp) {
-    case AD_DGST:
-        mhitm_ad_dgst(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_STUN:
-        mhitm_ad_stun(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_LEGS:
-        mhitm_ad_legs(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_WERE:
-        mhitm_ad_were(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_HEAL:
-        mhitm_ad_heal(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_PHYS:
-        mhitm_ad_phys(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_FIRE:
-        mhitm_ad_fire(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_COLD:
-        mhitm_ad_cold(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_ELEC:
-        mhitm_ad_elec(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_ACID:
-        mhitm_ad_acid(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_RUST:
-        mhitm_ad_rust(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_CORR:
-        mhitm_ad_corr(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DCAY:
-        mhitm_ad_dcay(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_STON:
-        mhitm_ad_ston(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_TLPT:
-        mhitm_ad_tlpt(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SLEE:
-        mhitm_ad_slee(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_PLYS:
-        mhitm_ad_plys(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SLOW:
-        mhitm_ad_slow(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_CONF:
-        mhitm_ad_conf(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_BLND:
-        mhitm_ad_blnd(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_HALU:
-        mhitm_ad_halu(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_CURS:
-        mhitm_ad_curs(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SGLD:
-        mhitm_ad_sgld(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DRLI: /* drain life */
-        mhitm_ad_drli(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SSEX:
-        mhitm_ad_ssex(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SITM: /* for now these are the same */
-    case AD_SEDU:
-        mhitm_ad_sedu(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DREN:
-        mhitm_ad_dren(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DRST:
-    case AD_DRDX:
-    case AD_DRCO:
-        mhitm_ad_drst(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DRIN:
-        mhitm_ad_drin(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SLIM:
-        mhitm_ad_slim(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_STCK:
-        mhitm_ad_stck(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_WRAP:
-        mhitm_ad_wrap(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_ENCH:
-        mhitm_ad_ench(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_POLY:
-        mhitm_ad_poly(magr, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    default:
-        mhm.damage = 0;
-        break;
-    }
+    mhitm_adtyping(magr, mattk, mdef, &mhm);
+    if (mhm.done)
+        return mhm.hitflags;
+
     if (!mhm.damage)
         return mhm.hitflags;
 
index 3fce4da9e883941d532989d25279de95305e8f74..84cab3e9181e417eb2d704557d919c83d3554cbe 100644 (file)
@@ -1014,201 +1014,10 @@ register struct attack *mattk;
     armpro = magic_negation(&g.youmonst);
     uncancelled = !mtmp->mcan && (rn2(10) >= 3 * armpro);
 
-    /*  Now, adjust damages via resistances or specific attacks */
-    switch (mattk->adtyp) {
-    case AD_PHYS:
-        mhitm_ad_phys(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DISE:
-        mhitm_ad_dise(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_FIRE:
-        mhitm_ad_fire(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_COLD:
-        mhitm_ad_cold(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_ELEC:
-        mhitm_ad_elec(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SLEE:
-        mhitm_ad_slee(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_BLND:
-        mhitm_ad_blnd(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DRST:
-    case AD_DRDX:
-    case AD_DRCO:
-        mhitm_ad_drst(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DRIN:
-        mhitm_ad_drin(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_PLYS:
-        mhitm_ad_plys(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DRLI: /* drain life */
-        mhitm_ad_drli(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_LEGS:
-        mhitm_ad_legs(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_STON:
-        mhitm_ad_ston(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_STCK:
-        mhitm_ad_stck(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_WRAP:
-        mhitm_ad_wrap(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_WERE:
-        mhitm_ad_were(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SGLD:
-        mhitm_ad_sgld(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
+    mhitm_adtyping(mtmp, mattk, &g.youmonst, &mhm);
+    if (mhm.done)
+        return mhm.hitflags;
 
-    case AD_SSEX:
-        mhitm_ad_ssex(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SITM: /* for now these are the same */
-    case AD_SEDU:
-        mhitm_ad_sedu(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SAMU:
-        mhitm_ad_samu(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_TLPT:
-        mhitm_ad_tlpt(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_RUST:
-        mhitm_ad_rust(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_CORR:
-        mhitm_ad_corr(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DCAY:
-        mhitm_ad_dcay(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_HEAL:
-        mhitm_ad_heal(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_CURS:
-        mhitm_ad_curs(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_STUN:
-        mhitm_ad_stun(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_ACID:
-        mhitm_ad_acid(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SLOW:
-        mhitm_ad_slow(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DREN:
-        mhitm_ad_dren(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_CONF:
-        mhitm_ad_conf(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DETH:
-        mhitm_ad_deth(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_PEST:
-        mhitm_ad_pest(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_FAMN:
-        mhitm_ad_famn(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SLIM:
-        mhitm_ad_slim(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */
-        mhitm_ad_ench(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_POLY:
-        mhitm_ad_poly(mtmp, mattk, &g.youmonst, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    default:
-        mhm.damage = 0;
-        break;
-    }
     if ((Upolyd ? u.mh : u.uhp) < 1) {
         /* already dead? call rehumanize() or done_in_by() as appropriate */
         mdamageu(mtmp, 1);
index 012f1cfdbbe1b7c8623568413d48a71295625861..6adf232ed0673d57a9238786c9d0b7dd646afeb5 100644 (file)
@@ -4219,6 +4219,61 @@ struct mhitm_data *mhm;
     }
 }
 
+void
+mhitm_adtyping(magr, mattk, mdef, mhm)
+struct monst *magr;
+struct attack *mattk;
+struct monst *mdef;
+struct mhitm_data *mhm;
+{
+    switch (mattk->adtyp) {
+    case AD_STUN: mhitm_ad_stun(magr, mattk, mdef, mhm); break;
+    case AD_LEGS: mhitm_ad_legs(magr, mattk, mdef, mhm); break;
+    case AD_WERE: mhitm_ad_were(magr, mattk, mdef, mhm); break;
+    case AD_HEAL: mhitm_ad_heal(magr, mattk, mdef, mhm); break;
+    case AD_PHYS: mhitm_ad_phys(magr, mattk, mdef, mhm); break;
+    case AD_FIRE: mhitm_ad_fire(magr, mattk, mdef, mhm); break;
+    case AD_COLD: mhitm_ad_cold(magr, mattk, mdef, mhm); break;
+    case AD_ELEC: mhitm_ad_elec(magr, mattk, mdef, mhm); break;
+    case AD_ACID: mhitm_ad_acid(magr, mattk, mdef, mhm); break;
+    case AD_STON: mhitm_ad_ston(magr, mattk, mdef, mhm); break;
+    case AD_SSEX: mhitm_ad_ssex(magr, mattk, mdef, mhm); break;
+    case AD_SITM:
+    case AD_SEDU: mhitm_ad_sedu(magr, mattk, mdef, mhm); break;
+    case AD_SGLD: mhitm_ad_sgld(magr, mattk, mdef, mhm); break;
+    case AD_TLPT: mhitm_ad_tlpt(magr, mattk, mdef, mhm); break;
+    case AD_BLND: mhitm_ad_blnd(magr, mattk, mdef, mhm); break;
+    case AD_CURS: mhitm_ad_curs(magr, mattk, mdef, mhm); break;
+    case AD_DRLI: mhitm_ad_drli(magr, mattk, mdef, mhm); break;
+    case AD_RUST: mhitm_ad_rust(magr, mattk, mdef, mhm); break;
+    case AD_CORR: mhitm_ad_corr(magr, mattk, mdef, mhm); break;
+    case AD_DCAY: mhitm_ad_dcay(magr, mattk, mdef, mhm); break;
+    case AD_DREN: mhitm_ad_dren(magr, mattk, mdef, mhm); break;
+    case AD_DRST:
+    case AD_DRDX:
+    case AD_DRCO: mhitm_ad_drst(magr, mattk, mdef, mhm); break;
+    case AD_DRIN: mhitm_ad_drin(magr, mattk, mdef, mhm); break;
+    case AD_STCK: mhitm_ad_stck(magr, mattk, mdef, mhm); break;
+    case AD_WRAP: mhitm_ad_wrap(magr, mattk, mdef, mhm); break;
+    case AD_PLYS: mhitm_ad_plys(magr, mattk, mdef, mhm); break;
+    case AD_SLEE: mhitm_ad_slee(magr, mattk, mdef, mhm); break;
+    case AD_SLIM: mhitm_ad_slim(magr, mattk, mdef, mhm); break;
+    case AD_ENCH: mhitm_ad_ench(magr, mattk, mdef, mhm); break;
+    case AD_SLOW: mhitm_ad_slow(magr, mattk, mdef, mhm); break;
+    case AD_CONF: mhitm_ad_conf(magr, mattk, mdef, mhm); break;
+    case AD_POLY: mhitm_ad_poly(magr, mattk, mdef, mhm); break;
+    case AD_DISE: mhitm_ad_dise(magr, mattk, mdef, mhm); break;
+    case AD_SAMU: mhitm_ad_samu(magr, mattk, mdef, mhm); break;
+    case AD_DETH: mhitm_ad_deth(magr, mattk, mdef, mhm); break;
+    case AD_PEST: mhitm_ad_pest(magr, mattk, mdef, mhm); break;
+    case AD_FAMN: mhitm_ad_famn(magr, mattk, mdef, mhm); break;
+    case AD_DGST: mhitm_ad_dgst(magr, mattk, mdef, mhm); break;
+    case AD_HALU: mhitm_ad_halu(magr, mattk, mdef, mhm); break;
+    default:
+        mhm->damage = 0;
+    }
+}
+
 int
 damageum(mdef, mattk, specialdmg)
 register struct monst *mdef;
@@ -4244,174 +4299,10 @@ int specialdmg; /* blessed and/or silver bonus against various things */
         demonpet();
         return 0;
     }
-    switch (mattk->adtyp) {
-    case AD_STUN:
-        mhitm_ad_stun(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_LEGS:
-        mhitm_ad_legs(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_WERE:
-        mhitm_ad_were(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_HEAL:
-        mhitm_ad_heal(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_PHYS:
-        mhitm_ad_phys(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_FIRE:
-        mhitm_ad_fire(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_COLD:
-        mhitm_ad_cold(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_ELEC:
-        mhitm_ad_elec(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_ACID:
-        mhitm_ad_acid(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_STON:
-        mhitm_ad_ston(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SSEX:
-        mhitm_ad_ssex(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SITM:
-    case AD_SEDU:
-        mhitm_ad_sedu(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SGLD:
-        mhitm_ad_sgld(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_TLPT:
-        mhitm_ad_tlpt(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_BLND:
-        mhitm_ad_blnd(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_CURS:
-        mhitm_ad_curs(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DRLI: /* drain life */
-        mhitm_ad_drli(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_RUST:
-        mhitm_ad_rust(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_CORR:
-        mhitm_ad_corr(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DCAY:
-        mhitm_ad_dcay(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DREN:
-        mhitm_ad_dren(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DRST:
-    case AD_DRDX:
-    case AD_DRCO:
-        mhitm_ad_drst(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_DRIN:
-        mhitm_ad_drin(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_STCK:
-        mhitm_ad_stck(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_WRAP:
-        mhitm_ad_wrap(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_PLYS:
-        mhitm_ad_plys(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SLEE:
-        mhitm_ad_slee(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SLIM:
-        mhitm_ad_slim(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_ENCH:
-        mhitm_ad_ench(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_SLOW:
-        mhitm_ad_slow(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_CONF:
-        mhitm_ad_conf(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    case AD_POLY:
-        mhitm_ad_poly(&g.youmonst, mattk, mdef, &mhm);
-        if (mhm.done)
-            return mhm.hitflags;
-        break;
-    default:
-        mhm.damage = 0;
-        break;
-    }
+
+    mhitm_adtyping(&g.youmonst, mattk, mdef, &mhm);
+    if (mhm.done)
+        return mhm.hitflags;
 
     mdef->mstrategy &= ~STRAT_WAITFORU; /* in case player is very fast */
     mdef->mhp -= mhm.damage;