Stravides

marquee

Jul 19th, 2013
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.33 KB | None | 0 0
  1. local monitor
  2. local sides = {"left", "right", "top", "bottom", "back", "front"}
  3. local str = "Strav & Howls Store       "
  4. local pos = 3
  5. local speedStep = 0.3
  6. local speed = 7
  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 = "milk"
  19. local correct_password = "milk"
  20.  
  21. local banner = {
  22. " Welcome to The Banner ",
  23. "'--- ---'   "
  24. }
  25.  
  26. function setup()
  27.     -- prevent user from terminating
  28.     os.pullEvent = os.pullEventRaw
  29.  
  30.     -- attempt to load the string from disk
  31.     local file = io.open("marquee-text", "r")
  32.     if file then
  33.         str = file:read("*l") or str
  34.         speed = tonumber(file:read("*l")) or speed
  35.         correct_password = file:read("*l") or correct_password
  36.         if string.len(correct_password) > 0 then
  37.             -- the password was set at some point, lock automatically
  38.             locked = true
  39.         end
  40.         file:close()
  41.     end
  42.  
  43.     for i,side in ipairs(sides) do
  44.         if peripheral.getType(side) == "monitor" then
  45.             monitor = peripheral.wrap(side)
  46.             monitor.setTextScale(5)
  47.             running = true
  48.             return
  49.         end
  50.     end
  51.     print("No monitor attached")
  52.     error()
  53. end
  54.  
  55. function draw()
  56.     -- draw the string offset by pos
  57.     -- increment pos
  58.     -- when pos > str len, pos = 1
  59.     monitor.clear()
  60.     monitor.setCursorPos(5,2)
  61.     monitor.write("Strav")    
  62.     monitor.setCursorPos(7,3)
  63.     monitor.write("&")
  64.     monitor.setCursorPos(5,4)
  65.     monitor.write("Howls")
  66.     monitor.setCursorPos(1,7)
  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