]> git.pond.sub.org Git - empserver/commitdiff
Make land units on reserve mission react within op-area
authorMarkus Armbruster <armbru@pond.sub.org>
Sat, 22 Nov 2008 19:40:37 +0000 (14:40 -0500)
committerMarkus Armbruster <armbru@pond.sub.org>
Wed, 17 Dec 2008 17:30:43 +0000 (12:30 -0500)
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.

include/land.h
include/prototypes.h
info/mission.t
src/lib/commands/miss.c
src/lib/subs/attsub.c
src/lib/subs/lndsub.c
src/lib/subs/mission.c

index 0414e361c60a346edf5d993f93439c434d7320e8..59adea1a9588351f17e140b911002d0296ccdf64 100644 (file)
@@ -179,6 +179,7 @@ extern double lnd_mobcost(struct lndstr *, struct sctstr *);
 
 extern double attack_val(int, struct lndstr *);
 extern double defense_val(struct lndstr *);
+extern int lnd_reaction_range(struct lndstr *);
 extern void lnd_print(struct ulist *, char *);
 extern void lnd_delete(struct ulist *, char *);
 extern int lnd_take_casualty(int, struct ulist *, int);
index 5e2ee9b6dce4490b89ba19fc39b99207de2e44fd..c3c6ab4b65142b5a4b54d82189450e59e5a4d2a0 100644 (file)
@@ -484,7 +484,7 @@ extern int ground_interdict(coord, coord, natid, char *);
 extern int unit_interdict(coord, coord, natid, char *, int, int);
 extern int off_support(coord, coord, natid, natid);
 extern int def_support(coord, coord, natid, natid);
-extern int oprange(struct empobj *);
+extern int oprange(struct empobj *, int);
 extern int in_oparea(struct empobj *, coord, coord);
 extern int cando(int, int);
 extern void show_mission(int, struct nstr_item *);
index 3c2a946717c1014617a66c7306bc0c14e19b2ca1..722639cc52d87e191ca2f2a05836e18a1e5cff32 100644 (file)
@@ -66,8 +66,9 @@ OPERATIONS SECTORS
 Some missions require the designation of an 'op sector', short for operations
 sector. This is the center of an area that the mission is focused on.
 The op sector may be any sector that is within the unit's range.
-(Firing range, for ships & land units, flying range for planes,
-changeable with range command).
+(Firing range for ships & land units on interdiction, reaction range
+for land units on reserve, changeable with lrange command, flying
+range for planes, changeable with range command).
 The unit will exert influence in a radius around the op sector.
 By default, the radius will be as large as possible, i.e. the biggest range
 so that the unit/ship/plane could legally act there.)
@@ -289,18 +290,14 @@ lost his planes.
 .s1
 RESERVE MISSIONS (land units only)
 .s1
-This mission has no effect at this time.
+A land unit on a reserve mission may react to enemy attacks within its
+op-area.  See info \*QAttacking\*U for more on land unit reactions.
 .s1
 Note that units with a reserve mission retain this status even when they
 react to a threatened sector and return. This is an exception to the normal
 rules on losing your mission status. If, however, the land unit is forced to
 retreat from the combat (see land combat for details), it DOES lose its status.
 .s1
-When a unit with a reserve mission is listed, the op sector is the sector
-the unit is in, and the radius is the units maximum reaction radius, including
-the bonus for HQ (if applicable). Note that the unit's
-actual radius might be different if it was changed by lrange command.
-.s1
 Note: information gained from planes flying missions is automatically
 added to your bmap.
 .s1
index 5811b68c670685fea787de7630c82f3b0d797fcd..e59f23f7404b9102ca6177d7e8ab8e8276493023 100644 (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));
index 0c67580af863434f9344098c6669c7f931f58659..c55fc5009f4cf11d41740f1cb73b298aedaed63d 100644 (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)))
index 39b0b83f944c9ced35f9a6ec6c7075d9851d59bf..763e5155b47faa10c7375b748161f3b01d0480f2 100644 (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)
 {
index d8d67f90e4c59626d2cf1333cfeb2ad45b35f8d9..dbad24fb77a1778f12ab8a76651db37d91ce7d39 100644 (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);
 }
 
 /*