#ifdef JA2_PRECOMPILED_HEADERS
	#include "JA2 SGP ALL.H"
#elif defined( WIZ8_PRECOMPILED_HEADERS )
	#include "WIZ8 SGP ALL.H"
#else
	#include "Random.h"
#endif

#ifdef PRERANDOM_GENERATOR

	UINT32 guiPreRandomIndex = 0;
	UINT32 guiPreRandomNums[ MAX_PREGENERATED_NUMS ];

	#ifdef JA2BETAVERSION
		UINT32 guiRandoms = 0;
		UINT32 guiPreRandoms = 0;
		BOOLEAN gfCountRandoms = FALSE;
	#endif

#endif


void InitializeRandom()
{
  // Seed the random-number generator with current time so that
  // the numbers will be different every time we run.
  srand( (unsigned) time(NULL) );
	#ifdef PRERANDOM_GENERATOR
		//Pregenerate all of the random numbers.
		for( guiPreRandomIndex = 0; guiPreRandomIndex < MAX_PREGENERATED_NUMS; guiPreRandomIndex++ )
		{
			guiPreRandomNums[ guiPreRandomIndex ] = rand();
		}
		guiPreRandomIndex = 0;
	#endif
}

// Returns a pseudo-random integer between 0 and uiRange
UINT32 Random(UINT32 uiRange)
{
	// Always return 0, if no range given (it's not an error)
	#ifdef JA2BETAVERSION
		if( gfCountRandoms )
		{
			guiRandoms++;
		}
	#endif

  if (uiRange == 0)	
		return(0);
	return rand() * uiRange / RAND_MAX % uiRange;
}

BOOLEAN Chance( UINT32 uiChance )
{
	return (BOOLEAN)(Random( 100 ) < uiChance);
}

#ifdef PRERANDOM_GENERATOR

UINT32 PreRandom( UINT32 uiRange )
{
	UINT32 uiNum;
	#ifdef JA2BETAVERSION
		if( gfCountRandoms )
		{
			guiPreRandoms++;
		}
	#endif
	if( !uiRange )
		return 0;
	//Extract the current pregenerated number
	uiNum = guiPreRandomNums[ guiPreRandomIndex ] * uiRange / RAND_MAX % uiRange;
	//Replace the current pregenerated number with a new one.

	//This was removed in the name of optimization.  Uncomment if you hate recycling.
	//guiPreRandomNums[ guiPreRandomIndex ] = rand();

	//Go to the next index.
	guiPreRandomIndex++;
	if( guiPreRandomIndex >= (UINT32)MAX_PREGENERATED_NUMS )
		guiPreRandomIndex = 0;
	return uiNum;
}

BOOLEAN PreChance( UINT32 uiChance )
{
	return (BOOLEAN)(PreRandom( 100 ) < uiChance);
}

#ifdef JA2BETAVERSION
void CountRandomCalls( BOOLEAN fStart )
{
	gfCountRandoms = fStart;
	if( fStart )
	{
		guiRandoms = 0;
		guiPreRandoms = 0;
	}
}

void GetRandomCalls( UINT32 *puiRandoms, UINT32 *puiPreRandoms )
{
	*puiRandoms = guiRandoms;
	*puiPreRandoms = guiPreRandoms;
}
#endif

#endif
