(lnd_path): Use it.
(lnd_mobcost): Use it, remove last parameter. Callers changed. This
fixes mobility use of trains when retreating, both for retreat orders
and for failed morale checks.
(retreat_land1): Fix test for impassable terrain. Before, trains
could retreat off rail.
(lnd_take_casualty): Test for impassable terrain. Before, trains
could retreat off rail.
extern void lnd_sel(struct nstr_item *, struct emp_qelem *);
extern int lnd_check_mines(struct emp_qelem *);
extern double lnd_pathcost(struct lndstr *, double);
-extern double lnd_mobcost(struct lndstr *, struct sctstr *, int);
+extern int lnd_mobtype(struct lndstr *);
+extern double lnd_mobcost(struct lndstr *, struct sctstr *);
extern char *lnd_path(int, struct lndstr *, char *);
extern int attack_val(int, struct lndstr *);
switch (combat_mode) {
case A_ATTACK:
mobcost = lnd_pathcost(&land,
- att_mobcost(off->own, def, MOB_MARCH));
+ att_mobcost(off->own, def,
+ lnd_mobtype(&land)));
if (land.lnd_mobil < mobcost) {
pr("%s does not have enough mobility (%d needed)\n",
prland(&land), (int)ceil(mobcost));
continue;
getsect(def->x, def->y, &dsect);
- if (!BestLandPath(buf, §, &dsect, &pathcost, MOB_MARCH))
+ if (!BestLandPath(buf, §, &dsect, &pathcost,
+ lnd_mobtype(&land)))
continue;
mobcost = lnd_pathcost(&land, pathcost);
switch (combat_mode) {
case A_ATTACK:
mobcost = lnd_pathcost(&llp->land,
- att_mobcost(off->own, def, MOB_MARCH));
+ att_mobcost(off->own, def,
+ lnd_mobtype(&llp->land)));
new = llp->land.lnd_mobil - mobcost;
if (new < -127)
new = -127;
int taken;
int nowhere_to_go = 0;
struct sctstr rsect;
- double mobcost;
+ double mobcost, bmcost;
signed char orig;
int mob;
continue;
if (sect.sct_type == SCT_MOUNT)
continue;
+ mobcost = lnd_mobcost(&llp->land, &rsect);
+ if (mobcost < 0)
+ continue;
++nowned;
civs = sect.sct_item[I_CIVIL];
if (civs > biggest) {
biggest = civs;
bx = sect.sct_x;
by = sect.sct_y;
+ bmcost = mobcost;
}
}
if (!nowned)
llp->land.lnd_x = bx;
llp->land.lnd_y = by;
getsect(bx, by, &rsect);
- mobcost = lnd_mobcost(&llp->land, &rsect, MOB_MARCH);
- mob = llp->land.lnd_mobil - (int)mobcost;
+ mob = llp->land.lnd_mobil - (int)bmcost;
if (mob < -127)
mob = -127;
orig = llp->land.lnd_mobil;
effspd *= lp->lnd_effic * 0.01;
/*
- * The return value must be pathcost times a factor that depends
+ * The return value must be PATHCOST times a factor that depends
* only on the land unit. Anything else breaks path finding. In
* particular, you can't add or enforce a minimum cost here. Do
* it in sector_mcost().
return pathcost * 5.0 * speed_factor(effspd, lp->lnd_tech);
}
+int
+lnd_mobtype(struct lndstr *lp)
+{
+ return (lchr[(int)lp->lnd_type].l_flags & L_TRAIN)
+ ? MOB_RAIL : MOB_MARCH;
+}
+
double
-lnd_mobcost(struct lndstr *lp, struct sctstr *sp, int mobtype)
+lnd_mobcost(struct lndstr *lp, struct sctstr *sp)
{
- return lnd_pathcost(lp, sector_mcost(sp, mobtype));
+ return lnd_pathcost(lp, sector_mcost(sp, lnd_mobtype(lp)));
}
int
}
llp->land.lnd_x = newx;
llp->land.lnd_y = newy;
- if (lchr[(int)llp->land.lnd_type].l_flags & L_TRAIN) {
- llp->mobil -= lnd_mobcost(&llp->land, §, MOB_RAIL);
- } else {
- llp->mobil -= lnd_mobcost(&llp->land, §, MOB_MARCH);
- }
+ llp->mobil -= lnd_mobcost(&llp->land, §);
llp->land.lnd_mobil = (int)llp->mobil;
llp->land.lnd_harden = 0;
putland(llp->land.lnd_uid, &llp->land);
return 0;
}
getsect(lp->lnd_x, lp->lnd_y, §);
- if (lchr[(int)lp->lnd_type].l_flags & L_TRAIN)
- mtype = MOB_RAIL;
- else
- mtype = MOB_MARCH;
+ mtype = lnd_mobtype(lp);
cp = BestLandPath(buf, §, &d_sect, &dummy, mtype);
if (!cp) {
pr("No owned %s from %s to %s!\n",
newy = ynorm(lp->lnd_y + dy);
getsect(newx, newy, §);
- if ((sect.sct_type == SCT_WATER) ||
- (sect.sct_type == SCT_MOUNT) ||
- (sect.sct_type == SCT_SANCT) ||
- (sect.sct_type == SCT_WASTE) ||
- (sect.sct_own != lp->lnd_own)) {
+ mobcost = lnd_mobcost(lp, §);
+ if (mobcost < 0
+ || sect.sct_type == SCT_MOUNT
+ || sect.sct_own != lp->lnd_own) {
wu(0, lp->lnd_own, "%s %s,\nbut could not retreat to %s!\n",
prland(lp),
conditions[findcondition(code)].desc[orig],
putland(lp->lnd_uid, lp);
return 0;
}
- mobcost = lnd_mobcost(lp, §, MOB_MARCH);
lp->lnd_x = newx;
lp->lnd_y = newy;
lp->lnd_mobil -= mobcost;