Stravides

scroll1

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