]> git.pond.sub.org Git - empserver/blobdiff - src/lib/subs/mslsub.c
ef_verify: Reject invalid plane flag combinations
[empserver] / src / lib / subs / mslsub.c
index 1d56288177fe93d8bece558f693cb37c9526d02f..a25f28f68e44e83e5a4af4e94b50c17a83f99f21 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-2021, Dave Pare, Jeff Bailey, Thomas Ruschak,
  *                Ken Stevens, Steve McClure, Markus Armbruster
  *
  *  Empire is free software: you can redistribute it and/or modify
  *  Known contributors to this file:
  *     Ken Stevens, 1995
  *     Steve McClure, 1996-2000
- *     Markus Armbruster, 2004-2009
+ *     Markus Armbruster, 2004-2021
  */
 
 #include <config.h>
 
 #include <stdlib.h>
-#include "file.h"
-#include "land.h"
+#include "chance.h"
 #include "misc.h"
-#include "mission.h"
 #include "nat.h"
 #include "news.h"
 #include "nsc.h"
 #include "nuke.h"
 #include "optlist.h"
-#include "path.h"
+#include "plague.h"
 #include "plane.h"
-#include "player.h"
 #include "prototypes.h"
 #include "queue.h"
 #include "sect.h"
@@ -59,10 +56,8 @@ msl_launch(struct plnstr *pp, int type, char *what, coord x, coord y,
 {
     struct shpstr ship;
     struct nukstr nuke;
-    struct sctstr sect;
     int sublaunch = 0;
     char *base, *in_or_at, *from;
-    int dam;
 
     mpr(pp->pln_own, "Preparing to launch %s at %s %s %s%s\n",
        prplane(pp),
@@ -104,8 +99,21 @@ msl_launch(struct plnstr *pp, int type, char *what, coord x, coord y,
            nuke.nuk_effic = 0;
            putnuke(nuke.nuk_uid, &nuke);
        }
+#if 0
+       /*
+        * Disabled for now, because it breaks callers that call
+        * msl_launch() for each member of a list of planes, created
+        * by msl_sel() or perform_mission().  Damage to the base can
+        * damage other planes.  Any copies of them in the list become
+        * stale.  When msl_launch() modifies and writes back such a
+        * stale copy, the damage gets wiped out, triggering a seqno
+        * oops.
+        */
        if (chance(0.33)) {
-           dam = pln_damage(pp, 'p', 0) / 2;
+           struct sctstr sect;
+           int dam;
+
+           dam = pln_damage(pp, 'p', NULL) / 2;
            if (pp->pln_ship >= 0) {
                shipdamage(&ship, dam);
                putship(ship.shp_uid, &ship);
@@ -117,6 +125,7 @@ msl_launch(struct plnstr *pp, int type, char *what, coord x, coord y,
                putsect(&sect);
            }
        }
+#endif
        return -1;
     }
 
@@ -153,8 +162,8 @@ msl_hit(struct plnstr *pp, int hardtarget, int type,
        hit = 1;
     } else {
        hitchance = pln_hitchance(pp, hardtarget, type);
-       hit = (roll(100) <= hitchance);
-       mpr(pp->pln_own, "\t%d%% hitchance...%s\n", hitchance,
+       hit = pct_chance(hitchance);
+       mpr(pp->pln_own, "\t%d%% hit chance...%s\n", hitchance,
            hit ? "HIT!" : "miss");
     }
 
@@ -207,11 +216,16 @@ msl_sel(struct emp_qelem *list, coord x, coord y, natid victim,
            continue;
        if (plane.pln_effic < 100)
            continue;
+       if (opt_MARKET) {
+           if (ontradingblock(EF_PLANE, &plane))
+               continue;
+       }
        if (!pln_airbase_ok(&plane, 1, 0))
            continue;
        /* got a valid interceptor */
        irv = malloc(sizeof(*irv));
        irv->load = 0;
+       irv->pstage = PLG_HEALTHY;
        irv->pcp = &plchr[(int)plane.pln_type];
        irv->plane = plane;
        emp_insque(&irv->queue, list);
@@ -243,7 +257,7 @@ msl_intercept(struct plnstr *msl, struct sctstr *sp, int sublaunch,
        pp = &ip->plane;
        if (pp->pln_own != sp->sct_own)
            continue;
-       if (mission_pln_equip(ip, NULL, 'i') < 0) {
+       if (mission_pln_equip(ip, NULL, 0) < 0) {
            emp_remque(qp);
            free(qp);
            continue;
@@ -261,7 +275,7 @@ msl_intercept(struct plnstr *msl, struct sctstr *sp, int sublaunch,
        next = qp->q_forw;
        ip = (struct plist *)qp;
        pp = &ip->plane;
-       if (mission_pln_equip(ip, NULL, 'i') < 0) {
+       if (mission_pln_equip(ip, NULL, 0) < 0) {
            emp_remque(qp);
            free(qp);
            continue;
@@ -351,7 +365,7 @@ msl_abm_intercept(struct plnstr *msl, coord x, coord y, int sublaunch)
     struct emp_qelem irvlist;
 
     getsect(x, y, &sect);
-    msl_sel(&irvlist, x, y, msl->pln_own, P_N, P_O, 0);
+    msl_sel(&irvlist, x, y, msl->pln_own, P_N, 0, 0);
     return msl_intercept(msl, &sect, sublaunch,
                         &irvlist, "warhead", "abm",
                         sublaunch ? N_NUKE_SSTOP : N_NUKE_STOP);