buldthensnip/pkg/base/lib_map.lua
2012-11-13 22:05:21 +13:00

174 lines
3.6 KiB
Lua

--[[
This file is part of Ice Lua Components.
Ice Lua Components is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Ice Lua Components is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with Ice Lua Components. If not, see <http://www.gnu.org/licenses/>.
]]
-- returns a list consisting of {t,r,g,b} tuplets
function map_pillar_raw_get(x,z)
local xlen,ylen,zlen
xlen,ylen,zlen = common.map_get_dims()
local tpack = common.map_pillar_get(x,z)
local t = {}
local i,j,y
i = 1
y = 0
while true do
while y < tpack[i+1] do
t[y+1] = nil
y = y + 1
end
j = i + 4
while y <= tpack[i+2] do
t[y+1] = {tpack[j+3],tpack[j+2],tpack[j+1],tpack[j+0]}
y = y + 1
j = j + 4
end
if tpack[i] == 0 then
while y < ylen do
t[y+1] = false
y = y + 1
end
break
end
local ntr = tpack[i]-(tpack[i+2]-tpack[i+1])
i = i + 4*tpack[i]
ntr = tpack[i] - ntr
while y < ntr do
t[y+1] = false
y = y + 1
end
while y < tpack[i+3] do
t[y+1] = {tpack[j+3],tpack[j+2],tpack[j+1],tpack[j+0]}
y = y + 1
j = j + 4
end
end
return t
end
function map_pillar_raw_set(x,z,t)
local xlen,ylen,zlen
xlen,ylen,zlen = common.map_get_dims()
local tpack = {}
local y,i
local rmode = 0
local n,s,e,a
a = 0
i = nil
y = 0
while true do
-- skip air
while t[y+1] == nil do
y = y + 1
if y >= ylen then break end
end
if y >= ylen then break end
-- allocate slot
i = #tpack+1
tpack[i+0] = 0
tpack[i+1] = y
tpack[i+2] = 0
tpack[i+3] = a
-- copy top run
while t[y+1] do
tpack[#tpack+1] = t[y+1][4]
tpack[#tpack+1] = t[y+1][3]
tpack[#tpack+1] = t[y+1][2]
tpack[#tpack+1] = t[y+1][1]
y = y + 1
end
tpack[i+2] = y-1
-- skip dirt
while t[y+1] == false do
y = y + 1
if y >= ylen then break end
end
if y >= ylen then break end
tpack[i] = tpack[i+2]-tpack[i+1]+2
-- build bottom run
while t[y+1] do
tpack[#tpack+1] = t[y+1][4]
tpack[#tpack+1] = t[y+1][3]
tpack[#tpack+1] = t[y+1][2]
tpack[#tpack+1] = t[y+1][1]
tpack[i] = tpack[i] + 1
y = y + 1
end
a = y
end
common.map_pillar_set(x,z,tpack)
end
function map_pillar_aerate(x,z)
local xlen,ylen,zlen
xlen,ylen,zlen = common.map_get_dims()
local t = map_pillar_raw_get(x,z)
local l = {
map_pillar_raw_get(x-1,z),
map_pillar_raw_get(x+1,z),
map_pillar_raw_get(x,z-1),
map_pillar_raw_get(x,z+1),
}
local y
-- TODO!
end
function map_block_set(x,y,z,typ,r,g,b)
local xlen,ylen,zlen
xlen,ylen,zlen = common.map_get_dims()
if y < 0 or y >= ylen then return end
local t = map_pillar_raw_get(x,z)
t[y+1] = {typ, r, g, b}
map_pillar_raw_set(x,z,t)
map_pillar_aerate(x,z)
map_pillar_aerate(x-1,z)
map_pillar_aerate(x+1,z)
map_pillar_aerate(x,z-1)
map_pillar_aerate(x,z+1)
end
function map_block_break(x,y,z)
local xlen,ylen,zlen
xlen,ylen,zlen = common.map_get_dims()
if y < 0 or y >= ylen then return end
local t = map_pillar_raw_get(x,z)
t[y+1] = nil
map_pillar_raw_set(x,z,t)
map_pillar_aerate(x,z)
map_pillar_aerate(x-1,z)
map_pillar_aerate(x+1,z)
map_pillar_aerate(x,z-1)
map_pillar_aerate(x,z+1)
end