summaryrefslogtreecommitdiff
path: root/dungeon/src/lib.rs
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-11-13 09:35:30 -0500
committerFreya Murphy <freya@freyacat.org>2025-11-13 09:47:37 -0500
commit018d7d4c06a354071f72c77dc03abbbe622fdc81 (patch)
tree31c3e42c171cd2ab170260e2efb6f9a320bbc757 /dungeon/src/lib.rs
parentdungeon: switch to only using small rng from rand (diff)
downloadDungeonCrawl-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.rs89
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,
+ );
}
}
}