Mercurial > touhou
changeset 687:ac092b70c39a
Fix PRNG not to panic, pass it to Enemy, and initialise it with time in eclrenderer.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sat, 17 Aug 2019 13:49:31 +0200 |
parents | aefe5b5f481e |
children | 1adecaddf442 |
files | examples/eclrenderer.rs src/th06/enemy.rs src/util/prng.rs |
diffstat | 3 files changed, 9 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- 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);
--- 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<RefCell<Anm0>>, game: Weak<RefCell<Game>>) -> Rc<RefCell<Enemy>> { 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 }
--- 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 }