From 5b7eac31652880adc2b3733951d6deb6c4ddb1a4 Mon Sep 17 00:00:00 2001 From: Llywelwyn Date: Thu, 6 Jul 2023 19:42:13 +0100 Subject: [PATCH] bitset walls --- src/map.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/map.rs b/src/map.rs index 613deb0..89586e2 100644 --- a/src/map.rs +++ b/src/map.rs @@ -204,7 +204,7 @@ pub fn draw_map(ecs: &World, ctx: &mut Rltk) { fg = RGB::from_f32(0.0, 1.0, 0.5); } TileType::Wall => { - glyph = rltk::to_cp437('#'); + glyph = wall_glyph(&*map, x, y); fg = RGB::from_f32(0.0, 1.0, 0.0); } } @@ -216,9 +216,54 @@ pub fn draw_map(ecs: &World, ctx: &mut Rltk) { // Move the coordinates x += 1; - if x > MAPWIDTH - 1 { + if x > (MAPWIDTH as i32) - 1 { x = 0; y += 1; } } } + +fn is_revealed_and_wall(map: &Map, x: i32, y: i32) -> bool { + let idx = map.xy_idx(x, y); + map.tiles[idx] == TileType::Wall && map.revealed_tiles[idx] +} + +fn wall_glyph(map: &Map, x: i32, y: i32) -> rltk::FontCharType { + if x < 1 || x > map.width - 2 || y < 1 || y > map.height - 2 as i32 { + return 35; + } + let mut mask: u8 = 0; + + if is_revealed_and_wall(map, x, y - 1) { + mask += 1; + } + if is_revealed_and_wall(map, x, y + 1) { + mask += 2; + } + if is_revealed_and_wall(map, x - 1, y) { + mask += 4; + } + if is_revealed_and_wall(map, x + 1, y) { + mask += 8; + } + + match mask { + 0 => 9, // Pillar because we can't see neighbors + 1 => 186, // Wall only to the north + 2 => 186, // Wall only to the south + 3 => 186, // Wall to the north and south + 4 => 205, // Wall only to the west + 5 => 188, // Wall to the north and west + 6 => 187, // Wall to the south and west + 7 => 185, // Wall to the north, south and west + 8 => 205, // Wall only to the east + 9 => 200, // Wall to the north and east + 10 => 201, // Wall to the south and east + 11 => 204, // Wall to the north, south and east + 12 => 205, // Wall to the east and west + 13 => 202, // Wall to the east, west, and south + 14 => 203, // Wall to the east, west, and north + 15 => 206, // ╬ Wall on all sides + _ => 35, // We missed one? + } +}