mirror of
https://github.com/pret/pokeplatinum.git
synced 2026-03-22 18:26:14 -05:00
76 lines
2.3 KiB
C
76 lines
2.3 KiB
C
#ifndef SPL_RANDOM_H
|
|
#define SPL_RANDOM_H
|
|
|
|
#include <nitro/fx/fx_vec.h>
|
|
#include <nitro/types.h>
|
|
|
|
extern u32 gSPLRandomState;
|
|
|
|
void SPLRandom_VecFx32(VecFx32 *vec);
|
|
void SPLRandom_VecFx32_XY(VecFx32 *vec);
|
|
|
|
/**
|
|
* @brief Generates a random number
|
|
*/
|
|
static inline u32 SPLRandom_Next()
|
|
{
|
|
gSPLRandomState = gSPLRandomState * 0x5eedf715 + 0x1b0cb173;
|
|
return gSPLRandomState;
|
|
}
|
|
|
|
/**
|
|
* @brief Generates a random number in the range [0, 2^bits)
|
|
* @param bits The number of bits to generate
|
|
*/
|
|
static inline u32 SPLRandom_U32(u32 bits)
|
|
{
|
|
return SPLRandom_Next() >> (sizeof(u32) * 8 - bits);
|
|
}
|
|
|
|
/**
|
|
* @brief Generates a random number in the range [0, 2^bits)
|
|
* @param bits The number of bits to generate
|
|
*/
|
|
static inline s32 SPLRandom_S32(u32 bits)
|
|
{
|
|
return (s32)(SPLRandom_Next() >> (sizeof(u32) * 8 - bits));
|
|
}
|
|
|
|
/**
|
|
* @brief Generates a random number in the range [0, 2^bits)
|
|
* @param bits The number of bits to generate
|
|
*/
|
|
static inline fx32 SPLRandom_FX32(u32 bits)
|
|
{
|
|
return (fx32)SPLRandom_Next() >> (sizeof(u32) * 8 - bits);
|
|
}
|
|
|
|
/**
|
|
* @brief Generates a random number in the range [num * (1 - range), num)
|
|
* @param num The number to scale, can be both an integer or a fixed-point number
|
|
* @param range The range to scale the number by, integer in the range [0, 255], which maps to [0, 1]
|
|
*/
|
|
#define SPLRandom_ScaledRangeFX32(num, range) (((num) * (255 - (((range) * (fx32)SPLRandom_U32(8)) >> 8))) >> 8)
|
|
|
|
/**
|
|
* @brief Generates a random number in the range [num * (1 - range), num * 2 * (1 - range))
|
|
* @param num The number to scale, can be both an integer or a fixed-point number
|
|
* @param range The range to scale the number by, integer in the range [0, 255], which maps to [0, 1]
|
|
*/
|
|
#define SPLRandom_DoubleScaledRangeFX32(num, range) ((num) * (255 + (range) - (((range) * (fx32)SPLRandom_U32(8)) >> 7)) >> 8)
|
|
|
|
/**
|
|
* @brief Generates a random number in the range [-num, num)
|
|
* @param num The number to scale, can be both an integer or a fixed-point number
|
|
*/
|
|
#define SPLRandom_RangeFX32(num) (((num) * (s32)SPLRandom_U32(9) - ((num) << 8)) >> 8)
|
|
|
|
/**
|
|
* @brief Generates a random fx32 number in the range [min, max)
|
|
* @param min The minimum number to generate, integer
|
|
* @param max The maximum number to generate, integer
|
|
*/
|
|
#define SPLRandom_BetweenFX32(min, max) ((fx32)(((max) - (min)) * SPLRandom_U32(12) + ((min) * FX32_ONE)))
|
|
|
|
#endif // SPL_RANDOM_H
|