local MAIN_DELAY_ON = 0.25 local MAIN_DELAY_OFF = 0 local SECONDARY_DELAY_ON = 0.75 local SECONDARY_DELAY_OFF = 0.25 local MAIN_INPUT_SIDE = 'top' local MAIN_OUTPUT_SIDE = 'left' local SECONDARY_INPUT_SIDE = 'back' local SECONDARY_OUTPUT_SIDE = 'front' local function getMainColorsOrder() return { colors.white, colors.orange, colors.magenta, colors.lightBlue, colors.yellow, colors.lime, colors.pink, colors.gray, colors.lightGray, colors.cyan, colors.purple, colors.blue, colors.brown, colors.green, colors.red, colors.black } end local function getSecondaryColorsOrder() return { colors.white, colors.orange, colors.magenta } end local function switchOnLight(bundledOutput, colorsOrder, sleepTime) if sleepTime <= 0 then bundledOutput.setColorState(colors.combine(table.unpack(colorsOrder))) return end for _, color in pairs(colorsOrder) do bundledOutput.setOn(color) os.sleep(sleepTime) end end local function switchOffLight(bundledOutput, colorsOrder, sleepTime) if sleepTime <= 0 then bundledOutput.setColorState(0) return end for _, color in pairs(colorsOrder) do bundledOutput.setOff(color) os.sleep(sleepTime) end end local function mainLoop() local mainOutput = rs.createBundledOutput(MAIN_OUTPUT_SIDE) local secondaryOutput = rs.createBundledOutput(SECONDARY_OUTPUT_SIDE) local mainColorsOrder = getMainColorsOrder() local secondaryColorsOrder = getSecondaryColorsOrder() while true do local _, lightIsOn, typeOfRoom = os.pullEvent('light_command') if typeOfRoom == 'main' then if lightIsOn then switchOnLight(mainOutput, mainColorsOrder, MAIN_DELAY_ON) else switchOffLight(mainOutput, mainColorsOrder, MAIN_DELAY_OFF) end elseif typeOfRoom == 'secondary' then if lightIsOn then switchOnLight(secondaryOutput, secondaryColorsOrder, SECONDARY_DELAY_ON) else switchOffLight(secondaryOutput, secondaryColorsOrder, SECONDARY_DELAY_OFF) end else error('unknown type of room "' .. tostring(typeOfRoom) .. '"', 0) end end end local function redstoneLoop() local mainState = nil local secondaryState = nil while true do local newMainState = redstone.getInput(MAIN_INPUT_SIDE) local newSecondaryState = redstone.getInput(SECONDARY_INPUT_SIDE) if mainState ~= newMainState then mainState = newMainState os.queueEvent('main', newMainState) end if secondaryState ~= newSecondaryState then secondaryState = newSecondaryState os.queueEvent('secondary', newSecondaryState) end os.pullEvent('redstone') end end parallel.waitForAny(mainLoop, redstoneLoop)