(getilist): Use pln_airbase_ok(). This fixes a number of bugs: planes

stuck in foreign bases, on inefficient ships or land units, or land
units loaded on ships or land units could still intercept.
(can_fly): Remove.
This commit is contained in:
Markus Armbruster 2007-11-23 18:38:10 +00:00
parent b46191aebb
commit bba101eda6

View file

@ -67,7 +67,6 @@ static void ac_fireflak(struct emp_qelem *, natid, int);
static void getilist(struct emp_qelem *, natid, static void getilist(struct emp_qelem *, natid,
struct emp_qelem *, struct emp_qelem *, struct emp_qelem *, struct emp_qelem *,
struct emp_qelem *, struct emp_qelem *); struct emp_qelem *, struct emp_qelem *);
static int can_fly(int);
static int do_evade(struct emp_qelem *, struct emp_qelem *); static int do_evade(struct emp_qelem *, struct emp_qelem *);
void void
@ -1032,7 +1031,6 @@ getilist(struct emp_qelem *list, natid own, struct emp_qelem *a,
{ {
struct plchrstr *pcp; struct plchrstr *pcp;
struct plnstr plane; struct plnstr plane;
struct sctstr sect;
struct nstr_item ni; struct nstr_item ni;
struct plist *ip; struct plist *ip;
@ -1050,15 +1048,8 @@ getilist(struct emp_qelem *list, natid own, struct emp_qelem *a,
continue; continue;
if (plane.pln_effic < 40) if (plane.pln_effic < 40)
continue; continue;
if (plane.pln_ship >= 0 || plane.pln_land >= 0) { if (!pln_airbase_ok(&plane, 0, 0))
if (!can_fly(plane.pln_uid))
continue; continue;
} else {
getsect(plane.pln_x, plane.pln_y, &sect);
if ((sect.sct_effic < 60 || sect.sct_type != SCT_AIRPT)
&& (pcp->pl_flags & P_V) == 0)
continue;
}
/* Finally, is it in the list of planes already in /* Finally, is it in the list of planes already in
flight? */ flight? */
if (ac_isflying(&plane, a)) if (ac_isflying(&plane, a))
@ -1079,61 +1070,6 @@ getilist(struct emp_qelem *list, natid own, struct emp_qelem *a,
} }
} }
static int
can_fly(int p)
{ /* Can this plane fly from the ship or land unit it is on? */
struct plnstr plane;
struct shpstr ship;
struct lndstr land;
struct plchrstr *pcp;
struct mchrstr *scp;
getplane(p, &plane);
pcp = &plchr[(int)plane.pln_type];
if (plane.pln_ship >= 0) {
if (!(pcp->pl_flags & P_L) && !(pcp->pl_flags & P_M)
&& !(pcp->pl_flags & P_K)
&& !(pcp->pl_flags & P_E)
)
return 0;
getship(plane.pln_ship, &ship);
scp = &mchr[(int)ship.shp_type];
if ((pcp->pl_flags & P_L) && (scp->m_flags & M_FLY)) {
return 1;
}
if ((pcp->pl_flags & P_M) && (scp->m_flags & M_MSL)) {
return 1;
}
if ((pcp->pl_flags & P_K) && (scp->m_flags & M_CHOPPER)) {
return 1;
}
if ((pcp->pl_flags & P_E) && (scp->m_flags & M_XLIGHT)) {
return 1;
}
}
if (plane.pln_land >= 0) {
if (!(pcp->pl_flags & P_E))
return 0;
getland(plane.pln_land, &land);
if ((pcp->pl_flags & P_E) && land.lnd_maxlight) {
return 1;
}
}
return 0;
}
static int static int
do_evade(struct emp_qelem *bomb_list, struct emp_qelem *esc_list) do_evade(struct emp_qelem *bomb_list, struct emp_qelem *esc_list)
{ {