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:
parent
b54bc83e26
commit
2b14f876be
1 changed files with 10 additions and 11 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue