1 use super::game::{Board, Pos};
2 use crossterm::{cursor, queue, style::*};
12 const FIELD_HEIGHT: usize = 3;
13 const FIELD_WIDTH: usize = 8;
15 fn write_line(stdout: &mut std::io::Stdout, vec: &[u32], mode: Mode) -> crossterm::Result<()> {
31 let &n = vec.last().unwrap();
32 vec = &vec[0..vec.len() - 1];
35 Mode::Data_ | Mode::Empty => queue!(stdout, Print(" "))?,
40 Mode::Data_ | Mode::Empty if n != 0 => {
41 let (r, g, b) = hsl::HSL {
42 h: (n * 360 / 12) as f64,
50 SetColors(Colors::new(Color::Black, Color::Rgb { r, g, b }))
56 if let Mode::Data_ = mode {
58 queue!(stdout, Print(" ".repeat(FIELD_WIDTH - 2)))?;
62 Print(format!("{:^w$}", 1 << n, w = FIELD_WIDTH - 2))
69 Mode::Roof_ | Mode::Base_ => "━".repeat(FIELD_WIDTH),
70 Mode::Floor => "─".repeat(FIELD_WIDTH),
71 Mode::Empty => " ".repeat(FIELD_WIDTH - 2),
72 Mode::Data_ => panic!("unreachable"),
78 Mode::Data_ | Mode::Empty => {
79 queue!(stdout, Print(" "), SetAttribute(Attribute::Reset))?
107 cursor::MoveToNextLine(1),
113 pub fn display_board(stdout: &mut std::io::Stdout, board: &Board) -> crossterm::Result<()> {
114 let dummy = vec![0; board.size.x as usize];
116 write_line(stdout, &dummy, Mode::Roof_)?;
118 for y in 0..board.size.y {
119 let vec = (0..board.size.x)
121 .map(|x| board.get(Pos::new(x, y)).value())
122 .collect::<Vec<u32>>();
124 for i in 0..FIELD_HEIGHT {
128 if i == FIELD_HEIGHT / 2 {
136 if y != board.size.y - 1 {
137 write_line(stdout, &dummy, Mode::Floor)?;
141 write_line(stdout, &dummy, Mode::Base_)?;