diff --git a/src/lib/subs/lndsub.c b/src/lib/subs/lndsub.c index 22cd7243..f1271a06 100644 --- a/src/lib/subs/lndsub.c +++ b/src/lib/subs/lndsub.c @@ -721,6 +721,7 @@ lnd_missile_interdiction(struct emp_qelem *list, coord newx, coord newy, int mindam = lnd_count(list) * 20; int hardtarget = lnd_easiest_target(list); int dam, newdam, sublaunch; + int stopping = 0; struct plist *plp; struct emp_qelem msl_list, *qp, *newqp; @@ -735,6 +736,7 @@ lnd_missile_interdiction(struct emp_qelem *list, coord newx, coord newy, if (msl_launch(&plp->plane, EF_LAND, "troops", newx, newy, victim, &sublaunch) < 0) goto use_up_msl; + stopping = 1; if (msl_hit(&plp->plane, hardtarget, EF_LAND, N_LND_MISS, N_LND_SMISS, sublaunch, victim)) { newdam = pln_damage(&plp->plane, 'p', 1); @@ -754,8 +756,9 @@ lnd_missile_interdiction(struct emp_qelem *list, coord newx, coord newy, if (dam) { mpr(victim, "missile interdiction mission does %d damage!\n", dam); collateral_damage(newx, newy, dam); + lnd_damage(list, dam); } - return lnd_damage(list, dam); + return stopping; } #if 0 @@ -771,6 +774,7 @@ lnd_fort_interdiction(struct emp_qelem *list, double guneff; int shell, gun; int dam; + int stopping = 0; int totdam = 0; int i; @@ -790,6 +794,7 @@ lnd_fort_interdiction(struct emp_qelem *list, putsect(&fsect); if (dam < 0) continue; + stopping = 1; totdam += dam; mpr(victim, "Incoming fire does %d damage!\n", dam); wu(0, fsect.sct_own, @@ -800,8 +805,8 @@ lnd_fort_interdiction(struct emp_qelem *list, nreport(fsect.sct_own, N_SCT_SHELL, victim, 1); } if (totdam > 0) - return lnd_damage(list, totdam); - return 0; + lnd_damage(list, totdam); + return stopping; } #endif @@ -809,10 +814,14 @@ static int lnd_mission_interdiction(struct emp_qelem *list, coord x, coord y, natid victim) { - return lnd_damage(list, - unit_interdict(x, y, victim, "land units", - lnd_easiest_target(list), - MI_INTERDICT)); + int dam; + + dam = unit_interdict(x, y, victim, "land units", + lnd_easiest_target(list), + MI_INTERDICT); + if (dam >= 0) + lnd_damage(list, dam); + return dam >= 0; } int diff --git a/src/lib/subs/mission.c b/src/lib/subs/mission.c index e1f98df1..1721af93 100644 --- a/src/lib/subs/mission.c +++ b/src/lib/subs/mission.c @@ -80,8 +80,14 @@ static int perform_mission_msl(int, struct emp_qelem *, coord, coord, natid, int); static int perform_mission_bomb(int, struct emp_qelem *, coord, coord, natid, int, char *, int, int); -static int perform_mission(coord, coord, natid, struct emp_qelem *, int, - char *, int); +static int perform_mission(coord, coord, natid, struct emp_qelem *, + int, char *, int); + +static int +tally_dam(int dam, int newdam) +{ + return dam < 0 ? newdam : dam + newdam; +} /* * Interdict commodities & transported planes @@ -109,10 +115,11 @@ ground_interdict(coord x, coord y, natid victim, char *s) newdam = perform_mission(x, y, victim, &mi[cn].queue, MI_INTERDICT, s, SECT_HARDTARGET); - dam += newdam; - if (newdam) + if (newdam > 0) { + dam += newdam; mpr(victim, "%s interdiction mission does %d damage!\n", cname(cn), newdam); + } } if (dam) { collateral_damage(x, y, dam); @@ -170,10 +177,9 @@ int unit_interdict(coord x, coord y, natid victim, char *s, int hardtarget, int mission) { - int cn; - int dam = 0, newdam; + int cn, newdam, osubs; + int dam = -1; struct genlist mi[MAXNOC]; - int osubs; memset(mi, 0, sizeof(mi)); for (cn = 1; cn < MAXNOC; cn++) @@ -196,17 +202,13 @@ unit_interdict(coord x, coord y, natid victim, char *s, int hardtarget, osubs = only_subs(&mi[cn].queue); newdam = perform_mission(x, y, victim, &mi[cn].queue, mission, s, hardtarget); - dam += newdam; - if (newdam) { - /* If only subs responded, then we don't know who's - subs they are */ + dam = tally_dam(dam, newdam); + if (newdam > 0) mpr(victim, "%s interdiction mission does %d damage!\n", osubs ? "Enemy" : cname(cn), newdam); - } } - if (dam) { + if (dam > 0) collateral_damage(x, y, dam); - } return dam; } @@ -256,7 +258,7 @@ static int dosupport(struct genlist *mi, coord x, coord y, natid victim, natid actee) { int cn; - int rel; + int rel, newdam; int dam = 0; for (cn = 1; cn < MAXNOC; cn++) { @@ -270,8 +272,10 @@ dosupport(struct genlist *mi, coord x, coord y, natid victim, natid actee) if (QEMPTY(&mi[cn].queue)) continue; - dam += perform_mission(x, y, victim, &mi[cn].queue, MI_SUPPORT, - "", SECT_HARDTARGET); + newdam = perform_mission(x, y, victim, &mi[cn].queue, MI_SUPPORT, + "", SECT_HARDTARGET); + if (newdam > 0) + dam += newdam; } return dam; } @@ -383,7 +387,7 @@ perform_mission(coord x, coord y, natid victim, struct emp_qelem *list, struct genlist *glp; struct plist *plp; struct plchrstr *pcp; - int dam = 0; + int dam = -1; int targeting_ships = *s == 's'; /* "subs" or "ships" FIXME gross! */ emp_initque(&missiles); @@ -429,7 +433,6 @@ perform_mission(coord x, coord y, natid victim, struct emp_qelem *list, dam = perform_mission_msl(dam, &missiles, x, y, victim, hardtarget); dam = perform_mission_bomb(dam, &bombers, x, y, victim, mission, s, hardtarget, targeting_ships); - return dam; } @@ -472,7 +475,7 @@ perform_mission_land(int dam, struct lndstr *lp, coord x, coord y, mpr(victim, "%s %s fires at you at %s\n", cname(lp->lnd_own), prland(lp), xyas(x, y, victim)); - return dam + dam2; + return tally_dam(dam, dam2); } static int @@ -531,7 +534,7 @@ perform_mission_ship(int dam, struct shpstr *sp, coord x, coord y, mpr(victim, "Incoming torpedo sighted @ %s missed (whew)!\n", xyas(x, y, victim)); - return dam; + return tally_dam(dam, 0); } wu(0, sp->shp_own, "\tBOOM!...\n"); nreport(victim, N_TORP_SHIP, 0, 1); @@ -565,24 +568,23 @@ perform_mission_ship(int dam, struct shpstr *sp, coord x, coord y, cname(sp->shp_own), prship(sp), xyas(x, y, victim)); } - return dam + dam2; + return tally_dam(dam, dam2); } static int perform_mission_msl(int dam, struct emp_qelem *missiles, coord x, coord y, natid victim, int hardtarget) { - int air_dam; + int performed, air_dam, sublaunch, dam2; struct emp_qelem *qp, *newqp; struct plist *plp; - int sublaunch, dam2; /* * Missiles, except for interdiction of ships or land units, * because that happens elsewhere, in shp_missile_interdiction() * and lnd_missile_interdiction(). */ - air_dam = 0; + performed = air_dam = 0; for (qp = missiles->q_back; qp != missiles; qp = newqp) { newqp = qp->q_back; plp = (struct plist *)qp; @@ -594,6 +596,7 @@ perform_mission_msl(int dam, struct emp_qelem *missiles, coord x, coord y, if (msl_launch(&plp->plane, EF_SECTOR, "sector", x, y, victim, &sublaunch) < 0) goto use_up_msl; + performed = 1; if (!msl_hit(&plp->plane, SECT_HARDTARGET, EF_SECTOR, N_SCT_MISS, N_SCT_SMISS, sublaunch, victim)) CANT_REACH(); @@ -606,7 +609,8 @@ perform_mission_msl(int dam, struct emp_qelem *missiles, coord x, coord y, emp_remque(qp); free(qp); } - return dam + air_dam; + + return performed ? tally_dam(dam, air_dam) : dam; } static int @@ -616,7 +620,7 @@ perform_mission_bomb(int dam, struct emp_qelem *bombers, coord x, coord y, { struct emp_qelem *qp, *newqp, escorts, airp, b, e; struct plist *plp; - int plane_owner, air_dam, md; + int plane_owner, performed, air_dam, md; emp_initque(&escorts); emp_initque(&airp); @@ -648,7 +652,7 @@ perform_mission_bomb(int dam, struct emp_qelem *bombers, coord x, coord y, add_airport(&airp, plp->plane.pln_x, plp->plane.pln_y); } - air_dam = 0; + performed = air_dam = 0; for (qp = airp.q_forw; qp != (&airp); qp = qp->q_forw) { struct airport *air; char buf[512]; @@ -676,6 +680,7 @@ perform_mission_bomb(int dam, struct emp_qelem *bombers, coord x, coord y, pp = BestAirPath(buf, air->x, air->y, x, y); if (CANT_HAPPEN(!pp)) continue; + performed = 1; wu(0, plane_owner, "Flying %s mission from %s to %s\n", mission_name(mission), xyas(air->x, air->y, plane_owner), @@ -720,7 +725,7 @@ perform_mission_bomb(int dam, struct emp_qelem *bombers, coord x, coord y, qp = newqp; } - return dam + air_dam; + return performed ? tally_dam(dam, air_dam) : dam; } int diff --git a/src/lib/subs/shpsub.c b/src/lib/subs/shpsub.c index eef91a9e..844b2f32 100644 --- a/src/lib/subs/shpsub.c +++ b/src/lib/subs/shpsub.c @@ -500,6 +500,7 @@ shp_missile_interdiction(struct emp_qelem *list, coord newx, coord newy, if (msl_launch(&plp->plane, EF_SHIP, prship(&mvs->unit.ship), newx, newy, victim, &sublaunch) < 0) goto use_up_msl; + stopping = 1; if (msl_hit(&plp->plane, shp_hardtarget(&mvs->unit.ship), EF_SHIP, N_SHP_MISS, N_SHP_SMISS, sublaunch, victim)) { @@ -509,7 +510,6 @@ shp_missile_interdiction(struct emp_qelem *list, coord newx, coord newy, "missile interdiction mission does %d damage to %s!\n", dam, prship(&mvs->unit.ship)); shp_damage_one(mvs, dam); - stopping = 1; } } else { dam = pln_damage(&plp->plane, 'p', 0); @@ -578,6 +578,7 @@ shp_fort_interdiction(struct emp_qelem *list, coord newx, coord newy, struct sctstr fsect; int trange, range; int dam; + int stopping = 0; int totdam = 0; signed char notified[MAXNOC]; int i; @@ -621,6 +622,7 @@ shp_fort_interdiction(struct emp_qelem *list, coord newx, coord newy, putsect(&fsect); if (dam < 0) continue; + stopping = 1; totdam += dam; mpr(victim, "Incoming fire does %d damage!\n", dam); #if 0 @@ -636,8 +638,8 @@ shp_fort_interdiction(struct emp_qelem *list, coord newx, coord newy, nreport(fsect.sct_own, N_SHP_SHELL, victim, 1); } if (totdam > 0) - return shp_damage(list, totdam, 0, M_SUB, newx, newy); - return 0; + shp_damage(list, totdam, 0, M_SUB, newx, newy); + return stopping; } static int @@ -647,13 +649,14 @@ shp_mission_interdiction(struct emp_qelem *list, coord x, coord y, char *what = subs ? "subs" : "ships"; int wantflags = subs ? M_SUB : 0; int nowantflags = subs ? 0 : M_SUB; + int dam; - return shp_damage(list, - unit_interdict(x, y, victim, what, - shp_easiest_target(list, - wantflags, nowantflags), - MI_INTERDICT), - wantflags, nowantflags, x, y); + dam = unit_interdict(x, y, victim, what, + shp_easiest_target(list, wantflags, nowantflags), + MI_INTERDICT); + if (dam >= 0) + shp_damage(list, dam, wantflags, nowantflags, x, y); + return dam >= 0; } static int