ComputerCraft Archive

lddwindow

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

Usage

Run: lddwindow

Tags

none

Source

View Original Source

Code Preview

local doGlobalize = false
local lddwindow = {}

local to_colors = {
	[" "] = 0,
	["0"] = colors.white,
	["1"] = colors.orange,
	["2"] = colors.magenta,
	["3"] = colors.lightBlue,
	["4"] = colors.yellow,
	["5"] = colors.lime,
	["6"] = colors.pink,
	["7"] = colors.gray,
	["8"] = colors.lightGray,
	["9"] = colors.cyan,
	["a"] = colors.purple,
	["b"] = colors.blue,
	["c"] = colors.brown,
	["d"] = colors.green,
	["e"] = colors.red,
	["f"] = colors.black,
}
local to_blit = {}
for k,v in pairs(to_colors) do
	to_blit[v] = k
end

local stringSub = string.sub
local stringGsub = string.gsub
local tableConcat = table.concat

lddwindow.newWindow = function(nativeTerm, x, y, width, height, visible)
	local output = {
		info = {
			buffer = {{},{},{}},
			x = x,
			y = y,
			textColor = "0",
			backColor = "f",
			cursorX = 1,
			cursorY = 1,
			nativeTerm = nativeTerm or term.current(),
			width = width,
			height = height,
			blink = true,
			palette = {},
		}
	}
	if visible == nil then
		output.info.visible = true
	elseif type(visible) == "boolean" then
		output.info.visible = visible
	else
		output.info.visible = true
	end
	
	local genTblLine = function(char, length)
		local blankLine = {}
		for i = 1, length do
			blankLine[i] = char
		end
		return blankLine
	end
	
	for i = 0, 15 do
--		output.info.palette[2^i] = output.info.nativeTerm.nativePaletteColor(2^i)
		output.info.palette[2^i] = term.nativePaletteColor(2^i)
	end
	
	local fixBuffer = function()
		for y = math.max(output.info.height, #output.info.buffer[1]), 1, -1 do
			if y > output.info.height then
				output.info.buffer[1][y] = nil
				output.info.buffer[2][y] = nil
				output.info.buffer[3][y] = nil
			else
				output.info.buffer[1][y] = output.info.buffer[1][y] or {}
				output.info.buffer[2][y] = output.info.buffer[2][y] or {}
				output.info.buffer[3][y] = output.info.buffer[3][y] or {}
				for x = math.max(output.info.width, #(output.info.buffer[1][1] or {})), 1, -1 do
					if x > output.info.width then
						output.info.buffer[1][y][x] = nil
						output.info.buffer[2][y][x] = nil
						output.info.buffer[3][y][x] = nil
					else
						output.info.buffer[1][y][x] = output.info.buffer[1][y][x] or " "
						output.info.buffer[2][y][x] = output.info.buffer[2][y][x] or output.info.textColor
						output.info.buffer[3][y][x] = output.info.buffer[3][y][x] or output.info.backColor
					end
				end
			end
		end
	end
	
	fixBuffer()
	
	output.reposition = function(x, y, width, height)
		output.info.x = tonumber(x) or output.info.x
		output.info.y = tonumber(y) or output.info.y
		output.info.width = tonumber(width) or output.info.width
		output.info.height = tonumber(height) or output.info.height
		fixBuffer()
	end
	
	output.setCursorPos = function(x, y)
		output.info.cursorX = x or output.info.cursorX
		output.info.cursorY = y or output.info.cursorY
	end
	
	output.getCursorPos = function()
		return output.info.cursorX, output.info.cursorY
	end
	
	output.setCursorBlink = function(blink)
		output.info.blink = blink and true or false
	end
	
	output.getCursorBlink = function(blink)
		return output.info.blink
	end
	
	output.isColor = function()
		return true
	end
	output.isColour = output.isColor
	
	output.getSize = function()
		return output.info.width, output.info.height
	end
	
	output.current = function()
		return output
	end
	
	output.clear = function()
		for y = 1, output.info.height do
			output.info.buffer[1][y] = genTblLine(" ", output.info.width)
			output.info.buffer[2][y] = genTblLine(output.info.textColor, output.info.width)
			output.info.buffer[3][y] = genTblLine(output.info.backColor, output.info.width)
		end
	end
	
	output.clearLine = function()
		if output.info.cursorY >= 1 and output.info.cursorY <= output.info.height then
			output.info.buffer[1][output.info.cursorY] = genTblLine(" ", output.info.width)
			output.info.buffer[2][output.info.cursorY] = genTblLine(output.info.textColor, output.info.width)
			output.info.buffer[3][output.info.cursorY] = genTblLine(output.info.backColor, output.info.width)
		end
	end
	
	output.setTextColor = function(color)
		output.info.textColor = to_blit[color]
	end
	output.setTextColour = output.setTextColor
	
	output.setBackgroundColor = function(color)
		output.info.backColor = to_blit[color]
	end
	output.setBackgroundColour = output.setBackgroundColor
	
	output.getTextColor = function()
		return output.info.textColor
	end
	output.getTextColour = output.getTextColor
	
	output.getBackgroundColor = function()
		return output.info.backColor
	end
	output.getBackgroundColour = output.getBackgroundColor
	
	output.write = function(char)
		local cx
		if output.info.cursorY >= 1 and output.info.cursorY <= height then
			for i = 1, #char do
				cx = -1 + i + output.info.cursorX
				if cx >= 1 and cx <= output.info.width then
					output.info.buffer[1][output.info.cursorY][cx] = stringSub(char, i, i)
					output.info.buffer[2][output.info.cursorY][cx] = output.info.textColor
					output.info.buffer[3][output.info.cursorY][cx] = output.info.backColor
				end
			end
		end
		output.info.cursorX = output.info.cursorX + #char
	end
	
	output.blit = function(char, text, back)
		local cx
		assert(#char == #text and #text == #back, "arguments must be same length")
		if output.info.cursorY >= 1 and output.info.cursorY <= height then
			for i = 1, #char do
				cx = -1 + i + output.info.cursorX
				if cx >= 1 and cx <= output.info.width then
					output.info.buffer[1][output.info.cursorY][cx] = stringSub(char, i, i)
					output.info.buffer[2][output.info.cursorY][cx] = stringSub(text, i, i)
					output.info.buffer[3][output.info.cursorY][cx] = stringSub(back, i, i)
				end
			end
		end
		output.info.cursorX = output.info.cursorX + #char
	end
	
	output.native = function()
		if true then
			return output.info.nativeTerm
		else
			return output
		end
	end
	
	output.nativePaletteColor = output.info.nativeTerm.nativePaletteColor
	output.nativePaletteColour = output.info.nativeTerm.nativePaletteColour
	
	output.setPaletteColor = function(slot, r, g, b)
		output.info.palette[slot] = {r, g, b}
	end
	output.setPaletteColour = output.setPaletteColor
	
	output.getPaletteColor = function(slot)
		return output.info.palette[slot][1], output.info.palette[slot][2], output.info.palette[slot][3]
	end
	output.getPaletteColour = output.getPaletteColor
	
	output.scroll = function(distance)
		for y = distance, output.info.height do
			for c = 1, 3 do
				output.info.buffer[c][y] = output.info.buffer[c][y + distance] or genTblLine(" ", output.info.width)
			end
		end
	end
	
	output.setVisible = function(visible)
		output.info.visible = visible and true or false
	end
	
	-- draws the window
	output.render = function(x, y, ...)
		x = x or output.info.x
		y = y or output.info.y
		-- can render to multiple terminals
		local termList = {...}
		if output.info.visible then
			if #termList == 0 then
				nTerm = nTerm or output.info.nativeTerm
				for yy = 1, output.info.height do
					nTerm.setCursorPos(x, -1 + y + yy)
					nTerm.blit(
						tableConcat(output.info.buffer[1][yy]),
						tableConcat(output.info.buffer[2][yy]),
						tableConcat(output.info.buffer[3][yy])
					)
				end
			else
				for i = 1, #termList do
					for yy = 1, output.info.height do
						termList[i].setCursorPos(x, -1 + y + yy)
						termList[i].blit(
							tableConcat(output.info.buffer[1][yy]),
							tableConcat(output.info.buffer[2][yy]),
							tableConcat(output.info.buffer[3][yy])
						)
					end
				end
			end
		end
	end
	
	-- turns window into an NFT string image
	output.screenshot = function()
		local image = ""
		local tcol, bcol
		local tchar, bchar = string.char(31), string.char(30)
		for y = 1, output.info.height do
			tcol, bcol = "", ""
			for x = 1, output.info.width do
				if tcol ~= output.info.buffer[2][y][x] then
					tcol = output.info.buffer[2][y][x]
					image = image .. tchar .. tcol
				end
				if bcol ~= output.info.buffer[3][y][x] then
					bcol = output.info.buffer[3][y][x]
					image = image .. bchar .. bcol
				end
				image = image .. output.info.buffer[1][y][x]
			end
			if y < output.info.height then
				image = image .. "\n"
			end
		end
		return image
	end
	
	return output
end

if doGlobalize then
	_G.lddwindow = lddwindow
end

return lddwindow