Skip to content

Instantly share code, notes, and snippets.

@zeeZ
Created August 10, 2012 13:03
Show Gist options
  • Save zeeZ/3314064 to your computer and use it in GitHub Desktop.
Save zeeZ/3314064 to your computer and use it in GitHub Desktop.
Annoying message screen for ComputerCraft
local message = "EE IS DISABLED"
local pauseAfterMarquee = 2 -- Marquee ends with a blank screen
local pauseAfterFlash = 5 -- Flash ends with the message centered
local pauseAfterAllOver = 0.5 -- AllOver leaves the message all over the screen
local marqueeSpacer = " +++ "
local marqueeRepeatMessage = 1 -- Marquee displays the message, then "<marqueespacer><message>" repeated n times
local marqueeSpeed = 0.25 -- Scroll speed of marquee
local flashAmount = 5 -- Amount of flashes
local flashSpeedOn = 1 -- Amount of seconds the message is shown for
local flashSpeedOff = 0.25 -- Amount of seconds the screen is dark for
local allOverSpeed = 0.1 -- The message is written on a random location of the screen every n seconds
-- Code is a go!
local monitor = nil
local monitorSide = nil
local timers = {}
local misc = {}
function resetMisc()
misc={marqueePos=1,flashes=flashAmount*2+1,allOver={}}
misc["marqueeMessage"] = message
for i=1,marqueeRepeatMessage do
misc["marqueeMessage"] = misc["marqueeMessage"] .. marqueeSpacer .. message
end
end
function getMonitor()
for k,side in pairs(redstone.getSides()) do
if peripheral.getType(side) == "monitor" then
monitor = peripheral.wrap(side)
monitorSide = side
break
end
end
if monitor ~= nil then
monitor.clear()
end
end
function writeCenter()
local monX,monY = monitor.getSize()
monitor.setTextScale(4)
monitor.clear()
monitor.setCursorPos(monX/2-#message/2+1, monY/2+1)
monitor.write(message)
end
function marquee()
if monitor == nil then
return
end
monitor.setTextScale(4)
local monX,monY = monitor.getSize()
monitor.clear()
monitor.setCursorPos(monX-misc["marqueePos"]+1, monY/2+1)
monitor.write(misc["marqueeMessage"])
misc["marqueePos"] = misc["marqueePos"]+1
if misc["marqueePos"] > (#misc["marqueeMessage"])+monX then
resetMisc()
os.queueEvent("marqueeDone")
else
timers["marquee"] = os.startTimer(marqueeSpeed)
end
end
function flash()
if monitor == nil then
return
end
monitor.setTextScale(4)
local monX,monY = monitor.getSize()
local wait
monitor.clear()
if misc["flashes"]%2==1 then
wait = flashSpeedOn
writeCenter()
else
wait = flashSpeedOff
end
misc["flashes"] = misc["flashes"]-1
if misc["flashes"] < 1 then
resetMisc()
os.queueEvent("flashDone")
else
timers["flash"] = os.startTimer(wait)
end
end
function allOver()
if monitor == nil then
return
end
monitor.setTextScale(1)
local monX,monY = monitor.getSize()
if #misc["allOver"]==0 then
monitor.clear()
for x=1,math.ceil(monX/(#message+1)) do
for y=1,monY do
table.insert(misc["allOver"],{((x-1)*(#message+1)+1),y})
end
end
end
local rnd = math.random(1,#misc["allOver"])
monitor.setCursorPos(misc["allOver"][rnd][1],misc["allOver"][rnd][2])
monitor.write(message)
table.remove(misc["allOver"],rnd)
if #misc["allOver"] == 0 then
resetMisc()
os.queueEvent("allOverDone")
else
timers["allOver"] = os.startTimer(allOverSpeed)
end
end
function animate()
if monitor ~= nil then
resetMisc()
flash()
end
end
function main()
getMonitor()
animate()
while true do
local event, p1, p2, p3, p4, p5 = os.pullEventRaw()
if event == "peripheral_detach" and p1 == monitorSide then
monitor = nil
monitorSide = nil
elseif event == "peripheral" and monitorSide == nil then
getMonitor()
animate()
elseif event == "timer" then
if p1 == timers["marquee"] then
marquee()
elseif p1 == timers["flash"] then
flash()
elseif p1 == timers["allOver"] then
allOver()
end
elseif event == "marqueeDone" then
timers["allOver"] = os.startTimer(pauseAfterMarquee)
elseif event == "flashDone" then
timers["marquee"] = os.startTimer(pauseAfterFlash)
elseif event == "allOverDone" then
timers["flash"] = os.startTimer(pauseAfterAllOver)
end
end
end
main()
-- zeeZ :)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment