use crate::grid_coord_2d::GridCoord2D;
use crate::room4::Door4;
use crate::wall4_grid::Wall4Grid;
#[allow(dead_code)]
const UNICODE_SET_THIN: &[char] = &[
' ', '\u{2575}', '\u{2577}', '\u{2502}', '\u{2576}', '\u{2514}', '\u{250C}', '\u{251C}', '\u{2574}', '\u{2518}', '\u{2510}', '\u{2524}', '\u{2500}', '\u{2534}', '\u{252C}', '\u{253C}', ];
#[allow(dead_code)]
const UNICODE_SET_DOUBLE: &[char] = &[
' ', '\u{2568}', '\u{2565}', '\u{2551}', '\u{255E}', '\u{255A}', '\u{2554}', '\u{2560}', '\u{2561}', '\u{255D}', '\u{2557}', '\u{2563}', '\u{2550}', '\u{2569}', '\u{2566}', '\u{256C}', ];
#[allow(dead_code)]
const UNICODE_SET_HEAVY: &[char] = &[
' ', '\u{2579}', '\u{257B}', '\u{2503}', '\u{257A}', '\u{2517}', '\u{250F}', '\u{2523}', '\u{2578}', '\u{251B}', '\u{2513}', '\u{252B}', '\u{2501}', '\u{253B}', '\u{2533}', '\u{254B}', ];
#[allow(dead_code)]
const ASCII_SET_HEX: &[char] = &[
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', ];
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum UnicodeRenderStyle {
Thin,
Double,
Heavy,
Hexadecimal,
}
#[derive(Debug, Clone)]
pub struct UnicodeRenderer {
table: &'static [char],
line_breaks: bool,
}
impl UnicodeRenderer {
pub fn new(style: UnicodeRenderStyle, line_breaks: bool) -> Self {
Self {
table: match style {
UnicodeRenderStyle::Thin => UNICODE_SET_THIN,
UnicodeRenderStyle::Double => UNICODE_SET_DOUBLE,
UnicodeRenderStyle::Heavy => UNICODE_SET_HEAVY,
UnicodeRenderStyle::Hexadecimal => ASCII_SET_HEX,
},
line_breaks,
}
}
fn lookup(&self, doors: Door4) -> char {
self.table[*doors as usize]
}
pub fn render(&self, grid: &Wall4Grid) -> String {
let mut output = String::default();
for y in 0..grid.height() {
for x in 0..grid.width() {
let coord = GridCoord2D::new(x, y);
let wall: Door4 = !grid[coord];
output.push(self.lookup(wall));
}
if self.line_breaks {
output.push('\n');
}
}
output
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::generators::RecursiveBacktracker4;
use indoc::indoc;
#[test]
fn heavy_works() {
let generator = RecursiveBacktracker4::new_from_seed(0xdeadbeef);
let grid = generator.generate(6, 6);
let renderer = UnicodeRenderer::new(UnicodeRenderStyle::Heavy, true);
let str = renderer.render(&grid);
let expected = indoc!(
"
╻┏━━━┓
┃┣━━┓╹
┃┗━┓┗┓
┗━┓╹┏┫
┏╸┃┏┛┃
┗━┻┛╺┛
"
);
assert_eq!(str, expected);
}
#[test]
fn double_works() {
let generator = RecursiveBacktracker4::new_from_seed(0xdeadbeef);
let grid = generator.generate(6, 6);
let renderer = UnicodeRenderer::new(UnicodeRenderStyle::Double, true);
let str = renderer.render(&grid);
let expected = indoc!(
"
╥╔═══╗
║╠══╗╨
║╚═╗╚╗
╚═╗╨╔╣
╔╡║╔╝║
╚═╩╝╞╝
"
);
assert_eq!(str, expected);
}
#[test]
fn thin_works() {
let generator = RecursiveBacktracker4::new_from_seed(0xdeadbeef);
let grid = generator.generate(6, 6);
let renderer = UnicodeRenderer::new(UnicodeRenderStyle::Thin, true);
let str = renderer.render(&grid);
let expected = indoc!(
"
╷┌───┐
│├──┐╵
│└─┐└┐
└─┐╵┌┤
┌╴│┌┘│
└─┴┘╶┘
"
);
assert_eq!(str, expected);
}
#[test]
fn hex_works() {
let generator = RecursiveBacktracker4::new_from_seed(0xdeadbeef);
let grid = generator.generate(6, 6);
let renderer = UnicodeRenderer::new(UnicodeRenderStyle::Hexadecimal, true);
let str = renderer.render(&grid);
let expected = indoc!(
"
26CCCA
37CCA1
35CA5A
5CA16B
683693
5CD949
"
);
assert_eq!(str, expected);
let renderer = UnicodeRenderer::new(UnicodeRenderStyle::Hexadecimal, false);
let str = renderer.render(&grid);
let expected = "26CCCA37CCA135CA5A5CA16B6836935CD949";
assert_eq!(str, expected);
}
}