diff options
| author | Freya Murphy <freya@freyacat.org> | 2025-10-07 11:01:19 -0400 |
|---|---|---|
| committer | Freya Murphy <freya@freyacat.org> | 2025-10-08 19:37:15 -0400 |
| commit | b11f074ceba10af62b35b414ecaa51a8f13c6550 (patch) | |
| tree | d12979f7eeb384f94b145ea763a97dcde353745b /dungeon/src/map.rs | |
| parent | Initial commit (diff) | |
| download | DungeonCrawl-b11f074ceba10af62b35b414ecaa51a8f13c6550.tar.gz DungeonCrawl-b11f074ceba10af62b35b414ecaa51a8f13c6550.tar.bz2 DungeonCrawl-b11f074ceba10af62b35b414ecaa51a8f13c6550.zip | |
initial baseline
Diffstat (limited to 'dungeon/src/map.rs')
| -rw-r--r-- | dungeon/src/map.rs | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/dungeon/src/map.rs b/dungeon/src/map.rs new file mode 100644 index 0000000..8c4328c --- /dev/null +++ b/dungeon/src/map.rs @@ -0,0 +1,189 @@ +//! The `map` module contains structures of the dungeon game map +//! including the current `Floor`, map `Tile`, and `Entity`. + +use crate::pos::{Direction, Pos}; + +/// `MAP_SIZE` is the size of the size of the dungeon grid. +pub const MAP_SIZE: u16 = 100; + +/// The number of tiles in the dungeon grid +pub const TILE_COUNT: usize = MAP_SIZE as usize * MAP_SIZE as usize; + +/// The `EntityKind` represents what kind of entity this is. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum EntityKind { + Player, +} + +/// The `Entity` kind represents the main player, or any other +/// ai autonomous character that can move freely across the +/// dungeon. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub struct Entity { + pos: Pos, + dir: Direction, + kind: EntityKind, +} +impl Entity { + /// Creates a new `Entity` at a given `Pos`, `Direction`, and `EntityKind`. + /// + /// # Examples + /// + /// ``` + /// use dungeon::{Pos, Direction, Entity, EntityKind}; + /// + /// let pos = Pos::new(0, 0).unwrap(); + /// let dir = Direction::North; + /// let kind = EntityKind::Player; + /// let entity = Entity::new(pos, dir, kind); + /// ``` + #[must_use] + pub const fn new(pos: Pos, dir: Direction, kind: EntityKind) -> Self { + Self { pos, dir, kind } + } + + /// Creates the Player version of the `Entity` + /// + /// # Examples + /// + /// ``` + /// use dungeon::{Pos, Entity}; + /// + /// let pos = Pos::new(0, 0).unwrap(); + /// let player = Entity::player(pos); + /// ``` + #[must_use] + pub const fn player(pos: Pos) -> Self { + let dir = Direction::East; + let kind = EntityKind::Player; + Self::new(pos, dir, kind) + } + + /// Returns the `Pos` of the entity + #[must_use] + pub const fn pos(&self) -> Pos { + self.pos + } + + /// Returns a mutable referense to the `Pos` of the entity + #[must_use] + pub const fn pos_mut(&mut self) -> &mut Pos { + &mut self.pos + } + + /// Returns the `Direction` of the entity + #[must_use] + pub const fn dir(&self) -> Direction { + self.dir + } + + /// Returns a mutable referense to the `Direction` of the entity + #[must_use] + pub const fn dir_mut(&mut self) -> &mut Direction { + &mut self.dir + } + + /// Returns the `EntityKind` of this entity + #[must_use] + pub const fn kind(&self) -> EntityKind { + self.kind + } +} + +/// The `Tile` enum represents what is (or is not) at +/// any given spot in the dungeon grid. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum Tile { + /// `Wall` represents an impassible wall + Wall, + /// `Air` represents empty walkable space + Air, +} + +/// The `Floor` type represents the current playing +/// grid of the dungeon. It contains the tiles of the +/// grid, and the starting position of the player. +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +pub struct Floor { + /// The dungeon grid + tiles: Box<[Tile; TILE_COUNT]>, + /// The position the player starts at + player_start: Pos, + /// The seed used when generating the dungeon grid + seed: u64, +} +impl Floor { + /// Generates a dungeon `Floor` using wave function collapse. + /// + /// # Examples + /// + /// ```no_run + /// use dungeon::Floor; + /// + /// let floor = Floor::generate(); + /// ``` + #[must_use] + pub fn generate() -> Self { + let seed = rand::random(); + Self::generate_seeded(seed) + } + + /// Genreates a dungeon `Floor` using wave function collapse provided with a seed. + /// + /// The provided seed is used for randomness in the wave function + /// collapse algorithm. + /// + /// # Examples + /// + /// ```no_run + /// use dungeon::Floor; + /// + /// /// here is our very seedy seed + /// let seed = 2893249402u64; + /// let floor = Floor::generate_seeded(seed); + /// ``` + #[must_use] + pub fn generate_seeded(_seed: u64) -> Self { + unimplemented!() + } + + /// Returns the start position of the player + #[must_use] + pub const fn player_start(&self) -> Pos { + self.player_start + } + + /// Returns the seed used to generate the map + #[must_use] + pub const fn seed(&self) -> u64 { + self.seed + } + + /// Returns a `Tile` on the dungeon grid at `Pos`. + #[must_use] + pub const fn get(&self, pos: Pos) -> Tile { + let idx = pos.idx(); + self.tiles[idx] + } + + /// Returns a multable reference to a `Tile` on the dungeon grid at `Pos`. + #[must_use] + pub const fn get_mut(&mut self, pos: Pos) -> &mut Tile { + let idx = pos.idx(); + &mut self.tiles[idx] + } + + /// Returns a reference to all tiles in the `Floor`. + /// The size of this lise will always be `TILE_COUNT` long. + #[must_use] + pub const fn tiles(&self) -> &[Tile] { + &*self.tiles + } + + /// Returns a mutable reference to all tiles in the `Floor`. + /// The size of this lise will always be `TILE_COUNT` long. + #[must_use] + pub const fn tiles_mut(&mut self) -> &mut [Tile] { + &mut *self.tiles + } +} |