From e08e13fc3d6a529b276d72a6143ba2942822f05c Mon Sep 17 00:00:00 2001 From: havoc Date: Fri, 13 Mar 2009 06:41:13 +0000 Subject: [PATCH] made lhrandom never return MIN (it already never returned MAX), to fix the "stone monster" bug from Quake, where occasionally a monster never even spawns properly because its walkmonster_start_go function had a nextthink value of exactly 0 git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8806 d7cf8633-e32d-0410-b094-e92efae38249 --- mathlib.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mathlib.h b/mathlib.h index 70f71981..c862564e 100644 --- a/mathlib.h +++ b/mathlib.h @@ -49,8 +49,14 @@ extern vec3_t vec3_origin; #define max(A,B) ((A) > (B) ? (A) : (B)) #endif -//#define lhrandom(MIN,MAX) ((rand() & 32767) * (((MAX)-(MIN)) * (1.0f / 32768.0f)) + (MIN)) -#define lhrandom(MIN,MAX) (((double)rand() / ((double)RAND_MAX + 1)) * ((MAX)-(MIN)) + (MIN)) +// LordHavoc: this function never returns exactly MIN or exactly MAX, because +// of a QuakeC bug in id1 where the line +// self.nextthink = self.nexthink + random() * 0.5; +// can result in 0 (self.nextthink is 0 at this point in the code to begin +// with), causing "stone monsters" that never spawned properly, also MAX is +// avoided because some people use random() as an index into arrays or for +// loop conditions, where hitting exactly MAX may be a fatal error +#define lhrandom(MIN,MAX) (((double)(rand() + 0.5) / ((double)RAND_MAX + 1)) * ((MAX)-(MIN)) + (MIN)) #define invpow(base,number) (log(number) / log(base)) -- 2.39.2