subs: Factor common military counting out of shoo() and conv()

Put the new function security_strength() next to military_control(),
because that one does a similar count.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
This commit is contained in:
Markus Armbruster 2016-09-16 09:07:52 +02:00
parent 602f15f52d
commit ffd6651f86
4 changed files with 33 additions and 39 deletions

View file

@ -399,6 +399,7 @@ extern int check_trade_ok(struct trdstr *);
/* coastal.c */
extern void set_coastal(struct sctstr *, int, int);
/* control.c */
extern int security_strength(struct sctstr *, int *);
extern int military_control(struct sctstr *);
extern int abandon_askyn(struct sctstr *, i_type, int, struct ulist *);
extern int would_abandon(struct sctstr *, i_type, int, struct ulist *);

View file

@ -28,7 +28,7 @@
*
* Known contributors to this file:
* Dave Pare, 1986
* Markus Armbruster, 2004-2015
* Markus Armbruster, 2004-2016
*/
/*
@ -48,10 +48,8 @@ conv(void)
struct sctstr sect;
struct nstr_sect nstr;
int uwtoconvert, newuw, totaluw, uw;
int maxpop, civ, mil, adj_mob, mob;
int maxpop, civ, mil, nsec, adj_mob, mob;
double security_extra = 1.0;
struct lndstr land;
struct nstr_item ni;
if (!snxtsct(&nstr, player->argp[1]))
return RET_SYN;
@ -68,27 +66,7 @@ conv(void)
natp = getnatp(sect.sct_own);
maxpop = max_pop(natp->nat_level[NAT_RLEV], &sect);
civ = sect.sct_item[I_CIVIL];
mil = sect.sct_item[I_MILIT];
/*
* Military units count according to the number of
* mil in them. (i.e. attack/defense modifier don't
* count.
*/
snxtitem_xy(&ni, EF_LAND, sect.sct_x, sect.sct_y);
while (nxtitem(&ni, &land)) {
mil += land.lnd_item[I_MILIT];
/* Anti-terrorist units count double */
if (lchr[(int)land.lnd_type].l_flags & L_SECURITY) {
/*
* They also increase the efficiency of
* the conversion process by 10% each.
*/
security_extra += .1;
mil += land.lnd_item[I_MILIT];
}
}
mil = security_strength(&sect, &nsec);
/*
* Must have military control to convert captured civs.
*/
@ -110,6 +88,7 @@ conv(void)
mob = sect.sct_mobil * 5;
/* security troops make conversion more effective */
security_extra = 1.0 + nsec / 10.0;
adj_mob = ldround(((double)mob * security_extra), 1);
if (adj_mob < newuw)

View file

@ -43,12 +43,10 @@ shoo(void)
{
struct sctstr sect;
struct nstr_sect nstr;
struct nstr_item ni;
int nshot;
double m;
i_type item;
struct ichrstr *ip;
struct lndstr land;
int targets;
char *p;
int mil, nsec;
@ -68,18 +66,7 @@ shoo(void)
while (nxtsct(&nstr, &sect)) {
if (!player->owner)
continue;
mil = sect.sct_item[I_MILIT];
nsec = 0;
snxtitem_xy(&ni, EF_LAND, sect.sct_x, sect.sct_y);
while (nxtitem(&ni, &land)) {
mil += land.lnd_item[I_MILIT];
if (lchr[(int)land.lnd_type].l_flags & L_SECURITY) {
mil += land.lnd_item[I_MILIT];
nsec++;
}
}
mil = security_strength(&sect, &nsec);
if (sect.sct_item[item] == 0 || sect.sct_item[I_CIVIL] > mil * 10)
continue;
nshot = sect.sct_item[item] > targets ? targets : sect.sct_item[item];

View file

@ -40,6 +40,33 @@
#include "sect.h"
#include "unit.h"
/*
* Return strength of security detail in @sp.
* Store number of land units with security capability in @nsecurity.
*/
int
security_strength(struct sctstr *sp, int *nsecurity)
{
int strength;
int nsec;
struct nstr_item ni;
struct lndstr land;
strength = sp->sct_item[I_MILIT];
nsec = 0;
snxtitem_xy(&ni, EF_LAND, sp->sct_x, sp->sct_y);
while (nxtitem(&ni, &land)) {
strength += land.lnd_item[I_MILIT];
if (lchr[land.lnd_type].l_flags & L_SECURITY) {
strength += land.lnd_item[I_MILIT];
nsec++;
}
}
*nsecurity = nsec;
return strength;
}
/*
* Does the player->owner have military control of this sector?
*/