Make land units on reserve mission react within op-area

Before, they always reacted to their maximum range, and the op-area
was unused.  Change mission() to define the op-area for reserve
missions as well.  Remove the special-case for showing reserve
missions from mission() and show_mission().  New lnd_reaction_range()
factored out of att_reacting_units().  Use it in oprange() to cover
reserve missions.  Pass the mission as separate parameter to oprange()
for now, because miss() doesn't set it in the object until later.
This commit is contained in:
Markus Armbruster 2008-11-22 14:40:37 -05:00
parent 40d8357746
commit 8e527b6cff
7 changed files with 40 additions and 52 deletions

View file

@ -148,7 +148,7 @@ mission(void)
return RET_FAIL;
}
if (mission && ((mission != MI_RESERVE) && (mission != MI_ESCORT))) {
if (mission && mission != MI_ESCORT) {
if ((p = getstarg(player->argp[4], "operations point? ", buf)) == 0
|| *p == 0)
return RET_SYN;
@ -205,10 +205,11 @@ mission(void)
dist = mapdist(gp->x, gp->y, x, y);
radius = 999;
if ((mission == MI_INTERDICT || mission == MI_SUPPORT ||
mission == MI_OSUPPORT || mission == MI_DSUPPORT ||
mission == MI_AIR_DEFENSE)) {
radius = oprange(gp);
if (mission == MI_INTERDICT || mission == MI_SUPPORT ||
mission == MI_OSUPPORT || mission == MI_DSUPPORT ||
mission == MI_RESERVE ||
mission == MI_AIR_DEFENSE) {
radius = oprange(gp, mission);
if (radius < dist) {
pr("%s: out of range! (range %d)\n",
obj_nameof(gp), radius);
@ -284,6 +285,7 @@ mission(void)
if (mission == MI_INTERDICT || mission == MI_SUPPORT ||
mission == MI_OSUPPORT || mission == MI_DSUPPORT ||
mission == MI_RESERVE ||
mission == MI_AIR_DEFENSE)
gp->radius = radius;
else
@ -291,21 +293,11 @@ mission(void)
if (mission == MI_SUPPORT || mission == MI_OSUPPORT ||
mission == MI_DSUPPORT || mission == MI_INTERDICT ||
mission == MI_RESERVE ||
mission == MI_AIR_DEFENSE) {
pr("%s on %s mission, centered on %s, radius %d\n",
obj_nameof(gp), mission_name(mission),
xyas(x, y, player->cnum), gp->radius);
} else if (mission == MI_RESERVE) {
radius = ((struct lndstr *)gp)->lnd_rad_max;
if (radius) {
getsect(gp->x, gp->y, &opsect);
if ((opsect.sct_type == SCT_HEADQ)
&& (opsect.sct_effic >= 60))
radius++;
}
pr("%s on %s mission with maximum reaction radius %d\n",
obj_nameof(gp), mission_name(mission), radius);
} else if (mission) {
pr("%s on %s mission\n", obj_nameof(gp),
mission_name(mission));

View file

@ -1469,8 +1469,6 @@ att_reacting_units(struct combat *def, struct emp_qelem *list, int a_spy,
double new_land = 0;
double mobcost;
double pathcost;
int dist;
int radius;
int origx, origy;
double eff = att_combat_eff(def);
char buf[1024];
@ -1502,18 +1500,16 @@ att_reacting_units(struct combat *def, struct emp_qelem *list, int a_spy,
if (!has_supply(&land))
continue;
dist = mapdist(land.lnd_x, land.lnd_y, def->x, def->y);
if (land.lnd_mission == MI_RESERVE) {
if (!in_oparea((struct empobj *)&land, def->x, def->y))
continue;
} else {
if (mapdist(land.lnd_x, land.lnd_y, def->x, def->y)
> lnd_reaction_range(&land))
continue;
}
getsect(land.lnd_x, land.lnd_y, &sect);
/* Units on efficient headquarters can react 1 farther */
if ((sect.sct_type == SCT_HEADQ) && (sect.sct_effic >= 60))
radius = land.lnd_rad_max + 1;
else
radius = land.lnd_rad_max;
if (dist > radius)
continue;
getsect(def->x, def->y, &dsect);
if (!BestLandPath(buf, &sect, &dsect, &pathcost,
lnd_mobtype(&land)))

View file

@ -124,6 +124,17 @@ defense_val(struct lndstr *lp)
return value;
}
int
lnd_reaction_range(struct lndstr *lp)
{
struct sctstr sect;
getsect(lp->lnd_x, lp->lnd_y, &sect);
if (sect.sct_type == SCT_HEADQ && sect.sct_effic >= 60)
return lp->lnd_rad_max + 1;
return lp->lnd_rad_max;
}
void
lnd_print(struct ulist *llp, char *s)
{

View file

@ -749,10 +749,9 @@ mission_name(short mission)
void
show_mission(int type, struct nstr_item *np)
{
int first = 1, radius;
int first = 1;
union empobj_storage item;
struct empobj *gp;
struct sctstr sect;
while (nxtitem(np, &item)) {
gp = (struct empobj *)&item;
@ -768,23 +767,13 @@ show_mission(int type, struct nstr_item *np)
switch (gp->mission) {
case MI_INTERDICT:
case MI_SUPPORT:
case MI_RESERVE:
case MI_AIR_DEFENSE:
case MI_DSUPPORT:
case MI_OSUPPORT:
prxy(" %3d,%-3d", gp->opx, gp->opy, player->cnum);
pr(" %4d", gp->radius);
break;
case MI_RESERVE:
radius = item.land.lnd_rad_max;
if (radius) {
getsect(gp->x, gp->y, &sect);
if ((sect.sct_type == SCT_HEADQ) && (sect.sct_effic >= 60))
radius++;
}
prxy(" %3d,%-3d", gp->x, gp->y, player->cnum);
pr(" %4d", radius);
break;
case MI_ESCORT:
pr(" ");
pr(" %4d", item.plane.pln_range / 2);
@ -803,12 +792,14 @@ show_mission(int type, struct nstr_item *np)
}
int
oprange(struct empobj *gp)
oprange(struct empobj *gp, int mission)
{
switch (gp->ef_type) {
case EF_SHIP:
return ldround(shp_fire_range((struct shpstr *)gp), 1);
case EF_LAND:
if (mission == MI_RESERVE)
return lnd_reaction_range((struct lndstr *)gp);
return ldround(lnd_fire_range((struct lndstr *)gp), 1);
case EF_PLANE:
/* missiles go one way, so we can use all the range */
@ -827,7 +818,7 @@ int
in_oparea(struct empobj *gp, coord x, coord y)
{
return mapdist(x, y, gp->opx, gp->opy) <= gp->radius
&& mapdist(x, y, gp->x, gp->y) <= oprange(gp);
&& mapdist(x, y, gp->x, gp->y) <= oprange(gp, gp->mission);
}
/*