From: Pasi Kallinen Date: Tue, 1 Dec 2020 14:28:28 +0000 (+0200) Subject: Unify the ad type switches X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ef3b425ad1288d8f3a3ca602f515578dc819dfb;p=nethack Unify the ad type switches --- diff --git a/include/extern.h b/include/extern.h index 8b4bd149c..fb348d6da 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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)); diff --git a/src/mhitm.c b/src/mhitm.c index 0cb813803..7c0b2c913 100644 --- a/src/mhitm.c +++ b/src/mhitm.c @@ -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; diff --git a/src/mhitu.c b/src/mhitu.c index 3fce4da9e..84cab3e91 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -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); diff --git a/src/uhitm.c b/src/uhitm.c index 012f1cfdb..6adf232ed 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -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;