/*
* 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-2017, 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/>.
*
* ---
*
* supply.c: Supply subroutines
*
* Known contributors to this file:
- * Markus Armbruster, 2004-2009
+ * Markus Armbruster, 2004-2013
*/
#include <config.h>
#include <math.h>
+#include "chance.h"
#include "empobj.h"
-#include "file.h"
#include "land.h"
#include "nat.h"
#include "optlist.h"
#include "path.h"
-#include "player.h"
#include "prototypes.h"
#include "sect.h"
#include "ship.h"
+#include "update.h"
static int s_commod(struct empobj *, short *, i_type, int, int, int);
static int get_minimum(struct lndstr *, i_type);
coord x = sink->x;
coord y = sink->y;
int lookrange;
- struct sctstr sect, dest;
+ struct sctstr sect;
struct nstr_sect ns;
struct nstr_item ni;
struct lchrstr *lcp;
int packing;
struct dchrstr *dp;
struct ichrstr *ip;
- char buf[1024];
if (wanted > limit)
wanted = limit;
return 1;
wanted -= vec[type];
- getsect(x, y, &dest);
-
/* try to get it from sector we're in */
if (sink->ef_type != EF_SECTOR) {
getsect(x, y, §);
continue;
if (sect.sct_effic < 60)
continue;
- if (!BestLandPath(buf, §, &dest, &move_cost, MOB_MOVE))
+ move_cost = path_find(sect.sct_x, sect.sct_y, x, y, own, MOB_MOVE);
+ if (move_cost < 0)
continue;
if (!opt_NOFOOD && type == I_FOOD)
minimum = 1 + (int)ceil(food_needed(sect.sct_item,
/* take off mobility for delivering sect */
n = roundavg(wanted * weight * move_cost);
- if (n < 0)
- n = 0;
- if (n > sect.sct_mobil)
- n = sect.sct_mobil;
- sect.sct_mobil -= n;
+ sect.sct_mobil -= LIMIT_TO(n, 0, sect.sct_mobil);
if (actually_doit) {
vec[type] += wanted;
putsect(§);
/* take off mobility for delivering sect */
n = roundavg(can_move * weight * move_cost);
- if (n < 0)
- n = 0;
- if (n > sect.sct_mobil)
- n = sect.sct_mobil;
- sect.sct_mobil -= n;
+ sect.sct_mobil -= LIMIT_TO(n, 0, sect.sct_mobil);
if (actually_doit) {
vec[type] += can_move;
putsect(§);
continue;
if (sect.sct_effic < 2)
continue;
- if (!BestLandPath(buf, §, &dest, &move_cost, MOB_MOVE))
+ move_cost = path_find(sect.sct_x, sect.sct_y, x, y, own, MOB_MOVE);
+ if (move_cost < 0)
continue;
if (!opt_NOFOOD && type == I_FOOD)
minimum = 1 + (int)ceil(food_needed(ship.shp_item,
ship.shp_item[type] -= wanted;
n = roundavg(wanted * weight * move_cost);
- if (n < 0)
- n = 0;
- if (n > sect.sct_mobil)
- n = sect.sct_mobil;
- sect.sct_mobil -= n;
+ sect.sct_mobil -= LIMIT_TO(n, 0, sect.sct_mobil);
if (actually_doit) {
vec[type] += can_move;
putship(ship.shp_uid, &ship);
- putsect(§);
+ if (n)
+ putsect(§);
put_empobj(sink->ef_type, sink->uid, sink);
}
return 1;
ship.shp_item[type] -= can_move;
n = roundavg(can_move * weight * move_cost);
- if (n < 0)
- n = 0;
- if (n > sect.sct_mobil)
- n = sect.sct_mobil;
- sect.sct_mobil -= n;
+ sect.sct_mobil -= LIMIT_TO(n, 0, sect.sct_mobil);
if (actually_doit) {
vec[type] += can_move;
putship(ship.shp_uid, &ship);
- putsect(§);
+ if (n)
+ putsect(§);
}
}
}
if (land.lnd_item[type] <= get_minimum(&land, type))
continue;
- getsect(land.lnd_x, land.lnd_y, §);
- if (!BestLandPath(buf, §, &dest, &move_cost, MOB_MOVE))
- continue;
-
- if ((land.lnd_ship >= 0) && (sect.sct_type != SCT_HARBR))
- continue;
+ if (land.lnd_ship >= 0) {
+ getsect(land.lnd_x, land.lnd_y, §);
+ if (sect.sct_type != SCT_HARBR || sect.sct_effic < 2)
+ continue;
+ }
- if ((land.lnd_ship >= 0) && (sect.sct_effic < 2))
+ move_cost = path_find(land.lnd_x, land.lnd_y, x, y, own, MOB_MOVE);
+ if (move_cost < 0)
continue;
#if 0