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 gen = RecursiveBacktracker4::new_from_seed(0xdeadbeef);
let grid = gen.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 gen = RecursiveBacktracker4::new_from_seed(0xdeadbeef);
let grid = gen.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 gen = RecursiveBacktracker4::new_from_seed(0xdeadbeef);
let grid = gen.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 gen = RecursiveBacktracker4::new_from_seed(0xdeadbeef);
let grid = gen.generate(6, 6);
let renderer = UnicodeRenderer::new(UnicodeRenderStyle::Hexadecimal, true);
let str = renderer.render(&grid);
let expected = indoc!(
"
24ECCA
5A36A1
23795A
795C83
5CA6CB
4CD949
"
);
assert_eq!(str, expected);
let renderer = UnicodeRenderer::new(UnicodeRenderStyle::Hexadecimal, false);
let str = renderer.render(&grid);
let expected = "24ECCA5A36A123795A795C835CA6CB4CD949";
assert_eq!(str, expected);
}
}