1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
------------------------------------------------------------------------------
-- vector.lua:
--
-- Functions relating to vector math
------------------------------------------------------------------------------
vector = {}
-- The four directions and their associated vector normal and name.
-- This helps us manage orientation of rooms.
vector.normals = {
{ x = 0, y = -1, dir = 0, name="n" },
{ x = -1, y = 0, dir = 1, name="w" },
{ x = 0, y = 1, dir = 2, name="s" },
{ x = 1, y = 0, dir = 3, name="e" }
}
-- Sometimes it's useful to have a list of diagonal vectors also
vector.diagonals = {
{ x = -1, y = -1, dir = 0.5, name="nw" },
{ x = -1, y = 1, dir = 1.5, name="sw" },
{ x = 1, y = 1, dir = 2.5, name="se" },
{ x = 1, y = -1, dir = 3.5, name="ne" }
}
-- All 8 directions (although not in logical order)
vector.directions = util.append({},vector.normals,vector.diagonals)
-- Moves from a start point along a movement vector mapped to actual vectors xVector/yVector
-- This allows us to deal with coords independently of how they are rotated to the dungeon grid
function vector.add_mapped(start, move, xMap, yMap)
return {
x = start.x + (move.x * xMap.x) + (move.y * yMap.x),
y = start.y + (move.x * xMap.y) + (move.y * yMap.y)
}
end
-- Rotates a vector anticlockwise by 90 degree increments * count
-- Highly rudimentary, not actually used for anything, keeping around for now in case.
function vector.rotate(vec, count)
if count > 0 then
local rotated = { x = -vec.y, y = vec.x }
count = count - 1
if count <= 0 then return rotated end
return vector_rotate(rotated,count)
end
if count < 0 then
local rotated = { x = vec.y, y = -vec.x }
count = count + 1
if count >= 0 then return rotated end
return vector_rotate(rotated,count)
end
return vec
end
|