diff options
Diffstat (limited to 'dungeon/src/lib.rs')
| -rw-r--r-- | dungeon/src/lib.rs | 79 |
1 files changed, 23 insertions, 56 deletions
diff --git a/dungeon/src/lib.rs b/dungeon/src/lib.rs index 0c9e055..036671c 100644 --- a/dungeon/src/lib.rs +++ b/dungeon/src/lib.rs @@ -16,7 +16,7 @@ use rand::{ use crate::{ entity::{Entity, Player}, - map::Floor, + map::{Floor, Tile}, msg::Message, player_input::PlayerInput, pos::FPos, @@ -29,6 +29,8 @@ use crate::{ pub enum UpdateResult { /// Default, entities have moved EntityMovement, + /// We have moved to the next floor + NextFloor, /// Message on screen updated. /// Contains if a char was added. MessageUpdated(bool), @@ -61,18 +63,19 @@ impl Dungeon { 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))]; + let enemies = vec![]; let msg = Message::empty(); - - Self { + let mut dungeon = Self { floor, player, enemies, msg, seed, rng, - } + }; + + dungeon.spawn_enimies(); + dungeon } /// Creates a new `Dungeon` with a random seed @@ -113,60 +116,24 @@ impl Dungeon { let changed = self.msg.update(player_input); UpdateResult::MessageUpdated(changed) } else { - self.act_player(player_input, delta_time); - self.act_non_players(delta_time); - UpdateResult::EntityMovement - } - } + self.update_entities(player_input, delta_time); - fn act_player(&mut self, player_input: PlayerInput, delta_time: f32) { - let mut move_distance = self.player.entity.kind.move_speed() * delta_time; - // having this be a loop is a *little* unnecessary, - // but is technically more correct if the entity is fast enough - // to move more than one tile in a single frame - // (plus, it was easier to write if i thought of this like a state machine) - loop { - match (self.player.moving_to, player_input.direction) { - (Some(pos), _) => { - move_distance -= self - .player - .entity - .fpos - .move_towards_manhattan(pos.into(), move_distance); - if move_distance == 0.0 { - // can't move any further - break; - } - // otherwise, reached `pos` - self.player.entity.pos = pos; - self.player.moving_to = None; - // continue moving - } - (None, Some(dir)) => { - // set direction & find out next position - self.player.entity.dir = dir; - if let Some(pos) = self.player.entity.pos.step(dir) - && self.floor.get(pos).is_walkable() - { - self.player.moving_to = Some(pos); - } else { - break; - } - } - (None, None) => break, + if self.floor.get(self.player.entity.pos) == Tile::Stairs { + // we are moving to a new floor + self.floor = bsp::generate(&mut self.rng); + self.player.entity.teleport(self.floor.player_start()); + self.spawn_enimies(); + return UpdateResult::NextFloor; } + + UpdateResult::EntityMovement } - // TODO: reuse a similar structure across all entities } - fn act_non_players(&mut self, delta_time: f32) { - for enemy in &mut self.enemies { - enemy.handle_movement( - self.player.entity.pos, - &self.floor, - &mut self.rng, - delta_time, - ); - } + fn spawn_enimies(&mut self) { + // TODO: better entity spawning + let zombie = Entity::zombie(self.floor.random_walkable_pos(&mut self.rng)); + self.enemies.clear(); + self.enemies.push(zombie); } } |