* Known contributors to this file:
* Ken Stevens, 1995
* Steve McClure, 2000
- * Markus Armbruster, 2008-2014
+ * Markus Armbruster, 2008-2015
*/
#include <config.h>
static char lnd_rflagsc[] = "XiXXhbXX";
static int retreat(int);
+static int retreat_show(int, struct nstr_item *);
int
retr(void)
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];
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"
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)? ",
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) {
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);
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");
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
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