Fix melting of big piles of stuff by ridiculously heavy fallout
authorMarkus Armbruster <armbru@pond.sub.org>
Sun, 13 Jan 2013 16:17:44 +0000 (17:17 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Wed, 8 May 2013 04:57:54 +0000 (06:57 +0200)
meltitems() computes #items * etus per update * fallout in type long.
Theoretical maximum is ITEM_MAX * etus * FALLOUT_MAX = 99980001 *
etus.  Can overflow 32 bits for etus > 21.  Has been broken since the
introduction of fallout in KSU.

Compute the product in double instead.

src/lib/update/sect.c

index 99310647d49655fd4cfe2579760537003c3b8577..0bf31bf7e3d262e3f097d95eabe1f4ab195c469d 100644 (file)
@@ -159,7 +159,7 @@ meltitems(int etus, int fallout, int own, short *vec,
     int melt;
 
     for (n = I_NONE + 1; n <= I_MAX; n++) {
-       melt = roundavg(vec[n] * etus * (long)fallout
+       melt = roundavg(vec[n] * etus * (double)fallout
                        / (1000.0 * ichr[n].i_melt_denom));
        if (melt > vec[n])
            melt = vec[n];