]> git.pond.sub.org Git - empserver/blobdiff - src/lib/subs/shpsub.c
retreat: Rewrite automatic retreat code to fix its many bugs
[empserver] / src / lib / subs / shpsub.c
index ea13e57d34e7d21f646ffde265450596c2ef3639..52c5afb6592493bdd041f18efc702587cd0545ac 100644 (file)
@@ -56,7 +56,6 @@
 static void shp_nav_put_one(struct ulist *);
 static int shp_check_one_mines(struct ulist *);
 static int shp_hit_mine(struct shpstr *);
-static void shp_stays(natid, char *, struct ulist *);
 
 static struct ulist *
 shp_find_capable(struct emp_qelem *list, int flags)
@@ -198,7 +197,7 @@ shp_nav_stay_behind(struct emp_qelem *list, natid actor)
     }
 }
 
-static void
+void
 shp_nav_put(struct emp_qelem *list, natid actor)
 {
     struct emp_qelem *qp, *next;
@@ -298,11 +297,7 @@ shp_sweep(struct emp_qelem *ship_list, int explicit, int takemob,
        mlp->unit.ship.shp_item[I_SHELL] = shells;
        putship(mlp->unit.ship.shp_uid, &mlp->unit.ship);
        putsect(&sect);
-       if (shp_check_one_mines(mlp)) {
-           stopping = 1;
-           emp_remque(qp);
-           free(qp);
-       }
+       stopping |= shp_check_one_mines(mlp);
     }
     if (changed)
        writemap(actor);
@@ -328,8 +323,11 @@ shp_check_one_mines(struct ulist *mlp)
            writemap(actor);
        putsect(&sect);
        putship(mlp->unit.ship.shp_uid, &mlp->unit.ship);
-       if (!mlp->unit.ship.shp_own)
-           return 1;
+       if (!mlp->unit.ship.shp_own) {
+           emp_remque(&mlp->queue);
+           free(mlp);
+       }
+       return 1;
     }
     return 0;
 }
@@ -339,31 +337,15 @@ shp_check_mines(struct emp_qelem *ship_list)
 {
     struct emp_qelem *qp;
     struct emp_qelem *next;
-    struct ulist *mlp;
     int stopping = 0;
 
     for (qp = ship_list->q_back; qp != ship_list; qp = next) {
        next = qp->q_back;
-       mlp = (struct ulist *)qp;
-       if (shp_check_one_mines(mlp)) {
-           stopping = 1;
-           emp_remque(qp);
-           free(qp);
-       }
+       stopping |= shp_check_one_mines((struct ulist *)qp);
     }
     return stopping;
 }
 
-
-static void
-shp_stays(natid actor, char *str, struct ulist *mlp)
-{
-    mpr(actor, "%s %s & stays in %s\n",
-       prship(&mlp->unit.ship), str,
-       xyas(mlp->unit.ship.shp_x, mlp->unit.ship.shp_y, actor));
-    shp_nav_put_one(mlp);
-}
-
 /*
  * Return whether and why SP would be stuck in SECTP.
  */
@@ -795,7 +777,7 @@ shp_hit_mine(struct shpstr *sp)
 }
 
 int
-shp_nav_one_sector(struct emp_qelem *list, int dir, natid actor)
+shp_nav_dir(struct emp_qelem *list, int dir, natid actor)
 {
     struct sctstr sect;
     struct emp_qelem *qp;
@@ -807,9 +789,7 @@ shp_nav_one_sector(struct emp_qelem *list, int dir, natid actor)
     coord newy;
     int move;
     enum shp_stuck stuck;
-    int stopping = 0;
     double mobcost;
-    char dp[80];
 
     if (CANT_HAPPEN(QEMPTY(list)))
        return 1;
@@ -862,19 +842,26 @@ shp_nav_one_sector(struct emp_qelem *list, int dir, natid actor)
        mlp = (struct ulist *)qp;
        stuck = shp_check_nav(&mlp->unit.ship, &sect);
        if (stuck == SHP_STUCK_CANAL) {
-           sprintf(dp,
-                   "is too large to fit into the canal system at %s",
-                   xyas(newx, newy, actor));
-           shp_stays(actor, dp, mlp);
+           mpr(actor,
+               "%s is too large to fit into the canal system at %s"
+               " & stays in %s\n",
+               prship(&mlp->unit.ship), xyas(newx, newy, actor),
+               xyas(mlp->unit.ship.shp_x, mlp->unit.ship.shp_y, actor));
+           shp_nav_put_one(mlp);
            continue;
        } else if (CANT_HAPPEN(stuck != SHP_STUCK_NOT)) {
-           sprintf(dp, "can't go to %s", xyas(newx, newy, actor));
-           shp_stays(actor, dp, mlp);
+           mpr(actor, "%s can't go to %s & stays in %s\n",
+               prship(&mlp->unit.ship), xyas(newx, newy, actor),
+               xyas(mlp->unit.ship.shp_x, mlp->unit.ship.shp_y, actor));
+           shp_nav_put_one(mlp);
            continue;
        }
 
        if (mlp->mobil <= 0.0) {
-           shp_stays(actor, "is out of mobility", mlp);
+           mpr(actor, "%s is out of mobility & stays in %s\n",
+               prship(&mlp->unit.ship),
+               xyas(mlp->unit.ship.shp_x, mlp->unit.ship.shp_y, actor));
+           shp_nav_put_one(mlp);
            continue;
        }
        mobcost = shp_mobcost(&mlp->unit.ship);
@@ -888,15 +875,26 @@ shp_nav_one_sector(struct emp_qelem *list, int dir, natid actor)
        mlp->unit.ship.shp_mobil = (int)mlp->mobil;
        putship(mlp->unit.ship.shp_uid, &mlp->unit.ship);
     }
-    if (QEMPTY(list))
-       return stopping;
-    stopping |= shp_sweep(list, 0, 0, actor);
+
+    return 0;
+}
+
+int
+shp_nav_gauntlet(struct emp_qelem *list, int interdict, natid actor)
+{
+    struct ulist *mlp = (struct ulist *)list->q_back;
+    coord newx = mlp->unit.ship.shp_x;
+    coord newy = mlp->unit.ship.shp_y;
+    int stopping;
+
+    stopping = shp_sweep(list, 0, 0, actor);
     if (QEMPTY(list))
        return stopping;
     stopping |= shp_check_mines(list);
     if (QEMPTY(list))
        return stopping;
-    stopping |= shp_interdict(list, newx, newy, actor);
+    if (interdict)
+       stopping |= shp_interdict(list, newx, newy, actor);
 
     return stopping;
 }