Advertisement
Guest User

Untitled

a guest
Aug 15th, 2016
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | None | 0 0
  1. -- Matrix screensaver v0.7
  2. -- (C) 2012 User 'Advert' at http://www.computercraft.info/forums2/
  3. -- X11/mit licence (use/modify at your will, but please, leave credit where due)
  4. -- Spacebar to quit cleanly!
  5. local term = peripheral.wrap("left")
  6. local mobj = {}
  7. do -- Standart variables.
  8. mobj.x = 0
  9. mobj.y = 0 -- Offscreen
  10. mobj.lingerMin = 3 -- Minimum time to linger (frames)
  11. mobj.lingerMax = 10 -- Maximum time to linger
  12. mobj.linger = 10 -- How long this object will linger
  13. mobj.tailLenMin = 3 -- Minimum tail length
  14. mobj.tailLenMax = 10 -- Maximum tail length
  15. mobj.tailLen = 10
  16. mobj.chars = "1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;'\\ASDFGHJKL:\"|zxcvbnm,./ZXCVBNM<>?"
  17. mobj.charsLen = mobj.chars:len()
  18. mobj.currentTail = {"a", "a", "a", "a", "a", "a", "a", "a", "a", "a"}
  19. end
  20.  
  21. function mobj:new(o, ...)
  22. local o = o or {}
  23. setmetatable(o, self)
  24. self.__index = self
  25. o:__init(...)
  26. return o
  27. end
  28.  
  29.  
  30. function mobj:__init(x)
  31. self.linger = math.random(self.lingerMin, self.lingerMax)
  32. self.tailLen = math.random(self.tailLenMin, self.tailLenMax)
  33. self.x = x
  34. self.y = 1
  35. self.nFrame = 1
  36. self.currentTail = {}
  37. end
  38. function mobj:randomLinger()
  39. self.linger = math.random(self.lingerMin, self.lingerMax)
  40. end
  41.  
  42. local function printPos(x, y, sText)
  43. term.setCursorPos(x, y)
  44. term.write(sText)
  45. end
  46. function mobj:randomChar()
  47. local r = math.random(1, self.charsLen)
  48. return string.sub(self.chars, r, r)
  49. end
  50. function mobj:printTail()
  51. for i = 1, self.tailLen do
  52. if not self.currentTail[i] then break end
  53. printPos(self.x, self.y - i, self.currentTail[i])
  54. end
  55. end
  56.  
  57. local termX, termY = term.getSize()
  58.  
  59. function mobj:render()
  60. self:printTail()
  61. self.nFrame = self.nFrame + 1
  62. if self.nFrame == self.linger then
  63. table.insert(self.currentTail, 1, self:randomChar())
  64. printPos(self.x, self.y, self.currentTail[1])
  65. self.y = self.y + 1
  66. self.nFrame = 1
  67. if self.y > termY + self.tailLen then
  68. self:__init(self.x)
  69. end
  70. else
  71. printPos(self.x, self.y, self:randomChar())
  72. end
  73. end
  74.  
  75. local objects = {}
  76. local eventT
  77. function init()
  78. for i = 1, termX do
  79. objects[i] = mobj:new({}, i)
  80. end
  81. eventT = os.startTimer(0)
  82. end
  83.  
  84.  
  85. function render()
  86. term.clear()
  87. for _, k in pairs(objects) do
  88. k:render()
  89. end
  90. end
  91.  
  92.  
  93.  
  94. init()
  95.  
  96. while true do
  97. local e, p1, p2 = os.pullEvent()
  98. if e == "timer" and p1 == eventT then
  99. eventT = os.startTimer(0.05) -- 20 fps
  100. render()
  101. elseif e == "key" and p1 == 57 then
  102. term.clear()
  103. term.setCursorPos(1,1)
  104. break
  105. end
  106. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement