ComputerCraft Archive

ghost

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

Usage

Run: ghost

Tags

none

Source

View Original Source

Code Preview

local tArg = {...}
local filename = tArg[1]

local contrast = 2			-- lower value means higher contrast
local addSpeed = 4			-- higher value means brighter colors show up faster
local subtractSpeed = 1		-- higher value means darker colors take over faster
local minimumStatic = -8	-- lower value means static will be less frequent (not less powerful)
local maximumStatic = 0		-- higher value means static will be more powerful (not less frequent) (if zero, disables static)
local tint = {
	1,
	0.749,
	0,
}

if not fs.exists("windont.lua") then
	print("'windont.lua' not found! Downloading...")
	local net = http.get("https://github.com/LDDestroier/CC/raw/master/windont/windont.lua")
	if net then
		local file = fs.open("windont.lua", "w")
		file.write(net.readAll())
		file.close()
		net.close()
	else
		error("Could not download Windon't.", 0)
	end
end

local windont = require("windont")

windont.useSetVisible = true

local newTerm = windont.newWindow(1, 1, term.getSize())
local gstTerm = windont.newWindow(1, 1, term.getSize())
newTerm.meta.alwaysRender = false
gstTerm.meta.alwaysRender = false

local scr_x, scr_y = term.getSize()

local ghostPalette = {}
local nativePalette = {}

local alpha, rv_alpha 	= {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"}, {}
local bright, rv_bright = {"f","7","c","a","b","d","9","8","e","5","2","1","6","3","4","0"}, {}
for k,v in pairs(bright) do
	rv_bright[v] = k
end
for k,v in pairs(alpha) do
	rv_alpha[v] = k
end

local setPalette = function(p, t)
	t = t or term.current()
	for i = 0, 15 do
		t.setPaletteColor(2^i, table.unpack(p[2^i]))
	end
end

local makeGhostPalette = function()
	local p
	for i = 0, 15 do
		p = 2 ^ (-1 + rv_alpha[bright[i + 1]])
		ghostPalette[p] = {
			((i + contrast) / (15 + contrast)) * tint[1],
			((i + contrast) / (15 + contrast)) * tint[2],
			((i + contrast) / (15 + contrast)) * tint[3],
		}
		nativePalette[p] = {term.getPaletteColor(p)}
	end
end

makeGhostPalette()
setPalette(ghostPalette)

newTerm.setPaletteColor = function(col, r, g, b)
	return nil
end
newTerm.setPaletteColour = newTerm.setPaletteColor

gstTerm.meta.metaTransformation = function(meta)
	for y = 1, meta.height do
		for x = 1, meta.width do

			local BGCOL = newTerm.meta.buffer[3][y][x]
			local TXCOL
			if newTerm.meta.buffer[1][y][x] == " " then
				TXCOL = BGCOL
			else
				TXCOL = newTerm.meta.buffer[2][y][x]
			end
			local CHAR
			if newTerm.meta.buffer[1][y][x] == " " and meta.buffer[1][y][x] ~= " " then
				CHAR = meta.buffer[1][y][x]
			else
				CHAR = newTerm.meta.buffer[1][y][x]
			end

			meta.buffer[1][y][x] = CHAR

			if rv_bright[TXCOL] >= rv_bright[meta.buffer[2][y][x]] then
				meta.buffer[2][y][x] = bright[ math.min(16, math.min(rv_bright[meta.buffer[2][y][x]] + addSpeed, rv_bright[TXCOL]) + math.max(0, math.random(minimumStatic, maximumStatic))) ]
			else
				meta.buffer[2][y][x] = bright[ math.max(rv_bright[meta.buffer[2][y][x]] - subtractSpeed, 1) ]
			end

			if rv_bright[BGCOL] >= rv_bright[meta.buffer[3][y][x]] then
				meta.buffer[3][y][x] = bright[ math.min(16, math.min(rv_bright[meta.buffer[3][y][x]] + addSpeed, rv_bright[BGCOL]) + math.max(0, math.random(minimumStatic, maximumStatic))) ]
			else
				meta.buffer[3][y][x] = bright[ math.max(rv_bright[meta.buffer[3][y][x]] - subtractSpeed, 1) ]
			end

			if meta.buffer[2][y][x] == "f" and meta.buffer[3][y][x] == "f" and newTerm.meta.buffer[1][y][x] == " " then
				meta.buffer[1][y][x] = " "
			end

		end
	end
end

local oldTerm = term.redirect(newTerm)

local isSelected = true
local multishellID
if multishell then
	multishellID = multishell.getCurrent()
end

parallel.waitForAny(function()
		pcall(function() shell.run(filename or "/rom/programs/shell.lua") end)
	end, function()
	while true do
		if gstTerm.meta.width ~= newTerm.meta.width or gstTerm.meta.height ~= newTerm.meta.height then
			gstTerm.reposition(1, 1, newTerm.meta.width, newTerm.meta.height)
		end
		if multishell then
			if multishellID == multishell.getFocus() then
				if not isSelected then
					setPalette(ghostPalette, term.native())
				end
				isSelected = true
			else
				if isSelected then
					setPalette(nativePalette, term.native())
				end
				isSelected = false
			end
		end
		gstTerm.redraw()
		newTerm.restoreCursor()
		sleep(0)
	end
end)

term.redirect(oldTerm)
setPalette(nativePalette)
newTerm.redraw()
term.setCursorPos(1, scr_y)