Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- 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))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement