LDDestroier

DVD Logo screensaver (ComputerCraft)

Feb 8th, 2020
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local mon = peripheral.find("monitor")
  2. if mon then
  3.     mon.setTextScale(0.5)
  4.     term.redirect(mon)
  5. end
  6.  
  7. -- adjusts walls of screen so that it will bounce further/closer to the boundries of the screen
  8. local xMargin, yMargin = 0, 0
  9.  
  10. local redrawDelay = nil
  11. local changeColors = true
  12.  
  13. local scr_x, scr_y = term.getSize()
  14. local max, min = math.max, math.min
  15. local floor, ceil = math.floor, math.ceil
  16.  
  17. if scr_x >= 60 and scr_y >= 25 then
  18.     redrawDelay = redrawDelay or 0.05
  19. else
  20.     redrawDelay = redrawDelay or 0.1
  21. end
  22.  
  23. local getSize = function(image)
  24.     local x, y = 0, #image[1]
  25.     for y = 1, #image[1] do
  26.         x = max(x, #image[1][y])
  27.     end
  28.     return x, y
  29. end
  30.  
  31. local drawImage = function(image, x, y, terminal)
  32.     terminal = terminal or term.current()
  33.     local cx, cy = terminal.getCursorPos()
  34.     for iy = 0, #image[1] + 1 do
  35.         terminal.setCursorPos(x - 1, y + (iy - 1))
  36.         if image[1][iy] then
  37.             terminal.blit(
  38.                 " " .. image[1][iy] .. " ",
  39.                 "f" .. image[2][iy] .. "f",
  40.                 "f" .. image[3][iy] .. "f"
  41.             )
  42.         else
  43.             terminal.clearLine()
  44.         end
  45.     end
  46.     terminal.setCursorPos(cx,cy)
  47. end
  48.  
  49. local colorSwap = function(image, text, back)
  50.     local output = {{},{},{}}
  51.     for y = 1, #image[1] do
  52.         output[1][y] = image[1][y]
  53.         output[2][y] = image[2][y]:gsub(".", text)
  54.         output[3][y] = image[3][y]:gsub(".", back or text)
  55.     end
  56.     return output
  57. end
  58.  
  59. local logo = {
  60.     xvel = (math.random(0, 1) * 2) - 1,
  61.     yvel = (math.random(0, 1) * 2) - 1,
  62.     x = floor(scr_x / 2),
  63.     y = floor(scr_y / 2),
  64.     img = {
  65.         {
  66.             "  —ƒƒƒƒƒƒƒƒƒ”     Ÿƒƒƒƒƒƒƒ€€",
  67.             "  ‚ƒƒƒ€ˆƒƒ€€    ‡€€‡ƒƒƒƒ‹€‚",
  68.             " —€—€€€€€  ”€• Ÿ€Ÿ€€  •€•",
  69.             " €€€‡€—  ‚€€‡€€‡  —€—  Ÿ€",
  70.             "—€€ƒƒ€€‡    ”€€Ÿ   €‚ƒ€Ÿ ",
  71.             "‚ƒƒƒƒƒ      ‚€‡     ƒƒƒƒƒ   ",
  72.             "      ƒƒƒ‚ƒƒƒ        ",
  73.             " ƒ€€€€€€Ÿ€€€€€€€‚ƒ   ",
  74.             "•€€€€€€ˆ‘€€€€€€€€€Œ€€€€€€€•  ",
  75.             " ƒ€€€€€€‚ƒƒƒƒƒ€€€€€€€Ÿƒ   ",
  76.             "      ƒƒƒƒƒƒƒƒ        ",
  77.         }, {
  78.             "00ffffffffff000000fffffffffff",
  79.             "000000f0f00000000f000000000f0",
  80.             "0f00fff0000f000ff000ff0000f00",
  81.             "0f00fff0000000f00000f0000ff00",
  82.             "f00ff0000000f0000000f0fff0000",
  83.             "00000000000000000000000000000",
  84.             "000000fffffffffffffff00000000",
  85.             "0fff0000000000000000000fff000",
  86.             "f000000f0ffffffffff0000000000",
  87.             "000f000000ffffff0000000000000",
  88.             "00000000000000000000000000000",
  89.         }, {
  90.             "ff0000000000ffffff000000000ff",
  91.             "ffffff000ff00ffff000ffffff00f",
  92.             "f00ffff00ff00ff000fff00fff00f",
  93.             "f00fff00ffff00000fff00fff000f",
  94.             "0000000fffff000fffff000000fff",
  95.             "fffffffffffff0fffffffffffffff",
  96.             "ffffff000000000000000ffffffff",
  97.             "f000000000ffffff0000000000fff",
  98.             "00000000ffffffffff00000000fff",
  99.             "fff00000000000000000000ffffff",
  100.             "fffffffffffffffffffffffffffff",
  101.         }
  102.     }
  103. }
  104.  
  105. local imgXsize, imgYsize = getSize(logo.img)
  106. local xWall, yWall
  107.  
  108. local render = function(colorReplace)
  109.     if colorReplace then
  110.         drawImage(
  111.             colorSwap(logo.img, {["0"] = colorReplace}, {["0"] = colorReplace}),
  112.             floor(logo.x),
  113.             floor(logo.y)
  114.         )
  115.     else
  116.         drawImage(
  117.             logo.img,
  118.             floor(logo.x),
  119.             floor(logo.y)
  120.         )
  121.     end
  122. end
  123.  
  124. local color = math.random(1, 15)
  125.  
  126. local tick = function()
  127.     scr_x, scr_y = term.getSize()
  128.     xWall = scr_x - imgXsize + 1 - xMargin
  129.     yWall = scr_y - imgYsize + 1 - yMargin
  130.     logo.x = min(max(logo.x + logo.xvel, 1 + xMargin), xWall)
  131.     logo.y = min(max(logo.y + logo.yvel, 1 + yMargin), yWall)
  132.  
  133.     if floor(logo.x) == (1 + xMargin) or floor(logo.x) == xWall then
  134.         logo.xvel = -logo.xvel
  135.         color = math.random(1, 15)
  136.     end
  137.     if floor(logo.y) == (1 + yMargin) or floor(logo.y) == yWall then
  138.         logo.yvel = -logo.yvel
  139.         color = math.random(1, 15)
  140.     end
  141.     if changeColors then
  142.         render(string.sub("0123456789abcdef", color, color))
  143.     else
  144.         render()
  145.     end
  146. end
  147.  
  148. term.setBackgroundColor(colors.black)
  149. term.clear()
  150.  
  151. local evt
  152. local tID = os.startTimer(redrawDelay)
  153. while true do
  154.     evt = {os.pullEventRaw()}
  155.     if evt[1] == "timer" and evt[2] == tID then
  156.         tick()
  157.         tID = os.startTimer(redrawDelay)
  158.     elseif evt[1] == "terminate" then
  159.         render("8")
  160.         sleep(0.05)
  161.         render("7")
  162.         sleep(0.05)
  163.         term.clear()
  164.         break
  165.     end
  166. end
  167.  
  168. return 0
Add Comment
Please, Sign In to add comment