From c095ad285be9075f76c96645f763005d8f719a6f Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Mon, 31 Jan 2011 20:46:53 +0100 Subject: [PATCH] Factor feels_like_helping() out of quiet_bigdef(), sd(), dd() --- include/prototypes.h | 1 + src/lib/commands/mfir.c | 32 ++++---------------------------- src/lib/subs/fortdef.c | 37 +++++++++++++++++++++---------------- 3 files changed, 26 insertions(+), 44 deletions(-) diff --git a/include/prototypes.h b/include/prototypes.h index 560f17789..e7cdb6b5f 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -437,6 +437,7 @@ extern void ef_fin_srv(void); extern int sd(natid, natid, coord, coord, int, int, int); extern int dd(natid, natid, coord, coord, int, int); extern int shipdef(natid, natid, coord, coord); +extern int feels_like_helping(natid, natid, natid); /* getbit.c */ extern int emp_getbit(int, int, unsigned char *); extern void emp_setbit(int, int, unsigned char *); diff --git a/src/lib/commands/mfir.c b/src/lib/commands/mfir.c index f2e3b7a71..1d8925ff1 100644 --- a/src/lib/commands/mfir.c +++ b/src/lib/commands/mfir.c @@ -588,7 +588,7 @@ quiet_bigdef(int type, struct emp_qelem *list, natid own, natid aown, struct shpstr ship; struct lndstr land; struct nstr_item ni; - int dam, dam2, rel, rel2; + int dam, dam2; struct sctstr firing; struct nstr_sect ns; struct flist *fp; @@ -598,19 +598,12 @@ quiet_bigdef(int type, struct emp_qelem *list, natid own, natid aown, dam = 0; snxtitem_dist(&ni, EF_SHIP, ax, ay, 8); while (nxtitem(&ni, &ship)) { - if (ship.shp_own == 0) + if (!feels_like_helping(ship.shp_own, own, aown)) continue; if ((mchr[ship.shp_type].m_flags & M_SUB) && type != EF_SHIP) continue; - rel = getrel(getnatp(ship.shp_own), own); - rel2 = getrel(getnatp(ship.shp_own), aown); - if ((ship.shp_own != own) && ((rel != ALLIED) || (rel2 != AT_WAR))) - continue; - /* Don't shoot yourself */ - if (ship.shp_own == aown) - continue; if (mchr[(int)ship.shp_type].m_flags & M_SUB) { erange = torprange(&ship); if (roundrange(erange) < ni.curdist) @@ -650,16 +643,7 @@ quiet_bigdef(int type, struct emp_qelem *list, natid own, natid aown, } snxtitem_dist(&ni, EF_LAND, ax, ay, 8); while (nxtitem(&ni, &land)) { - if (land.lnd_own == 0) - continue; - /* Don't shoot yourself */ - if (land.lnd_own == aown) - continue; - - rel = getrel(getnatp(land.lnd_own), own); - rel2 = getrel(getnatp(land.lnd_own), aown); - - if ((land.lnd_own != own) && ((rel != ALLIED) || (rel2 != AT_WAR))) + if (!feels_like_helping(land.lnd_own, own, aown)) continue; erange = lnd_fire_range(&land); @@ -697,17 +681,9 @@ quiet_bigdef(int type, struct emp_qelem *list, natid own, natid aown, if (!opt_NO_FORT_FIRE) { snxtsct_dist(&ns, ax, ay, 8); while (nxtsct(&ns, &firing)) { - if (firing.sct_own == 0) + if (!feels_like_helping(firing.sct_own, own, aown)) continue; - rel = getrel(getnatp(firing.sct_own), own); - rel2 = getrel(getnatp(firing.sct_own), aown); - if ((firing.sct_own != own) && - ((rel != ALLIED) || (rel2 != AT_WAR))) - continue; - /* Don't shoot yourself */ - if (firing.sct_own == aown) - continue; erange = fortrange(&firing); if (roundrange(erange) < ns.curdist) continue; diff --git a/src/lib/subs/fortdef.c b/src/lib/subs/fortdef.c index 50d227686..c67173a91 100644 --- a/src/lib/subs/fortdef.c +++ b/src/lib/subs/fortdef.c @@ -71,7 +71,7 @@ sd(natid att, natid own, coord x, coord y, int noisy, int defending, double eff; struct shpstr ship; struct nstr_item ni; - int dam, rel, rel2; + int dam; if (own == 0) return 0; @@ -80,15 +80,9 @@ sd(natid att, natid own, coord x, coord y, int noisy, int defending, eff = 1.0; snxtitem_dist(&ni, EF_SHIP, x, y, 8); while (nxtitem(&ni, &ship) && eff > 0.30) { - if (ship.shp_own == att) - continue; - if (ship.shp_own == 0) + if (!feels_like_helping(ship.shp_own, own, att)) continue; - rel = getrel(getnatp(ship.shp_own), own); - rel2 = getrel(getnatp(ship.shp_own), att); - if ((ship.shp_own != own) && ((rel != ALLIED) || (rel2 != AT_WAR))) - continue; if ((mchr[(int)ship.shp_type].m_flags & M_SUB) && !usesubs) continue; range = roundrange(shp_fire_range(&ship)); @@ -131,7 +125,7 @@ sd(natid att, natid own, coord x, coord y, int noisy, int defending, int dd(natid att, natid def_own, coord ax, coord ay, int noisy, int defending) { - int dam, rel, rel2; + int dam; struct sctstr firing; struct nstr_sect ns; @@ -144,13 +138,7 @@ dd(natid att, natid def_own, coord ax, coord ay, int noisy, int defending) dam = 0; snxtsct_dist(&ns, ax, ay, 8); while (nxtsct(&ns, &firing) && dam < 80) { - if (firing.sct_own == att) - continue; - if (firing.sct_own == 0) - continue; - rel = getrel(getnatp(firing.sct_own), def_own); - rel2 = getrel(getnatp(firing.sct_own), att); - if (firing.sct_own != def_own && (rel != ALLIED || rel2 != AT_WAR)) + if (!feels_like_helping(firing.sct_own, def_own, att)) continue; /* XXX defdef damage is additive, but ship or land unit damage isn't */ dam += sb(att, def_own, &firing, ax, ay, noisy, defending); @@ -158,6 +146,23 @@ dd(natid att, natid def_own, coord ax, coord ay, int noisy, int defending) return dam; } +/* + * Shall CN attempt to help FRIEND against FOE? + */ +int +feels_like_helping(natid cn, natid friend, natid foe) +{ + if (cn == 0) + return 0; /* never helps anybody */ + if (cn == foe) + return 0; /* don't help anybody against self */ + if (cn == friend) + return 1; /* help self against anybody else */ + /* third party helps ally if at war with foe: */ + return getrel(getnatp(cn), friend) == ALLIED + && getrel(getnatp(cn), foe) == AT_WAR; +} + /* Shoot back * * See if the sector being fired at will defend itself. -- 2.43.0