DWORD g_something; BYTE g_randSeed1, g_randSeed2, g_randSeed3, g_randSeed4; void reinit_random_number_generator(unsigned int result) { char seed2 = g_randSeed2; if ( !(g_flags & 2) ) { g_randSeed1 = result >> 1; g_randSeed3 = result >> 5; ++g_something; g_randSeed4 = result >> 3; seed2 = (BYTE)g_something + 3 * (BYTE)result; g_randSeed1 += 3 * (BYTE)g_something; g_randSeed4 += g_something >> 1; g_randSeed3 += 4 * (BYTE)g_something; } g_randSeed2 = seed2; } int random(int max) { static char table[256]; static int initialized = 0; if ( !initialized ) { int file = open("random.dat", 512); assert(file != -1, "ERROR random.dat not found\n"); read(file, table, 256); close(file); initialized = 1; } int result; if ( max <= 255 ) { result = max * (g_randomTable[g_randSeed1] ^ g_randomTable[g_randSeed2] ^ (unsigned int)g_randomTable[g_randSeed3]) >> 8; } else if ( max <= 65535 ) { result = max * (((g_randomTable[g_randSeed3] ^ g_randomTable[g_randSeed1] ^ g_randomTable[g_randSeed4]) << 8) | g_randomTable[g_randSeed2] ^ g_randomTable[g_randSeed1] ^ (unsigned int)g_randomTable[g_randSeed3]) >> 16; } else { result = g_randomTable[g_randSeed4] ^ ((max >> 8) * (g_randomTable[g_randSeed3] ^ g_randomTable[g_randSeed1] ^ g_randomTable[g_randSeed2] | ((unsigned int)g_randomTable[g_randSeed4] << 8)) >> 16 << 8); } g_randSeed1 -= 2; g_randSeed2 += 1; g_randSeed3 += 3; g_randSeed4 += 7; return result; }