annotate utils/src/prng.rs @ 784:1f152ca95658

Replace pytouhou.utils.random.Random with a Rust version libtouhou.Prng now supports having its seed generated randomly using the getrandom crate, and is now exposed to Python.
author Link Mauve <linkmauve@linkmauve.fr>
date Sun, 23 Nov 2025 12:48:03 +0100
parents 21b186be2590
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
646
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
1 //! Random number generator extracted from EoSD.
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
2
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
3 /// Pseudo-random number generator from EoSD.
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
4 #[derive(Debug)]
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
5 pub struct Prng {
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
6 seed: u16,
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
7 }
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
8
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
9 impl Prng {
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
10 /// Create a new pseudo-random number generator from this seed.
784
1f152ca95658 Replace pytouhou.utils.random.Random with a Rust version
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
11 pub fn new(seed: Option<u16>) -> Prng {
1f152ca95658 Replace pytouhou.utils.random.Random with a Rust version
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
12 // TODO: Maybe add a getrandom::u16() to getrandom instead?
1f152ca95658 Replace pytouhou.utils.random.Random with a Rust version
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
13 let seed = seed.unwrap_or_else(|| getrandom::u32().unwrap() as u16);
646
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
14 Prng {
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
15 seed,
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
16 }
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
17 }
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
18
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
19 /// Generates a pseudo-random u16.
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
20 ///
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
21 /// RE’d from 102h.exe@0x41e780
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
22 pub fn get_u16(&mut self) -> u16 {
687
ac092b70c39a Fix PRNG not to panic, pass it to Enemy, and initialise it with time in eclrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 647
diff changeset
23 let x = (self.seed ^ 0x9630).wrapping_sub(0x6553);
ac092b70c39a Fix PRNG not to panic, pass it to Enemy, and initialise it with time in eclrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 647
diff changeset
24 self.seed = ((x & 0xc000) >> 14) | (x << 2);
646
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
25 self.seed
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
26 }
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
27
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
28 /// Combines two u16 into a single u32.
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
29 ///
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
30 /// RE’d from 102h.exe@0x41e7f0
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
31 pub fn get_u32(&mut self) -> u32 {
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
32 ((self.get_u16() as u32) << 16) | self.get_u16() as u32
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
33 }
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
34
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
35 /// Transforms an u32 into a f64.
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
36 ///
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
37 /// RE’d from 102h.exe@0x41e820
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
38 pub fn get_f64(&mut self) -> f64 {
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
39 self.get_u32() as f64 / (0x100000000u64 as f64)
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
40 }
7d92730bf543 Add a PRNG and use it for anm0 instruction 16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
41 }