From 81163f9f205f8a62c71c8f32b63fac8290c56915 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 10 Oct 2009 17:07:27 -0400 Subject: [PATCH] Fix missiles interdicting ships outside range or op area 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 | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/lib/subs/shpsub.c b/src/lib/subs/shpsub.c index 3580e022..c46ea7e7 100644 --- a/src/lib/subs/shpsub.c +++ b/src/lib/subs/shpsub.c @@ -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);