Advertisement
Guest User

platformer

a guest
Mar 24th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 31.05 KB | None | 0 0
  1.   width, height = term.getSize()
  2.  
  3.   local arguments = {...}
  4.   if arguments and arguments[1] then
  5.     local outputPath = arguments[2] or arguments[1]..".pin"
  6.     local gameFile = fs.open(arguments[1], "r")
  7.     local game = gameFile:readAll()
  8.     gameFile.close()
  9.     local engineFile = fs.open("engine", "r")
  10.     local engine = engineFile.readAll()
  11.     engineFile.close()
  12.  
  13.     local outputFile = fs.open(outputPath, "w")
  14.     outputFile.write(engine)
  15.     outputFile.write("\n\nengine=getfenv()\n-- Game Code")
  16.     outputFile.write(game)
  17.     outputFile.close()
  18.     term.setTextColor(colors.green)
  19.     print("Exported game "..arguments[1].." to "..outputPath.." successfully")
  20.     error("", 0)
  21.   end
  22.  
  23.   -- EVENT HANDLER MODULE
  24.   local mouseKeys = {"left", "right", "other"}
  25.   mouse = {x = 0, y = 0}
  26.   keyboard = {lastChar = ""}
  27.   eventHandler = {
  28.     mouse_click = function(button, x, y)
  29.       mouse.x, mouse.y = x, y
  30.       mouse.isDown = true
  31.       mouse.button = mouseKeys[button]
  32.     end,
  33.     mouse_up = function(button, x, y)
  34.       mouse.x, mouse.y = x, y
  35.       mouse.isDown = false
  36.       mouse.isDragged = false
  37.       mouse.button = mouseKeys[button]
  38.     end,
  39.     mouse_drag = function(button, x, y)
  40.       mouse.x, mouse.y = x, y
  41.       mouse.isDown = true
  42.       mouse.dragX, mouse.dragY = x, y
  43.       mouse.button = mouseKeys[button]
  44.     end,
  45.  
  46.     key = function(key)
  47.       keyboard[keys.getName(key)] = true
  48.     end,
  49.     key_up = function(key)
  50.       keyboard[keys.getName(key)] = false
  51.     end,
  52.     char = function(char)
  53.       keyboard.lastChar = char
  54.       keyboard.newChar = true
  55.     end
  56.   }
  57.  
  58.   -- DYNAMIC LIGHT MODULE
  59.   dynamicLight = {}
  60.   dynamicLight.positions = {
  61.     [0] = {0, -1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}, {-1, 0}, {-1, 1}, {0, 1}
  62.   }
  63.   dynamicLight.lightPixel = function(self, x, y)
  64.     local degree = math.deg(math.atan2(self.lightSource.x-x, self.lightSource.y-y))+180
  65.     local eightDegree = math.floor(degree/45)
  66.  
  67.     local tileX, tileY = x-dynamicLight.positions[eightDegree][1], y-dynamicLight.positions[eightDegree][2]
  68.     if not (self.light[tileX] and self[tileX] and self[tileX][tileY]) then return end
  69.     if self[tileX] and self[x] then
  70.       if self.light[tileX][tileY] == true and not self[tileX][tileY].solid then
  71.         self.light[x][y] = true
  72.       else
  73.         self.light[x][y] = false
  74.       end
  75.     end
  76.   end
  77.  
  78.  
  79.   -- ELEMENT MODULE
  80.   moveTo = function(self, tilemap, xmove, ymove)
  81.     local couldMove = true
  82.     for move = 1, math.abs(xmove)+math.abs(ymove) do
  83.       local canMove = true
  84.       for x = 1, self.w do
  85.         for y = 1, self.h do
  86.           if (self.image and self.image[y][x]) or not self.image then
  87.             local moveToX = self.x+xmove+x-1
  88.             local moveToY = self.y+ymove+y-1
  89.             if moveToX < 1 or moveToX > width or moveToY < 1 or moveToY > height then canMove = false end
  90.             local tile = tilemap:getTile(moveToX, moveToY)
  91.             if (not tile) or tile.solid then couldMove = false canMove = false end
  92.           end
  93.         end
  94.       end
  95.       if canMove then
  96.         self.x = self.x + xmove
  97.         self.y = self.y + ymove
  98.       end
  99.     end
  100.     return couldMove
  101.   end
  102.   isBoxClicked = function(box)
  103.     return mouse.isDown and box.x<=mouse.x and box.y<=mouse.y and box.x+box.w>mouse.x and box.y+box.h>mouse.y
  104.   end
  105.   newElement = function(elementTab)
  106.     return function(tab)
  107.       return setmetatable(
  108.         tab,
  109.         {
  110.           __index = elementTab
  111.         }
  112.       )
  113.     end
  114.   end
  115.   elements = {
  116.     tilemap = newElement({
  117.       saveTilemap = function(self, path)
  118.         local tileTab = {}
  119.         for x = 1, #self do
  120.           tileTab[x] = {}
  121.           for y = 1, #self[x] do
  122.             tileTab[x][y] = self[x][y].tile
  123.           end
  124.         end
  125.         local file = fs.open(path..".til", "w")
  126.         local tilemapData = textutils.serialize(tileTab)
  127.         file.write(tilemapData)
  128.         file.close()
  129.       end,
  130.       loadTilemap = function(self, path)
  131.         local tilemapTab
  132.         if type(path) == "table" then
  133.           tilemapTab = path
  134.         else
  135.           local file = fs.open(path..".til", "r")
  136.           local tilemapData = file.readAll()
  137.           tilemapTab = textutils.unserialize(tilemapData)
  138.         end
  139.         for x = 1, #tilemapTab do
  140.           for y = 1, #tilemapTab[x] do
  141.             self:setTile(x, y, tilemapTab[x][y])
  142.           end
  143.         end
  144.       end,
  145.       generated = false,
  146.       getTile = function(self, x, y)
  147.         if self[x] then
  148.           return self[x][y]
  149.         else
  150.           return {}
  151.         end
  152.       end,
  153.       setTile = function(self, x, y, tile)
  154.         if not self[x] then self[x] = {} end
  155.         self[x][y] = self.tileset[tile]
  156.         self[x][y].tile = tile
  157.       end,
  158.       setRectangle = function(self, rx, ry, w, h, tile)
  159.         for x = rx, rx+w do
  160.           for y = ry, ry+h do
  161.             self:setTile(x, y, tile)
  162.           end
  163.         end
  164.       end,
  165.       [1] = {},
  166.       light = {},
  167.       lightUpdateTime = 7,
  168.       DRAW = function(self)
  169.         for y = 1, #self[1] do
  170.           term.setCursorPos(1, y)
  171.           for x = 1, #self do
  172.             local tile = self[x][y]
  173.             if tile then
  174.               if self.dynamicLight and not tile.solid and not self.light[x][y] then
  175.                 term.setBackgroundColor(colors.black)
  176.                 term.write(" ")
  177.               else
  178.                 term.setBackgroundColor(tile.bc)
  179.                 term.setTextColor(tile.tc)
  180.                 term.write(tile.char)
  181.               end
  182.             else
  183.               term.write(" ")
  184.             end
  185.           end
  186.         end
  187.       end,
  188.       UPDATE = function(self)
  189.         if self.generate and not self.generated then
  190.           self:generate()
  191.           self.generated = true
  192.           if self.dynamicLight then
  193.             for x = 1, #self do
  194.               self.light[x] = {}
  195.             end
  196.           end
  197.         end
  198.         if self.dynamicLight then
  199.           for x = 1, 3 do
  200.             for y = 1, 3 do
  201.               if self.light[self.lightSource.x+x-2] then
  202.                 self.light[self.lightSource.x+x-2][self.lightSource.y+y-2] = true
  203.               end
  204.             end
  205.           end
  206.  
  207.           for i = 1, self.lightUpdateTime do
  208.             for x = 1, #self do
  209.               for y = 1, #self[1] do
  210.                 dynamicLight.lightPixel(self, x, y)
  211.               end
  212.             end
  213.           end
  214.         end
  215.       end
  216.     }),
  217.     button = newElement({
  218.       UPDATE = function(self)
  219.         if isBoxClicked(self) then
  220.           if not self.clicked and self.clickedFunction then self:clickedFunction() end
  221.           self.clicked = true
  222.         else
  223.           self.clicked = false
  224.         end
  225.       end,
  226.       DRAW = function(self)
  227.         if self.clicked then
  228.           term.setBackgroundColor(colors.white)
  229.           term.setTextColor(colors.lightGray)
  230.         else
  231.           term.setBackgroundColor(colors.lightGray)
  232.           term.setTextColor(colors.gray)
  233.         end
  234.         paintutils.drawFilledBox(self.x, self.y, self.w+self.x-1, self.h+self.y-1)
  235.         term.setCursorPos(self.x+self.w/2-#self.label/2, self.y+self.h/2)
  236.         term.write(self.label)
  237.       end
  238.     }),
  239.     sprite = newElement({
  240.       path = "",
  241.       DRAW = function(self)
  242.         if not self.image then
  243.           self.image = paintutils.loadImage(self.path)
  244.           self.w = 1
  245.           for y = 1, #self.image do
  246.             if #self.image[y] > self.w then
  247.               self.w = #self.image[y]
  248.             end
  249.           end
  250.           self.h = #self.image
  251.         end
  252.         paintutils.drawImage(self.image, self.x, self.y)
  253.       end
  254.     }),
  255.     template = newElement({
  256.       UPDATE = function(self)
  257.       end,
  258.       DRAW = function(self)
  259.       end
  260.     }),
  261.   }
  262.  
  263.  
  264.   -- LIFECYCLE FUNCTIONS
  265.   lastUpdate = os.clock()
  266.   runProtected = function(func)
  267.     local succ, mess = pcall(func)
  268.     if not succ then
  269.       quit(mess)
  270.     end
  271.   end
  272.   update = function(elements, wantedDt, func)
  273.     runProtected(function()
  274.     local timer = os.startTimer(wantedDt-(os.clock()-lastUpdate))
  275.     local event, var1, var2, var3 = os.pullEventRaw()
  276.     if event == "terminate" then quit(true) end
  277.     os.cancelTimer(timer)
  278.  
  279.     if event ~= "mouse_drag" then mouse.isDragged = false end
  280.     if event ~= "char" then keyboard.newChar = false end
  281.     if eventHandler[event] then eventHandler[event](var1, var2, var3) end
  282.  
  283.     if os.clock()-lastUpdate >= wantedDt then
  284.       for elementName, element in pairs(elements) do
  285.         if element.UPDATE then
  286.           element:UPDATE()
  287.         end
  288.         if element.update then
  289.           element:update()
  290.         end
  291.       end
  292.       if func then func() end
  293.       lastUpdate = os.clock()
  294.     end
  295.     end)
  296.   end
  297.   buffer = window.create(term.current(), 1, 1, width, height)
  298.   draw = function(elements, func)
  299.     runProtected(function()
  300.     buffer.setVisible(false)
  301.     local oldterm = term.redirect(buffer)
  302.     term.setBackgroundColor(colors.black)
  303.     term.clear()
  304.     local prioritys = {}
  305.     for elementName, element in pairs(elements) do
  306.       if element.priority then
  307.         if element.priority == true then
  308.           table.insert(prioritys, element)
  309.         else
  310.           prioritys[element.priority] = element
  311.         end
  312.       end
  313.       if element.DRAW then
  314.         element:DRAW()
  315.       end
  316.       if element.draw then
  317.         element:draw()
  318.       end
  319.     end
  320.     for i = 1, #prioritys do
  321.       local element = prioritys[i]
  322.       if element.DRAW then
  323.         element:DRAW()
  324.       end
  325.       if element.draw then
  326.         element:draw()
  327.       end
  328.     end
  329.     if func then func() end
  330.     buffer.setVisible(true)
  331.     term.redirect(oldterm)
  332.     end)
  333.   end
  334.   quit = function(hard)
  335.     buffer.setVisible(true)
  336.     term.setBackgroundColor(colors.black)
  337.     term.setTextColor(colors.yellow)
  338.     term.clear()
  339.     term.setCursorPos(1, 1)
  340.     print("Thanks for using the Pinwyn Game Engine by Jummit!")
  341.     if type(hard) == "string" then
  342.       print("The game crashed! Here is the error:")
  343.       term.setTextColor(colors.red)
  344.       print(hard)
  345.     elseif hard then
  346.       print("The game was forcefully closed")
  347.     else
  348.       print("The game was closed without any errors")
  349.     end
  350.     error()
  351.   end
  352.  
  353.   engine=getfenv()
  354.   -- Game Codeos.loadAPI("engine")
  355.  
  356.   local gameEnded = false
  357.   local level = {
  358.     {
  359.       "wall",
  360.       "wall",
  361.       "wall",
  362.       "wall",
  363.       "wall",
  364.       "wall",
  365.       "wall",
  366.       "wall",
  367.       "wall",
  368.       "wall",
  369.       "wall",
  370.       "wall",
  371.       "wall",
  372.       "wall",
  373.       "wall",
  374.       "wall",
  375.       "wall",
  376.       "wall",
  377.       "wall",
  378.       "wall",
  379.     },
  380.     {
  381.       "wall",
  382.       "floor",
  383.       "floor",
  384.       "floor",
  385.       "floor",
  386.       "floor",
  387.       "wall",
  388.       "floor",
  389.       "floor",
  390.       "floor",
  391.       "floor",
  392.       "floor",
  393.       "floor",
  394.       "floor",
  395.       "wall",
  396.       "floor",
  397.       "floor",
  398.       "floor",
  399.       "wall",
  400.       "wall",
  401.     },
  402.     {
  403.       "wall",
  404.       "wall",
  405.       "wall",
  406.       "wall",
  407.       "floor",
  408.       "floor",
  409.       "wall",
  410.       "floor",
  411.       "floor",
  412.       "floor",
  413.       "wall",
  414.       "floor",
  415.       "floor",
  416.       "floor",
  417.       "wall",
  418.       "floor",
  419.       "floor",
  420.       "floor",
  421.       "wall",
  422.       "wall",
  423.     },
  424.     {
  425.       "wall",
  426.       "wall",
  427.       "floor",
  428.       "floor",
  429.       "floor",
  430.       "floor",
  431.       "wall",
  432.       "floor",
  433.       "floor",
  434.       "floor",
  435.       "wall",
  436.       "floor",
  437.       "floor",
  438.       "floor",
  439.       "wall",
  440.       "floor",
  441.       "floor",
  442.       "floor",
  443.       "wall",
  444.       "wall",
  445.     },
  446.     {
  447.       "wall",
  448.       "wall",
  449.       "wall",
  450.       "wall",
  451.       "floor",
  452.       "floor",
  453.       "wall",
  454.       "floor",
  455.       "floor",
  456.       "floor",
  457.       "wall",
  458.       "floor",
  459.       "floor",
  460.       "floor",
  461.       "wall",
  462.       "wall",
  463.       "floor",
  464.       "wall",
  465.       "wall",
  466.       "wall",
  467.     },
  468.     {
  469.       "wall",
  470.       "floor",
  471.       "floor",
  472.       "floor",
  473.       "floor",
  474.       "floor",
  475.       "wall",
  476.       "floor",
  477.       "wall",
  478.       "floor",
  479.       "floor",
  480.       "floor",
  481.       "floor",
  482.       "floor",
  483.       "wall",
  484.       "floor",
  485.       "floor",
  486.       "floor",
  487.       "wall",
  488.       "wall",
  489.     },
  490.     {
  491.       "wall",
  492.       "wall",
  493.       "floor",
  494.       "wall",
  495.       "wall",
  496.       "wall",
  497.       "wall",
  498.       "floor",
  499.       "floor",
  500.       "wall",
  501.       "floor",
  502.       "floor",
  503.       "floor",
  504.       "floor",
  505.       "wall",
  506.       "floor",
  507.       "floor",
  508.       "floor",
  509.       "wall",
  510.       "wall",
  511.     },
  512.     {
  513.       "wall",
  514.       "floor",
  515.       "floor",
  516.       "floor",
  517.       "floor",
  518.       "floor",
  519.       "wall",
  520.       "floor",
  521.       "wall",
  522.       "floor",
  523.       "floor",
  524.       "floor",
  525.       "floor",
  526.       "floor",
  527.       "wall",
  528.       "wall",
  529.       "floor",
  530.       "wall",
  531.       "wall",
  532.       "wall",
  533.     },
  534.     {
  535.       "wall",
  536.       "wall",
  537.       "wall",
  538.       "wall",
  539.       "wall",
  540.       "floor",
  541.       "wall",
  542.       "floor",
  543.       "floor",
  544.       "floor",
  545.       "wall",
  546.       "floor",
  547.       "floor",
  548.       "floor",
  549.       "wall",
  550.       "floor",
  551.       "floor",
  552.       "floor",
  553.       "wall",
  554.       "wall",
  555.     },
  556.     {
  557.       "wall",
  558.       "floor",
  559.       "floor",
  560.       "floor",
  561.       "floor",
  562.       "floor",
  563.       "wall",
  564.       "floor",
  565.       "floor",
  566.       "floor",
  567.       "wall",
  568.       "floor",
  569.       "floor",
  570.       "floor",
  571.       "wall",
  572.       "floor",
  573.       "floor",
  574.       "floor",
  575.       "wall",
  576.       "wall",
  577.     },
  578.     {
  579.       "wall",
  580.       "floor",
  581.       "wall",
  582.       "wall",
  583.       "wall",
  584.       "wall",
  585.       "wall",
  586.       "floor",
  587.       "floor",
  588.       "floor",
  589.       "wall",
  590.       "floor",
  591.       "floor",
  592.       "floor",
  593.       "floor",
  594.       "wall",
  595.       "floor",
  596.       "floor",
  597.       "wall",
  598.       "wall",
  599.     },
  600.     {
  601.       "wall",
  602.       "floor",
  603.       "wall",
  604.       "floor",
  605.       "floor",
  606.       "floor",
  607.       "wall",
  608.       "wall",
  609.       "wall",
  610.       "floor",
  611.       "wall",
  612.       "floor",
  613.       "wall",
  614.       "floor",
  615.       "floor",
  616.       "floor",
  617.       "floor",
  618.       "floor",
  619.       "wall",
  620.       "wall",
  621.     },
  622.     {
  623.       "wall",
  624.       "floor",
  625.       "wall",
  626.       "floor",
  627.       "floor",
  628.       "floor",
  629.       "wall",
  630.       "floor",
  631.       "floor",
  632.       "floor",
  633.       "wall",
  634.       "floor",
  635.       "floor",
  636.       "floor",
  637.       "floor",
  638.       "wall",
  639.       "floor",
  640.       "floor",
  641.       "wall",
  642.       "wall",
  643.     },
  644.     {
  645.       "wall",
  646.       "floor",
  647.       "wall",
  648.       "floor",
  649.       "floor",
  650.       "floor",
  651.       "wall",
  652.       "floor",
  653.       "wall",
  654.       "wall",
  655.       "wall",
  656.       "floor",
  657.       "floor",
  658.       "floor",
  659.       "wall",
  660.       "floor",
  661.       "floor",
  662.       "floor",
  663.       "wall",
  664.       "wall",
  665.     },
  666.     {
  667.       "wall",
  668.       "floor",
  669.       "floor",
  670.       "floor",
  671.       "floor",
  672.       "floor",
  673.       "wall",
  674.       "floor",
  675.       "floor",
  676.       "floor",
  677.       "wall",
  678.       "wall",
  679.       "wall",
  680.       "wall",
  681.       "wall",
  682.       "wall",
  683.       "wall",
  684.       "wall",
  685.       "wall",
  686.       "wall",
  687.     },
  688.     {
  689.       "wall",
  690.       "floor",
  691.       "floor",
  692.       "floor",
  693.       "wall",
  694.       "floor",
  695.       "wall",
  696.       "floor",
  697.       "floor",
  698.       "floor",
  699.       "floor",
  700.       "wall",
  701.       "floor",
  702.       "floor",
  703.       "floor",
  704.       "wall",
  705.       "floor",
  706.       "floor",
  707.       "wall",
  708.       "wall",
  709.     },
  710.     {
  711.       "wall",
  712.       "floor",
  713.       "floor",
  714.       "floor",
  715.       "wall",
  716.       "floor",
  717.       "wall",
  718.       "floor",
  719.       "floor",
  720.       "floor",
  721.       "floor",
  722.       "wall",
  723.       "floor",
  724.       "wall",
  725.       "floor",
  726.       "floor",
  727.       "floor",
  728.       "floor",
  729.       "wall",
  730.       "wall",
  731.     },
  732.     {
  733.       "wall",
  734.       "floor",
  735.       "floor",
  736.       "floor",
  737.       "wall",
  738.       "floor",
  739.       "wall",
  740.       "floor",
  741.       "floor",
  742.       "wall",
  743.       "floor",
  744.       "wall",
  745.       "floor",
  746.       "wall",
  747.       "wall",
  748.       "wall",
  749.       "wall",
  750.       "floor",
  751.       "wall",
  752.       "wall",
  753.     },
  754.     {
  755.       "wall",
  756.       "floor",
  757.       "floor",
  758.       "floor",
  759.       "wall",
  760.       "wall",
  761.       "wall",
  762.       "floor",
  763.       "floor",
  764.       "wall",
  765.       "floor",
  766.       "wall",
  767.       "floor",
  768.       "floor",
  769.       "wall",
  770.       "floor",
  771.       "wall",
  772.       "floor",
  773.       "wall",
  774.       "wall",
  775.     },
  776.     {
  777.       "wall",
  778.       "floor",
  779.       "floor",
  780.       "floor",
  781.       "floor",
  782.       "floor",
  783.       "wall",
  784.       "floor",
  785.       "floor",
  786.       "wall",
  787.       "floor",
  788.       "wall",
  789.       "wall",
  790.       "floor",
  791.       "wall",
  792.       "floor",
  793.       "wall",
  794.       "floor",
  795.       "wall",
  796.       "wall",
  797.     },
  798.     {
  799.       "wall",
  800.       "floor",
  801.       "floor",
  802.       "floor",
  803.       "floor",
  804.       "floor",
  805.       "wall",
  806.       "floor",
  807.       "floor",
  808.       "wall",
  809.       "floor",
  810.       "floor",
  811.       "floor",
  812.       "floor",
  813.       "wall",
  814.       "floor",
  815.       "floor",
  816.       "floor",
  817.       "wall",
  818.       "wall",
  819.     },
  820.     {
  821.       "wall",
  822.       "floor",
  823.       "floor",
  824.       "floor",
  825.       "floor",
  826.       "floor",
  827.       "wall",
  828.       "wall",
  829.       "wall",
  830.       "wall",
  831.       "wall",
  832.       "wall",
  833.       "wall",
  834.       "wall",
  835.       "wall",
  836.       "floor",
  837.       "wall",
  838.       "wall",
  839.       "wall",
  840.       "wall",
  841.     },
  842.     {
  843.       "wall",
  844.       "wall",
  845.       "floor",
  846.       "wall",
  847.       "wall",
  848.       "wall",
  849.       "wall",
  850.       "floor",
  851.       "floor",
  852.       "floor",
  853.       "floor",
  854.       "floor",
  855.       "floor",
  856.       "floor",
  857.       "floor",
  858.       "floor",
  859.       "floor",
  860.       "floor",
  861.       "wall",
  862.       "wall",
  863.     },
  864.     {
  865.       "wall",
  866.       "wall",
  867.       "floor",
  868.       "floor",
  869.       "wall",
  870.       "floor",
  871.       "floor",
  872.       "floor",
  873.       "floor",
  874.       "wall",
  875.       "floor",
  876.       "floor",
  877.       "floor",
  878.       "floor",
  879.       "floor",
  880.       "floor",
  881.       "floor",
  882.       "floor",
  883.       "wall",
  884.       "wall",
  885.     },
  886.     {
  887.       "wall",
  888.       "wall",
  889.       "floor",
  890.       "floor",
  891.       "wall",
  892.       "floor",
  893.       "floor",
  894.       "floor",
  895.       "floor",
  896.       "floor",
  897.       "floor",
  898.       "floor",
  899.       "floor",
  900.       "floor",
  901.       "wall",
  902.       "floor",
  903.       "floor",
  904.       "floor",
  905.       "wall",
  906.       "wall",
  907.     },
  908.     {
  909.       "wall",
  910.       "wall",
  911.       "floor",
  912.       "floor",
  913.       "wall",
  914.       "floor",
  915.       "floor",
  916.       "floor",
  917.       "floor",
  918.       "floor",
  919.       "floor",
  920.       "floor",
  921.       "floor",
  922.       "floor",
  923.       "wall",
  924.       "floor",
  925.       "floor",
  926.       "floor",
  927.       "wall",
  928.       "wall",
  929.     },
  930.     {
  931.       "wall",
  932.       "floor",
  933.       "floor",
  934.       "wall",
  935.       "floor",
  936.       "floor",
  937.       "floor",
  938.       "wall",
  939.       "floor",
  940.       "floor",
  941.       "floor",
  942.       "floor",
  943.       "floor",
  944.       "floor",
  945.       "wall",
  946.       "floor",
  947.       "floor",
  948.       "floor",
  949.       "wall",
  950.       "wall",
  951.     },
  952.     {
  953.       "wall",
  954.       "floor",
  955.       "floor",
  956.       "wall",
  957.       "floor",
  958.       "floor",
  959.       "floor",
  960.       "wall",
  961.       "floor",
  962.       "floor",
  963.       "floor",
  964.       "floor",
  965.       "floor",
  966.       "floor",
  967.       "floor",
  968.       "floor",
  969.       "floor",
  970.       "floor",
  971.       "wall",
  972.       "wall",
  973.     },
  974.     {
  975.       "wall",
  976.       "floor",
  977.       "floor",
  978.       "wall",
  979.       "floor",
  980.       "floor",
  981.       "floor",
  982.       "wall",
  983.       "floor",
  984.       "floor",
  985.       "floor",
  986.       "floor",
  987.       "floor",
  988.       "floor",
  989.       "floor",
  990.       "floor",
  991.       "floor",
  992.       "floor",
  993.       "wall",
  994.       "wall",
  995.     },
  996.     {
  997.       "wall",
  998.       "wall",
  999.       "floor",
  1000.       "wall",
  1001.       "floor",
  1002.       "floor",
  1003.       "floor",
  1004.       "floor",
  1005.       "floor",
  1006.       "floor",
  1007.       "floor",
  1008.       "floor",
  1009.       "floor",
  1010.       "floor",
  1011.       "floor",
  1012.       "floor",
  1013.       "floor",
  1014.       "floor",
  1015.       "wall",
  1016.       "wall",
  1017.     },
  1018.     {
  1019.       "wall",
  1020.       "wall",
  1021.       "floor",
  1022.       "wall",
  1023.       "floor",
  1024.       "floor",
  1025.       "floor",
  1026.       "floor",
  1027.       "floor",
  1028.       "floor",
  1029.       "floor",
  1030.       "floor",
  1031.       "floor",
  1032.       "floor",
  1033.       "floor",
  1034.       "floor",
  1035.       "floor",
  1036.       "floor",
  1037.       "wall",
  1038.       "wall",
  1039.     },
  1040.     {
  1041.       "wall",
  1042.       "wall",
  1043.       "floor",
  1044.       "wall",
  1045.       "wall",
  1046.       "floor",
  1047.       "wall",
  1048.       "wall",
  1049.       "wall",
  1050.       "wall",
  1051.       "wall",
  1052.       "wall",
  1053.       "wall",
  1054.       "floor",
  1055.       "wall",
  1056.       "wall",
  1057.       "wall",
  1058.       "wall",
  1059.       "wall",
  1060.       "wall",
  1061.     },
  1062.     {
  1063.       "wall",
  1064.       "wall",
  1065.       "floor",
  1066.       "wall",
  1067.       "floor",
  1068.       "floor",
  1069.       "floor",
  1070.       "floor",
  1071.       "floor",
  1072.       "floor",
  1073.       "floor",
  1074.       "floor",
  1075.       "floor",
  1076.       "floor",
  1077.       "wall",
  1078.       "floor",
  1079.       "floor",
  1080.       "floor",
  1081.       "wall",
  1082.       "wall",
  1083.     },
  1084.     {
  1085.       "wall",
  1086.       "floor",
  1087.       "floor",
  1088.       "wall",
  1089.       "floor",
  1090.       "floor",
  1091.       "floor",
  1092.       "wall",
  1093.       "wall",
  1094.       "wall",
  1095.       "wall",
  1096.       "wall",
  1097.       "wall",
  1098.       "wall",
  1099.       "wall",
  1100.       "floor",
  1101.       "floor",
  1102.       "floor",
  1103.       "wall",
  1104.       "wall",
  1105.     },
  1106.     {
  1107.       "wall",
  1108.       "floor",
  1109.       "wall",
  1110.       "wall",
  1111.       "floor",
  1112.       "wall",
  1113.       "wall",
  1114.       "wall",
  1115.       "floor",
  1116.       "floor",
  1117.       "floor",
  1118.       "floor",
  1119.       "floor",
  1120.       "floor",
  1121.       "floor",
  1122.       "floor",
  1123.       "floor",
  1124.       "floor",
  1125.       "wall",
  1126.       "wall",
  1127.     },
  1128.     {
  1129.       "wall",
  1130.       "floor",
  1131.       "floor",
  1132.       "wall",
  1133.       "floor",
  1134.       "floor",
  1135.       "wall",
  1136.       "wall",
  1137.       "floor",
  1138.       "wall",
  1139.       "wall",
  1140.       "wall",
  1141.       "wall",
  1142.       "wall",
  1143.       "wall",
  1144.       "wall",
  1145.       "wall",
  1146.       "floor",
  1147.       "wall",
  1148.       "wall",
  1149.     },
  1150.     {
  1151.       "wall",
  1152.       "wall",
  1153.       "floor",
  1154.       "wall",
  1155.       "floor",
  1156.       "floor",
  1157.       "wall",
  1158.       "floor",
  1159.       "floor",
  1160.       "floor",
  1161.       "floor",
  1162.       "floor",
  1163.       "floor",
  1164.       "floor",
  1165.       "floor",
  1166.       "floor",
  1167.       "wall",
  1168.       "floor",
  1169.       "wall",
  1170.       "wall",
  1171.     },
  1172.     {
  1173.       "wall",
  1174.       "wall",
  1175.       "floor",
  1176.       "wall",
  1177.       "floor",
  1178.       "floor",
  1179.       "wall",
  1180.       "floor",
  1181.       "floor",
  1182.       "wall",
  1183.       "wall",
  1184.       "wall",
  1185.       "wall",
  1186.       "wall",
  1187.       "wall",
  1188.       "floor",
  1189.       "wall",
  1190.       "floor",
  1191.       "wall",
  1192.       "wall",
  1193.     },
  1194.     {
  1195.       "wall",
  1196.       "wall",
  1197.       "floor",
  1198.       "wall",
  1199.       "floor",
  1200.       "floor",
  1201.       "floor",
  1202.       "floor",
  1203.       "floor",
  1204.       "floor",
  1205.       "wall",
  1206.       "floor",
  1207.       "floor",
  1208.       "floor",
  1209.       "floor",
  1210.       "floor",
  1211.       "wall",
  1212.       "floor",
  1213.       "wall",
  1214.       "wall",
  1215.     },
  1216.     {
  1217.       "wall",
  1218.       "wall",
  1219.       "floor",
  1220.       "wall",
  1221.       "floor",
  1222.       "floor",
  1223.       "floor",
  1224.       "floor",
  1225.       "floor",
  1226.       "floor",
  1227.       "wall",
  1228.       "floor",
  1229.       "floor",
  1230.       "wall",
  1231.       "wall",
  1232.       "wall",
  1233.       "wall",
  1234.       "floor",
  1235.       "wall",
  1236.       "wall",
  1237.     },
  1238.     {
  1239.       "wall",
  1240.       "floor",
  1241.       "floor",
  1242.       "wall",
  1243.       "floor",
  1244.       "floor",
  1245.       "floor",
  1246.       "floor",
  1247.       "floor",
  1248.       "floor",
  1249.       "floor",
  1250.       "floor",
  1251.       "floor",
  1252.       "wall",
  1253.       "floor",
  1254.       "wall",
  1255.       "floor",
  1256.       "floor",
  1257.       "wall",
  1258.       "wall",
  1259.     },
  1260.     {
  1261.       "wall",
  1262.       "floor",
  1263.       "floor",
  1264.       "wall",
  1265.       "wall",
  1266.       "wall",
  1267.       "wall",
  1268.       "wall",
  1269.       "wall",
  1270.       "wall",
  1271.       "wall",
  1272.       "wall",
  1273.       "wall",
  1274.       "wall",
  1275.       "floor",
  1276.       "wall",
  1277.       "floor",
  1278.       "floor",
  1279.       "wall",
  1280.       "wall",
  1281.     },
  1282.     {
  1283.       "wall",
  1284.       "floor",
  1285.       "floor",
  1286.       "floor",
  1287.       "wall",
  1288.       "floor",
  1289.       "floor",
  1290.       "floor",
  1291.       "floor",
  1292.       "floor",
  1293.       "floor",
  1294.       "floor",
  1295.       "floor",
  1296.       "floor",
  1297.       "floor",
  1298.       "wall",
  1299.       "floor",
  1300.       "floor",
  1301.       "wall",
  1302.       "wall",
  1303.     },
  1304.     {
  1305.       "wall",
  1306.       "floor",
  1307.       "floor",
  1308.       "floor",
  1309.       "wall",
  1310.       "wall",
  1311.       "floor",
  1312.       "floor",
  1313.       "floor",
  1314.       "floor",
  1315.       "floor",
  1316.       "floor",
  1317.       "floor",
  1318.       "floor",
  1319.       "floor",
  1320.       "wall",
  1321.       "floor",
  1322.       "floor",
  1323.       "wall",
  1324.       "wall",
  1325.     },
  1326.     {
  1327.       "wall",
  1328.       "floor",
  1329.       "floor",
  1330.       "floor",
  1331.       "floor",
  1332.       "floor",
  1333.       "wall",
  1334.       "floor",
  1335.       "floor",
  1336.       "floor",
  1337.       "wall",
  1338.       "floor",
  1339.       "floor",
  1340.       "floor",
  1341.       "floor",
  1342.       "wall",
  1343.       "floor",
  1344.       "floor",
  1345.       "wall",
  1346.       "wall",
  1347.     },
  1348.     {
  1349.       "wall",
  1350.       "floor",
  1351.       "floor",
  1352.       "floor",
  1353.       "wall",
  1354.       "floor",
  1355.       "wall",
  1356.       "floor",
  1357.       "floor",
  1358.       "floor",
  1359.       "wall",
  1360.       "floor",
  1361.       "floor",
  1362.       "floor",
  1363.       "floor",
  1364.       "floor",
  1365.       "floor",
  1366.       "floor",
  1367.       "wall",
  1368.       "wall",
  1369.     },
  1370.     {
  1371.       "wall",
  1372.       "floor",
  1373.       "floor",
  1374.       "floor",
  1375.       "floor",
  1376.       "floor",
  1377.       "floor",
  1378.       "floor",
  1379.       "floor",
  1380.       "floor",
  1381.       "wall",
  1382.       "floor",
  1383.       "floor",
  1384.       "floor",
  1385.       "floor",
  1386.       "floor",
  1387.       "floor",
  1388.       "floor",
  1389.       "wall",
  1390.       "wall",
  1391.     },
  1392.     {
  1393.       "wall",
  1394.       "floor",
  1395.       "floor",
  1396.       "floor",
  1397.       "floor",
  1398.       "floor",
  1399.       "floor",
  1400.       "floor",
  1401.       "floor",
  1402.       "floor",
  1403.       "wall",
  1404.       "floor",
  1405.       "floor",
  1406.       "floor",
  1407.       "floor",
  1408.       "floor",
  1409.       "floor",
  1410.       "floor",
  1411.       "wall",
  1412.       "wall",
  1413.     },
  1414.     {
  1415.       "wall",
  1416.       "floor",
  1417.       "floor",
  1418.       "floor",
  1419.       "floor",
  1420.       "floor",
  1421.       "floor",
  1422.       "floor",
  1423.       "floor",
  1424.       "floor",
  1425.       "floor",
  1426.       "floor",
  1427.       "floor",
  1428.       "floor",
  1429.       "floor",
  1430.       "floor",
  1431.       "floor",
  1432.       "floor",
  1433.       "wall",
  1434.       "wall",
  1435.     },
  1436.     {
  1437.       "wall",
  1438.       "floor",
  1439.       "floor",
  1440.       "floor",
  1441.       "floor",
  1442.       "floor",
  1443.       "floor",
  1444.       "floor",
  1445.       "floor",
  1446.       "floor",
  1447.       "floor",
  1448.       "floor",
  1449.       "floor",
  1450.       "floor",
  1451.       "floor",
  1452.       "floor",
  1453.       "floor",
  1454.       "floor",
  1455.       "wall",
  1456.       "wall",
  1457.     },
  1458.     {
  1459.       "wall",
  1460.       "wall",
  1461.       "wall",
  1462.       "wall",
  1463.       "wall",
  1464.       "wall",
  1465.       "wall",
  1466.       "wall",
  1467.       "wall",
  1468.       "wall",
  1469.       "wall",
  1470.       "wall",
  1471.       "wall",
  1472.       "wall",
  1473.       "wall",
  1474.       "wall",
  1475.       "wall",
  1476.       "wall",
  1477.       "wall",
  1478.       "wall",
  1479.     },
  1480.     {
  1481.       "wall",
  1482.       "wall",
  1483.       "wall",
  1484.       "wall",
  1485.       "wall",
  1486.       "wall",
  1487.       "wall",
  1488.       "wall",
  1489.       "wall",
  1490.       "wall",
  1491.       "wall",
  1492.       "wall",
  1493.       "wall",
  1494.       "wall",
  1495.       "wall",
  1496.       "wall",
  1497.       "wall",
  1498.       "wall",
  1499.       "wall",
  1500.       "wall",
  1501.     },
  1502.   }
  1503.   elements = {
  1504.     player = engine.elements.sprite({
  1505.       priority = true,
  1506.       image = {{1}, {1}}, w = 1, h = 2,
  1507.       gravity = 0.5,
  1508.       x = 3, y = 16,
  1509.       move = {x = 0, y = 0},
  1510.       jumpHeight = 6,
  1511.       jumpedHeight = 0,
  1512.       update = function(self)
  1513.         if self.x == 4 and self.y == 4 then
  1514.           gameEnded = true
  1515.         end
  1516.         local tile = elements.tilemap:getTile(self.x, self.y+2)
  1517.         if tile and tile.solid then
  1518.           self.jumpedHeight = 0
  1519.         end
  1520.         local jumped
  1521.         if engine.keyboard.up or engine.keyboard.w then
  1522.           self.jumpedHeight = self.jumpedHeight + 1
  1523.           if self.jumpedHeight<self.jumpHeight then
  1524.             jumped = true
  1525.             if not engine.moveTo(self, elements.tilemap, 0, -1) then
  1526.               self.jumpedHeight = self.jumpHeight
  1527.             end
  1528.           end
  1529.         else
  1530.           self.jumpedHeight = self.jumpHeight
  1531.         end
  1532.         self.jumpHeight = 6
  1533.         if engine.keyboard.down or engine.keyboard.s then
  1534.           self.image[1][1] = nil
  1535.           self.jumpHeight = 3
  1536.         elseif not elements.tilemap:getTile(self.x, self.y).solid then
  1537.           self.image[1][1] = 1
  1538.         end
  1539.         if not jumped then
  1540.           engine.moveTo(self, elements.tilemap, 0, 1)
  1541.         end
  1542.         if engine.keyboard.left or engine.keyboard.a then engine.moveTo(self, elements.tilemap, -1, 0) end
  1543.         if engine.keyboard.right or engine.keyboard.d then engine.moveTo(self, elements.tilemap, 1, 0) end
  1544.       end
  1545.     }),
  1546.     tilemap = engine.elements.tilemap({
  1547.       tileset = {
  1548.         wall = {bc=colors.gray,tc=colors.lightGray,char=" ",solid=true},
  1549.         floor = {bc=colors.lightGray,tc=colors.gray,char="¥B7"}
  1550.       },
  1551.       generate = function(self)
  1552.         self:loadTilemap(level)
  1553.       end,
  1554.       update = function(self)
  1555.         if engine.mouse.isDown then
  1556.           if engine.mouse.button == "left" then
  1557.             self:setTile(engine.mouse.x, engine.mouse.y, "wall")
  1558.           else
  1559.             self:setTile(engine.mouse.x, engine.mouse.y, "floor")
  1560.           end
  1561.         end
  1562.         if engine.keyboard.k then
  1563.           self:saveTilemap("mapsave")
  1564.         elseif engine.keyboard.l then
  1565.           self:loadTilemap("mapsave")
  1566.         end
  1567.         if engine.keyboard.c then
  1568.           self:setRectangle(1, 1, engine.width, engine.height, "wall")
  1569.           self:setRectangle(2, 2, engine.width-3, engine.height-3, "floor")
  1570.         end
  1571.       end
  1572.     }),
  1573.     timer = {
  1574.       priority = true,
  1575.       time = 0,
  1576.       red = false,
  1577.       draw = function(self)
  1578.         term.setCursorPos(engine.width-10, 1)
  1579.         term.setBackgroundColor(colors.gray)
  1580.         if self.red then
  1581.           term.setTextColor(colors.red)
  1582.         else
  1583.           term.setTextColor(colors.yellow)
  1584.         end
  1585.         term.write("time: "..self.time)
  1586.       end,
  1587.       update = function(self)
  1588.         self.red = not self.red
  1589.         if not gameEnded then
  1590.           self.time = self.time+0.1
  1591.         end
  1592.       end
  1593.     },
  1594.     hint = {
  1595.       draw = function()
  1596.         term.setBackgroundColor(colors.gray)
  1597.         term.setTextColor(colors.white)
  1598.         term.setCursorPos(2, engine.height)
  1599.         term.write("Press k to save, l to load and c to clear")
  1600.         term.setCursorPos(2, 1)
  1601.         term.write("WASD and arrow keys to move")
  1602.       end
  1603.     },
  1604.     endScreen = {
  1605.         update = function()
  1606.           if gameEnded then
  1607.             elements.player = nil
  1608.           end
  1609.         end,
  1610.         draw = function()
  1611.           if gameEnded then
  1612.             paintutils.drawFilledBox(8, 7, engine.width-7, engine.height-5, colors.lightBlue)
  1613.             term.setCursorPos(10, 10)
  1614.             term.setBackgroundColor(colors.lightBlue)
  1615.             term.setTextColor(colors.white)
  1616.             print("You won! Youre time was "..elements.timer.time)
  1617.             term.setCursorPos(8, 12)
  1618.             print("You can share your time on the forum!")
  1619.           end
  1620.         end
  1621.     }
  1622.   }
  1623.  
  1624.   while true do
  1625.     engine.update(elements, 0.06, function() if engine.keyboard.q then engine.quit() end end)
  1626.     engine.draw(elements)
  1627.   end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement