diff --git a/src/game.rs b/src/game.rs index 37e9847..920cdd8 100644 --- a/src/game.rs +++ b/src/game.rs @@ -73,12 +73,34 @@ impl Game<'_> { if keycode == Keycode::Space { self.debug = !self.debug; } + + // Reset game + if keycode == Keycode::R { + self.reset(); + } } pub fn add_score(&mut self, points: u32) { self.score += points; } + pub fn reset(&mut self) { + // Reset the map to restore all pellets + { + let mut map = self.map.borrow_mut(); + map.reset(); + } + + // Reset the score + self.score = 0; + + // Reset Pacman position (you might want to customize this) + // For now, we'll keep Pacman where he is, but you could add: + // self.pacman.position = Map::cell_to_pixel((1, 1)); + + event!(tracing::Level::INFO, "Game reset - map and score cleared"); + } + pub fn tick(&mut self) { self.pacman.tick(); self.check_pellet_eating(); diff --git a/src/map.rs b/src/map.rs index 35c126f..9a3d361 100644 --- a/src/map.rs +++ b/src/map.rs @@ -1,13 +1,14 @@ use crate::constants::MapTile; -use crate::constants::{BOARD_HEIGHT, BOARD_WIDTH}; +use crate::constants::{BOARD_HEIGHT, BOARD_WIDTH, RAW_BOARD}; pub struct Map { - inner: [[MapTile; BOARD_HEIGHT as usize]; BOARD_WIDTH as usize], + current: [[MapTile; BOARD_HEIGHT as usize]; BOARD_WIDTH as usize], + default: [[MapTile; BOARD_HEIGHT as usize]; BOARD_WIDTH as usize], } impl Map { pub fn new(raw_board: [&str; BOARD_HEIGHT as usize]) -> Map { - let mut inner = [[MapTile::Empty; BOARD_HEIGHT as usize]; BOARD_WIDTH as usize]; + let mut map = [[MapTile::Empty; BOARD_HEIGHT as usize]; BOARD_WIDTH as usize]; for y in 0..BOARD_HEIGHT as usize { let line = raw_board[y]; @@ -35,11 +36,23 @@ impl Map { _ => panic!("Unknown character in board: {}", character), }; - inner[x as usize][y as usize] = tile; + map[x as usize][y as usize] = tile; } } - Map { inner: inner } + Map { + current: map, + default: map.clone(), + } + } + + pub fn reset(&mut self) { + // Restore the map to its original state + for x in 0..BOARD_WIDTH as usize { + for y in 0..BOARD_HEIGHT as usize { + self.current[x][y] = self.default[x][y]; + } + } } pub fn get_tile(&self, cell: (i32, i32)) -> Option { @@ -50,7 +63,7 @@ impl Map { return None; } - Some(self.inner[x][y]) + Some(self.current[x][y]) } pub fn set_tile(&mut self, cell: (i32, i32), tile: MapTile) -> bool { @@ -61,7 +74,7 @@ impl Map { return false; } - self.inner[x][y] = tile; + self.current[x][y] = tile; true }