/*
* 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
* ---
*
* supply.c: Supply subroutines
- *
+ *
* Known contributors to this file:
- *
+ *
*/
#include <config.h>
#include <math.h>
-#include "misc.h"
-#include "nat.h"
-#include "ship.h"
-#include "land.h"
-#include "sect.h"
-#include "xy.h"
-#include "nsc.h"
-#include "path.h"
-#include "item.h"
#include "file.h"
+#include "land.h"
+#include "nat.h"
#include "optlist.h"
#include "player.h"
#include "prototypes.h"
+#include "sect.h"
+#include "ship.h"
static int get_minimum(struct lndstr *, i_type);
static int s_commod(int, int, int, i_type, int, int);
/*
* We want to get enough guns to be maxed out, enough shells to
- * fire once, one update's worth of food, enough fuel for
- * one update.
+ * fire once, one update's worth of food.
*
* Firts, try to forage in the sector
* Second look for a warehouse or headquarters to leech
* Third, look for a ship we own in a harbor
* Fourth, look for supplies in a supply unit we own
- * (one good reason to do this last is that the supply
- * unit will then call resupply, taking more time)
+ * (one good reason to do this last is that the supply
+ * unit will then call resupply, taking more time)
*
* May want to put code to resupply with SAMs here, later --ts
- *
*/
void
if (!opt_NOFOOD)
resupply_commod(lp, I_FOOD);
resupply_commod(lp, I_SHELL);
- if (opt_FUEL)
- resupply_commod(lp, I_PETROL);
}
/*
resupply_commod(struct lndstr *lp, i_type type)
{
int amt;
- struct shpstr ship;
- /* Ok, do we now have enough? */
amt = get_minimum(lp, type) - lp->lnd_item[type];
if (amt > 0) {
lp->lnd_item[type] += supply_commod(lp->lnd_own,
lp->lnd_x, lp->lnd_y,
type, amt);
- amt = get_minimum(lp, type) - lp->lnd_item[type];
- }
- /* Now, check again to see if we have enough. */
- if (amt > 0) {
- /* Are we on a ship? if so, try to get it from the ship first. */
- if (lp->lnd_ship >= 0) {
- getship(lp->lnd_ship, &ship);
- /* Now, determine how much we can get */
- if (amt > ship.shp_item[type])
- amt = ship.shp_item[type];
- /* Now, add and subtract */
- lp->lnd_item[type] += amt;
- ship.shp_item[type] -= amt;
- putship(lp->lnd_ship, &ship);
- }
- }
-
- if (opt_FUEL && type == I_PETROL) {
- int fuel_needed = lp->lnd_fuelu
- * ((float)etu_per_update * land_mob_scale) / 10.0;
-
- while ((lp->lnd_fuel < fuel_needed) && lp->lnd_item[I_PETROL]) {
- lp->lnd_fuel += 10;
- if (lp->lnd_fuel > lp->lnd_fuelc)
- lp->lnd_fuel = lp->lnd_fuelc;
- lp->lnd_item[I_PETROL]--;
- }
}
}
int
supply_commod(int own, int x, int y, i_type type, int total_wanted)
{
- if (total_wanted < 0)
+ if (total_wanted <= 0)
return 0;
return s_commod(own, x, y, type, total_wanted, !player->simulation);
}
/*
* Just return the number you COULD get, without doing it
*/
-int
+static int
try_supply_commod(int own, int x, int y, i_type type, int total_wanted)
{
- if (total_wanted < 0)
+ if (total_wanted <= 0)
return 0;
return s_commod(own, x, y, type, total_wanted, 0);
continue;
if (sect.sct_effic < 60)
continue;
- if (!BestLandPath(buf, &dest, §, &move_cost, MOB_ROAD))
+ if (!BestLandPath(buf, &dest, §, &move_cost, MOB_MOVE))
continue;
if (!opt_NOFOOD && type == I_FOOD)
minimum = 1 + (int)ceil(food_needed(sect.sct_item,
continue;
if (sect.sct_effic < 2)
continue;
- if (!BestLandPath(buf, &dest, §, &move_cost, MOB_ROAD))
+ if (!BestLandPath(buf, &dest, §, &move_cost, MOB_MOVE))
continue;
if (!opt_NOFOOD && type == I_FOOD)
minimum = 1 + (int)ceil(food_needed(ship.shp_item,
continue;
getsect(land.lnd_x, land.lnd_y, §);
- if (!BestLandPath(buf, &dest, §, &move_cost, MOB_ROAD))
+ if (!BestLandPath(buf, &dest, §, &move_cost, MOB_MOVE))
continue;
if ((land.lnd_ship >= 0) && (sect.sct_type != SCT_HARBR))
save = land;
land.lnd_item[type] = 0;
putland(land.lnd_uid, &land);
+ save.lnd_seqno = land.lnd_seqno;
land.lnd_item[type] =
save.lnd_item[type] + s_commod(own, land.lnd_x, land.lnd_y,
if (can_move >= wanted) {
land.lnd_item[type] -= wanted;
-
- /* resupply the supply unit */
- resupply_commod(&land, type);
-
land.lnd_mobil -= roundavg(wanted * weight * move_cost);
if (actually_doit)
/*
* We want to get enough shells to fire once,
- * one update's worth of food, enough fuel for
- * one update.
+ * one update's worth of food.
*/
static int
want = (int)ceil(food_needed(lp->lnd_item, etu_per_update));
break;
case I_SHELL:
- want = lp->lnd_ammo;
- break;
-
- /*
- * return the amount of pet we'd need to get to
- * enough fuel for 1 update
- */
- case I_PETROL:
- if (opt_FUEL == 0)
- return 0;
- want = lp->lnd_fuelu * ((float)etu_per_update * land_mob_scale)
- / 10.0;
- want -= lp->lnd_fuel;
- if (want > 0) {
- want = want / 10;
- if (want == 0)
- want++;
- }
-
- max = want;
+ want = lcp->l_ammo;
break;
default:
return 0;
{
int shells_needed, shells, keepshells;
int food, food_needed, keepfood;
- int fuel_needed, fuel, petrol_needed, petrol, keeppetrol;
if (!opt_NOFOOD) {
food_needed = get_minimum(lp, I_FOOD);
}
- shells_needed = lp->lnd_ammo;
+ shells_needed = lchr[lp->lnd_type].l_ammo;
shells = keepshells = lp->lnd_item[I_SHELL];
if (shells < shells_needed) {
lp->lnd_item[I_SHELL] = 0;
if (shells < shells_needed)
return 0;
- if (opt_FUEL) {
- fuel_needed = lp->lnd_fuelu;
- fuel = lp->lnd_fuel;
- if (fuel < fuel_needed) {
- petrol_needed =
- ldround((fuel_needed - fuel) / 10.0, 1);
- petrol = keeppetrol = lp->lnd_item[I_PETROL];
- if (petrol < petrol_needed) {
- lp->lnd_item[I_PETROL] = 0;
- putland(lp->lnd_uid, lp);
- petrol += try_supply_commod(lp->lnd_own,
- lp->lnd_x, lp->lnd_y,
- I_PETROL,
- (petrol_needed - petrol));
- lp->lnd_item[I_PETROL] = keeppetrol;
- putland(lp->lnd_uid, lp);
- }
- fuel += petrol * 10;
- }
-
- if (fuel < fuel_needed)
- return 0;
- }
- /* end opt_FUEL */
- return 1;
-}
-
-int
-use_supply(struct lndstr *lp)
-{
- int shells_needed, shells, food, food_needed;
- int fuel_needed, fuel, petrol_needed, petrol;
-
- shells_needed = lp->lnd_ammo;
- shells = lp->lnd_item[I_SHELL];
- if (shells < shells_needed) {
- lp->lnd_item[I_SHELL] = 0;
- putland(lp->lnd_uid, lp);
- shells += supply_commod(lp->lnd_own, lp->lnd_x, lp->lnd_y,
- I_SHELL, shells_needed - shells);
- lp->lnd_item[I_SHELL] = shells;
- }
-
- lp->lnd_item[I_SHELL] = MAX(lp->lnd_item[I_SHELL] - shells_needed, 0);
-
- if (lp->lnd_frg) /* artillery */
- goto done;
-
- food_needed = get_minimum(lp, I_FOOD);
- food = lp->lnd_item[I_SHELL];
-
- if (food < food_needed) {
- lp->lnd_item[I_FOOD] = 0;
- putland(lp->lnd_uid, lp);
- food += supply_commod(lp->lnd_own, lp->lnd_x, lp->lnd_y,
- I_FOOD, food_needed - food);
- lp->lnd_item[I_FOOD] = food;
- }
-
- lp->lnd_item[I_FOOD] = MAX(lp->lnd_item[I_FOOD] - food_needed, 0);
-
- if (opt_FUEL) {
- fuel_needed = lp->lnd_fuelu;
- fuel = lp->lnd_fuel;
-
- petrol = petrol_needed = 0;
-
- if (fuel < fuel_needed) {
- petrol_needed =
- ldround((fuel_needed - fuel) / 10.0, 1);
- petrol = lp->lnd_item[I_PETROL];
- }
-
- if (petrol < petrol_needed) {
- lp->lnd_item[I_PETROL] = 0;
- putland(lp->lnd_uid, lp);
- petrol += supply_commod(lp->lnd_own, lp->lnd_x, lp->lnd_y,
- I_PETROL, petrol_needed - petrol);
- lp->lnd_item[I_PETROL] = petrol;
- }
-
- if (petrol_needed) {
- if (petrol >= petrol_needed) {
- lp->lnd_item[I_PETROL]
- = MAX(lp->lnd_item[I_PETROL] - petrol_needed, 0);
- lp->lnd_fuel += petrol_needed * 10;
- } else {
- lp->lnd_fuel += lp->lnd_item[I_PETROL] * 10;
- lp->lnd_item[I_PETROL] = 0;
- }
- }
-
- lp->lnd_fuel = MAX(lp->lnd_fuel - fuel_needed, 0);
- }
- /* end opt_FUEL */
- done:
- putland(lp->lnd_uid, lp);
return 1;
}