diff --git a/src/game/utils.c b/src/game/utils.c index 6081039e2..944528aaa 100644 --- a/src/game/utils.c +++ b/src/game/utils.c @@ -3,6 +3,7 @@ #include "game/utils.h" #include "bss.h" #include "lib/memp.h" +#include "lib/rng.h" #include "data.h" #include "types.h" @@ -610,3 +611,277 @@ bool func0f177d5c(u8 *arg0, u8 *arg1) return true; } + +/** + * randomfrac() returns a random float in the range 0.0 to 1.0. + * + * To avoid a bunch of FPU operations, we precompute 256 values within this + * range and then use random() to get an index into the array. It lowers the + * sample size but this is good enough. + * + * To prevent returning 0.0, we offset each value by 0.001953125 + * which is half of one increment. + */ +f32 g_Fracs[256] = { + 0.001953125f + 1.0f / 256.0f * 0, + 0.001953125f + 1.0f / 256.0f * 1, + 0.001953125f + 1.0f / 256.0f * 2, + 0.001953125f + 1.0f / 256.0f * 3, + 0.001953125f + 1.0f / 256.0f * 4, + 0.001953125f + 1.0f / 256.0f * 5, + 0.001953125f + 1.0f / 256.0f * 6, + 0.001953125f + 1.0f / 256.0f * 7, + 0.001953125f + 1.0f / 256.0f * 8, + 0.001953125f + 1.0f / 256.0f * 9, + 0.001953125f + 1.0f / 256.0f * 10, + 0.001953125f + 1.0f / 256.0f * 11, + 0.001953125f + 1.0f / 256.0f * 12, + 0.001953125f + 1.0f / 256.0f * 13, + 0.001953125f + 1.0f / 256.0f * 14, + 0.001953125f + 1.0f / 256.0f * 15, + 0.001953125f + 1.0f / 256.0f * 16, + 0.001953125f + 1.0f / 256.0f * 17, + 0.001953125f + 1.0f / 256.0f * 18, + 0.001953125f + 1.0f / 256.0f * 19, + 0.001953125f + 1.0f / 256.0f * 20, + 0.001953125f + 1.0f / 256.0f * 21, + 0.001953125f + 1.0f / 256.0f * 22, + 0.001953125f + 1.0f / 256.0f * 23, + 0.001953125f + 1.0f / 256.0f * 24, + 0.001953125f + 1.0f / 256.0f * 25, + 0.001953125f + 1.0f / 256.0f * 26, + 0.001953125f + 1.0f / 256.0f * 27, + 0.001953125f + 1.0f / 256.0f * 28, + 0.001953125f + 1.0f / 256.0f * 29, + 0.001953125f + 1.0f / 256.0f * 30, + 0.001953125f + 1.0f / 256.0f * 31, + 0.001953125f + 1.0f / 256.0f * 32, + 0.001953125f + 1.0f / 256.0f * 33, + 0.001953125f + 1.0f / 256.0f * 34, + 0.001953125f + 1.0f / 256.0f * 35, + 0.001953125f + 1.0f / 256.0f * 36, + 0.001953125f + 1.0f / 256.0f * 37, + 0.001953125f + 1.0f / 256.0f * 38, + 0.001953125f + 1.0f / 256.0f * 39, + 0.001953125f + 1.0f / 256.0f * 40, + 0.001953125f + 1.0f / 256.0f * 41, + 0.001953125f + 1.0f / 256.0f * 42, + 0.001953125f + 1.0f / 256.0f * 43, + 0.001953125f + 1.0f / 256.0f * 44, + 0.001953125f + 1.0f / 256.0f * 45, + 0.001953125f + 1.0f / 256.0f * 46, + 0.001953125f + 1.0f / 256.0f * 47, + 0.001953125f + 1.0f / 256.0f * 48, + 0.001953125f + 1.0f / 256.0f * 49, + 0.001953125f + 1.0f / 256.0f * 50, + 0.001953125f + 1.0f / 256.0f * 51, + 0.001953125f + 1.0f / 256.0f * 52, + 0.001953125f + 1.0f / 256.0f * 53, + 0.001953125f + 1.0f / 256.0f * 54, + 0.001953125f + 1.0f / 256.0f * 55, + 0.001953125f + 1.0f / 256.0f * 56, + 0.001953125f + 1.0f / 256.0f * 57, + 0.001953125f + 1.0f / 256.0f * 58, + 0.001953125f + 1.0f / 256.0f * 59, + 0.001953125f + 1.0f / 256.0f * 60, + 0.001953125f + 1.0f / 256.0f * 61, + 0.001953125f + 1.0f / 256.0f * 62, + 0.001953125f + 1.0f / 256.0f * 63, + 0.001953125f + 1.0f / 256.0f * 64, + 0.001953125f + 1.0f / 256.0f * 65, + 0.001953125f + 1.0f / 256.0f * 66, + 0.001953125f + 1.0f / 256.0f * 67, + 0.001953125f + 1.0f / 256.0f * 68, + 0.001953125f + 1.0f / 256.0f * 69, + 0.001953125f + 1.0f / 256.0f * 70, + 0.001953125f + 1.0f / 256.0f * 71, + 0.001953125f + 1.0f / 256.0f * 72, + 0.001953125f + 1.0f / 256.0f * 73, + 0.001953125f + 1.0f / 256.0f * 74, + 0.001953125f + 1.0f / 256.0f * 75, + 0.001953125f + 1.0f / 256.0f * 76, + 0.001953125f + 1.0f / 256.0f * 77, + 0.001953125f + 1.0f / 256.0f * 78, + 0.001953125f + 1.0f / 256.0f * 79, + 0.001953125f + 1.0f / 256.0f * 80, + 0.001953125f + 1.0f / 256.0f * 81, + 0.001953125f + 1.0f / 256.0f * 82, + 0.001953125f + 1.0f / 256.0f * 83, + 0.001953125f + 1.0f / 256.0f * 84, + 0.001953125f + 1.0f / 256.0f * 85, + 0.001953125f + 1.0f / 256.0f * 86, + 0.001953125f + 1.0f / 256.0f * 87, + 0.001953125f + 1.0f / 256.0f * 88, + 0.001953125f + 1.0f / 256.0f * 89, + 0.001953125f + 1.0f / 256.0f * 90, + 0.001953125f + 1.0f / 256.0f * 91, + 0.001953125f + 1.0f / 256.0f * 92, + 0.001953125f + 1.0f / 256.0f * 93, + 0.001953125f + 1.0f / 256.0f * 94, + 0.001953125f + 1.0f / 256.0f * 95, + 0.001953125f + 1.0f / 256.0f * 96, + 0.001953125f + 1.0f / 256.0f * 97, + 0.001953125f + 1.0f / 256.0f * 98, + 0.001953125f + 1.0f / 256.0f * 99, + 0.001953125f + 1.0f / 256.0f * 100, + 0.001953125f + 1.0f / 256.0f * 101, + 0.001953125f + 1.0f / 256.0f * 102, + 0.001953125f + 1.0f / 256.0f * 103, + 0.001953125f + 1.0f / 256.0f * 104, + 0.001953125f + 1.0f / 256.0f * 105, + 0.001953125f + 1.0f / 256.0f * 106, + 0.001953125f + 1.0f / 256.0f * 107, + 0.001953125f + 1.0f / 256.0f * 108, + 0.001953125f + 1.0f / 256.0f * 109, + 0.001953125f + 1.0f / 256.0f * 110, + 0.001953125f + 1.0f / 256.0f * 111, + 0.001953125f + 1.0f / 256.0f * 112, + 0.001953125f + 1.0f / 256.0f * 113, + 0.001953125f + 1.0f / 256.0f * 114, + 0.001953125f + 1.0f / 256.0f * 115, + 0.001953125f + 1.0f / 256.0f * 116, + 0.001953125f + 1.0f / 256.0f * 117, + 0.001953125f + 1.0f / 256.0f * 118, + 0.001953125f + 1.0f / 256.0f * 119, + 0.001953125f + 1.0f / 256.0f * 120, + 0.001953125f + 1.0f / 256.0f * 121, + 0.001953125f + 1.0f / 256.0f * 122, + 0.001953125f + 1.0f / 256.0f * 123, + 0.001953125f + 1.0f / 256.0f * 124, + 0.001953125f + 1.0f / 256.0f * 125, + 0.001953125f + 1.0f / 256.0f * 126, + 0.001953125f + 1.0f / 256.0f * 127, + 0.001953125f + 1.0f / 256.0f * 128, + 0.001953125f + 1.0f / 256.0f * 129, + 0.001953125f + 1.0f / 256.0f * 130, + 0.001953125f + 1.0f / 256.0f * 131, + 0.001953125f + 1.0f / 256.0f * 132, + 0.001953125f + 1.0f / 256.0f * 133, + 0.001953125f + 1.0f / 256.0f * 134, + 0.001953125f + 1.0f / 256.0f * 135, + 0.001953125f + 1.0f / 256.0f * 136, + 0.001953125f + 1.0f / 256.0f * 137, + 0.001953125f + 1.0f / 256.0f * 138, + 0.001953125f + 1.0f / 256.0f * 139, + 0.001953125f + 1.0f / 256.0f * 140, + 0.001953125f + 1.0f / 256.0f * 141, + 0.001953125f + 1.0f / 256.0f * 142, + 0.001953125f + 1.0f / 256.0f * 143, + 0.001953125f + 1.0f / 256.0f * 144, + 0.001953125f + 1.0f / 256.0f * 145, + 0.001953125f + 1.0f / 256.0f * 146, + 0.001953125f + 1.0f / 256.0f * 147, + 0.001953125f + 1.0f / 256.0f * 148, + 0.001953125f + 1.0f / 256.0f * 149, + 0.001953125f + 1.0f / 256.0f * 150, + 0.001953125f + 1.0f / 256.0f * 151, + 0.001953125f + 1.0f / 256.0f * 152, + 0.001953125f + 1.0f / 256.0f * 153, + 0.001953125f + 1.0f / 256.0f * 154, + 0.001953125f + 1.0f / 256.0f * 155, + 0.001953125f + 1.0f / 256.0f * 156, + 0.001953125f + 1.0f / 256.0f * 157, + 0.001953125f + 1.0f / 256.0f * 158, + 0.001953125f + 1.0f / 256.0f * 159, + 0.001953125f + 1.0f / 256.0f * 160, + 0.001953125f + 1.0f / 256.0f * 161, + 0.001953125f + 1.0f / 256.0f * 162, + 0.001953125f + 1.0f / 256.0f * 163, + 0.001953125f + 1.0f / 256.0f * 164, + 0.001953125f + 1.0f / 256.0f * 165, + 0.001953125f + 1.0f / 256.0f * 166, + 0.001953125f + 1.0f / 256.0f * 167, + 0.001953125f + 1.0f / 256.0f * 168, + 0.001953125f + 1.0f / 256.0f * 169, + 0.001953125f + 1.0f / 256.0f * 170, + 0.001953125f + 1.0f / 256.0f * 171, + 0.001953125f + 1.0f / 256.0f * 172, + 0.001953125f + 1.0f / 256.0f * 173, + 0.001953125f + 1.0f / 256.0f * 174, + 0.001953125f + 1.0f / 256.0f * 175, + 0.001953125f + 1.0f / 256.0f * 176, + 0.001953125f + 1.0f / 256.0f * 177, + 0.001953125f + 1.0f / 256.0f * 178, + 0.001953125f + 1.0f / 256.0f * 179, + 0.001953125f + 1.0f / 256.0f * 180, + 0.001953125f + 1.0f / 256.0f * 181, + 0.001953125f + 1.0f / 256.0f * 182, + 0.001953125f + 1.0f / 256.0f * 183, + 0.001953125f + 1.0f / 256.0f * 184, + 0.001953125f + 1.0f / 256.0f * 185, + 0.001953125f + 1.0f / 256.0f * 186, + 0.001953125f + 1.0f / 256.0f * 187, + 0.001953125f + 1.0f / 256.0f * 188, + 0.001953125f + 1.0f / 256.0f * 189, + 0.001953125f + 1.0f / 256.0f * 190, + 0.001953125f + 1.0f / 256.0f * 191, + 0.001953125f + 1.0f / 256.0f * 192, + 0.001953125f + 1.0f / 256.0f * 193, + 0.001953125f + 1.0f / 256.0f * 194, + 0.001953125f + 1.0f / 256.0f * 195, + 0.001953125f + 1.0f / 256.0f * 196, + 0.001953125f + 1.0f / 256.0f * 197, + 0.001953125f + 1.0f / 256.0f * 198, + 0.001953125f + 1.0f / 256.0f * 199, + 0.001953125f + 1.0f / 256.0f * 200, + 0.001953125f + 1.0f / 256.0f * 201, + 0.001953125f + 1.0f / 256.0f * 202, + 0.001953125f + 1.0f / 256.0f * 203, + 0.001953125f + 1.0f / 256.0f * 204, + 0.001953125f + 1.0f / 256.0f * 205, + 0.001953125f + 1.0f / 256.0f * 206, + 0.001953125f + 1.0f / 256.0f * 207, + 0.001953125f + 1.0f / 256.0f * 208, + 0.001953125f + 1.0f / 256.0f * 209, + 0.001953125f + 1.0f / 256.0f * 210, + 0.001953125f + 1.0f / 256.0f * 211, + 0.001953125f + 1.0f / 256.0f * 212, + 0.001953125f + 1.0f / 256.0f * 213, + 0.001953125f + 1.0f / 256.0f * 214, + 0.001953125f + 1.0f / 256.0f * 215, + 0.001953125f + 1.0f / 256.0f * 216, + 0.001953125f + 1.0f / 256.0f * 217, + 0.001953125f + 1.0f / 256.0f * 218, + 0.001953125f + 1.0f / 256.0f * 219, + 0.001953125f + 1.0f / 256.0f * 220, + 0.001953125f + 1.0f / 256.0f * 221, + 0.001953125f + 1.0f / 256.0f * 222, + 0.001953125f + 1.0f / 256.0f * 223, + 0.001953125f + 1.0f / 256.0f * 224, + 0.001953125f + 1.0f / 256.0f * 225, + 0.001953125f + 1.0f / 256.0f * 226, + 0.001953125f + 1.0f / 256.0f * 227, + 0.001953125f + 1.0f / 256.0f * 228, + 0.001953125f + 1.0f / 256.0f * 229, + 0.001953125f + 1.0f / 256.0f * 230, + 0.001953125f + 1.0f / 256.0f * 231, + 0.001953125f + 1.0f / 256.0f * 232, + 0.001953125f + 1.0f / 256.0f * 233, + 0.001953125f + 1.0f / 256.0f * 234, + 0.001953125f + 1.0f / 256.0f * 235, + 0.001953125f + 1.0f / 256.0f * 236, + 0.001953125f + 1.0f / 256.0f * 237, + 0.001953125f + 1.0f / 256.0f * 238, + 0.001953125f + 1.0f / 256.0f * 239, + 0.001953125f + 1.0f / 256.0f * 240, + 0.001953125f + 1.0f / 256.0f * 241, + 0.001953125f + 1.0f / 256.0f * 242, + 0.001953125f + 1.0f / 256.0f * 243, + 0.001953125f + 1.0f / 256.0f * 244, + 0.001953125f + 1.0f / 256.0f * 245, + 0.001953125f + 1.0f / 256.0f * 246, + 0.001953125f + 1.0f / 256.0f * 247, + 0.001953125f + 1.0f / 256.0f * 248, + 0.001953125f + 1.0f / 256.0f * 249, + 0.001953125f + 1.0f / 256.0f * 250, + 0.001953125f + 1.0f / 256.0f * 251, + 0.001953125f + 1.0f / 256.0f * 252, + 0.001953125f + 1.0f / 256.0f * 253, + 0.001953125f + 1.0f / 256.0f * 254, + 0.001953125f + 1.0f / 256.0f * 255, +}; + +f32 randomfrac(void) +{ + return g_Fracs[(random() & 0x3fc) >> 2]; +} diff --git a/src/include/constants.h b/src/include/constants.h index 2d3fb2fda..695e239f0 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -39,7 +39,7 @@ #define MIXCOLOUR(dialog, property) dialog->transitionfrac < 0.0f ? g_MenuColourPalettes[dialog->type].property : colourBlend(g_MenuColourPalettes[dialog->type2].property, g_MenuColourPalettes[dialog->type].property, dialog->colourweight) #define MPCHR(index) ((index) < 4 ? &g_PlayerConfigsArray[index].base : &g_BotConfigsArray[(index) - 4].base) #define PLAYERCOUNT() g_Vars.playercount -#define RANDOMFRAC() (random() * (1.0f / U32_MAX)) +#define RANDOMFRAC() randomfrac() #define SECSTOTIME240(secs) (secs * 240) #define SECSTOTIME60(secs) (secs * 60) #define PFS(device) (device == SAVEDEVICE_GAMEPAK ? NULL : &g_Pfses[device]) diff --git a/src/include/lib/rng.h b/src/include/lib/rng.h index d5231d39d..96c2924b0 100644 --- a/src/include/lib/rng.h +++ b/src/include/lib/rng.h @@ -8,4 +8,6 @@ u32 random(void); void rngSetSeed(u32 seed); u32 rngRotateSeed(u64 *value); +f32 randomfrac(void); + #endif