diff --git a/src/graphics/sidebar.rs b/src/graphics/sidebar.rs index 87fc854..8d86c24 100644 --- a/src/graphics/sidebar.rs +++ b/src/graphics/sidebar.rs @@ -46,7 +46,7 @@ pub fn draw(resources: &Resources, bterm: &mut BTerm) { bterm.print(SIDEBAR_POS_X + 4, SIDEBAR_POS_Y + 15, "Keys"); let stats = &resources.stats; - bterm.print_centered_at(SIDEBAR_POS_X + 6, SIDEBAR_POS_Y + 1, stats.score * 10); + bterm.print_centered_at(SIDEBAR_POS_X + 6, SIDEBAR_POS_Y + 1, stats.score); bterm.print_centered_at(SIDEBAR_POS_X + 6, SIDEBAR_POS_Y + 7, stats.gems); bterm.print_centered_at(SIDEBAR_POS_X + 6, SIDEBAR_POS_Y + 10, stats.whips); bterm.print_centered_at(SIDEBAR_POS_X + 6, SIDEBAR_POS_Y + 13, stats.teleports); diff --git a/src/input/mod.rs b/src/input/mod.rs index 15c2318..6ce8527 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -30,6 +30,11 @@ pub fn handle(world: &mut World, resources: &mut Resources, bterm: &mut BTerm) { VirtualKeyCode::W => { player::whip(world, resources); } + VirtualKeyCode::S => { + resources + .sound_output + .play_sound(resources.sound_effects.pickup.clone()); + } VirtualKeyCode::D => { resources.show_debug_info = !resources.show_debug_info; } diff --git a/src/input/player.rs b/src/input/player.rs index 1d5c416..86163a6 100644 --- a/src/input/player.rs +++ b/src/input/player.rs @@ -3,9 +3,7 @@ use std::time::{Duration, Instant}; use bracket_lib::prelude::*; use hecs::{Entity, With, Without, World}; -use crate::{ - components::monster::*, components::*, constants::*, resources::*, systems, tile_data::TileType, -}; +use crate::{components::monster::*, components::*, constants::*, resources::*, systems}; pub fn try_move(delta_x: i32, delta_y: i32, world: &mut World, resources: &mut Resources) { let mut to_kill: Vec = Vec::new(); @@ -24,7 +22,11 @@ pub fn try_move(delta_x: i32, delta_y: i32, world: &mut World, resources: &mut R }; if resources.map.in_bounds(destination) { - if try_step(destination, world, resources) { + if resources.map.is_solid(destination) { + resources + .sound_output + .play_sound(resources.sound_effects.blocked.clone()); + } else { if let Some(monster_entity) = resources.map.get_tile_content_at(destination) { if let Ok(monster) = world.get::(monster_entity) { resources.stats.add_score(damage_for_kind(monster.kind)); @@ -68,96 +70,6 @@ pub fn try_move(delta_x: i32, delta_y: i32, world: &mut World, resources: &mut R } } -fn try_step(point: Point, _world: &World, resources: &mut Resources) -> bool { - match resources.map.get_tile_at(point) { - crate::tile_data::TileType::Floor - | crate::tile_data::TileType::Slow - | crate::tile_data::TileType::Medium - | crate::tile_data::TileType::Fast => true, - crate::tile_data::TileType::Block | crate::tile_data::TileType::Wall => { - resources - .sound_output - .play_sound(resources.sound_effects.blocked.clone()); - if resources.stats.score > 2 { - resources.stats.take_score(2); - } - false - } - crate::tile_data::TileType::Whip => { - resources - .sound_output - .play_sound(resources.sound_effects.grab.clone()); - resources.stats.give_whips(1); - resources.stats.add_score(1); - resources.map.set_tile_at(point, TileType::Floor); - true - } - crate::tile_data::TileType::Stairs => { - // TODO: Go to next level - true - } - crate::tile_data::TileType::Chest => todo!(), - crate::tile_data::TileType::SlowTime => todo!(), - crate::tile_data::TileType::Gem => { - resources - .sound_output - .play_sound(resources.sound_effects.grab.clone()); - resources.stats.give_gems(1); - resources.stats.add_score(1); - resources.map.set_tile_at(point, TileType::Floor); - true - } - crate::tile_data::TileType::Invisible => todo!(), - crate::tile_data::TileType::Teleport => { - resources - .sound_output - .play_sound(resources.sound_effects.grab.clone()); - resources.stats.give_teleports(1); - resources.stats.add_score(1); - resources.map.set_tile_at(point, TileType::Floor); - true - } - crate::tile_data::TileType::Key => todo!(), - crate::tile_data::TileType::Door => todo!(), - crate::tile_data::TileType::SpeedTime => todo!(), - crate::tile_data::TileType::Trap => todo!(), - crate::tile_data::TileType::River => todo!(), - crate::tile_data::TileType::Power => todo!(), - crate::tile_data::TileType::Forest => todo!(), - crate::tile_data::TileType::Tree => todo!(), - crate::tile_data::TileType::Bomb => todo!(), - crate::tile_data::TileType::Lava => todo!(), - crate::tile_data::TileType::Pit => todo!(), - crate::tile_data::TileType::Tome => todo!(), - crate::tile_data::TileType::Tunnel => todo!(), - crate::tile_data::TileType::Freeze => todo!(), - crate::tile_data::TileType::Nugget => todo!(), - crate::tile_data::TileType::Quake => todo!(), - crate::tile_data::TileType::InvisibleBlock => todo!(), - crate::tile_data::TileType::InvisibleWall => todo!(), - crate::tile_data::TileType::InvisibleDoor => todo!(), - crate::tile_data::TileType::Stop => todo!(), - crate::tile_data::TileType::Zap => todo!(), - crate::tile_data::TileType::Create => todo!(), - crate::tile_data::TileType::Generator => todo!(), - crate::tile_data::TileType::Trap2 => todo!(), - crate::tile_data::TileType::Trap3 => todo!(), - crate::tile_data::TileType::Trap4 => todo!(), - crate::tile_data::TileType::Trap5 => todo!(), - crate::tile_data::TileType::Trap6 => todo!(), - crate::tile_data::TileType::Trap7 => todo!(), - crate::tile_data::TileType::Trap8 => todo!(), - crate::tile_data::TileType::Trap9 => todo!(), - crate::tile_data::TileType::Trap10 => todo!(), - crate::tile_data::TileType::Trap11 => todo!(), - crate::tile_data::TileType::Trap12 => todo!(), - crate::tile_data::TileType::Trap13 => todo!(), - crate::tile_data::TileType::Player => true, - crate::tile_data::TileType::Punctuation => todo!(), - crate::tile_data::TileType::Letter(_) => todo!(), - } -} - pub fn whip(world: &mut World, resources: &mut Resources) { let mut to_add: Vec = Vec::new(); diff --git a/src/resources/map.rs b/src/resources/map.rs index 76ad3b2..d47b263 100644 --- a/src/resources/map.rs +++ b/src/resources/map.rs @@ -245,4 +245,8 @@ impl Map { let index = self.point2d_to_index(point); self.tiles[index] = tile; } + + pub fn is_solid(&self, point: Point) -> bool { + matches!(self.get_tile_at(point), TileType::Wall | TileType::Block) + } } diff --git a/src/resources/sound_effects.rs b/src/resources/sound_effects.rs index f0779c1..3868361 100644 --- a/src/resources/sound_effects.rs +++ b/src/resources/sound_effects.rs @@ -29,7 +29,7 @@ pub struct SoundEffect { pub struct SoundEffects { pub startup: SoundSamples, pub step: SoundSamples, - pub grab: SoundSamples, + pub pickup: SoundSamples, pub bad_key: SoundSamples, pub blocked: SoundSamples, pub whipping: SoundSamples, @@ -66,7 +66,7 @@ impl SoundEffects { }, ], }), - grab: sound_output.render_sound_effect(&SoundEffect { + pickup: sound_output.render_sound_effect(&SoundEffect { sounds: vec![ Sound { sound_type: SoundType::Noise(350, 900), diff --git a/src/resources/stats.rs b/src/resources/stats.rs index 9592693..a7d81ce 100644 --- a/src/resources/stats.rs +++ b/src/resources/stats.rs @@ -10,65 +10,18 @@ pub struct Stats { type PlayerSurvived = bool; impl Stats { + pub fn take_gems(&mut self, num_gems: u32) -> PlayerSurvived { + let new_num_gems = self.gems as i64 - num_gems as i64; + if new_num_gems <= 0 { + self.gems = 0; + false + } else { + self.gems = new_num_gems as u32; + true + } + } + pub fn add_score(&mut self, score: u32) { self.score += score; } - - pub fn take_score(&mut self, score: u32) { - if let Some(result) = self.score.checked_sub(score) { - self.score = result; - } else { - self.score = 0; - } - } - - pub fn give_gems(&mut self, num_gems: u32) { - self.gems += num_gems; - } - - pub fn take_gems(&mut self, num_gems: u32) -> PlayerSurvived { - if let Some(result) = self.gems.checked_sub(num_gems) { - self.gems = result; - true - } else { - self.gems = 0; - false - } - } - - pub fn give_whips(&mut self, num_whips: u32) { - self.whips += num_whips; - } - - pub fn take_whips(&mut self, num_whips: u32) { - if let Some(result) = self.whips.checked_sub(num_whips) { - self.whips = result; - } else { - self.whips = 0; - } - } - - pub fn give_teleports(&mut self, num_teleports: u32) { - self.teleports += num_teleports; - } - - pub fn take_teleports(&mut self, num_teleports: u32) { - if let Some(result) = self.teleports.checked_sub(num_teleports) { - self.teleports = result; - } else { - self.teleports = 0; - } - } - - pub fn give_keys(&mut self, num_keys: u32) { - self.keys += num_keys; - } - - pub fn take_keys(&mut self, num_keys: u32) { - if let Some(result) = self.keys.checked_sub(num_keys) { - self.keys = result; - } else { - self.keys = 0; - } - } } diff --git a/src/systems/monster_ai.rs b/src/systems/monster_ai.rs index 32061dd..6d79e5f 100644 --- a/src/systems/monster_ai.rs +++ b/src/systems/monster_ai.rs @@ -17,7 +17,7 @@ pub fn run(world: &mut World, resources: &mut Resources) { .cloned(); if let Some(player_pos) = player_position { - let mut to_kill: Vec = Vec::new(); + let mut has_died = None; for (entity, (monster, position, renderable)) in &mut world.query::<(&mut Monster, &mut Position, &mut Renderable)>() { @@ -60,20 +60,16 @@ pub fn run(world: &mut World, resources: &mut Resources) { monster.kind, &resources.sound_effects, )); - to_kill.push(entity); + has_died = Some(entity); } } else { let tile = resources.map.get_tile_at_mut(destination); match tile { TileType::Wall => {} TileType::Block => { - resources.sound_output.play_sound(sound_effect_for_kind( - monster.kind, - &resources.sound_effects, - )); - resources.stats.add_score(1); + // TODO: Sound *tile = TileType::Floor; - to_kill.push(entity); + has_died = Some(entity); } _ => { resources.map.clear_tile_content_at(Point::from(*position)); @@ -89,7 +85,7 @@ pub fn run(world: &mut World, resources: &mut Resources) { } } - for e in to_kill { + if let Some(e) = has_died { let _ = world.despawn(e); } }