summaryrefslogtreecommitdiff
path: root/dungeon/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'dungeon/src/lib.rs')
-rw-r--r--dungeon/src/lib.rs79
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);
}
}