Advertisement
ecoMeco

tntta-edit

Aug 27th, 2016
426
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.08 KB | None | 0 0
  1. local running    = true
  2.  
  3. local level_file = nil       --set on load
  4. local level_dir  = "/levels" --relative to game file
  5. local level      = {
  6.     ["name"]      = "<DEV FORGOT A NAME>";    --Level Name
  7.     ["nextlevel"] = "";                       --Next level
  8.     ["spawn"]     = {5, 5};                   --Player spawn
  9.     ["walls"]     = {                         --Tile numbers that doesn't allow pass through (aka walls)
  10.         [128] = true;
  11.     };
  12.     ["toggles"]   = {
  13.     };
  14.     ["finish"]    = {1, 1};
  15.     ["level"]     = {
  16.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  17.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  18.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  19.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  20.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  21.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  22.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  23.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  24.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  25.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  26.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  27.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  28.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  29.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  30.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  31.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  32.     }
  33. }
  34.  
  35. local lastTile   = {1, 1}
  36.  
  37. local lvlXOffset = 1
  38. local lvlYOffset = 2
  39.  
  40. local selTile    = 0
  41. local selColor   = 2 ^ 0
  42.  
  43. local w, h       = term.getSize()
  44.  
  45. local function split(str, splitter)
  46.     local t = {}
  47.     local function helper(line) table.insert(t, line) return "" end
  48.         helper((str:gsub("(.-)" .. splitter, helper)))
  49.     return t
  50. end
  51.  
  52. local function center(txt, hOffset, isError)
  53.     if not hOffset then hOffset = 0 end
  54.  
  55.     term.setCursorPos((w - #txt) / 2, (h - hOffset) / 2)
  56.     if isError then printError(txt) else print(txt) end
  57. end
  58.  
  59. local function clear(bgC, fgC)
  60.     term.setBackgroundColor(bgC or colors.black)
  61.     term.setTextColor(fgC or colors.white)
  62.     term.setCursorPos(1, 1)
  63.     term.clear()
  64. end
  65.  
  66. local function level_save()
  67.     local lF = fs.open(level_file, "w")
  68.         lF.write("return " .. textutils.serialize(level))
  69.     lF.close()
  70.  
  71.     return level
  72. end
  73.  
  74. local function level_getFile(fname)
  75.     if fs.getDir(shell.getRunningProgram()) == "usr/bin" then --We're running on packman
  76.         return fs.combine("/etc/tntta/levels", fname) .. ".lvl"
  77.     end
  78.  
  79.     return shell.resolve(fs.combine(level_dir, fname)) .. ".lvl"
  80. end
  81.  
  82.  
  83. local function level_load(level)
  84.     level_file = level_getFile(level)
  85.  
  86.     if fs.exists(level_file) then
  87.         return dofile(level_file)
  88.     end
  89.  
  90.     return level_save()
  91. end
  92.  
  93. local drawOnce = function() end --Made useful later, just to make sure we don't get "attempt to call nil" at L96
  94. local function level_setSpawn()
  95.     clear()
  96.     print("Set Spawn Coords (\24 for current): ")
  97.     write("X: ") local x = tonumber(read(nil ,{level["spawn"][1]}))
  98.     write("Y: ") local y = tonumber(read(nil ,{level["spawn"][2]}))
  99.  
  100.     level["spawn"][1] = x
  101.     level["spawn"][2] = y
  102.  
  103.     drawOnce()
  104. end
  105.  
  106. local function level_setFinish()
  107.     clear()
  108.     print("Set Finish Coords (\24 for current): ")
  109.     write("X: ") local x = tonumber(read(nil ,{level["finish"][1]}))
  110.     write("Y: ") local y = tonumber(read(nil ,{level["finish"][2]}))
  111.     write("Next Level: ") local nl = read(nil ,{level["nextlevel"]})
  112.  
  113.     level["finish"][1] = x
  114.     level["finish"][2] = y
  115.  
  116.     level["nextlevel"] = nl
  117.  
  118.     drawOnce()
  119. end
  120.  
  121. local function level_setCollidable()
  122.     clear()
  123.     print("Set Collidable Tiles (\24 for current): ")
  124.     local walls = textutils.unserialize(read(nil ,{textutils.serialize(level["walls"])}))
  125.  
  126.     level["walls"] = walls
  127.     drawOnce()
  128. end
  129.  
  130. local function level_setName()
  131.     clear()
  132.     print("Set Level Name (\24 for current): ")
  133.     write("Name: ") local name = read(nil, {level["name"]})
  134.  
  135.     level["name"] = name
  136.  
  137.     drawOnce()
  138. end
  139.  
  140. local function level_addToggle()
  141.     clear()
  142.     print("Add or edit Toggle: ")
  143.     write("X: ") local x = tonumber(read())
  144.     write("Y: ") local y = tonumber(read())
  145.     write("Tile To Toggle: ") local t = tonumber(read())
  146.     write("Enabled? [yN]: ") local e = read()
  147.  
  148.     level["toggles"][#level["toggles"] + 1] = {x, y, t, e == "y"}
  149.  
  150.     drawOnce()
  151. end
  152.  
  153. local function level_delToggle()
  154.     clear()
  155.     print("Delete Toggle: ")
  156.     write("X: ") local x = tonumber(read())
  157.     write("Y: ") local y = tonumber(read())
  158.  
  159.     for i = 1, #level["toggles"] do
  160.         if level["toggles"][i][1] == x and level["toggles"][i][2] == y then
  161.             level["toggles"][i] = nil
  162.             break
  163.         end
  164.     end
  165.  
  166.     drawOnce()
  167. end
  168.  
  169. local function tile_change(ch)
  170.     if     ((selTile + ch) > 15) then selTile = 0
  171.     elseif ((selTile + ch) < 0)  then selTile = 15
  172.     else                              selTile = selTile + ch
  173.     end
  174.  
  175.     selColor = 2 ^ selTile
  176. end
  177.  
  178. drawOnce =  function()
  179.     clear(colors.gray, colors.white)
  180.  
  181.     paintutils.drawLine(1, 1, w, 1, colors.blue)
  182.     paintutils.drawLine(1, 2, w, 2, colors.blue)
  183.  
  184.     term.setTextColor(colors.white)
  185.     term.setCursorPos(1, 1)
  186.     write("Editing: " .. level["name"])
  187.  
  188.     term.setCursorPos(1, 2)
  189.     write("Last Tile at: ")
  190. end
  191.  
  192. local function draw()
  193.     term.setBackgroundColor(colors.blue)
  194.     term.setTextColor(colors.white)
  195.     term.setCursorPos(15, 2)
  196.     write(lastTile[1] .. "x" .. lastTile[2])
  197.  
  198.  
  199.     term.setCursorPos(w - #"Selected tile:" - 5 - #tostring(selColor), 2)
  200.     write("     Selected tile: ")
  201.     term.setBackgroundColor(selColor)
  202.     term.setTextColor(selColor == 1 and colors.black or colors.white)
  203.     write(selColor)
  204.  
  205.     if #level["level"] > h then error("Level too big for screen!", 999) end
  206.     for y = 1, #level["level"] do
  207.  
  208.         if #level["level"][y] > w then error("Level too big for screen!", 999) end
  209.         for x = 1, #level["level"][y] do
  210.             term.setBackgroundColor(level["level"][y][x])
  211.             term.setCursorPos(lvlXOffset + x, lvlYOffset + y)
  212.  
  213.             for i = 1, #level["toggles"] do
  214.                 if level["toggles"][i][1] == x and level["toggles"][i][2] == y then
  215.                     term.setBackgroundColor(level["toggles"][i][3])
  216.                     term.setTextColor(level["toggles"][i][3] ~= colors.black and colors.black or colors.white)
  217.                     write("T")
  218.                     break
  219.                 end
  220.             end
  221.  
  222.             if x == level["spawn"][1] and y == level["spawn"][2] then
  223.                 term.setTextColor(colors.orange ~= level["level"][y][x] and colors.orange or colors.white)
  224.                 write("P")
  225.             elseif x == level["finish"][1] and y == level["finish"][2] then
  226.                 term.setBackgroundColor(colors.black ~= level["level"][y][x] and colors.black or colors.white)
  227.                 term.setTextColor(colors.black ~= level["level"][y][x] and colors.white or colors.black)
  228.                 write("\153")
  229.             else
  230.                 write(" ")
  231.             end
  232.         end
  233.     end
  234.  
  235.     paintutils.drawLine(1, h, w, h, colors.gray)
  236. end
  237.  
  238. local function event()
  239.     local e = {os.pullEvent()}
  240.  
  241.     if e[1] == "key" then
  242.         if     e[2] == keys.q     then running = false sleep(.001)
  243.         elseif e[2] == keys.enter then level_save()
  244.         elseif e[2] == keys.s     then level_setSpawn()
  245.         elseif e[2] == keys.f     then level_setFinish()
  246.         elseif e[2] == keys.c     then level_setCollidable()
  247.         elseif e[2] == keys.n     then level_setName()
  248.         elseif e[2] == keys.t     then level_addToggle()
  249.         elseif e[2] == keys.d     then level_delToggle()
  250.         elseif e[2] == keys.up    then tile_change(1)
  251.         elseif e[2] == keys.down  then tile_change(-1)
  252.         end
  253.     elseif (e[1] == "mouse_drag" or e[1] == "mouse_click") and e[2] == 1 then
  254.         if level["level"][e[4] - lvlYOffset] == nil then level["level"][e[4] - lvlYOffset] = {1, 1} end
  255.  
  256.         level["level"][e[4] - lvlYOffset][e[3] - lvlXOffset] = selColor
  257.  
  258.         lastTile[1] = e[3] - lvlXOffset
  259.         lastTile[2] = e[4] - lvlYOffset
  260.     elseif e[1] == "mouse_scroll" and e[3] == w and e[4] == 2 then
  261.         tile_change(e[2])
  262.     end
  263. end
  264.  
  265. local function main(args)
  266.     if args[1] == nil then
  267.         local programp = split(shell.getRunningProgram(), "/")
  268.  
  269.         print(programp[#programp] .. " <level name>")
  270.         return
  271.     end
  272.  
  273.     print([[edit -- TNtTA Level Editor
  274.  
  275. [Q] Quit
  276. [Enter] Save
  277. [S] set spawn
  278. [F] change finish tile coords
  279. [C] set collision tables
  280. [N] set level name
  281. [T] add toggle
  282. [D] delete toggle
  283. [Up Arrow / MWheel up] change selected tile up
  284. [Down Arrow / MWheel down] change selected tile down
  285.  
  286. Press any key to continue...]])
  287.     os.pullEvent("key")
  288.  
  289.     level = level_load(args[1])
  290.  
  291.     drawOnce()
  292.     while running do
  293.         draw()
  294.         event()
  295.     end
  296.  
  297.     clear()
  298. end
  299.  
  300. local err = {pcall(main, {...})}
  301. if not err[1] then
  302.     local errThing = split(err[2], ":")
  303.     local programp = split(shell.getRunningProgram(), "/")
  304.  
  305.     clear(colors.blue, colors.white)
  306.     if errThing ~= 3 and errThing[1] == programp[#programp] then
  307.         center("Editor Error at line " .. errThing[2])
  308.         center(errThing[3], -2, true)
  309.     else
  310.         center("Error!")
  311.         center(err[2], -2, true)
  312.     end
  313.  
  314.     paintutils.drawLine(1, h, w, h, colors.black)
  315.     term.setCursorPos(1, h)
  316. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement