Fix generation numbers for order command

orde() uses a "clever" trick to get away with just one
check_ship_ok(): it makes a copy of the ship in the beginning, and
checks it at the end.  Generation numbers (commit 2fa5f652) break this
trick.  It could be fixed by manually marking the ship fresh.
Instead, check the ship the stupid, straightforward way, without a
copy.
This commit is contained in:
Markus Armbruster 2010-01-26 22:20:16 +01:00
parent b54bc83e26
commit 2b14f876be

View file

@ -63,7 +63,6 @@ orde(void)
int scuttling = 0; int scuttling = 0;
struct nstr_item nb; struct nstr_item nb;
struct shpstr ship; struct shpstr ship;
struct shpstr start; /* Used for checking database */
struct ichrstr *i1; struct ichrstr *i1;
coord p0x, p0y, p1x, p1y; coord p0x, p0y, p1x, p1y;
int i; int i;
@ -83,13 +82,14 @@ orde(void)
continue; continue;
} }
} }
memcpy(&start, &ship, sizeof(struct shpstr));
sprintf(prompt, sprintf(prompt,
"Ship #%d, declare, cancel, suspend, resume, level? ", "Ship #%d, declare, cancel, suspend, resume, level? ",
ship.shp_uid); ship.shp_uid);
p = getstarg(player->argp[2], prompt, buf); p = getstarg(player->argp[2], prompt, buf);
if (player->aborted || !p || !*p) if (player->aborted || !p || !*p)
return RET_FAIL; return RET_FAIL;
if (!check_ship_ok(&ship))
return RET_FAIL;
switch (*p) { switch (*p) {
default: default:
pr("Bad order type!\n"); pr("Bad order type!\n");
@ -126,6 +126,8 @@ orde(void)
p = getstarg(player->argp[4], "Second dest? ", buf); p = getstarg(player->argp[4], "Second dest? ", buf);
if (!p) if (!p)
return RET_FAIL; return RET_FAIL;
if (!check_ship_ok(&ship))
return RET_FAIL;
if (!*p || !strcmp(p, "-")) { if (!*p || !strcmp(p, "-")) {
pr("A one-way order has been accepted.\n"); pr("A one-way order has been accepted.\n");
} else if (!strncmp(p, "s", 1)) { } else if (!strncmp(p, "s", 1)) {
@ -169,6 +171,8 @@ orde(void)
sprintf(buf1, "Field (1-%d) ", TMAX); sprintf(buf1, "Field (1-%d) ", TMAX);
if (!getstarg(player->argp[3], buf1, buf)) if (!getstarg(player->argp[3], buf1, buf))
return RET_SYN; return RET_SYN;
if (!check_ship_ok(&ship))
return RET_FAIL;
sub = atoi(buf); sub = atoi(buf);
/* check to make sure value in within range. */ /* check to make sure value in within range. */
if (sub > TMAX || sub < 1) { if (sub > TMAX || sub < 1) {
@ -198,6 +202,8 @@ orde(void)
buf); buf);
if (!p1) if (!p1)
return RET_SYN; return RET_SYN;
if (!check_ship_ok(&ship))
return RET_FAIL;
level = atoi(p1); level = atoi(p1);
if (level < 0) { if (level < 0) {
level = 0; /* prevent negatives. */ level = 0; /* prevent negatives. */
@ -216,6 +222,8 @@ orde(void)
buf); buf);
if (!p1) if (!p1)
return RET_SYN; return RET_SYN;
if (!check_ship_ok(&ship))
return RET_FAIL;
level = atoi(p1); level = atoi(p1);
if (level < 0) { if (level < 0) {
level = 0; level = 0;
@ -273,15 +281,6 @@ orde(void)
ship.shp_tend[i] = tcomm; ship.shp_tend[i] = tcomm;
} }
} }
/*
** Write ship back to database, then give it
** a kick down the autonav route if necessary.
*/
/* Now do a sanity check. */
if (!check_ship_ok(&start))
return RET_SYN;
putship(ship.shp_uid, &ship); putship(ship.shp_uid, &ship);
} }