/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2011, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2021, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure, Markus Armbruster
*
* Empire is free software: you can redistribute it and/or modify
* Dave Pare, 1986
* Thomas Ruschak, 1992
* Steve McClure, 1996
- * Markus Armbruster, 2006-2009
+ * Markus Armbruster, 2006-2020
*/
#include <config.h>
-#include "file.h"
+#include "chance.h"
#include "land.h"
#include "map.h"
#include "misc.h"
#include "nsc.h"
#include "optlist.h"
#include "path.h"
+#include "plague.h"
#include "plane.h"
#include "player.h"
#include "prototypes.h"
#define FLAK_GUN_MAX 14
-static void sam_intercept(struct emp_qelem *, struct emp_qelem *,
- natid, natid, coord, coord, int);
static void ac_intercept(struct emp_qelem *, struct emp_qelem *,
struct emp_qelem *, natid, coord, coord, int);
static void ac_combat_headers(natid, natid);
static void ac_airtoair(struct emp_qelem *, struct emp_qelem *);
static void ac_dog(struct plist *, struct plist *);
-static void ac_planedamage(struct plist *, natid, int, int, char *);
+static void ac_putplane(struct plist *, int);
static void ac_doflak(struct emp_qelem *, struct sctstr *);
static void ac_landflak(struct emp_qelem *, coord, coord);
static void ac_shipflak(struct emp_qelem *, coord, coord);
static void ac_fireflak(struct emp_qelem *, natid, int);
-static void getilists(struct emp_qelem *, unsigned char *, natid);
+static void getilists(struct emp_qelem *, enum relations[], natid);
static int do_evade(struct emp_qelem *, struct emp_qelem *);
void
int dir;
unsigned char gotships[MAXNOC];
unsigned char gotlands[MAXNOC];
- unsigned char rel[MAXNOC];
+ enum relations rel[MAXNOC];
int overfly[MAXNOC];
int flags;
struct emp_qelem ilist[MAXNOC];
sam_intercept(esc_list, def_list, def_own, plane_owner, x, y,
only_mission);
- att_count = 0;
- for (qp = bomb_list->q_forw; qp != bomb_list; qp = qp->q_forw)
- att_count++;
- for (qp = esc_list->q_forw; qp != esc_list; qp = qp->q_forw)
- att_count++;
+ att_count = emp_quelen(bomb_list) + emp_quelen(esc_list);
if (!att_count)
return;
double odds;
int intensity, i;
natid att_own, def_own;
- int adam, ddam;
+ int adam, ddam, adisp, ddisp;
char adam_mesg[14], ddam_mesg[14];
att_own = ap->plane.pln_own;
if (dp->pcp->pl_flags & P_M)
ddam = 100;
- ac_planedamage(ap, def_own, adam, 0, adam_mesg);
- ac_planedamage(dp, att_own, ddam, 0, ddam_mesg);
+ adisp = ac_damage_plane(&ap->plane, def_own, adam, 0, adam_mesg);
+ ddisp = ac_damage_plane(&dp->plane, att_own, ddam, 0, ddam_mesg);
ac_dog_report(att_own, intensity, odds,
ap, att, adam, adam_mesg,
dp, def, ddam, ddam_mesg);
ac_dog_report(def_own, intensity, odds,
dp, def, ddam, ddam_mesg,
ap, att, adam, adam_mesg);
+ ac_putplane(ap, adisp);
+ ac_putplane(dp, ddisp);
if (opt_HIDDEN) {
setcont(att_own, def_own, FOUND_FLY);
}
}
-/*
- * zap plane associated with plp.
- * Damaging country is "from", damage is "dam".
- *
- * NOTE: This routine removes the appropriate plane element from the
- * queue if it gets destroyed. That means that the caller must assume
- * that the current queue pointer is invalid on return from the ac_planedamage
- * call. (this has caused bugs in the past)
- */
-static void
-ac_planedamage(struct plist *plp, natid from, int dam, int flak,
- char *mesg)
-{
- int disp = ac_damage_plane(&plp->plane, from, dam, flak, mesg);
-
- if (disp) {
- pln_put1(plp);
- } else
- putplane(plp->plane.pln_uid, &plp->plane);
-}
-
int
ac_damage_plane(struct plnstr *pp, natid from, int dam, int flak,
char *mesg)
return disp;
}
+/*
+ * NOTE: This routine may remove the appropriate plane element from the
+ * queue if it gets destroyed. That means that the caller must assume
+ * that the current queue pointer is invalid on return from the
+ * call. (this has caused bugs in the past)
+ */
+static void
+ac_putplane(struct plist *plp, int disp)
+{
+ if (disp)
+ pln_put1(plp);
+ else
+ putplane(plp->plane.pln_uid, &plp->plane);
+}
+
static void
ac_doflak(struct emp_qelem *list, struct sctstr *from)
{
ngun += flak;
total += techfact(land.lnd_tech, flak * 2.0);
- mpr(land.lnd_own, "firing flak guns from unit %s (aa rating %d)\n",
+ mpr(land.lnd_own, "firing flak guns from unit %s (AA rating %d)\n",
prland(&land), aaf);
from = land.lnd_own;
}
ac_fireflak(struct emp_qelem *list, natid from, int guns)
{
struct plist *plp;
- int n;
+ int n, disp;
struct emp_qelem *qp;
struct emp_qelem *next;
char msg[14];
next = qp->q_forw;
plp = (struct plist *)qp;
n = ac_flak_dam(guns, pln_def(&plp->plane), plp->pcp->pl_flags);
- ac_planedamage(plp, from, n, 1, msg);
+ disp = ac_damage_plane(&plp->plane, from, n, 1, msg);
mpr(plp->plane.pln_own, " %s takes %d%s%s.\n",
prplane(&plp->plane), n, *msg ? " --" : "", msg);
+ ac_putplane(plp, disp);
}
}
0.35f, 0.40f, 0.45f, 0.50f, 0.50f, 0.55f, 0.60f, 0.65f,
/* +5 +6 +7 +8 >+8 */
0.70f,0.75f, 0.80f, 0.85f, 1.1305f };
- enum { FLAK_MAX = sizeof(flaktable)/sizeof(flaktable[0]) - 1 };
+ enum { FLAK_MAX = ARRAY_SIZE(flaktable) - 1 };
flak = guns - def;
if ((pl_flags & P_T) == 0)
* Get planes available for interception duties.
*/
static void
-getilists(struct emp_qelem *list, unsigned char *rel, natid intruder)
+getilists(struct emp_qelem *list, enum relations rel[], natid intruder)
{
natid cn;
struct plchrstr *pcp;
continue;
if (plane.pln_effic < 40)
continue;
+ if (opt_MARKET) {
+ if (ontradingblock(EF_PLANE, &plane))
+ continue;
+ }
if (!pln_airbase_ok(&plane, 0, 0))
continue;
/* got one! */
ip = malloc(sizeof(*ip));
ip->load = 0;
+ ip->pstage = PLG_HEALTHY;
ip->pcp = &plchr[(int)plane.pln_type];
ip->plane = plane;
emp_insque(&ip->queue, &list[plane.pln_own]);