Clean up and improve retreat condition handling

Change retreat condition prompt to point to help.  Before, it listed
conditions rather cryptically, without mentioning how to get help.

Don't provide help when encountering a bad retreat condition
character.

Fail the command when encountering a bad retreat condition character.
Before, they were dropped.

Don't fail the command when the player asks for help at the condition
code prompt.

Retreat condition help failed to explain 'c'.
This commit is contained in:
Markus Armbruster 2008-07-06 14:19:07 -04:00
parent 700089dd42
commit bb5dfd803b

View file

@ -30,6 +30,7 @@
* Known contributors to this file: * Known contributors to this file:
* Ken Stevens, 1995 * Ken Stevens, 1995
* Steve McClure, 2000 * Steve McClure, 2000
* Markus Armbruster, 2008
*/ */
#include <config.h> #include <config.h>
@ -42,6 +43,14 @@
#include "retreat.h" #include "retreat.h"
#include "ship.h" #include "ship.h"
/*
* Retreat flag characters
* 'X' means flag is not available
* Must agree with RET_ defines.
*/
static char shp_rflagsc[] = "Xitshbdu";
static char lnd_rflagsc[] = "XiXXhbXX";
static int retreat(short); static int retreat(short);
int int
@ -63,15 +72,16 @@ retreat(short type)
int nunits; int nunits;
struct nstr_item ni; struct nstr_item ni;
union empobj_storage unit; union empobj_storage unit;
int rflags; int rflags, ch, j;
unsigned i; unsigned i;
char *name, *rpath, *what; char *rflagsc, *p, *name, *rpath, *what;
int *rflagsp; int *rflagsp;
char buf1[1024]; char buf1[1024];
char buf2[1024]; char buf2[1024];
if (CANT_HAPPEN(type != EF_LAND && type != EF_SHIP)) if (CANT_HAPPEN(type != EF_LAND && type != EF_SHIP))
type = EF_SHIP; type = EF_SHIP;
rflagsc = type == EF_SHIP ? shp_rflagsc : lnd_rflagsc;
if (!snxtitem(&ni, type, player->argp[1])) if (!snxtitem(&ni, type, player->argp[1]))
return RET_SYN; return RET_SYN;
@ -83,73 +93,35 @@ retreat(short type)
rflags = 0; rflags = 0;
if (pq != NULL) { if (pq != NULL) {
again:
fl = getstarg(player->argp[3], fl = getstarg(player->argp[3],
type == EF_SHIP "Retreat conditions ('?' to list available ones)? ",
? "Retreat conditions [i|t|s|h|b|d|u|c]? "
: "Retreat conditions [i|h|b|c]? ",
buf2); buf2);
if (!fl) if (!fl)
return RET_SYN; return RET_SYN;
for (i = 0; fl[i]; i++) { for (i = 0; fl[i]; i++) {
switch (fl[i]) { ch = tolower(fl[i]);
case 'I': if (ch == 'C') {
case 'i': *pq = 0;
rflags |= RET_INJURED; return 0;
break;
case 'T':
case 't':
if (type == EF_LAND)
goto badflag;
rflags |= RET_TORPED;
break;
case 'S':
case 's':
if (type == EF_LAND)
goto badflag;
rflags |= RET_SONARED;
break;
case 'H':
case 'h':
rflags |= RET_HELPLESS;
break;
case 'B':
case 'b':
rflags |= RET_BOMBED;
break;
case 'D':
case 'd':
if (type == EF_LAND)
goto badflag;
rflags |= RET_DCHRGED;
break;
case 'U':
case 'u':
if (type == EF_LAND)
goto badflag;
rflags |= RET_BOARDED;
break;
case 'C':
case 'c':
pq = "";
break;
default:
badflag:
pr("bad condition\n");
/* fall through */
case '?':
pr("i\tretreat when injured\n");
if (type == EF_SHIP) {
pr("t\tretreat when torped\n");
pr("s\tretreat when sonared\n");
}
pr("h\tretreat when helpless\n");
pr("b\tretreat when bombed\n");
if (type == EF_SHIP) {
pr("d\tretreat when depth-charged\n");
pr("u\tretreat when boarded\n");
}
} }
if (ch == '?') {
for (j = 1; rflagsc[j]; j++) {
if (rflagsc[j] != 'X')
pr("%c\tretreat when %s\n",
rflagsc[j],
symbol_by_value(1 << j, retreat_flags));
}
pr("c\tcancel retreat order\n");
goto again;
}
p = strchr(rflagsc, ch);
if (!p) {
pr("Bad retreat condition '%c'\n", fl[i]);
return RET_SYN;
}
rflags |= 1 << (p - rflagsc);
} }
if (*pq && !rflags) { if (*pq && !rflags) {
pr("Must give retreat conditions!\n"); pr("Must give retreat conditions!\n");
@ -200,20 +172,13 @@ retreat(short type)
pr("Yes "); pr("Yes ");
else else
pr(" "); pr(" ");
if (rflags & RET_INJURED) for (j = 1; rflagsc[j]; j++) {
pr("I"); if ((1 << j) & rflags) {
if (rflags & RET_TORPED) if (CANT_HAPPEN(rflagsc[j] == 'X'))
pr("T"); continue;
if (rflags & RET_SONARED) pr("%c", rflagsc[j]);
pr("S"); }
if (rflags & RET_HELPLESS) }
pr("H");
if (rflags & RET_BOMBED)
pr("B");
if (rflags & RET_DCHRGED)
pr("D");
if (rflags & RET_BOARDED)
pr("U");
pr("\n"); pr("\n");
} }
what = type == EF_SHIP ? "ship" : "unit"; what = type == EF_SHIP ? "ship" : "unit";