]> git.pond.sub.org Git - empserver/blobdiff - src/lib/commands/assa.c
Update copyright notice
[empserver] / src / lib / commands / assa.c
index 43b585c55fb6c520ddaa8224d5c495b1fa2478cc..31a36e65ad6f90a8e5d2389515c7d2ed525ff82c 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-2018, Dave Pare, Jeff Bailey, Thomas Ruschak,
  *                Ken Stevens, Steve McClure, Markus Armbruster
  *
  *  Empire is free software: you can redistribute it and/or modify
@@ -41,7 +41,8 @@
 #include "unit.h"
 
 static int only_spies(struct combat[], struct emp_qelem *);
-static void sneak_ashore(struct emp_qelem *, struct combat *);
+static void sneak_ashore(struct combat[], struct emp_qelem *,
+                        struct combat *);
 
 int
 assa(void)
@@ -118,6 +119,12 @@ assa(void)
        return RET_OK;
     }
 
+    /* If only spies assault, try to sneak them ashore */
+    if (only_spies(off, &olist)) {
+       sneak_ashore(off, &olist, def);
+       return RET_OK;
+    }
+
     ototal = att_get_offense(A_ASSAULT, off, &olist, def);
     if (att_abort(A_ASSAULT, off, def)) {
        pr("Assault aborted\n");
@@ -131,18 +138,6 @@ assa(void)
      * happening in the game.
      */
 
-    /* First, we check to see if the only thing we have are spies
-     * assaulting.  If so, we try to sneak them on land.  If they
-     * make it, the defenders don't see a thing.  If they fail, well,
-     * the spies die, and the defenders see them. */
-
-    /* If no attacking forces (i.e. we got here with only spies)
-     * then try to sneak on-land. */
-    if (only_spies(off, &olist)) {
-       sneak_ashore(&olist, def);
-       return RET_OK;
-    }
-
     /* Get the real defense */
 
     att_get_defense(&olist, def, &dlist, a_spy, ototal);
@@ -191,24 +186,26 @@ only_spies(struct combat off[], struct emp_qelem *olist)
 }
 
 static void
-sneak_ashore(struct emp_qelem *olist, struct combat *def)
+sneak_ashore(struct combat off[], struct emp_qelem *olist,
+            struct combat *def)
 {
     struct emp_qelem *qp;
     struct ulist *llp;
     struct lndstr *lp;
-    int rel;
+    enum relations rel;
 
     pr("Trying to sneak on shore...\n");
 
+    att_move_land(A_ASSAULT, off, olist, def);
+
     for (qp = olist->q_forw; qp != olist; qp = qp->q_forw) {
        llp = (struct ulist *)qp;
        lp = &llp->unit.land;
        rel = relations_with(def->own, player->cnum);
-       if (chance(0.10) || rel == ALLIED || !def->own) {
+       if (rel == ALLIED || !def->own
+           || !chance(LND_SPY_DETECT_CHANCE(lp->lnd_effic / 2))) {
+                               /* eff/2 because this is hard */
            pr("%s made it on shore safely.\n", prland(lp));
-           lp->lnd_x = def->x;
-           lp->lnd_y = def->y;
-           lp->lnd_ship = -1;
        } else {
            pr("%s was spotted", prland(lp));
            if (rel <= HOSTILE) {
@@ -221,10 +218,7 @@ sneak_ashore(struct emp_qelem *olist, struct combat *def)
                wu(0, def->own, "%s spy spotted in %s.\n",
                   cname(player->cnum), xyas(def->x, def->y,
                                             def->own));
-               pr(" but made it ok.\n");
-               lp->lnd_x = def->x;
-               lp->lnd_y = def->y;
-               lp->lnd_ship = -1;
+               pr(" but made it OK.\n");
            }
        }
     }