/*
* 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);
}
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;
+ }
+ 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)? ",
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");