Advertisement
dadragon84

Marquee

Feb 26th, 2014
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local monitor
  2. local sides = {"left", "right", "top", "bottom", "back", "front"}
  3. local str = "Hello, world! "
  4. local pos = 1
  5. local speedStep = 0.5
  6. local speed = 2
  7. local maxSpeed = 10
  8. local running = false
  9. local keys = {
  10.     backspace=14,
  11.     enter=28,
  12.     f1=59,
  13.     f3=61,
  14.     leftArrow=203,
  15.     rightArrow=205,
  16. }
  17. local locked = false
  18. local password = ""
  19. local correct_password = ""
  20.  
  21. local banner = {
  22. " ___ ___                                          ",
  23. "|   Y   |.---.-..----..-----..--.--..-----..-----.",
  24. "|.      ||  _  ||   _||  _  ||  |  ||  -__||  -__|",
  25. "|. \\_/  ||___._||__|  |__   ||_____||_____||_____|",
  26. "|:  |   |                |__|                      ",
  27. "|::.|:. |   v1.1                 by Severino       ",
  28. "'--- ---'   "
  29. }
  30.  
  31. function setup()
  32.     -- prevent user from terminating
  33.     os.pullEvent = os.pullEventRaw
  34.  
  35.     -- attempt to load the string from disk
  36.     local file = io.open("marquee-text", "r")
  37.     if file then
  38.         str = file:read("*l") or str
  39.         speed = tonumber(file:read("*l")) or speed
  40.         correct_password = file:read("*l") or correct_password
  41.         if string.len(correct_password) > 0 then
  42.             -- the password was set at some point, lock automatically
  43.             locked = true
  44.         end
  45.         file:close()
  46.     end
  47.  
  48.     for i,side in ipairs(sides) do
  49.         if peripheral.getType(side) == "monitor" then
  50.             monitor = peripheral.wrap(side)
  51.             monitor.setTextScale(5)
  52.             running = true
  53.             return
  54.         end
  55.     end
  56.     print("No monitor attached")
  57.     error()
  58. end
  59.  
  60. function draw()
  61.     -- draw the string offset by pos
  62.     -- increment pos
  63.     -- when pos > str len, pos = 1
  64.     monitor.clear()
  65.     monitor.setCursorPos(1,1)
  66.  
  67.     if string.len(str) == 0 then
  68.         return
  69.     end
  70.  
  71.     -- pad the str to fit the screen
  72.     local _str = str
  73.     local len, height = monitor.getSize()
  74.     while string.len(_str) < len do
  75.         _str = _str .. _str
  76.     end
  77.  
  78.     local output = string.sub(_str, pos) .. string.sub(_str, 0, pos-1)
  79.     monitor.write(output)
  80. end
  81.  
  82. function update()
  83.     pos = pos + 1
  84.     if pos > string.len(str) then
  85.         pos = 1
  86.     end
  87. end
  88.  
  89. function marquee()
  90.     while running do
  91.         draw()
  92.         if speed > 0 then
  93.             update()
  94.             sleep(1/speed)
  95.         else
  96.             sleep(0.5)
  97.         end
  98.     end
  99. end
  100.  
  101. function drawGUI()
  102.     --always draw the banner
  103.     term.clear()
  104.     for i,v in ipairs(banner) do
  105.         term.setCursorPos(1,i)
  106.         term.write(v)
  107.     end
  108.  
  109.     if locked then
  110.         drawLockedGUI()
  111.     else
  112.         drawUnlockedGUI()
  113.     end
  114. end
  115.  
  116. function drawLockedGUI()
  117.     local line = #banner + 2
  118.     term.setCursorPos(1,line)
  119.     if string.len(correct_password) == 0 then
  120.         term.write("  Set password: ")
  121.     else
  122.         term.write("  Password: ")
  123.     end
  124.     term.write(string.rep('*', string.len(password)))
  125. end
  126.  
  127. function drawUnlockedGUI()
  128.     local line = #banner + 2
  129.  
  130.     -- lock
  131.     term.setCursorPos(1,line)
  132.     term.write("  To lock terminal, press F1")
  133.  
  134.     -- exit
  135.     line = line + 1
  136.     term.setCursorPos(1,line)
  137.     term.write("  To quit, press F3")
  138.  
  139.     -- speed gui
  140.     line = line + 2
  141.     term.setCursorPos(1,line)
  142.     term.write(
  143.         "  Speed: <" ..
  144.         string.rep('-', speed/speedStep) ..
  145.         'X' ..
  146.         string.rep('-', (maxSpeed - speed)/speedStep) ..
  147.         "> " ..
  148.         string.format("%.1f", speed) ..
  149.         " steps/sec"
  150.     )
  151.  
  152.     -- text
  153.     line = line + 2
  154.     term.setCursorPos(1,line)
  155.     term.write(
  156.         "  Text: " ..
  157.         str
  158.     )
  159.     term.setCursorBlink(true)
  160. end
  161.  
  162. function save()
  163.     local file = io.open("marquee-text", "w")
  164.     if file then
  165.         file:write(str)
  166.         file:write("\n")
  167.         file:write(speed)
  168.         file:write("\n")
  169.         file:write(password)
  170.         file:close()
  171.     end
  172. end
  173.  
  174. function gui()
  175.     drawGUI()
  176.     while running do
  177.         local evt, p1, p2, p3 = os.pullEvent()
  178.         if evt == "char" then
  179.             if locked then
  180.                 -- read the password
  181.                 password = password .. p1
  182.             else
  183.                 str = str .. p1
  184.                 save()
  185.             end
  186.         elseif evt == "key" then
  187.             if p1 == keys["backspace"] and not locked then
  188.                 str = string.sub(str, 1, string.len(str)-1)
  189.                 save()
  190.             elseif p1 == keys["leftArrow"] and not locked then
  191.                 speed = math.max(speed-speedStep, 0)
  192.                 save()
  193.             elseif p1 == keys["rightArrow"] and not locked then
  194.                 speed = math.min(speed+speedStep, maxSpeed)
  195.                 save()
  196.             elseif p1 == keys["f1"] and not locked then
  197.                 locked = true
  198.             elseif p1 == keys["f3"] and not locked then
  199.                 term.clear()
  200.                 term.setCursorPos(1,1)
  201.                 return true
  202.             elseif p1 == keys["enter"] and locked then
  203.                 if string.len(correct_password) == 0 then
  204.                     correct_password = password
  205.                     save()
  206.                 else
  207.                     if password == correct_password then
  208.                         locked = false
  209.                     end
  210.                 end
  211.                 password = ""
  212.             end
  213.         end
  214.         drawGUI()
  215.     end
  216. end
  217.  
  218.  
  219. setup()
  220. parallel.waitForAny(marquee, gui)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement