From ff826d2582db6ecc5d33df6e38772e99013b802a Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 22 Jan 2014 20:46:53 +0100 Subject: [PATCH] retreat: Don't consume a retreat direction that wasn't followed When a retreating ship or land unit runs into a sector it can't enter, it stops. The direction character that led it there is consumed, even though it could not be followed. The next retreat will then attempt to follow the rest of the path. Don't do that. Signed-off-by: Markus Armbruster --- src/lib/subs/retreat.c | 16 ++++++++++++---- tests/retreat/final.xdump | 10 +++++----- tests/retreat/journal.log | 10 +++++----- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/lib/subs/retreat.c b/src/lib/subs/retreat.c index d850aa0c..f5655d7f 100644 --- a/src/lib/subs/retreat.c +++ b/src/lib/subs/retreat.c @@ -201,9 +201,11 @@ retreat_ship1(struct shpstr *sp, char code, int orig) return 0; } dir = chkdir(sp->shp_rpath[0], DIR_STOP, DIR_LAST); - memmove(sp->shp_rpath, sp->shp_rpath+1, sizeof(sp->shp_rpath) - 1); - if (dir == DIR_STOP || CANT_HAPPEN(dir < 0)) + if (dir == DIR_STOP || CANT_HAPPEN(dir < 0)) { + memmove(sp->shp_rpath, sp->shp_rpath + 1, + sizeof(sp->shp_rpath) - 1); break; + } dx = diroff[dir][0]; dy = diroff[dir][1]; @@ -227,6 +229,8 @@ retreat_ship1(struct shpstr *sp, char code, int orig) 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); mines = sect.sct_mines; changed = 0; @@ -383,9 +387,11 @@ retreat_land1(struct lndstr *lp, char code, int orig) return 0; } dir = chkdir(lp->lnd_rpath[0], DIR_STOP, DIR_LAST); - memmove(lp->lnd_rpath, lp->lnd_rpath+1, sizeof(lp->lnd_rpath) - 1); - if (dir == DIR_STOP || CANT_HAPPEN(dir < 0)) + if (dir == DIR_STOP || CANT_HAPPEN(dir < 0)) { + memmove(lp->lnd_rpath, lp->lnd_rpath + 1, + sizeof(lp->lnd_rpath) - 1); break; + } dx = diroff[dir][0]; dy = diroff[dir][1]; @@ -410,6 +416,8 @@ retreat_land1(struct lndstr *lp, char code, int orig) 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); mines = SCT_LANDMINES(§); if (mines <= 0 || sect.sct_oldown == lp->lnd_own) diff --git a/tests/retreat/final.xdump b/tests/retreat/final.xdump index e8fa5cf9..a14d0bd5 100644 --- a/tests/retreat/final.xdump +++ b/tests/retreat/final.xdump @@ -188,8 +188,8 @@ uid owner xloc yloc type effic mobil off tech opx opy mission radius fleet xstar 38 0 0 0 0 0 127 0 0 0 0 none 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 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 "" 0 "" 0 0 0 () "" 39 0 0 0 0 0 127 0 0 0 0 none 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 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 "" 0 "" 0 0 0 () "" 40 2 1 3 10 91 -7 0 45 0 2 none 1 "" 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 "" 40 "" -3 1 1 (injured) "nnnh" -41 2 1 3 10 96 108 0 45 0 2 none 1 "" 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 "" 41 "" -3 1 1 (injured) "h" -42 2 -4 2 10 95 120 0 45 -4 2 interdiction 1 "" 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 "" 42 "" -3 1 1 (injured) "gggh" +41 2 1 3 10 96 108 0 45 0 2 none 1 "" 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 "" 41 "" -3 1 1 (injured) "uh" +42 2 -4 2 10 95 120 0 45 -4 2 interdiction 1 "" 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 "" 42 "" -3 1 1 (injured) "ugggh" 43 2 -6 4 16 76 86 0 40 0 0 none 0 "m" 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 3 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 "" 43 "" -3 1 1 (group injured) "g" 44 2 -6 4 16 63 70 0 40 0 0 none 0 "m" 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 "" 44 "" -3 1 1 (group injured) "g" 45 0 0 0 0 0 127 0 0 0 0 none 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 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 0 0 "" 0 "" 0 0 0 () "" @@ -363,7 +363,7 @@ uid owner xloc yloc type effic mobil off tech opx opy mission radius army ship h 7 0 0 0 0 0 127 0 0 0 0 none 0 "" -1 127 0 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0 8 0 0 0 0 0 127 0 0 0 0 none 0 "" -1 127 0 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0 9 2 1 1 7 93 119 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 0 0 none 0 "" -1 127 42 () "" 0 6 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 0 0 none 0 "" -1 127 42 (bombed) "y" 0 6 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0 11 0 0 0 0 0 127 0 0 0 0 none 0 "" -1 127 0 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0 12 0 0 0 0 0 127 0 0 0 0 none 0 "" -1 127 0 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0 13 0 0 0 0 0 127 0 0 0 0 none 0 "" -1 127 0 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0 @@ -394,8 +394,8 @@ uid owner xloc yloc type effic mobil off tech opx opy mission radius army ship h 38 0 0 0 0 0 127 0 0 0 0 none 0 "" -1 127 0 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0 39 0 0 0 0 0 127 0 0 0 0 none 0 "" -1 127 0 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0 40 2 2 2 0 89 -15 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 86 99 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 -42 2 1 1 0 83 105 0 50 1 1 reserve 3 "" -1 127 42 () "" 0 9 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0 +41 2 3 1 0 86 99 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 +42 2 1 1 0 83 105 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 0 0 15 96 110 0 130 0 0 none 0 "m" -1 127 42 (group bombed) "u" 0 10 2 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0 44 2 0 0 15 90 103 0 130 0 0 none 0 "m" -1 127 42 (group bombed) "u" 0 10 3 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0 45 0 0 0 0 0 127 0 0 0 0 none 0 "" -1 127 0 () "" 0 10 0 0 0 0 0 0 0 0 0 0 0 0 healthy 0 -1 0 diff --git a/tests/retreat/journal.log b/tests/retreat/journal.log index ab636403..5fb499dc 100644 --- a/tests/retreat/journal.log +++ b/tests/retreat/journal.log @@ -1550,8 +1550,8 @@ Play#0 output Play#0 1 2 34 cs cargo ship 3,1 n i Play#0 output Play#0 1 2 35 cs cargo ship 0,2 n 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 h i - Play#0 output Play#0 1 2 42 lc light cruis -4,2 gggh 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 50 sb submarine -9,1 @@ -1615,15 +1615,15 @@ Play#0 output Play#0 1 own lnd# unit type x,y ar path as army? flags Play#0 output Play#0 1 1 2 inf infantry -3,1 yujnbgyuj ihb Play#0 output Play#0 1 2 9 tra train 1,1 - Play#0 output Play#0 1 2 10 cav cavalry 4,0 + Play#0 output Play#0 1 2 10 cav cavalry 4,0 y b Play#0 output Play#0 1 2 31 cav cavalry 0,2 j b Play#0 output Play#0 1 2 32 cav cavalry 3,1 Play#0 output Play#0 1 2 33 cav cavalry 1,1 Play#0 output Play#0 1 2 34 cav cavalry 1,1 j b Play#0 output Play#0 1 2 35 cav cavalry 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 - Play#0 output Play#0 1 2 42 cav cavalry 1,1 + 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 0,0 m u Yes b Play#0 output Play#0 1 2 44 eng engineer 0,0 m u Yes b Play#0 output Play#0 1 2 60 cav cavalry 3,1