remove casts
This commit is contained in:
		
							parent
							
								
									1cfe16c4ef
								
							
						
					
					
						commit
						f9deea4bde
					
				
							
								
								
									
										29
									
								
								src/game.rs
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								src/game.rs
									
									
									
									
									
								
							| @ -7,14 +7,14 @@ pub struct Game { | ||||
| } | ||||
| 
 | ||||
| impl Game { | ||||
|     pub fn move_player(&mut self, dx: i8, dy: i8) { | ||||
|     pub fn move_player(&mut self, dx: i16, dy: i16) { | ||||
|         // check if move is allowed first
 | ||||
|         let player = &self.player; | ||||
|         let player_pos = player.get_position(); | ||||
|         let mut level = &self.levels[player_pos.get_level() as usize]; | ||||
|         let new_x = ((player_pos.get_x() as i16) + dx as i16) as u16; | ||||
|         let new_y = ((player_pos.get_y() as i16) + dy as i16) as u16; | ||||
|         let can_go: bool = match level.get_element(new_x as i16, new_y as i16) { | ||||
|         let level = &self.levels[player_pos.get_level()]; | ||||
|         let new_x: i16 = player_pos.get_x() as i16 + dx; | ||||
|         let new_y: i16 = player_pos.get_y() as i16 + dy; | ||||
|         let can_go: bool = match level.get_element(new_x, new_y) { | ||||
|             None => { false } | ||||
|             Some(t) => { | ||||
|                 match t { | ||||
| @ -24,20 +24,21 @@ impl Game { | ||||
|             } | ||||
|         }; | ||||
|         if can_go { | ||||
|             if level.get_element(new_x as i16, new_y as i16).unwrap() == LevelElement::StairDown { | ||||
|                 let start_x = self.levels[(player_pos.get_level() + 1) as usize].start_x; | ||||
|                 let start_y = self.levels[(player_pos.get_level() + 1) as usize].start_y; | ||||
|                 self.player.set_position(player_pos.get_level() + 1, start_x as u16, start_y as u16); | ||||
|                 self.levels[(player_pos.get_level() + 1) as usize].discover(start_x as i16, start_y as i16); | ||||
|             } else if level.get_element(new_x as i16, new_y as i16).unwrap() == LevelElement::StairUp { | ||||
|             if level.get_element(new_x, new_y).unwrap() == LevelElement::StairDown { | ||||
|                 let next_level = player_pos.get_level() + 1; | ||||
|                 let start_x: usize = self.levels[next_level].start_x; | ||||
|                 let start_y: usize = self.levels[next_level].start_y; | ||||
|                 self.player.set_position(next_level, start_x, start_y); | ||||
|                 self.levels[next_level].discover(self.player.get_position()); | ||||
|             } else if level.get_element(new_x, new_y).unwrap() == LevelElement::StairUp { | ||||
|                 self.player.set_position( | ||||
|                     player_pos.get_level() - 1, | ||||
|                     self.levels[(player_pos.get_level() - 1) as usize].end_x as u16, | ||||
|                     self.levels[(player_pos.get_level() - 1) as usize].end_y as u16, | ||||
|                     self.levels[player_pos.get_level() - 1].end_x, | ||||
|                     self.levels[player_pos.get_level() - 1].end_y, | ||||
|                 ); | ||||
|             } else { | ||||
|                 self.player.change_position(dx, dy); | ||||
|                 self.levels[player_pos.get_level() as usize].discover(new_x as i16, new_y as i16); | ||||
|                 self.levels[player_pos.get_level()].discover(self.player.get_position()); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
							
								
								
									
										49
									
								
								src/level.rs
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								src/level.rs
									
									
									
									
									
								
							| @ -1,4 +1,5 @@ | ||||
| use std::cmp::{max, min}; | ||||
| use crate::position::Position; | ||||
| 
 | ||||
| pub const LEVEL_WIDTH: usize = 50; | ||||
| pub const LEVEL_HEIGHT: usize = 25; | ||||
| @ -48,48 +49,46 @@ impl Level { | ||||
|         if x < 0 || y < 0 { | ||||
|             return None; | ||||
|         } | ||||
|         if x >= LEVEL_WIDTH as i16 || y >= LEVEL_HEIGHT as i16 { | ||||
|         let x = x as usize; | ||||
|         let y = y as usize; | ||||
|         if x >= LEVEL_WIDTH || y >= LEVEL_HEIGHT { | ||||
|             return None; | ||||
|         } | ||||
|         if self.discovered[x as usize][y as usize] { | ||||
|             return Some(self.structure[x as usize][y as usize]); | ||||
|         if self.discovered[x][y] { | ||||
|             return Some(self.structure[x][y]); | ||||
|         } | ||||
|         return Some(LevelElement::Unknown); | ||||
|     } | ||||
|     /// discover the area with in the level around the given position
 | ||||
|     pub fn discover(&mut self, x: i16, y: i16) { | ||||
|         for x_r in x - 1..=x + 1 { | ||||
|             for y_r in y - 1..=y + 1 { | ||||
|                 let tx = min(max(x_r, 0), (LEVEL_WIDTH - 1) as i16) as usize; | ||||
|                 let ty = min(max(y_r, 0), (LEVEL_HEIGHT - 1) as i16) as usize; | ||||
|                 self.discovered[tx][ty] = true; | ||||
|     pub fn discover(&mut self, pos: Position) { | ||||
|         let x = pos.get_x(); | ||||
|         let y = pos.get_y(); | ||||
|         for x_r in max(x - 1, 0)..=min(x + 1, LEVEL_WIDTH - 1) { | ||||
|             for y_r in max(y - 1, 0)..=min(y + 1, LEVEL_HEIGHT - 1) { | ||||
|                 self.discovered[x_r][y_r] = true; | ||||
|             } | ||||
|         } | ||||
|         for x_r in x..=x + 2 { | ||||
|             let tx = min(max(x_r, 0), (LEVEL_WIDTH - 1) as i16) as usize; | ||||
|             self.discovered[tx][y as usize] = true; | ||||
|             if self.structure[tx][y as usize] == LevelElement::Wall { | ||||
|         for x_r in x..=min(x + 2, LEVEL_WIDTH - 1) { | ||||
|             self.discovered[x_r][y] = true; | ||||
|             if self.structure[x_r][y] == LevelElement::Wall { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         for y_r in y..=y + 2 { | ||||
|             let ty = min(max(y_r, 0), (LEVEL_HEIGHT - 1) as i16) as usize; | ||||
|             self.discovered[x as usize][ty] = true; | ||||
|             if self.structure[x as usize][ty] == LevelElement::Wall { | ||||
|         for y_r in y..=min(y + 2, LEVEL_WIDTH - 1) { | ||||
|             self.discovered[x][y_r] = true; | ||||
|             if self.structure[x][y_r] == LevelElement::Wall { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         for x_r in (x-2..x).rev() { | ||||
|             let tx = min(max(x_r, 0), (LEVEL_WIDTH - 1) as i16) as usize; | ||||
|             self.discovered[tx][y as usize] = true; | ||||
|             if self.structure[tx][y as usize] == LevelElement::Wall { | ||||
|         for x_r in (max(x - 2, 0)..x).rev() { | ||||
|             self.discovered[x_r][y] = true; | ||||
|             if self.structure[x_r][y] == LevelElement::Wall { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         for y_r in (y-2..y).rev() { | ||||
|             let ty = min(max(y_r, 0), (LEVEL_HEIGHT - 1) as i16) as usize; | ||||
|             self.discovered[x as usize][ty] = true; | ||||
|             if self.structure[x as usize][ty] == LevelElement::Wall { | ||||
|         for y_r in (max(y - 2, 0)..y).rev() { | ||||
|             self.discovered[x][y_r] = true; | ||||
|             if self.structure[x][y_r] == LevelElement::Wall { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -2,7 +2,7 @@ use ratatui::prelude::*; | ||||
| use ratatui::widgets::Widget; | ||||
| 
 | ||||
| use crate::game::Game; | ||||
| use crate::level::LevelElement; | ||||
| use crate::level::{Level, LevelElement}; | ||||
| 
 | ||||
| const FG_BROWN: Color = Color::Rgb(186, 74, 0); | ||||
| 
 | ||||
| @ -70,10 +70,10 @@ impl<'a> Widget for LevelWidget<'a> { | ||||
|     fn render(self, area: Rect, buf: &mut Buffer) { | ||||
|         let player = &self.game.player; | ||||
|         let player_pos = player.get_position(); | ||||
|         let level = &self.game.levels[player_pos.get_level() as usize]; | ||||
|         let level: &Level = &self.game.levels[player_pos.get_level()]; | ||||
| 
 | ||||
|         let al = area.left(); | ||||
|         let at = area.top(); | ||||
|         let al: u16 = area.left(); | ||||
|         let at: u16 = area.top(); | ||||
| 
 | ||||
|         // draw the level elements
 | ||||
|         for x in al..area.right() { | ||||
| @ -111,7 +111,9 @@ impl<'a> Widget for LevelWidget<'a> { | ||||
|         } | ||||
| 
 | ||||
|         // draw player
 | ||||
|         self.set_cell(buf, al + player_pos.get_x(), at + player_pos.get_y(), "8", Color::Red, Color::Gray); | ||||
|         let player_x = al + player_pos.get_x() as u16; | ||||
|         let player_y = at + player_pos.get_y() as u16; | ||||
|         self.set_cell(buf, player_x, player_y, "8", Color::Red, Color::Gray); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -36,7 +36,7 @@ fn main() -> Result<()> { | ||||
|         levels, | ||||
|     }; | ||||
| 
 | ||||
|     g.move_player((levels[0].start_x) as i8, (levels[0].start_y) as i8); | ||||
|     g.move_player(levels[0].start_x as i16, levels[0].start_y as i16); | ||||
| 
 | ||||
|     stdout().execute(EnterAlternateScreen)?; | ||||
|     enable_raw_mode()?; | ||||
| @ -89,6 +89,9 @@ fn main() -> Result<()> { | ||||
|                 if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') { | ||||
|                     break; | ||||
|                 } | ||||
|                 if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('d') { | ||||
|                     ; | ||||
|                 } | ||||
|                 if key.kind == KeyEventKind::Press && key.code == KeyCode::Left { | ||||
|                     g.move_player(-1, 0); | ||||
|                 } | ||||
|  | ||||
| @ -5,12 +5,12 @@ use crate::position::Position; | ||||
| pub struct Player { | ||||
|     name: String, | ||||
|     position: Position, | ||||
|     life: i16, | ||||
|     max_life: i16, | ||||
|     life: usize, | ||||
|     max_life: usize, | ||||
| } | ||||
| 
 | ||||
| impl Player { | ||||
|     pub fn new(name: &str, max_life: i16) -> Player { | ||||
|     pub fn new(name: &str, max_life: usize) -> Player { | ||||
|         Player { | ||||
|             name: name.to_string(), | ||||
|             position: Position::new(0, 0, 0), | ||||
| @ -21,19 +21,23 @@ impl Player { | ||||
|     pub fn get_name(&self) -> String { | ||||
|         return self.name.clone(); | ||||
|     } | ||||
|     pub fn get_life(&self) -> i16 { self.life } | ||||
|     pub fn get_max_life(&self) -> i16 { self.max_life } | ||||
|     pub fn get_life(&self) -> usize { self.life } | ||||
|     pub fn get_max_life(&self) -> usize { self.max_life } | ||||
|     pub fn change_life(&mut self, by: i16) { | ||||
|         self.life = max(0, min(self.max_life, self.life + by)); | ||||
|         self.life = max(0, | ||||
|                         min(self.max_life, | ||||
|                             (self.life as i16 + by) as usize, | ||||
|                         ), | ||||
|         ); | ||||
|     } | ||||
|     pub fn get_position(&self) -> Position { | ||||
|         self.position | ||||
|     } | ||||
|     pub fn change_position(&mut self, dx: i8, dy: i8) { | ||||
|     pub fn change_position(&mut self, dx: i16, dy: i16) { | ||||
|         self.position.change(dx, dy); | ||||
|     } | ||||
| 
 | ||||
|     pub fn set_position(&mut self, level: u8, x: u16, y:u16) { | ||||
|     pub fn set_position(&mut self, level: usize, x: usize, y: usize) { | ||||
|         self.position.set(level, x, y); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,35 +1,35 @@ | ||||
| #[derive(Copy, Clone, Debug, PartialEq)] | ||||
| pub struct Position { | ||||
|     level: u8, | ||||
|     x: u16, | ||||
|     y: u16, | ||||
|     level: usize, | ||||
|     x: usize, | ||||
|     y: usize, | ||||
| } | ||||
| 
 | ||||
| impl Position { | ||||
|     pub fn new(level: u8, x: u16, y: u16) -> Self { | ||||
|     pub fn new(level: usize, x: usize, y: usize) -> Self { | ||||
|         Self { | ||||
|             level, | ||||
|             x, | ||||
|             y, | ||||
|         } | ||||
|     } | ||||
|     pub fn get_level(&self) -> u8 { | ||||
|     pub fn get_level(&self) -> usize{ | ||||
|         self.level | ||||
|     } | ||||
| 
 | ||||
|     pub fn get_x(&self) -> u16 { | ||||
|     pub fn get_x(&self) -> usize { | ||||
|         self.x | ||||
|     } | ||||
| 
 | ||||
|     pub fn get_y(&self) -> u16 { | ||||
|     pub fn get_y(&self) -> usize { | ||||
|         self.y | ||||
|     } | ||||
| 
 | ||||
|     pub fn change(&mut self, dx: i8, dy: i8) { | ||||
|         self.x = ((self.x as i16) + dx as i16) as u16; | ||||
|         self.y = ((self.y as i16) + dy as i16) as u16; | ||||
|     pub fn change(&mut self, dx: i16, dy: i16) { | ||||
|         self.x = ((self.x as i16) + dx) as usize; | ||||
|         self.y = ((self.y as i16) + dy) as usize; | ||||
|     } | ||||
|     pub fn set(&mut self, level: u8, x: u16, y:u16) { | ||||
|     pub fn set(&mut self, level: usize, x: usize, y:usize) { | ||||
|         self.level = level; | ||||
|         self.x = x; | ||||
|         self.y = y; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user