From eb3a654c6768b07e95ed08fa9a91217a3c2ceb39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Fri, 28 Jun 2019 23:59:41 +0300 Subject: [PATCH] Fix visibility (mostly) --- bundle/main.lua | 84 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 23 deletions(-) diff --git a/bundle/main.lua b/bundle/main.lua index 586ddf5..bed6ac2 100644 --- a/bundle/main.lua +++ b/bundle/main.lua @@ -247,51 +247,89 @@ function generateVisibilityMap() end function stepVisibilityMapGeneration(queue) - -- TODO: Handle corners somehow correctly -- Do a modified floodfill, where each cell will only expand in its given direction, not -- every direction like in a normal floodfill local new_queue = {} for i, item in ipairs(queue) do - visibility_map[item.x][item.y] = true - if cavern[item.x][item.y] == tiletypes.empty then -- Did not yet hit a wall if item.direction == directions.up then + visibility_map[item.x][item.y] = true table.insert(new_queue, {x = item.x, y = item.y - 1, direction = directions.up}) elseif item.direction == directions.left then + visibility_map[item.x][item.y] = true table.insert(new_queue, {x = item.x - 1, y = item.y, direction = directions.left}) elseif item.direction == directions.down then + visibility_map[item.x][item.y] = true table.insert(new_queue, {x = item.x, y = item.y + 1, direction = directions.down}) elseif item.direction == directions.right then + visibility_map[item.x][item.y] = true table.insert(new_queue, {x = item.x + 1, y = item.y, direction = directions.right}) elseif item.direction == directions.upleft then - -- ⌜^ - -- ⌜ - -- v⌟ - table.insert(new_queue, {x = item.x + 1, y = item.y, direction = directions.right}) - table.insert(new_queue, {x = item.x, y = item.y + 1, direction = directions.down}) - table.insert(new_queue, {x = item.x + 1, y = item.y + 1, direction = directions.downright}) + -- See under item.direction == directions.upleft + if cavern[item.x - 1][item.y] == tiletypes.empty or cavern[item.x][item.y - 1] == tiletypes.empty then + -- ⌟ x> + -- v⌟ + visibility_map[item.x][item.y] = true + table.insert(new_queue, {x = item.x + 1, y = item.y, direction = directions.right}) + table.insert(new_queue, {x = item.x, y = item.y + 1, direction = directions.down}) + table.insert(new_queue, {x = item.x + 1, y = item.y + 1, direction = directions.downright}) + end elseif item.direction == directions.upright then - -- ^⌝ - -- ⌝ x> - table.insert(new_queue, {x = item.x, y = item.y - 1, direction = directions.up}) - table.insert(new_queue, {x = item.x + 1, y = item.y - 1, direction = directions.upright}) - table.insert(new_queue, {x = item.x + 1, y = item.y, direction = directions.right}) + -- See under item.direction == directions.upleft + if cavern[item.x - 1][item.y] == tiletypes.empty or cavern[item.x][item.y + 1] == tiletypes.empty then + -- ^⌝ + -- ⌝ x> + visibility_map[item.x][item.y] = true + table.insert(new_queue, {x = item.x, y = item.y - 1, direction = directions.up}) + table.insert(new_queue, {x = item.x + 1, y = item.y - 1, direction = directions.upright}) + table.insert(new_queue, {x = item.x + 1, y = item.y, direction = directions.right}) + end else error("Visibility floodfill item travelling in an impossible direction") end + else + -- Hit a wall + if item.direction == directions.up or + item.direction == directions.left or + item.direction == directions.down or + item.direction == directions.right then + -- Only draw it as visible if we reached it with a non-diagonal move + -- because diagonals might have been non-valid moves + visibility_map[item.x][item.y] = true + end end end