]> git.pond.sub.org Git - empserver/blobdiff - src/lib/subs/attsub.c
Update copyright notice
[empserver] / src / lib / subs / attsub.c
index 59f7258fcc7776e6a94247ec3f171f67164206a1..b9242f962fc4ac69f2ac37edc594e7210972d87f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2016, 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
@@ -188,7 +188,8 @@ att_get_combat(struct combat *com, int isdef)
        y = com->y;
        break;
     case EF_LAND:
-       if (!getland(com->lnd_uid, &land) || !land.lnd_own) {
+       if (!getland(com->lnd_uid, &land) || !land.lnd_own
+           || land.lnd_ship >= 0 || land.lnd_land >= 0) {
            if (isdef)
                pr("Land unit #%d is not in the same sector!\n",
                   com->lnd_uid);
@@ -1041,7 +1042,14 @@ ask_olist(int combat_mode, struct combat *off, struct combat *def,
            return;
        }
        att_val = attack_val(combat_mode, &land);
-       if (att_val < 1.0) {
+       /*
+        * We need to let spies assault even though they have no
+        * offensive strength, because assault is how they sneak
+        * ashore.  If this assault turns out to be a fight, they'll
+        * be removed by get_ototal().
+        */
+       if (att_val < 1.0
+           && !(combat_mode == A_ASSAULT && (lcp->l_flags & L_SPY))) {
            pr("%s has no offensive strength\n", prland(&land));
            continue;
        }
@@ -1189,6 +1197,8 @@ get_dlist(struct combat *def, struct emp_qelem *list, int a_spy,
            continue;
        if (def->type == EF_SECTOR && land.lnd_land >= 0)
            continue;
+       if (def->type == EF_SECTOR && (lchr[land.lnd_type].l_flags & L_SPY))
+           continue;
        if (def->type == EF_SHIP && land.lnd_ship != def->shp_uid)
            continue;
        if (def->type == EF_LAND && land.lnd_land != def->lnd_uid)
@@ -1216,6 +1226,7 @@ get_ototal(int combat_mode, struct combat *off, struct emp_qelem *olist,
     struct emp_qelem *qp, *next;
     struct ulist *llp;
     int n, w;
+    double att_val;
 
     /*
      * first, total the attacking mil
@@ -1238,6 +1249,18 @@ get_ototal(int combat_mode, struct combat *off, struct emp_qelem *olist,
        llp = (struct ulist *)qp;
        if (check && !get_oland(combat_mode, llp))
            continue;
+       att_val = attack_val(combat_mode, &llp->unit.land);
+       if (check && att_val < 1.0) {
+           /*
+            * No offensive strength, and fighting hasn't even begun.
+            * Since ask_olist() doesn't offer such land units, except
+            * for spies sometimes, it's either a spy, or the strength
+            * must have been destroyed since then.  Leave it behind.
+            */
+           lnd_print(player->cnum, llp, "has no offensive strength");
+           lnd_put_one(llp);
+           continue;
+       }
        if (combat_mode == A_ATTACK) {
            w = -1;
            for (n = 0; n <= off->last; ++n) {
@@ -1253,11 +1276,9 @@ get_ototal(int combat_mode, struct combat *off, struct emp_qelem *olist,
                lnd_put_one(llp);
                continue;
            }
-           ototal += attack_val(combat_mode, &llp->unit.land) *
-               att_combat_eff(off + w);
-       } else {
-           ototal += attack_val(combat_mode, &llp->unit.land);
+           att_val *= att_combat_eff(off + w);
        }
+       ototal += att_val;
     }
     ototal *= osupport;
 
@@ -1881,7 +1902,7 @@ att_fight(int combat_mode, struct combat *off, struct emp_qelem *olist,
 
     pr("- Casualties -\n     Yours: %d\n", a_cas);
     pr("    Theirs: %d\n", d_cas);
-    pr("Papershuffling ... %.1f B.T.U\n", (d_cas + a_cas) * 0.15);
+    pr("Paper-shuffling ... %.1f BTU\n", (d_cas + a_cas) * 0.15);
     player->btused += (int)((d_cas + a_cas) * 0.015 + 0.5);
 
     if (success) {
@@ -2299,15 +2320,12 @@ ask_move_in(struct combat *off, struct emp_qelem *olist,
     move_in_land(A_ATTACK, off, olist, def);
 }
 
-/* Move offensive land units to the conquered sector or ship */
-
-static void
-move_in_land(int combat_mode, struct combat *off, struct emp_qelem *olist,
-            struct combat *def)
+void
+att_move_land(int combat_mode, struct combat *off, struct emp_qelem *olist,
+             struct combat *def)
 {
     struct emp_qelem *qp, *next;
     struct ulist *llp;
-    char buf[512];
 
     for (qp = olist->q_forw; qp != olist; qp = next) {
        next = qp->q_forw;
@@ -2322,6 +2340,19 @@ move_in_land(int combat_mode, struct combat *off, struct emp_qelem *olist,
        else
            llp->unit.land.lnd_ship = -1;
     }
+}
+
+/* Move offensive land units to the conquered sector or ship */
+
+static void
+move_in_land(int combat_mode, struct combat *off, struct emp_qelem *olist,
+            struct combat *def)
+{
+    struct emp_qelem *qp, *next;
+    struct ulist *llp;
+    char buf[512];
+
+    att_move_land(combat_mode, off, olist, def);
 
     if (def->type == EF_SECTOR) {
        if (opt_INTERDICT_ATT) {