mirror of
https://github.com/LDDestroier/CC/
synced 2024-11-18 07:44:53 +00:00
207 lines
5.3 KiB
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)) |