From bfea5a2cf43314d243a6475670560201f18b369a Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sun, 8 Mar 2015 14:06:02 +0100 Subject: [PATCH] build: Fix inexact calculation of required materials sector_can_build() computes mat[i] * (effic / 100.0). The division is inexact. The result gets randomly rounded, so errors are vanishingly unlikely to screw up material consumption. However, we require the amount rounded up to be present since commit 1227d2c. Errors *can* screw that up. Fix by avoiding inexact computation for that part. We should probably review rounding of inexact values in general. Signed-off-by: Markus Armbruster --- src/lib/commands/buil.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/lib/commands/buil.c b/src/lib/commands/buil.c index b30049bb7..700113047 100644 --- a/src/lib/commands/buil.c +++ b/src/lib/commands/buil.c @@ -28,7 +28,7 @@ * * Known contributors to this file: * Steve McClure, 1998-2000 - * Markus Armbruster, 2004-2014 + * Markus Armbruster, 2004-2015 */ #include @@ -652,8 +652,8 @@ static int sector_can_build(struct sctstr *sp, short mat[], int work, int effic, char *what) { - int i, avail, ret; - double needed; + int i, avail, ret, req; + double used; if (player->god) return 1; /* Deity builds ex nihilo */ @@ -674,14 +674,15 @@ sector_can_build(struct sctstr *sp, short mat[], int work, ret = 1; for (i = I_NONE + 1; i <= I_MAX; i++) { - needed = mat[i] * (effic / 100.0); - if (sp->sct_item[i] < needed) { - pr("Not enough %s in %s (need %g more)\n", + used = mat[i] * effic; + req = (used + 99) / 100; + if (sp->sct_item[i] < req) { + pr("Not enough %s in %s (need %d more)\n", ichr[i].i_name, xyas(sp->sct_x, sp->sct_y, player->cnum), - ceil(needed - sp->sct_item[i])); + req - sp->sct_item[i]); ret = 0; } - mat[i] = roundavg(needed); + mat[i] = roundavg(used / 100.0); } return ret; -- 2.43.0