Advertisement
ecoMeco

tntta

Aug 27th, 2016
452
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.00 KB | None | 0 0
  1. local running    = true
  2. local gravity    = true
  3.  
  4. local level_dir  = "/levels" --relative to game file
  5. local level      = nil       --set on load.
  6. local currentLvl = nil       --set on load.
  7.  
  8. local lvlXOffset = 1
  9. local lvlYOffset = 2
  10.  
  11. local w, h       = term.getSize()
  12.  
  13. local player     = {
  14.     ["draw"]  = "\2";
  15.     ["color"] = colors.orange;
  16.     ["x"]     = 0;
  17.     ["y"]     = 0;
  18. }
  19.  
  20. local function split(str, splitter)
  21.     local t = {}
  22.     local function helper(line) table.insert(t, line) return "" end
  23.     helper((str:gsub("(.-)" .. splitter, helper)))
  24.     return t
  25. end
  26.  
  27. local function center(txt, hOffset, isError)
  28.     if not hOffset then hOffset = 0 end
  29.  
  30.     term.setCursorPos((w - #txt) / 2, (h - hOffset) / 2)
  31.     if isError then printError(txt) else print(txt) end
  32. end
  33.  
  34. local function clear(bgC, fgC)
  35.     term.setBackgroundColor(bgC or colors.black)
  36.     term.setTextColor(fgC or colors.white)
  37.     term.setCursorPos(1, 1)
  38.     term.clear()
  39. end
  40.  
  41. local function level_getFile(fname)
  42.     if fs.getDir(shell.getRunningProgram()) == "usr/bin" then --We're running on packman
  43.         return fs.combine("/etc/tntta/levels", fname) .. ".lvl"
  44.     end
  45.  
  46.     return shell.resolve(fs.combine(level_dir, fname)) .. ".lvl"
  47. end
  48.  
  49. local draw_once = function() end --to not get nil errors
  50. local function level_load(levele)
  51.     level = level_getFile(levele)
  52.  
  53.     if fs.exists(level) then
  54.         level = dofile(level)
  55.  
  56.         player["x"] = level["spawn"][1]
  57.         player["y"] = level["spawn"][2]
  58.  
  59.         currentLvl  = levele
  60.  
  61.         draw_once()
  62.         return
  63.     end
  64.  
  65.     error("Level " .. level_getFile(levele) .. " doesn't exist!", 999)
  66. end
  67.  
  68. local function player_move(xDif, yDif)
  69.     if not (player["x"] + xDif <= 0) and not (player["x"] + xDif >= w) and
  70.     not (player["y"] + yDif <= 0) and not (player["y"] + yDif >= h) and
  71.     level["level"][player["y"] + yDif]                     ~= nil and
  72.     level["level"][player["y"] + yDif][player["x"] + xDif] ~= nil then
  73.         if not level["walls"][level["level"][player["y"] + yDif][player["x"] + xDif]]  then
  74.             player["x"] = player["x"] + xDif
  75.             player["y"] = player["y"] + yDif
  76.  
  77.             if player["x"] == level["finish"][1] and player["y"] == level["finish"][2] then
  78.                 if level["nextlevel"] ~= "" then
  79.                     level_load(level["nextlevel"])
  80.                     return
  81.                 end
  82.  
  83.                 clear()
  84.                 center("The maps end here! Thanks for playing!")
  85.                 center("(any key to exit)", -2)
  86.                 os.pullEvent("key")
  87.                 running = false
  88.             else
  89.                 for i = 1, #level["toggles"] do
  90.                     if player["x"] == level["toggles"][i][1] and player["y"] == level["toggles"][i][2] then
  91.                         level["toggles"][i][4] = not level["toggles"][i][4]
  92.  
  93.                         --just to make sure the toggles don't toggle unexpectedly
  94.                         if     xDif >=  1 then player["x"] = player["x"] + 1
  95.                         elseif xDif <= -1 then player["x"] = player["x"] - 1
  96.                         elseif yDif >=  1 then player["y"] = player["y"] + 1
  97.                         elseif yDif <= -1 then player["y"] = player["y"] - 1
  98.                         end
  99.                         break
  100.                     end
  101.                 end
  102.             end
  103.         else
  104.             for i = 1, #level["toggles"] do
  105.                 if level["toggles"][i][3] == level["level"][player["y"] + yDif][player["x"] + xDif] and
  106.                    level["toggles"][i][4] then
  107.                     player["x"] = player["x"] + xDif
  108.                     player["y"] = player["y"] + yDif
  109.  
  110.                     return
  111.                 end
  112.             end
  113.  
  114.             level_load(currentLvl)
  115.         end
  116.     end
  117. end
  118.  
  119. local function player_gravity()
  120.     while running do
  121.         sleep(.15)
  122.         if gravity then
  123.             player_move(0, 1)
  124.         else
  125.             gravity = true
  126.         end
  127.     end
  128. end
  129.  
  130. draw_once = function()
  131.     clear(colors.gray, colors.white)
  132.  
  133.     paintutils.drawLine(1, 1, w, 1, colors.blue)
  134.     term.setTextColor(colors.white)
  135.     term.setCursorPos(1, 1)
  136.     write("Level: " .. level["name"])
  137.     term.setCursorPos(w - #"Q to Quit" + 1, 1)
  138.     write("Q to Quit")
  139. end
  140.  
  141. local function draw()
  142.     if #level["level"] > h then error("Level too big for screen!", 999) end
  143.     for y = 1, #level["level"] do
  144.  
  145.         if #level["level"][y] > w then error("Level too big for screen!", 999) end
  146.         for x = 1, #level["level"][y] do
  147.             term.setBackgroundColor(level["level"][y][x])
  148.             term.setCursorPos(lvlXOffset + x, lvlYOffset + y)
  149.  
  150.             for i = 1, #level["toggles"] do
  151.                 if level["toggles"][i][1] == x and level["toggles"][i][2] == y then
  152.                     term.setBackgroundColor(level["toggles"][i][4] and level["toggles"][i][3] or colors.white)
  153.                     term.setTextColor(not level["toggles"][i][4] and level["toggles"][i][3] or colors.white)
  154.                     write("T")
  155.                     break
  156.                 end
  157.             end
  158.  
  159.             if x == player["x"] and y == player["y"] then
  160.                 if player["color"] == level["level"][y][x] then
  161.                     term.setTextColor(colors.white)
  162.                 else
  163.                     term.setTextColor(player["color"])
  164.                 end
  165.                 write(player["draw"])
  166.                 term.setTextColor(colors.white)
  167.             elseif x == level["finish"][1] and y == level["finish"][2] then
  168.                 term.setBackgroundColor(colors.black ~= level["level"][y][x] and colors.black or colors.white)
  169.                 term.setTextColor(colors.black ~= level["level"][y][x] and colors.white or colors.black)
  170.                 write("\153")
  171.             else
  172.                 write(" ")
  173.             end
  174.         end
  175.     end
  176. end
  177.  
  178. local function event()
  179.     local e = {os.pullEvent()}
  180.  
  181.     if e[1] == "key" then
  182.         if     e[2] == keys.q     then running = false sleep(.001)
  183.         elseif e[2] == keys.up    then player_move(0, -1) gravity = (e[3] and not gravity)
  184.         elseif e[2] == keys.right then player_move( 1, 0)
  185.         elseif e[2] == keys.left  then player_move(-1, 0)
  186.         end
  187.     end
  188. end
  189.  
  190. local function main(args)
  191.     level_load(args[1] or "level1")
  192.  
  193.     parallel.waitForAny(function()
  194.         while running do
  195.             draw()
  196.             event()
  197.         end
  198.     end, player_gravity)
  199.  
  200.     clear()
  201. end
  202.  
  203. local err = {pcall(main, {...})}
  204. if not err[1] then
  205.     local errThing = split(err[2], ":")
  206.     local programp = split(shell.getRunningProgram(), "/")
  207.  
  208.     clear(colors.blue, colors.white)
  209.     if errThing ~= 3 and errThing[1] == programp[#programp] then
  210.         center("Game Error at line " .. errThing[2])
  211.         center(errThing[3], -2, true)
  212.     else
  213.         center("Error!")
  214.         center(err[2], -2, true)
  215.     end
  216.  
  217.     paintutils.drawLine(1, h, w, h, colors.black)
  218.     term.setCursorPos(1, h)
  219. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement