Skip to content

Commit

Permalink
Updates to bring all maps and their viewers up to date with latest ch…
Browse files Browse the repository at this point in the history
…anges
  • Loading branch information
blunty666 committed Feb 10, 2016
1 parent 75c4f8e commit 86a66af
Show file tree
Hide file tree
Showing 7 changed files with 291 additions and 206 deletions.
8 changes: 4 additions & 4 deletions maps/compactMap
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ local mapMethods = {
set = function(self, tVector, value)
if not isValidValue(value) then
--should we throw an error or use a default value?
error("compactMap set: value is not valid", 2)
error("set: value is not valid")
end
local gX, gY, gZ, pX, pY, pZ = toGridCode(tVector)
local grid = getGrid(self, gX, gY, gZ)
Expand All @@ -175,7 +175,7 @@ local mapMethods = {
else
if not isValidValue(value) then
--should we throw an error or use a default value?
error("compactMap getOrSet: value is not valid", 2)
error("getOrSet: value is not valid")
end
if not grid[pX] then
grid[pX] = {}
Expand All @@ -197,11 +197,11 @@ function new(mapDir)
if not fs.exists(mapDir) then
fs.makeDir(mapDir)
elseif not fs.isDir(mapDir) then
error("compactMap new: not a valid directory", 2)
error("new: not a valid directory")
end
tMap.mapDir = mapDir
else
error("compactMap new: directory must be string", 2)
error("new: directory must be string")
end
tMap.map = {}
setmetatable(tMap, mapMetatable)
Expand Down
104 changes: 59 additions & 45 deletions maps/map
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
local maps = {}

local function toGridCode(tVector)
return math.floor(tVector.x/16), math.floor(tVector.y/16), math.floor(tVector.z/16), tVector.x % 16, tVector.y % 16, tVector.z % 16
end
Expand All @@ -23,7 +21,17 @@ local function getGrid(tMap, x, y, z)
end
end

local methods = {
local mapMethods = {

getGrid = function(self, tVector, y, z)
local gX, gY, gZ
if y and z then
gX, gY, gZ = tVector, y, z
else
gX, gY, gZ = toGridCode(tVector)
end
return getGrid(self, gX, gY, gZ)
end,

load = function(self, tVector, y, z)
local gX, gY, gZ
Expand All @@ -32,28 +40,24 @@ local methods = {
else
gX, gY, gZ = toGridCode(tVector)
end
if self.name then
if fs.exists(".maps/"..self.name.."/"..gX..","..gY..","..gZ) then
local handle = fs.open(".maps/"..self.name.."/"..gX..","..gY..","..gZ, "r")
if handle then
local grid = handle.readAll()
handle.close()
for i = 15, 0, -1 do
grid = string.gsub(grid, tostring(i).."=", "%["..tostring(i).."%]=")
end
grid = textutils.unserialize(grid)
if type(grid) == "table" then
return setGrid(self, gX, gY, gZ, grid)
end
local gridPath = fs.combine(self.mapDir, gX..","..gY..","..gZ)
if fs.exists(gridPath) then
local handle = fs.open(gridPath, "r")
if handle then
local grid = handle.readAll()
handle.close()
grid = textutils.unserialise(grid)
if type(grid) == "table" then
return setGrid(self, gX, gY, gZ, grid)
end
end
end
return setGrid(self, gX, gY, gZ, {})
end,

loadAll = function(self)
if self.name and fs.exists(".maps/"..self.name) and fs.isDir(".maps/"..self.name) then
for _, gridFile in ipairs(fs.list(".maps/"..self.name)) do
if fs.exists(self.mapDir) and fs.isDir(self.mapDir) then
for _, gridFile in ipairs(fs.list(self.mapDir)) do
local _, _, gX, gY, gZ = string.find(gridFile, "(.+)%,(.+)%,(.+)")
if gX and gY and gX then
self:load(tonumber(gX), tonumber(gY), tonumber(gZ))
Expand All @@ -62,23 +66,32 @@ local methods = {
end
end,

save = function(self)
if self.name then
local saveDir = ".maps/"..self.name
for x, YZmap in pairs(self.map) do
for y, Zmap in pairs(YZmap) do
for z, grid in pairs(Zmap) do
if next(grid) then
local handle = fs.open(fs.combine(saveDir, x..","..y..","..z), "w")
local data = textutils.serialize(grid)
data = string.gsub(data, " ", "")
for i = 0, 15 do
data, num = string.gsub(data, "%["..tostring(i).."%]=", tostring(i).."=")
end
handle.write(data)
handle.close()
end
end
save = function(self, tVector, y, z)
local gX, gY, gZ
if y and z then
gX, gY, gZ = tVector, y, z
else
gX, gY, gZ = toGridCode(tVector)
end
if self.map[gX] and self.map[gX][gY] and self.map[gX][gY][gZ] then
local grid = self.map[gX][gY][gZ]
if next(grid) then
local handle = fs.open(fs.combine(self.mapDir, gX..","..gY..","..gZ), "w")
if handle then
handle.write(textutils.serialise(grid))
handle.close()
end
else
fs.delete(fs.combine(self.mapDir, gX..","..gY..","..gZ))
end
end
end,

saveAll = function(self)
for gX, YZmap in pairs(self.map) do
for gY, Zmap in pairs(YZmap) do
for gZ, grid in pairs(Zmap) do
self:save(gX, gY, gZ)
end
end
end
Expand Down Expand Up @@ -123,20 +136,21 @@ local methods = {
end,

}
local mapMetatable = {__index = mapMethods}

function new(name)
function new(mapDir)
local tMap = {}
if name and type(name) == "string" then
if maps[name] then
return maps[name]
end
tMap.name = name
if not fs.exists(".maps/"..name) then
fs.makeDir(".maps/"..name)
if type(mapDir) == "string" then
if not fs.exists(mapDir) then
fs.makeDir(mapDir)
elseif not fs.isDir(mapDir) then
error("new: not a valid directory")
end
maps[name] = tMap
tMap.mapDir = mapDir
else
error("new: directory must be string")
end
tMap.map = {}
setmetatable(tMap, {__index = methods})
setmetatable(tMap, mapMetatable)
return tMap
end
176 changes: 176 additions & 0 deletions maps/map_viewer
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
local tArgs = {...}

local function printUsage()
print("Usage:")
print(fs.getName(shell.getRunningProgram()).." <mapAPI_path> <map_path> <x_pos> <y_pos> <z_pos>")
print("<(string)mapAPI_path> The path of the mapAPI the map uses.")
print("<(string)map_path> The directory path of the map you want to view.")
print("[optional] <(number)x_pos> <(number)y_pos> <(number)z_pos> The GPS coordinates you want to view the map at.")
end

--===== LOAD MAP API =====--
local mapAPIPath = tArgs[1]
if type(mapAPIPath) ~= "string" or not fs.exists(mapAPIPath) or fs.isDir(mapAPIPath) then
printError("invalid mapAPI_path: "..tostring(mapAPIPath))
printUsage()
return
end
local mapAPI = fs.getName(mapAPIPath)
if not _G[mapAPI] then
if not os.loadAPI(mapAPIPath) then
printError("could not load mapAPI: "..tostring(mapAPIPath))
printUsage()
return
end
end
mapAPI = _G[mapAPI]

--===== LOAD MAP =====--
if type(tArgs[2]) ~= "string" then
printError("string expected for map name")
printUsage()
return
end
local map = mapAPI.new(tArgs[2])

--===== FIND START COORDINATES =====--
local currX, currY, currZ
if #tArgs == 5 then
for i = 3, 5 do
local num = tArgs[i]
if not tonumber(num) or num % 1 ~= 0 then
printError("argument "..tostring(i).." is not a number")
printUsage()
return
end
end
currX = tArgs[3]
currY = tArgs[4]
currZ = tArgs[5]
else
currX, currY, currZ = gps.locate(1)
if tonumber(currX) then
currX = math.floor(tonumber(currX))
end
if tonumber(currY) then
currY = math.floor(tonumber(currY))
end
if tonumber(currZ) then
currZ = math.floor(tonumber(currZ))
end
end
if not (currX and currY and currZ) then
printError("could not identify start coords")
printUsage()
return
end

term.setCursorBlink(false)
term.setTextColour(colours.white)
term.setBackgroundColour(colours.black)
term.clear()

local width, height = term.getSize()
local currW, currH = 1, 1

local mainWindow = window.create(term.current(), 1, 1, width, math.max(0, height - 1), false)
mainWindow.setTextColour(colours.red)

local toolbarWindow = window.create(term.current(), 1, height, width, 1, false)
toolbarWindow.setBackgroundColour(colours.grey)
toolbarWindow.setTextColour(colours.white)
toolbarWindow.clear()

local function redrawMainWindow()
mainWindow.setVisible(false)

mainWindow.setBackgroundColour(colours.black)
mainWindow.clear()
mainWindow.setBackgroundColour(colours.white)

local w, h = mainWindow.getSize()
for x = 1, w do
for z = 1, h do
local value = map:get(vector.new(currX + x - 1, currY, currZ + z - 1))
if value ~= nil then
mainWindow.setCursorPos(x, z)
mainWindow.write(string.sub(tostring(value), 1, 1))
end
end
end

local cursorValue = map:get(vector.new(currX + currW - 1, currY, currZ + currH - 1))
mainWindow.setBackgroundColour(colours.green)
mainWindow.setCursorPos(currW, currH)
if cursorValue ~= nil then
mainWindow.write(string.sub(tostring(cursorValue), 1, 1))
else
mainWindow.write(" ")
end

mainWindow.setVisible(true)
end

local function redrawToolbarWindow()
toolbarWindow.setVisible(false)

toolbarWindow.setCursorPos(1, 1)
toolbarWindow.clearLine()
toolbarWindow.write(tostring(currX + currW - 1)..","..tostring(currY)..","..tostring(currZ + currH - 1))
toolbarWindow.write(" -- ")
toolbarWindow.write(tostring(math.floor( (currX + currW - 1)/16 )))
toolbarWindow.write(",")
toolbarWindow.write(tostring(math.floor( (currY)/16 )))
toolbarWindow.write(",")
toolbarWindow.write(tostring(math.floor( (currZ + currH - 1)/16 )))

toolbarWindow.setVisible(true)
end

local cont = true
local redraw = true
while cont do
if redraw then
redrawToolbarWindow()
redrawMainWindow()
redraw = false
end
local event = {os.pullEvent()}
if event[1] == "key" then
local key = event[2]
if key == keys.up then
currZ = currZ - 1
currH = math.min(height - 1, currH + 1)
elseif key == keys.down then
currZ = currZ + 1
currH = math.max(1, currH - 1)
elseif key == keys.left then
currX = currX - 1
currW = math.min(width, currW + 1)
elseif key == keys.right then
currX = currX + 1
currW = math.max(1, currW - 1)
elseif key == keys.numPadAdd then
currY = currY + 1
elseif key == keys.numPadSubtract then
currY = currY - 1
elseif key == keys.backspace then
cont = false
end
redraw = true
elseif event[1] == "mouse_click" then
if event[4] < height then
currW, currH = event[3], event[4]
redraw = true
end
elseif event[1] == "term_resize" then
width, height = term.getSize()
mainWindow.reposition(1, 1, width, math.max(0, height - 1))
toolbarWindow.reposition(1, height, width, height)
redraw = true
end
end

term.setBackgroundColour(colours.black)
term.setCursorPos(1, 1)
term.clear()
File renamed without changes.
Loading

0 comments on commit 86a66af

Please sign in to comment.