diff --git a/src/map.rs b/src/map.rs index 248cfdf..4e5211c 100644 --- a/src/map.rs +++ b/src/map.rs @@ -226,7 +226,7 @@ pub fn draw_map(ecs: &World, ctx: &mut Rltk) { fg = RGB::from_f32(0., 0.5, 0.5); } TileType::Wall => { - glyph = rltk::to_cp437('#'); + glyph = wall_glyph(&*map, x, y); fg = RGB::from_f32(0., 1.0, 0.); } TileType::DownStairs => { @@ -250,3 +250,49 @@ pub fn draw_map(ecs: &World, ctx: &mut Rltk) { } } } + +fn wall_glyph(map: &Map, x: i32, y: i32) -> rltk::FontCharType { + if x < 1 || x > map.width - 1 || y < 1 || y > map.height - 1 as i32 { + return 35; + } + + let mut mask = 0u8; + + 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 sound 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? + } +} + +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] +} diff --git a/src/spawner.rs b/src/spawner.rs index a176352..ea41aeb 100644 --- a/src/spawner.rs +++ b/src/spawner.rs @@ -3,7 +3,7 @@ use crate::components::{ Equippable, InflictsDamage, Item, MeleePowerBonus, Monster, Name, Player, Position, ProvidesHealing, Ranged, Renderable, SerializeMe, Viewshed, }; -use crate::{random_table::RandomTable, Rect, map::MAP_WIDTH}; +use crate::{map::MAP_WIDTH, random_table::RandomTable, Rect}; use rltk::{RandomNumberGenerator, RGB}; use specs::prelude::*; use specs::saveload::{MarkedBuilder, SimpleMarker};