/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
- * Ken Stevens, Steve McClure
+ * Copyright (C) 1986-2011, 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/>.
*
* ---
*
* ---
*
* move.c: Move something somewhere.
- *
+ *
* Known contributors to this file:
- *
+ * Markus Armbruster, 2004-2011
*/
#include <config.h>
#include "damage.h"
#include "file.h"
#include "map.h"
+#include "nsc.h"
#include "path.h"
#include "player.h"
#include "prototypes.h"
int
move_ground(struct sctstr *start, struct sctstr *end,
double weight, char *path,
- int (*map)(coord, coord, char *), int exploring,
- int *dam)
+ int (*map)(coord, coord, char *, char *),
+ int exploring, int *dam)
{
- struct sctstr sect, ending_sect;
- struct sctstr next, dsect;
+ struct sctstr sect;
+ struct sctstr next;
coord curx, cury, oldx, oldy;
coord tmpx, tmpy;
coord dx, dy;
double sect_mcost;
double total_mcost;
double mv_cost;
+ size_t len;
double mobility = start->sct_mobil;
int dir;
+ char scanspace[1024];
+ char *argp[128];
+ int ac;
int intcost;
int takedam = *dam;
int out = 0;
- char bpath[512];
- char buf2[512];
char prompt[128];
char buf[1024];
if (mobility <= 0.0)
return -1;
*dam = 0;
- if (path && sarg_xy(path, &dx, &dy) && getsect(dx, dy, &ending_sect)) {
- if ((ending_sect.sct_x == start->sct_x) &&
- (ending_sect.sct_y == start->sct_y)) {
+ if (path && sarg_xy(path, &dx, &dy)) {
+ if (dx == start->sct_x && dy == start->sct_y) {
pr("Start sector is ending sector!\n");
return -1;
}
pr("Looking for best path to %s\n", path);
- path = BestLandPath(buf2, start, &ending_sect, &total_mcost,
- MOB_MOVE);
- if (exploring && path) /* take off the 'h' */
- path[strlen(path) - 1] = '\0';
- if (!path)
+ total_mcost = path_find(start->sct_x, start->sct_y, dx, dy,
+ player->cnum, MOB_MOVE);
+ path = NULL;
+ if (total_mcost < 0)
pr("No owned path exists!\n");
else {
- pr("Using best path '%s', movement cost %1.3f\n",
- path, total_mcost);
- strncpy(bpath, path, sizeof(bpath));
- path = bpath;
- }
- if ((total_mcost * weight) > mobility) {
- pr("Not enough mobility to go all the way. Nothing moved.\n");
- return -1;
+ len = path_find_route(buf, sizeof(buf),
+ start->sct_x, start->sct_y, dx, dy);
+ if (!exploring) {
+ if (len < sizeof(buf))
+ strcpy(buf + len, "h");
+ len++;
+ }
+ if (len >= sizeof(buf))
+ pr("Can't handle path to %s, it's too long, sorry.\n",
+ xyas(dx, dy, player->cnum));
+ else {
+ path = buf;
+ pr("Using best path '%s', movement cost %1.3f\n",
+ path, total_mcost);
+ if (total_mcost * weight > mobility) {
+ pr("Not enough mobility to go all the way."
+ " Nothing moved.\n");
+ return -1;
+ }
+ }
}
}
movstr = path;
oldy = cury;
if (!movstr || *movstr == 0) {
if (exploring) {
- map(curx, cury, NULL);
+ map(curx, cury, NULL, NULL);
} else {
move_map(curx, cury, NULL);
}
movstr = getstring(prompt, buf);
}
if (movstr && sarg_xy(movstr, &dx, &dy)) {
- if (getsect(dx, dy, &dsect)) {
- movstr = BestLandPath(buf2, §, &dsect, &mv_cost,
- MOB_MOVE);
- } else {
- pr("Invalid destination sector!\n");
- movstr = NULL;
- }
-
- if (movstr == NULL) {
+ mv_cost = path_find(sect.sct_x, sect.sct_y, dx, dy,
+ player->cnum, MOB_MOVE);
+ if (mv_cost < 0) {
pr("Can't get to %s from here!\n",
xyas(dx, dy, player->cnum));
+ movstr = NULL;
} else {
- if ((mv_cost * weight) > mobility) {
- pr("Not enough mobility to go all the way. Nothing moved.\n");
+ len = path_find_route(buf, sizeof(buf),
+ sect.sct_x, sect.sct_y, dx, dy);
+ if (len < sizeof(buf))
+ strcpy(buf + len, "h");
+ len++;
+ if (len >= sizeof(buf)) {
+ pr("Can't handle path to %s, it's too long, sorry.\n",
+ xyas(dx, dy, player->cnum));
movstr = NULL;
} else {
- pr("Using best path '%s', movement cost %1.3f\n",
- movstr, mv_cost);
- strncpy(bpath, movstr, sizeof(bpath));
- movstr = bpath;
+ if ((mv_cost * weight) > mobility) {
+ pr("Not enough mobility to go all the way. Nothing moved.\n");
+ movstr = NULL;
+ } else {
+ movstr = buf;
+ pr("Using best path '%s', movement cost %1.3f\n",
+ movstr, mv_cost);
+ }
}
}
}
if (!movstr || *movstr == 0) {
- buf2[0] = dirch[DIR_STOP];
- buf2[1] = 0;
- movstr = buf2;
+ buf[0] = dirch[DIR_STOP];
+ buf[1] = 0;
+ movstr = buf;
}
if ((dir = chkdir(*movstr, DIR_STOP, DIR_MAP)) < 0) {
pr("\"%c\" is not legal...", *movstr);
*movstr = 0;
continue;
}
- do movstr++; while (isspace(*movstr));
if (dir == DIR_MAP) {
+ ac = parse(movstr, scanspace, argp, NULL, NULL, NULL);
+ if (ac == 1) {
+ pr("Use of '%c' without a space before its argument is deprecated.\n"
+ "Support for it will go away in a future release\n",
+ *movstr);
+ argp[1] = argp[0] + 1;
+ }
if (!exploring)
- map(curx, cury, movstr);
+ map(curx, cury, argp[1], argp[2]);
*movstr = 0;
continue;
- } else if (dir == DIR_STOP)
+ }
+ movstr++;
+ if (dir == DIR_STOP)
break;
- else if (dir == DIR_VIEW) {
+ if (dir == DIR_VIEW) {
pr("%d%% %s with %d civilians.\n", sect.sct_effic,
dchr[sect.sct_type].d_name, sect.sct_item[I_CIVIL]);
continue;
int dam = 0;
getsect(x, y, §);
- if (sect.sct_mines > 0 &&
+ if (SCT_LANDMINES(§) > 0 &&
sect.sct_oldown != player->cnum &&
chance(DMINE_LHITCHANCE(sect.sct_mines)) && chance(weight / 100.0)) {
pr_beep();