screensaver
Description
A collection of all my ComputerCraft programs and the APIs they use. This is mostly just to get them the fuck off of pastebin, and also to ensure that API owners don't change things to break my precious programs...!
Installation
Copy one of these commands into your ComputerCraft terminal:
wget:
wget https://raw.githubusercontent.com/LDDestroier/CC/master/screensaver.lua screensaverArchive:
wget https://cc.shobie.xyz/cc/get/gh-LDDestroier-CC-screensaver screensaver
Quick Install:
wget https://cc.shobie.xyz/cc/get/gh-LDDestroier-CC-screensaver screensaver
Usage
Run: screensaver
Tags
Source
View Original SourceCode Preview
local tArg = {...}
local scr_x, scr_y = term.getSize()
local mx, my = scr_x/2, scr_y/2
-- special modes for special people
local mouseMode = tArg[1] == "mouse" or tArg[2] == "mouse"
local fuck = tArg[1] == "fuck" or tArg[2] == "fuck"
-- localize functions to increase speed, maybe, I think
local concat, blit = table.concat, term.blit
local sin, cos, rad, abs, sqrt, floor = math.sin, math.cos, math.rad, math.abs, math.sqrt, math.floor
-- rainbow pattern
local palette = {"e","1","4","5","d","9","b","a","2"}
local distance = function(x1, y1, x2, y2)
return sqrt( (x2 - x1) ^ 2 + (y2 - y1) ^ 2 )
end
local randCase = function(str)
local output = ""
for i = 1, #str do
output = output .. ((math.random(0,1) == 1) and str:sub(i,i):upper() or str:sub(i,i):lower())
end
return output
end
local render = function(iterate, xscroll1, yscroll1, xscroll2, yscroll2)
local buffer, cx, cy = {{},{},{}}
for y = 1, scr_y do
buffer[1][y] = {}
buffer[2][y] = {}
buffer[3][y] = {}
for x = 1, scr_x do
cx = 0.66 * ((x - mx) > 0 and 1 or -1) * (abs(x - mx) ^ 1.2)
cy = ((y - my) > 0 and 1 or -1) * (abs(y - my) ^ 1.2)
buffer[1][y][x] = fuck and randCase("fuck"):sub(1+(cx%4),1+(cx%4)) or "\127"
buffer[2][y][x] = palette[1 + floor(
iterate + distance( cx + xscroll1, cy + yscroll1, 0, 0 )
) % #palette] or " "
buffer[3][y][x] = palette[1 + floor(
iterate + distance( cx + xscroll2, cy + yscroll2, 0, 0 )
) % #palette] or " "
end
end
for y = 1, scr_y do
term.setCursorPos(1,y)
-- suka
blit(
concat(buffer[1][y]),
concat(buffer[2][y]),
concat(buffer[3][y])
)
end
end
local main = function()
term.clear()
local wave, evt = 0
local xscroll1, yscroll1, xscroll2, yscroll2 = 0, 0, 0, 0
if mouseMode then
parallel.waitForAny(function()
while true do
evt = {os.pullEvent()}
if evt[1] == "mouse_click" or evt[1] == "mouse_drag" then
if evt[2] == 1 then
xscroll1 = mx - evt[3]
yscroll1 = my - evt[4]
elseif evt[2] == 2 then
xscroll2 = mx - evt[3]
yscroll2 = my - evt[4]
end
end
end
end,
function()
while true do
render(wave, xscroll1, yscroll1, xscroll2, yscroll2)
wave = (wave + 1) % (360 * 7)
sleep(0.05)
end
end)
else
while true do
xscroll1 = -sin(rad(wave * 2)) * scr_x * 0.4
yscroll1 = -cos(rad(wave * 3.5)) * scr_y * 0.4
xscroll2 = -xscroll1
yscroll2 = -yscroll1
render(wave, xscroll1, yscroll1, xscroll2, yscroll2)
wave = (wave + 1) % (360 * 7)
sleep(0.05)
end
end
end
-- wait for keypress to exit program
local waitForInput = function()
local evt
sleep(0.25)
os.pullEvent("key")
end
parallel.waitForAny(main, waitForInput)
term.clear()
term.setCursorPos(1,1)
sleep(0.05)