diff options
| author | Freya Murphy <freya@freyacat.org> | 2025-11-13 09:35:30 -0500 |
|---|---|---|
| committer | Freya Murphy <freya@freyacat.org> | 2025-11-13 09:47:37 -0500 |
| commit | 018d7d4c06a354071f72c77dc03abbbe622fdc81 (patch) | |
| tree | 31c3e42c171cd2ab170260e2efb6f9a320bbc757 /dungeon/src/lib.rs | |
| parent | dungeon: switch to only using small rng from rand (diff) | |
| download | DungeonCrawl-018d7d4c06a354071f72c77dc03abbbe622fdc81.tar.gz DungeonCrawl-018d7d4c06a354071f72c77dc03abbbe622fdc81.tar.bz2 DungeonCrawl-018d7d4c06a354071f72c77dc03abbbe622fdc81.zip | |
dungeon: have Dungeon store the rng, not the Floor
Diffstat (limited to 'dungeon/src/lib.rs')
| -rw-r--r-- | dungeon/src/lib.rs | 89 |
1 files changed, 50 insertions, 39 deletions
diff --git a/dungeon/src/lib.rs b/dungeon/src/lib.rs index 7bc9c05..0021e81 100644 --- a/dungeon/src/lib.rs +++ b/dungeon/src/lib.rs @@ -26,6 +26,8 @@ pub struct Dungeon { pub floor: Floor, pub player: Player, pub enemies: Vec<Entity>, + seed: u64, + rng: SmallRng, } impl Dungeon { /// Creates a new `Dungeon` with a provided seed. @@ -34,15 +36,40 @@ impl Dungeon { /// /// ```no_run /// use dungeon::Dungeon; - /// use rand::{SeedableRng, rngs::SmallRng}; /// /// let seed = 234690523482u64; - /// let rng = SmallRng::seed_from_u64(seed); - /// let dungeon = Dungeon::with_rng(seed, rng); + /// let dungeon = Dungeon::new(seed); /// ``` #[must_use] - pub fn with_rng(seed: u64, rng: SmallRng) -> Self { - Self::from(bsp::generate(seed, rng)) + pub fn new(seed: u64) -> Self { + let mut rng = SmallRng::seed_from_u64(seed); + let floor = bsp::generate(&mut rng); + let player = Player::new(floor.player_start()); + // TODO: Randomize enemy positions/types + let enemies = vec![Entity::zombie(floor.random_walkable_pos(&mut rng))]; + + Self { + floor, + player, + enemies, + seed, + rng, + } + } + + /// Creates a new `Dungeon` with a random seed + /// + /// # Examples + /// + /// ```no_run + /// use dungeon::Dungeon; + /// + /// let dungeon = Dungeon::random(); + /// ``` + #[must_use] + pub fn random() -> Self { + let seed = OsRng.try_next_u64().unwrap_or_default(); + Self::new(seed) } /// Returns the current position of the camera (viewer) @@ -51,6 +78,18 @@ impl Dungeon { self.player.entity.fpos } + /// Returns the seed used to generate the map + #[must_use] + pub const fn seed(&self) -> u64 { + self.seed + } + + /// Returns the random number gen for the `Floor` + #[must_use] + pub fn rng(&mut self) -> &mut SmallRng { + &mut self.rng + } + pub fn update(&mut self, player_input: PlayerInput, delta_time: f32) { self.act_player(player_input, delta_time); self.act_non_players(delta_time); @@ -98,40 +137,12 @@ impl Dungeon { fn act_non_players(&mut self, delta_time: f32) { for enemy in self.enemies.iter_mut() { - enemy.handle_movement(self.player.entity.pos, &mut self.floor, delta_time); - } - } -} -impl Default for Dungeon { - /// Creates a new `Dungeon` with a default rng. - /// - /// # Examples - /// - /// ```no_run - /// use dungeon::Dungeon; - /// - /// let dungeon = Dungeon::default(); - /// ``` - fn default() -> Self { - let seed = OsRng.try_next_u64().unwrap_or(0); - let rng = SmallRng::seed_from_u64(seed); - let floor = bsp::generate(seed, rng); - Self::from(floor) - } -} -impl From<Floor> for Dungeon { - fn from(mut floor: Floor) -> Self { - let player = Player::new(floor.player_start()); - - // TODO: initalize rest of game state - - // TODO: Randomize enemy positions/types - let enemies = vec![Entity::zombie(floor.random_walkable_pos())]; - - Self { - floor, - player, - enemies, + enemy.handle_movement( + self.player.entity.pos, + &self.floor, + &mut self.rng, + delta_time, + ); } } } |