/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2009, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure
*
* This program is free software; you can redistribute it and/or modify
* ---
*
* mslsub.c: Missile subroutine stuff
- *
+ *
* Known contributors to this file:
* Ken Stevens, 1995
* Steve McClure, 1996-2000
#include <config.h>
-#include "misc.h"
-#include "queue.h"
-#include "player.h"
-#include "sect.h"
-#include "ship.h"
-#include "optlist.h"
-#include "plane.h"
+#include <stdlib.h>
+#include "file.h"
#include "land.h"
+#include "misc.h"
+#include "mission.h"
+#include "nat.h"
#include "news.h"
-#include "xy.h"
#include "nsc.h"
-#include "file.h"
-#include "nat.h"
+#include "nuke.h"
+#include "optlist.h"
#include "path.h"
-#include "mission.h"
+#include "plane.h"
+#include "player.h"
#include "prototypes.h"
+#include "queue.h"
+#include "sect.h"
+#include "ship.h"
+#include "xy.h"
int
-msl_equip(struct plnstr *pp)
+msl_equip(struct plnstr *pp, char mission)
{
struct plist pl;
memset(&pl, 0, sizeof(struct plist));
pl.pcp = plchr + pp->pln_type;
pl.plane = *pp;
- return mission_pln_equip(&pl, 0, 0, 'p');
+ return mission_pln_equip(&pl, 0, 0, mission);
}
int
pr("Explosion damages %s %d%%",
xyas(pp->pln_x, pp->pln_y, pp->pln_own), dam);
getsect(pp->pln_x, pp->pln_y, §);
- sectdamage(§, dam, 0);
+ sectdamage(§, dam);
putsect(§);
}
}
return 0;
}
+ CANT_HAPPEN(pp->pln_flags & PLN_LAUNCHED);
+ pp->pln_flags |= PLN_LAUNCHED;
+ putplane(pp->pln_uid, pp);
mpr(pp->pln_own, "\tSHWOOOOOSH! Missile launched!\n");
- if (pp->pln_nuketype != -1)
+ if (nuk_on_plane(pp) >= 0) {
mpr(pp->pln_own, "\tArming nuclear warheads...\n");
+ hitchance = 100;
+ }
if (pcp->pl_flags & P_T)
mpr(victim, "Incoming %s missile sighted at %s...\n",
}
}
- if (pp->pln_nuketype != -1)
- hitchance = 100;
-
mpr(pp->pln_own, "\t%d%% hitchance...", hitchance);
hit = (roll(100) <= hitchance);
continue;
if (mission && plane.pln_mission != mission)
continue;
+ if (mission &&
+ plane.pln_radius < mapdist(x, y, plane.pln_opx, plane.pln_opy))
+ continue;
if (getrel(getnatp(plane.pln_own), victim) >= NEUTRAL)
continue;
/* missiles go one way, so we can use all the range */
continue;
if (plane.pln_effic < 100)
continue;
+ if (!pln_airbase_ok(&plane, 1, 0))
+ continue;
/* got a valid interceptor */
irv = malloc(sizeof(*irv));
irv->bombs = 0;
att_name = "satellite";
def_name = "a-sat missile";
news_item = N_SAT_KILL;
- if (sect.sct_own) {
- mpr(sect.sct_own, "%s has positioned a satellite over %s\n",
- sublaunch ? "someone" : cname(bombown),
- xyas(x, y, sect.sct_own));
- }
+ mpr(sect.sct_own, "%s has positioned a satellite over %s\n",
+ sublaunch ? "someone" : cname(bombown),
+ xyas(x, y, sect.sct_own));
} else if (wantflags == P_N && nowantflags == P_O) {
att_name = "warhead";
def_name = "abm";
free(qp);
}
if (icount == 0) {
- if (sect.sct_own != 0)
- mpr(sect.sct_own, "No %ss launched to intercept.\n", def_name);
+ mpr(sect.sct_own, "No %ss launched to intercept.\n", def_name);
return destroyed;
}
mpr(sect.sct_own, "%s launched to intercept %s %s!\n",
def_name, who, att_name);
} else {
- if (sect.sct_own)
- mpr(sect.sct_own,
- "%s launched an %s to intercept the %s %s!\n",
- cname(pp->pln_own), def_name, who, att_name);
+ mpr(sect.sct_own,
+ "%s launched an %s to intercept the %s %s!\n",
+ cname(pp->pln_own), def_name, who, att_name);
mpr(pp->pln_own,
"%s launched to intercept %s %s arcing towards %s territory!\n",
def_name, who, att_name, cname(sect.sct_own));
if (!destroyed &&
msl_hit(pp, hardtarget, EF_PLANE, news_item, news_item,
att_name, x, y, bombown)) {
- mpr(bombown, "%s destroyed by %s %s!\n", att_name,
- cname(pp->pln_own), def_name);
- if (sect.sct_own)
- mpr(sect.sct_own, "%s %s intercepted!\n", who, att_name);
+ mpr(bombown, "%s destroyed by %s %s!\n",
+ att_name, cname(pp->pln_own), def_name);
+ mpr(sect.sct_own, "%s %s intercepted!\n", who, att_name);
if (sect.sct_own != pp->pln_own)
mpr(pp->pln_own, "%s %s intercepted!\n", who, att_name);
destroyed = 1;
}
/* zap the missile */
- makelost(EF_PLANE, pp->pln_own, pp->pln_uid, pp->pln_x, pp->pln_y);
- pp->pln_own = 0;
+ pp->pln_effic = 0;
putplane(pp->pln_uid, pp);
emp_remque(qp);
free(qp);
if (destroyed)
return destroyed;
if (icount) {
- mpr(bombown, "%s made it through %s defenses!\n", att_name,
- def_name);
- if (sect.sct_own)
- mpr(sect.sct_own, "%s made it through %s defenses!\n",
- att_name, def_name);
+ mpr(bombown, "%s made it through %s defenses!\n",
+ att_name, def_name);
+ mpr(sect.sct_own, "%s made it through %s defenses!\n",
+ att_name, def_name);
}
return destroyed;
}
dam += nukedam;
} else
dam += newdam;
+#if 0
+ /*
+ * FIXME want collateral damage on miss (which can't
+ * happen for nuclear war heads), but we get here too when
+ * launch fails or missile is intercepted
+ */
} else {
/* Missiles that miss have to hit somewhere! */
newdam = pln_damage(&plp->plane, x, y, 'p', &nukedam, 0);
- collateral_damage(x, y, newdam, 0);
+ collateral_damage(x, y, newdam);
+#endif
}
- makelost(EF_PLANE, plp->plane.pln_own, plp->plane.pln_uid,
- plp->plane.pln_x, plp->plane.pln_y);
- plp->plane.pln_own = 0;
+ plp->plane.pln_effic = 0;
putplane(plp->plane.pln_uid, &plp->plane);
emp_remque(qp);
free(qp);