Missiles attacking ground targets (sectors, ships or land units) can
be intercepted, missiles targeting planes can't. Except msl_launch()
checked the missile's capabilities instead of its target, and thus
intercepted missiles that *could* target ground even when they
targeted planes.
This broke the missile interception code's assumption that
interceptors aren't intercepted, and crashed the server through
infinite recursion: tactical abm #1 intercepts, tactical abm #2
intercepts #1, #1 intercepts #2, ...
Same bug in msl_hit() printed "incoming missile" for missiles that
could target ground but do target planes.
Broken in Empire 2. Bug can't bite with the stock game's planes.
struct shpstr ship;
struct sctstr sect;
int sublaunch = 0;
struct shpstr ship;
struct sctstr sect;
int sublaunch = 0;
- struct plchrstr *pcp = plchr + pp->pln_type;
putplane(pp->pln_uid, pp);
mpr(pp->pln_own, "\tSHWOOOOOSH! Missile launched!\n");
putplane(pp->pln_uid, pp);
mpr(pp->pln_own, "\tSHWOOOOOSH! Missile launched!\n");
- if (pcp->pl_flags & P_T)
mpr(victim, "Incoming %s missile sighted at %s...\n",
sublaunch ? "sub-launched" : cname(pp->pln_own),
xyas(x, y, victim));
mpr(victim, "Incoming %s missile sighted at %s...\n",
sublaunch ? "sub-launched" : cname(pp->pln_own),
xyas(x, y, victim));
- if ((pcp->pl_flags & P_T && !(pcp->pl_flags & P_MAR))) {
+ if (type == EF_SECTOR || type == EF_LAND) {
if (msl_abm_intercept(pp, x, y, sublaunch))
return -1;
}
if (msl_abm_intercept(pp, x, y, sublaunch))
return -1;
}
- if (pcp->pl_flags & P_MAR) {
if (shp_missile_defense(x, y, pp->pln_own, pln_def(pp))) {
return -1;
}
if (shp_missile_defense(x, y, pp->pln_own, pln_def(pp))) {
return -1;
}
msl_hit(struct plnstr *pp, int hardtarget, int type,
int news_item, int snews_item, int sublaunch, natid victim)
{
msl_hit(struct plnstr *pp, int hardtarget, int type,
int news_item, int snews_item, int sublaunch, natid victim)
{
- struct plchrstr *pcp = plchr + pp->pln_type;
int hitchance, hit;
if (nuk_on_plane(pp) >= 0) {
int hitchance, hit;
if (nuk_on_plane(pp) >= 0) {
hit ? "HIT!" : "miss");
}
hit ? "HIT!" : "miss");
}
- if (pcp->pl_flags & P_T)
mpr(victim, "...Incoming %s missile %s\n",
sublaunch ? "" : cname(pp->pln_own),
hit ? "HIT!\n" : "missed\n");
mpr(victim, "...Incoming %s missile %s\n",
sublaunch ? "" : cname(pp->pln_own),
hit ? "HIT!\n" : "missed\n");