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 }))
59 Mode::Roof_ | Mode::Base_ => "━".repeat(FIELD_WIDTH),
60 Mode::Floor => "─".repeat(FIELD_WIDTH),
61 Mode::Data_ if n != 0 => format!("{:^w$}", 1 << n, w = FIELD_WIDTH - 2),
62 Mode::Empty | Mode::Data_ => " ".repeat(FIELD_WIDTH - 2),
67 Mode::Data_ | Mode::Empty => {
68 queue!(stdout, SetAttribute(Attribute::Reset), Print(" "))?
96 cursor::MoveToNextLine(1),
102 pub fn display_board(stdout: &mut std::io::Stdout, board: &Board) -> crossterm::Result<()> {
103 let dummy = vec![0; board.size.x as usize];
105 write_line(stdout, &dummy, Mode::Roof_)?;
107 for y in 0..board.size.y {
108 let vec = (0..board.size.x)
110 .map(|x| board.get(Pos::new(x, y)).value())
111 .collect::<Vec<u32>>();
113 for i in 0..FIELD_HEIGHT {
117 if i == FIELD_HEIGHT / 2 {
125 if y != board.size.y - 1 {
126 write_line(stdout, &dummy, Mode::Floor)?;
130 write_line(stdout, &dummy, Mode::Base_)?;