SHOW:
|
|
- or go back to the newest paste.
| 1 | - | local scr_x, scr_y = term.getSize() |
| 1 | + | --[[ |
| 2 | Sinelock v1.3 | |
| 3 | - | local doit = function(move) |
| 3 | + | The *COOLEST* computer/door lock ever! |
| 4 | - | if not move then move = 0 end |
| 4 | + | Now with slightly less seizure! |
| 5 | - | local res1,res2 |
| 5 | + | |
| 6 | - | for a = 1, scr_y do |
| 6 | + | pastebin get XDgeSDTq sinelock |
| 7 | - | for b = 1, scr_x do |
| 7 | + | std pb XDgeSDTq sinelock |
| 8 | - | local x = b+math.floor(scr_x/2) |
| 8 | + | std ld sinelock sinelock |
| 9 | - | local y = a-math.ceil(scr_y/2) |
| 9 | + | |
| 10 | - | res1 = math.abs( math.floor(math.sin((x/7)+move)*6) - y ) <= 2 |
| 10 | + | Now with salting! |
| 11 | - | term.setCursorPos(b,a) |
| 11 | + | --]] |
| 12 | - | if res1 then |
| 12 | + | local scr_x, scr_y = term.getSize() --Gets screen size. Don't modify this |
| 13 | - | term.blit(" ","7","7")
|
| 13 | + | |
| 14 | - | else |
| 14 | + | --Config variables start! |
| 15 | - | term.write(" ")
|
| 15 | + | local terminateMode = 2 --0 enables termination, 1 blocks it, 2 provides a taunting screen. |
| 16 | - | end |
| 16 | + | local passFile = ".sl_password" --The ABSOLUTE path of the password file. |
| 17 | - | res2 = math.abs( math.floor(math.cos((x/4)+(move*4))*3) - y+2 ) <= 1 |
| 17 | + | local saltFile = ".sl_salt" --The ABSOLUTE path of the salt file. |
| 18 | - | term.setCursorPos(b,a) |
| 18 | + | local characterLimit = 1024 --The cap of characters at the read() prompt. Set this to prevent crashes. |
| 19 | - | if res2 then |
| 19 | + | local runProgram = "" --Set to something to run it when correct, and not using doors. |
| 20 | - | term.blit(" ","8","8")
|
| 20 | + | local dahChar = "*" --The character used to hide characters when typed. |
| 21 | - | else |
| 21 | + | local doKeyCards = true --Whether or not the lock also accepts keycards (floppy disks) as well as passwords. |
| 22 | - | if not res1 then |
| 22 | + | local doEjectDisk = false --Whether or not to eject a keycard after it's accepted, just to speed things up a bit. |
| 23 | - | if (x % 2 == 0) and ((y+math.floor(move*-10)+(x % 5)) % 5 <= 1) then |
| 23 | + | local doorSides = {} --If it has anything, the lock will open the doors instead of unlocking the PC.
|
| 24 | - | term.blit("|","7","f")
|
| 24 | + | local doInvertSignal = false --If true, it will invert the redstone signal of the door, in case you need to. |
| 25 | - | else |
| 25 | + | local doShowDoorSides = true --If true, will show the door sides being opened. Set to false if you are paranoid. |
| 26 | - | term.write(" ")
|
| 26 | + | local beWavey = true --Whether or not to animate the sine wave. |
| 27 | - | end |
| 27 | + | local readYpos = scr_y-2 --The Y position of the read() prompt |
| 28 | - | end |
| 28 | + | local requireAllPasswords = false --Whether or not the lock asks for ONE of the multiple passwords, or ALL of them in order. |
| 29 | - | end |
| 29 | + | local badlength = 4 --The length in seconds that you have to wait to try again. |
| 30 | - | end |
| 30 | + | local goodlength = 6 --The length in seconds that doors will stay open. |
| 31 | - | end |
| 31 | + | local sineFrameDelay = 0.15 --The amount of time between sine animation frames. Tradeoff of purty vs performance. |
| 32 | local palate = {
| |
| 33 | frontsine = colors.lightGray, | |
| 34 | - | while true do |
| 34 | + | backsine = colors.gray, |
| 35 | - | for a = 1, 900 do |
| 35 | + | background = colors.black, |
| 36 | - | --term.clear() |
| 36 | + | rainColor = colors.gray, |
| 37 | - | doit(a/10) |
| 37 | + | rainChar = "|", |
| 38 | - | sleep(0.05) |
| 38 | + | promptBG = colors.gray, |
| 39 | - | end |
| 39 | + | promptTXT = colors.white, |
| 40 | wrongBG = colors.black, | |
| 41 | wrongTXT = colors.gray, | |
| 42 | } | |
| 43 | local language = "english" | |
| 44 | local lang = {
| |
| 45 | english = {
| |
| 46 | wrong1 = "YOU ARE WRONG.", | |
| 47 | wrong2 = "YOU ARE WRONG. AS ALWAYS.", | |
| 48 | right1 = "Correct!", | |
| 49 | right2 = "Correct, finally!", | |
| 50 | }, | |
| 51 | spanish = {
| |
| 52 | wrong1 = "ESTA USTED EQUIVOCADO.", | |
| 53 | wrong2 = "ESTA USTED EQUIVOCADO. TODAVIA OTRA VEZ.", | |
| 54 | right1 = "Correcto!", | |
| 55 | right2 = "Asi es, por fin!", | |
| 56 | noTerminate = "No termine!", | |
| 57 | }, | |
| 58 | german = {
| |
| 59 | wrong1 = "SIE LIEGEN FALSCH.", | |
| 60 | wrong2 = "SIE LIEGEN FALSCH. WIE IMMER.", | |
| 61 | right1 = "Richtig!", | |
| 62 | right2 = "Richtig, endlich!", | |
| 63 | noTerminate = "Nicht zu beenden!", | |
| 64 | }, | |
| 65 | dutch = {
| |
| 66 | wrong1 = "U BENT ONJUIST.", | |
| 67 | wrong2 = "JE BENT ONJUIST, ALS ALTIJD.", | |
| 68 | right1 = "Dat is juist!", | |
| 69 | right2 = "Dat is juist, eindelijk!", | |
| 70 | noTerminate = "Niet te beeindigen!", | |
| 71 | }, | |
| 72 | latin = { --As a joke
| |
| 73 | wrong1 = "ERRAS", | |
| 74 | wrong2 = "TU DEFICIENTES!", | |
| 75 | right1 = "Quod suus 'verum!", | |
| 76 | right2 = "Quod suus 'verum, demum!", | |
| 77 | noTerminate = "Vade futuo te ipsum!", | |
| 78 | }, | |
| 79 | italian = {
| |
| 80 | wrong1 = "HAI SBAGLIATO.", | |
| 81 | wrong2 = "HAI SBAGLIATO, COME SEMPRE D'ALTRONDE.", | |
| 82 | right1 = "CORRETTO!", | |
| 83 | right2 = "CORRETTO, FINALMENTE!", | |
| 84 | noTerminate = "Non cercare di terminarmi", | |
| 85 | }, | |
| 86 | } | |
| 87 | ||
| 88 | -- Config variables end. Don't touch anything else, m'kay? | |
| 89 | if not _VERSION then | |
| 90 | return printError("Sorry, only CC 1.7 and later supported.")
| |
| 91 | end | |
| 92 | local csv, salt, doSine | |
| 93 | local floor, ceil, random, abs = math.floor, math.ceil, math.random, math.abs | |
| 94 | local sin, cos = math.sin, math.cos | |
| 95 | local rhite = term.write | |
| 96 | local setTextColor, setBackgroundColor, getTextColor, getBackgroundColor = term.setTextColor, term.setBackgroundColor, term.getTextColor, term.getBackgroundColor | |
| 97 | local setCursorPos, setCursorBlink, getCursorPos, getSize = term.setCursorPos, term.setCursorBlink, term.getCursorPos, term.getSize | |
| 98 | local sineLevel = 1 | |
| 99 | local isTerminable = false | |
| 100 | local kaykaycoolcool = true | |
| 101 | if term.current().setVisible then | |
| 102 | csv = true | |
| 103 | else | |
| 104 | csv = false | |
| 105 | end | |
| 106 | ||
| 107 | local writeError = function(...) | |
| 108 | local tx,bg = getTextColor(),getBackgroundColor() | |
| 109 | if term.isColor() then | |
| 110 | setTextColor(colors.red) | |
| 111 | else | |
| 112 | setTextColor(colors.white) | |
| 113 | end | |
| 114 | rhite(table.concat(arg," ")) | |
| 115 | setTextColor(tx) | |
| 116 | setBackgroundColor(bg) | |
| 117 | end | |
| 118 | ||
| 119 | local goodPullEvent | |
| 120 | if terminateMode == 1 then | |
| 121 | if os.pullEvent ~= os.pullEventRaw then | |
| 122 | goodPullEvent = os.pullEvent | |
| 123 | end | |
| 124 | os.pullEvent = os.pullEventRaw | |
| 125 | end | |
| 126 | ||
| 127 | local keepLooping = true | |
| 128 | ||
| 129 | ---- SHA256 START ---- | |
| 130 | --SHA256 implementation done by GravityScore. | |
| 131 | ||
| 132 | local MOD = 2^32 | |
| 133 | local MODM = MOD-1 | |
| 134 | ||
| 135 | local function memoize(f) | |
| 136 | local mt = {}
| |
| 137 | local t = setmetatable({}, mt)
| |
| 138 | function mt:__index(k) | |
| 139 | local v = f(k) | |
| 140 | t[k] = v | |
| 141 | return v | |
| 142 | end | |
| 143 | return t | |
| 144 | end | |
| 145 | ||
| 146 | local function make_bitop_uncached(t, m) | |
| 147 | local function bitop(a, b) | |
| 148 | local res,p = 0,1 | |
| 149 | while a ~= 0 and b ~= 0 do | |
| 150 | local am, bm = a % m, b % m | |
| 151 | res = res + t[am][bm] * p | |
| 152 | a = (a - am) / m | |
| 153 | b = (b - bm) / m | |
| 154 | p = p*m | |
| 155 | end | |
| 156 | res = res + (a + b) * p | |
| 157 | return res | |
| 158 | end | |
| 159 | return bitop | |
| 160 | end | |
| 161 | ||
| 162 | local function make_bitop(t) | |
| 163 | local op1 = make_bitop_uncached(t,2^1) | |
| 164 | local op2 = memoize(function(a) return memoize(function(b) return op1(a, b) end) end) | |
| 165 | return make_bitop_uncached(op2, 2 ^ (t.n or 1)) | |
| 166 | end | |
| 167 | ||
| 168 | local bxor1 = make_bitop({[0] = {[0] = 0,[1] = 1}, [1] = {[0] = 1, [1] = 0}, n = 4})
| |
| 169 | ||
| 170 | local function bxor(a, b, c, ...) | |
| 171 | local z = nil | |
| 172 | if b then | |
| 173 | a = a % MOD | |
| 174 | b = b % MOD | |
| 175 | z = bxor1(a, b) | |
| 176 | if c then z = bxor(z, c, ...) end | |
| 177 | return z | |
| 178 | elseif a then return a % MOD | |
| 179 | else return 0 end | |
| 180 | end | |
| 181 | ||
| 182 | local function band(a, b, c, ...) | |
| 183 | local z | |
| 184 | if b then | |
| 185 | a = a % MOD | |
| 186 | b = b % MOD | |
| 187 | z = ((a + b) - bxor1(a,b)) / 2 | |
| 188 | if c then z = bit32_band(z, c, ...) end | |
| 189 | return z | |
| 190 | elseif a then return a % MOD | |
| 191 | else return MODM end | |
| 192 | end | |
| 193 | ||
| 194 | local function bnot(x) return (-1 - x) % MOD end | |
| 195 | ||
| 196 | local function rshift1(a, disp) | |
| 197 | if disp < 0 then return lshift(a,-disp) end | |
| 198 | return floor(a % 2 ^ 32 / 2 ^ disp) | |
| 199 | end | |
| 200 | ||
| 201 | local function rshift(x, disp) | |
| 202 | if disp > 31 or disp < -31 then return 0 end | |
| 203 | return rshift1(x % MOD, disp) | |
| 204 | end | |
| 205 | ||
| 206 | local function lshift(a, disp) | |
| 207 | if disp < 0 then return rshift(a,-disp) end | |
| 208 | return (a * 2 ^ disp) % 2 ^ 32 | |
| 209 | end | |
| 210 | ||
| 211 | local function rrotate(x, disp) | |
| 212 | x = x % MOD | |
| 213 | disp = disp % 32 | |
| 214 | local low = band(x, 2 ^ disp - 1) | |
| 215 | return rshift(x, disp) + lshift(low, 32 - disp) | |
| 216 | end | |
| 217 | ||
| 218 | local k = {
| |
| 219 | 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, | |
| 220 | 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, | |
| 221 | 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, | |
| 222 | 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, | |
| 223 | 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, | |
| 224 | 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, | |
| 225 | 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, | |
| 226 | 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, | |
| 227 | 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, | |
| 228 | 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, | |
| 229 | 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, | |
| 230 | 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, | |
| 231 | 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, | |
| 232 | 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, | |
| 233 | 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, | |
| 234 | 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, | |
| 235 | } | |
| 236 | ||
| 237 | local function str2hexa(s) | |
| 238 | return (string.gsub(s, ".", function(c) return string.format("%02x", string.byte(c)) end))
| |
| 239 | end | |
| 240 | ||
| 241 | local function num2s(l, n) | |
| 242 | local s = "" | |
| 243 | for i = 1, n do | |
| 244 | local rem = l % 256 | |
| 245 | s = string.char(rem) .. s | |
| 246 | l = (l - rem) / 256 | |
| 247 | end | |
| 248 | return s | |
| 249 | end | |
| 250 | ||
| 251 | local function s232num(s, i) | |
| 252 | local n = 0 | |
| 253 | for i = i, i + 3 do n = n*256 + string.byte(s, i) end | |
| 254 | return n | |
| 255 | end | |
| 256 | ||
| 257 | local function preproc(msg, len) | |
| 258 | local extra = 64 - ((len + 9) % 64) | |
| 259 | len = num2s(8 * len, 8) | |
| 260 | msg = msg .. "\128" .. string.rep("\0", extra) .. len
| |
| 261 | assert(#msg % 64 == 0) | |
| 262 | return msg | |
| 263 | end | |
| 264 | ||
| 265 | local function initH256(H) | |
| 266 | H[1] = 0x6a09e667 | |
| 267 | H[2] = 0xbb67ae85 | |
| 268 | H[3] = 0x3c6ef372 | |
| 269 | H[4] = 0xa54ff53a | |
| 270 | H[5] = 0x510e527f | |
| 271 | H[6] = 0x9b05688c | |
| 272 | H[7] = 0x1f83d9ab | |
| 273 | H[8] = 0x5be0cd19 | |
| 274 | return H | |
| 275 | end | |
| 276 | ||
| 277 | local function digestblock(msg, i, H) | |
| 278 | local w = {}
| |
| 279 | for j = 1, 16 do w[j] = s232num(msg, i + (j - 1)*4) end | |
| 280 | for j = 17, 64 do | |
| 281 | local v = w[j - 15] | |
| 282 | local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3)) | |
| 283 | v = w[j - 2] | |
| 284 | w[j] = w[j - 16] + s0 + w[j - 7] + bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10)) | |
| 285 | end | |
| 286 | ||
| 287 | local a, b, c, d, e, f, g, h = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] | |
| 288 | for i = 1, 64 do | |
| 289 | local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22)) | |
| 290 | local maj = bxor(band(a, b), band(a, c), band(b, c)) | |
| 291 | local t2 = s0 + maj | |
| 292 | local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25)) | |
| 293 | local ch = bxor (band(e, f), band(bnot(e), g)) | |
| 294 | local t1 = h + s1 + ch + k[i] + w[i] | |
| 295 | h, g, f, e, d, c, b, a = g, f, e, d + t1, c, b, a, t1 + t2 | |
| 296 | end | |
| 297 | ||
| 298 | H[1] = band(H[1] + a) | |
| 299 | H[2] = band(H[2] + b) | |
| 300 | H[3] = band(H[3] + c) | |
| 301 | H[4] = band(H[4] + d) | |
| 302 | H[5] = band(H[5] + e) | |
| 303 | H[6] = band(H[6] + f) | |
| 304 | H[7] = band(H[7] + g) | |
| 305 | H[8] = band(H[8] + h) | |
| 306 | end | |
| 307 | ||
| 308 | local function sha256(...) | |
| 309 | local msg = table.concat(arg,",") | |
| 310 | msg = preproc(msg, #msg) | |
| 311 | local H = initH256({})
| |
| 312 | for i = 1, #msg, 64 do digestblock(msg, i, H) end | |
| 313 | return str2hexa(num2s(H[1], 4) .. num2s(H[2], 4) .. num2s(H[3], 4) .. num2s(H[4], 4) .. | |
| 314 | num2s(H[5], 4) .. num2s(H[6], 4) .. num2s(H[7], 4) .. num2s(H[8], 4)) | |
| 315 | end | |
| 316 | ||
| 317 | ---- SHA256 END ---- | |
| 318 | ||
| 319 | local terminates = 0 | |
| 320 | local sillyTerminate = function() | |
| 321 | local goodpull = _G.os.pullEvent | |
| 322 | os.pullEvent = os.pullEventRaw | |
| 323 | terminates = terminates + 1 | |
| 324 | local script = {
| |
| 325 | "You shall not pass!", | |
| 326 | "THOU shalt not pass!", | |
| 327 | "Stop trying to pass!", | |
| 328 | "...maybe I'm not clear.", | |
| 329 | "YOU. SHALL NOT. PASS!!", | |
| 330 | "Pass thou shalt not!", | |
| 331 | "Hey, piss off, will ya?", | |
| 332 | "I haven't got all day.", | |
| 333 | "...no, shut up. I don't.", | |
| 334 | "I won't tell you it!", | |
| 335 | "No password for you.", | |
| 336 | "It's been hashed!", | |
| 337 | "Hashed...with a salt!", | |
| 338 | "I'll never tell you the salt.", | |
| 339 | "You know why?", | |
| 340 | "Because that requires passing!", | |
| 341 | "WHICH THOU SHALT NOT DO!", | |
| 342 | "(oh btw don't pass k?)", | |
| 343 | "You! Don't pass!", | |
| 344 | "That means YOU!", | |
| 345 | "Cut it out!", | |
| 346 | "Re: Cut it out!", | |
| 347 | "Perhaps if you keep it up...", | |
| 348 | "..hmm...", | |
| 349 | "..oh I give up.", | |
| 350 | "<bullshitterm>", | |
| 351 | "What? Is this what you wanted?", | |
| 352 | "Huh? No? I-it's not?", | |
| 353 | "Well then...!", | |
| 354 | "<toobad>", | |
| 355 | "YEAH I SAID IT", | |
| 356 | "You think you're a terminating machine!", | |
| 357 | "You think you're above consequence!", | |
| 358 | "...w-...", | |
| 359 | "eat my shorts", | |
| 360 | "Your attempts are futile anyhow.", | |
| 361 | "Here I am getting drunk off your sweat,", | |
| 362 | "...while you push CTRL and T.", | |
| 363 | "Or maybe you're pressing that [T] button.", | |
| 364 | "Like, um, in CCEmuRedux.", | |
| 365 | "But it matters not!", | |
| 366 | "For you see, my defences are great!", | |
| 367 | "Nothing can bust my rock-hard abs!", | |
| 368 | "<fuckinghell>", | |
| 369 | "Oh bualls.", | |
| 370 | "That was embarrasing.", | |
| 371 | "...?", | |
| 372 | "What're YOU lookin' at??", | |
| 373 | "You callin' me UNSTABLE!?", | |
| 374 | "HUH!??", | |
| 375 | "...", | |
| 376 | "...w-well at least I admit it", | |
| 377 | "...b-bakka", | |
| 378 | ".......", | |
| 379 | "Hey, have you ever played EarthBound?", | |
| 380 | "(Yes. I'm gonna rant.)", | |
| 381 | "It's an RPG on the Super Nintendo.", | |
| 382 | "Like, instead of fighting fantasy demons,", | |
| 383 | "you fight stop signs and cars and shit", | |
| 384 | "And, like, you hit rabid dogs with a bat", | |
| 385 | "And you have magical PSI spells", | |
| 386 | "...speaking of PSI, I happen to use it a lot.", | |
| 387 | "...er, *I* as in the coder of this lock...", | |
| 388 | "And by PSI, I mean the mod.", | |
| 389 | "You don't see too many psychic locks these days.", | |
| 390 | "A shame, really.", | |
| 391 | "I bet a PSI lock could act as a heater with PSI Fire.", | |
| 392 | "Or maybe it can kill rats with PSI Ground or Thunder", | |
| 393 | "Maybe, you can get a psychic KEY lock, so, like,", | |
| 394 | "you could put it on that Psychonauts head door thing.", | |
| 395 | "...WHAT!? just a suggestion.", | |
| 396 | "Psychonauts is another game I reccommend.", | |
| 397 | "It has some really clever dialogue.", | |
| 398 | "I'm sure you'd like it quite a lot.", | |
| 399 | "I know, because you've been here for ten fucking minutes.", | |
| 400 | "And you're not ONE STEP closer to getting the password", | |
| 401 | "Which I've been guarding very, very closely.", | |
| 402 | "Yes. Extremely closely.", | |
| 403 | "Excrutiatingly, some would say.", | |
| 404 | "You know, I should probably get to shouting.", | |
| 405 | "*ahem*", | |
| 406 | "...", | |
| 407 | "*aahhhechhemmemmhmm*", | |
| 408 | "*aachkskacehchachkhackcoughfartfuckdammitaaucahkh*", | |
| 409 | "...", | |
| 410 | "STAHP IT", | |
| 411 | "STAHP TEHRMINATIN", | |
| 412 | "do it for the CHILDREN", | |
| 413 | "okay fuck the children, who needs 'em", | |
| 414 | "then", | |
| 415 | "um", | |
| 416 | "THINK OF THE...THE...", | |
| 417 | "the babies...?", | |
| 418 | "um", | |
| 419 | "<abuseofcommunity>", | |
| 420 | "That's a fucking horrible idea.", | |
| 421 | "I'd rather eat my own brain then think about that.", | |
| 422 | "I'd sooner kiss a pig!", | |
| 423 | "I'd sooner swallow an avocado pit!", | |
| 424 | "...", | |
| 425 | "You know, you suck so much.", | |
| 426 | "You suck so much, and I'm sick of writing this script", | |
| 427 | "If my knuckles bleed, you're paying my insurance", | |
| 428 | "In order to save time, money, and my joints,", | |
| 429 | "I believe it would be in order to...", | |
| 430 | "...to say,", | |
| 431 | "NO TERMINATING.", | |
| 432 | } | |
| 433 | setCursorBlink(false) | |
| 434 | local mess | |
| 435 | if terminates > #script then | |
| 436 | mess = script[#script] | |
| 437 | else | |
| 438 | mess = script[terminates] | |
| 439 | end | |
| 440 | if mess == "<bullshitterm>" then | |
| 441 | setBackgroundColor(colors.black) | |
| 442 | if term.isColor() then | |
| 443 | setTextColor(colors.yellow) | |
| 444 | else | |
| 445 | setTextColor(colors.white) | |
| 446 | end | |
| 447 | term.clear() | |
| 448 | setCursorPos(1,1) | |
| 449 | print(os.version()) | |
| 450 | write("> ")
| |
| 451 | setTextColor(colors.white) | |
| 452 | read() | |
| 453 | printError("shell:350: Unable to pass")
| |
| 454 | sleep(2) | |
| 455 | elseif mess == "<toobad>" then | |
| 456 | setBackgroundColor(colors.black) | |
| 457 | if term.isColor() then | |
| 458 | setTextColor(colors.red) | |
| 459 | else | |
| 460 | setTextColor(colors.white) | |
| 461 | end | |
| 462 | term.clear() | |
| 463 | setCursorPos(1,scr_y/2) | |
| 464 | local toobad = " T"..("O"):rep(scr_x-8).." BAD!"
| |
| 465 | for a = 1, #toobad do | |
| 466 | for y = 1, scr_y do | |
| 467 | setCursorPos(a,y) | |
| 468 | rhite(toobad:sub(a,a)) | |
| 469 | end | |
| 470 | sleep(0) | |
| 471 | end | |
| 472 | sleep(1.5) | |
| 473 | for a = 1, 16 do | |
| 474 | if a%3 == 0 then | |
| 475 | setBackgroundColor(colors.white) | |
| 476 | elseif a%3 == 1 then | |
| 477 | setBackgroundColor(colors.black) | |
| 478 | else | |
| 479 | if term.isColor() then | |
| 480 | setBackgroundColor(colors.red) | |
| 481 | else | |
| 482 | setBackgroundColor(colors.gray) | |
| 483 | end | |
| 484 | end | |
| 485 | term.clear() | |
| 486 | sleep(0) | |
| 487 | end | |
| 488 | elseif mess == "<fuckinghell>" then | |
| 489 | writeError("Terminated")
| |
| 490 | setBackgroundColor(colors.black) | |
| 491 | setTextColor(colors.white) | |
| 492 | term.blit(">","4","f")
| |
| 493 | read() | |
| 494 | sleep(0.75) | |
| 495 | for a = 1, 2 do | |
| 496 | sleep(0.05) | |
| 497 | term.scroll(1) | |
| 498 | end | |
| 499 | for a = 1, scr_y do | |
| 500 | sleep(0.05) | |
| 501 | term.scroll(-1) | |
| 502 | end | |
| 503 | sleep(0.25) | |
| 504 | setBackgroundColor(colors.gray) | |
| 505 | term.clear() | |
| 506 | sleep(0.1) | |
| 507 | setBackgroundColor(colors.lightGray) | |
| 508 | term.clear() | |
| 509 | sleep(0.1) | |
| 510 | setBackgroundColor(colors.white) | |
| 511 | term.clear() | |
| 512 | sleep(0.25) | |
| 513 | local msg = "taht didn't happan" | |
| 514 | term.setCursorPos(scr_x-#msg,scr_y) | |
| 515 | setTextColor(colors.black) | |
| 516 | rhite(msg) | |
| 517 | sleep(1) | |
| 518 | elseif mess == "<abuseofcommunity>" then | |
| 519 | setBackgroundColor(colors.white) | |
| 520 | setTextColor(colors.black) | |
| 521 | term.clear() | |
| 522 | setCursorPos(2,3) | |
| 523 | print("Since you're such a smart bastard, why don't you come up with something objectionable to think about?\n")
| |
| 524 | setBackgroundColor(colors.gray) | |
| 525 | setTextColor(colors.white) | |
| 526 | term.clearLine() | |
| 527 | local yourFuckingShittyAssResponceThatSucksSoMuchBallsThatIWouldRatherListenToThatFuckingOwlFromOcarinaOfTimeBlatherAboutHisFuckingDayThanSitWithYouForAnotherGoddamnedSecondReeeeee = read() | |
| 528 | setBackgroundColor(colors.white) | |
| 529 | setTextColor(colors.black) | |
| 530 | for a = 1, 5 do | |
| 531 | sleep(0.6) | |
| 532 | write(".")
| |
| 533 | end | |
| 534 | sleep(1) | |
| 535 | term.setTextColor(colors.red) | |
| 536 | for a = 1, 20 do | |
| 537 | sleep(0.05) | |
| 538 | write(".")
| |
| 539 | end | |
| 540 | sleep(0.5) | |
| 541 | else | |
| 542 | setBackgroundColor(colors.gray) | |
| 543 | setTextColor(colors.white) | |
| 544 | setCursorPos(math.max(1,(scr_x/2)-(#mess/2)),scr_y/2) | |
| 545 | if language == "english" then | |
| 546 | write(mess) | |
| 547 | else | |
| 548 | write(lang[language].noTerminate) | |
| 549 | end | |
| 550 | sleep(1.5) | |
| 551 | end | |
| 552 | os.pullEvent = goodpull | |
| 553 | return terminates | |
| 554 | end | |
| 555 | ||
| 556 | local shuffle = function(txt) | |
| 557 | local output = "" | |
| 558 | for a = 1, #txt do | |
| 559 | if a % 2 == 0 then | |
| 560 | output = output..txt:sub(a,a) | |
| 561 | else | |
| 562 | output = txt:sub(a,a)..output | |
| 563 | end | |
| 564 | end | |
| 565 | return output | |
| 566 | end | |
| 567 | ||
| 568 | local goodpass = function(pswd,count) | |
| 569 | isTerminable = true | |
| 570 | doSine = false | |
| 571 | setCursorBlink(false) | |
| 572 | local flashes = {
| |
| 573 | colors.white, | |
| 574 | colors.lightGray, | |
| 575 | colors.gray, | |
| 576 | } | |
| 577 | if type(pswd) == "table" then | |
| 578 | pswd = pswd[1] | |
| 579 | end | |
| 580 | setTextColor(colors.black) | |
| 581 | local correctmsg | |
| 582 | if count < 10 then | |
| 583 | correctmsg = lang[language].right1 | |
| 584 | else | |
| 585 | correctmsg = lang[language].right2 | |
| 586 | end | |
| 587 | for a = 1, #flashes do | |
| 588 | setBackgroundColor(flashes[#flashes-(a-1)]) | |
| 589 | term.clear() | |
| 590 | setCursorPos((scr_x/2)-(#correctmsg/2),scr_y/2) | |
| 591 | rhite(correctmsg) | |
| 592 | sleep(0) | |
| 593 | end | |
| 594 | if #doorSides == 0 then | |
| 595 | sleep(0.4) | |
| 596 | keepLooping = false | |
| 597 | else | |
| 598 | local doormsg | |
| 599 | if doShowDoorSides then | |
| 600 | doormsg = "Applying RS to "..table.concat(doorSides,", ").."." | |
| 601 | else | |
| 602 | doormsg = "Applying redstone." | |
| 603 | end | |
| 604 | setCursorPos((scr_x/2)-(#doormsg/2),(scr_y/2)+2) | |
| 605 | rhite(doormsg) | |
| 606 | for a = 1, #doorSides do | |
| 607 | redstone.setOutput(doorSides[a],not doInvertSignal) | |
| 608 | end | |
| 609 | if terminateMode == 1 then | |
| 610 | os.pullEvent = goodPullEvent | |
| 611 | end | |
| 612 | sleep(goodlength) | |
| 613 | if terminateMode == 1 then | |
| 614 | os.pullEvent = os.pullEventRaw | |
| 615 | end | |
| 616 | for a = 1, #doorSides do | |
| 617 | redstone.setOutput(doorSides[a],doInvertSignal) | |
| 618 | end | |
| 619 | end | |
| 620 | for a = 1, #flashes do | |
| 621 | setBackgroundColor(flashes[a]) | |
| 622 | term.clear() | |
| 623 | setCursorPos((scr_x/2)-(#correctmsg/2),scr_y/2) | |
| 624 | rhite(correctmsg) | |
| 625 | sleep(0) | |
| 626 | end | |
| 627 | setBackgroundColor(colors.black) | |
| 628 | term.clear() | |
| 629 | setCursorPos(1,1) | |
| 630 | if terminateMode == 1 and goodPullEvent and (#doorSides == 0) then | |
| 631 | os.pullEvent = goodPullEvent | |
| 632 | end | |
| 633 | setCursorBlink(true) | |
| 634 | isTerminable = false | |
| 635 | return true | |
| 636 | end | |
| 637 | ||
| 638 | local badpass = function(pswd,count) | |
| 639 | doSine = false | |
| 640 | local getevent = os.pullEvent | |
| 641 | os.pullEvent = os.pullEventRaw | |
| 642 | setCursorBlink(false) | |
| 643 | setBackgroundColor(palate.wrongBG) | |
| 644 | setTextColor(palate.wrongTXT) | |
| 645 | term.clear() | |
| 646 | if type(pswd) == "table" then | |
| 647 | pswd = pswd[1] | |
| 648 | end | |
| 649 | local badmsg | |
| 650 | if count < 10 then | |
| 651 | if pswd == sha256("bepis",salt) then
| |
| 652 | badmsg = "Bepis." | |
| 653 | else | |
| 654 | badmsg = lang[language].wrong1 | |
| 655 | end | |
| 656 | else | |
| 657 | if pswd == sha256("bepis",salt) then
| |
| 658 | badmsg = "BEPIS!" | |
| 659 | else | |
| 660 | badmsg = lang[language].wrong2 | |
| 661 | end | |
| 662 | end | |
| 663 | setCursorPos((scr_x/2)-(#badmsg/2),scr_y/2) | |
| 664 | rhite(badmsg) | |
| 665 | sleep(badlength) | |
| 666 | doSine = true | |
| 667 | setCursorBlink(true) | |
| 668 | os.pullEvent = getevent | |
| 669 | return "man you suck" | |
| 670 | end | |
| 671 | ||
| 672 | local readPassFile = function() | |
| 673 | local _output, _salt | |
| 674 | if fs.exists(passFile) then | |
| 675 | local file = fs.open(passFile,"r") | |
| 676 | _output = file.readLine() | |
| 677 | file.close() | |
| 678 | end | |
| 679 | if fs.exists(saltFile) then | |
| 680 | local file = fs.open(saltFile,"r") | |
| 681 | _salt = file.readLine() | |
| 682 | file.close() | |
| 683 | end | |
| 684 | return _output, _salt | |
| 685 | end | |
| 686 | ||
| 687 | local addNewPassword = function(pword,_path) | |
| 688 | local file = fs.open(_path or passFile,"a") | |
| 689 | file.write( sha256(pword,salt) ) | |
| 690 | file.close() | |
| 691 | end | |
| 692 | ||
| 693 | local rendersine = function(move) | |
| 694 | move = move or 0 | |
| 695 | local res1,res2,x,y | |
| 696 | if csv then term.current().setVisible(false) end | |
| 697 | setBackgroundColor(colors.black) | |
| 698 | setCursorBlink(false) | |
| 699 | for a = 1, scr_y do | |
| 700 | if a ~= readYpos then | |
| 701 | for b = 1, scr_x do | |
| 702 | x = b+floor(scr_x/2) | |
| 703 | y = a-floor(scr_y/2) | |
| 704 | res1 = abs( floor(sin((x/(scr_x/7.3))+move)*scr_y/4) - y ) <= 2 | |
| 705 | setCursorPos(b,a) | |
| 706 | if res1 then | |
| 707 | setBackgroundColor(palate.backsine) | |
| 708 | else | |
| 709 | setBackgroundColor(palate.background) | |
| 710 | end | |
| 711 | rhite(" ")
| |
| 712 | res2 = abs( floor(cos((x/(scr_x/12.75))+(move*4))*scr_y/7) - y+2 ) <= 1 | |
| 713 | setCursorPos(b,a) | |
| 714 | if res2 then | |
| 715 | setBackgroundColor(palate.frontsine) | |
| 716 | rhite(" ")
| |
| 717 | elseif not res1 then | |
| 718 | setBackgroundColor(palate.background) | |
| 719 | setTextColor(palate.rainColor) | |
| 720 | if (x % 2 == 0) and ((y+floor(move*-10)+(x % 5)) % 5 <= 1) then | |
| 721 | rhite(palate.rainChar) | |
| 722 | else | |
| 723 | rhite(" ")
| |
| 724 | end | |
| 725 | end | |
| 726 | end | |
| 727 | end | |
| 728 | end | |
| 729 | if csv then term.current().setVisible(true) end | |
| 730 | setCursorBlink(true) | |
| 731 | end | |
| 732 | ||
| 733 | local sine = function() | |
| 734 | doSine = true | |
| 735 | while true do | |
| 736 | if sineLevel > 900 then | |
| 737 | sineLevel = 1 | |
| 738 | end | |
| 739 | if doSine then | |
| 740 | local cX,cY = getCursorPos() | |
| 741 | local bg,txt = getBackgroundColor(),getTextColor() | |
| 742 | rendersine(sineLevel/10) | |
| 743 | setCursorPos(cX,cY) | |
| 744 | setBackgroundColor(bg) | |
| 745 | setTextColor(txt) | |
| 746 | end | |
| 747 | sleep(sineFrameDelay) | |
| 748 | if kaykaycoolcool then | |
| 749 | sineLevel = sineLevel + 1 | |
| 750 | end | |
| 751 | end | |
| 752 | end | |
| 753 | ||
| 754 | local funcread = function(repchar,rHistory,doFunc,noNewLine,writeFunc,cursorAdjFunc,doFuncEvent,charLimit) | |
| 755 | local scr_x,scr_y = term.getSize() | |
| 756 | local sx,sy = term.getCursorPos() | |
| 757 | local cursor = 1 | |
| 758 | local rCursor = #rHistory+1 | |
| 759 | local output = "" | |
| 760 | term.setCursorBlink(true) | |
| 761 | local rite = writeFunc or term.write | |
| 762 | cursorAdjFunc = cursorAdjFunc or function() return 0 end | |
| 763 | while true do | |
| 764 | local evt,key = os.pullEvent() | |
| 765 | if evt == doFuncEvent then | |
| 766 | pleaseDoFunc = true | |
| 767 | elseif evt == "key" then | |
| 768 | if key == keys.enter then | |
| 769 | if not noNewLine then | |
| 770 | write("\n")
| |
| 771 | end | |
| 772 | term.setCursorBlink(false) | |
| 773 | return output | |
| 774 | elseif key == keys.left then | |
| 775 | if cursor-1 >= 1 then | |
| 776 | cursor = cursor - 1 | |
| 777 | end | |
| 778 | elseif key == keys.right then | |
| 779 | if cursor <= #output then | |
| 780 | cursor = cursor + 1 | |
| 781 | end | |
| 782 | elseif key == keys.up then | |
| 783 | if rCursor > 1 then | |
| 784 | rCursor = rCursor - 1 | |
| 785 | term.setCursorPos(sx,sy) | |
| 786 | rite((" "):rep(#output))
| |
| 787 | output = (rHistory[rCursor] or ""):sub(1,charLimit or -1) | |
| 788 | cursor = #output+1 | |
| 789 | pleaseDoFunc = true | |
| 790 | end | |
| 791 | elseif key == keys.down then | |
| 792 | term.setCursorPos(sx,sy) | |
| 793 | rite((" "):rep(#output))
| |
| 794 | if rCursor < #rHistory then | |
| 795 | rCursor = rCursor + 1 | |
| 796 | output = (rHistory[rCursor] or ""):sub(1,charLimit or -1) | |
| 797 | cursor = #output+1 | |
| 798 | pleaseDoFunc = true | |
| 799 | else | |
| 800 | rCursor = #rHistory+1 | |
| 801 | output = "" | |
| 802 | cursor = 1 | |
| 803 | end | |
| 804 | elseif key == keys.backspace then | |
| 805 | if cursor > 1 and #output > 0 then | |
| 806 | output = (output:sub(1,cursor-2)..output:sub(cursor)):sub(1,charLimit or -1) | |
| 807 | cursor = cursor - 1 | |
| 808 | pleaseDoFunc = true | |
| 809 | end | |
| 810 | elseif key == keys.delete then | |
| 811 | if #output:sub(cursor,cursor) == 1 then | |
| 812 | output = (output:sub(1,cursor-1)..output:sub(cursor+1)):sub(1,charLimit or -1) | |
| 813 | pleaseDoFunc = true | |
| 814 | end | |
| 815 | end | |
| 816 | elseif evt == "char" or evt == "paste" then | |
| 817 | output = (output:sub(1,cursor-1)..key..output:sub(cursor+(#key-1))):sub(1,charLimit or -1) | |
| 818 | cursor = math.min(#output+1,cursor+#key) | |
| 819 | pleaseDoFunc = true | |
| 820 | end | |
| 821 | local pOut = (output or ""):sub(math.max( 1,(#output+sx)-scr_x) ) | |
| 822 | if pleaseDoFunc then | |
| 823 | pleaseDoFunc = false | |
| 824 | if type(doFunc) == "function" then | |
| 825 | doFunc(output:sub(1,charLimit or -1)) | |
| 826 | end | |
| 827 | term.setCursorPos(sx,sy) | |
| 828 | if repchar then | |
| 829 | rite(repchar:sub(1,1):rep(#pOut)) | |
| 830 | else | |
| 831 | rite(pOut) | |
| 832 | end | |
| 833 | term.write(" ")
| |
| 834 | end | |
| 835 | term.setCursorPos(sx+cursorAdjFunc(pOut)+cursor-math.max( 1,(#output+sx)-scr_x),sy) | |
| 836 | end | |
| 837 | end | |
| 838 | ||
| 839 | local arse, arseSHA, passes | |
| 840 | ||
| 841 | local awaitKeyCard = function() | |
| 842 | local bwop,_,side | |
| 843 | repeat | |
| 844 | _,side = os.pullEvent("disk")
| |
| 845 | if side then | |
| 846 | bwop = fs.combine(disk.getMountPath(side),".sinepw") --bwop! | |
| 847 | else | |
| 848 | bwop = "" | |
| 849 | end | |
| 850 | until fs.exists(bwop) and not fs.isDir(bwop) | |
| 851 | local file = fs.open(bwop,"r") | |
| 852 | local output = file.readLine() | |
| 853 | file.close() | |
| 854 | arseSHA = output | |
| 855 | if doEjectDisk then disk.eject(side) end | |
| 856 | end | |
| 857 | ||
| 858 | local passwordPrompt = function() | |
| 859 | if requireAllPasswords then | |
| 860 | arse = {}
| |
| 861 | arseSHA = "" | |
| 862 | for a = 1, ceil(#passes/64) do | |
| 863 | setCursorPos(1,readYpos) | |
| 864 | setBackgroundColor(palate.promptBG) | |
| 865 | term.clearLine() | |
| 866 | setTextColor(palate.promptTXT) | |
| 867 | write("P"..a..">")
| |
| 868 | arse[#arse+1] = read(dahChar) | |
| 869 | arseSHA = arseSHA..sha256(arse[#arse],salt) | |
| 870 | end | |
| 871 | else | |
| 872 | setCursorPos(1,readYpos) | |
| 873 | setBackgroundColor(palate.promptBG) | |
| 874 | term.clearLine() | |
| 875 | setTextColor(palate.promptTXT) | |
| 876 | write(">")
| |
| 877 | arse = funcread(dahChar,{},nil,true,nil,nil,nil,characterLimit)
| |
| 878 | arseSHA = sha256(arse,salt) | |
| 879 | end | |
| 880 | end | |
| 881 | ||
| 882 | local count = 0 | |
| 883 | ||
| 884 | local lock = function() | |
| 885 | if #doorSides > 0 then | |
| 886 | for a = 1, #doorSides do | |
| 887 | redstone.setOutput(doorSides[a],doInvertSignal) | |
| 888 | end | |
| 889 | end | |
| 890 | while true do | |
| 891 | passes, salt = readPassFile() | |
| 892 | count = count + 1 | |
| 893 | if doKeyCards then | |
| 894 | parallel.waitForAny(passwordPrompt,awaitKeyCard) | |
| 895 | else | |
| 896 | passwordPrompt() | |
| 897 | end | |
| 898 | local good | |
| 899 | if requireAllPasswords then | |
| 900 | if passes == arseSHA then | |
| 901 | good = true | |
| 902 | else | |
| 903 | good = false | |
| 904 | end | |
| 905 | else | |
| 906 | if string.find(passes,arseSHA) then | |
| 907 | good = true | |
| 908 | else | |
| 909 | good = false | |
| 910 | end | |
| 911 | end | |
| 912 | if good then | |
| 913 | goodpass(arseSHA,count) | |
| 914 | if #doorSides == 0 then | |
| 915 | return true | |
| 916 | else | |
| 917 | doSine = true | |
| 918 | end | |
| 919 | else | |
| 920 | badpass(arseSHA,count) | |
| 921 | end | |
| 922 | end | |
| 923 | end | |
| 924 | ||
| 925 | local choice = function(input) | |
| 926 | repeat | |
| 927 | event, key = os.pullEvent("key")
| |
| 928 | if type(key) == "number" then key = keys.getName(key) end | |
| 929 | if key == nil then key = " " end | |
| 930 | until string.find(input, key) | |
| 931 | return key | |
| 932 | end | |
| 933 | ||
| 934 | if not fs.exists(saltFile) then | |
| 935 | local file = fs.open(saltFile,"w") | |
| 936 | for a = 1, 128 do | |
| 937 | local c = string.char(random(1,255)) | |
| 938 | file.write(c) | |
| 939 | end | |
| 940 | file.close() | |
| 941 | local f = fs.open(saltFile,"r") | |
| 942 | salt = f.readLine() | |
| 943 | f.close() | |
| 944 | end | |
| 945 | ||
| 946 | passes, salt = readPassFile() | |
| 947 | ||
| 948 | local tArg = {...}
| |
| 949 | if tArg[1] == "addpass" then | |
| 950 | if tArg[2] then | |
| 951 | print("Really add password? [Y,N]")
| |
| 952 | local answer = choice("yn")
| |
| 953 | if answer == "n" then | |
| 954 | sleep(0) | |
| 955 | return print("Oh, okay.")
| |
| 956 | else | |
| 957 | table.remove(tArg,1) | |
| 958 | addNewPassword(table.concat(tArg," ")) | |
| 959 | sleep(0) | |
| 960 | return print("Added password.")
| |
| 961 | end | |
| 962 | else | |
| 963 | sleep(0) | |
| 964 | return print("Expected a new password...")
| |
| 965 | end | |
| 966 | elseif tArg[1] == "keymake" then | |
| 967 | if tArg[2] then | |
| 968 | print("Really add to disk?")
| |
| 969 | print("Keep in mind the password has to be manually added for the keycard to work.\n[Y,N]")
| |
| 970 | local answer = choice("yn")
| |
| 971 | if answer == "n" then | |
| 972 | sleep(0) | |
| 973 | return print("Oh, okay.")
| |
| 974 | else | |
| 975 | print("Please insert a disk or pocket computer.")
| |
| 976 | local _,side = os.pullEvent("disk")
| |
| 977 | local diskPassPath = fs.combine(disk.getMountPath(side),".sinepw") | |
| 978 | table.remove(tArg,1) | |
| 979 | addNewPassword(table.concat(tArg," "),diskPassPath) | |
| 980 | if not disk.getLabel(side) then | |
| 981 | disk.setLabel(side,"slkey-"..random(1,1000)) | |
| 982 | end | |
| 983 | sleep(0) | |
| 984 | print("Added password.")
| |
| 985 | if not doKeyCards then | |
| 986 | print("Key cards aren't enabled, though.")
| |
| 987 | end | |
| 988 | return | |
| 989 | end | |
| 990 | else | |
| 991 | sleep(0) | |
| 992 | return print("Expected a password...")
| |
| 993 | end | |
| 994 | end | |
| 995 | ||
| 996 | if not fs.exists(passFile) then | |
| 997 | local progname = fs.getName(shell.getRunningProgram()) | |
| 998 | return print("No password file found.\nRun '"..progname.." addpass <password>' to add a password.")
| |
| 999 | end | |
| 1000 | ||
| 1001 | setBackgroundColor(colors.black) | |
| 1002 | term.clear() | |
| 1003 | ||
| 1004 | local parafunky = { --it looks kinda funky, but it tastes funKAY!
| |
| 1005 | sine, | |
| 1006 | lock, | |
| 1007 | } | |
| 1008 | ||
| 1009 | if not beWavey then table.remove(parafunky,1) end --not funky, man | |
| 1010 | local staytis, errawr | |
| 1011 | while keepLooping do | |
| 1012 | kaykaycoolcool = true | |
| 1013 | staytis, errawr = pcall(parallel.waitForAny,unpack(parafunky)) | |
| 1014 | if keepLooping == false then break else | |
| 1015 | if terminateMode == 2 then | |
| 1016 | kaykaycoolcool = false | |
| 1017 | if not isTerminable then | |
| 1018 | sillyTerminate() | |
| 1019 | else | |
| 1020 | keepLooping = false | |
| 1021 | setBackgroundColor(colors.black) | |
| 1022 | term.clear() | |
| 1023 | setTextColor(colors.white) | |
| 1024 | setCursorPos(1,1) | |
| 1025 | break | |
| 1026 | end | |
| 1027 | else | |
| 1028 | keepLooping = false | |
| 1029 | setBackgroundColor(colors.black) | |
| 1030 | term.clear() | |
| 1031 | setTextColor(colors.white) | |
| 1032 | setCursorPos(1,1) | |
| 1033 | if not staytis then | |
| 1034 | printError(errawr) | |
| 1035 | end | |
| 1036 | break | |
| 1037 | end | |
| 1038 | end | |
| 1039 | end | |
| 1040 | if runProgram and (runProgram ~= "") then | |
| 1041 | shell.run(runProgram) | |
| 1042 | end |