mirror of
https://github.com/osmarks/random-stuff
synced 2024-11-08 13:39:53 +00:00
109 lines
2.3 KiB
Lua
109 lines
2.3 KiB
Lua
local integrators = {
|
|
redstone_integrator_788 = "north",
|
|
redstone_integrator_790 = "east"
|
|
}
|
|
local screen = peripheral.find "monitor"
|
|
local side = "north"
|
|
local button_side = "front"
|
|
local modem = peripheral.find "modem"
|
|
modem.open(49961)
|
|
os.pullEvent = function(filter)
|
|
while true do
|
|
local ev = {coroutine.yield(filter)}
|
|
if ev[1] == filter then
|
|
return unpack(ev)
|
|
end
|
|
end
|
|
end
|
|
local w, h = screen.getSize()
|
|
|
|
screen.setTextScale(1.5)
|
|
screen.setBackgroundColor(colors.black)
|
|
screen.clear()
|
|
|
|
local function set_open(state)
|
|
for i, side in pairs(integrators) do
|
|
peripheral.call(i, "setOutput", side, not state)
|
|
end
|
|
end
|
|
|
|
local scramble = {}
|
|
for i = 1, ((w * h) - 2) do
|
|
table.insert(scramble, string.char(47 + i))
|
|
end
|
|
|
|
local function shuffle()
|
|
for i = 1, (#scramble - 1) do
|
|
local j = math.random(i, #scramble)
|
|
local a = scramble[i]
|
|
local b = scramble[j]
|
|
scramble[j] = a
|
|
scramble[i] = b
|
|
end
|
|
end
|
|
|
|
local function draw_display()
|
|
screen.setTextColor(colors.black)
|
|
for i = 0, ((w * h) - 3) do
|
|
local x = i % w
|
|
local y = math.floor(i / w)
|
|
screen.setCursorPos(x + 1, y + 1)
|
|
local c = scramble[i + 1]
|
|
screen.setBackgroundColor(2 ^ ((string.byte(c) - 48) % 15))
|
|
screen.write(c)
|
|
end
|
|
screen.setTextColor(colors.white)
|
|
screen.setBackgroundColor(colors.black)
|
|
screen.write "CE"
|
|
end
|
|
|
|
local function flash_display(color)
|
|
screen.setBackgroundColor(color)
|
|
screen.clear()
|
|
sleep(0.1)
|
|
draw_display()
|
|
end
|
|
|
|
set_open(false)
|
|
draw_display()
|
|
|
|
local can_open = false
|
|
|
|
local function monitor_ui()
|
|
local inp = ""
|
|
while true do
|
|
local _, _, x, y = os.pullEvent "monitor_touch"
|
|
if y == h and x == w then
|
|
print "E"
|
|
flash_display(colors.blue)
|
|
shuffle()
|
|
inp = ""
|
|
if can_open then set_open(true) sleep(1) set_open(false) end
|
|
draw_display()
|
|
elseif y == h and x == (w - 1) then
|
|
print "C"
|
|
flash_display(colors.red)
|
|
shuffle()
|
|
draw_display()
|
|
inp = ""
|
|
else
|
|
flash_display(colors.lime)
|
|
local i = (x - 1) + (y - 1) * w
|
|
inp = inp .. string.char(i + 48)
|
|
end
|
|
end
|
|
end
|
|
local function comms()
|
|
while true do
|
|
local _, _, c, rc, open = os.pullEvent "modem_message"
|
|
can_open = open
|
|
end
|
|
end
|
|
local function button()
|
|
while true do
|
|
os.pullEvent "redstone"
|
|
set_open(rs.getInput(button_side))
|
|
end
|
|
end
|
|
|
|
parallel.waitForAll(monitor_ui, button, comms) |