Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local running = true
- local level_file = nil --set on load
- local level_dir = "/levels" --relative to game file
- local level = {
- ["name"] = "<DEV FORGOT A NAME>"; --Level Name
- ["nextlevel"] = ""; --Next level
- ["spawn"] = {5, 5}; --Player spawn
- ["walls"] = { --Tile numbers that doesn't allow pass through (aka walls)
- [128] = true;
- };
- ["toggles"] = {
- };
- ["finish"] = {1, 1};
- ["level"] = {
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- }
- }
- local lastTile = {1, 1}
- local lvlXOffset = 1
- local lvlYOffset = 2
- local selTile = 0
- local selColor = 2 ^ 0
- local w, h = term.getSize()
- local function split(str, splitter)
- local t = {}
- local function helper(line) table.insert(t, line) return "" end
- helper((str:gsub("(.-)" .. splitter, helper)))
- return t
- end
- local function center(txt, hOffset, isError)
- if not hOffset then hOffset = 0 end
- term.setCursorPos((w - #txt) / 2, (h - hOffset) / 2)
- if isError then printError(txt) else print(txt) end
- end
- local function clear(bgC, fgC)
- term.setBackgroundColor(bgC or colors.black)
- term.setTextColor(fgC or colors.white)
- term.setCursorPos(1, 1)
- term.clear()
- end
- local function level_save()
- local lF = fs.open(level_file, "w")
- lF.write("return " .. textutils.serialize(level))
- lF.close()
- return level
- end
- local function level_getFile(fname)
- if fs.getDir(shell.getRunningProgram()) == "usr/bin" then --We're running on packman
- return fs.combine("/etc/tntta/levels", fname) .. ".lvl"
- end
- return shell.resolve(fs.combine(level_dir, fname)) .. ".lvl"
- end
- local function level_load(level)
- level_file = level_getFile(level)
- if fs.exists(level_file) then
- return dofile(level_file)
- end
- return level_save()
- end
- local drawOnce = function() end --Made useful later, just to make sure we don't get "attempt to call nil" at L96
- local function level_setSpawn()
- clear()
- print("Set Spawn Coords (\24 for current): ")
- write("X: ") local x = tonumber(read(nil ,{level["spawn"][1]}))
- write("Y: ") local y = tonumber(read(nil ,{level["spawn"][2]}))
- level["spawn"][1] = x
- level["spawn"][2] = y
- drawOnce()
- end
- local function level_setFinish()
- clear()
- print("Set Finish Coords (\24 for current): ")
- write("X: ") local x = tonumber(read(nil ,{level["finish"][1]}))
- write("Y: ") local y = tonumber(read(nil ,{level["finish"][2]}))
- write("Next Level: ") local nl = read(nil ,{level["nextlevel"]})
- level["finish"][1] = x
- level["finish"][2] = y
- level["nextlevel"] = nl
- drawOnce()
- end
- local function level_setCollidable()
- clear()
- print("Set Collidable Tiles (\24 for current): ")
- local walls = textutils.unserialize(read(nil ,{textutils.serialize(level["walls"])}))
- level["walls"] = walls
- drawOnce()
- end
- local function level_setName()
- clear()
- print("Set Level Name (\24 for current): ")
- write("Name: ") local name = read(nil, {level["name"]})
- level["name"] = name
- drawOnce()
- end
- local function level_addToggle()
- clear()
- print("Add or edit Toggle: ")
- write("X: ") local x = tonumber(read())
- write("Y: ") local y = tonumber(read())
- write("Tile To Toggle: ") local t = tonumber(read())
- write("Enabled? [yN]: ") local e = read()
- level["toggles"][#level["toggles"] + 1] = {x, y, t, e == "y"}
- drawOnce()
- end
- local function level_delToggle()
- clear()
- print("Delete Toggle: ")
- write("X: ") local x = tonumber(read())
- write("Y: ") local y = tonumber(read())
- for i = 1, #level["toggles"] do
- if level["toggles"][i][1] == x and level["toggles"][i][2] == y then
- level["toggles"][i] = nil
- break
- end
- end
- drawOnce()
- end
- local function tile_change(ch)
- if ((selTile + ch) > 15) then selTile = 0
- elseif ((selTile + ch) < 0) then selTile = 15
- else selTile = selTile + ch
- end
- selColor = 2 ^ selTile
- end
- drawOnce = function()
- clear(colors.gray, colors.white)
- paintutils.drawLine(1, 1, w, 1, colors.blue)
- paintutils.drawLine(1, 2, w, 2, colors.blue)
- term.setTextColor(colors.white)
- term.setCursorPos(1, 1)
- write("Editing: " .. level["name"])
- term.setCursorPos(1, 2)
- write("Last Tile at: ")
- end
- local function draw()
- term.setBackgroundColor(colors.blue)
- term.setTextColor(colors.white)
- term.setCursorPos(15, 2)
- write(lastTile[1] .. "x" .. lastTile[2])
- term.setCursorPos(w - #"Selected tile:" - 5 - #tostring(selColor), 2)
- write(" Selected tile: ")
- term.setBackgroundColor(selColor)
- term.setTextColor(selColor == 1 and colors.black or colors.white)
- write(selColor)
- if #level["level"] > h then error("Level too big for screen!", 999) end
- for y = 1, #level["level"] do
- if #level["level"][y] > w then error("Level too big for screen!", 999) end
- for x = 1, #level["level"][y] do
- term.setBackgroundColor(level["level"][y][x])
- term.setCursorPos(lvlXOffset + x, lvlYOffset + y)
- for i = 1, #level["toggles"] do
- if level["toggles"][i][1] == x and level["toggles"][i][2] == y then
- term.setBackgroundColor(level["toggles"][i][3])
- term.setTextColor(level["toggles"][i][3] ~= colors.black and colors.black or colors.white)
- write("T")
- break
- end
- end
- if x == level["spawn"][1] and y == level["spawn"][2] then
- term.setTextColor(colors.orange ~= level["level"][y][x] and colors.orange or colors.white)
- write("P")
- elseif x == level["finish"][1] and y == level["finish"][2] then
- term.setBackgroundColor(colors.black ~= level["level"][y][x] and colors.black or colors.white)
- term.setTextColor(colors.black ~= level["level"][y][x] and colors.white or colors.black)
- write("\153")
- else
- write(" ")
- end
- end
- end
- paintutils.drawLine(1, h, w, h, colors.gray)
- end
- local function event()
- local e = {os.pullEvent()}
- if e[1] == "key" then
- if e[2] == keys.q then running = false sleep(.001)
- elseif e[2] == keys.enter then level_save()
- elseif e[2] == keys.s then level_setSpawn()
- elseif e[2] == keys.f then level_setFinish()
- elseif e[2] == keys.c then level_setCollidable()
- elseif e[2] == keys.n then level_setName()
- elseif e[2] == keys.t then level_addToggle()
- elseif e[2] == keys.d then level_delToggle()
- elseif e[2] == keys.up then tile_change(1)
- elseif e[2] == keys.down then tile_change(-1)
- end
- elseif (e[1] == "mouse_drag" or e[1] == "mouse_click") and e[2] == 1 then
- if level["level"][e[4] - lvlYOffset] == nil then level["level"][e[4] - lvlYOffset] = {1, 1} end
- level["level"][e[4] - lvlYOffset][e[3] - lvlXOffset] = selColor
- lastTile[1] = e[3] - lvlXOffset
- lastTile[2] = e[4] - lvlYOffset
- elseif e[1] == "mouse_scroll" and e[3] == w and e[4] == 2 then
- tile_change(e[2])
- end
- end
- local function main(args)
- if args[1] == nil then
- local programp = split(shell.getRunningProgram(), "/")
- print(programp[#programp] .. " <level name>")
- return
- end
- print([[edit -- TNtTA Level Editor
- [Q] Quit
- [Enter] Save
- [S] set spawn
- [F] change finish tile coords
- [C] set collision tables
- [N] set level name
- [T] add toggle
- [D] delete toggle
- [Up Arrow / MWheel up] change selected tile up
- [Down Arrow / MWheel down] change selected tile down
- Press any key to continue...]])
- os.pullEvent("key")
- level = level_load(args[1])
- drawOnce()
- while running do
- draw()
- event()
- end
- clear()
- end
- local err = {pcall(main, {...})}
- if not err[1] then
- local errThing = split(err[2], ":")
- local programp = split(shell.getRunningProgram(), "/")
- clear(colors.blue, colors.white)
- if errThing ~= 3 and errThing[1] == programp[#programp] then
- center("Editor Error at line " .. errThing[2])
- center(errThing[3], -2, true)
- else
- center("Error!")
- center(err[2], -2, true)
- end
- paintutils.drawLine(1, h, w, h, colors.black)
- term.setCursorPos(1, h)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement