Draft: WIP RNG overhaul
Changes how RNGs work, more or less. Can't be merged right now because some things don't work right (notably: netgames).
There's a general base class, srb2::math::rng
, which implements the standard C++ UniformRandomBitGenerator named requirement set plus methods that more or less correspond to the M_Random
/P_Random
interface. This is done because exactly how those methods are implemented has to be the same, or demos can desync.
C++ code can create rng
instances whenever or wherever it would like, making it easier to add non-synchronized generators that are used for one specific purpose without making m_random.cpp
more complicated, such as apparently was done with the HUD interpolation.
There are two implementations of that class:
-
srb2::math::sfc32_rng
: based on the SFC32 RNG. Additionally, it implements some algorithms differently and fixes theRandomByte
bug. -
srb2::math::legacy_rng
: A completely backwards-compatible implementation of the current Ring Racers RNG.
It also exposes srb2::math::default_rng
, which is a type alias for srb2::math::default_rng
. If a new RNG is added in the future, it can be set as default_rng
and the old ones can be retained for backwards compatibility. Non-synchronized generators are always default_rng
.
Old demos will be played back with legacy_rng
in use. New demos explicitly save the RNG type they are using.
New rng
s of both types default to being seeded by std::random_device
, which I believe is usually based on whatever the "good quality OS source" (e.g. /dev/urandom
) would be on a particular platform.
Some new P_Random
functions have been added, and some old ones have been removed. This will be documented later.