assault: Don't send spies into combat

The server doesn't let you send land units without offensive strength
into combat: ask_olist() simply doesn't offer them.  Good.

However, it needs to offer spies for assault, because assault is how
they sneak ashore.  To make it offer spies, which have no offensive
strength, attack_val() artificially sets their offensive strength to
one for assault.  Dirt effect: spies fight (and die) in assaults, even
though they can't otherwise attack.  Lame.  Has been that way since
spies were added in 4.0.0.

Make ask_olist() offer spies regardless of offensive strength when
assaulting, and drop the special case from attack_val().  They get
offered exactly as before.  However, since their offensive strength is
now zero, they won't enter actual combat (see the previous commit).

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
This commit is contained in:
Markus Armbruster 2016-07-24 14:02:53 +02:00
parent 490b9392f0
commit 6fd04eabee
3 changed files with 18 additions and 22 deletions

View file

@ -22,9 +22,6 @@ shelling, bombing, etc. and take ANY damage at all, they die.
Spies may also be snuck on shore via ships using the "assault" Spies may also be snuck on shore via ships using the "assault"
command. If you assault a sector using just spies, a 100% spy has a command. If you assault a sector using just spies, a 100% spy has a
60% chance of getting caught, which increases to 100% for a 20% spy. 60% chance of getting caught, which increases to 100% for a 20% spy.
If you mix spies and mil,
the spies must fight just like normal units. And, since any damage they take
kills them, this is very risky usage of spies.
.s1 .s1
You may locate spies using the "llookout" or the "spy" command. You may locate spies using the "llookout" or the "spy" command.
.s1 .s1

View file

@ -1041,7 +1041,14 @@ ask_olist(int combat_mode, struct combat *off, struct combat *def,
return; return;
} }
att_val = attack_val(combat_mode, &land); att_val = attack_val(combat_mode, &land);
if (att_val < 1.0) { /*
* We need to let spies assault even though they have no
* offensive strength, because assault is how they sneak
* ashore. If this assault turns out to be a fight, they'll
* be removed by get_ototal().
*/
if (att_val < 1.0
&& !(combat_mode == A_ASSAULT && (lcp->l_flags & L_SPY))) {
pr("%s has no offensive strength\n", prland(&land)); pr("%s has no offensive strength\n", prland(&land));
continue; continue;
} }
@ -1245,9 +1252,9 @@ get_ototal(int combat_mode, struct combat *off, struct emp_qelem *olist,
if (check && att_val < 1.0) { if (check && att_val < 1.0) {
/* /*
* No offensive strength, and fighting hasn't even begun. * No offensive strength, and fighting hasn't even begun.
* Since ask_olist() doesn't offer such land units, the * Since ask_olist() doesn't offer such land units, except
* strength must have been destroyed since then. Leave it * for spies sometimes, it's either a spy, or the strength
* behind. * must have been destroyed since then. Leave it behind.
*/ */
lnd_print(player->cnum, llp, "has no offensive strength"); lnd_print(player->cnum, llp, "has no offensive strength");
lnd_put_one(llp); lnd_put_one(llp);

View file

@ -84,12 +84,6 @@ attack_val(int combat_mode, struct lndstr *lp)
lcp = &lchr[(int)lp->lnd_type]; lcp = &lchr[(int)lp->lnd_type];
/* Spies always count as 1 during assaults. If they are the only ones
in the assault, they get to sneak on anyway. */
if (lcp->l_flags & L_SPY && combat_mode == A_ASSAULT)
return 1;
men = lp->lnd_item[I_MILIT]; men = lp->lnd_item[I_MILIT];
value = men * lnd_att(lp) * lp->lnd_effic / 100.0; value = men * lnd_att(lp) * lp->lnd_effic / 100.0;
@ -179,16 +173,14 @@ lnd_take_casualty(int combat_mode, struct ulist *llp, int cas)
signed char orig; signed char orig;
int mob; int mob;
if (CANT_HAPPEN(lchr[llp->unit.land.lnd_type].l_flags & L_SPY))
return 0;
taken = llp->unit.land.lnd_item[I_MILIT]; taken = llp->unit.land.lnd_item[I_MILIT];
/* Spies always die */ eff_eq = ldround(cas * 100.0 /
if (lchr[llp->unit.land.lnd_type].l_flags & L_SPY) lchr[llp->unit.land.lnd_type].l_item[I_MILIT], 1);
llp->unit.land.lnd_effic = 0; llp->unit.land.lnd_effic -= eff_eq;
else { lnd_submil(&llp->unit.land, cas);
eff_eq = ldround(cas * 100.0 /
lchr[llp->unit.land.lnd_type].l_item[I_MILIT], 1);
llp->unit.land.lnd_effic -= eff_eq;
lnd_submil(&llp->unit.land, cas);
}
if (llp->unit.land.lnd_effic < LAND_MINEFF) { if (llp->unit.land.lnd_effic < LAND_MINEFF) {
sprintf(buf, "dies %s %s!", sprintf(buf, "dies %s %s!",