SHOW:
|
|
- or go back to the newest paste.
| 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 | - | "|: | | |__| ", |
| 26 | + | "|: | | |__| ", |
| 27 | - | "|::.|:. | v1.1 by zapwow ", |
| 27 | + | "|::.|:. | v1.2 by MrJohnDowe ", |
| 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) |