rokkwarr

Marquee System

Oct 15th, 2012 (edited)
17
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.14 KB | None | 0 0
  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. "Marquee v4.1"
  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(5)
  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(1,1)
  60.  
  61. if string.len(str) == 0 then
  62. return
  63. end
  64.  
  65. -- pad the str to fit the screen
  66. local _str = str
  67. local len, height = monitor.getSize()
  68. while string.len(_str) < len do
  69. _str = _str .. _str
  70. end
  71.  
  72. local output = string.sub(_str, pos) .. string.sub(_str, 0, pos-1)
  73. monitor.write(output)
  74. end
  75.  
  76. function update()
  77. if speed == 0 then pos = 1 return end
  78. pos = pos + 1
  79. if pos > string.len(str) then
  80. pos = 1
  81. end
  82. end
  83.  
  84. function marquee()
  85. while running do
  86. draw()
  87. if speed > 0 then
  88. update()
  89. sleep(1/speed)
  90. else
  91. sleep(0.5)
  92. end
  93. end
  94. end
  95.  
  96. function drawGUI()
  97. --always draw the banner
  98. term.clear()
  99. for i,v in ipairs(banner) do
  100. term.setCursorPos(1,i)
  101. term.write(v)
  102. end
  103.  
  104. if locked then
  105. drawLockedGUI()
  106. else
  107. drawUnlockedGUI()
  108. end
  109. end
  110.  
  111. function drawLockedGUI()
  112. local line = #banner + 2
  113. term.setCursorPos(1,line)
  114. if string.len(correct_password) == 0 then
  115. term.write(" Set password: ")
  116. else
  117. term.write(" Password: ")
  118. end
  119. term.write(string.rep('*', string.len(password)))
  120. end
  121.  
  122. function drawUnlockedGUI()
  123. local line = #banner + 2
  124.  
  125. -- lock
  126. term.setCursorPos(1,line)
  127. term.write(" To lock terminal, press F1")
  128.  
  129. -- exit
  130. line = line + 1
  131. term.setCursorPos(1,line)
  132. term.write(" To quit, press F3")
  133.  
  134. -- speed gui
  135. line = line + 2
  136. term.setCursorPos(1,line)
  137. term.write(
  138. " Speed: <" ..
  139. string.rep('-', speed/speedStep) ..
  140. 'X' ..
  141. string.rep('-', (maxSpeed - speed)/speedStep) ..
  142. "> " ..
  143. string.format("%.1f", speed) ..
  144. " steps/sec"
  145. )
  146.  
  147. -- text
  148. line = line + 2
  149. term.setCursorPos(1,line)
  150. term.write(
  151. " Text: " ..
  152. str
  153. )
  154. term.setCursorBlink(true)
  155. end
  156.  
  157. function save()
  158. local file = io.open("marquee-text", "w")
  159. if file then
  160. file:write(str)
  161. file:write("\n")
  162. file:write(speed)
  163. file:write("\n")
  164. file:write(password)
  165. file:close()
  166. end
  167. end
  168.  
  169. function gui()
  170. drawGUI()
  171. while running do
  172. local evt, p1, p2, p3 = os.pullEvent()
  173. if evt == "char" then
  174. if locked then
  175. -- read the password
  176. password = password .. p1
  177. else
  178. str = str .. p1
  179. save()
  180. end
  181. elseif evt == "key" then
  182. if p1 == keys["backspace"] and not locked then
  183. str = string.sub(str, 1, string.len(str)-1)
  184. save()
  185. elseif p1 == keys["leftArrow"] and not locked then
  186. speed = math.max(speed-speedStep, 0)
  187. save()
  188. elseif p1 == keys["rightArrow"] and not locked then
  189. speed = math.min(speed+speedStep, maxSpeed)
  190. save()
  191. elseif p1 == keys["f1"] and not locked then
  192. locked = true
  193. elseif p1 == keys["f3"] and not locked then
  194. term.clear()
  195. term.setCursorPos(1,1)
  196. return true
  197. elseif p1 == keys["enter"] and locked then
  198. if string.len(correct_password) == 0 then
  199. correct_password = password
  200. save()
  201. else
  202. if password == correct_password then
  203. locked = false
  204. end
  205. end
  206. password = ""
  207. end
  208. end
  209. drawGUI()
  210. end
  211. end
  212.  
  213.  
  214. setup()
  215. parallel.waitForAny(marquee, gui)
Advertisement
Add Comment
Please, Sign In to add comment