From e1a56677f4c442b75dd906efa3fc2291146cce50 Mon Sep 17 00:00:00 2001 From: SpaceViking Date: Fri, 1 May 2009 03:08:54 +0000 Subject: [PATCH] Move random functions to .h and inline them. This will speed up the code overall given their high usage. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@2788 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Standard Gaming Platform/Random.cpp | 71 +--------------------- Standard Gaming Platform/random.h | 92 +++++++++++++++++++++++++---- 2 files changed, 83 insertions(+), 80 deletions(-) diff --git a/Standard Gaming Platform/Random.cpp b/Standard Gaming Platform/Random.cpp index 60110d9df..109488333 100644 --- a/Standard Gaming Platform/Random.cpp +++ b/Standard Gaming Platform/Random.cpp @@ -1,12 +1,8 @@ -#ifdef JA2_PRECOMPILED_HEADERS - #include "JA2 SGP ALL.H" -#else - #include "Random.h" -#endif +#include "Random.h" +#include UINT32 guiPreRandomIndex = 0; -UINT32 guiPreRandomNums[ MAX_PREGENERATED_NUMS ]; - +std::vector guiPreRandomNums(MAX_PREGENERATED_NUMS, 0); void InitializeRandom() { @@ -21,64 +17,3 @@ void InitializeRandom() } guiPreRandomIndex = 0; } - -// 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) - if (uiRange == 0) - return(0); - return rand() * uiRange / RAND_MAX % uiRange; -} - -BOOLEAN Chance( UINT32 uiChance ) -{ - //AssertLE(uiChance, 100); - // lalien: since uiChance calculation is based on different values it can happen that uiChance is > than 100% - // It's not critical because uiChance >= 100 will always return TRUE. No need to crash the entire game. - // Make sure that uiChance value is not < than 0, or it can switch to positive - - return (BOOLEAN)(Random( 100 ) < uiChance); -} - -UINT32 PreRandom( UINT32 uiRange ) -{ - UINT32 uiNum; - 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; - // WDS 07/06/2008 fix prerandom - if (guiPreRandomIndex == MAX_PREGENERATED_NUMS / 2) { - // [0..(MAX_PREGENERATED_NUMS/2) -1] - for( unsigned idx = 0; idx < MAX_PREGENERATED_NUMS / 2; ++idx ) { - guiPreRandomNums[ idx ] = rand(); - } - } else if (guiPreRandomIndex >= (UINT32)MAX_PREGENERATED_NUMS ) { - // MAX_PREGENERATED_NUMS/2 .. MAX_PREGENERATED_NUMS-1] - for( unsigned idx = MAX_PREGENERATED_NUMS / 2; idx < MAX_PREGENERATED_NUMS; ++idx ) { - guiPreRandomNums[ idx ] = rand(); - } - guiPreRandomIndex = 0; - } - return uiNum; -} - -BOOLEAN PreChance( UINT32 uiChance ) -{ - //AssertLE(uiChance, 100); - // lalien: since uiChance calculation is based on different values it can happen that uiChance is > than 100% - // It's not critical because uiChance >= 100 will always return TRUE. No need to crash the entire game. - // Make sure that uiChance value is not < than 0, or it can switch to positive - - return (BOOLEAN)(PreRandom( 100 ) < uiChance); -} diff --git a/Standard Gaming Platform/random.h b/Standard Gaming Platform/random.h index e2dbb2112..81e462c65 100644 --- a/Standard Gaming Platform/random.h +++ b/Standard Gaming Platform/random.h @@ -4,24 +4,92 @@ #include "Types.h" #include "Debug.h" #include -#include + +//IMPORTANT: Changing this define will invalidate the JA2 save. If this +// is necessary, please ifdef your own value. +#define MAX_PREGENERATED_NUMS 256 + +extern UINT32 guiPreRandomIndex; +extern std::vector guiPreRandomNums; extern void InitializeRandom(void); -extern UINT32 Random( UINT32 uiRange ); + + +// WDS 04/20/2009 -- Random functions were moved to inline functions here in the header file +// to speed up the whole program a bit. + + +// Returns a pseudo-random unsigned integer between 0 and uiRange-1 inclusive. +// NOTE THE -1! So if you call Random(100) the numbers returned will +// be between 0 and 99 inclusive. +inline UINT32 Random(UINT32 uiRange) +{ + // Always return 0, if no range given (it's not an error) + if (uiRange == 0) + return(0); + return rand() * uiRange / RAND_MAX % uiRange; +} + + +// Returns a pseudo-random integer between 0 and uiRange-1 +inline INT32 iRandom(UINT32 uiRange) +{ + // Always return 0, if no range given (it's not an error) + if (uiRange == 0) + return(0); + return rand() * uiRange / RAND_MAX % uiRange; +} + //Chance( 74 ) returns TRUE 74% of the time. If uiChance >= 100, then it will always return TRUE. -extern BOOLEAN Chance( UINT32 uiChance ); +inline BOOLEAN Chance( UINT32 uiChance ) +{ + //AssertLE(uiChance, 100); + // lalien: since uiChance calculation is based on different values it can happen that uiChance is > than 100% + // It's not critical because uiChance >= 100 will always return TRUE. No need to crash the entire game. + // Make sure that uiChance value is not < than 0, or it can switch to positive + return (BOOLEAN)(Random( 100 ) < uiChance); +} - //Returns a pregenerated random number. - //Used to deter Ian's tactic of shoot, miss, restore saved game :) - extern UINT32 PreRandom( UINT32 uiRange ); - extern BOOLEAN PreChance( UINT32 uiChance ); - //IMPORTANT: Changing this define will invalidate the JA2 save. If this - // is necessary, please ifdef your own value. - #define MAX_PREGENERATED_NUMS 256 - extern UINT32 guiPreRandomIndex; - extern UINT32 guiPreRandomNums[ MAX_PREGENERATED_NUMS ]; +//Returns a pregenerated random number. +//Used to deter Ian's tactic of shoot, miss, restore saved game :) +inline UINT32 PreRandom( UINT32 uiRange ) +{ + UINT32 uiNum; + if( uiRange == 0 ) + return 0; + //Extract the current pregenerated number + uiNum = guiPreRandomNums[ guiPreRandomIndex ] * uiRange / RAND_MAX % uiRange; + + //Go to the next index. + guiPreRandomIndex++; + + // Reload the random numbers even so often + if (guiPreRandomIndex == MAX_PREGENERATED_NUMS / 2) { + // [0..(MAX_PREGENERATED_NUMS/2) -1] + for( unsigned idx = 0; idx < MAX_PREGENERATED_NUMS / 2; ++idx ) { + guiPreRandomNums[ idx ] = rand(); + } + } else if (guiPreRandomIndex >= (UINT32)MAX_PREGENERATED_NUMS ) { + // [MAX_PREGENERATED_NUMS/2 .. MAX_PREGENERATED_NUMS-1] + for( unsigned idx = MAX_PREGENERATED_NUMS / 2; idx < MAX_PREGENERATED_NUMS; ++idx ) { + guiPreRandomNums[ idx ] = rand(); + } + guiPreRandomIndex = 0; + } + return uiNum; +} + +inline BOOLEAN PreChance( UINT32 uiChance ) +{ + //AssertLE(uiChance, 100); + // lalien: since uiChance calculation is based on different values it can happen that uiChance is > than 100% + // It's not critical because uiChance >= 100 will always return TRUE. No need to crash the entire game. + // Make sure that uiChance value is not < than 0, or it can switch to positive + + return (BOOLEAN)(PreRandom( 100 ) < uiChance); +} #endif \ No newline at end of file