/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2009, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure
*
* This program is free software; you can redistribute it and/or modify
* ---
*
* move.c: Move something somewhere.
- *
+ *
* Known contributors to this file:
- *
+ *
*/
#include <config.h>
-#include "misc.h"
-#include "player.h"
-#include "sect.h"
-#include "item.h"
+#include <ctype.h>
+#include "damage.h"
#include "file.h"
-#include "xy.h"
-#include "path.h"
-#include "nat.h"
#include "map.h"
-#include "nsc.h"
-#include "damage.h"
+#include "path.h"
+#include "player.h"
#include "prototypes.h"
+#include "sect.h"
-static int move_map(s_char *what, coord curx, coord cury, s_char *arg);
+static int move_map(coord curx, coord cury, char *arg);
int
-move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
- double weight, s_char *path,
- int (*map)(s_char *, coord, coord, s_char *), int exploring,
+move_ground(struct sctstr *start, struct sctstr *end,
+ double weight, char *path,
+ int (*map)(coord, coord, char *), int exploring,
int *dam)
{
struct sctstr sect, ending_sect;
coord curx, cury, oldx, oldy;
coord tmpx, tmpy;
coord dx, dy;
- s_char *movstr;
+ char *movstr;
double sect_mcost;
double total_mcost;
double mv_cost;
- double mobility = (double)start->sct_mobil;
+ double mobility = start->sct_mobil;
int dir;
int intcost;
- int takedam = (*dam), out = 0;
- s_char bpath[512];
- s_char buf2[512];
- s_char prompt[128];
- s_char buf[1024];
+ int takedam = *dam;
+ int out = 0;
+ char bpath[512];
+ char buf2[512];
+ char prompt[128];
+ char buf[1024];
*end = *start;
if (mobility <= 0.0)
}
pr("Looking for best path to %s\n", path);
path = BestLandPath(buf2, start, &ending_sect, &total_mcost,
- MOB_ROAD);
+ MOB_MOVE);
if (exploring && path) /* take off the 'h' */
path[strlen(path) - 1] = '\0';
if (!path)
oldy = cury;
if (!movstr || *movstr == 0) {
if (exploring) {
- map(what, curx, cury, NULL);
+ map(curx, cury, NULL);
} else {
- move_map(what, curx, cury, NULL);
+ move_map(curx, cury, NULL);
}
sprintf(prompt, "<%.1f: %c %s> ", mobility,
dchr[sect.sct_type].d_mnem,
if (movstr && sarg_xy(movstr, &dx, &dy)) {
if (getsect(dx, dy, &dsect)) {
movstr = BestLandPath(buf2, §, &dsect, &mv_cost,
- MOB_ROAD);
+ MOB_MOVE);
} else {
pr("Invalid destination sector!\n");
movstr = NULL;
*movstr = 0;
continue;
}
- movstr++;
+ do movstr++; while (isspace(*movstr));
if (dir == DIR_MAP) {
if (!exploring)
- map(what, curx, cury, movstr + 1);
+ map(curx, cury, movstr);
*movstr = 0;
continue;
} else if (dir == DIR_STOP)
break;
else 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]);
+ dchr[sect.sct_type].d_name, sect.sct_item[I_CIVIL]);
continue;
}
/*
*movstr = 0;
continue;
}
- sect_mcost = sector_mcost(&next, MOB_ROAD);
+ sect_mcost = sector_mcost(&next, MOB_MOVE);
if ((!player->owner && (!exploring
|| next.sct_item[I_MILIT]
|| next.sct_item[I_CIVIL]))
mobility -= sect_mcost;
total_mcost += sect_mcost;
}
- curx = tmpx;
- cury = tmpy;
+ curx = next.sct_x;
+ cury = next.sct_y;
if (cury != start->sct_y)
out = 1;
if (curx != start->sct_x)
*/
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*/
static int
-move_map(s_char *what, coord curx, coord cury, s_char *arg)
+move_map(coord curx, coord cury, char *arg)
{
struct nstr_sect ns;
- struct natstr *np;
struct sctstr sect;
- coord rel_x, rel_y;
- s_char range[128];
- s_char view[7];
+ char view[7];
int i;
int changed = 0;
- np = getnatp(player->cnum);
- rel_x = xrel(np, curx);
- rel_y = yrel(np, cury);
- sprintf(range, "%d:%d,%d:%d", rel_x - 2, rel_x + 2, rel_y - 1,
- rel_y + 1);
- player->condarg = 0;
- /* This is necessary, otherwise move_map would attempt to pay */
- /* attention to the conditional arguments left behind by such */
- /* a command as "tran p -1,-1 ?eff=100".. It'd then only see */
- /* 100% efficienct sects, and get all screwed up --ts */
- if (!snxtsct(&ns, range))
- return RET_FAIL;
+ snxtsct_dist(&ns, curx, cury, 1);
i = 0;
while (i < 7 && nxtsct(&ns, §)) {
+ /* Nasty: this relies on the iteration order */
view[i] = dchr[sect.sct_type].d_mnem;
switch (sect.sct_type) {
case SCT_WATER:
fly_map(coord curx, coord cury)
{
struct nstr_sect ns;
- struct natstr *np;
struct sctstr sect;
- coord rel_x, rel_y;
- s_char view[7];
+ char view[7];
int i;
- s_char range[128];
-
- np = getnatp(player->cnum);
- rel_x = xrel(np, curx);
- rel_y = yrel(np, cury);
- sprintf(range, "%d:%d,%d:%d", rel_x - 2, rel_x + 2, rel_y - 1,
- rel_y + 1);
- player->condarg = 0;
- /* This is necessary, otherwise move_map would attempt to pay */
- /* attention to the conditional arguments left behind by such */
- /* a command as "tran p -1,-1 ?eff=100".. It'd then only see */
- /* 100% efficienct sects, and get all screwed up --ts */
- if (!snxtsct(&ns, range))
- return RET_FAIL;
+ snxtsct_dist(&ns, curx, cury, 1);
i = 0;
while (i < 7 && nxtsct(&ns, §)) {
- if (!(view[i] = player->bmap[sctoff(ns.x, ns.y)]))
+ /* Nasty: this relies on the iteration order */
+ if (!(view[i] = player->bmap[sect.sct_uid]))
view[i] = ' ';
i++;
}