Being in supply is relevant for defending and reacting units. The
code used has_supply() to check that.
Contrary to its name, has_supply() does not check whether the land
unit has enough supplies to be in supply, but whether it has or could
draw enough. So, defending and reacting units did not actually draw
any missing supplies.
Fix that in get_dlist() and att_reacting_units() by calling
resupply_all(), then checking with new lnd_in_supply() instead of
has_supply(). The fix of att_reacting_units() is complicated by the
fact that it is also used in the strength command, and should keep not
drawing supplies there.
Rename has_supply() to lnd_could_be_supplied(). Replace its uses
immediately after resupply_all() by lnd_in_supply().
extern void resupply_all(struct lndstr *);
extern void resupply_commod(struct lndstr *, i_type);
extern int supply_commod(int, int, int, i_type, int);
extern void resupply_all(struct lndstr *);
extern void resupply_commod(struct lndstr *, i_type);
extern int supply_commod(int, int, int, i_type, int);
-extern int has_supply(struct lndstr *);
+extern int lnd_in_supply(struct lndstr *);
+extern int lnd_could_be_supplied(struct lndstr *);
/* takeover.c */
extern void takeover_land(struct lndstr *, natid);
extern void takeover(struct sctstr *, natid);
/* takeover.c */
extern void takeover_land(struct lndstr *, natid);
extern void takeover(struct sctstr *, natid);
resupply_all(&land);
#endif
putland(land.lnd_uid, &land);
resupply_all(&land);
#endif
putland(land.lnd_uid, &land);
- if (!has_supply(&land))
+ if (!lnd_in_supply(&land))
pr("WARNING: %s is out of supply!\n", prland(&land));
} else {
sprintf(buf, "unloaded in your %s at %s",
pr("WARNING: %s is out of supply!\n", prland(&land));
} else {
sprintf(buf, "unloaded in your %s at %s",
resupply_all(&land);
#endif
putland(land.lnd_uid, &land);
resupply_all(&land);
#endif
putland(land.lnd_uid, &land);
- if (!has_supply(&land))
+ if (!lnd_in_supply(&land))
pr("WARNING: %s is out of supply!\n", prland(&land));
} else {
sprintf(buf, "unloaded in your %s at %s",
pr("WARNING: %s is out of supply!\n", prland(&land));
} else {
sprintf(buf, "unloaded in your %s at %s",
if (land.lnd_ship >= 0)
continue;
d_unit = defense_val(&land);
if (land.lnd_ship >= 0)
continue;
d_unit = defense_val(&land);
- if (!has_supply(&land))
+ if (!lnd_could_be_supplied(&land))
d_unit /= 2.0;
dtotal += d_unit;
}
d_unit /= 2.0;
dtotal += d_unit;
}
nunits++;
resupply_all(&land);
putland(land.lnd_uid, &land);
nunits++;
resupply_all(&land);
putland(land.lnd_uid, &land);
+ if (lnd_in_supply(&land))
pr("%s has supplies\n", prland(&land));
else
pr("%s is out of supply\n", prland(&land));
pr("%s has supplies\n", prland(&land));
else
pr("%s is out of supply\n", prland(&land));
}
resupply_all(&land);
putland(land.lnd_uid, &land);
}
resupply_all(&land);
putland(land.lnd_uid, &land);
- if (!has_supply(&land)) {
+ if (!lnd_in_supply(&land)) {
pr("%s is out of supply, and cannot %s\n",
prland(&land), att_mode[combat_mode]);
continue;
pr("%s is out of supply, and cannot %s\n",
prland(&land), att_mode[combat_mode]);
continue;
}
memset(llp, 0, sizeof(struct ulist));
emp_insque(&llp->queue, list);
}
memset(llp, 0, sizeof(struct ulist));
emp_insque(&llp->queue, list);
- llp->supplied = has_supply(&land);
+ resupply_all(&land);
+ putland(land.lnd_uid, &land);
+ llp->supplied = lnd_in_supply(&land);
if (!get_land(A_DEFEND, def, land.lnd_uid, llp, 1))
continue;
if (lnd_spyval(&land) > *d_spyp)
if (!get_land(A_DEFEND, def, land.lnd_uid, llp, 1))
continue;
if (lnd_spyval(&land) > *d_spyp)
continue;
/* Only supplied units can react */
continue;
/* Only supplied units can react */
- if (!has_supply(&land))
- continue;
+ if (list) {
+ resupply_all(&land);
+ putland(land.lnd_uid, &land);
+ if (!lnd_in_supply(&land))
+ continue;
+ } else {
+ if (!lnd_could_be_supplied(&land))
+ continue;
+ }
if (!in_oparea((struct empobj *)&land, def->x, def->y))
continue;
if (!in_oparea((struct empobj *)&land, def->x, def->y))
continue;
+int
+lnd_in_supply(struct lndstr *lp)
+{
+ if (!opt_NOFOOD) {
+ if (lp->lnd_item[I_FOOD] < get_minimum(lp, I_FOOD))
+ return 0;
+ }
+ return lp->lnd_item[I_SHELL] >= get_minimum(lp, I_SHELL);
+}
+
/*
* Actually get the commod
*/
/*
* Actually get the commod
*/
-has_supply(struct lndstr *lp)
+lnd_could_be_supplied(struct lndstr *lp)
{
int shells_needed, shells, keepshells;
int food, food_needed, keepfood;
{
int shells_needed, shells, keepshells;
int food, food_needed, keepfood;