/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure
*
* This program is free software; you can redistribute it and/or modify
*
* ---
*
- * See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
- * related information and legal notices. It is expected that any future
- * projects/authors will amend these files as needed.
+ * See files README, COPYING and CREDITS in the root of the source
+ * tree for related information and legal notices. It is expected
+ * that future projects/authors will amend these files as needed.
*
* ---
*
*
*/
+#include <config.h>
+
#include "misc.h"
#include "player.h"
-#include "var.h"
#include "sect.h"
#include "item.h"
#include "file.h"
-#include "deity.h"
#include "xy.h"
#include "path.h"
#include "nat.h"
#include "damage.h"
#include "prototypes.h"
-extern int move_map(s_char *what, coord curx, coord cury, s_char *arg);
+static int move_map(s_char *what, coord curx, coord cury, s_char *arg);
int
move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
- double mobility, double weight, s_char *path,
- int (*map) (s_char *, coord, coord, s_char *), int exploring,
+ double weight, s_char *path,
+ int (*map)(s_char *, coord, coord, s_char *), int exploring,
int *dam)
-
-
- /* RESULT */
{
struct sctstr sect, ending_sect;
struct sctstr next, dsect;
- int vec[I_MAX + 1];
coord curx, cury, oldx, oldy;
coord tmpx, tmpy;
coord dx, dy;
- s_char *movstr, *BestLandPath(s_char *, struct sctstr *,
- struct sctstr *, double *, int);
+ s_char *movstr;
double sect_mcost;
double total_mcost;
double mv_cost;
+ double mobility = (double)start->sct_mobil;
int dir;
int intcost;
int takedam = (*dam), out = 0;
s_char prompt[128];
s_char buf[1024];
+ *end = *start;
if (mobility <= 0.0)
return -1;
*dam = 0;
return -1;
}
pr("Looking for best path to %s\n", path);
- path =
- BestLandPath(buf2, start, &ending_sect, &total_mcost,
- MOB_ROAD);
+ path = BestLandPath(buf2, start, &ending_sect, &total_mcost,
+ MOB_ROAD);
if (exploring && (path != (s_char *)0)) /* take off the 'h' */
*(path + strlen(path) - 1) = '\0';
if (path == (s_char *)0)
else {
pr("Using best path '%s', movement cost %1.3f\n",
path, total_mcost);
- bzero(bpath, 512);
- bcopy(path, bpath, strlen(path));
+ strncpy(bpath, path, sizeof(bpath));
path = bpath;
}
if ((total_mcost * weight) > mobility) {
pr("Not enough mobility to go all the way. Nothing moved.\n");
- *end = *start;
return -1;
}
}
movstr = path;
- tmpx = start->sct_x;
- curx = tmpx;
- tmpy = start->sct_y;
- cury = tmpy;
+ curx = start->sct_x;
+ cury = start->sct_y;
total_mcost = 0.0;
if (getsect(curx, cury, §) < 0) {
logerror("move_path: getsect %d,%d", curx, cury);
return -1;
}
for (;;) {
- tmpx = curx;
- tmpy = cury;
oldx = curx;
oldy = cury;
if (movstr == 0 || *movstr == 0) {
}
if (movstr && sarg_xy(movstr, &dx, &dy)) {
if (getsect(dx, dy, &dsect)) {
- movstr =
- BestLandPath(buf2, §, &dsect, &mv_cost, MOB_ROAD);
+ movstr = BestLandPath(buf2, §, &dsect, &mv_cost,
+ MOB_ROAD);
} else {
pr("Invalid destination sector!\n");
movstr = (s_char *)0;
} else {
pr("Using best path '%s', movement cost %1.3f\n",
movstr, mv_cost);
- bzero(bpath, 512);
- bcopy(movstr, bpath, strlen(movstr));
+ strncpy(bpath, movstr, sizeof(bpath));
movstr = bpath;
}
}
}
- if (movstr == 0 || *movstr == 0)
- movstr = dirch;
+ if (movstr == 0 || *movstr == 0) {
+ buf2[0] = dirch[DIR_STOP];
+ buf2[1] = 0;
+ movstr = buf2;
+ }
if ((dir = chkdir(*movstr, DIR_STOP, DIR_MAP)) < 0) {
pr("\"%c\" is not legal...", *movstr);
direrr("'%c' to stop ", "'%c' to view ", "& '%c' to map\n");
else if (dir == DIR_VIEW) {
pr("%d%% %s with %d civilians.\n", sect.sct_effic,
dchr[sect.sct_type].d_name,
- getvar(V_CIVIL, (s_char *)§, EF_SECTOR));
+ sect.sct_item[I_CIVIL]);
continue;
}
/*
* next sector. Mobility, terrain,
* or ownership may prevent us.
*/
- tmpx += diroff[dir][0];
- tmpy += diroff[dir][1];
+ tmpx = curx + diroff[dir][0];
+ tmpy = cury + diroff[dir][1];
if (getsect(tmpx, tmpy, &next) < 0) {
pr("You can't go there...\n");
*movstr = 0;
if ((next.sct_type == SCT_SANCT) &&
(next.sct_own != player->cnum)) {
pr("Converts, huh?\n");
- *end = next;
- intcost = (int)total_mcost;
- if (chance(total_mcost - intcost))
- intcost++;
- return intcost;
+ *movstr = 0;
+ continue;
}
- getvec(VT_ITEM, vec, (s_char *)&next, EF_SECTOR);
sect_mcost = sector_mcost(&next, MOB_ROAD);
- if ((!player->owner && (!exploring ||
- (vec[I_MILIT] || vec[I_CIVIL]))) ||
- sect_mcost == -1.0) {
+ if ((!player->owner && (!exploring
+ || next.sct_item[I_MILIT]
+ || next.sct_item[I_CIVIL]))
+ || sect_mcost == -1.0) {
/* already-owned, or prohibited terrain */
pr("You can't go there...\n");
*movstr = 0;
*/
if (takedam && chance(weight / 100.0) &&
((curx != oldx) || (cury != oldy)))
- (*dam) +=
- ground_interdict(curx, cury, player->cnum, "commodities");
+ (*dam) += ground_interdict(curx, cury, player->cnum,
+ "commodities");
if (*dam >= 100)
break;
}
/*ARGSUSED*/
-int
+static int
move_map(s_char *what, coord curx, coord cury, s_char *arg)
{
struct nstr_sect ns;
s_char range[128];
s_char view[7];
int i;
- int vec[I_MAX + 1];
int changed = 0;
np = getnatp(player->cnum);
writemap(player->cnum);
if (!getsect(curx, cury, §))
return RET_FAIL;
- getvec(VT_ITEM, vec, (s_char *)§, EF_SECTOR);
pr(" %c %c eff mob civ mil uw food work avail\n",
view[0], view[1]);
pr(" %c %c %c %3d %3d %4d %4d %4d %4d %3d %3d\n",
view[2], view[3], view[4],
- sect.sct_effic, sect.sct_mobil, vec[I_CIVIL], vec[I_MILIT],
- vec[I_UW], vec[I_FOOD], sect.sct_work, sect.sct_avail);
+ sect.sct_effic, sect.sct_mobil,
+ sect.sct_item[I_CIVIL], sect.sct_item[I_MILIT], sect.sct_item[I_UW],
+ sect.sct_item[I_FOOD], sect.sct_work, sect.sct_avail);
pr(" %c %c\n", view[5], view[6]);
return RET_OK;
}
check_lmines(coord x, coord y, double weight)
{
struct sctstr sect;
- int mines;
int dam = 0;
getsect(x, y, §);
- mines = getvar(V_MINE, (s_char *)§, EF_SECTOR);
- if (mines > 0 &&
+ if (sect.sct_mines > 0 &&
sect.sct_oldown != player->cnum &&
- chance(DMINE_LHITCHANCE(mines)) && chance(weight / 100.0)) {
+ chance(DMINE_LHITCHANCE(sect.sct_mines)) && chance(weight / 100.0)) {
pr_beep();
pr("Blammo! Landmines detected! in %s ",
xyas(sect.sct_x, sect.sct_y, player->cnum));
dam = roll(20);
- --mines;
- putvar(V_MINE, mines, (s_char *)§, EF_SECTOR);
+ --sect.sct_mines;
putsect(§);
pr("%d damage sustained.\n", dam);
}