Fix visibility (mostly)

This commit is contained in:
Juhani Krekelä 2019-06-28 23:59:41 +03:00
parent ba529ec3af
commit eb3a654c67
1 changed files with 61 additions and 23 deletions

View File

@ -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
-- ⌜^
-- ⌜ <x
table.insert(new_queue, {x = item.x - 1, y = item.y - 1, direction = directions.upleft})
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, direction = directions.left})
-- Check that we could have gotten here also by moving only 4-ways
--
-- The possible cases are:
-- (o represents old position, x is new, and # is a wall)
--
-- x x# x x#
-- o o #o #o
--
-- In the first three, the movement is possible, but in the last one
-- it is not. We can therefore check whether the movement is valid
-- by testing if either the cell to our right or below us (the
-- directions opposite to the ones in an up.left movement) is empty
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 - 1, y = item.y - 1, direction = directions.upleft})
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, direction = directions.left})
end
elseif item.direction == directions.downleft then
-- ⌞ <x
-- ⌞v
table.insert(new_queue, {x = item.x - 1, y = item.y, direction = directions.left})
table.insert(new_queue, {x = item.x - 1, y = item.y + 1, direction = directions.downleft})
table.insert(new_queue, {x = item.x, y = item.y + 1, direction = directions.down})
-- 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.left})
table.insert(new_queue, {x = item.x - 1, y = item.y + 1, direction = directions.downleft})
table.insert(new_queue, {x = item.x, y = item.y + 1, direction = directions.down})
end
elseif item.direction == directions.downright then
-- ⌟ x>
-- 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