]> git.pond.sub.org Git - empserver/blobdiff - src/lib/subs/aircombat.c
Update copyright notice
[empserver] / src / lib / subs / aircombat.c
index 93f5f3f6383491b8bbb098dd8640debad0318d3b..daf99ea12e12733dcda9ab67199e29a32392cde7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2011, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *  Copyright (C) 1986-2020, 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-2010
+ *     Markus Armbruster, 2006-2014
  */
 
 #include <config.h>
 
-#include "file.h"
+#include "chance.h"
 #include "land.h"
 #include "map.h"
 #include "misc.h"
@@ -45,6 +45,7 @@
 #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
@@ -77,7 +76,7 @@ ac_encounter(struct emp_qelem *bomb_list, struct emp_qelem *esc_list,
     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];
@@ -314,11 +313,7 @@ ac_intercept(struct emp_qelem *bomb_list, struct emp_qelem *esc_list,
     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;
 
@@ -449,7 +444,7 @@ ac_dog(struct plist *ap, struct plist *dp)
     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;
@@ -500,14 +495,16 @@ ac_dog(struct plist *ap, struct plist *dp)
     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);
@@ -515,27 +512,6 @@ ac_dog(struct plist *ap, struct plist *dp)
     }
 }
 
-/*
- * 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)
@@ -571,6 +547,21 @@ ac_damage_plane(struct plnstr *pp, natid from, int dam, int flak,
     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)
 {
@@ -672,7 +663,7 @@ ac_landflak(struct emp_qelem *list, coord x, coord y)
        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;
     }
@@ -695,7 +686,7 @@ static void
 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];
@@ -704,9 +695,10 @@ ac_fireflak(struct emp_qelem *list, natid from, int guns)
        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);
     }
 }
 
@@ -749,7 +741,7 @@ ac_flak_dam(int guns, int def, int pl_flags)
  * 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;
@@ -778,11 +770,16 @@ getilists(struct emp_qelem *list, unsigned char *rel, natid intruder)
            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]);