/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2010, Dave Pare, Jeff Bailey, Thomas Ruschak,
- * Ken Stevens, Steve McClure
+ * Copyright (C) 1986-2014, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Ken Stevens, Steve McClure, Markus Armbruster
*
- * This program is free software; you can redistribute it and/or modify
+ * Empire is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ---
*
* Known contributors to this file:
* Chad Zabel, 1994
* Steve McClure, 2000
+ * Markus Armbruster, 2004-2013
*/
#include <config.h>
int scuttling = 0;
struct nstr_item nb;
struct shpstr ship;
- struct shpstr start; /* Used for checking database */
struct ichrstr *i1;
coord p0x, p0y, p1x, p1y;
int i;
continue;
}
}
- memcpy(&start, &ship, sizeof(struct shpstr));
sprintf(prompt,
"Ship #%d, declare, cancel, suspend, resume, level? ",
ship.shp_uid);
p = getstarg(player->argp[2], prompt, buf);
if (player->aborted || !p || !*p)
return RET_FAIL;
+ if (!check_ship_ok(&ship))
+ return RET_FAIL;
switch (*p) {
default:
pr("Bad order type!\n");
p = getstarg(player->argp[4], "Second dest? ", buf);
if (!p)
return RET_FAIL;
+ if (!check_ship_ok(&ship))
+ return RET_FAIL;
if (!*p || !strcmp(p, "-")) {
pr("A one-way order has been accepted.\n");
} else if (!strncmp(p, "s", 1)) {
- if (opt_TRADESHIPS) {
- if (!(mchr[(int)ship.shp_type].m_flags & M_TRADE)) {
- pr("You can't auto-scuttle that ship!\n");
- return RET_SYN;
- }
- } else {
+ if (!(mchr[(int)ship.shp_type].m_flags & M_TRADE)) {
pr("You can't auto-scuttle that ship!\n");
return RET_SYN;
}
sprintf(buf1, "Field (1-%d) ", TMAX);
if (!getstarg(player->argp[3], buf1, buf))
return RET_SYN;
+ if (!check_ship_ok(&ship))
+ return RET_FAIL;
sub = atoi(buf);
/* check to make sure value in within range. */
if (sub > TMAX || sub < 1) {
pr("Value must range from 1 to %d\n", TMAX);
- break;
+ return RET_FAIL;
}
/* to keep sub in range of our arrays
sub = sub - 1;;
if (ship.shp_autonav & AN_AUTONAV) {
- dest = getstarg(player->argp[4], "Start or End? ", buf);
+ dest = getstarg(player->argp[4], "Start or end? ", buf);
if (!dest)
- break;
+ return RET_FAIL;
switch (*dest) {
default:
pr("You must enter 'start' or 'end'\n");
case 'E':
i1 = whatitem(player->argp[5], "Commodity? ");
if (!i1)
- break;
- p1 = getstarg(player->argp[6], "Amount? ",
- buf);
+ return RET_FAIL;
+ p1 = getstarg(player->argp[6], "Amount? ", buf);
if (!p1)
return RET_SYN;
+ if (!check_ship_ok(&ship))
+ return RET_FAIL;
level = atoi(p1);
if (level < 0) {
level = 0; /* prevent negatives. */
}
ship.shp_tstart[sub] = i1->i_uid;
ship.shp_lstart[sub] = level;
- pr("Order Set \n");
+ pr("Order set\n");
break;
case 's':
case 'S':
i1 = whatitem(player->argp[5], "Commodity? ");
if (!i1)
- break;
- p1 = getstarg(player->argp[6], "Amount? ",
- buf);
+ return RET_FAIL;
+ p1 = getstarg(player->argp[6], "Amount? ", buf);
if (!p1)
return RET_SYN;
+ if (!check_ship_ok(&ship))
+ return RET_FAIL;
level = atoi(p1);
if (level < 0) {
level = 0;
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);
}
return RET_OK;
}
-static void
-eta_calc(struct shpstr *sp, char *path, int *len, int *nupdates)
+static int
+eta_calc(struct shpstr *sp, int len)
{
double mobcost, mobil;
- int i;
+ int i, nupdates;
- i = strlen(path);
- *len = i;
- *nupdates = 1;
+ i = len;
+ nupdates = 1;
mobcost = shp_mobcost(sp);
mobil = sp->shp_mobil;
i--;
} else {
mobil += (ship_mob_scale * (float)etu_per_update);
- (*nupdates)++;
+ nupdates++;
}
}
+ return nupdates;
}
static void
{
int nships = 0;
int len, updates;
- char *c;
+ double c;
struct nstr_item nb;
struct shpstr ship;
- char buf[1024];
if (!snxtitem(&nb, EF_SHIP, player->argp[1], NULL))
return RET_SYN;
if (!nships) { /* 1st ship, print banner */
if (player->god)
pr("own ");
- pr("shp# ship type x,y ");
- pr("start end ");
- pr("len eta\n");
+ pr("shp# ship type x,y start end "
+ " len eta\n");
}
nships++;
if (player->god)
pr("%3d ", ship.shp_own);
pr("%4d", nb.cur);
pr(" %-16.16s", mchr[(int)ship.shp_type].m_name);
- prxy(" %3d,%-3d", ship.shp_x, ship.shp_y, player->cnum);
+ prxy(" %4d,%-4d", ship.shp_x, ship.shp_y);
if (ship.shp_autonav & AN_AUTONAV) {
/* Destination 1 */
- prxy(" %3d,%-3d",
- ship.shp_destx[1], ship.shp_desty[1], player->cnum);
+ prxy(" %4d,%-4d", ship.shp_destx[1], ship.shp_desty[1]);
/* Destination 2 */
if ((ship.shp_destx[1] != ship.shp_destx[0])
|| (ship.shp_desty[1] != ship.shp_desty[0])) {
- prxy(" %3d,%-3d",
- ship.shp_destx[0], ship.shp_desty[0], player->cnum);
+ prxy(" %4d,%-4d", ship.shp_destx[0], ship.shp_desty[0]);
} else
- pr(" ");
+ pr(" ");
if (ship.shp_autonav & AN_STANDBY)
pr(" suspended");
pr(" loading");
else {
/* ETA calculation */
-
- c = BestShipPath(buf, ship.shp_x, ship.shp_y,
- ship.shp_destx[0], ship.shp_desty[0],
- ship.shp_own);
- if (!c)
+ c = path_find(ship.shp_x, ship.shp_y,
+ ship.shp_destx[0], ship.shp_desty[0],
+ ship.shp_own, MOB_SAIL);
+ if (c < 0)
pr(" no route possible");
- else if (*c == 'h')
+ else if (c == 0)
pr(" has arrived");
else {
/* distance to destination */
- eta_calc(&ship, c, &len, &updates);
+ len = (int)c;
+ updates = eta_calc(&ship, len);
pr(" %3d %4d", len, updates);
}
}