Fix loading x-light missiles on ships without capability plane
authorMarkus Armbruster <armbru@pond.sub.org>
Sun, 2 May 2010 16:27:33 +0000 (18:27 +0200)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 9 May 2010 07:08:04 +0000 (09:08 +0200)
These ships could only use their x-light slots for x-light planes, not
their plane slots.  For instance, agc (30 x-light slots, 32 plane
slots) could load only 30 sams, and mb (0 x-light slots, 10 plane
slots) could not load any sams.

Culprit is could_be_on_ship().  Broken in commit 3e370da5, v4.3.17.

src/lib/subs/plnsub.c

index 0367d77d63a53f5f381d33256436c191e256d86c..924f59c237c98877ba8c01e93f54d03db2676284 100644 (file)
@@ -827,6 +827,7 @@ could_be_on_ship(struct plnstr *pp, struct shpstr *sp,
 {
     struct plchrstr *pcp = &plchr[pp->pln_type];
     struct mchrstr *mcp = &mchr[sp->shp_type];
+    int nfw;
 
     if (pcp->pl_flags & P_K)
        nch++;
@@ -837,14 +838,17 @@ could_be_on_ship(struct plnstr *pp, struct shpstr *sp,
     else if (pcp->pl_flags & P_M)
        nmsl++;
     n++;
+    nfw = n - nch - nxl - nmsl;
 
-    n -= MIN(nch, mcp->m_nchoppers);
-    n -= MIN(nxl, mcp->m_nxlight);
+    if (nch > mcp->m_nchoppers) /* overflow into fixed-wing slots */
+       nfw += nch - mcp->m_nchoppers;
+    if (nxl > mcp->m_nxlight)  /* overflow into missile slots */
+       nmsl += nxl - mcp->m_nxlight;
     if (nmsl && !(mcp->m_flags & (M_MSL | M_FLY)))
        return 0;               /* missile slots wanted */
-    if (nmsl < n && !(mcp->m_flags & M_FLY))
+    if (nfw && !(mcp->m_flags & M_FLY))
        return 0;               /* fixed-wing slots wanted */
-    return n <= mcp->m_nplanes;
+    return nfw + nmsl <= mcp->m_nplanes;
 }
 
 /*