ldd-CC/drawtoy.lua

207 lines
5.3 KiB
Lua

--[[
pastebin get tfyqv2ww toy
std pb tfyqv2ww toy
--]]
local channel = 180
local modem
local scr_x, scr_y = term.getSize()
local valchar = "#" --character used for fading
local hedchar = "@" --character used for tip of line
local s = { --default color combinations
[1] = { --A classical black-and-white color fade, perfect for looking classy and pretentious.
colors.black,
colors.gray,
colors.lightGray,
colors.white,
},
[2] = { --If you're feeling blue, then this randomly selected set of four colors should make you feel even worse!
colors.black,
colors.blue,
colors.cyan,
colors.lightBlue,
},
[3] = { --This one's purple. Tha-that's it. Like purple? Good.
colors.black,
colors.red,
colors.magenta,
colors.pink,
},
[4] = { --I'll admit, the creativity is lacking in this color. I mean, what was I thinking?
colors.black,
colors.gray,
colors.green,
colors.lime,
},
[5] = { --NOBODY CALLS ME YELLOW
colors.black,
colors.brown,
colors.orange,
colors.yellow,
},
}
local p = math.random(1,#s)
local g = function(num,sa) --This interprets the color palate and turns it into a fadey thing.
if not sa then sa = s[p] end
local values = {
[1] = {bg=sa[1], txt=sa[1], char=valchar},
[2] = {bg=sa[1], txt=sa[2], char=valchar},
[3] = {bg=sa[2], txt=sa[1], char=valchar},
[4] = {bg=sa[2], txt=sa[2], char=valchar},
[5] = {bg=sa[3], txt=sa[2], char=valchar},
[6] = {bg=sa[3], txt=sa[3], char=valchar},
[7] = {bg=sa[3], txt=sa[4], char=valchar},
[8] = {bg=sa[4], txt=sa[3], char=valchar},
[9] = {bg=sa[4], txt=sa[4], char=hedchar},
}
if not num then return #values end
return values[num]
end
local size = g()
local grid = {}
local ah = {}
for b = 1, scr_x do
ah[b] = {v = 0, r = s[p]}
end
for b = 1, scr_y do
grid[b] = ah
end
local between = function(num,min,max)
return (num > min and num or min) < max and num or max
end
local getDotsInLine = function( startX, startY, endX, endY ) --graciously stolen from the paintutils, and PAIN
local out = {}
startX = math.floor(startX)
startY = math.floor(startY)
endX = math.floor(endX)
endY = math.floor(endY)
if startX == endX and startY == endY then
out = {{x=startX,y=startY}}
return out
end
local minX = math.min( startX, endX )
if minX == startX then
minY = startY
maxX = endX
maxY = endY
else
minY = endY
maxX = startX
maxY = startY
end
local xDiff = maxX - minX
local yDiff = maxY - minY
if xDiff > math.abs(yDiff) then
local y = minY
local dy = yDiff / xDiff
for x=minX,maxX do
table.insert(out,{x=x,y=math.floor(y+0.5)})
y = y + dy
end
else
local x = minX
local dx = xDiff / yDiff
if maxY >= minY then
for y=minY,maxY do
table.insert(out,{x=math.floor(x+0.5),y=y})
x = x + dx
end
else
for y=minY,maxY,-1 do
table.insert(out,{x=math.floor(x+0.5),y=y})
x = x - dx
end
end
end
return out
end
local getModemInput = function()
while true do
local _,side,freq,rfreq,msg,dist = os.pullEvent("modem_message")
if freq == channel then
if type(msg) == "table" then
if type(msg.x) == "number" and type(msg.y) == "number" and type(msg.r) == "table" then
if (msg.x >= 1 and msg.x <= scr_x) and (msg.y >= 1 and msg.y <= scr_y) and (#msg.r == 4) then
grid[msg.y][msg.x] = {v = size, r = msg.r}
end
end
end
end
end
end
local render = function(grid)
local q
for y = 1, #grid do
for x = 1, #grid[y] do
q = grid[y][x]
if q then
term.setCursorPos(x,y)
term.setTextColor(g( between( q.v+1, 1, size ), q.r ).txt )
term.setBackgroundColor(g( between(q.v+1,1,size), q.r ).bg )
term.write(g(between(q.v+1,1,size),q.r).char)
end
end
end
end
local downByOne = function(grid)
local output = {}
for y = 1, #grid do
output[y] = {}
for x = 1, #grid[y] do
output[y][x] = {}
if grid[y][x].v > 0 then
output[y][x].v = grid[y][x].v - 1
else
output[y][x].v = 0
end
output[y][x].r = grid[y][x].r
end
end
return output
end
local getInput = function()
local mx,my,oldx,oldy,dots
while true do
local evt = {os.pullEvent()}
modem = peripheral.find("modem")
if modem then modem.open(channel) end
if evt[1] == "key" then
if evt[2] == keys.q then
sleep(0)
return
end
elseif evt[1] == "mouse_click" or evt[1] == "mouse_drag" then
oldx,oldy = mx or evt[3],my or evt[4]
mx,my = evt[3],evt[4]
dots = getDotsInLine(oldx,oldy,mx,my)
for a = 1, #dots do
grid[dots[a].y][dots[a].x] = {v = size, r = s[p]}
if modem then
modem.transmit(channel,channel,{x=dots[a].x, y=dots[a].y, r=s[p]})
end
end
elseif evt[1] == "mouse_up" then
mx,my = nil,nil
end
end
end
local dothRendering = function()
local t = false --term.current().setVisible
while true do
if t then t(false) end
render(grid)
if t then t(true) end
grid = downByOne(grid)
sleep(0)
end
end
local funclist = {
getInput,
dothRendering,
getModemInput,
}
parallel.waitForAny(unpack(funclist))