ComputerCraft Archive

drawtoy

computer networking LDDestroier github

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/drawtoy.lua drawtoy
Archive:wget https://cc.shobie.xyz/cc/get/gh-LDDestroier-CC-drawtoy drawtoy
Quick Install: wget https://cc.shobie.xyz/cc/get/gh-LDDestroier-CC-drawtoy drawtoy

Usage

Run: drawtoy

Tags

networking

Source

View Original Source

Code Preview

--[[
 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))