# HG changeset patch # User Emmanuel Gil Peyrot # Date 1566042571 -7200 # Node ID ac092b70c39ad14babd70879d00b0176245b0217 # Parent aefe5b5f481e62fe63737229ad935f0c55d996c0 Fix PRNG not to panic, pass it to Enemy, and initialise it with time in eclrenderer. diff --git a/examples/eclrenderer.rs b/examples/eclrenderer.rs --- a/examples/eclrenderer.rs +++ b/examples/eclrenderer.rs @@ -121,8 +121,9 @@ fn main() { return; } - // TODO: seed this PRNG with a valid seed. - let prng = Rc::new(RefCell::new(Prng::new(0))); + // Get the time since January 1970 as a seed for the PRNG. + let time = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap(); + let prng = Rc::new(RefCell::new(Prng::new(time.subsec_micros() as u16))); // Create the Game god object. let game = Game::new(prng, rank); diff --git a/src/th06/enemy.rs b/src/th06/enemy.rs --- a/src/th06/enemy.rs +++ b/src/th06/enemy.rs @@ -258,7 +258,7 @@ impl Enemy { /// Create a new enemy. pub fn new(pos: Position, life: i32, bonus_dropped: u32, die_score: u32, anm0: Weak>, game: Weak>) -> Rc> { let game_rc = game.upgrade().unwrap(); - let enemy = Enemy { + let mut enemy = Enemy { pos, anm0, game, @@ -271,8 +271,10 @@ impl Enemy { damageable: true, ..Default::default() }; + let mut game = game_rc.borrow_mut(); + enemy.prng = Rc::downgrade(&game.prng); let enemy = Rc::new(RefCell::new(enemy)); - game_rc.borrow_mut().enemies.push(enemy.clone()); + game.enemies.push(enemy.clone()); enemy } diff --git a/src/util/prng.rs b/src/util/prng.rs --- a/src/util/prng.rs +++ b/src/util/prng.rs @@ -18,8 +18,8 @@ impl Prng { /// /// RE’d from 102h.exe@0x41e780 pub fn get_u16(&mut self) -> u16 { - let x = (self.seed ^ 0x9630) - 0x6553; - self.seed = (((x & 0xc000) >> 14) | (x << 2)) & 0xffff; + let x = (self.seed ^ 0x9630).wrapping_sub(0x6553); + self.seed = ((x & 0xc000) >> 14) | (x << 2); self.seed }