Fix missiles interdicting ships outside range or op area
authorMarkus Armbruster <armbru@pond.sub.org>
Sat, 10 Oct 2009 21:07:27 +0000 (17:07 -0400)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 13 Dec 2009 07:04:07 +0000 (08:04 +0100)
Ship interdiction works sector by sector.  Interdicting missiles
targeted all ships not yet interdicted, not just the ones in the
current sector.  This could lead to interdiction outside missile range
or op area.

src/lib/subs/shpsub.c

index 3580e022ec0dd8cd8d142c5c9d26ff56a344643d..c46ea7e794434ea497a0b99e7857836361eeac80 100644 (file)
@@ -418,7 +418,7 @@ shp_contains(struct emp_qelem *list, int newx, int newy, int wantflags,
 }
 
 static struct ulist *
-most_valuable_ship(struct emp_qelem *list)
+most_valuable_ship(struct emp_qelem *list, coord x, coord y)
 {
     struct emp_qelem *qp;
     struct emp_qelem *next;
@@ -428,6 +428,8 @@ most_valuable_ship(struct emp_qelem *list)
     for (qp = list->q_back; qp != list; qp = next) {
        next = qp->q_back;
        mlp = (struct ulist *)qp;
+       if (mlp->unit.ship.shp_x != x || mlp->unit.ship.shp_y != y)
+           continue;
        if (((struct mchrstr *)mlp->chrp)->m_flags & M_SUB)
            continue;
        if (!((struct mchrstr *)mlp->chrp)->m_nxlight &&
@@ -490,7 +492,7 @@ shp_missile_interdiction(struct emp_qelem *list, coord newx, coord newy,
        newqp = qp->q_back;
        plp = (struct plist *)qp;
 
-       mvs = most_valuable_ship(list);
+       mvs = most_valuable_ship(list, newx, newy);
        if (mvs && mission_pln_equip(plp, NULL, 'p') >= 0) {
            if (msl_hit(&plp->plane,
                        shp_hardtarget(&mvs->unit.ship),
@@ -654,7 +656,7 @@ shp_interdict(struct emp_qelem *list, coord newx, coord newy, natid victim)
                                          shp_easiest_target(list, 0, M_SUB),
                                          MI_INTERDICT),
                           0, M_SUB, newx, newy);
-           if (most_valuable_ship(list)) {
+           if (most_valuable_ship(list, newx, newy)) {
                stopping |=
                    shp_missile_interdiction(list, newx, newy, victim);
            }
@@ -912,7 +914,7 @@ shp_missdef(struct shpstr *sp, natid victim)
     sprintf(buf, "%s", prship(&mlp->unit.ship));
 
     eff = sp->shp_effic;
-    if (most_valuable_ship(&list)) {
+    if (most_valuable_ship(&list, sp->shp_x, sp->shp_y)) {
        shp_missile_interdiction(&list, sp->shp_x, sp->shp_y, sp->shp_own);
        getship(sp->shp_uid, sp);