2002.10.27 ~06 improved RNG in Q3VM, Q3 1.32 + Towards a better (Pseudo-)Random Number Generator. http://www.icculus.org/~phaethon/q3a/nbrng/nbrng.html My quest for a better RNG started in Quake 3 Urban Terror (q3ut) v2.5, fueled by countless numbers of "Bullshit Incidents", aka "being 2.5'd". I'm not in a position to improve q3ut myself (read: damn elitist "dev group"), but the repeated 2.5'ing fired up my drive. The stock random number generator in Q3A is a laughably deterministic cyclic PRNG. Just multiplying the seed by 69069, storing the result back into the seed, and then using the new seed value as the random number. (Note: mods compiled to native code use the host OS's (P)RNG) A google search for free RNG source turned up "noiz". The original noiz acts like an ad-hoc system-wide RNG, using an entropy pool file in /etc (or elsewhere) and explicit programs to take the pool, stirs the pool with stdin, and writes back the altered pool; basically a shellified+disked variant of an entropy collector. My terminology is probably rather shoddily used and incorrectly applied, since I just started to look into RNG. I never realized the breadth of research on just figuring out how to *induce* randomness. Anyway, I took noiz and modified it to be function+cvar based. The function to actually collect entropy needs to be strategically placed throughout the mod to correctly scoop up entropy, but otherwise the noiz-based RNG is far more nondeterministic than the stock PRNG. + Quake 3 Software Development Kit v1.32. ftp://ftp.idsoftware.com/idstuff/quake3/source/linuxq3a-sdk-1.32.x86.run So, the new SDK to reflect the new Q3A mod (baseq3) source was released a few days ago. Apparently most of the baseq3 changes involve PunkBuster-related options, such as UI elements to turn it on/off. At last id released their patched lcc, which compiles C to Q3VM assembly (which is actually a variant on the lcc bytecode machine description). As far as I can tell, the 1.32 q3asm doesn't have any speedups over the prior (1.27?) version, although someone took the time to clean up the code to keep gcc quiet. + PunkBuster So now Q3 1.32 has PunkBuster. I have no idea what the basic principles are behind it, but apparently it's supposed to reduce cheating somehow. Since it (PB) deposits .so files on my (client) side, I presume these checks are done client-side. One lesson I recall from the Q1 source release is that anything run on client-side is totally untrustable, as there is really no limit to what the client-side can "say". So I seriously doubt PB can catch "all" or even "most" cheats, if it relies on this client-side .so file to check for client-side... um... stuff. Aside from that, I'm starting to notice strange lags in Q3. Now everything feels like a 100+ ms lag, instead of the usual inherent 50ms lag. It almost feels like CPU/client-side lag, but the framerate still pegs the meter at high double digits. Everything, from baseq3 to ufreeze to q3ut2 to wfa, from extremely low ping to extremely high ping. Either the netcode in Q3 1.32 has hit the shitter, or PunkBuster is stuffing Q3's face into the shitter with extra net comm. Neither one bodes well. Still, it would be extremely stupid if PunkBuster maintains some kind of "out-of-bounds" channel _during_ gameplay, since even so much as a rogue SYN packet can exponentially compound the lag on a 56K connection (a large segment of Q3 players, iirc) and completely ruin the experience (of either side of 0wn@ge). But I find it harder to believe Id would deliberately cripple the netcode in 1.32 sufficiently to make the difference noticeable on a broadband connection. Which is it? Which way would Occam's Razor cut?