diff --git a/src/lib/commands/retr.c b/src/lib/commands/retr.c index 2504da50..02acb4a4 100644 --- a/src/lib/commands/retr.c +++ b/src/lib/commands/retr.c @@ -29,7 +29,7 @@ * Known contributors to this file: * Ken Stevens, 1995 * Steve McClure, 2000 - * Markus Armbruster, 2008-2014 + * Markus Armbruster, 2008-2015 */ #include @@ -51,6 +51,7 @@ static char shp_rflagsc[] = "Xitshbdu"; static char lnd_rflagsc[] = "XiXXhbXX"; static int retreat(int); +static int retreat_show(int, struct nstr_item *); int retr(void) @@ -72,8 +73,7 @@ retreat(int type) struct nstr_item ni; union empobj_storage unit; int i, rflags, ch, j; - char *rflagsc, *p, *name, *rpath, *what; - int *rflagsp; + char *rflagsc, *p; char buf1[1024]; char buf2[1024]; @@ -83,7 +83,6 @@ retreat(int type) if (!snxtitem(&ni, type, player->argp[1], NULL)) return RET_SYN; - nunits = 0; if (player->argp[1] && !player->argp[2]) { pr("Omitting the second argument is deprecated and will cease to work in a\n" @@ -101,21 +100,21 @@ retreat(int type) return RET_SYN; } - rflags = 0; - if (*pq == 'q') { - pq = NULL; - } else { - for (i = 0; i < RET_LEN - 1 && pq[i]; i++) { - if (chkdir(pq[i], DIR_STOP, DIR_LAST) < 0) { - pr("'%c' is not a valid direction...\n", pq[i]); - direrr(NULL, NULL, NULL); - return RET_SYN; - } + if (*pq == 'q') + return retreat_show(type, &ni); + + for (i = 0; i < RET_LEN - 1 && pq[i]; i++) { + if (chkdir(pq[i], DIR_STOP, DIR_LAST) < 0) { + pr("'%c' is not a valid direction...\n", pq[i]); + direrr(NULL, NULL, NULL); + return RET_SYN; } - for (i--; i >= 0 && pq[i] == dirch[DIR_STOP]; i--) - pq[i] = 0; } - if (pq && *pq) { + for (i--; i >= 0 && pq[i] == dirch[DIR_STOP]; i--) + pq[i] = 0; + + rflags = 0; + if (*pq) { again: fl = getstarg(player->argp[3], "Retreat conditions ('?' to list available ones)? ", @@ -154,7 +153,43 @@ retreat(int type) rflags = 0; } + nunits = 0; while (nxtitem(&ni, &unit)) { + if (!player->owner || unit.gen.own == 0) + continue; + if (type == EF_SHIP) { + strncpy(unit.ship.shp_rpath, pq, RET_LEN - 1); + unit.ship.shp_rflags = rflags; + } else { + strncpy(unit.land.lnd_rpath, pq, RET_LEN - 1); + unit.land.lnd_rflags = rflags; + } + put_empobj(type, unit.gen.uid, &unit); + nunits++; + } + if (rflags) { + symbol_set_fmt(buf2, sizeof(buf2), rflags & ~RET_GROUP, + retreat_flags, ", ", 0); + pr("%d %s%s ordered to retreat%s along path %s when %s\n", + nunits, ef_nameof_pretty(type), splur(nunits), + rflags & RET_GROUP ? " as group" : "", pq, buf2); + } else + pr("%d %s%s ordered not to retreat\n", + nunits, ef_nameof_pretty(type), splur(nunits)); + return RET_OK; +} + +static int +retreat_show(int type, struct nstr_item *np) +{ + char *rflagsc = type == EF_SHIP ? shp_rflagsc : lnd_rflagsc; + union empobj_storage unit; + int nunits; + char *name, *rpath, *what; + int *rflagsp, rflags, i; + + nunits = 0; + while (nxtitem(np, &unit)) { if (!player->owner || unit.gen.own == 0) continue; if (type == EF_SHIP) { @@ -176,14 +211,9 @@ retreat(int type) rpath = unit.land.lnd_rpath; rflagsp = &unit.land.lnd_rflags; } - if (pq) { - strncpy(rpath, pq, RET_LEN - 1); - *rflagsp = rflags; - put_empobj(type, unit.gen.uid, &unit); - } if (player->god) pr("%3d ", unit.gen.own); - pr("%4d ", ni.cur); + pr("%4d ", np->cur); pr("%-16.16s ", name); prxy("%4d,%-4d ", unit.gen.x, unit.gen.y); pr("%1.1s", &unit.gen.group); @@ -193,11 +223,11 @@ retreat(int type) pr("Yes "); else pr(" "); - for (j = 1; rflagsc[j]; j++) { - if ((1 << j) & rflags) { - if (CANT_HAPPEN(rflagsc[j] == 'X')) + for (i = 1; rflagsc[i]; i++) { + if ((1 << i) & rflags) { + if (CANT_HAPPEN(rflagsc[i] == 'X')) continue; - pr("%c", rflagsc[j]); + pr("%c", rflagsc[i]); } } pr("\n"); diff --git a/tests/retreat/journal.log b/tests/retreat/journal.log index 99d522c9..46abb1c3 100644 --- a/tests/retreat/journal.log +++ b/tests/retreat/journal.log @@ -50,22 +50,15 @@ Play#1 output Play#1 6 0 639 Play#1 input retr 2/3 bgyujnbgyujnbgyujn itshbdu Play#1 command retreat - Play#1 output Play#1 1 shp# ship type x,y fl path as flt? flags - Play#1 output Play#1 1 2 lc light cruis -3,1 bgyujnbgy itshbdu - Play#1 output Play#1 1 3 lc light cruis -3,1 a bgyujnbgy itshbdu - Play#1 output Play#1 1 2 ships + Play#1 output Play#1 1 2 ships ordered to retreat along path bgyujnbgyujnbgyujn when injured, torpedoed, sonared, helpless, bombed, depth-charged, boarded Play#1 output Play#1 6 0 638 Play#1 input retr 3 h Play#1 command retreat - Play#1 output Play#1 1 shp# ship type x,y fl path as flt? flags - Play#1 output Play#1 1 3 lc light cruis -3,1 a - Play#1 output Play#1 1 1 ship + Play#1 output Play#1 1 1 ship ordered not to retreat Play#1 output Play#1 6 0 637 Play#1 input retr a ?uid=4 b h Play#1 command retreat - Play#1 output Play#1 1 shp# ship type x,y fl path as flt? flags - Play#1 output Play#1 1 4 lc light cruis -5,1 a b Yes h - Play#1 output Play#1 1 1 ship + Play#1 output Play#1 1 1 ship ordered to retreat as group along path b when helpless Play#1 output Play#1 6 0 636 Play#1 input fleet a 7 Play#1 command fleetadd @@ -115,22 +108,15 @@ Play#1 output Play#1 6 0 634 Play#1 input lret 2/3 yujnbgyujnbgyujnbg ihb Play#1 command lretreat - Play#1 output Play#1 1 lnd# unit type x,y ar path as army? flags - Play#1 output Play#1 1 2 inf infantry -3,1 yujnbgyuj ihb - Play#1 output Play#1 1 3 inf infantry -3,1 a yujnbgyuj ihb - Play#1 output Play#1 1 2 units + Play#1 output Play#1 1 2 land units ordered to retreat along path yujnbgyujnbgyujnbg when injured, helpless, bombed Play#1 output Play#1 6 0 633 Play#1 input lret 3 h Play#1 command lretreat - Play#1 output Play#1 1 lnd# unit type x,y ar path as army? flags - Play#1 output Play#1 1 3 inf infantry -3,1 a - Play#1 output Play#1 1 1 unit + Play#1 output Play#1 1 1 land unit ordered not to retreat Play#1 output Play#1 6 0 632 Play#1 input lret a ?uid=4 b h Play#1 command lretreat - Play#1 output Play#1 1 lnd# unit type x,y ar path as army? flags - Play#1 output Play#1 1 4 inf infantry -4,0 a b Yes h - Play#1 output Play#1 1 1 unit + Play#1 output Play#1 1 1 land unit ordered to retreat as group along path b when helpless Play#1 output Play#1 6 0 631 Play#1 input army a 7 Play#1 command army