ldd-CC/dvdlogo.lua

127 lines
3.4 KiB
Lua
Raw Normal View History

2020-02-08 22:24:25 +00:00
local mon = peripheral.find("monitor")
if mon then
mon.setTextScale(0.5)
term.redirect(mon)
end
local scr_x, scr_y = term.getSize()
local max, min = math.max, math.min
local floor, ceil = math.floor, math.ceil
getSize = function(image)
local x, y = 0, #image[1]
for y = 1, #image[1] do
x = max(x, #image[1][y])
end
return x, y
end
local loadImageDataNFT = function(image, background) -- string image
local output = {{},{},{}} -- char, text, back
local y = 1
background = (background or " "):sub(1,1)
local text, back = " ", background
local doSkip, c1, c2 = false
local maxX = 0
local bx
for i = 1, #image do
if doSkip then
doSkip = false
else
output[1][y] = output[1][y] or ""
output[2][y] = output[2][y] or ""
output[3][y] = output[3][y] or ""
c1, c2 = image:sub(i,i), image:sub(i+1,i+1)
if c1 == tchar then
text = c2
doSkip = true
elseif c1 == bchar then
back = c2
doSkip = true
elseif c1 == "\n" then
maxX = max(maxX, #output[1][y])
y = y + 1
text, back = " ", background
else
output[1][y] = output[1][y]..c1
output[2][y] = output[2][y]..text
output[3][y] = output[3][y]..back
end
end
end
for y = 1, #output[1] do
output[1][y] = output[1][y] .. (" "):rep(maxX - #output[1][y])
output[2][y] = output[2][y] .. (" "):rep(maxX - #output[2][y])
output[3][y] = output[3][y] .. (background):rep(maxX - #output[3][y])
end
return output
end
local drawImage = function(image, x, y, terminal)
terminal = terminal or term.current()
local cx, cy = terminal.getCursorPos()
for iy = 0, #image[1] + 1 do
terminal.setCursorPos(x - 1, y + (iy - 1))
if image[1][iy] then
terminal.blit(
" " .. image[1][iy] .. " ",
"f" .. image[2][iy] .. "f",
"f" .. image[3][iy] .. "f"
)
else
terminal.clearLine()
end
end
terminal.setCursorPos(cx,cy)
end
local logo = {
xvel = (math.random(0, 1) * 2) - 1,
yvel = (math.random(0, 1) * 2) - 1,
x = floor(scr_x / 2),
y = floor(scr_y / 2),
img = loadImageDataNFT([[
  00€€€€€€€€€€f  0fŸ0€€€€€€f‚‹
  0fŸf0  f0‚0f0€f”  0f•0€fŠ  0f‡0€€f‡f€0  f0‹0€f‚
  00€€  0f•0€f•  00€€f0fŸ0€fŸ  0f•0€f•  00€€
0f•0€f•  0fŸ‡0€fŸ  0f•0€f‚0€€f‡  00€€  0f0€f…
0€€€€€fŸ‡  00€€fŸ  0f•0€€€€€f
  0f•f0‡
  0f‡ƒƒƒ0€€€€€€f‚ƒƒƒ‹
0f‡0€€€€€€fƒƒƒƒƒ‹0f0€€€€€€f‚‹
0f0€€€€€€fƒ  0fŸ‡0€€€€€€fŸ
  f0‚ƒ0f0€€€€€€€€€€€€€€fŸƒ
  f0‚ƒƒƒƒƒƒ ]])
}
local imgXsize, imgYsize = getSize(logo.img)
local xWall, yWall
local render = function()
drawImage(logo.img, floor(logo.x), floor(logo.y))
end
local tick = function()
scr_x, scr_y = term.getSize()
xWall = scr_x - imgXsize + 1
yWall = scr_y - imgYsize + 1
logo.x = min(max(logo.x + logo.xvel, 1), xWall)
logo.y = min(max(logo.y + logo.yvel, 1), yWall)
if floor(logo.x) == 1 or floor(logo.x) == xWall then
logo.xvel = -logo.xvel
end
if floor(logo.y) == 1 or floor(logo.y) == yWall then
logo.yvel = -logo.yvel
end
render()
end
term.setBackgroundColor(colors.black)
term.clear()
while true do
tick()
sleep(0.05)
end