This page documents information about UFO 50: Rock On! Island
. Many of the tricks demonstrated here are near impossible in real time and documented for the purposes of creating Tool-assisted Speedruns.
pub struct Rng {
s1: u64,
s2: u64,
}
impl Rng {
pub fn new(seed: u64) -> Self {
let mask = 1431655765;
let s1 = 1253089769 ^ (seed & mask);
let s2 = 2342871706 ^ (seed & !mask);
let mut rng = Rng { s1, s2 };
// When the RNG gets a new seed, it's immediately rolled 20 times for some reason.
for _ in 0..20 {
rng.roll();
}
rng
}
pub fn roll(&mut self) -> u64 {
self.s1 = (65192 * (self.s1 & 65535)) + ((self.s1 & 4294901760) >> 16);
self.s2 = (64473 * (self.s2 & 65535)) + ((self.s2 & 4294901760) >> 16);
(((self.s1 & 65535) << 16) + self.s2) & 4294967295
}
pub fn roll_int(&mut self, l: u64, r: u64) -> u64 {
let val = self.roll();
let numerator = (r - l + 1) * val;
l + numerator / 4294967296
}
pub fn shuffle<T>(&mut self, vals: &mut [T]) {
let mut i = vals.len();
while i > 1 {
i -= 1;
let j = self.roll_int(0, i as u64) as usize;
vals.swap(i, j);
}
}
}