Fix visibility (mostly)
This commit is contained in:
parent
ba529ec3af
commit
eb3a654c67
|
@ -247,51 +247,89 @@ function generateVisibilityMap()
|
||||||
end
|
end
|
||||||
|
|
||||||
function stepVisibilityMapGeneration(queue)
|
function stepVisibilityMapGeneration(queue)
|
||||||
-- TODO: Handle corners somehow correctly
|
|
||||||
-- Do a modified floodfill, where each cell will only expand in its given direction, not
|
-- Do a modified floodfill, where each cell will only expand in its given direction, not
|
||||||
-- every direction like in a normal floodfill
|
-- every direction like in a normal floodfill
|
||||||
local new_queue = {}
|
local new_queue = {}
|
||||||
|
|
||||||
for i, item in ipairs(queue) do
|
for i, item in ipairs(queue) do
|
||||||
visibility_map[item.x][item.y] = true
|
|
||||||
|
|
||||||
if cavern[item.x][item.y] == tiletypes.empty then
|
if cavern[item.x][item.y] == tiletypes.empty then
|
||||||
-- Did not yet hit a wall
|
-- Did not yet hit a wall
|
||||||
if item.direction == directions.up then
|
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})
|
table.insert(new_queue, {x = item.x, y = item.y - 1, direction = directions.up})
|
||||||
elseif item.direction == directions.left then
|
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})
|
table.insert(new_queue, {x = item.x - 1, y = item.y, direction = directions.left})
|
||||||
elseif item.direction == directions.down then
|
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})
|
table.insert(new_queue, {x = item.x, y = item.y + 1, direction = directions.down})
|
||||||
elseif item.direction == directions.right then
|
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})
|
table.insert(new_queue, {x = item.x + 1, y = item.y, direction = directions.right})
|
||||||
elseif item.direction == directions.upleft then
|
elseif item.direction == directions.upleft then
|
||||||
|
-- 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
|
-- ⌜ <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 - 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, y = item.y - 1, direction = directions.up})
|
||||||
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, direction = directions.left})
|
||||||
|
end
|
||||||
elseif item.direction == directions.downleft then
|
elseif item.direction == directions.downleft then
|
||||||
|
-- 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
|
-- ⌞ <x
|
||||||
-- ⌞v
|
-- ⌞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, 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 - 1, y = item.y + 1, direction = directions.downleft})
|
||||||
table.insert(new_queue, {x = item.x, y = item.y + 1, direction = directions.down})
|
table.insert(new_queue, {x = item.x, y = item.y + 1, direction = directions.down})
|
||||||
|
end
|
||||||
elseif item.direction == directions.downright then
|
elseif item.direction == directions.downright then
|
||||||
|
-- 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>
|
-- ⌟ x>
|
||||||
-- v⌟
|
-- 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 + 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, y = item.y + 1, direction = directions.down})
|
||||||
table.insert(new_queue, {x = item.x + 1, y = item.y + 1, direction = directions.downright})
|
table.insert(new_queue, {x = item.x + 1, y = item.y + 1, direction = directions.downright})
|
||||||
|
end
|
||||||
elseif item.direction == directions.upright then
|
elseif item.direction == directions.upright then
|
||||||
|
-- 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>
|
-- ⌝ 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, 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 - 1, direction = directions.upright})
|
||||||
table.insert(new_queue, {x = item.x + 1, y = item.y, direction = directions.right})
|
table.insert(new_queue, {x = item.x + 1, y = item.y, direction = directions.right})
|
||||||
|
end
|
||||||
else
|
else
|
||||||
error("Visibility floodfill item travelling in an impossible direction")
|
error("Visibility floodfill item travelling in an impossible direction")
|
||||||
end
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue