-- Computercraft Program
-- by glitchdetector
function ReadableNumber(num, places, full)
num = tonumber(num)
if not num then return 0 end
local ret
local placeValue = ("%%.%df"):format(places or 0)
local isNegative = num < 0
num = math.abs(num)
if num >= 1000000000000 then
ret = placeValue:format(num / 1000000000000) .. (full and " trillion" or "T") -- trillion
elseif num >= 1000000000 then
ret = placeValue:format(num / 1000000000) .. (full and " billion" or "B") -- billion
elseif num >= 1000000 then
ret = placeValue:format(num / 1000000) .. (full and " million" or "M") -- million
elseif num >= 1000 and not full then
ret = placeValue:format(num / 1000) .. "k" -- thousand
elseif num >= 1 then
ret = num -- hundreds
else
ret = num
end
return (isNegative and "- " or "") .. ret
end
function GetEMC(link)
local items = link.list()
if not items then return 0 end
if not items[1] then return 0 end
return items[1].count or 0
end
function ClearScreen(monitor)
monitor.clear()
monitor.setCursorPos(1, 1)
end
function NextLine(monitor)
local x, y = monitor.getCursorPos()
monitor.setCursorPos(1, y + 1)
end
function WriteCenterAligned(monitor, text)
local w, h = monitor.getSize()
local x, y = monitor.getCursorPos()
monitor.setCursorPos(math.floor(w / 2 - #text / 2), y)
monitor.write(text)
end
function WriteLeftAligned(monitor, text)
local x, y = monitor.getCursorPos()
monitor.setCursorPos(1, y)
monitor.write(text)
end
function WriteRightAligned(monitor, text)
local w, h = monitor.getSize()
local x, y = monitor.getCursorPos()
monitor.setCursorPos(w - #text + 1, y)
monitor.write(text)
end
-- Program Code
local Users = {
{"top", "Glitch"},
{"right", "Collins"},
}
for _, user in next, Users do
user[3] = peripheral.wrap(user[1])
end
local monitor = peripheral.wrap("monitor_0")
local last = 0
local timespan = 5
local timespanFactor = 60 / timespan
local history = {}
function CalculateHistory(new)
table.insert(history, new)
while #history > timespanFactor do
table.remove(history, 1)
end
local sum = 0
for _, v in next, history do
sum = sum + v
end
return sum / #history
end
while true do
ClearScreen(monitor)
WriteCenterAligned(monitor, "Energy Matter Covalence")
NextLine(monitor)
local sum = 0
for n, user in next, Users do
WriteLeftAligned(monitor, user[2])
local EMC = GetEMC(user[3])
sum = sum + EMC
WriteRightAligned(monitor, ReadableNumber(EMC, 2, false) .. " EMC")
NextLine(monitor)
end
WriteCenterAligned(monitor, ReadableNumber(sum, 2, true) .. " EMC")
NextLine(monitor)
local difference = (sum - last)
local isNeg = difference < 0
if isNeg then
monitor.setTextColour(colors.red)
else
monitor.setTextColour(colors.green)
end
last = sum
WriteCenterAligned(monitor, (isNeg and "" or "+ ") .. ReadableNumber(CalculateHistory(difference), 2, true) .. " / minute")
monitor.setTextColour(colors.white)
sleep(timespan)
end
Comments