View difference between Paste ID: gvUMfX7H and KQjmtASU
SHOW: | | - or go back to the newest paste.
1
--(c) 2013 Felix Maxwell
2
--License: CC BY-SA 3.0
3
4
local fps = 8 --Determines how long the system will wait between each update
5
local maxLifetime = 40 --Max lifetime of each char
6
local minLifetime = 8 --Min lifetime of each char
7
local maxSourcesPerTick = 5 --Maximum number of sources created each tick
8
local sourceWeight = 0 --Affects the chance that no sources will be generated
9
local greenWeight = 8 --Threshhold out of 10 that determines when characters will switch from lime to green
10
local grayWeight = 2 --Same as about, but from green to gray
11
12
function getMonitors()
13
	local monitors = {}
14
	if checkMonitorSide( "top" ) then table.insert( monitors, "top" ) end
15
	if checkMonitorSide( "bottom" ) then table.insert( monitors, "bottom" ) end
16
	if checkMonitorSide( "left" ) then table.insert( monitors, "left" ) end
17
	if checkMonitorSide( "right" ) then table.insert( monitors, "right" ) end
18
	if checkMonitorSide( "front" ) then table.insert( monitors, "front" ) end
19
	if checkMonitorSide( "back" ) then table.insert( monitors, "back" ) end
20
	return monitors
21
end
22
function checkMonitorSide( side )
23
	if peripheral.isPresent( side ) then
24
		if peripheral.getType(side) == "monitor" then
25
			return true
26
		end
27
	end
28
	return false
29
end
30
function printMonitorStats( side )
31
	local x, y = peripheral.call(side, "getSize")
32
	local color = "No"
33
	if peripheral.call(side, "isColor") then
34
		color = "Yes"
35
	end
36
	print("Side:"..side.." Size:("..x..", "..y..") Color?"..color)
37
end
38
function askMonitor()
39
	local monitors = getMonitors()
40
	if #monitors == 0 then
41
		print("No monitors found, add more!")
42
		return nill
43
	elseif #monitors == 1 then
44
		return monitors[1]
45
	else
46
		while true do
47
			print("Multiple monitors found, please pick one.")
48
			for i,v in ipairs(monitors) do
49
				write("["..(i).."] ")
50
				printMonitorStats( v )
51
			end
52
			write("Selection: ")
53
			local sel = tonumber(io.read())
54
			if sel < 1 or sel > #monitors then
55
				print("")
56
				print("Invalid number.")
57
			else
58
				return monitors[sel]
59
			end
60
		end
61
	end
62
end
63
64
function printCharAt( monitor, x, y, char )
65
	monitor.setCursorPos( x, y )
66
	monitor.write( char )
67
end
68
function printGrid( monitor, grid, color )
69
	for i=1,#grid do
70
		for o=1,#grid[i] do
71
			if color then monitor.setTextColor( grid[i][o]["color"] ) end
72
			printCharAt( monitor, i, o, grid[i][o]["char"] )
73
		end
74
	end
75
end
76
77
function colorLifetime( life, originalLifetime )
78
	local lifetimePart = originalLifetime/10
79
	if life < grayWeight*lifetimePart then
80
		return colors.gray
81
	elseif life < greenWeight*lifetimePart then
82
		return colors.green
83
	else
84
		return colors.lime
85
	end
86
end
87
function getRandomChar()
88
	local randTable = {"1","2","3","4","5","6","7","8","9","0","!","@","#","$","%","^","&","*","(",")","_","-","+","=","~","`",",","<",">",".","/","?",":","{","}","[","]","\\","\"","\'"}
89
	return randTable[math.random(1, #randTable)]
90
end
91
function tick( screen )
92
93
	--update lifetimes
94
	for x=1,#screen do
95
		for y=1,#screen[x] do
96
			screen[x][y]["curLife"] = screen[x][y]["curLife"] - 1
97
		end
98
	end
99
100
	--make the sources 'fall' and delete timed out chars
101
	for x=1,#screen do
102
		for y=1,#screen[x] do
103
			if screen[x][y]["type"] == "source" and screen[x][y]["curLife"] == 0 then
104
				screen[x][y]["type"] = "char"
105
				screen[x][y]["lifetime"] = math.random(minLifetime, maxLifetime)
106
				screen[x][y]["curLife"] = screen[x][y]["lifetime"]
107
				screen[x][y]["color"] = colors.lime
108
			
109
				if y < #screen[x] then
110
					screen[x][y+1]["char"] = getRandomChar()
111
					screen[x][y+1]["lifetime"] = 1
112
					screen[x][y+1]["curLife"] = 1
113
					screen[x][y+1]["type"] = "source"
114
					screen[x][y+1]["color"] = colors.white
115
				end
116
			elseif screen[x][y]["curLife"] < 0 then
117
				screen[x][y]["char"] = " "
118
				screen[x][y]["lifetime"] = 0
119
				screen[x][y]["curLife"] = 0
120
				screen[x][y]["type"] = "blank"
121
				screen[x][y]["color"] = colors.black
122
			elseif screen[x][y]["type"] == "char" then
123
				screen[x][y]["color"] = colorLifetime( screen[x][y]["curLife"], screen[x][y]["lifetime"] )
124
			end
125
		end
126
	end
127
		
128
	--create new character sources
129
	local newSources = math.random( 0-sourceWeight, maxSourcesPerTick )
130
	for i=1,newSources do
131
		local col = math.random(1, #screen)
132
		screen[col][1]["char"] = getRandomChar()
133
		screen[col][1]["lifetime"] = 1
134
		screen[col][1]["curLife"] = 1
135
		screen[col][1]["type"] = "source"
136
		screen[col][1]["color"] = colors.white
137
	end
138
	
139
	return screen
140
end
141
142
function setup( w, h )
143
	local retTab = {}
144
	for x=1,w do
145
		retTab[x] = {}
146
		for y=1,h do
147
			retTab[x][y] = {}
148
			retTab[x][y]["char"] = " "
149
			retTab[x][y]["lifetime"] = 0
150
			retTab[x][y]["curLife"] = 0
151
			retTab[x][y]["type"] = "blank"
152
			retTab[x][y]["color"] = colors.black
153
		end
154
	end
155
	return retTab
156
end
157
function run()
158
	local monitor = peripheral.wrap( askMonitor() )
159
	local color = monitor.isColor()
160
	local w, h = monitor.getSize()
161
	local screen = setup( w, h )
162
	while true do
163
		screen = tick( screen )
164
		printGrid( monitor, screen, color )
165
		os.sleep(1/fps)
166
	end
167
end
168
169
run()