Advertisement
guitarplayer616

CrossyRoadTexturePacks

Jul 18th, 2015
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 16.74 KB | None | 0 0
  1. --//Game created by the one and only CaptainSpaceCat of space!
  2.  
  3. local debug = false
  4. local oLog = fs.open("console", "w")
  5. local function log(string)
  6.         if debug then
  7.                 local string = string or ""
  8.                 oLog.writeLine(string)
  9.                 oLog.flush()
  10.         end
  11. end
  12. local tArgs = {...}
  13.  
  14. local type, prevtype = 1, 1
  15. local sChanged = true
  16. local tickToggle = true
  17. local distance = 0
  18. local theme = "default"
  19. local w, h = term.getSize()
  20. local roadString = " " .. string.rep("- ", w/2)
  21. local waterString = " " .. string.rep(" ~", w/2)
  22. local midW, midH = math.floor(w/2), math.floor(h/2)
  23. local timers = {
  24.         ["gametick"] = os.startTimer(.05),
  25.         ["screenscroll"] = os.startTimer(2)
  26. }
  27.  
  28. local pos = {
  29.         ["x"] = midW,
  30.         ["y"] = 5
  31. }
  32.  
  33. local themes = {
  34.         ["default"] = {grass = colors.lime, tree = {colors.green, colors.brown}, road = colors.gray, dashes = colors.yellow, car = {2^0, 2^2, 2^3, 2^4, 2^6, 2^8, 2^9, 2^10, 2^14, 2^15}, water = colors.blue, waves = colors.lightBlue, log = colors.brown, player = {colors.orange, colors.black}},
  35.         ["hell"] = {grass = colors.red, tree = {_, colors.gray}, road = colors.gray, dashes = colors.magenta, car = {colors.black}, water = colors.orange, waves = colors.yellow, log = colors.lightGray, player = {colors.white, colors.black}},
  36.         ["snow"] = {grass = colors.white, tree = {_, colors.green}, road = colors.gray, dashes = colors.yellow, car = {colors.red, colors.green}, water = colors.lightBlue, waves = colors.white, log = colors.brown, player = {colors.green, colors.red}},
  37.         ["fallout"] = {grass = colors.brown, tree = {_, colors.black}, road = colors.gray, dashes = colors.lightGray, car = {colors.black, colors.magenta, colors.pink}, water = colors.lime, log = colors.green, waves = colors.green, player = {colors.red, colors.black}},
  38.         ["space"] = {grass = colors.black, tree = {_, colors.white}, road = colors.black, dashes = colors.yellow, car = {colors.brown, colors.white, colors.gray, colors.lightGray}, water = colors.purple, waves = colors.magenta, log = colors.black, player = {colors.black, colors.yellow}},
  39.         ["sky"] = {grass = colors.white, tree = {colors.lightGray, colors.gray}, road = colors.yellow, dashes = colors.yellow, car = {colors.orange}, water = colors.lightBlue, log = colors.white, waves = colors.lightBlue, player = {colors.white, colors.yellow}},
  40.         ["candy"] = {grass = colors.magenta, tree = {colors.pink, colors.red}, road = colors.red, dashes = colors.magenta, car = {colors.orange, colors.purple, colors.blue}, water = colors.pink, waves = colors.magenta, log = colors.yellow, player = {colors.yellow, colors.pink}},
  41.         ["cave"] = {grass = colors.lightGray, tree = {colors.gray, colors.black}, road = colors.gray, dashes = colors.lightGray, car = {colors.green, colors.lime, colors.white, colors.black}, water = colors.orange, waves = colors.yellow, log = colors.red, player = {colors.blue, colors.lime}},
  42.     ["end"] = {grass = colors.yellow, tree = {colors.black, colors.purple}, road = colors.gray, dashes = colors.purple, car = {colors.purple,colors.lime,colors.magenta,colors.green,colors.yellow,colors.orange}, water = colors.black, waves = colors.white, log = colors.purple, player = {colors.black, colors.purple}},
  43. }
  44.  
  45. if themes[tArgs[1]] then
  46.         theme = tArgs[1]
  47. end
  48.  
  49. local player = {
  50.         ["isAlive"] = true,
  51.         ["onWater"] = false,
  52.         ["onCar"] = false,
  53.         ["onLog"] = false
  54. }
  55.  
  56. local map = {"grass", "grass", "grass", "grass", "grass"}
  57. local mapDirs = {false, false, false, false, false}
  58. local mapItems = {}   --# = tree      colornum = car or log
  59. for i = 1, 5 do
  60.         mapItems[#mapItems + 1] = {}
  61.         for n = 1, w do
  62.                 local choice = math.random(1, 4)
  63.                 if choice == 1 then
  64.                         mapItems[#mapItems][n] = "#"
  65.                 end
  66.         end
  67. end
  68.  
  69. local function resetTimers()
  70.         timers = {
  71.                 ["gametick"] = os.startTimer(.05),
  72.                 ["screenscroll"] = os.startTimer(2)
  73.         }
  74. end
  75.  
  76. local function draw(string, xPos, yPos, txtcol, bakcol)
  77.         local string = string or ""
  78.         local txtcol = txtcol or colors.white
  79.         local bakcol = bakcol or colors.black
  80.         term.setCursorPos(xPos, yPos)
  81.         term.setBackgroundColor(bakcol)
  82.         term.setTextColor(txtcol)
  83.         term.write(string)
  84. end
  85.  
  86. local function generateNewChunk()
  87.         repeat
  88.                 type = math.random(1, 3)
  89.         until type ~= prevtype
  90.         local length = math.random(1, 5)
  91.         prevtype = type
  92.         if type == 1 then type = "grass" end
  93.         if type == 2 then type = "road" end
  94.         if type == 3 then type = "water" end
  95.         local currentLen = #map
  96.         for i = 1, length do
  97.                 map[#map+1] = type
  98.                 mapItems[#mapItems + 1] = {}
  99.                 mapDirs[#mapDirs + 1] = false
  100.                 if type == "grass" then
  101.                         for n = 1, w do
  102.                                 local choice = math.random(1, 4)
  103.                                 if choice == 1 then
  104.                                         mapItems[#mapItems][n] = "#"
  105.                                 else
  106.                                         mapItems[#mapItems][n] = false
  107.                                 end
  108.                         end
  109.                 elseif type == "road" then
  110.                         local choice = math.random(0, 1)
  111.                         if choice == 0 then choice = "left" else choice = "right" end
  112.                         mapDirs[#mapDirs] = choice
  113.                         mapItems[#mapItems] = {}
  114.                         for n = 1, w do
  115.                                 local choice = math.random(1, 4)
  116.                                 if choice == 1 then
  117.                                         mapItems[#mapItems][n] = themes[theme].car[math.random(1, #themes[theme].car)]
  118.                                 else
  119.                                         mapItems[#mapItems][n] = false
  120.                                 end
  121.                         end
  122.                 elseif type == "water" then
  123.                         local choice = math.random(0, 1)
  124.                         if choice == 0 then choice = "left" else choice = "right" end
  125.                         mapDirs[#mapDirs] = choice
  126.                         mapItems[#mapItems] = {}
  127.                         for n = 1, w do
  128.                                 local choice = math.random(1, 4)
  129.                                 if choice == 1 then
  130.                                         mapItems[#mapItems][n] = 128
  131.                                 else
  132.                                         mapItems[#mapItems][n] = false
  133.                                 end
  134.                         end
  135.                 end
  136.                 log(type)
  137.         end
  138.         return length
  139. end
  140.  
  141. local function initialMapGen()
  142.         local genNum = 5
  143.         while genNum < h + 3 do
  144.                 genNum = genNum + generateNewChunk()
  145.         end
  146. end
  147.  
  148. local function moveScreenUp()
  149.         sChanged = true
  150.         table.remove(map, 1)
  151.         table.remove(mapItems, 1)
  152.         table.remove(mapDirs, 1)
  153.         pos.y = pos.y - 1
  154. end
  155.  
  156. local function checkCollision(dir)
  157.         if dir == 1 then xOff, yOff = 0, 1 end
  158.         if dir == 2 then xOff, yOff = 1, 0 end
  159.         if dir == 3 then xOff, yOff = 0, -1 end
  160.         if dir == 4 then xOff, yOff = -1, 0 end
  161.         if mapItems[pos.y + yOff][pos.x + xOff] and mapItems[pos.y + yOff][pos.x + xOff] == "#" then
  162.                 return false
  163.         end
  164.         return true
  165. end
  166.  
  167. local function eventHandler(events)
  168.         sChanged = true
  169.         if events[2] == keys.up and checkCollision(1) then
  170.                 if pos.y == 5 then
  171.                         moveScreenUp()
  172.                         timers.screenscroll = os.startTimer(2)
  173.                 end
  174.                 pos.y = pos.y + 1
  175.                 distance = distance + 1
  176.         elseif events[2] == keys.down and (pos.y == 1 or checkCollision(3)) then
  177.                 pos.y = pos.y - 1
  178.                 distance = distance - 1
  179.         elseif events[2] == keys.left and pos.x > 1 and checkCollision(4) then
  180.                 pos.x = pos.x - 1
  181.         elseif events[2] == keys.right and pos.x < w and checkCollision(2) then
  182.                 pos.x = pos.x + 1
  183.         end
  184. end
  185.  
  186. local function updateGame()
  187.         --== player stuff ==--
  188.         if map[pos.y] == "water" then
  189.                 if mapItems[pos.y][pos.x] then
  190.                         player.onWater = false
  191.                         player.onLog = true
  192.                 else
  193.                         player.onWater = true
  194.                         player.onLog = false
  195.                 end
  196.         else
  197.                 player.onWater = false
  198.                 player.onLog = false
  199.         end
  200.         if player.onLog and tickToggle and player.isAlive then
  201.                 if mapDirs[pos.y] == "right" and pos.x < w then pos.x = pos.x + 1 end
  202.                 if mapDirs[pos.y] == "left" and pos.x > 1 then pos.x = pos.x - 1 end
  203.         end
  204.         if map[pos.y] == "road" and mapItems[pos.y][pos.x] then
  205.                 player.onCar = true
  206.         else
  207.                 player.onCar = false
  208.         end
  209.         if pos.y == 0 or player.onCar or player.onWater then
  210.                 player.isAlive = false
  211.         end
  212.         if not map[22] then
  213.                 generateNewChunk()
  214.         end
  215.         --== cars and logs ==--
  216.         if tickToggle then
  217.                 for i = 1, h do
  218.                         local choice
  219.                         if map[i] == "road" then
  220.                                 choice = math.random(1, 10)
  221.                         elseif map[i] == "water" then
  222.                                 choice = math.random(1, 2)
  223.                         end
  224.                         if map[i] == "road" or map[i] == "water" then
  225.                                 if mapDirs[i] == "left" then
  226.                                         for n = 1, w - 1 do
  227.                                                 mapItems[i][n] = mapItems[i][n + 1]
  228.                                         end
  229.                                         if choice == 1 then
  230.                                                 mapItems[i][w] = themes[theme].car[math.random(1, #themes[theme].car)]
  231.                                         else
  232.                                                 mapItems[i][w] = false
  233.                                         end
  234.                                 elseif mapDirs[i] == "right" then
  235.                                         for n = w, 2, -1 do
  236.                                                 mapItems[i][n] = mapItems[i][n - 1]
  237.                                         end
  238.                                         if choice == 1 then
  239.                                                 mapItems[i][1] = themes[theme].car[math.random(1, #themes[theme].car)]
  240.                                         else
  241.                                                 mapItems[i][1] = false
  242.                                         end
  243.                                 end
  244.                         end
  245.                 end
  246.                 tickToggle = false
  247.         else
  248.                 tickToggle = true
  249.         end
  250.         --== stuff done differently once dead ==--
  251.         if not player.isAlive and not tickToggle and map[pos.y] == "water" then
  252.                 if mapDirs[pos.y] == "right" and pos.x < w + 1 then pos.x = pos.x + 1 end
  253.                 if mapDirs[pos.y] == "left" and pos.x > 0 then pos.x = pos.x - 1 end
  254.         end
  255. end
  256.  
  257. local function drawPlayer()
  258.         term.setCursorPos(pos.x, h - pos.y + 1)
  259.         if player.isAlive then
  260.                 term.setBackgroundColor(themes[theme].player[1])
  261.                 term.setTextColor(themes[theme].player[2])
  262.                 term.write("O")
  263.         else
  264.                 term.setBackgroundColor(themes[theme][map[pos.y]])
  265.                 term.setTextColor(themes[theme].player[1])
  266.                 term.write("X")
  267.         end
  268. end
  269.  
  270. local function drawInfo()
  271.         draw("Score", w-4, 1, themes[theme].player[2], themes[theme].player[1])
  272.         draw("     ", w-4, 2, themes[theme].player[2], themes[theme].player[1])
  273.         draw(tostring(distance), w-4, 2, themes[theme].player[2], themes[theme].player[1])
  274. end
  275.  
  276. local function drawDeath()
  277.         term.setBackgroundColor(colors.red)
  278.         term.setCursorPos(1, midH)
  279.         term.clearLine()
  280.         term.setCursorPos(1, midH + 1)
  281.         term.clearLine()
  282.         draw("You Died", (w/2) - 3, midH, colors.white, colors.red)
  283.         draw("Score: " .. tostring(distance), (w/2) - (7 + #tostring(distance))/2 + 1, midH + 1, colors.white, colors.red)
  284. end
  285.  
  286. local function updateScreen()
  287.         local start
  288.         for i = 1, h do
  289.                 term.setBackgroundColor(themes[theme][map[i]])
  290.                 term.setCursorPos(1, h - i + 1)
  291.                 if map[i] == "road" then
  292.                         term.setTextColor(themes[theme].dashes)
  293.                         term.write(roadString)
  294.                 elseif map[i] == "water" then
  295.                         term.setTextColor(themes[theme].waves)
  296.                         term.write(waterString)
  297.                 else
  298.                         term.clearLine()
  299.                 end
  300.                 if i == pos.y and not player.isAlive and map[pos.y] == "road" then
  301.                         drawPlayer()
  302.                         start = true
  303.                 end
  304.                 if map[i] == "grass" then
  305.                         term.setBackgroundColor(themes[theme].tree[1] or themes[theme].grass)
  306.                         term.setTextColor(themes[theme].tree[2])
  307.                         for k, v in pairs(mapItems[i]) do
  308.                                 if mapItems[i][k] == "#" then
  309.                                         term.setCursorPos(k, h - i + 1)
  310.                                         term.write("#")
  311.                                 end
  312.                         end
  313.                 elseif map[i] == "road" then
  314.                         for k, e in pairs(mapItems[i]) do
  315.                                 if tonumber(mapItems[i][k]) then
  316.                                         term.setCursorPos(k, h - i + 1)
  317.                                         term.setBackgroundColor(mapItems[i][k])
  318.                                         term.write(" ")
  319.                                 end
  320.                         end
  321.                 elseif map[i] == "water" then
  322.                         for k, e in pairs(mapItems[i]) do
  323.                                 if tonumber(mapItems[i][k]) then
  324.                                         term.setCursorPos(k, h - i + 1)
  325.                                         term.setBackgroundColor(themes[theme].log)
  326.                                         term.write(" ")
  327.                                 end
  328.                         end
  329.                 end
  330.                 if i == pos.y and not start then
  331.                         drawPlayer()
  332.                 end
  333.         end
  334.         if player.isAlive then
  335.                 drawInfo()
  336.         else
  337.                 drawDeath()
  338.         end
  339. end
  340.        
  341. initialMapGen()
  342. while player.isAlive do
  343.         local events = {os.pullEvent()}
  344.         if events[1] == "timer" then
  345.                 if events[2] == timers.gametick then
  346.                         sChanged = true
  347.                         updateGame()
  348.                         if sChanged then
  349.                                 updateScreen()
  350.                                 sChanged = false
  351.                         end
  352.                         timers.gametick = os.startTimer(.05)
  353.                 elseif events[2] == timers.screenscroll then
  354.                         moveScreenUp()
  355.                         timers.screenscroll = os.startTimer(2)
  356.                 end
  357.         elseif events[1] == "key" then
  358.                 eventHandler(events)
  359.         end
  360. end
  361.  
  362. term.setBackgroundColor(colors.red)
  363. term.clear()
  364. sleep(.2)
  365. resetTimers()
  366. timers.deathTimer = os.startTimer(1)
  367. local exitable = false
  368.  
  369. while true do
  370.         local events = {os.pullEvent()}
  371.         if events[1] == "timer" then
  372.                 if events[2] == timers.gametick then
  373.                         sChanged = true
  374.                         updateGame()
  375.                         if sChanged then
  376.                                 updateScreen()
  377.                                 sChanged = false
  378.                         end
  379.                         timers.gametick = os.startTimer(.05)
  380.                 end
  381.                 if events[2] == timers.deathTimer then
  382.                         exitable = true
  383.                 end
  384.         elseif events[1] == "key" and exitable then
  385.                 term.setBackgroundColor(colors.black)
  386.                 term.clear()
  387.                 term.setCursorPos(1, 1)
  388.                 break
  389.         end
  390. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement