forgotten file
This commit is contained in:
		
							parent
							
								
									51419ff0b8
								
							
						
					
					
						commit
						732c68448f
					
				
							
								
								
									
										151
									
								
								src/level_widget.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								src/level_widget.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,151 @@ | |||||||
|  | use ratatui::prelude::*; | ||||||
|  | use ratatui::widgets::Widget; | ||||||
|  | use crate::level::{Level, LevelElement}; | ||||||
|  | 
 | ||||||
|  | const FG_BROWN: Color = Color::Rgb(186, 74, 0); | ||||||
|  | 
 | ||||||
|  | pub struct LevelWidget { | ||||||
|  |     pub content: Level, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl LevelWidget { | ||||||
|  |     fn set_cell(&self, buf: &mut Buffer, x: u16, y: u16, symbol: &str, fg: Color, bg: Color) { | ||||||
|  |         buf. | ||||||
|  |             get_mut(x, y). | ||||||
|  |             set_symbol(symbol). | ||||||
|  |             set_bg(bg). | ||||||
|  |             set_fg(fg); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // ┃ ━ ┏ ┓ ┗ ┛ ┣ ┫ ┳ ┻ ╋
 | ||||||
|  |     fn foo(top: Option<LevelElement>, right: Option<LevelElement>, bottom: Option<LevelElement>, left: Option<LevelElement>) -> String { | ||||||
|  |         let mut val = 0; | ||||||
|  |         val += match top { | ||||||
|  |             Some(n) => { | ||||||
|  |                 match n { | ||||||
|  |                     LevelElement::Wall => 1, | ||||||
|  |                     _ => 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             None => 0 | ||||||
|  |         }; | ||||||
|  |         val += match right { | ||||||
|  |             Some(n) => { | ||||||
|  |                 match n { | ||||||
|  |                     LevelElement::Wall => 2, | ||||||
|  |                     _ => 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             None => 0 | ||||||
|  |         }; | ||||||
|  |         val += match bottom { | ||||||
|  |             Some(n) => { | ||||||
|  |                 match n { | ||||||
|  |                     LevelElement::Wall => 4, | ||||||
|  |                     _ => 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             None => 0 | ||||||
|  |         }; | ||||||
|  |         val += match left { | ||||||
|  |             Some(n) => { | ||||||
|  |                 match n { | ||||||
|  |                     LevelElement::Wall => 8, | ||||||
|  |                     _ => 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             None => 0 | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         // 0 ╋   5 ┃  9 ┛
 | ||||||
|  |         // 1 ┃   6 ┏ 10 ━
 | ||||||
|  |         // 2 ━   7 ┣ 11 ┻
 | ||||||
|  |         // 3 ┗
 | ||||||
|  |         // 4 ┃   8 ━ 12 ┓
 | ||||||
|  |         [ | ||||||
|  |             "╋", "┃", "━", "┗", | ||||||
|  |             "┃", "┃", "┏", "┣", | ||||||
|  |             "━", "┛", "━", "┻", | ||||||
|  |             "┓", "┫", "┳", "╋", | ||||||
|  |         ][val].to_string() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl Widget for LevelWidget { | ||||||
|  |     fn render(self, area: Rect, buf: &mut Buffer) { | ||||||
|  |         let al = area.left(); | ||||||
|  |         let at = area.top(); | ||||||
|  |         for x in al..area.right() { | ||||||
|  |             for y in at..area.bottom() { | ||||||
|  |                 let level_x = (x-al) as i16; | ||||||
|  |                 let level_y = (y-at) as i16; | ||||||
|  |                 match self.content.get_element(level_x, level_y) { | ||||||
|  |                     None => {} | ||||||
|  |                     Some(e) => { | ||||||
|  |                         match e { | ||||||
|  |                             LevelElement::Wall => { | ||||||
|  |                                 let top = self.content.get_element(level_x, level_y-1); | ||||||
|  |                                 let right = self.content.get_element(level_x+1, level_y); | ||||||
|  |                                 let bottom = self.content.get_element(level_x, level_y+1); | ||||||
|  |                                 let left = self.content.get_element(level_x-1, level_y); | ||||||
|  |                                 let symbol = LevelWidget::foo(top, right, bottom, left); | ||||||
|  |                                 self.set_cell(buf, x, y, symbol.as_str(), FG_BROWN, Color::Gray); | ||||||
|  |                             } | ||||||
|  |                             LevelElement::Floor => { | ||||||
|  |                                 self.set_cell(buf, x, y, " ", FG_BROWN, Color::Gray); | ||||||
|  |                             } | ||||||
|  |                             LevelElement::StairDown => { | ||||||
|  |                                 self.set_cell(buf, x, y, ">", FG_BROWN, Color::Gray); | ||||||
|  |                             } | ||||||
|  |                             LevelElement::StairUp => { | ||||||
|  |                                 self.set_cell(buf, x, y, "<", FG_BROWN, Color::Gray); | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[test] | ||||||
|  | fn test_get_wall_symbol() { | ||||||
|  |     let wall = Some(LevelElement::Wall); | ||||||
|  |     // 0
 | ||||||
|  |     let s = LevelWidget::foo(None, None, None, None); | ||||||
|  |     assert_eq!(s, "╋"); | ||||||
|  |     // 15
 | ||||||
|  |     let s = LevelWidget::foo(wall, wall, wall, wall); | ||||||
|  |     assert_eq!(s, "╋"); | ||||||
|  | 
 | ||||||
|  |     // 1
 | ||||||
|  |     let s = LevelWidget::foo(wall, None, None, None); | ||||||
|  |     assert_eq!(s, "┃"); | ||||||
|  |     // 5
 | ||||||
|  |     let s = LevelWidget::foo(wall, None, wall, None); | ||||||
|  |     assert_eq!(s, "┃"); | ||||||
|  |     // 4
 | ||||||
|  |     let s = LevelWidget::foo(None, None, wall, None); | ||||||
|  |     assert_eq!(s, "┃"); | ||||||
|  | 
 | ||||||
|  |     // 2
 | ||||||
|  |     let s = LevelWidget::foo(None, wall, None, None); | ||||||
|  |     assert_eq!(s, "━"); | ||||||
|  |     // 10
 | ||||||
|  |     let s = LevelWidget::foo(None, wall, None, wall); | ||||||
|  |     assert_eq!(s, "━"); | ||||||
|  | 
 | ||||||
|  |     // 9
 | ||||||
|  |     let s = LevelWidget::foo(wall, None, None, wall); | ||||||
|  |     assert_eq!(s, "┛"); | ||||||
|  |     // 3
 | ||||||
|  |     let s = LevelWidget::foo(wall, wall, None, None); | ||||||
|  |     assert_eq!(s, "┗"); | ||||||
|  |     // 6
 | ||||||
|  |     let s = LevelWidget::foo( None, wall,wall,None); | ||||||
|  |     assert_eq!(s, "┏"); | ||||||
|  |     // 12
 | ||||||
|  |     let s = LevelWidget::foo(None, None, wall, wall); | ||||||
|  |     assert_eq!(s, "┓"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user