]> git.pond.sub.org Git - empserver/commitdiff
retreat: Rewrite automatic retreat code to fix its many bugs
authorMarkus Armbruster <armbru@pond.sub.org>
Wed, 7 Jan 2015 18:38:53 +0000 (19:38 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Mon, 2 Mar 2015 07:20:48 +0000 (08:20 +0100)
Much of the retreat code duplicates navigate and march code.  Worse,
retreat's version is full of bugs:

* Land units can sometimes retreat when they couldn't march: while on
  the trading block (forbidden with march since 4.0.9), crewless
  (likewise since 4.0.0), kidnapped in a foreign sector (inconsistent
  since land units were added in Chainsaw 3), loaded on a ship
  (likewise) or a land unit (inconsistent since trains were added in
  4.0.0).

* Ships can retreat while on the trading block (forbidden with
  navigate since 4.0.9)

* Land units can't retreat into foreign sectors even though they could
  march there, namely when sector is allied or the land unit is a spy.
  They can march there since 4.0.0.

* Land units keep their fortification on retreat.  Has been that way
  since retreat was added in Chainsaw.

Then there's group retreat.  It's basically crazy:

* It triggers retreat for everyone in the same fleet or army, one
  after the other, regardless of retreat path, conditions (including
  group retreat), or even location.  The latter is quite abusable
  since retreats aren't interdicted.  Has been that way since retreat
  was added in Chainsaw.

* Group retreat fails to trigger when the originally retreating ship
  or land unit has no retreat path left when it's done.  Broken in
  commit b860123.

Finally, the reporting to the owner is sub-par:

* When a retreat is cut short by insufficient mobility or
  obstructions, its end sector isn't reported, leaving the player
  guessing.

* Non-retreats can be confusingly reported as retreat to the same
  sector.  Can happen when the retreat path starts with 'h' (obscure
  feature to suppress a single retreat), or when a group retreat
  includes a ship or land unit without retreat orders.

* Interaction with mines during retreat is reported before the retreat
  itself, which can be quite confusing.

* Sweeping landmines isn't reported at all.

* Much code and much bulletin text is dedicated to reporting what
  caused the retreat, even though it should be perfectly obvious.

Rewrite this on top of common navigate and march code.  Reuse of
common code fixes the "can retreat when it couldn't navigate/march"
and the "can't retreat into sectors it could navigate or march into"
bugs, and improves the reporting.

One special case isn't a bug fix but a rule change: mountains.  The
old code forbids that explicitly, and it's clearly intentional, if
undocumented.  The new code allows it by not doing anything special.

Turn group retreat into an actual group retreat: everyone in the same
fleet and sector with the the same retreat path and group retreat
condition joins the group.  The group retreats together, just like in
navigate and march.

Take care to always report the end sector.  When retreat is
impossible, report "can't retreat".  When retreat is partial, report
"and stays in X,Y".  When it's complete, report "stopped at X,Y".

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
include/land.h
include/ship.h
src/lib/subs/lndsub.c
src/lib/subs/retreat.c
src/lib/subs/shpsub.c
src/lib/subs/unitsub.c
tests/retreat/01-retreat-1
tests/retreat/final.xdump
tests/retreat/journal.log

index 74d59514ca2bd1ecb30656e04da3448ebb112e8f..7c1aa3b9b2d6b7ed9bc1d92524cd213015b5e252 100644 (file)
@@ -194,11 +194,13 @@ extern void lnd_takemob(struct emp_qelem *, double);
 extern int lnd_spyval(struct lndstr *);
 extern void intelligence_report(int, struct lndstr *, int, char *);
 extern void lnd_mar_stay_behind(struct emp_qelem *, natid);
+extern void lnd_mar_put(struct emp_qelem *, natid);
 extern void lnd_put(struct emp_qelem *);
 extern void lnd_put_one(struct ulist *);
 extern int lnd_hardtarget(struct lndstr *);
 extern int lnd_abandon_askyn(struct emp_qelem *);
-extern int lnd_mar_one_sector(struct emp_qelem *, int, natid);
+extern int lnd_mar_dir(struct emp_qelem *, int, natid);
+extern int lnd_mar_gauntlet(struct emp_qelem *, int, natid);
 extern int lnd_support(natid, natid, coord, coord, int);
 extern int lnd_can_attack(struct lndstr *);
 extern int lnd_fortify(struct lndstr *lp, int hard_amt);
index ed005af1f210748646f33ec376a5c35348f6202d..8557487909eca8ada4a0405df0e3fe3191580cc9 100644 (file)
@@ -173,11 +173,13 @@ extern int shp_may_nav(struct shpstr *, struct shpstr *, char *);
 extern void shp_sel(struct nstr_item *, struct emp_qelem *);
 extern struct ulist *shp_insque(struct shpstr *, struct emp_qelem *);
 extern void shp_nav_stay_behind(struct emp_qelem *, natid);
+extern void shp_nav_put(struct emp_qelem *, natid);
 extern int shp_sweep(struct emp_qelem *, int, int, natid);
 extern enum shp_stuck shp_check_nav(struct shpstr *, struct sctstr *);
 extern int sect_has_dock(struct sctstr *);
 extern int shp_hardtarget(struct shpstr *);
-extern int shp_nav_one_sector(struct emp_qelem *, int, natid);
+extern int shp_nav_dir(struct emp_qelem *, int, natid);
+extern int shp_nav_gauntlet(struct emp_qelem *, int, natid);
 extern int shp_missile_defense(coord, coord, natid, int);
 extern void shp_missdef(struct shpstr *, natid);
 extern double shp_mobcost(struct shpstr *);
index b182c9e7f126eb8df8cb8a75920986d6620e53e1..2dd7f388252e58b0917d4d5006f7f6b91b19b7bc 100644 (file)
@@ -573,7 +573,7 @@ lnd_mar_put_one(struct ulist *llp)
     lnd_put_one(llp);
 }
 
-static void
+void
 lnd_mar_put(struct emp_qelem *list, natid actor)
 {
     struct emp_qelem *qp, *next;
@@ -1004,7 +1004,7 @@ int lnd_abandon_askyn(struct emp_qelem *list)
 }
 
 int
-lnd_mar_one_sector(struct emp_qelem *list, int dir, natid actor)
+lnd_mar_dir(struct emp_qelem *list, int dir, natid actor)
 {
     struct sctstr sect, osect;
     struct emp_qelem *qp;
@@ -1015,8 +1015,6 @@ lnd_mar_one_sector(struct emp_qelem *list, int dir, natid actor)
     coord newx;
     coord newy;
     int move;
-    int stopping = 0;
-    int visible;
     int rel;
     int oldown;
 
@@ -1122,9 +1120,21 @@ lnd_mar_one_sector(struct emp_qelem *list, int dir, natid actor)
            }
        }
     }
-    if (QEMPTY(list))
-       return stopping;
-    stopping |= lnd_sweep(list, 0, 1, actor);
+
+    return 0;
+}
+
+int
+lnd_mar_gauntlet(struct emp_qelem *list, int interdict, natid actor)
+{
+    struct ulist *mlp = (struct ulist *)list->q_back;
+    coord newx = mlp->unit.land.lnd_x;
+    coord newy = mlp->unit.land.lnd_y;
+    int stopping, visible;
+    struct emp_qelem *qp, *next;
+    struct ulist *llp;
+
+    stopping = lnd_sweep(list, 0, 1, actor);
     if (QEMPTY(list))
        return stopping;
     stopping |= lnd_check_mines(list);
@@ -1138,7 +1148,7 @@ lnd_mar_one_sector(struct emp_qelem *list, int dir, natid actor)
        if (!(lchr[(int)llp->unit.land.lnd_type].l_flags & L_SPY))
            visible = 1;
     }
-    if (visible)
+    if (visible && interdict)
        stopping |= lnd_interdict(list, newx, newy, actor);
 
     return stopping;
index 5ecd294c99251a3fc893fef30361d899858d3fed..961552f042bf0663c57da3d733dd070a5276e211 100644 (file)
  *  Known contributors to this file:
  *     Steve McClure, 2000
  *     Ron Koenderink, 2005-2006
- *     Markus Armbruster, 2006-2014
+ *     Markus Armbruster, 2006-2015
  */
 
 #include <config.h>
 
-#include "chance.h"
-#include "damage.h"
 #include "file.h"
-#include "land.h"
-#include "map.h"
-#include "misc.h"
-#include "nat.h"
-#include "news.h"
 #include "nsc.h"
-#include "optlist.h"
 #include "path.h"
 #include "player.h"
 #include "prototypes.h"
 #include "retreat.h"
-#include "sect.h"
-#include "ship.h"
-#include "xy.h"
-
-static int findcondition(char);
-static int retreat_land1(struct lndstr *, char, int);
-static int retreat_ship1(struct shpstr *, char, int);
-
-struct ccode {
-    char code;
-    char *desc[2];
-};
-
-static struct ccode conditions[] = {
-    { 'i', { "retreated with a damaged friend",
-            "was damaged" } },
-    { 't', { "retreated with a torpedoed ship",
-            "was hit by a torpedo" } },
-    { 's', { "retreated with a ship scared by sonar",
-            "detected a sonar ping" } },
-    { 'h', { "retreated with a helpless ship",
-            "was fired upon with no one able to defend it" } },
-    { 'b', { "retreated with a bombed friend",
-            "was bombed" } },
-    { 'd', { "retreated with a depth-charged ship",
-            "was depth-charged" } },
-    { 'u', { "retreated with a boarded ship", "was boarded" } },
-    { 0,   { "panicked", "panicked"} }
-};
+#include "unit.h"
+
+static void retreat_ship_sel(struct shpstr *, struct emp_qelem *, int);
+static int retreat_ships_step(struct emp_qelem *, char, natid);
+static void retreat_land_sel(struct lndstr *, struct emp_qelem *, int);
+static int retreat_lands_step(struct emp_qelem *, char, natid);
+
+static int
+retreat_steps(char *rpath)
+{
+    int i;
+
+    for (i = 0; i < MAX_RETREAT && rpath[i]; i++) {
+       if (rpath[i] == 'h')
+           return i + 1;
+    }
+    return i;
+}
+
+static void
+consume_step(char *rpath, int *rflags)
+{
+    memmove(rpath, rpath + 1, RET_LEN - 1);
+    if (!rpath[0])
+       *rflags = 0;
+}
 
 void
 retreat_ship(struct shpstr *sp, char code)
 {
+    int n, i;
+    natid own;
+    struct emp_qelem list;
     struct nstr_item ni;
     struct shpstr ship;
 
     if (CANT_HAPPEN(!sp->shp_own))
        return;
-    if (sp->shp_own == player->cnum)
+    if (sp->shp_own == player->cnum || !sp->shp_rpath[0])
        return;
 
-    retreat_ship1(sp, code, 1);
+    n = retreat_steps(sp->shp_rpath);
+    if (!n)
+       return;
+
+    /*
+     * We're going to put a copy of *sp into list.  The movement loop
+     * will use that copy, which may render *sp stale.  To avoid
+     * leaving the caller with a stale *sp, we'll re-get it at the
+     * end.  To make that work, we need to put it now.  However, that
+     * resets sp->shp_own when the ship sinks, so save it first.
+     */
+    own = sp->shp_own;
+    putship(sp->shp_uid, sp);
+
+    emp_initque(&list);
+    if (sp->shp_own)
+       retreat_ship_sel(sp, &list, n);
 
     if (sp->shp_rflags & RET_GROUP) {
-       snxtitem_group(&ni, EF_SHIP, sp->shp_fleet);
+       snxtitem_xy(&ni, EF_SHIP, sp->shp_x, sp->shp_y);
        while (nxtitem(&ni, &ship)) {
-           if (ship.shp_own != sp->shp_own || ship.shp_uid == sp->shp_uid)
+           if (ship.shp_own != own
+               || !(ship.shp_rflags & RET_GROUP)
+               || ship.shp_fleet != sp->shp_fleet
+               || ship.shp_uid == sp->shp_uid)
+               continue;
+           if (strncmp(ship.shp_rpath, sp->shp_rpath, MAX_RETREAT + 1))
                continue;
-           if (retreat_ship1(&ship, code, 0))
-               putship(ship.shp_uid, &ship);
+           retreat_ship_sel(&ship, &list, n);
        }
     }
-}
-
-static int
-retreat_ship1(struct shpstr *sp, char code, int orig)
-
-
-                       /* Is this the originally scared ship, or a follower */
-{
-    struct sctstr sect;
-    int i;
-    int m;
-    int max;
-    int dir;
-    coord newx;
-    coord newy;
-    coord dx;
-    coord dy;
-    int mines;
-    int shells;
-    double mobcost;
-    struct mchrstr *mcp;
-    int changed;
-
-    if (sp->shp_effic < SHIP_MINEFF) {
-       if (!orig)
-           putship(sp->shp_uid, sp);
-       return 0;
-    }
 
-    /* check crew - uws don't count */
-    if (sp->shp_item[I_MILIT] == 0 && sp->shp_item[I_CIVIL] == 0) {
-       wu(0, sp->shp_own,
-          "%s %s,\nbut had no crew, and couldn't retreat!\n", prship(sp),
-          conditions[findcondition(code)].desc[orig]);
-       return 0;
+    /* Loop similar to the one in unit_move().  Keep it that way!  */
+    for (i = 0; i < n && !QEMPTY(&list); i++) {
+       /*
+        * Invariant: shp_may_nav() true for all ships
+        * Implies all are in the same sector
+        */
+       if (!retreat_ships_step(&list, sp->shp_rpath[i], own))
+           n = i;
+       shp_nav_stay_behind(&list, own);
+       unit_rad_map_set(&list);
     }
 
-    getsect(sp->shp_x, sp->shp_y, &sect);
-    switch (shp_check_nav(sp, &sect)) {
-    case SHP_STUCK_NOT:
-       break;
-    case SHP_STUCK_CONSTRUCTION:
-       wu(0, sp->shp_own,
-          "%s %s,\nbut was caught in a construction zone, and couldn't retreat!\n",
-          prship(sp), conditions[findcondition(code)].desc[orig]);
-       return 0;
-    default:
-       CANT_REACH();
-       /* fall through */
-    case SHP_STUCK_CANAL:
-    case SHP_STUCK_IMPASSABLE:
-       wu(0, sp->shp_own,
-          "%s %s,\nbut was landlocked, and couldn't retreat!\n",
-          prship(sp), conditions[findcondition(code)].desc[orig]);
-       return 0;
-    }
-
-    if (sp->shp_mobil <= 0.0) {
-       wu(0, sp->shp_own,
-          "%s %s,\nbut had no mobility, and couldn't retreat!\n",
-          prship(sp), conditions[findcondition(code)].desc[orig]);
-       return 0;
-    }
+    if (!QEMPTY(&list))
+       shp_nav_put(&list, own);
+    getship(sp->shp_uid, sp);
+}
 
-    for (i = 0; i < MAX_RETREAT && sp->shp_rpath[0]; i++) {
-       if (sp->shp_mobil <= 0.0) {
-           wu(0, sp->shp_own,
-              "%s %s,\nbut ran out of mobility, and couldn't retreat fully!\n",
-              prship(sp), conditions[findcondition(code)].desc[orig]);
-           return 1;
-       }
-       dir = chkdir(sp->shp_rpath[0], DIR_STOP, DIR_LAST);
-       if (dir == DIR_STOP || CANT_HAPPEN(dir < 0)) {
-           memmove(sp->shp_rpath, sp->shp_rpath + 1,
-                   sizeof(sp->shp_rpath) - 1);
-           if (sp->shp_rpath[0] == 0)
-               sp->shp_rflags = 0;
-           break;
-       }
-       dx = diroff[dir][0];
-       dy = diroff[dir][1];
-
-       mcp = &mchr[(int)sp->shp_type];
-       newx = xnorm(sp->shp_x + dx);
-       newy = ynorm(sp->shp_y + dy);
-       mobcost = shp_mobcost(sp);
-
-       getsect(newx, newy, &sect);
-       if (shp_check_nav(sp, &sect) != SHP_STUCK_NOT ||
-           (sect.sct_own
-            && relations_with(sect.sct_own, sp->shp_own) < FRIENDLY)) {
-           wu(0, sp->shp_own, "%s %s,\nbut could not retreat to %s!\n",
-              prship(sp), conditions[findcondition(code)].desc[orig],
-              xyas(newx, newy, sp->shp_own));
-           return 1;
-       }
-       sp->shp_x = newx;
-       sp->shp_y = newy;
-       sp->shp_mobil -= mobcost;
-       sp->shp_mission = 0;
-       memmove(sp->shp_rpath, sp->shp_rpath + 1,
-               sizeof(sp->shp_rpath) - 1);
-       if (sp->shp_rpath[0] == 0)
-           sp->shp_rflags = 0;
-
-       mines = sect.sct_mines;
-       changed = 0;
-       if (sect.sct_type != SCT_WATER || mines <= 0)
-           continue;
-       if (mcp->m_flags & M_SWEEP) {
-           max = mcp->m_item[I_SHELL];
-           shells = sp->shp_item[I_SHELL];
-           for (m = 0; mines > 0 && m < 5; m++) {
-               if (chance(0.66)) {
-                   mines--;
-                   shells = MIN(max, shells + 1);
-                   changed |= map_set(sp->shp_own, sp->shp_x, sp->shp_y,
-                                      'X', 0);
-               }
-           }
-           if (sect.sct_mines != mines) {
-               wu(0, sp->shp_own,
-                  "%s cleared %d mine%s in %s while retreating\n",
-                  prship(sp), sect.sct_mines - mines,
-                  splur(sect.sct_mines - mines),
-                  xyas(newx, newy, sp->shp_own));
-               sect.sct_mines = mines;
-               sp->shp_item[I_SHELL] = shells;
-               putsect(&sect);
-           }
-           if (changed)
-               writemap(sp->shp_own);
-       }
-       if (chance(DMINE_HITCHANCE(mines))) {
-           wu(0, sp->shp_own,
-              "%s %s,\nand hit a mine in %s while retreating!\n",
-              prship(sp), conditions[findcondition(code)].desc[orig],
-              xyas(newx, newy, sp->shp_own));
-           nreport(sp->shp_own, N_HIT_MINE, 0, 1);
-           m = MINE_DAMAGE();
-           shipdamage(sp, m);
-           mines--;
-           if (map_set(sp->shp_own, sp->shp_x, sp->shp_y, 'X', 0))
-               writemap(sp->shp_own);
-           sect.sct_mines = mines;
-           putsect(&sect);
-           return 1;
-       }
-    }
+static void
+retreat_ship_sel(struct shpstr *sp, struct emp_qelem *list, int n)
+{
+    struct shpstr *flg = QEMPTY(list) ? NULL
+       : &((struct ulist *)(list->q_back))->unit.ship;
 
-    if (orig) {
-       wu(0, sp->shp_own, "%s %s, and retreated to %s\n",
-          prship(sp), conditions[findcondition(code)].desc[orig],
-          xyas(sp->shp_x, sp->shp_y, sp->shp_own));
-    } else {
-       wu(0, sp->shp_own, "%s %s, and ended up at %s\n",
-          prship(sp),
-          conditions[findcondition(code)].desc[orig],
-          xyas(sp->shp_x, sp->shp_y, sp->shp_own));
+    if (!shp_may_nav(sp, flg, ", and can't retreat!"))
+       return;
+    if (sp->shp_mobil <= 0) {
+       mpr(sp->shp_own, "%s has no mobility, and can't retreat!\n",
+           prship(sp));
+       return;
     }
 
-    return 1;
+    if (flg)
+       mpr(sp->shp_own, "%s retreats with her\n", prship(sp));
+    else
+       mpr(sp->shp_own, "%s retreats along path %.*s\n",
+           prship(sp), n, sp->shp_rpath);
+    shp_insque(sp, list);
 }
 
 static int
-findcondition(char code)
+retreat_ships_step(struct emp_qelem *list, char step, natid actor)
 {
-    int i;
+    int dir = chkdir(step, DIR_STOP, DIR_LAST);
+    struct emp_qelem *qp;
+    struct ulist *mlp;
+    struct shpstr *sp;
+
+    if (dir != DIR_STOP && shp_nav_dir(list, dir, actor))
+       return 0;               /* can't go there */
+
+    for (qp = list->q_back; qp != list; qp = qp->q_back) {
+       mlp = (struct ulist *)qp;
+       sp = &mlp->unit.ship;
+       consume_step(sp->shp_rpath, &sp->shp_rflags);
+       if (dir != DIR_STOP)
+           sp->shp_mission = 0;
+       putship(sp->shp_uid, sp);
+    }
 
-    for (i = 0; conditions[i].code && conditions[i].code != code; i++) ;
-    CANT_HAPPEN(!conditions[i].code);
-    return i;
+    return dir != DIR_STOP && !shp_nav_gauntlet(list, 0, actor);
 }
 
 void
 retreat_land(struct lndstr *lp, char code)
 {
+    int n, i;
+    natid own;
+    struct emp_qelem list;
     struct nstr_item ni;
     struct lndstr land;
 
     if (CANT_HAPPEN(!lp->lnd_own))
        return;
-    if (lp->lnd_own == player->cnum)
+    if (lp->lnd_own == player->cnum || !lp->lnd_rpath[0])
        return;
 
-    retreat_land1(lp, code, 1);
+    n = retreat_steps(lp->lnd_rpath);
+    if (!n)
+       return;
+
+    /* See explanation in retreat_ship() */
+    own = lp->lnd_own;
+    putland(lp->lnd_uid, lp);
+
+    emp_initque(&list);
+    if (lp->lnd_own)
+       retreat_land_sel(lp, &list, n);
 
     if (lp->lnd_rflags & RET_GROUP) {
-       snxtitem_group(&ni, EF_LAND, lp->lnd_army);
+       snxtitem_xy(&ni, EF_LAND, lp->lnd_x, lp->lnd_y);
        while (nxtitem(&ni, &land)) {
-           if (land.lnd_own != lp->lnd_own || land.lnd_uid == lp->lnd_uid)
+           if (land.lnd_own != own
+               || !(land.lnd_rflags & RET_GROUP)
+               || land.lnd_army != lp->lnd_army
+               || land.lnd_uid == lp->lnd_uid)
+               continue;
+           if (strncmp(land.lnd_rpath, lp->lnd_rpath, MAX_RETREAT + 1))
                continue;
-           if (retreat_land1(&land, code, 0))
-               putland(land.lnd_uid, &land);
+           retreat_land_sel(&land, &list, n);
        }
     }
-}
 
-static int
-retreat_land1(struct lndstr *lp, char code, int orig)
+    /* Loop similar to the one in unit_move().  Keep it that way!  */
+    for (i = 0; i < n && !QEMPTY(&list); i++) {
+       /*
+        * Invariant: lnd_may_nav() true for all land units
+        * Implies all are in the same sector
+        */
+       if (!retreat_lands_step(&list, lp->lnd_rpath[i], own))
+           n = i;
+       lnd_mar_stay_behind(&list, own);
+       unit_rad_map_set(&list);
+    }
 
+    if (!QEMPTY(&list))
+       lnd_mar_put(&list, own);
+    getland(lp->lnd_uid, lp);
+}
 
-                       /* Is this the originally scared unit, or a follower */
+static void
+retreat_land_sel(struct lndstr *lp, struct emp_qelem *list, int n)
 {
-    struct sctstr sect;
-    int i;
-    int m;
-    int max;
-    int dir;
-    coord newx;
-    coord newy;
-    coord dx;
-    coord dy;
-    int mines;
-    int shells;
-    double mobcost;
-    struct lchrstr *lcp;
-
-    if (lp->lnd_effic < LAND_MINEFF) {
-       if (!orig)
-           putland(lp->lnd_uid, lp);
-       return 0;
-    }
+    struct lndstr *ldr = QEMPTY(list)
+       ? NULL : &((struct ulist *)(list->q_back))->unit.land;
 
-    getsect(lp->lnd_x, lp->lnd_y, &sect);
-
-    if (lp->lnd_mobil <= 0.0) {
-       wu(0, lp->lnd_own,
-          "%s %s,\nbut had no mobility, and couldn't retreat!\n",
-          prland(lp), conditions[findcondition(code)].desc[orig]);
-       return 0;
+    if (!lnd_may_mar(lp, ldr, ", and can't retreat!"))
+       return;
+    if (lp->lnd_mobil <= 0) {
+       mpr(lp->lnd_own, "%s has no mobility, and can't retreat!\n",
+           prland(lp));
+       return;
     }
 
-    for (i = 0; i < MAX_RETREAT && lp->lnd_rpath[0]; i++) {
-       if (lp->lnd_mobil <= 0.0) {
-           wu(0, lp->lnd_own,
-              "%s %s,\nbut ran out of mobility, and couldn't retreat fully!\n",
-              prland(lp), conditions[findcondition(code)].desc[orig]);
-           return 1;
-       }
-       dir = chkdir(lp->lnd_rpath[0], DIR_STOP, DIR_LAST);
-       if (dir == DIR_STOP || CANT_HAPPEN(dir < 0)) {
-           memmove(lp->lnd_rpath, lp->lnd_rpath + 1,
-                   sizeof(lp->lnd_rpath) - 1);
-           if (lp->lnd_rpath[0] == 0)
-               lp->lnd_rflags = 0;
-           break;
-       }
-       dx = diroff[dir][0];
-       dy = diroff[dir][1];
-
-       lcp = &lchr[(int)lp->lnd_type];
-       newx = xnorm(lp->lnd_x + dx);
-       newy = ynorm(lp->lnd_y + dy);
-
-       getsect(newx, newy, &sect);
-       mobcost = lnd_mobcost(lp, &sect);
-       if (mobcost < 0
-           || sect.sct_type == SCT_MOUNT
-           || sect.sct_own != lp->lnd_own) {
-           wu(0, lp->lnd_own, "%s %s,\nbut could not retreat to %s!\n",
-              prland(lp),
-              conditions[findcondition(code)].desc[orig],
-              xyas(newx, newy, lp->lnd_own));
-           return 1;
-       }
-       lp->lnd_x = newx;
-       lp->lnd_y = newy;
-       lp->lnd_mobil -= mobcost;
-       lp->lnd_mission = 0;
-       memmove(lp->lnd_rpath, lp->lnd_rpath + 1,
-               sizeof(lp->lnd_rpath) - 1);
-       if (lp->lnd_rpath[0] == 0)
-           lp->lnd_rflags = 0;
-
-       mines = SCT_LANDMINES(&sect);
-       if (mines <= 0 || sect.sct_oldown == lp->lnd_own)
-           continue;
-       if (lcp->l_flags & L_ENGINEER) {
-           max = lcp->l_item[I_SHELL];
-           shells = lp->lnd_item[I_SHELL];
-           for (m = 0; mines > 0 && m < 5; m++) {
-               if (chance(0.66)) {
-                   mines--;
-                   shells = MIN(max, shells + 1);
-               }
-           }
-           sect.sct_mines = mines;
-           lp->lnd_item[I_SHELL] = shells;
-           putsect(&sect);
-       }
-       if (chance(DMINE_LHITCHANCE(mines))) {
-           wu(0, lp->lnd_own,
-              "%s %s,\nand hit a mine in %s while retreating!\n",
-              prland(lp),
-              conditions[findcondition(code)].desc[orig],
-              xyas(newx, newy, lp->lnd_own));
-           nreport(lp->lnd_own, N_LHIT_MINE, 0, 1);
-           m = MINE_LDAMAGE();
-           if (lcp->l_flags & L_ENGINEER)
-               m /= 2;
-           landdamage(lp, m);
-           mines--;
-           sect.sct_mines = mines;
-           putsect(&sect);
-           return 1;
-       }
-    }
+    if (ldr)
+       mpr(lp->lnd_own, "%s retreats with them\n", prland(lp));
+    else
+       mpr(lp->lnd_own, "%s retreats along path %.*s\n",
+           prland(lp), n, lp->lnd_rpath);
+    lnd_insque(lp, list);
+}
 
-    if (orig) {
-       wu(0, lp->lnd_own, "%s %s, and retreated to %s\n",
-          prland(lp),
-          conditions[findcondition(code)].desc[orig],
-          xyas(lp->lnd_x, lp->lnd_y, lp->lnd_own));
-    } else {
-       wu(0, lp->lnd_own, "%s %s, and ended up at %s\n",
-          prland(lp),
-          conditions[findcondition(code)].desc[orig],
-          xyas(lp->lnd_x, lp->lnd_y, lp->lnd_own));
+static int
+retreat_lands_step(struct emp_qelem *list, char step, natid actor)
+{
+    int dir = chkdir(step, DIR_STOP, DIR_LAST);
+    struct emp_qelem *qp;
+    struct ulist *llp;
+    struct lndstr *lp;
+
+    if (dir != DIR_STOP && lnd_mar_dir(list, dir, actor))
+       return 0;               /* can't go there */
+
+    for (qp = list->q_back; qp != list; qp = qp->q_back) {
+       llp = (struct ulist *)qp;
+       lp = &llp->unit.land;
+       consume_step(lp->lnd_rpath, &lp->lnd_rflags);
+       if (dir != DIR_STOP) {
+           lp->lnd_mission = 0;
+           lp->lnd_harden = 0;
+       }
+       putland(lp->lnd_uid, lp);
     }
 
-    return 1;
+    return dir != DIR_STOP && !lnd_mar_gauntlet(list, 0, actor);
 }
index 92813d05e6ac5825b8e660c5ad57a0bbda77982b..52c5afb6592493bdd041f18efc702587cd0545ac 100644 (file)
@@ -197,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;
@@ -777,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;
@@ -789,7 +789,6 @@ 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;
 
     if (CANT_HAPPEN(QEMPTY(list)))
@@ -876,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;
 }
index 5441624150dd51abd7bd177b4c11f7bbbbf95db2..7b1d3f0b8dd9ce9a62a0d65c8dcf8b02663014ad 100644 (file)
@@ -415,11 +415,13 @@ unit_move(struct emp_qelem *list)
        } else if ((dir = chkdir(*cp, DIR_STOP, DIR_LAST)) >= 0) {
            cp++;
            if (type == EF_SHIP)
-               stopping = shp_nav_one_sector(list, dir, player->cnum);
+               stopping = shp_nav_dir(list, dir, player->cnum)
+                   || shp_nav_gauntlet(list, 1, player->cnum);
            else {
                if (!moved && !lnd_abandon_askyn(list))
                    return RET_FAIL;
-               stopping = lnd_mar_one_sector(list, dir, player->cnum);
+               stopping = lnd_mar_dir(list, dir, player->cnum)
+                   || lnd_mar_gauntlet(list, 1, player->cnum);
            }
            if (dir == DIR_STOP)
                return RET_OK;
index 7198a30913f2350324f685bdd3ecbc8dff26dd46..bf596b0dbf55ed062ede9cfc4e318f82f4605461 100644 (file)
@@ -42,7 +42,6 @@ lret
 | sunk
 | as group (fleet c): 30 sinks, 32 crewless, 35 no mobility, 36 on sale
 fire se -2,2 30
-| BUG: 36 retreats anyway
 __cmd added -2 -2 0
 | in canal 4,0
 fire se -2,2 31
@@ -151,10 +150,6 @@ board 130 5
 bomb 30 . p -2,2 jh
 l
 30
-| BUG: 31 retreats anyway
-| BUG: 32 retreats anyway
-| BUG: 34 retreats anyway
-| BUG: 36 retreats anyway
 __cmd added -1 -2 0
 | kidnapped in -1,1
 bomb 30 . p -2,2 uh
@@ -172,6 +167,7 @@ bomb 30 . p -2,2 ujh
 l
 40
 | into mountain 2,0 after j
+| not actually having difficulties; such a retreat is permitted now
 __cmd added -1 0 0
 bomb 30 . p -2,2 ujh
 l
@@ -186,20 +182,16 @@ __cmd added -1 0 0
 bomb 30 . p -2,2 ujh
 l
 44
-| BUG: sweeps silently
-| BUG: 43 doesn't retreat when 44 retreats fully
 | rail ends after n
 | as group (army t): 45 train, 46 not
 bomb 31 . p -2,2 uyuuh
 l
 45
-| BUG: 46 retreats anyway
 | into foreign, 47 can't, 48 can
 __cmd added -1 0 0
 bomb 31 . p -2,2 uuuh
 l
 47
-| BUG: 48 can't enter foreign sector
 __cmd added 2 4 0
 || land units retreating fully
 | jh
@@ -217,7 +209,6 @@ __cmd added -1 0 0
 bomb 30 . p -2,2 ujjh
 l
 10
-| BUG: can't enter allied sector
 | own land unit stays put
 bomb 30 . p -3,1 h
 l
index d7036b45ca89fe6094d25268f937c518eb3b808f..929a5bb0597f3acba489eb32da3e9d86c6d9217c 100644 (file)
@@ -1,6 +1,6 @@
 config sect
 owner xloc yloc des effic mobil off loyal terr0 terr1 terr2 terr3 dterr xdist ydist avail elev work coastal newdes min gold fert ocontent uran oldown civil milit shell gun petrol iron dust bar food oil lcm hcm uw rad c_dist m_dist s_dist g_dist p_dist i_dist d_dist b_dist f_dist o_dist l_dist h_dist u_dist r_dist c_del m_del s_del g_del p_del i_del d_del b_del f_del o_del l_del h_del u_del r_del mines pstage ptime che che_target fallout access road rail dfense
-2 0 0 15 88 112 0 0 0 0 0 0 0 0 0 0 0 0 0 15 0 0 0 0 0 1 87 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 94 healthy 0 0 0 0 0 0 0 0
+2 0 0 15 88 112 0 0 0 0 0 0 0 0 0 0 0 0 0 15 0 0 0 0 0 1 87 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 91 healthy 0 0 0 0 0 0 0 0
 2 2 0 1 100 127 0 0 0 0 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 2 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 0 0 0 0 0
 2 4 0 5 100 127 0 0 0 0 0 0 0 4 0 0 0 0 1 5 0 0 0 0 0 2 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 0 0 0 0 0
 1 -4 0 15 100 127 0 0 0 0 0 0 0 -4 0 0 0 0 1 15 0 0 0 0 0 1 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 0 0 0 0 0
@@ -14,7 +14,7 @@ owner xloc yloc des effic mobil off loyal terr0 terr1 terr2 terr3 dterr xdist yd
 2 -6 2 12 81 102 0 0 0 0 0 0 0 -6 2 0 0 0 1 12 0 0 0 0 0 2 83 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 0 0 0 0 0
 1 -2 2 19 100 127 0 0 0 0 0 0 0 -2 2 0 0 0 1 19 0 0 0 0 0 1 100 5 11 2 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 0 0 0 0 0
 4 4 4 12 100 127 0 0 0 0 0 0 0 4 4 0 0 0 1 12 0 0 0 0 0 4 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 0 0 0 0 0
-0 -6 4 0 0 0 0 0 0 0 0 0 0 -6 4 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 94 healthy 0 0 0 0 0 0 0 0
+0 -6 4 0 0 0 0 0 0 0 0 0 0 -6 4 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 92 healthy 0 0 0 0 0 0 0 0
 2 0 -2 24 98 124 0 0 0 0 0 0 0 0 -2 0 0 0 1 24 0 0 0 0 0 2 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 0 0 0 0 0
 3 2 -2 15 100 127 0 0 0 0 0 0 0 2 -2 0 0 0 1 15 0 0 0 0 0 3 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 0 0 0 0 0
 1 -2 -2 19 99 126 0 0 0 0 0 0 0 -2 -2 0 0 0 1 19 0 0 0 0 0 1 99 5 98 2 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 0 0 0 0 0
@@ -38,36 +38,36 @@ uid owner xloc yloc type effic mobil off tech opx opy mission radius fleet civil
 11 2 1 3 10 93 105 0 45 0 2 none 1 "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
 20 2 -3 1 10 96 122 0 45 -3 1 interdiction 1 "" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (helpless) "u"
 24 1 -4 2 10 100 127 0 45 0 0 none 0 "g" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "ggg"
-25 2 -8 2 10 93 93 0 45 -4 2 none 1 "g" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "g"
-26 2 -4 4 10 100 103 0 45 -4 2 none 1 "g" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
-27 2 -4 4 10 100 103 0 45 -4 2 none 1 "g" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+25 2 -8 2 10 93 94 0 45 -4 2 none 1 "g" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "g"
+26 2 -4 2 10 100 127 0 45 -4 2 interdiction 1 "g" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (injured) "bn"
+27 2 -4 2 10 100 127 0 45 -4 2 interdiction 1 "g" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "bn"
 28 2 -8 2 10 100 103 0 45 -4 2 none 1 "g" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group bombed) "g"
-29 2 1 3 10 100 103 0 45 5 3 none 1 "g" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "g"
+29 2 5 3 10 100 127 0 45 5 3 interdiction 1 "g" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "ggg"
 30 0 0 2 10 0 119 0 45 0 2 interdiction 1 "c" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "n"
 31 2 4 0 10 95 121 0 45 4 0 interdiction 1 "" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (injured) "n"
 32 2 0 2 10 100 127 0 45 0 2 interdiction 1 "c" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "n"
 33 2 2 2 10 95 121 0 45 2 2 interdiction 1 "" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (injured) "n"
 34 2 3 1 10 94 120 0 45 3 1 interdiction 1 "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (injured) "n"
 35 2 0 2 10 100 0 0 45 0 2 interdiction 1 "c" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "n"
-36 2 1 3 10 100 115 0 45 0 2 none 1 "c" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+36 2 0 2 10 100 127 0 45 0 2 interdiction 1 "c" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "n"
 40 2 1 3 10 91 -7 0 45 0 2 none 1 "" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (injured) "nnnh"
 41 2 1 3 10 96 109 0 45 0 2 none 1 "" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (injured) "uh"
 42 2 -4 2 10 95 121 0 45 -4 2 interdiction 1 "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (injured) "ugggh"
-43 2 -8 4 16 100 99 0 45 0 0 none 0 "m" 0 10 2 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
-44 2 -6 4 16 64 70 0 45 0 0 none 0 "m" 0 6 2 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "g"
+43 2 -6 4 16 87 98 0 45 0 0 none 0 "m" 0 8 1 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "g"
+44 2 -6 4 16 68 73 0 45 0 0 none 0 "m" 0 6 2 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "g"
 46 2 5 1 10 93 118 0 45 5 1 interdiction 1 "n" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (group injured) "y"
 47 2 4 0 9 100 117 0 45 5 1 none 0 "n" 0 2 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
-50 2 -9 1 18 67 33 0 60 -5 1 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
-51 2 -9 1 18 64 28 0 60 -5 1 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
-52 2 -9 1 18 73 45 0 60 -5 1 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+50 2 -9 1 18 67 34 0 60 -5 1 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+51 2 -9 1 18 64 29 0 60 -5 1 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+52 2 -9 1 18 73 46 0 60 -5 1 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
 53 2 -4 -2 18 73 92 0 60 -4 -2 interdiction 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (helpless) "gg"
 60 2 -6 2 17 100 127 0 70 -6 2 interdiction 1 "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (injured helpless bombed) "nn"
-61 2 -4 4 17 73 65 0 70 -6 2 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
-62 2 -4 4 17 67 55 0 70 -6 2 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+61 2 -4 4 17 73 66 0 70 -6 2 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+62 2 -4 4 17 67 56 0 70 -6 2 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
 63 2 -4 4 17 56 37 0 70 -6 2 none 1 "" 0 5 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
-64 2 -4 4 17 67 55 0 70 -6 2 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
-65 2 -4 4 17 59 40 0 70 -6 2 none 1 "" 0 6 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
-66 2 -4 4 17 67 55 0 70 -6 2 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+64 2 -4 4 17 67 56 0 70 -6 2 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+65 2 -4 4 17 59 41 0 70 -6 2 none 1 "" 0 6 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+66 2 -4 4 17 67 56 0 70 -6 2 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
 67 2 -6 2 17 100 127 0 70 -6 2 interdiction 1 "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (helpless bombed) "nn"
 68 2 -4 4 17 70 61 0 70 -6 2 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
 69 2 -4 4 17 65 53 0 70 -6 2 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
@@ -76,13 +76,13 @@ uid owner xloc yloc type effic mobil off tech opx opy mission radius fleet civil
 82 2 -6 2 17 100 127 0 70 -6 2 interdiction 1 "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (injured helpless bombed) "nn"
 83 2 -4 4 17 29 -28 0 70 -6 2 none 1 "" 0 3 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
 84 2 -6 2 17 100 127 0 70 -6 2 interdiction 1 "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (injured helpless bombed) "nn"
-100 2 2 -6 10 50 15 0 45 0 4 none 1 "" 0 5 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+100 2 2 -6 10 50 16 0 45 0 4 none 1 "" 0 5 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
 101 2 0 4 10 100 127 0 45 0 4 interdiction 1 "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (injured torped helpless) "nn"
-102 2 2 -6 10 71 56 0 45 0 4 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
-103 2 2 -6 10 37 -16 0 45 0 4 none 1 "" 0 3 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+102 2 2 -6 10 71 57 0 45 0 4 none 1 "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+103 2 2 -6 10 37 -15 0 45 0 4 none 1 "" 0 3 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
 104 2 0 4 10 100 127 0 45 0 4 interdiction 1 "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 (injured torped helpless) "nn"
 120 2 -9 1 18 100 93 0 60 -5 1 none 1 "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
-130 2 -9 1 12 100 95 0 60 -5 1 none 1 "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
+130 2 -9 1 12 100 96 0 60 -5 1 none 1 "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" -3 1 1 () ""
 149 0 0 0 0 0 0 0 0 0 0 none 0 "" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 "" 0 0 0 () ""
 /config
 config plane
@@ -115,35 +115,35 @@ uid owner xloc yloc type effic mobil off tech opx opy mission radius army ship h
 4 1 -4 0 2 100 127 0 50 0 0 none 0 "a" -1 0 42 (group helpless) "b" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
 7 1 -4 0 2 100 127 0 50 0 0 none 0 "a" -1 0 42 (group helpless) "b" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
 9 2 0 2 7 99 126 0 50 0 0 none 0 "" -1 127 42 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-10 2 4 0 0 61 61 0 50 1 1 none 3 "" -1 127 42 (bombed) "y" 0 6 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+10 2 3 -1 0 42 29 0 50 1 1 none 3 "" -1 0 42 () "" 0 4 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
 24 1 3 1 0 98 125 0 50 0 0 none 0 "g" -1 0 42 (group bombed) "bhg" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-25 2 2 2 0 91 96 0 50 3 1 none 3 "g" -1 127 42 (group bombed) "g" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-26 2 4 0 0 100 117 0 50 3 1 none 3 "g" -1 127 42 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-27 2 4 0 0 100 117 0 50 3 1 none 3 "g" -1 127 42 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-28 2 2 2 0 100 107 0 50 3 1 none 3 "g" -1 127 42 (group injured) "g" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-29 2 3 1 0 100 116 0 50 4 0 none 3 "g" -1 127 42 (group bombed) "g" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+25 2 2 2 0 91 96 0 50 3 1 none 3 "g" -1 0 42 (group bombed) "g" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+26 2 3 1 0 100 127 0 50 3 1 reserve 3 "g" -1 127 42 (bombed) "uh" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+27 2 3 1 0 100 127 0 50 3 1 reserve 3 "g" -1 127 42 (group bombed) "uh" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+28 2 2 2 0 100 107 0 50 3 1 none 3 "g" -1 0 42 (group injured) "g" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+29 2 4 0 0 100 127 0 50 4 0 reserve 3 "g" -1 127 42 (group bombed) "bhg" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
 30 0 0 2 0 0 105 0 50 0 2 reserve 3 "c" -1 127 42 (group bombed) "j" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-31 2 2 2 0 100 107 0 50 0 2 none 3 "c" 35 127 42 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-32 2 2 2 0 100 107 0 50 0 2 none 3 "c" -1 127 42 () "" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-33 2 1 1 0 85 98 0 50 -1 1 none 3 "" -1 127 42 () "" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-34 2 2 2 0 100 107 0 50 0 2 none 3 "c" -1 127 42 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 9 0
+31 2 0 2 0 100 127 0 50 0 2 reserve 3 "c" 35 127 42 (group bombed) "j" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+32 2 0 2 0 100 127 0 50 0 2 reserve 3 "c" -1 127 42 (group bombed) "j" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+33 2 -1 1 0 85 108 0 50 -1 1 reserve 3 "" -1 127 42 (bombed) "j" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+34 2 0 2 0 100 127 0 50 0 2 reserve 3 "c" -1 127 42 (group bombed) "j" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 9 0
 35 2 0 2 0 100 0 0 50 0 2 reserve 3 "c" -1 127 42 (group bombed) "j" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-36 2 2 2 0 100 107 0 50 0 2 none 3 "c" -1 127 42 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-37 2 1 1 7 82 105 0 50 0 0 none 0 "" -1 127 42 (bombed) "j" 0 8 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-40 2 2 2 0 91 -14 0 50 1 1 none 3 "" -1 127 42 (bombed) "u" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-41 2 3 1 0 89 103 0 50 1 1 none 3 "" -1 127 42 (bombed) "y" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+36 2 0 2 0 100 127 0 50 0 2 reserve 3 "c" -1 127 42 (group bombed) "j" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+37 2 1 1 7 82 105 0 50 0 0 none 0 "" -1 127 42 (bombed) "j" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+40 2 2 2 0 91 -14 0 50 1 1 none 3 "" -1 0 42 (bombed) "u" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+41 2 2 0 0 89 44 0 50 1 1 none 3 "" -1 0 42 () "" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
 42 2 1 1 0 86 109 0 50 1 1 reserve 3 "" -1 127 42 (bombed) "g" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-43 2 1 1 15 100 127 0 130 1 1 reserve 1 "m" -1 127 42 (group bombed) "yu" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-44 2 1 -1 15 90 88 0 130 1 1 none 1 "m" -1 127 42 () "" 0 9 3 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-45 2 1 -1 7 84 65 0 50 0 0 none 0 "t" -1 127 42 (group bombed) "b" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-46 2 0 0 0 92 99 0 50 0 -2 none 3 "t" -1 127 42 () "" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+43 2 1 -1 15 100 89 0 130 1 1 none 1 "m" -1 0 42 () "" 0 10 3 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+44 2 1 -1 15 90 76 0 130 1 1 none 1 "m" -1 0 42 () "" 0 9 3 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+45 2 1 -1 7 84 65 0 50 0 0 none 0 "t" -1 0 42 (group bombed) "b" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+46 2 0 -2 0 100 127 0 50 0 -2 reserve 3 "t" -1 127 42 (group bombed) "nb" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
 47 2 1 -1 0 91 115 0 50 1 -1 reserve 3 "s" -1 127 42 (group bombed) "gh" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-48 2 1 -1 8 100 127 0 50 1 -1 reserve 3 "s" -1 127 42 (group bombed) "gh" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-60 2 3 1 0 73 71 0 50 0 0 none 3 "" -1 127 42 () "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+48 2 -1 -1 8 100 116 0 50 1 -1 none 3 "s" -1 0 42 () "" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+60 2 3 1 0 73 72 0 50 0 0 none 3 "" -1 0 42 () "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
 61 2 0 0 0 100 127 0 50 0 0 reserve 3 "" -1 127 42 (injured helpless bombed) "nj" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
 62 2 0 0 0 100 127 0 50 0 0 reserve 3 "" -1 127 42 (injured helpless bombed) "nj" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
 63 2 0 0 0 100 127 0 50 0 0 reserve 3 "" -1 127 42 (injured helpless bombed) "nj" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
-64 2 3 1 0 74 72 0 50 0 0 none 3 "" -1 127 42 () "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
+64 2 3 1 0 74 73 0 50 0 0 none 3 "" -1 0 42 () "" 0 7 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
 99 0 0 0 0 0 0 0 0 0 0 none 0 "" -1 0 0 () "" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0
 /config
 config nuke
@@ -152,7 +152,7 @@ uid owner xloc yloc type effic mobil off tech opx opy mission radius stockpile p
 config news
 actor action victim times duration time
 1 11 2 15 0 0
-2 25 0 1 0 0
+2 25 0 3 0 0
 1 11 1 1 0 0
 2 14 1 2 0 0
 1 9 2 11 0 0
@@ -161,7 +161,6 @@ actor action victim times duration time
 2 13 0 3 0 0
 1 19 2 1 0 0
 1 55 2 15 0 0
-2 56 0 1 0 0
 1 55 1 1 0 0
 /config
 config trade
index 733ce9feae9b74e95303c3a0a7407eff165da220..f588fbeb5ac71ff8f91f67d49094aef7f2d9ced8 100644 (file)
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 32)          2    completely  lc   light cruiser (#32)
     Play#1 output Play#1 1 (# 35)          2    completely  lc   light cruiser (#35)
+    Play#1 output Play#1 1 (# 36)          2    completely  lc   light cruiser (#36)
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (#  9)          2    completely  tra  train #9
     Play#1 output Play#1 1 (# 30)          2     minimally  cav  cavalry #30
     Play#1 output Play#1 1 Target sector is a completely constructed agribusiness
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 10)          2    completely  cav  cavalry #10
-    Play#1 output Play#1 1 (# 33)          2    completely  cav  cavalry #33
     Play#1 output Play#1 1 (# 37)          2    completely  tra  train #37
     Play#1 output Play#1 1 (# 40)          2    completely  cav  cavalry #40
     Play#1 output Play#1 1 (# 41)          2    completely  cav  cavalry #41
     Play#1 input l
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 10)          2    completely  cav  cavalry #10
-    Play#1 output Play#1 1 (# 33)          2    completely  cav  cavalry #33
     Play#1 output Play#1 1 (# 37)          2    completely  tra  train #37
     Play#1 output Play#1 1 (# 40)          2    completely  cav  cavalry #40
     Play#1 output Play#1 1 (# 41)          2    completely  cav  cavalry #41
     Play#1 output Play#1 1 Target sector is a completely constructed agribusiness
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 10)          2    completely  cav  cavalry #10
-    Play#1 output Play#1 1 (# 33)          2    completely  cav  cavalry #33
     Play#1 output Play#1 1 (# 37)          2    completely  tra  train #37
     Play#1 output Play#1 1 (# 40)          2    completely  cav  cavalry #40
     Play#1 output Play#1 1 (# 41)          2    completely  cav  cavalry #41
     Play#1 input l
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 10)          2    completely  cav  cavalry #10
-    Play#1 output Play#1 1 (# 33)          2    completely  cav  cavalry #33
     Play#1 output Play#1 1 (# 37)          2    completely  tra  train #37
     Play#1 output Play#1 1 (# 40)          2    completely  cav  cavalry #40
     Play#1 output Play#1 1 (# 41)          2    completely  cav  cavalry #41
     Play#1 output Play#1 1 Target sector is a completely constructed agribusiness
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 10)          2    completely  cav  cavalry #10
-    Play#1 output Play#1 1 (# 33)          2    completely  cav  cavalry #33
     Play#1 output Play#1 1 (# 37)          2    completely  tra  train #37
     Play#1 output Play#1 1 (# 41)          2    completely  cav  cavalry #41
     Play#1 output Play#1 1 (# 42)          2    completely  cav  cavalry #42
     Play#1 input l
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 10)          2    completely  cav  cavalry #10
-    Play#1 output Play#1 1 (# 33)          2    completely  cav  cavalry #33
     Play#1 output Play#1 1 (# 37)          2    completely  tra  train #37
     Play#1 output Play#1 1 (# 41)          2    completely  cav  cavalry #41
     Play#1 output Play#1 1 (# 42)          2    completely  cav  cavalry #42
     Play#1 output Play#1 1 Target sector is a completely constructed agribusiness
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 10)          2    completely  cav  cavalry #10
-    Play#1 output Play#1 1 (# 33)          2    completely  cav  cavalry #33
     Play#1 output Play#1 1 (# 37)          2    completely  tra  train #37
     Play#1 output Play#1 1 (# 42)          2    completely  cav  cavalry #42
     Play#1 output Play#1 1 (# 43)          2    completely  eng  engineer #43
     Play#1 input l
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 10)          2    completely  cav  cavalry #10
-    Play#1 output Play#1 1 (# 33)          2    completely  cav  cavalry #33
     Play#1 output Play#1 1 (# 37)          2    completely  tra  train #37
     Play#1 output Play#1 1 (# 42)          2    completely  cav  cavalry #42
     Play#1 output Play#1 1 (# 43)          2    completely  eng  engineer #43
     Play#1 output Play#1 1 Target sector is a completely constructed agribusiness
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 10)          2    completely  cav  cavalry #10
-    Play#1 output Play#1 1 (# 33)          2    completely  cav  cavalry #33
     Play#1 output Play#1 1 (# 37)          2    completely  tra  train #37
     Play#1 output Play#1 1 (# 42)          2    completely  cav  cavalry #42
     Play#1 output Play#1 1 (# 43)          2    completely  eng  engineer #43
     Play#1 input l
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 10)          2    completely  cav  cavalry #10
-    Play#1 output Play#1 1 (# 33)          2    completely  cav  cavalry #33
     Play#1 output Play#1 1 (# 37)          2    completely  tra  train #37
     Play#1 output Play#1 1 (# 42)          2    completely  cav  cavalry #42
     Play#1 output Play#1 1 (# 43)          2    completely  eng  engineer #43
     Play#1 output Play#1 1 flying over agribusiness at 1,-1
     Play#1 output Play#1 1 Target sector is a completely constructed agribusiness
     Play#1 output Play#1 1  #          owner           eff       type
+    Play#1 output Play#1 1 (# 43)          2    completely  eng  engineer #43
     Play#1 output Play#1 1 (# 44)          2    completely  eng  engineer #44
     Play#1 output Play#1 1 (# 45)          2    completely  tra  train #45
     Play#1 output Play#1 1 (# 47)          2    completely  cav  cavalry #47
     Play#1 output Play#1 4 Bomb what? (ship, plane, land unit, efficiency, commodities)
     Play#1 input l
     Play#1 output Play#1 1  #          owner           eff       type
+    Play#1 output Play#1 1 (# 43)          2    completely  eng  engineer #43
     Play#1 output Play#1 1 (# 44)          2    completely  eng  engineer #44
     Play#1 output Play#1 1 (# 45)          2    completely  tra  train #45
     Play#1 output Play#1 1 (# 47)          2    completely  cav  cavalry #47
     Play#1 output Play#1 1 Target sector is a completely constructed agribusiness
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 10)          2    completely  cav  cavalry #10
-    Play#1 output Play#1 1 (# 33)          2    completely  cav  cavalry #33
     Play#1 output Play#1 1 (# 37)          2    completely  tra  train #37
     Play#1 output Play#1 1 (# 42)          2    completely  cav  cavalry #42
-    Play#1 output Play#1 1 (# 43)          2    completely  eng  engineer #43
     Play#1 output Play#1 4 Bomb what? (ship, plane, land unit, efficiency, commodities)
     Play#1 input l
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 10)          2    completely  cav  cavalry #10
-    Play#1 output Play#1 1 (# 33)          2    completely  cav  cavalry #33
     Play#1 output Play#1 1 (# 37)          2    completely  tra  train #37
     Play#1 output Play#1 1 (# 42)          2    completely  cav  cavalry #42
-    Play#1 output Play#1 1 (# 43)          2    completely  eng  engineer #43
     Play#1 output Play#1 4 ac   AH-64 Apache #30, 1 bombs.  Target ('~' to skip)?
     Play#1 input 10
     Play#1 output Play#1 1 71% hitchance...Blam
     Play#1 output Play#1 1 (# 26)          2    completely  cav  cavalry #26
     Play#1 output Play#1 1 (# 27)          2    completely  cav  cavalry #27
     Play#1 output Play#1 1 (# 28)          2    completely  cav  cavalry #28
-    Play#1 output Play#1 1 (# 41)          2    completely  cav  cavalry #41
     Play#1 output Play#1 4 Bomb what? (ship, plane, land unit, efficiency, commodities)
     Play#1 input l
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 26)          2    completely  cav  cavalry #26
     Play#1 output Play#1 1 (# 27)          2    completely  cav  cavalry #27
     Play#1 output Play#1 1 (# 28)          2    completely  cav  cavalry #28
-    Play#1 output Play#1 1 (# 41)          2    completely  cav  cavalry #41
     Play#1 output Play#1 4 ac   AH-64 Apache #30, 1 bombs.  Target ('~' to skip)?
     Play#1 input 10
     Play#1 output Play#1 1 73% hitchance...Blam
     Play#1 output Play#1 1 (# 26)          2    completely  cav  cavalry #26
     Play#1 output Play#1 1 (# 27)          2    completely  cav  cavalry #27
     Play#1 output Play#1 1 (# 28)          2    completely  cav  cavalry #28
-    Play#1 output Play#1 1 (# 41)          2    completely  cav  cavalry #41
     Play#1 output Play#1 4 Bomb what? (ship, plane, land unit, efficiency, commodities)
     Play#1 input l
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 26)          2    completely  cav  cavalry #26
     Play#1 output Play#1 1 (# 27)          2    completely  cav  cavalry #27
     Play#1 output Play#1 1 (# 28)          2    completely  cav  cavalry #28
-    Play#1 output Play#1 1 (# 41)          2    completely  cav  cavalry #41
     Play#1 output Play#1 4 ac   AH-64 Apache #30, 1 bombs.  Target ('~' to skip)?
     Play#1 input 10
-    Play#1 output Play#1 1 75% hitchance...BLAM
+    Play#1 output Play#1 1 76% hitchance...BLAM
     Play#1 output Play#1 1     cav  cavalry #24 takes 1
     Play#1 output Play#1 6 0 547
     Play#1 input bomb 30 . p -3,1 h
     Play#1 output Play#1 1 (# 26)          2    completely  cav  cavalry #26
     Play#1 output Play#1 1 (# 27)          2    completely  cav  cavalry #27
     Play#1 output Play#1 1 (# 28)          2    completely  cav  cavalry #28
-    Play#1 output Play#1 1 (# 41)          2    completely  cav  cavalry #41
     Play#1 output Play#1 4 Bomb what? (ship, plane, land unit, efficiency, commodities)
     Play#1 input l
     Play#1 output Play#1 1  #          owner           eff       type
     Play#1 output Play#1 1 (# 26)          2    completely  cav  cavalry #26
     Play#1 output Play#1 1 (# 27)          2    completely  cav  cavalry #27
     Play#1 output Play#1 1 (# 28)          2    completely  cav  cavalry #28
-    Play#1 output Play#1 1 (# 41)          2    completely  cav  cavalry #41
     Play#1 output Play#1 4 ac   AH-64 Apache #30, 1 bombs.  Target ('~' to skip)?
     Play#1 input 25
     Play#1 output Play#1 1 71% hitchance...Blam
     Play#1 output Play#1 1 flying over agribusiness at 0,0
     Play#1 output Play#1 1 Target sector is a completely constructed agribusiness
     Play#1 output Play#1 1  #          owner           eff       type
-    Play#1 output Play#1 1 (# 46)          2    completely  cav  cavalry #46
     Play#1 output Play#1 1 (# 60)          2    completely  cav  cavalry #60
     Play#1 output Play#1 1 (# 61)          2    completely  cav  cavalry #61
     Play#1 output Play#1 1 (# 62)          2    completely  cav  cavalry #62
     Play#1 output Play#1 4 Bomb what? (ship, plane, land unit, efficiency, commodities)
     Play#1 input l
     Play#1 output Play#1 1  #          owner           eff       type
-    Play#1 output Play#1 1 (# 46)          2    completely  cav  cavalry #46
     Play#1 output Play#1 1 (# 60)          2    completely  cav  cavalry #60
     Play#1 output Play#1 1 (# 61)          2    completely  cav  cavalry #61
     Play#1 output Play#1 1 (# 62)          2    completely  cav  cavalry #62
     Play#1 input 60
     Play#1 output Play#1 1 50% hitchance...Blam-BLAM
     Play#1 output Play#1 1  #          owner           eff       type
-    Play#1 output Play#1 1 (# 46)          2    completely  cav  cavalry #46
     Play#1 output Play#1 1 (# 61)          2    completely  cav  cavalry #61
     Play#1 output Play#1 1 (# 62)          2    completely  cav  cavalry #62
     Play#1 output Play#1 1 (# 63)          2    completely  cav  cavalry #63
     Play#1 input 61
     Play#1 output Play#1 1 50% hitchance...thud
     Play#1 output Play#1 1  #          owner           eff       type
-    Play#1 output Play#1 1 (# 46)          2    completely  cav  cavalry #46
     Play#1 output Play#1 1 (# 61)          2    completely  cav  cavalry #61
     Play#1 output Play#1 1 (# 62)          2    completely  cav  cavalry #62
     Play#1 output Play#1 1 (# 63)          2    completely  cav  cavalry #63
     Play#1 input 62
     Play#1 output Play#1 1 50% hitchance...thud
     Play#1 output Play#1 1  #          owner           eff       type
-    Play#1 output Play#1 1 (# 46)          2    completely  cav  cavalry #46
     Play#1 output Play#1 1 (# 61)          2    completely  cav  cavalry #61
     Play#1 output Play#1 1 (# 62)          2    completely  cav  cavalry #62
     Play#1 output Play#1 1 (# 63)          2    completely  cav  cavalry #63
     Play#1 input 63
     Play#1 output Play#1 1 50% hitchance...thud
     Play#1 output Play#1 1  #          owner           eff       type
-    Play#1 output Play#1 1 (# 46)          2    completely  cav  cavalry #46
     Play#1 output Play#1 1 (# 61)          2    completely  cav  cavalry #61
     Play#1 output Play#1 1 (# 62)          2    completely  cav  cavalry #62
     Play#1 output Play#1 1 (# 63)          2    completely  cav  cavalry #63
     Play#0 output Play#0 1 > BULLETIN from POGO, (#0)  dated Thu Jan  1 00:00:00 1970
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#30) in 0,2 for 10 damage.
     Play#0 output Play#0 1     lc   light cruiser (#30) takes 6
-    Play#0 output Play#0 1 lc   light cruiser (#32) retreated with a damaged friend,
-    Play#0 output Play#0 1 but had no crew, and couldn't retreat!
-    Play#0 output Play#0 1 lc   light cruiser (#35) retreated with a damaged friend,
-    Play#0 output Play#0 1 but had no mobility, and couldn't retreat!
-    Play#0 output Play#0 1 lc   light cruiser (#36) retreated with a damaged friend, and ended up at 1,3
     Play#0 output Play#0 1     lc   light cruiser (#30) sunk!
+    Play#0 output Play#0 1 lc   light cruiser (#32) is crewless, and can't retreat!
+    Play#0 output Play#0 1 lc   light cruiser (#35) has no mobility, and can't retreat!
+    Play#0 output Play#0 1 lc   light cruiser (#36) is on the trading block, and can't retreat!
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#31) in 4,0 for 8 damage.
     Play#0 output Play#0 1     lc   light cruiser (#31) takes 5
-    Play#0 output Play#0 1 lc   light cruiser (#31) was damaged,
-    Play#0 output Play#0 1 but was landlocked, and couldn't retreat!
+    Play#0 output Play#0 1 lc   light cruiser (#31) is landlocked, and can't retreat!
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#33) in 2,2 for 8 damage.
     Play#0 output Play#0 1     lc   light cruiser (#33) takes 5
-    Play#0 output Play#0 1 lc   light cruiser (#33) was damaged,
-    Play#0 output Play#0 1 but was caught in a construction zone, and couldn't retreat!
+    Play#0 output Play#0 1 lc   light cruiser (#33) is caught in a construction zone, and can't retreat!
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#34) in 3,1 for 10 damage.
     Play#0 output Play#0 1     lc   light cruiser (#34) takes 6
-    Play#0 output Play#0 1 lc   light cruiser (#34) was damaged,
-    Play#0 output Play#0 1 but was landlocked, and couldn't retreat!
+    Play#0 output Play#0 1 lc   light cruiser (#34) is landlocked, and can't retreat!
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#40) in 0,2 for 14 damage.
     Play#0 output Play#0 1     lc   light cruiser (#40) takes 9
-    Play#0 output Play#0 1 lc   light cruiser (#40) was damaged,
-    Play#0 output Play#0 1 but ran out of mobility, and couldn't retreat fully!
+    Play#0 output Play#0 1 lc   light cruiser (#40) retreats along path nn
+    Play#0 output Play#0 1 lc   light cruiser (#40) is out of mobility & stays in 1,3
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#41) in 0,2 for 6 damage.
     Play#0 output Play#0 1     lc   light cruiser (#41) takes 4
-    Play#0 output Play#0 1 lc   light cruiser (#41) was damaged,
-    Play#0 output Play#0 1 but could not retreat to 2,2!
+    Play#0 output Play#0 1 lc   light cruiser (#41) retreats along path nu
+    Play#0 output Play#0 1 can't go to 2,2
+    Play#0 output Play#0 1 lc   light cruiser (#41) stopped at 1,3
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#42) in -4,2 for 8 damage.
     Play#0 output Play#0 1     lc   light cruiser (#42) takes 5
-    Play#0 output Play#0 1 lc   light cruiser (#42) was damaged,
-    Play#0 output Play#0 1 but could not retreat to -3,1!
+    Play#0 output Play#0 1 lc   light cruiser (#42) retreats along path ug
+    Play#0 output Play#0 1 can't go to -3,1
+    Play#0 output Play#0 1 lc   light cruiser (#42) stopped at -4,2
     Play#0 output Play#0 1 Country #1 shelled ms   minesweeper (#44) in -4,4 for 11 damage.
     Play#0 output Play#0 1     ms   minesweeper (#44) takes 10
-    Play#0 output Play#0 1 ms   minesweeper (#44) cleared 3 mines in -6,4 while retreating
-    Play#0 output Play#0 1 ms   minesweeper (#44) was damaged,
-    Play#0 output Play#0 1 and hit a mine in -6,4 while retreating!
-    Play#0 output Play#0 1     ms   minesweeper (#44) takes 29
-    Play#0 output Play#0 1 ms   minesweeper (#43) cleared 2 mines in -6,4 while retreating
-    Play#0 output Play#0 1 ms   minesweeper (#43) retreated with a damaged friend, and ended up at -8,4
+    Play#0 output Play#0 1 ms   minesweeper (#44) retreats along path gg
+    Play#0 output Play#0 1 ms   minesweeper (#43) retreats with her
+    Play#0 output Play#0 1 Approaching minefield at -6,4...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Kawhomp! Mine detected in -6,4!
+    Play#0 output Play#0 1     ms   minesweeper (#44) takes 14
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Kawhomp! Mine detected in -6,4!
+    Play#0 output Play#0 1     ms   minesweeper (#44) takes 13
+    Play#0 output Play#0 1 Kawhomp! Mine detected in -6,4!
+    Play#0 output Play#0 1     ms   minesweeper (#43) takes 13
+    Play#0 output Play#0 1 ms   minesweeper (#44) stopped at -6,4
+    Play#0 output Play#0 1 ms   minesweeper (#43) stopped at -6,4
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#46) in 5,1 for 11 damage.
     Play#0 output Play#0 1     lc   light cruiser (#46) takes 7
-    Play#0 output Play#0 1 lc   light cruiser (#46) was damaged,
-    Play#0 output Play#0 1 but could not retreat to 4,0!
-    Play#0 output Play#0 1 pt   patrol boat (#47) retreated with a damaged friend, and ended up at 4,0
+    Play#0 output Play#0 1 lc   light cruiser (#46) retreats along path y
+    Play#0 output Play#0 1 pt   patrol boat (#47) retreats with her
+    Play#0 output Play#0 1 lc   light cruiser (#46) is too large to fit into the canal system at 4,0 & stays in 5,1
+    Play#0 output Play#0 1 pt   patrol boat (#47) stopped at 4,0
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#10) in 0,2 for 11 damage.
     Play#0 output Play#0 1     lc   light cruiser (#10) takes 7
-    Play#0 output Play#0 1 lc   light cruiser (#10) was damaged, and retreated to 1,3
+    Play#0 output Play#0 1 lc   light cruiser (#10) retreats along path nh
+    Play#0 output Play#0 1 lc   light cruiser (#10) stopped at 1,3
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#10) in 1,3 for 6 damage.
     Play#0 output Play#0 1     lc   light cruiser (#10) takes 4
-    Play#0 output Play#0 1 lc   light cruiser (#10) was damaged, and retreated to 1,3
+    Play#0 output Play#0 1 lc   light cruiser (#10) retreats along path h
+    Play#0 output Play#0 1 lc   light cruiser (#10) stopped at 1,3
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#10) in 1,3 for 6 damage.
     Play#0 output Play#0 1     lc   light cruiser (#10) takes 4
-    Play#0 output Play#0 1 lc   light cruiser (#10) was damaged, and retreated to 4,4
+    Play#0 output Play#0 1 lc   light cruiser (#10) retreats along path nj
+    Play#0 output Play#0 1 lc   light cruiser (#10) stopped at 4,4
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#11) in 0,2 for 11 damage.
     Play#0 output Play#0 1     lc   light cruiser (#11) takes 7
-    Play#0 output Play#0 1 lc   light cruiser (#11) was fired upon with no one able to defend it, and retreated to 1,3
+    Play#0 output Play#0 1 lc   light cruiser (#11) retreats along path n
+    Play#0 output Play#0 1 lc   light cruiser (#11) stopped at 1,3
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#20) in -3,1 for 6 damage.
     Play#0 output Play#0 1     lc   light cruiser (#20) takes 4
     Play#0 output Play#0 1 Return fire hit sector -2,-2 for 8 damage.
     Play#0 output Play#0 1 Country #1 shelled lc   light cruiser (#25) in -4,2 for 11 damage.
     Play#0 output Play#0 1     lc   light cruiser (#25) takes 7
-    Play#0 output Play#0 1 lc   light cruiser (#25) was damaged, and retreated to -8,2
-    Play#0 output Play#0 1 lc   light cruiser (#26) retreated with a damaged friend, and ended up at -4,4
-    Play#0 output Play#0 1 lc   light cruiser (#27) retreated with a damaged friend, and ended up at -4,4
-    Play#0 output Play#0 1 lc   light cruiser (#28) retreated with a damaged friend, and ended up at -8,2
-    Play#0 output Play#0 1 lc   light cruiser (#29) retreated with a damaged friend, and ended up at 1,3
+    Play#0 output Play#0 1 lc   light cruiser (#25) retreats along path gg
+    Play#0 output Play#0 1 lc   light cruiser (#28) retreats with her
+    Play#0 output Play#0 1 lc   light cruiser (#25) stopped at -8,2
+    Play#0 output Play#0 1 lc   light cruiser (#28) stopped at -8,2
     Play#0 output Play#0 1 Country #1 shelled sb   submarine (#50) in -5,1 for 42 damage.
     Play#0 output Play#0 1     sb   submarine (#50) takes 33
-    Play#0 output Play#0 1 sb   submarine (#50) was damaged, and retreated to -9,1
+    Play#0 output Play#0 1 sb   submarine (#50) retreats along path gg
+    Play#0 output Play#0 1 sb   submarine (#50) stopped at -9,1
     Play#0 output Play#0 1 Country #1 shelled sb   submarine (#51) in -5,1 for 45 damage.
     Play#0 output Play#0 1     sb   submarine (#51) takes 36
-    Play#0 output Play#0 1 sb   submarine (#51) was depth-charged, and retreated to -9,1
+    Play#0 output Play#0 1 sb   submarine (#51) retreats along path gg
+    Play#0 output Play#0 1 sb   submarine (#51) stopped at -9,1
     Play#0 output Play#0 1 Country #1 shelled sb   submarine (#52) in -5,1 for 34 damage.
     Play#0 output Play#0 1     sb   submarine (#52) takes 27
-    Play#0 output Play#0 1 sb   submarine (#52) was fired upon with no one able to defend it, and retreated to -9,1
+    Play#0 output Play#0 1 sb   submarine (#52) retreats along path gg
+    Play#0 output Play#0 1 sb   submarine (#52) stopped at -9,1
     Play#0 output Play#0 1 1 dd   destroyer (#5) sighted at -5,1
     Play#0 output Play#0 1 1 dd   destroyer (#5) sighted at -6,0
     Play#0 output Play#0 1 Country #1 shelled sb   submarine (#53) in -4,-2 for 34 damage.
     Play#0 output Play#0 1 -6,2 takes 3% collateral damage
     Play#0 output Play#0 1 1 bombs did 40 damage to dd   destroyer (#61) at -6,2
     Play#0 output Play#0 1     dd   destroyer (#61) takes 27
-    Play#0 output Play#0 1 dd   destroyer (#61) was damaged, and retreated to -4,4
+    Play#0 output Play#0 1 dd   destroyer (#61) retreats along path nn
+    Play#0 output Play#0 1 dd   destroyer (#61) stopped at -4,4
     Play#0 output Play#0 1 -6,2 takes 2% collateral damage
     Play#0 output Play#0 1 1 bombs did 48 damage to dd   destroyer (#62) at -6,2
     Play#0 output Play#0 1     dd   destroyer (#62) takes 33
-    Play#0 output Play#0 1 dd   destroyer (#62) was damaged, and retreated to -4,4
+    Play#0 output Play#0 1 dd   destroyer (#62) retreats along path nn
+    Play#0 output Play#0 1 dd   destroyer (#62) stopped at -4,4
     Play#0 output Play#0 1 -6,2 takes 2% collateral damage
     Play#0 output Play#0 1 1 bombs did 64 damage to dd   destroyer (#63) at -6,2
     Play#0 output Play#0 1     dd   destroyer (#63) takes 44
-    Play#0 output Play#0 1 dd   destroyer (#63) was damaged, and retreated to -4,4
+    Play#0 output Play#0 1 dd   destroyer (#63) retreats along path nn
+    Play#0 output Play#0 1 dd   destroyer (#63) stopped at -4,4
     Play#0 output Play#0 1 -6,2 takes 3% collateral damage
     Play#0 output Play#0 1 1 bombs did 48 damage to dd   destroyer (#64) at -6,2
     Play#0 output Play#0 1     dd   destroyer (#64) takes 33
-    Play#0 output Play#0 1 dd   destroyer (#64) was damaged, and retreated to -4,4
+    Play#0 output Play#0 1 dd   destroyer (#64) retreats along path nn
+    Play#0 output Play#0 1 dd   destroyer (#64) stopped at -4,4
     Play#0 output Play#0 1 -6,2 takes 2% collateral damage
     Play#0 output Play#0 1 1 planes spotted over -4,2
     Play#0 output Play#0 1 1 planes spotted over -6,2
     Play#0 output Play#0 1 1 bombs did 60 damage to dd   destroyer (#65) at -6,2
     Play#0 output Play#0 1     dd   destroyer (#65) takes 41
-    Play#0 output Play#0 1 dd   destroyer (#65) was bombed, and retreated to -4,4
+    Play#0 output Play#0 1 dd   destroyer (#65) retreats along path nn
+    Play#0 output Play#0 1 dd   destroyer (#65) stopped at -4,4
     Play#0 output Play#0 1 -6,2 takes 3% collateral damage
     Play#0 output Play#0 1 1 bombs did 48 damage to dd   destroyer (#66) at -6,2
     Play#0 output Play#0 1     dd   destroyer (#66) takes 33
-    Play#0 output Play#0 1 dd   destroyer (#66) was bombed, and retreated to -4,4
+    Play#0 output Play#0 1 dd   destroyer (#66) retreats along path nn
+    Play#0 output Play#0 1 dd   destroyer (#66) stopped at -4,4
     Play#0 output Play#0 1 -6,2 takes 2% collateral damage
     Play#0 output Play#0 1 -6,2 takes 4% collateral damage
     Play#0 output Play#0 1 1 bombs did 44 damage to dd   destroyer (#68) at -6,2
     Play#0 output Play#0 1     dd   destroyer (#68) takes 30
-    Play#0 output Play#0 1 dd   destroyer (#68) was bombed, and retreated to -4,4
+    Play#0 output Play#0 1 dd   destroyer (#68) retreats along path nn
+    Play#0 output Play#0 1 dd   destroyer (#68) stopped at -4,4
     Play#0 output Play#0 1 -6,2 takes 2% collateral damage
     Play#0 output Play#0 1 1 bombs did 52 damage to dd   destroyer (#69) at -6,2
     Play#0 output Play#0 1     dd   destroyer (#69) takes 35
-    Play#0 output Play#0 1 dd   destroyer (#69) was bombed, and retreated to -4,4
+    Play#0 output Play#0 1 dd   destroyer (#69) retreats along path nn
+    Play#0 output Play#0 1 dd   destroyer (#69) stopped at -4,4
     Play#0 output Play#0 1 -6,2 takes 3% collateral damage
     Play#0 output Play#0 1 Incoming 1 missile sighted at -6,2...
     Play#0 output Play#0 1 ...Incoming 1 missile missed
     Play#0 output Play#0 1 ...Incoming 1 missile HIT!
     Play#0 output Play#0 1
     Play#0 output Play#0 1     dd   destroyer (#83) takes 71
-    Play#0 output Play#0 1 dd   destroyer (#83) was damaged, and retreated to -4,4
+    Play#0 output Play#0 1 dd   destroyer (#83) retreats along path nn
+    Play#0 output Play#0 1 dd   destroyer (#83) stopped at -4,4
     Play#0 output Play#0 1 Incoming 1 missile sighted at -6,2...
     Play#0 output Play#0 1 ...Incoming 1 missile missed
     Play#0 output Play#0 1
     Play#0 output Play#0 1 -6,2 takes 6% collateral damage
     Play#0 output Play#0 1 sub in -1,3 torpedoed lc   light cruiser (#100) for 75 damage.
     Play#0 output Play#0 1     lc   light cruiser (#100) takes 50
-    Play#0 output Play#0 1 lc   light cruiser (#100) was hit by a torpedo, and retreated to 2,-6
+    Play#0 output Play#0 1 lc   light cruiser (#100) retreats along path nn
+    Play#0 output Play#0 1 lc   light cruiser (#100) stopped at 2,-6
     Play#0 output Play#0 1 Torpedo sighted @ -1,3 by lc   light cruiser (#101)
     Play#0 output Play#0 1 sub in -1,3 torpedoed lc   light cruiser (#102) for 44 damage.
     Play#0 output Play#0 1     lc   light cruiser (#102) takes 29
-    Play#0 output Play#0 1 lc   light cruiser (#102) was hit by a torpedo, and retreated to 2,-6
+    Play#0 output Play#0 1 lc   light cruiser (#102) retreats along path nn
+    Play#0 output Play#0 1 lc   light cruiser (#102) stopped at 2,-6
     Play#0 output Play#0 1 sub in -1,3 torpedoed lc   light cruiser (#103) for 95 damage.
     Play#0 output Play#0 1     lc   light cruiser (#103) takes 63
-    Play#0 output Play#0 1 lc   light cruiser (#103) was hit by a torpedo, and retreated to 2,-6
+    Play#0 output Play#0 1 lc   light cruiser (#103) retreats along path nn
+    Play#0 output Play#0 1 lc   light cruiser (#103) stopped at 2,-6
     Play#0 output Play#0 1 Torpedo sighted @ -1,3 by lc   light cruiser (#104)
     Play#0 output Play#0 1 Sonar ping from -6,0 detected by sb   submarine (#120)!
-    Play#0 output Play#0 1 sb   submarine (#120) detected a sonar ping, and retreated to -9,1
+    Play#0 output Play#0 1 sb   submarine (#120) retreats along path gg
+    Play#0 output Play#0 1 sb   submarine (#120) stopped at -9,1
     Play#0 output Play#0 1 1 dd   destroyer (#5) sighted at -5,1
     Play#0 output Play#0 1 tt   troop transport (#130) is being approached by dd   destroyer (#5)...
     Play#0 output Play#0 1 1 (#1) lost 1 troops trying to board tt   troop transport (#130)
     Play#0 output Play#0 1 We lost 0 troops defending
-    Play#0 output Play#0 1 tt   troop transport (#130) was boarded, and retreated to -9,1
+    Play#0 output Play#0 1 tt   troop transport (#130) retreats along path gg
+    Play#0 output Play#0 1 tt   troop transport (#130) stopped at -9,1
     Play#0 output Play#0 1 1 planes spotted over 0,2
     Play#0 output Play#0 1 1 pinpoint bombing raid did 44 damage to cav  cavalry #30
     Play#0 output Play#0 1     cav  cavalry #30 takes 17
-    Play#0 output Play#0 1 cav  cavalry #31 retreated with a bombed friend, and ended up at 2,2
-    Play#0 output Play#0 1 cav  cavalry #32 retreated with a bombed friend, and ended up at 2,2
-    Play#0 output Play#0 1 cav  cavalry #34 retreated with a bombed friend, and ended up at 2,2
-    Play#0 output Play#0 1 cav  cavalry #35 retreated with a bombed friend,
-    Play#0 output Play#0 1 but had no mobility, and couldn't retreat!
-    Play#0 output Play#0 1 cav  cavalry #36 retreated with a bombed friend, and ended up at 2,2
+    Play#0 output Play#0 1 cav  cavalry #31 is on a ship, and can't retreat!
+    Play#0 output Play#0 1 cav  cavalry #32 has no mil on it to guide it, and can't retreat!
+    Play#0 output Play#0 1 cav  cavalry #34 is on a unit, and can't retreat!
+    Play#0 output Play#0 1 cav  cavalry #35 has no mobility, and can't retreat!
+    Play#0 output Play#0 1 cav  cavalry #36 is on the trading block, and can't retreat!
     Play#0 output Play#0 1 0,2 takes 4% collateral damage
     Play#0 output Play#0 1     tra  train #9 takes 1
     Play#0 output Play#0 1 1 planes spotted over -1,1
     Play#0 output Play#0 1 1 pinpoint bombing raid did 40 damage to cav  cavalry #33
     Play#0 output Play#0 1     cav  cavalry #33 takes 15
-    Play#0 output Play#0 1 cav  cavalry #33 was bombed, and retreated to 1,1
+    Play#0 output Play#0 1 cav  cavalry #33 has been kidnapped by 1, and can't retreat!
     Play#0 output Play#0 1 1 pinpoint bombing raid did 24 damage to tra  train #37
     Play#0 output Play#0 1     tra  train #37 takes 14
-    Play#0 output Play#0 1 tra  train #37 was bombed,
-    Play#0 output Play#0 1 but could not retreat to 3,1!
+    Play#0 output Play#0 1 tra  train #37 is stuck off the rail system, and can't retreat!
     Play#0 output Play#0 1 1,1 takes 2% collateral damage
+    Play#0 output Play#0 1 1 planes spotted over -1,1
     Play#0 output Play#0 1 1 pinpoint bombing raid did 24 damage to cav  cavalry #40
     Play#0 output Play#0 1     cav  cavalry #40 takes 9
-    Play#0 output Play#0 1 cav  cavalry #40 was bombed,
-    Play#0 output Play#0 1 but ran out of mobility, and couldn't retreat fully!
+    Play#0 output Play#0 1 cav  cavalry #40 retreats along path nu
+    Play#0 output Play#0 1 cav  cavalry #40 is out of mobility & stays in 2,2
     Play#0 output Play#0 1 1,1 takes 2% collateral damage
+    Play#0 output Play#0 1 1 planes spotted over -1,1
     Play#0 output Play#0 1 1 planes spotted over 1,1
     Play#0 output Play#0 1 1 pinpoint bombing raid did 28 damage to cav  cavalry #41
     Play#0 output Play#0 1     cav  cavalry #41 takes 11
-    Play#0 output Play#0 1 cav  cavalry #41 was bombed,
-    Play#0 output Play#0 1 but could not retreat to 2,0!
+    Play#0 output Play#0 1 cav  cavalry #41 retreats along path jy
+    Play#0 output Play#0 1 cav  cavalry #41 stopped at 2,0
     Play#0 output Play#0 1 1,1 takes 3% collateral damage
     Play#0 output Play#0 1     tra  train #37 takes 1
+    Play#0 output Play#0 1 1 planes spotted over -1,1
     Play#0 output Play#0 1 1 pinpoint bombing raid did 36 damage to cav  cavalry #42
     Play#0 output Play#0 1     cav  cavalry #42 takes 14
-    Play#0 output Play#0 1 cav  cavalry #42 was bombed,
-    Play#0 output Play#0 1 but could not retreat to -1,1!
+    Play#0 output Play#0 1 cav  cavalry #42 retreats along path g
+    Play#0 output Play#0 1 can't go to -1,1
+    Play#0 output Play#0 1 cav  cavalry #42 stopped at 1,1
     Play#0 output Play#0 1 1,1 takes 4% collateral damage
     Play#0 output Play#0 1     tra  train #37 takes 1
+    Play#0 output Play#0 1 1 planes spotted over -1,1
     Play#0 output Play#0 1 1 planes spotted over 1,1
     Play#0 output Play#0 1 Flak! Firing flak guns from unit eng  engineer #44 (aa rating 1)
     Play#0 output Play#0 1 1 pinpoint bombing raid did 40 damage to eng  engineer #44
     Play#0 output Play#0 1     eng  engineer #44 takes 10
-    Play#0 output Play#0 1 eng  engineer #44 was bombed, and retreated to 1,-1
+    Play#0 output Play#0 1 eng  engineer #44 retreats along path yu
+    Play#0 output Play#0 1 eng  engineer #43 retreats with them
+    Play#0 output Play#0 1 Approaching minefield at 0,0...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 Sweep...
+    Play#0 output Play#0 1 eng  engineer #44 stopped at 1,-1
+    Play#0 output Play#0 1 eng  engineer #43 stopped at 1,-1
     Play#0 output Play#0 1 1,1 takes 4% collateral damage
     Play#0 output Play#0 1     tra  train #37 takes 1
+    Play#0 output Play#0 1 1 planes spotted over -1,1
     Play#0 output Play#0 1 1 planes spotted over 0,-2
     Play#0 output Play#0 1 1 pinpoint bombing raid did 28 damage to tra  train #45
     Play#0 output Play#0 1     tra  train #45 takes 16
-    Play#0 output Play#0 1 tra  train #45 was bombed,
-    Play#0 output Play#0 1 but could not retreat to 0,0!
-    Play#0 output Play#0 1 cav  cavalry #46 retreated with a bombed friend,
-    Play#0 output Play#0 1 and hit a mine in 0,0 while retreating!
-    Play#0 output Play#0 1     cav  cavalry #46 takes 8
+    Play#0 output Play#0 1 tra  train #45 retreats along path nb
+    Play#0 output Play#0 1 cav  cavalry #46 can't rail-march with the leading train, and can't retreat!
+    Play#0 output Play#0 1 no rail system in 0,0
+    Play#0 output Play#0 1 tra  train #45 stopped at 1,-1
     Play#0 output Play#0 1 0,-2 takes 3% collateral damage
     Play#0 output Play#0 1 1 planes spotted over 0,0
     Play#0 output Play#0 1 1 planes spotted over 1,-1
     Play#0 output Play#0 1 1 pinpoint bombing raid did 24 damage to cav  cavalry #47
     Play#0 output Play#0 1     cav  cavalry #47 takes 9
-    Play#0 output Play#0 1 cav  cavalry #47 was bombed,
-    Play#0 output Play#0 1 but could not retreat to -1,-1!
-    Play#0 output Play#0 1 spy  infiltrator #48 retreated with a bombed friend,
-    Play#0 output Play#0 1 but could not retreat to -1,-1!
+    Play#0 output Play#0 1 cav  cavalry #47 retreats along path gh
+    Play#0 output Play#0 1 spy  infiltrator #48 retreats with them
+    Play#0 output Play#0 1 cav  cavalry #47 can't go to -1,-1 & stays in 1,-1
+    Play#0 output Play#0 1 spy  infiltrator #48 stopped at -1,-1
     Play#0 output Play#0 1 1,-1 takes 2% collateral damage
     Play#0 output Play#0 1 1 planes spotted over 1,1
     Play#0 output Play#0 1 1 pinpoint bombing raid did 44 damage to cav  cavalry #10
     Play#0 output Play#0 1     cav  cavalry #10 takes 17
-    Play#0 output Play#0 1 cav  cavalry #10 was bombed, and retreated to 3,1
+    Play#0 output Play#0 1 cav  cavalry #10 retreats along path jh
+    Play#0 output Play#0 1 cav  cavalry #10 stopped at 3,1
     Play#0 output Play#0 1 1,1 takes 4% collateral damage
     Play#0 output Play#0 1     tra  train #37 takes 1
     Play#0 output Play#0 1 1 pinpoint bombing raid did 36 damage to cav  cavalry #10
-    Play#0 output Play#0 1     cav  cavalry #10 takes 14
-    Play#0 output Play#0 1 cav  cavalry #10 was bombed, and retreated to 3,1
+    Play#0 output Play#0 1     cav  cavalry #10 takes 27
+    Play#0 output Play#0 1 cav  cavalry #10 retreats along path h
+    Play#0 output Play#0 1 cav  cavalry #10 stopped at 3,1
     Play#0 output Play#0 1 3,1 takes 4% collateral damage
+    Play#0 output Play#0 1     cav  cavalry #10 takes 1
+    Play#0 output Play#0 1 1 planes spotted over -1,1
     Play#0 output Play#0 1 1 pinpoint bombing raid did 40 damage to cav  cavalry #10
-    Play#0 output Play#0 1     cav  cavalry #10 takes 15
-    Play#0 output Play#0 1 cav  cavalry #10 was bombed,
-    Play#0 output Play#0 1 but could not retreat to 3,-1!
+    Play#0 output Play#0 1     cav  cavalry #10 takes 30
+    Play#0 output Play#0 1 cav  cavalry #10 retreats along path uy
+    Play#0 output Play#0 1 cav  cavalry #10 stopped at 3,-1
     Play#0 output Play#0 1 3,1 takes 4% collateral damage
+    Play#0 output Play#0 1 1 planes spotted over -1,1
     Play#0 output Play#0 1 1 planes spotted over 3,1
     Play#0 output Play#0 1 1 pinpoint bombing raid did 24 damage to cav  cavalry #25
     Play#0 output Play#0 1     cav  cavalry #25 takes 9
-    Play#0 output Play#0 1 cav  cavalry #25 was bombed, and retreated to 2,2
-    Play#0 output Play#0 1 cav  cavalry #26 retreated with a bombed friend, and ended up at 4,0
-    Play#0 output Play#0 1 cav  cavalry #27 retreated with a bombed friend, and ended up at 4,0
-    Play#0 output Play#0 1 cav  cavalry #28 retreated with a bombed friend, and ended up at 2,2
-    Play#0 output Play#0 1 cav  cavalry #29 retreated with a bombed friend, and ended up at 3,1
+    Play#0 output Play#0 1 cav  cavalry #25 retreats along path bh
+    Play#0 output Play#0 1 cav  cavalry #28 retreats with them
+    Play#0 output Play#0 1 cav  cavalry #25 stopped at 2,2
+    Play#0 output Play#0 1 cav  cavalry #28 stopped at 2,2
     Play#0 output Play#0 1 3,1 takes 2% collateral damage
+    Play#0 output Play#0 1 1 planes spotted over -1,1
     Play#0 output Play#0 1 1 planes spotted over 0,0
     Play#0 output Play#0 1 1 pinpoint bombing raid did 72 damage to cav  cavalry #60
     Play#0 output Play#0 1     cav  cavalry #60 takes 27
-    Play#0 output Play#0 1 cav  cavalry #60 was damaged, and retreated to 3,1
+    Play#0 output Play#0 1 cav  cavalry #60 retreats along path nj
+    Play#0 output Play#0 1 cav  cavalry #60 stopped at 3,1
     Play#0 output Play#0 1 0,0 takes 7% collateral damage
     Play#0 output Play#0 1 0,0 takes 4% collateral damage
     Play#0 output Play#0 1 0,0 takes 3% collateral damage
     Play#0 output Play#0 1 0,0 takes 4% collateral damage
     Play#0 output Play#0 1 1 pinpoint bombing raid did 68 damage to cav  cavalry #64
     Play#0 output Play#0 1     cav  cavalry #64 takes 26
-    Play#0 output Play#0 1 cav  cavalry #64 was damaged, and retreated to 3,1
+    Play#0 output Play#0 1 cav  cavalry #64 retreats along path nj
+    Play#0 output Play#0 1 cav  cavalry #64 stopped at 3,1
     Play#0 output Play#0 1 0,0 takes 7% collateral damage
     Play#0 output Play#0 6 0 640
     Play#0 input ship *
     Play#0 output Play#0 1   2   11 lc   light cruis    1,3        93%   0  10   0   0  0  0  0  0 105   45
     Play#0 output Play#0 1   2   20 lc   light cruis   -3,1        96%   0   9   0   0  0  0  0  0 122   45
     Play#0 output Play#0 1   1   24 lc   light cruis   -4,2    g  100%   0  10   0   0  0  0  0  0 127   45
-    Play#0 output Play#0 1   2   25 lc   light cruis   -8,2    g   93%   0   9   0   0  0  0  0  0  93   45
-    Play#0 output Play#0 1   2   26 lc   light cruis   -4,4    g  100%   0  10   0   0  0  0  0  0 103   45
-    Play#0 output Play#0 1   2   27 lc   light cruis   -4,4    g  100%   0  10   0   0  0  0  0  0 103   45
+    Play#0 output Play#0 1   2   25 lc   light cruis   -8,2    g   93%   0   9   0   0  0  0  0  0  94   45
+    Play#0 output Play#0 1   2   26 lc   light cruis   -4,2    g  100%   0  10   0   0  0  0  0  0 127   45
+    Play#0 output Play#0 1   2   27 lc   light cruis   -4,2    g  100%   0  10   0   0  0  0  0  0 127   45
     Play#0 output Play#0 1   2   28 lc   light cruis   -8,2    g  100%   0  10   0   0  0  0  0  0 103   45
-    Play#0 output Play#0 1   2   29 lc   light cruis    1,3    g  100%   0  10   0   0  0  0  0  0 103   45
+    Play#0 output Play#0 1   2   29 lc   light cruis    5,3    g  100%   0  10   0   0  0  0  0  0 127   45
     Play#0 output Play#0 1   2   31 lc   light cruis    4,0        95%   0   9   0   0  0  0  0  0 121   45
     Play#0 output Play#0 1   2   32 lc   light cruis    0,2    c  100%   0   0   0   0  0  0  0  0 127   45
     Play#0 output Play#0 1   2   33 lc   light cruis    2,2        95%   0   9   0   0  0  0  0  0 121   45
     Play#0 output Play#0 1   2   34 lc   light cruis    3,1        94%   0  10   0   0  0  0  0  0 120   45
     Play#0 output Play#0 1   2   35 lc   light cruis    0,2    c  100%   0  10   0   0  0  0  0  1   0   45
-    Play#0 output Play#0 1   2   36 lc   light cruis    1,3    c  100%   0  10   0   0  0  0  0  0 115   45
+    Play#0 output Play#0 1   2   36 lc   light cruis    0,2    c  100%   0  10   0   0  0  0  0  0 127   45
     Play#0 output Play#0 1   2   40 lc   light cruis    1,3        91%   0   9   0   0  0  0  0  0  -7   45
     Play#0 output Play#0 1   2   41 lc   light cruis    1,3        96%   0   9   0   0  0  0  0  0 109   45
     Play#0 output Play#0 1   2   42 lc   light cruis   -4,2        95%   0  10   0   0  0  0  0  0 121   45
-    Play#0 output Play#0 1   2   43 ms   minesweeper   -8,4    m  100%   0  10   0   0  0  0  0  0  99   45
-    Play#0 output Play#0 1   2   44 ms   minesweeper   -6,4    m   64%   0   6   0   0  0  0  0  0  70   45
+    Play#0 output Play#0 1   2   43 ms   minesweeper   -6,4    m   87%   0   8   0   0  0  0  0  0  98   45
+    Play#0 output Play#0 1   2   44 ms   minesweeper   -6,4    m   68%   0   6   0   0  0  0  0  0  73   45
     Play#0 output Play#0 1   2   46 lc   light cruis    5,1    n   93%   0   9   0   0  0  0  0  0 118   45
     Play#0 output Play#0 1   2   47 pt   patrol boat    4,0    n  100%   0   2   0   0  0  0  0  0 117   45
-    Play#0 output Play#0 1   2   50 sb   submarine     -9,1        67%   0   7   0   0  0  0  0  0  33   60
-    Play#0 output Play#0 1   2   51 sb   submarine     -9,1        64%   0   7   0   0  0  0  0  0  28   60
-    Play#0 output Play#0 1   2   52 sb   submarine     -9,1        73%   0   7   0   0  0  0  0  0  45   60
+    Play#0 output Play#0 1   2   50 sb   submarine     -9,1        67%   0   7   0   0  0  0  0  0  34   60
+    Play#0 output Play#0 1   2   51 sb   submarine     -9,1        64%   0   7   0   0  0  0  0  0  29   60
+    Play#0 output Play#0 1   2   52 sb   submarine     -9,1        73%   0   7   0   0  0  0  0  0  46   60
     Play#0 output Play#0 1   2   53 sb   submarine     -4,-2       73%   0   7   0   0  0  0  0  0  92   60
     Play#0 output Play#0 1   2   60 dd   destroyer     -6,2       100%   0  10   0   0  0  0  0  0 127   70
-    Play#0 output Play#0 1   2   61 dd   destroyer     -4,4        73%   0   7   0   0  0  0  0  0  65   70
-    Play#0 output Play#0 1   2   62 dd   destroyer     -4,4        67%   0   7   0   0  0  0  0  0  55   70
+    Play#0 output Play#0 1   2   61 dd   destroyer     -4,4        73%   0   7   0   0  0  0  0  0  66   70
+    Play#0 output Play#0 1   2   62 dd   destroyer     -4,4        67%   0   7   0   0  0  0  0  0  56   70
     Play#0 output Play#0 1   2   63 dd   destroyer     -4,4        56%   0   5   0   0  0  0  0  0  37   70
-    Play#0 output Play#0 1   2   64 dd   destroyer     -4,4        67%   0   7   0   0  0  0  0  0  55   70
-    Play#0 output Play#0 1   2   65 dd   destroyer     -4,4        59%   0   6   0   0  0  0  0  0  40   70
-    Play#0 output Play#0 1   2   66 dd   destroyer     -4,4        67%   0   7   0   0  0  0  0  0  55   70
+    Play#0 output Play#0 1   2   64 dd   destroyer     -4,4        67%   0   7   0   0  0  0  0  0  56   70
+    Play#0 output Play#0 1   2   65 dd   destroyer     -4,4        59%   0   6   0   0  0  0  0  0  41   70
+    Play#0 output Play#0 1   2   66 dd   destroyer     -4,4        67%   0   7   0   0  0  0  0  0  56   70
     Play#0 output Play#0 1   2   67 dd   destroyer     -6,2       100%   0  10   0   0  0  0  0  0 127   70
     Play#0 output Play#0 1   2   68 dd   destroyer     -4,4        70%   0   7   0   0  0  0  0  0  61   70
     Play#0 output Play#0 1   2   69 dd   destroyer     -4,4        65%   0   7   0   0  0  0  0  0  53   70
     Play#0 output Play#0 1   2   82 dd   destroyer     -6,2       100%   0  10   0   0  0  0  0  0 127   70
     Play#0 output Play#0 1   2   83 dd   destroyer     -4,4        29%   0   3   0   0  0  0  0  0 -28   70
     Play#0 output Play#0 1   2   84 dd   destroyer     -6,2       100%   0  10   0   0  0  0  0  0 127   70
-    Play#0 output Play#0 1   2  100 lc   light cruis    2,-6       50%   0   5   0   0  0  0  0  0  15   45
+    Play#0 output Play#0 1   2  100 lc   light cruis    2,-6       50%   0   5   0   0  0  0  0  0  16   45
     Play#0 output Play#0 1   2  101 lc   light cruis    0,4       100%   0  10   0   0  0  0  0  0 127   45
-    Play#0 output Play#0 1   2  102 lc   light cruis    2,-6       71%   0   7   0   0  0  0  0  0  56   45
-    Play#0 output Play#0 1   2  103 lc   light cruis    2,-6       37%   0   3   0   0  0  0  0  0 -16   45
+    Play#0 output Play#0 1   2  102 lc   light cruis    2,-6       71%   0   7   0   0  0  0  0  0  57   45
+    Play#0 output Play#0 1   2  103 lc   light cruis    2,-6       37%   0   3   0   0  0  0  0  0 -15   45
     Play#0 output Play#0 1   2  104 lc   light cruis    0,4       100%   0  10   0   0  0  0  0  0 127   45
     Play#0 output Play#0 1   2  120 sb   submarine     -9,1       100%   0  10   0   0  0  0  0  0  93   60
-    Play#0 output Play#0 1   2  130 tt   troop trans   -9,1       100%   0  10   0   0  0  0  0  0  95   60
+    Play#0 output Play#0 1   2  130 tt   troop trans   -9,1       100%   0  10   0   0  0  0  0  0  96   60
     Play#0 output Play#0 1 57 ships
     Play#0 output Play#0 6 0 640
     Play#0 input retr * ?rflags#0
     Play#0 output Play#0 1   2   20 lc   light cruis   -3,1      u                   h
     Play#0 output Play#0 1   1   24 lc   light cruis   -4,2    g ggg        Yes      i
     Play#0 output Play#0 1   2   25 lc   light cruis   -8,2    g g          Yes      i
+    Play#0 output Play#0 1   2   26 lc   light cruis   -4,2    g bn                  i
+    Play#0 output Play#0 1   2   27 lc   light cruis   -4,2    g bn         Yes      i
     Play#0 output Play#0 1   2   28 lc   light cruis   -8,2    g g          Yes      b
-    Play#0 output Play#0 1   2   29 lc   light cruis    1,3    g g          Yes      i
+    Play#0 output Play#0 1   2   29 lc   light cruis    5,3    g ggg        Yes      i
     Play#0 output Play#0 1   2   31 lc   light cruis    4,0      n                   i
     Play#0 output Play#0 1   2   32 lc   light cruis    0,2    c n          Yes      i
     Play#0 output Play#0 1   2   33 lc   light cruis    2,2      n                   i
     Play#0 output Play#0 1   2   34 lc   light cruis    3,1      n                   i
     Play#0 output Play#0 1   2   35 lc   light cruis    0,2    c n          Yes      i
+    Play#0 output Play#0 1   2   36 lc   light cruis    0,2    c n          Yes      i
     Play#0 output Play#0 1   2   40 lc   light cruis    1,3      nnnh                i
     Play#0 output Play#0 1   2   41 lc   light cruis    1,3      uh                  i
     Play#0 output Play#0 1   2   42 lc   light cruis   -4,2      ugggh               i
+    Play#0 output Play#0 1   2   43 ms   minesweeper   -6,4    m g          Yes      i
     Play#0 output Play#0 1   2   44 ms   minesweeper   -6,4    m g          Yes      i
     Play#0 output Play#0 1   2   46 lc   light cruis    5,1    n y          Yes      i
     Play#0 output Play#0 1   2   53 sb   submarine     -4,-2     gg                  h
     Play#0 output Play#0 1   2   84 dd   destroyer     -6,2      nn                  ihb
     Play#0 output Play#0 1   2  101 lc   light cruis    0,4      nn                  ith
     Play#0 output Play#0 1   2  104 lc   light cruis    0,4      nn                  ith
-    Play#0 output Play#0 1 27 ships
+    Play#0 output Play#0 1 31 ships
     Play#0 output Play#0 6 0 639
     Play#0 input miss s * ?mission#0 q
     Play#0 command mission
     Play#0 output Play#0 1 Thing                        x,y     op-sect  rad mission
     Play#0 output Play#0 1 lc   light cruiser (#20)    -3,1      -3,1      1 is on an interdiction mission
+    Play#0 output Play#0 1 lc   light cruiser (#26)    -4,2      -4,2      1 is on an interdiction mission
+    Play#0 output Play#0 1 lc   light cruiser (#27)    -4,2      -4,2      1 is on an interdiction mission
+    Play#0 output Play#0 1 lc   light cruiser (#29)     5,3       5,3      1 is on an interdiction mission
     Play#0 output Play#0 1 lc   light cruiser (#31)     4,0       4,0      1 is on an interdiction mission
     Play#0 output Play#0 1 lc   light cruiser (#32)     0,2       0,2      1 is on an interdiction mission
     Play#0 output Play#0 1 lc   light cruiser (#33)     2,2       2,2      1 is on an interdiction mission
     Play#0 output Play#0 1 lc   light cruiser (#34)     3,1       3,1      1 is on an interdiction mission
     Play#0 output Play#0 1 lc   light cruiser (#35)     0,2       0,2      1 is on an interdiction mission
+    Play#0 output Play#0 1 lc   light cruiser (#36)     0,2       0,2      1 is on an interdiction mission
     Play#0 output Play#0 1 lc   light cruiser (#42)    -4,2      -4,2      1 is on an interdiction mission
     Play#0 output Play#0 1 lc   light cruiser (#46)     5,1       5,1      1 is on an interdiction mission
     Play#0 output Play#0 1 sb   submarine (#53)        -4,-2     -4,-2     1 is on an interdiction mission
     Play#0 output Play#0 1   1    4 inf  infantry     -4,0    a  100%  10   0 127   0  50  42%  0  0
     Play#0 output Play#0 1   1    7 inf  infantry     -4,0    a  100%  10   0 127   0  50  42%  0  0
     Play#0 output Play#0 1   2    9 tra  train         0,2        99%  10 127 126   0  50  42%  0  1
-    Play#0 output Play#0 1   2   10 cav  cavalry       4,0        61%   6 127  61   0  50  42%  0  0
+    Play#0 output Play#0 1   2   10 cav  cavalry       3,-1       42%   4   0  29   0  50  42%  0  0
     Play#0 output Play#0 1   1   24 cav  cavalry       3,1    g   98%  10   0 125   0  50  42%  0  0
-    Play#0 output Play#0 1   2   25 cav  cavalry       2,2    g   91%   9 127  96   0  50  42%  0  0
-    Play#0 output Play#0 1   2   26 cav  cavalry       4,0    g  100%  10 127 117   0  50  42%  0  0
-    Play#0 output Play#0 1   2   27 cav  cavalry       4,0    g  100%  10 127 117   0  50  42%  0  0
-    Play#0 output Play#0 1   2   28 cav  cavalry       2,2    g  100%  10 127 107   0  50  42%  0  0
-    Play#0 output Play#0 1   2   29 cav  cavalry       3,1    g  100%  10 127 116   0  50  42%  0  0
-    Play#0 output Play#0 1   2   31 cav  cavalry       2,2    c  100%  10 127 107   0  50  42%  0  0   35S
-    Play#0 output Play#0 1   2   32 cav  cavalry       2,2    c  100%   0 127 107   0  50  42%  0  0
-    Play#0 output Play#0 1   2   33 cav  cavalry       1,1        85%   9 127  98   0  50  42%  0  0
-    Play#0 output Play#0 1   2   34 cav  cavalry       2,2    c  100%  10 127 107   0  50  42%  0  0    9L
+    Play#0 output Play#0 1   2   25 cav  cavalry       2,2    g   91%   9   0  96   0  50  42%  0  0
+    Play#0 output Play#0 1   2   26 cav  cavalry       3,1    g  100%  10 127 127   0  50  42%  0  0
+    Play#0 output Play#0 1   2   27 cav  cavalry       3,1    g  100%  10 127 127   0  50  42%  0  0
+    Play#0 output Play#0 1   2   28 cav  cavalry       2,2    g  100%  10   0 107   0  50  42%  0  0
+    Play#0 output Play#0 1   2   29 cav  cavalry       4,0    g  100%  10 127 127   0  50  42%  0  0
+    Play#0 output Play#0 1   2   31 cav  cavalry       0,2    c  100%  10 127 127   0  50  42%  0  0   35S
+    Play#0 output Play#0 1   2   32 cav  cavalry       0,2    c  100%   0 127 127   0  50  42%  0  0
+    Play#0 output Play#0 1   2   33 cav  cavalry      -1,1        85%   9 127 108   0  50  42%  0  0
+    Play#0 output Play#0 1   2   34 cav  cavalry       0,2    c  100%  10 127 127   0  50  42%  0  0    9L
     Play#0 output Play#0 1   2   35 cav  cavalry       0,2    c  100%  10 127   0   0  50  42%  0  0
-    Play#0 output Play#0 1   2   36 cav  cavalry       2,2    c  100%  10 127 107   0  50  42%  0  0
-    Play#0 output Play#0 1   2   37 tra  train         1,1        82%   8 127 105   0  50  42%  0  0
-    Play#0 output Play#0 1   2   40 cav  cavalry       2,2        91%   9 127 -14   0  50  42%  0  0
-    Play#0 output Play#0 1   2   41 cav  cavalry       3,1        89%   9 127 103   0  50  42%  0  0
+    Play#0 output Play#0 1   2   36 cav  cavalry       0,2    c  100%  10 127 127   0  50  42%  0  0
+    Play#0 output Play#0 1   2   37 tra  train         1,1        82%   9 127 105   0  50  42%  0  0
+    Play#0 output Play#0 1   2   40 cav  cavalry       2,2        91%   9   0 -14   0  50  42%  0  0
+    Play#0 output Play#0 1   2   41 cav  cavalry       2,0        89%   9   0  44   0  50  42%  0  0
     Play#0 output Play#0 1   2   42 cav  cavalry       1,1        86%   9 127 109   0  50  42%  0  0
-    Play#0 output Play#0 1   2   43 eng  engineer      1,1    m  100%  10 127 127   0 130  42%  0  0
-    Play#0 output Play#0 1   2   44 eng  engineer      1,-1   m   90%   9 127  88   0 130  42%  0  0
-    Play#0 output Play#0 1   2   45 tra  train         1,-1   t   84%   9 127  65   0  50  42%  0  0
-    Play#0 output Play#0 1   2   46 cav  cavalry       0,0    t   92%   9 127  99   0  50  42%  0  0
+    Play#0 output Play#0 1   2   43 eng  engineer      1,-1   m  100%  10   0  89   0 130  42%  0  0
+    Play#0 output Play#0 1   2   44 eng  engineer      1,-1   m   90%   9   0  76   0 130  42%  0  0
+    Play#0 output Play#0 1   2   45 tra  train         1,-1   t   84%   9   0  65   0  50  42%  0  0
+    Play#0 output Play#0 1   2   46 cav  cavalry       0,-2   t  100%  10 127 127   0  50  42%  0  0
     Play#0 output Play#0 1   2   47 cav  cavalry       1,-1   s   91%   9 127 115   0  50  42%  0  0
-    Play#0 output Play#0 1   2   48 spy  infiltrato    1,-1   s  100%   0 127 127   0  50  42%  0  0
-    Play#0 output Play#0 1   2   60 cav  cavalry       3,1        73%   7 127  71   0  50  42%  0  0
+    Play#0 output Play#0 1   2   48 spy  infiltrato   -1,-1   s  100%   0   0 116   0  50  42%  0  0
+    Play#0 output Play#0 1   2   60 cav  cavalry       3,1        73%   7   0  72   0  50  42%  0  0
     Play#0 output Play#0 1   2   61 cav  cavalry       0,0       100%  10 127 127   0  50  42%  0  0
     Play#0 output Play#0 1   2   62 cav  cavalry       0,0       100%  10 127 127   0  50  42%  0  0
     Play#0 output Play#0 1   2   63 cav  cavalry       0,0       100%  10 127 127   0  50  42%  0  0
-    Play#0 output Play#0 1   2   64 cav  cavalry       3,1        74%   7 127  72   0  50  42%  0  0
+    Play#0 output Play#0 1   2   64 cav  cavalry       3,1        74%   7   0  73   0  50  42%  0  0
     Play#0 output Play#0 1 35 units
     Play#0 output Play#0 6 0 637
     Play#0 input lretr * ?rflags#0
     Play#0 output Play#0 1   1    2 inf  infantry      -3,1      yujnbgyuj           ihb
     Play#0 output Play#0 1   1    4 inf  infantry      -4,0    a b          Yes      h
     Play#0 output Play#0 1   1    7 inf  infantry      -4,0    a b          Yes      h
-    Play#0 output Play#0 1   2   10 cav  cavalry        4,0      y                   b
     Play#0 output Play#0 1   1   24 cav  cavalry        3,1    g bhg        Yes      b
     Play#0 output Play#0 1   2   25 cav  cavalry        2,2    g g          Yes      b
+    Play#0 output Play#0 1   2   26 cav  cavalry        3,1    g uh                  b
+    Play#0 output Play#0 1   2   27 cav  cavalry        3,1    g uh         Yes      b
     Play#0 output Play#0 1   2   28 cav  cavalry        2,2    g g          Yes      i
-    Play#0 output Play#0 1   2   29 cav  cavalry        3,1    g g          Yes      b
+    Play#0 output Play#0 1   2   29 cav  cavalry        4,0    g bhg        Yes      b
+    Play#0 output Play#0 1   2   31 cav  cavalry        0,2    c j          Yes      b
+    Play#0 output Play#0 1   2   32 cav  cavalry        0,2    c j          Yes      b
+    Play#0 output Play#0 1   2   33 cav  cavalry       -1,1      j                   b
+    Play#0 output Play#0 1   2   34 cav  cavalry        0,2    c j          Yes      b
     Play#0 output Play#0 1   2   35 cav  cavalry        0,2    c j          Yes      b
+    Play#0 output Play#0 1   2   36 cav  cavalry        0,2    c j          Yes      b
     Play#0 output Play#0 1   2   37 tra  train          1,1      j                   b
     Play#0 output Play#0 1   2   40 cav  cavalry        2,2      u                   b
-    Play#0 output Play#0 1   2   41 cav  cavalry        3,1      y                   b
     Play#0 output Play#0 1   2   42 cav  cavalry        1,1      g                   b
-    Play#0 output Play#0 1   2   43 eng  engineer       1,1    m yu         Yes      b
     Play#0 output Play#0 1   2   45 tra  train          1,-1   t b          Yes      b
+    Play#0 output Play#0 1   2   46 cav  cavalry        0,-2   t nb         Yes      b
     Play#0 output Play#0 1   2   47 cav  cavalry        1,-1   s gh         Yes      b
-    Play#0 output Play#0 1   2   48 spy  infiltrator    1,-1   s gh         Yes      b
     Play#0 output Play#0 1   2   61 cav  cavalry        0,0      nj                  ihb
     Play#0 output Play#0 1   2   62 cav  cavalry        0,0      nj                  ihb
     Play#0 output Play#0 1   2   63 cav  cavalry        0,0      nj                  ihb
-    Play#0 output Play#0 1 20 units
+    Play#0 output Play#0 1 24 units
     Play#0 output Play#0 6 0 636
     Play#0 input miss l * ?mission#0 q
     Play#0 command mission
     Play#0 output Play#0 1 Thing                        x,y     op-sect  rad mission
+    Play#0 output Play#0 1 cav  cavalry #26             3,1       3,1      3 is on a reserve mission
+    Play#0 output Play#0 1 cav  cavalry #27             3,1       3,1      3 is on a reserve mission
+    Play#0 output Play#0 1 cav  cavalry #29             4,0       4,0      3 is on a reserve mission
+    Play#0 output Play#0 1 cav  cavalry #31             0,2       0,2      3 is on a reserve mission
+    Play#0 output Play#0 1 cav  cavalry #32             0,2       0,2      3 is on a reserve mission
+    Play#0 output Play#0 1 cav  cavalry #33            -1,1      -1,1      3 is on a reserve mission
+    Play#0 output Play#0 1 cav  cavalry #34             0,2       0,2      3 is on a reserve mission
     Play#0 output Play#0 1 cav  cavalry #35             0,2       0,2      3 is on a reserve mission
+    Play#0 output Play#0 1 cav  cavalry #36             0,2       0,2      3 is on a reserve mission
     Play#0 output Play#0 1 cav  cavalry #42             1,1       1,1      3 is on a reserve mission
-    Play#0 output Play#0 1 eng  engineer #43            1,1       1,1      1 is on a reserve mission
+    Play#0 output Play#0 1 cav  cavalry #46             0,-2      0,-2     3 is on a reserve mission
     Play#0 output Play#0 1 cav  cavalry #47             1,-1      1,-1     3 is on a reserve mission
-    Play#0 output Play#0 1 spy  infiltrator #48         1,-1      1,-1     3 is on a reserve mission
     Play#0 output Play#0 1 cav  cavalry #61             0,0       0,0      3 is on a reserve mission
     Play#0 output Play#0 1 cav  cavalry #62             0,0       0,0      3 is on a reserve mission
     Play#0 output Play#0 1 cav  cavalry #63             0,0       0,0      3 is on a reserve mission