Yoyodyne OS variant

<!DOCTYPE html>
<html lang=”en”>
<head>
    <meta charset=”UTF-8″>
    <meta name=”viewport” content=”width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no”>
    <title>YOYODYNE PROPULSHUN SISTEMS</title>
    <style>
        @import url(‘https://fonts.googleapis.com/css2?family=VT323&display=swap’);

        :root {
            /* Industrial Amber CRT theme for Yoyodyne */
            –term-main: #ff9d00;
            –term-dim: #8b5a00;
            –term-bg: #140800;
            –term-alert: #ffcc00;
            –term-danger: #ff3300;
            –term-alien: #cc33ff; /* 8th dimension purple */
            –font-main: ‘VT323’, monospace;
        }

        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
            user-select: none;
            -webkit-tap-highlight-color: transparent;
        }

        body {
            background-color: #000;
            color: var(–term-main);
            font-family: var(–font-main);
            height: 100vh;
            width: 100vw;
            overflow: hidden;
            display: flex;
            flex-direction: column;
        }

        /* Scanline & CRT Effects */
        .crt-overlay {
            position: absolute;
            top: 0; left: 0; right: 0; bottom: 0;
            background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.3) 50%);
            background-size: 100% 4px;
            pointer-events: none;
            z-index: 100;
            opacity: 0.9;
        }

        .crt-vignette {
            position: absolute;
            top: 0; left: 0; right: 0; bottom: 0;
            box-shadow: inset 0 0 60px rgba(0,0,0,0.95);
            pointer-events: none;
            z-index: 90;
        }

        /* Split Screen Layout */
        .interface-container {
            display: flex;
            flex-direction: column;
            height: 100%;
            width: 100%;
            padding: 4px;
            gap: 4px;
        }

        @media (orientation: landscape) {
            .interface-container {
                flex-direction: row;
            }
        }

        .monitor {
            flex: 1;
            position: relative;
            background-color: var(–term-bg);
            border: 3px solid var(–term-dim);
            border-radius: 12px;
            overflow: hidden;
            display: flex;
            flex-direction: column;
            padding: 10px;
            box-shadow: inset 0 0 15px rgba(255, 157, 0, 0.1), 0 0 10px rgba(255, 157, 0, 0.2);
        }

        .monitor-header {
            font-size: 1.3rem;
            border-bottom: 2px solid var(–term-dim);
            padding-bottom: 5px;
            margin-bottom: 10px;
            display: flex;
            justify-content: space-between;
            text-transform: uppercase;
            letter-spacing: 1px;
            text-shadow: 0 0 6px var(–term-main);
            flex-shrink: 0;
            animation: text-jitter 4s infinite;
        }

        .screen-content {
            flex: 1;
            overflow-y: auto;
            font-size: 1.3rem;
            line-height: 1.2;
            text-shadow: 0 0 5px rgba(255, 157, 0, 0.7);
            display: flex;
            flex-direction: column;
            padding-right: 5px;
        }

        /* Custom Scrollbar */
        .screen-content::-webkit-scrollbar {
            width: 8px;
        }
        .screen-content::-webkit-scrollbar-track {
            background: rgba(20, 8, 0, 0.8);
            border-left: 1px solid var(–term-dim);
        }
        .screen-content::-webkit-scrollbar-thumb {
            background: var(–term-dim);
        }

        .terminal-line {
            margin-bottom: 6px;
            word-wrap: break-word;
        }

        .cursor {
            display: inline-block;
            width: 12px;
            height: 1.1em;
            background-color: var(–term-main);
            vertical-align: bottom;
            animation: blink 1s step-end infinite;
        }

        @keyframes blink {
            0%, 100% { opacity: 1; }
            50% { opacity: 0; }
        }

        /* Controls Area */
        #monitor-2 .screen-content {
            justify-content: flex-start;
        }

        .status-panel {
            margin-bottom: 15px;
            padding-bottom: 10px;
            border-bottom: 2px dashed var(–term-dim);
            flex-shrink: 0;
        }

        .controls-grid {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 10px;
            padding-bottom: 10px;
        }

        @media (max-width: 400px) {
            .controls-grid {
                grid-template-columns: 1fr;
            }
        }

        .btn {
            background-color: rgba(255, 157, 0, 0.05);
            color: var(–term-main);
            border: 2px solid var(–term-main);
            font-family: var(–font-main);
            font-size: 1.2rem;
            padding: 12px 6px;
            text-transform: uppercase;
            cursor: pointer;
            text-shadow: 0 0 5px var(–term-main);
            transition: all 0.1s;
            text-align: center;
            font-weight: bold;
        }

        .btn:active {
            background-color: var(–term-main);
            color: var(–term-bg);
            box-shadow: 0 0 15px var(–term-main);
        }

        .btn:disabled {
            opacity: 0.3;
            cursor: not-allowed;
            border-color: var(–term-dim);
            color: var(–term-dim);
            text-shadow: none;
            background-color: transparent;
        }

        /* Special Button Colors */
        .btn.alert {
            color: var(–term-alert);
            border-color: var(–term-alert);
            text-shadow: 0 0 5px var(–term-alert);
        }
        .btn.alert:active { background-color: var(–term-alert); color: var(–term-bg); }
       
        .btn.danger {
            color: var(–term-danger);
            border-color: var(–term-danger);
            text-shadow: 0 0 5px var(–term-danger);
        }
        .btn.danger:active { background-color: var(–term-danger); color: var(–term-bg); }

        .btn.alien {
            color: var(–term-alien);
            border-color: var(–term-alien);
            text-shadow: 0 0 5px var(–term-alien);
        }
        .btn.alien:active { background-color: var(–term-alien); color: var(–term-bg); }

        /* Text Colors */
        .text-alert { color: var(–term-alert); text-shadow: 0 0 6px var(–term-alert); }
        .text-danger { color: var(–term-danger); text-shadow: 0 0 6px var(–term-danger); }
        .text-alien { color: var(–term-alien); text-shadow: 0 0 6px var(–term-alien); }
        .text-muted { color: var(–term-dim); }

        /* Flicker & Jitter Animations */
        .flicker {
            animation: crt-flicker 0.2s infinite;
        }

        @keyframes crt-flicker {
            0% { opacity: 0.95; }
            50% { opacity: 0.88; }
            100% { opacity: 0.95; }
        }

        @keyframes text-jitter {
            0% { transform: translateX(0); }
            1% { transform: translateX(-1px); }
            2% { transform: translateX(1px); }
            3% { transform: translateX(0); }
            100% { transform: translateX(0); }
        }
       
        .jitter {
            animation: text-jitter 2s infinite random;
        }

        /* Highlight Auto Run */
        .auto-active {
            box-shadow: inset 0 0 15px var(–term-danger);
        }

    </style>
</head>
<body>

    <div class=”interface-container flicker”>
        <!– Monitor 1: Main Output –>
        <div class=”monitor” id=”monitor-1″>
            <div class=”crt-overlay”></div>
            <div class=”crt-vignette”></div>
            <div class=”monitor-header”>
                <span>YOYODYNE PROPULSHUN</span>
                <span>GROVER’S MILL, NJ</span>
            </div>
            <div class=”screen-content” id=”output-screen”>
                <!– Terminal lines will be injected here –>
            </div>
        </div>

        <!– Monitor 2: Interaction / Override –>
        <div class=”monitor” id=”monitor-2″>
            <div class=”crt-overlay”></div>
            <div class=”crt-vignette”></div>
            <div class=”monitor-header”>
                <span>EIGHTH DEE-MENSION</span>
                <span>DATA-COM</span>
            </div>
            <div class=”screen-content” id=”control-screen”>
                <div class=”status-panel”>
                    <div id=”status-readout” class=”terminal-line”>
                        <span class=”text-muted”>WAITING FOR COM-MAND…</span>
                    </div>
                </div>
               
                <div class=”controls-grid” id=”controls-grid”>
                    <!– Added SYS-FLUSH and AUTO-RUN buttons –>
                    <button class=”btn alien” id=”auto-btn” onclick=”toggleAutoCycle()”>AUTO-RUN [OFF]</button>
                    <button class=”btn” onclick=”sysFlush()”>SYS-FLUSH</button>
                    <button class=”btn” onclick=”executeCommand(‘status’)”>VE-HICLE STATUS</button>
                    <button class=”btn” onclick=”executeCommand(‘manifest’)”>ROSTER OF JOHNS</button>
                    <button class=”btn” onclick=”executeCommand(‘sensors’)”>MONKEY BOY RADAR</button>
                    <button class=”btn alien” onclick=”executeCommand(‘comms’)”>PLANET 10 LINK</button>
                    <button class=”btn alert” onclick=”executeCommand(‘medical’)”>BIO-METRICS</button>
                    <button class=”btn alert” onclick=”executeCommand(‘inventory’)”>IN-VENTORY</button>
                    <button class=”btn alien” onclick=”executeCommand(‘overthruster’)”>OVER-THRUSTER</button>
                    <button class=”btn danger” onclick=”executeCommand(‘objective’)”>MISHUN GOALS</button>
                    <button class=”btn danger” onclick=”executeCommand(‘whorfin’)”>WHORFIN COM</button>
                    <button class=”btn danger” onclick=”executeCommand(‘destruct’)”>DE-STRUCT</button>
                </div>
            </div>
        </div>
    </div>

    <script>
        const outputScreen = document.getElementById(‘output-screen’);
        const statusReadout = document.getElementById(‘status-readout’);
        const buttons = document.querySelectorAll(‘.btn’);
        const autoBtn = document.getElementById(‘auto-btn’);
       
        let isTyping = false;
        let isAutoCycling = false;

        const bootSequence = [
            “YOYODYNE PROPULSHUN SISTEMS”,
            “COPY-RIGHT 1938”,
            “————————–“,
            “INITIATING MAIN-FRAME…”,
            “CHECKING OVER-THRUSTER COILS… NEGATORY.”,
            “LOCATING LORD WHORFIN… POSITIVE.”,
            “HONEY BAKED HAMS SECURED.”,
            “LAUGH A-WHILE YOU CAN, MONKEY BOYS…”,
            “READY FOR IN-PUT.”
        ];

        // Database of randomized Lectroid responses
        const dataBanks = {
            status: {
                colors: [“”, “text-alert”, “text-danger”],
                statusTexts: [“CHECKING TRUK SISTEMS…”, “KICKING THE TIRES…”, “READING GAUGES…”],
                responses: [
                    [
                        “VE-HICLE STATUS: BOMBER / SPACE-CRAFT”,
                        “THERMIONIC GENERATOR: ON-LINE”,
                        “SHOCK TOWERS: ACTIVATED”,
                        “TRUK ARMOR: WELDED GOOD”,
                        “RADAR IN-VISIBLE: YES”,
                        “WARNING: LEFT TIRE NEEDS AIR.”
                    ],
                    [
                        “WARNING: ELECTRICAL FIRE IN SECTOR 4.”,
                        “THERMIONIC GENERATOR IS OVER-HEATING.”,
                        “JOHN YAYA, GET THE EXTINGUISHER!”,
                        “I SAID GET THE EXTINGUISHER, NOT THE MUSTARD!”,
                        “FIRE SUPPRESSED. BARELY.”
                    ],
                    [
                        “SCANNING IN-TERIOR…”,
                        “SMELL OF BURNING HAIR IN CABIN.”,
                        “AIR CON-DITIONING BROKEN.”,
                        “JOHN BIGBOOTÉ IS SWEATING PRO-FUSELY.”,
                        “DO NOT ROLL DOWN THE WINDOWS IN SPACE.”
                    ]
                ]
            },
            manifest: {
                colors: [“”, “text-alert”, “text-muted”],
                statusTexts: [“LOADING JOHNS…”, “COUNTING HEADS…”, “WHERE IS EVERYONE…”],
                responses: [
                    [
                        “JOHN WHORFIN – SUPREEM COMMANDER”,
                        “JOHN BIGBOOTÉ – HED OF DEE-VELOPMENT (IT IS PRO-NOUNCED BOO-TAY!)”,
                        “JOHN YAYA – VEHICLE MAIN-TENENCE”,
                        “JOHN SMALLBERRIES – SE-CURITY”,
                        “JOHN O’CONNOR – RAW MEAT RE-QUISITION”
                    ],
                    [
                        “DISCIPLINARY RE-PORT:”,
                        “JOHN SMALLBERRIES CAUGHT EATING PASTRY.”,
                        “PUNISHMENT: 40,000 VOLTS TO THE CRANIUM.”,
                        “HE SAID IT TASTED LIKE CARDBOARD ANYWAY.”
                    ],
                    [
                        “ROLL CALL IN PRO-GRESS…”,
                        “WHERE IS JOHN GANT?”,
                        “I SAID, WHERE IS JOHN GANT?”,
                        “HE OWES ME TEN DOLLARS.”,
                        “MARK JOHN GANT AS MISSING IN ACK-SHUN.”
                    ]
                ]
            },
            sensors: {
                colors: [“text-alert”, “text-alien”, “text-danger”],
                statusTexts: [“SWEEPING FOR MONKEY BOYS…”, “LOOKING OUT THE WINDOW…”, “PINGING RADAR…”],
                responses: [
                    [
                        “SCANNING NEW JERSEY SEC-TOR…”,
                        “DETECTING BANZAI INSTITUTE FREQUENCIES.”,
                        “WARNING: HONG KONG CAVALIERS APPROACHING.”,
                        “PERFECT TOMMY SCANNED. HAIR IS IMMACULATE.”,
                        “ACTIVATE DEFENSE SHIELDS! HIDE THE TRUK!”
                    ],
                    [
                        “ANOMALY DE-TECTED IN FIELD.”,
                        “BIOLOGICAL FORM AP-PROACHING.”,
                        “ANALYSIS: IT IS ONLY A COW.”,
                        “DE-STROY IT ANYWAY. COWS CANNOT BE TRUSTED.”
                    ],
                    [
                        “INTER-CEPTING EARTH BROAD-CAST.”,
                        “PRESIDENT WIDMARK ON TEE-VEE.”,
                        “DECLARATION OF WAR IMMINENT.”,
                        “HE LOOKS STUPID. HIS TIE IS CROOKED.”,
                        “IGNORE TEE-VEE. FOCUS ON MISHUN.”
                    ]
                ]
            },
            comms: {
                colors: [“text-alien”, “text-alert”, “text-danger”],
                statusTexts: [“ATTEMPTING TRANS-DIMENSIONAL TETHER…”, “DIALING PLANET 10…”, “TURNING THE CRANK…”],
                responses: [
                    [
                        “CALLING PLANET 10…”,
                        “EIGHTH DEE-MENSION INTERFERENCE DETECTED.”,
                        “SIGNAL BLOCKED BY BLACK LECTROID CRUIZER.”,
                        “CURSE YOU, JOHN PARKER!”,
                        “WE WILL RE-TURN TO OUR HOME WORLD SOON.”
                    ],
                    [
                        “ESTABLISHING COM-LINK…”,
                        “JOHN EMILIO IS ON THE LINE.”,
                        “HE SAYS HELLO.”,
                        “HE SAYS IT IS RAINING ON PLANET 10.”,
                        “END TRANS-MISSION.”
                    ],
                    [
                        “INITIATING MODEM HAND-SHAKE…”,
                        “BZZZZZZZZZT.”,
                        “KRRRRRRCHHHHHH.”,
                        “EEEEE-AWWWWW EEEEE-AWWWWW.”,
                        “CON-NECTION FAILED. TOO MUCH STATIC.”
                    ]
                ]
            },
            medical: {
                colors: [“text-alert”, “text-danger”, “text-alien”],
                statusTexts: [“SCANNING BIO-LOGY…”, “CHECKING PULSE…”, “MEASURING VOLTAGE…”],
                responses: [
                    [
                        “SPECIES: LECTROID (RED)”,
                        “DISGUISE: HUMAN (FLAWED, UGLY)”,
                        “CURRENT FORM: DE-GRADING.”,
                        “REQUIRE MORE ELECTRICAL STIMULASHUN.”,
                        “PRESCRIPTION: HIGH VOLTAGE SHOCKS.”
                    ],
                    [
                        “WARNING: NUTRITIONAL DE-FICIT.”,
                        “CRAVING FOR HONEY BAKED HAM EXCEEDING SAFE LIMITS.”,
                        “SALIVATION LEVELS CRITICAL.”,
                        “PROCEED IMMEDIATELY TO GROCERY STORE.”
                    ],
                    [
                        “BIO-METRIC A-LARM!”,
                        “INTERNAL VOLTAGE DANGEROUSLY LOW.”,
                        “LICK A BATTERY IMMEDIATELY.”,
                        “DO NOT EAT THE TWINKIES. THEY ARE POISON.”
                    ]
                ]
            },
            inventory: {
                colors: [“”, “text-alert”, “text-cyan”],
                statusTexts: [“COUNTING BOXES…”, “OPENING THE FRIDGE…”, “CHECKING SUPPLY CLOSET…”],
                responses: [
                    [
                        “IN-VENTORY RE-PORT:”,
                        “BUBBLE WRAP: 400 ROLLS.”,
                        “RAW MEAT: 5 POUNDS.”,
                        “THERMIONIC VALVES: 12.”,
                        “EARTH CURRENCY: $42.50.”
                    ],
                    [
                        “CRITICAL SHORTAGE A-LERT!”,
                        “HONEY BAKED HAMS: 0.”,
                        “THIS IS AN OUT-RAGE.”,
                        “JOHN YAYA, GO PROCURE MORE HAMS.”,
                        “USE FORCE IF NECESSARY.”
                    ],
                    [
                        “IN-VENTORY RE-PORT:”,
                        “SHOCK THERAPY CABLES: 4 SETS.”,
                        “SPARE TIRES: 0.”,
                        “DICTABIRD FOOD: 1 BAG.”,
                        “WE HAVE EV-ERYTHING WE NEED TO CONQUER.”
                    ]
                ]
            },
            overthruster: {
                colors: [“text-danger”, “text-alien”, “text-alert”],
                statusTexts: [“LOCATING OVER-THRUSTER…”, “SCANNING 8TH DIMENSION…”, “DOING MATH…”],
                responses: [
                    [
                        “OS-CILLATION OVER-THRUSTER”,
                        “DIMENSIONAL PENETRATION RATE: 0%”,
                        “ERROR: DEVICE NOT FOUND IN GROVER’S MILL.”,
                        “LAST KNOWN LO-CATION: BUCKAROO BANZAI’S JET CAR.”,
                        “WE MUST BUST THROUGH THE MOUNTAIN!”
                    ],
                    [
                        “CALCULATING DIMENSIONAL E-QUATION…”,
                        “X + Y = 8TH DEE-MENSION.”,
                        “CARRY THE 1…”,
                        “ERROR: NOT ENOUGH FINGERS TO COM-PUTE.”,
                        “GET THE OVER-THRUSTER BEFORE I BUST YOUR HEAD!”
                    ],
                    [
                        “SECURITY A-LERT!”,
                        “THE DICTABIRD HAS BEEN STOLEN!”,
                        “IT HAS THE OVER-THRUSTER FORMULA!”,
                        “THIS IS UN-ACCEPTABLE!”,
                        “FIND THE BIRD, FIND THE MONKEY BOYS!”
                    ]
                ]
            },
            objective: {
                colors: [“text-danger”, “text-alert”, “text-alien”],
                statusTexts: [“ACCESSING MAIN DI-RECTIVE…”, “READING THE MANUAL…”, “WHAT ARE WE DOING…”],
                responses: [
                    [
                        “MISHUN PRO-FILE:”,
                        “WHERE ARE WE GOING? PLANET 10!”,
                        “WHEN ARE WE GOING? REAL SOON!”,
                        “OBJECTIVE: DE-STROY THE BLACK LECTROIDS.”,
                        “TAKE BACK OUR HOME WORLD!”
                    ],
                    [
                        “RE-MINDER TO ALL JOHNS:”,
                        “WE ARE SUPERIOR OVER THE MONKEY BOYS.”,
                        “THEY ARE WEAK AND HAVE NO CARAPACE.”,
                        “CRUSH THEM BENEATH OUR BOOTS.”,
                        “AND STEAL THEIR OVER-THRUSTER.”
                    ],
                    [
                        “DEE-MENSIONAL TRAVEL PROTOCOL:”,
                        “1. ACTIVATE OVER-THRUSTER.”,
                        “2. ACCELERATE TO MACH 1.2.”,
                        “3. DRIVE INTO SOLID MATTER.”,
                        “4. HOPE WE DO NOT EXPLODE.”
                    ]
                ]
            },
            whorfin: {
                colors: [“text-danger”, “text-alert”, “text-danger”],
                statusTexts: [“OPENING PA SYSTEM…”, “LORD WHORFIN IS SPEAKING…”, “ALL HAIL…”],
                responses: [
                    [
                        “HISTORY IS-A MADE AT NIGHT!”,
                        “CHARACTER IS WHAT YOU ARE IN THE DARK!”,
                        “SEALED WITH A CURSE AS SHARP AS A KNIFE!”,
                        “VIVA LORD WHORFIN!”
                    ],
                    [
                        “SHUT UP!”,
                        “BIGBOOTÉ, YOU ARE THE WEAKEST INDIVIDUAL I EVER KNOW!”,
                        “WHY IS THE TRUK NOT FIXED?”,
                        “I WILL ELECTRO-CUTE YOU MYSELF!”
                    ],
                    [
                        “LAUGH A-WHILE YOU CAN, MONKEY BOYS.”,
                        “PLANET 10 WILL BE OURS A-GAIN.”,
                        “NO MORE NEW JERSEY.”,
                        “NO MORE GROVER’S MILL.”,
                        “ONLY GLORY!”
                    ]
                ]
            },
            destruct: {
                colors: [“text-danger”, “text-alert”, “text-danger”],
                statusTexts: [“<span class=’text-danger’>DE-STRUCT INITIATED</span>”, “WARMING UP EXPLOSIVES…”, “GOODBYE CRUEL WORLD…”],
                responses: [
                    [
                        “INITIATING THERMAL OVER-LOAD…”,
                        “T-MINUS 10 SECONDS TO EX-PLOSION.”,
                        “WAIT. WE NEED THIS TRUK.”,
                        “CANCEL CANCEL CANCEL.”,
                        “THERMAL OVER-LOAD A-BORTED.”,
                        “BACK TO WORK, JOHNS!”
                    ],
                    [
                        “DE-STRUCT SE-QUENCE FAILED.”,
                        “BUTTON IS STICKY.”,
                        “JOHN BIGBOOTÉ SPILLED COFFEE ON THE CON-SOLE.”,
                        “I TOLD HIM TO USE A LID.”,
                        “WE SURVIVE ANOTHER DAY.”
                    ],
                    [
                        “COUNT-DOWN PRO-CEEDING…”,
                        “3…”,
                        “2…”,
                        “1…”,
                        “JUST KIDDING.”,
                        “WE ARE TOO SMART TO DIE TODAY.”
                    ]
                ]
            }
        };

        const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));

        function toggleButtons(state) {
            buttons.forEach(btn => {
                // Ensure the Auto-Run and Flush buttons are never disabled so the user can break out
                if (btn.id !== ‘auto-btn’) {
                    btn.disabled = !state;
                }
            });
        }

        function createLine(colorClass = “”) {
            const line = document.createElement(‘div’);
            // Randomly add jitter class to some lines for that Lectroid broken-tech feel
            if(Math.random() > 0.6) colorClass += ” jitter”;
           
            line.className = `terminal-line ${colorClass}`;
            outputScreen.appendChild(line);
            outputScreen.scrollTop = outputScreen.scrollHeight;
            return line;
        }

        async function typeString(text, element, speed = 25) {
            let currentHTML = element.innerHTML.replace(‘<span class=”cursor”></span>’, ”);
           
            for (let i = 0; i < text.length; i++) {
                currentHTML += text.charAt(i);
                element.innerHTML = currentHTML + ‘<span class=”cursor”></span>’;
                outputScreen.scrollTop = outputScreen.scrollHeight;
                await sleep(speed + (Math.random() * 20));
            }
            element.innerHTML = currentHTML;
        }

        async function runSequence(sequence, speed = 25, delayBetween = 180, colorClass = “”) {
            for (let str of sequence) {
                const line = createLine(colorClass);
                line.innerHTML = ‘<span class=”cursor”></span>’;
                await typeString(“> ” + str, line, speed);
                await sleep(delayBetween);
            }
            const finalLine = createLine();
            finalLine.innerHTML = ‘> <span class=”cursor”></span>’;
            outputScreen.scrollTop = outputScreen.scrollHeight;
        }

        function clearTerminal() {
            outputScreen.innerHTML = ”;
        }

        function sysFlush() {
            if(isTyping && !isAutoCycling) return; // allow flushing if auto-cycling is doing its thing
            clearTerminal();
            statusReadout.innerHTML = “<span class=’text-muted’>SCREEN FLUSHED.</span>”;
        }

        // Auto Cycle Logic
        async function toggleAutoCycle() {
            isAutoCycling = !isAutoCycling;
           
            if (isAutoCycling) {
                autoBtn.innerHTML = “AUTO-RUN [ON]”;
                autoBtn.classList.remove(“alien”);
                autoBtn.classList.add(“danger”, “flicker”, “auto-active”);
               
                // If the system isn’t currently typing a manual command, start the loop
                if (!isTyping) {
                    runAutoCycleLoop();
                }
            } else {
                autoBtn.innerHTML = “AUTO-RUN [OFF]”;
                autoBtn.classList.add(“alien”);
                autoBtn.classList.remove(“danger”, “flicker”, “auto-active”);
            }
        }

        async function runAutoCycleLoop() {
            const keys = Object.keys(dataBanks);
           
            while (isAutoCycling) {
                // Wait politely if the user initiated a manual command
                while (isTyping && isAutoCycling) {
                    await sleep(200);
                }
               
                if (!isAutoCycling) break;

                // Pick a random command
                const randomKey = keys[Math.floor(Math.random() * keys.length)];
                await executeCommand(randomKey);

                // Wait 3 to 6 seconds before running the next command
                // (Done in small chunks so we can break out immediately if turned off)
                let waitTime = 3000 + Math.random() * 3000;
                let elapsed = 0;
                while (elapsed < waitTime && isAutoCycling) {
                    await sleep(100);
                    elapsed += 100;
                }
            }
        }

        // Main command router
        async function executeCommand(commandKey) {
            if (isTyping) return;
            isTyping = true;
            toggleButtons(false);

            const dataBank = dataBanks[commandKey];
           
            // Pick a random response for this command
            const randomIndex = Math.floor(Math.random() * dataBank.responses.length);
            const lines = dataBank.responses[randomIndex];
            const color = dataBank.colors[randomIndex];
            const statusText = dataBank.statusTexts[randomIndex];
           
            statusReadout.innerHTML = statusText;
            clearTerminal();
           
            // Unpredictable terminal speeds
            let speed = color.includes(‘danger’) ? 35 : 20 + Math.random() * 15;
            let delay = color.includes(‘danger’) ? 300 : 150 + Math.random() * 100;

            await runSequence(lines, speed, delay, color);
           
            // Generate a random end status
            const endStatuses = [
                “<span class=’text-muted’>A-WAITING IN-PUT</span>”,
                “<span class=’text-alien’>PRO-CESS COM-PLETE</span>”,
                “<span class=’text-alert’>STAND-BY…</span>”
            ];
            statusReadout.innerHTML = endStatuses[Math.floor(Math.random() * endStatuses.length)];
           
            isTyping = false;
            toggleButtons(true);
        }

        // Boot
        window.onload = async () => {
            isTyping = true;
            toggleButtons(false);
           
            await sleep(600);
            await runSequence(bootSequence, 25, 120);
           
            statusReadout.innerHTML = “<span class=’text-muted’>A-WAITING COM-MAND…</span>”;
            isTyping = false;
            toggleButtons(true);
        };
    </script>
</body>
</html>

Leave a Reply