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:
parent
490b9392f0
commit
6fd04eabee
3 changed files with 18 additions and 22 deletions
|
@ -1041,7 +1041,14 @@ ask_olist(int combat_mode, struct combat *off, struct combat *def,
|
|||
return;
|
||||
}
|
||||
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));
|
||||
continue;
|
||||
}
|
||||
|
@ -1245,9 +1252,9 @@ get_ototal(int combat_mode, struct combat *off, struct emp_qelem *olist,
|
|||
if (check && att_val < 1.0) {
|
||||
/*
|
||||
* No offensive strength, and fighting hasn't even begun.
|
||||
* Since ask_olist() doesn't offer such land units, the
|
||||
* strength must have been destroyed since then. Leave it
|
||||
* behind.
|
||||
* Since ask_olist() doesn't offer such land units, except
|
||||
* for spies sometimes, it's either a spy, or the strength
|
||||
* must have been destroyed since then. Leave it behind.
|
||||
*/
|
||||
lnd_print(player->cnum, llp, "has no offensive strength");
|
||||
lnd_put_one(llp);
|
||||
|
|
|
@ -84,12 +84,6 @@ attack_val(int combat_mode, struct lndstr *lp)
|
|||
|
||||
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];
|
||||
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;
|
||||
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];
|
||||
/* Spies always die */
|
||||
if (lchr[llp->unit.land.lnd_type].l_flags & L_SPY)
|
||||
llp->unit.land.lnd_effic = 0;
|
||||
else {
|
||||
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);
|
||||
}
|
||||
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) {
|
||||
sprintf(buf, "dies %s %s!",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue