/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2015, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2021, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure, Markus Armbruster
*
* Empire is free software: you can redistribute it and/or modify
* 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)
+c_retreat(void)
{
return retreat(EF_SHIP);
}
int
-lretr(void)
+c_lretreat(void)
{
return retreat(EF_LAND);
}
int nunits;
struct nstr_item ni;
union empobj_storage unit;
- int rflags, ch, j;
- unsigned i;
- char *rflagsc, *p, *name, *rpath, *what;
- int *rflagsp;
+ int i, rflags, ch, j;
+ 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[2] != NULL) {
- pq = getstarg(player->argp[2], "Retreat path? ", buf1);
- 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 (player->argp[1] && !player->argp[2]) {
+ pr("Omitting the second argument is deprecated and will cease to work in a\n"
+ "future release. Please use '%s q' to query retreat orders.\n\n",
+ player->combuf);
+ pq = "q";
+ } else {
+ /*
+ * TODO getpath() or similar would be nice once the deprecated
+ * syntax is gone.
+ */
+ pq = getstarg(player->argp[2], "Retreat path, or q to query? ",
+ buf1);
+ if (!pq || !*pq)
+ 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;
}
- } else
- pq = NULL;
+ }
+ for (i--; i >= 0 && pq[i] == dirch[DIR_STOP]; i--)
+ pq[i] = 0;
rflags = 0;
- if (pq != NULL) {
+ if (*pq) {
again:
fl = getstarg(player->argp[3],
"Retreat conditions ('?' to list available ones)? ",
for (i = 0; fl[i]; i++) {
ch = tolower(fl[i]);
if (ch == 'c') {
+ /* Deprecated, but keeping it around doesn't hurt */
*pq = 0;
break;
}
rflagsc[j],
symbol_by_value(1 << j, retreat_flags));
}
- pr("c\tcancel retreat order\n");
goto again;
}
p = strchr(rflagsc, ch);
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");